www.delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/2022/11/24/18:30:11

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=20210112;
h=content-transfer-encoding:in-reply-to:references:to:from
:content-language:subject:user-agent:mime-version:date:message-id
:from:to:cc:subject:date:message-id:reply-to;
bh=kEb7efQnSdfRSlcBFe9sCnv2uTiYHVBBUdrgpbU1Uak=;
b=Ma32fWMMu8S+9/Amj+k/dh90HaugmwmT+DacbB7Hk834U7qOcNQCZEndeY1Z8OZhy/
m2Ld8YBjQTdgDg57aoaLuUGvLlA0CE9ZM9Y/oZp+mC6haVRsPudl52JMJ8sGmz31F0rN
wSHdrhdAW+t48rERNlLZ3VNvR1KVKQJ6lpYQvw/T6GUlpT1tGutn+0byAm1bk49KiI4o
jNlxKWAbYA6l6CRDGT0sUDLjF/IhGdW4UjilTA+mLlddOM/ElbWOmvb8n9dtfU5peAny
F43xIchhLlYYQQgcCNhV3JjLhyRsvFEpmjeLNAWb0RQpSZeOTAE9CNUKF5IG2r6fdMVc
uJZw==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
d=1e100.net; s=20210112;
h=content-transfer-encoding:in-reply-to:references:to:from
:content-language:subject:user-agent:mime-version:date:message-id
:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to;
bh=kEb7efQnSdfRSlcBFe9sCnv2uTiYHVBBUdrgpbU1Uak=;
b=VkCkyFEMR3IZfj+YXTjEEwgD7NKbPbznE+rbF+a7UIvCC4noVGz+PPbIJZBrJQ05WK
kg+ZvNCnY0pasJ8gJgD9HuMnAF/ZeBZajjVPGyhkxO1TOfRI+diqLTO47tqSUHt0sLcH
seXkoFh/xm5MXwLCoOdeN07I84f+hOUkbErI2Ak8j2yBqNa09dgrScBRk6OH/ms5oFEE
RgHuJJd9QuPwj5f3wY3rnB4X5IKFNmK8dKQ1i4CUBJaglghaA3h7NnvkvFd0O6XzJIdu
fgSBL03bioARIIElErQ5QYhKepXTi5xYhwsspzwyhevbERMMs5tIjDPXXW2Jd8xmUIHF
yVuQ==
X-Gm-Message-State: ANoB5pnWI9dWq8yk7cu+fB1WTvUun3qGjVnrXj1U4d9ExtiNZTvVQoPL
TL0xU23RwEXfO3zmyfaeSThYDxSa6oA=
X-Google-Smtp-Source: AA0mqf7qrg0Quu0WGTj7MfTFbKSBhO+RWwfz5pVNZ81C7xa7ozsmxN85U0DqGAtmswwmSIPvf0vXQA==
X-Received: by 2002:a17:906:f113:b0:7ad:a030:7501 with SMTP id gv19-20020a170906f11300b007ada0307501mr29798264ejb.446.1669332412645;
Thu, 24 Nov 2022 15:26:52 -0800 (PST)
Message-ID: <21e1aa0b-1511-0071-84c0-b20c6a3d1dae@gmail.com>
Date: Fri, 25 Nov 2022 00:26:51 +0100
MIME-Version: 1.0
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:102.0) Gecko/20100101
Thunderbird/102.5.0
Subject: [PATCH v2] stub: ignore host exit status
From: "J.W. Jagersma (jwjagersma AT gmail DOT com) [via djgpp AT delorie DOT com]" <djgpp AT delorie DOT com>
To: djgpp AT delorie DOT com
References: <744f054f-9682-4a05-91ad-684b18c0122b AT gmail DOT com>
In-Reply-To: <744f054f-9682-4a05-91ad-684b18c0122b@gmail.com>
Reply-To: djgpp AT delorie DOT com

On 2022-11-23 20:47, J.W. Jagersma wrote:
> Hi all,
> 
> If you've ever tried using hdpmi32 with a djgpp program, you may have
> noticed some strange behavior.  The program first fails to run with
> "Load error: no DPMI", but on the second try, it suddenly works.  Then
> a third invocation fails again, the fourth runs fine, etc.
> 
> When you rename 'hdpmi32.exe' to 'cwsdpmi.exe', your program seems to
> run consistently.  But this is only because there is a second (real)
> cwsdpmi in your PATH somewhere.  What really happens, is that your
> program alternates between running under hdpmi and cwsdpmi.
> 
> I finally figured out why this happens, and it's very simple: hdpmi uses
> the exit status to indicate if it was loaded via xms, vcpi, or int15.
> And the djgpp stub considers any non-zero exit status to be a failure,
> so it keeps searching PATH until cwsdpmi is found, which always returns
> zero.
> 
> For a possible solution, I would suggest to ignore the return status
> from the host, and just check int 2f/1687 after every exec.  As an added
> bonus, this saves 13 bytes of stub space.

Amended patch follows - it no longer skips the last iteration (exec
with no path).

It's a bit larger, but still saves 6 bytes in total.

--- a/src/stub/stub.asm
+++ b/src/stub/stub.asm
@@ -199,38 +199,49 @@ not_path:
 ;-----------------------------------------------------------------------------
 ;  Get DPMI information before doing anything 386-specific
 
-	push	es
 	push	di
-	xor	cx, cx			; flag for load attempt set cx = 0
-	jz	@f2			; We always jump, shorter than jmp
+					; Set up loadname in case of no DPMI.
+					; First try current dir.
+	xor	ah, ah			; Copy until this character (=0)
+	call	store_env_string	; copy stub image to "loadname"
+	mov	si, bx			; remove name so we can add DPMI name
+	mov	di, [path_off]		; Pointer to path contents (next try)
 @b1:
+	xor	cx, cx			; flag to signal end of loop
+@b2:
+	call	check_dpmi		; int 2f, ax=1687
+	jz	@f3
+	call	do_exec			; copy our name to string and try load
+	jcxz	@f1			; cx=0 while we have more paths to try
+	call	check_dpmi		; last chance...
+	jz	@f3
 	mov	al, 110
 	mov	dx, msg_no_dpmi
 	jmpl	error
-@b2:
-	or	cx, cx
-	jnz	@b1			; we already tried load once before
-	inc	cx
-	call	load_dpmi
-	jc	@b1
+@f1:
+					; Set up loadname for next attempt.
+	mov	ah, ';'			; Copy until this character
+	call	store_env_string	; to "loadname"
+	or	al, al			; Check terminating character
+	jne	@f2			; If ';', continue
+	dec	di			; else point at null for next pass.
 @f2:
-	mov	ax, 0x1687		; get DPMI entry point
-	int	0x2f
-	or	ax, ax
-	jnz	@b2			; if 0 then it's there
-	and	bl, 1			; 32 bit capable?
-	jz	@b2
+	inc	cx
+	cmp	si, loadname		; anything there?
+	je	@b2			; final try (no path)
+	mov	al, [si-1]
+	call	test_delim		; is final character a path delimiter
+	je	@b1
+	movb	[si], '\\'		; no, add separator between path & name
+	inc	si
+	jmp	@b1
 @f3:
-	mov	[modesw], di		; store the DPMI entry point
-	mov	[modesw+2], es
-	mov	[modesw_mem], si
 	pop	di
-	pop	es
 
 ;-----------------------------------------------------------------------------
 ;  Now, find the name of the program file we are supposed to load.
 
-;	xor	ah, ah			; termination character (set above!)
+;	xor	ah, ah			; termination char (set by check_dpmi)
 	call	store_env_string	; copy it to loadname, set bx
 
 	mov	[stubinfo_env_size], di
@@ -700,36 +711,29 @@ pm_dos:
 	ret
 
 ;-----------------------------------------------------------------------------
-;  load DPMI server if not present
-;   First check directory from which stub is loaded, then path, then default
-;   On entry di points to image name
+; Check for presence of a DPMI host, and save the mode switch address.
+; Zero flag is clear on success.  Clobbers ax/bx/dx.
 
-path_off:
-	.dw	0			; If stays zero, no path
-
-load_dpmi:
-	xor	ah, ah			; Copy until this character (=0)
-	call	store_env_string	; copy stub image to "loadname"
-	mov	si, bx			; remove name so we can add DPMI name
-	mov	di, [path_off]		; Pointer to path contents (next try)
-	jmp	@f2
-loadloop:
-	mov	ah, ';'			; Copy until this character
-	call	store_env_string	; to "loadname"
-	or	al,al			; Check terminating character
-	jne	@f1			; If ';', continue
-	dec	di			; else point at null for next pass.
-@f1:	
-	cmp	si, loadname		; anything there?
-	je	do_exec			; final try (no path) let it return
-	mov	al, [si-1]
-	call	test_delim		; is final character a path delimiter
-	je	@f2
-	movb	[si], '\\'		; no, add separator between path & name
-	inc	si
-@f2:
-	call	do_exec			; copy our name to string and try load
-	jc	loadloop
+check_dpmi:
+	push	es
+	push	cx
+	push	di
+	push	si
+	mov	ax, 0x1687		; get DPMI entry point
+	int	0x2f
+	mov	dx, bx
+	or	dl, 1			; bx bit 0: 32-bit capable
+	xor	bx, dx
+	or	ax, bx			; DPMI present if ax = 0
+	jnz	@f1
+	mov	[modesw], di		; store the DPMI entry point
+	mov	[modesw+2], es
+	mov	[modesw_mem], si
+@f1:
+	pop	si
+	pop	di
+	pop	cx
+	pop	es
 	ret
 
 ;-----------------------------------------------------------------------------
@@ -766,13 +770,6 @@ do_exec:
 	int	0x21
 	pop	di
 	pop	es
-	jc	@f1			;carry set if exec failed
-
-	mov	ah, 0x4d		;get return code
-	int	0x21
-	sub	ax, 0x300		;ah=3 TSR, al=code (success)
-	neg	ax			;CY, if not originally 0x300
-@f1:
 	jmp	restore_umb		;called func. return for us.
 
 ;-----------------------------------------------------------------------------
@@ -796,10 +793,9 @@ include_umb:
 @f1:
 	ret
 
-; Restore upper memory status.  All registers and flags preserved.
+; Restore upper memory status.  All registers preserved.
 
 restore_umb:
-	pushf
 	cmpb	[dos_major], 5		; Won't work before dos 5
 	jb	@f1
 	push	ax
@@ -815,7 +811,6 @@ restore_umb:
 	pop	bx
 	pop	ax
 @f1:
-	popf
 	ret
 
 ;-----------------------------------------------------------------------------
@@ -840,6 +835,8 @@ msg_no_selectors:
 	.db	"no DPMI selectors$"
 msg_no_dpmi_memory:
 	.db	"no DPMI memory$"
+path_off:
+	.dw	0			; Points to PATH, stays zero if none.
 
 ;-----------------------------------------------------------------------------
 ;  Unstored Data, available during and after mode switch

- Raw text -


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