delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/2024/02/24/03:56:51

X-Authentication-Warning: delorie.com: mail set sender to djgpp-bounces using -f
X-Recipient: djgpp AT delorie DOT com
X-Original-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
d=gmail.com; s=20230601; t=1708765000; x=1709369800; darn=delorie.com;
h=content-transfer-encoding:to:subject:message-id:date:from
:in-reply-to:references:mime-version:from:to:cc:subject:date
:message-id:reply-to;
bh=eRFArA7KwObR4bA/tAfUQ/O7XQlaigcTBv8uY9stUNA=;
b=gNdwJhNmF6j2gKaH2MuXN5G1EUP3HN0jjo2EO8HuC+Vs2m4Dve1NAgWxQPzU/lxvyb
sjM9q+HE6Xzpq2pjDkedWFiLRy+WSkttW/3zgNH4YfYe1HbdfvYYDHzWZSDCWjE9vLbY
NxM0IZN2b2RyRe6UNwXYod+hmofbn4HQHi0TYTWXhWH+OeYiOHvt/HhZcSjrgZxKFsys
kW8p68Y3xfxC+ZHwIi1+vdmOJiDrmTjerdiUSDMn1JkXTbeMPoRrCET26sMn40/quCBh
Ek3ajEQ2CsM4iWWDm2kqMa2BvCyCg+UJoBksJoe4SHI+R2XAnqSUmWs9f5CqhzMJWmdj
1C7Q==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
d=1e100.net; s=20230601; t=1708765000; x=1709369800;
h=content-transfer-encoding:to:subject:message-id:date:from
:in-reply-to:references:mime-version:x-gm-message-state:from:to:cc
:subject:date:message-id:reply-to;
bh=eRFArA7KwObR4bA/tAfUQ/O7XQlaigcTBv8uY9stUNA=;
b=pm8XTCTLIzRmwOh79a2vcjN0sHlWxL3xwoe2HvmV4WJpi3SAW6knDyGlwDLYpggQJW
d+FCXtxTtuDzrCjXX+u5/A3yDjASeTsC7je9MwJ6aCrzfUouzp/CLur8KW6Q9Gb+44ph
znE6KoMhPyVcB4tnI/UJOS0LzympPGMqFCoSgqFtgwt9PvEpliAHQvzDJtUh2tdGUJak
+aX3UVtaHpXWoVq2zYixBHvrz+XFTGbxt6VOXSu4ZVzSO+nCNujPR38FX4gzOh/8uqv+
IFZI2ptV5UBtwut3iIkO7SX6Lk4OphSDX6QqHezR6KKfpf7+V8Octjt0YGF2iDhf5Crm
yFbw==
X-Gm-Message-State: AOJu0YxaNU8EvegKMkq5xPn+kqorvzVhjSyOiivubaTQ51YvVoFaisBP
pW90PjIX11qj5ZUrEJqgEp07IuqShx2od2Jb6JoqNJml+onF8SzNRa8F0fVoyx1OsdzmVMC+vBn
xjoYfSweEcNRsxzBNB+ryJDhbvBxm4rW4ewQ=
X-Google-Smtp-Source: AGHT+IGgAx1CjoTsP4Y56ysRJOx5mZFF2FTtnKdDt49jYttB1SrCJ2hwLpaEZHFyYbTsHDvXQSwFV47LfEbxGnpdZLQ=
X-Received: by 2002:a05:6512:b08:b0:512:b90f:fc4e with SMTP id
w8-20020a0565120b0800b00512b90ffc4emr1375577lfu.46.1708764999978; Sat, 24 Feb
2024 00:56:39 -0800 (PST)
MIME-Version: 1.0
References: <CAA2C=vB8ZicddhV9vbcu9RELueGs8o5_=OQdy0gejtPzFaYeJw AT mail DOT gmail DOT com>
<fb540633-1a6d-4a7b-8dd0-74b774ad8733 AT gmail DOT com> <CAA2C=vAMR_eEmGd01jZDe3013inxvtEM-0qB-yoCzsTF0Cx2zw AT mail DOT gmail DOT com>
<86y1baz6o0 DOT fsf AT gnu DOT org>
In-Reply-To: <86y1baz6o0.fsf@gnu.org>
From: "Ozkan Sezer (sezeroz AT gmail DOT com) [via djgpp AT delorie DOT com]" <djgpp AT delorie DOT com>
Date: Sat, 24 Feb 2024 11:56:28 +0300
Message-ID: <CAA2C=vCiD_Uq25grxhsz+A_T_eTdFpO3x6jxQkme+tqqUEyTFA@mail.gmail.com>
Subject: Re: checking int2d amis appstring with djgpp
To: djgpp AT delorie DOT com
X-MIME-Autoconverted: from quoted-printable to 8bit by delorie.com id 41O8uh37012333
Reply-To: djgpp AT delorie DOT com

Hello Eli,

On Sat, Feb 24, 2024 at 10:03 AM Eli Zaretskii (eliz AT gnu DOT org) [via
djgpp AT delorie DOT com] <djgpp AT delorie DOT com> wrote:
> It is better to avoid inline assembly at all.  I'm guessing Watcom did
> that for speed or something, but does speed really matter here?

Most certainly no, speed is not a concern here. It's my ignorance in
attempting to translate watcom code

> >   r_addr = ((uint32_t)addr.segment<<4) + (uint32_t)addr.offset16;
> >   if (!r_addr) return -1;
>
> Instead of the above bit juggling to get r_addr, you could simply test
> both segment and offset to be zero.  After all, how else you'd get
> zero in the linear address?

Indeed

> >     appstring = (char *)real2ptr(r_addr);
[...]
> You cannot access conventional (below 1MB) memory like that.  You need
> to use one of the techniques described in the node "Xfer" in the
> DJGPPFAQ Info manual, to fetch the 5 bytes to protected-mode memory
> first.  In your case, _dosmemget seems to be the best method.

Thanks.  So: is the following correct? Does it match the intention at
https://github.com/wbcbz7/sndlib-watcom/blob/master/sndlib.cpp#L41-L71

int sndlib_sbemu_detect(void)
{
  __dpmi_raddr addr;
  __dpmi_regs  regs;
  uint32_t r_addr;
  char appstring[16];
  int mx;

  /* check for INT2D vector == NULL */
  __dpmi_get_real_mode_interrupt_vector(0x2D, &addr);
  if (!addr.segment || !addr.offset16) return -1;

  /* scan all multiplexes of INT 2D */
  for (mx = 0; mx < 256; mx++)
  {
    memset(&regs, 0, sizeof(regs));
    regs.h.ah = mx;
    __dpmi_int(0x2D, &regs);
    if (regs.h.al != 0xFF)
      continue;

    /* check for SBEMU application string */
    r_addr = ((uint32_t)regs.x.dx<<4) + (uint32_t)regs.x.di;
    if (!r_addr) continue;
    dosmemget(r_addr, 16, appstring);
    if (memcmp(appstring + 8,"SBEMU",5) == 0)
      return mx;
  }

  return -1;
}

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019