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: <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]" Date: Sat, 24 Feb 2024 11:56:28 +0300 Message-ID: Subject: Re: checking int2d amis appstring with djgpp To: djgpp AT delorie DOT com Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8bit 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] 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(®s, 0, sizeof(regs)); regs.h.ah = mx; __dpmi_int(0x2D, ®s); 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; }