delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/2024/02/23/19:09:20

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=1708733351; x=1709338151; 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=0hviL7GQaYVV0xDA1p4jvpMN1VncbVTFht6bap3E4ng=;
b=JrkW2VmGes9bcVcP8DpbOGf3cvIRcZ55VsX82b/pvwN+An/xsYBA7zH/Si2nHyRsOu
EioWfVBv1rpIG94tthgHgwiJDNxc4hX1L8xaHVHZGcEwJYi9GRHtzY3uUhJ9Q8RNF+0b
7P0d+x6TvIuOZ7sW0ukF4LH4dVEWVneea6kS1ffxYJHy6mXJWSfZTqmMwpvEdfdyb8FO
5JR2j3XvYD5+DKteuSzVnN9KXPyrX/O12R5Gs0GYjinwyUjzRvm2uYQQchxCqkvMMqct
rh1XV64XZqwVf6/AJwT1eDe9JR9J2q2r5Y97pkncM/64f8+2Gg4h351iHKwp+sj+ssim
a01A==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
d=1e100.net; s=20230601; t=1708733351; x=1709338151;
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=0hviL7GQaYVV0xDA1p4jvpMN1VncbVTFht6bap3E4ng=;
b=hfvJlP3xWpdh/hMS3zM9Lja1lbRSmxqinOBL7B1xxiivJJJA0HqvezrcoThk/vVqwW
sHTv1EUDKjvXfCCpyHvNznsifsg6X9HBkc/dX7Bgqih01lQkGotdH2WgVirKcFRjU6Nr
49i9gMW7AJouQAYwXAWsfRaWhZk27wo4RqlU6v9puDZIk5WPvbvAhwE6EJTc2SjCKE8D
EKrn/Z01pJMlNcChp8v/iy3qxdk/5uqfpJcZZxkI11wIQbiO0vjoDC+U0YzhUvE8DPWi
QMEoQs1DnBTX6KtsbP6/JTHS65tJ/T1LN3aLhlDpMcrSr1+9SppaAMUxgq1EWOXzALTU
unkw==
X-Gm-Message-State: AOJu0Yy6jYODQbXdlBaq1K0eIWQ1v60R5CphHrbKMdFau68Y91vXD1lw
J6uOAzcE+atVimAsZ8kWlNHonP3fKLbG436D0lYzcdHVv9WMWTds1Jc2JOMgtJ5cYSm48Iwue0q
De73ypUPY4fPxdrn3RA1qrbOg8dsYFcGugl8=
X-Google-Smtp-Source: AGHT+IHuNds5YNoDjf+h6WepcviCWHVRBL4b9UEgROTHTQMDnGNxx1uxvwTk5UQVWU9lc8r8yIWMMwZbt0VzCmEkDzk=
X-Received: by 2002:a05:600c:5592:b0:412:6de0:69a9 with SMTP id
jp18-20020a05600c559200b004126de069a9mr769305wmb.39.1708733350954; Fri, 23
Feb 2024 16:09:10 -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>
In-Reply-To: <fb540633-1a6d-4a7b-8dd0-74b774ad8733@gmail.com>
From: "Ozkan Sezer (sezeroz AT gmail DOT com) [via djgpp AT delorie DOT com]" <djgpp AT delorie DOT com>
Date: Sat, 24 Feb 2024 03:08:59 +0300
Message-ID: <CAA2C=vAMR_eEmGd01jZDe3013inxvtEM-0qB-yoCzsTF0Cx2zw@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 41O09C1R003514
Reply-To: djgpp AT delorie DOT com

On Sat, Feb 24, 2024 at 12:49 AM J.W. Jagersma (jwjagersma AT gmail DOT com)
[via djgpp AT delorie DOT com] <djgpp AT delorie DOT com> wrote:
[...]
> >     __asm__ __volatile__ ("movw %%dx,%0":"=m"(addr.segment));
> >     __asm__ __volatile__ ("movw %%di,%0":"=m"(addr.offset16));
>
> This doesn't look right - you can't assume gcc preserves registers
> between asm blocks.

OK, should have been like this then, yes?

__asm__ __volatile__ (
  "movb %2,   %%ah\n"
  "xorb %%al, %%al\n"
  "int  $0x2D\n"
  "cmpb $0xFF,%%al\n"     /* is this a free multiplex? */
  "jz  1f\n"
  "xorw %%dx, %%dx\n"     /* it is, return NULL pointer */
  "xorw %%di, %%di\n"
  "1:\n"
  "movw %%dx, %0\n"
  "movw %%di, %1\n"
  : "=m"(addr.segment),
    "=m"(addr.offset16)
  :  "m"(mx) );

> But this is a real-mode interrupt, no?  So you would have to do it via
> __dpmi_int() here anyway, no asm involved.

Is the following correct ??

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

  /* check for INT2D vector == NULL */
  __dpmi_get_real_mode_interrupt_vector(0x2D, &addr);
  r_addr = ((uint32_t)addr.segment<<4) + (uint32_t)addr.offset16;
  if (!r_addr) 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;
    appstring = (char *)real2ptr(r_addr);
    if (memcmp(appstring + 8,"SBEMU",5) == 0)
      return mx;
  }

  return -1;
}

--
O.S.

- Raw text -


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