Skip to content

Commit 7496c68

Browse files
MondgesteinPerditionC
authored andcommitted
Implement version table support for int21/ah=4b, subfunctions 0 and 1
1 parent 35a1835 commit 7496c68

File tree

9 files changed

+164
-3
lines changed

9 files changed

+164
-3
lines changed

build.bat

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,13 @@ cd ..\kernel
117117
%MAKE% production
118118
if errorlevel 1 goto abort-cd
119119

120+
echo.
121+
echo Process SETVER +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
122+
echo.
123+
cd ..\setver
124+
%MAKE% production
125+
if errorlevel 1 goto abort-cd
126+
120127
cd ..
121128

122129
set XERROR=

clean.bat

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ cd ..\sys
2727
cd ..\kernel
2828
%MAKE% clean
2929

30+
cd ..\setver
31+
%MAKE% clean
32+
3033
cd ..\hdr
3134
if exist *.bak del *.bak
3235

clobber.bat

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ cd ..\sys
2727
cd ..\kernel
2828
%MAKE% clobber
2929

30+
cd ..\setver
31+
%MAKE% clobber
32+
3033
cd ..\hdr
3134
if exist *.bak del *.bak
3235

kernel/globals.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,8 @@ extern BYTE ASM ErrorMode, /* Critical error flag */
268268
ASM CritErrClass, ASM VgaSet,
269269
ASM njoined; /* number of joined devices */
270270

271+
extern VOID FAR * ASM setverPtr; /* Pointer to SETVER list */
272+
271273
extern UWORD ASM Int21AX;
272274
extern COUNT ASM CritErrCode;
273275
extern BYTE FAR * ASM CritErrDev;

kernel/kernel.asm

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -407,7 +407,8 @@ _nul_dev: ; 0022 device chain root
407407
global _njoined
408408
_njoined db 0 ; 0034 number of joined devices
409409
dw 0 ; 0035 DOS 4 pointer to special names (always zero in DOS 5)
410-
setverPtr dw 0,0 ; 0037 setver list
410+
global _setverPtr
411+
_setverPtr dw 0,0 ; 0037 setver list
411412
dw 0 ; 003B cs offset for fix a20
412413
dw 0 ; 003D psp of last umb exec
413414
global _LoL_nbuffers

kernel/task.c

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,44 @@ ULONG SftGetFsize(int sft_idx)
9292
return s->sft_size;
9393
}
9494

95+
STATIC WORD SetverCompareFilename(BYTE FAR *m1, BYTE FAR *m2, COUNT c)
96+
{
97+
while (c--)
98+
{
99+
if (toupper(*m1) != toupper(*m2))
100+
{
101+
return *m1 - *m2;
102+
}
103+
104+
m1 = m1 + 1; m2 = m2 + 1;
105+
}
106+
107+
return 0;
108+
}
109+
110+
STATIC UWORD SetverGetVersion(BYTE FAR *table, BYTE FAR *name)
111+
{
112+
BYTE FAR *len;
113+
COUNT nlen;
114+
115+
if ((table != NULL) && (name != NULL))
116+
{
117+
nlen = fstrlen(name);
118+
119+
while (*(len = table) != 0)
120+
{
121+
if ((*len == nlen) && (SetverCompareFilename(name, table + 1, *len) == 0))
122+
{
123+
return *((UWORD FAR *)(table + *len + 1));
124+
}
125+
126+
table = table + *len + 3;
127+
}
128+
}
129+
130+
return 0;
131+
}
132+
95133
STATIC COUNT ChildEnv(exec_blk * exp, UWORD * pChildEnvSeg, char far * pathname)
96134
{
97135
BYTE FAR *pSrc;
@@ -242,6 +280,7 @@ STATIC UWORD patchPSP(UWORD pspseg, UWORD envseg, exec_blk FAR * exb,
242280
mcb FAR *pspmcb;
243281
int i;
244282
BYTE FAR *np;
283+
UWORD fakever;
245284

246285
pspmcb = MK_FP(pspseg, 0);
247286
++pspseg;
@@ -287,6 +326,11 @@ STATIC UWORD patchPSP(UWORD pspseg, UWORD envseg, exec_blk FAR * exb,
287326
if (i < 8)
288327
pspmcb->m_name[i] = '\0';
289328

329+
if ((fakever = SetverGetVersion(setverPtr, np)) != 0)
330+
{
331+
psp->ps_retdosver = fakever;
332+
}
333+
290334
/* return value: AX value to be passed based on FCB values */
291335
return (get_cds1(psp->ps_fcb1.fcb_drive) ? 0 : 0xff) |
292336
(get_cds1(psp->ps_fcb2.fcb_drive) ? 0 : 0xff00);

makefile

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,8 @@ XUPX=upx --8086 --best
9191
XNASM=nasm
9292
ifeq ($(COMPILER),gcc)
9393
MAKE=make
94-
MAKEADJUST=for i in utils lib drivers boot sys kernel; do sed 's@!include "\(.*\)"@include ../mkfiles/gcc.mak@' < $$i/makefile > $$i/GNUmakefile; done
95-
MAKEREMOVE=for i in utils lib drivers boot sys kernel; do rm -f $$i/GNUmakefile; done
94+
MAKEADJUST=for i in utils lib drivers boot sys kernel setver; do sed 's@!include "\(.*\)"@include ../mkfiles/gcc.mak@' < $$i/makefile > $$i/GNUmakefile; done
95+
MAKEREMOVE=for i in utils lib drivers boot sys kernel setver; do rm -f $$i/GNUmakefile; done
9696
XLINK=ia16-elf-gcc
9797
else
9898
MAKE=wmake -ms -h
@@ -115,6 +115,7 @@ all:
115115
cd boot && $(MAKE) production
116116
cd sys && $(MAKE) production
117117
cd kernel && $(MAKE) production
118+
cd setver && $(MAKE) production
118119
$(MAKEREMOVE)
119120

120121
clean:
@@ -125,6 +126,7 @@ clean:
125126
cd boot && $(MAKE) clean
126127
cd sys && $(MAKE) clean
127128
cd kernel && $(MAKE) clean
129+
cd setver && $(MAKE) clean
128130
$(MAKEREMOVE)
129131

130132
clobber:
@@ -135,4 +137,5 @@ clobber:
135137
cd boot && $(MAKE) clobber
136138
cd sys && $(MAKE) clobber
137139
cd kernel && $(MAKE) clobber
140+
cd setver && $(MAKE) clobber
138141
$(MAKEREMOVE)

setver/makefile

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#
2+
# makefile for setver.sys
3+
#
4+
5+
!include "../mkfiles/generic.mak"
6+
7+
8+
production: setver.sys
9+
10+
setver.sys: setver.asm
11+
$(NASM) -o ..$(DIRSEP)bin$(DIRSEP)setver.sys setver.asm
12+
13+
clobber: clean
14+
15+
clean:
16+
-$(RM) *.obj *.map *.lst *.err
17+

setver/setver.asm

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
;
2+
; Initially written by Ricardo Hanke
3+
; Released under the terms of the GNU General Public License.
4+
; See the file 'COPYING' in the main directory for details.
5+
;
6+
; This driver loads the list of special programs into memory.
7+
;
8+
9+
section .text
10+
11+
12+
COMMAND equ 2
13+
STATUS equ 3
14+
DRIVEREND equ 14
15+
16+
FAKETABLE equ 37h
17+
18+
19+
header dw -1, -1
20+
dw 1000000000000000b
21+
dw strategy
22+
dw interrupt
23+
db "SETVERXX"
24+
25+
dw signature
26+
27+
paramblock dd 0
28+
29+
30+
strategy: mov [cs:paramblock + 0], bx
31+
mov [cs:paramblock + 2], es
32+
retf
33+
34+
35+
interrupt: push ax
36+
push bx
37+
push di
38+
push es
39+
pushf
40+
41+
les di, [paramblock]
42+
mov bl, [es:di + COMMAND]
43+
cmp bl, 0
44+
jne error
45+
46+
mov ax, table
47+
add ax, [length]
48+
49+
mov word [es:di + DRIVEREND + 0], ax
50+
mov word [es:di + DRIVEREND + 2], cs
51+
52+
mov ah, 52h
53+
int 21h
54+
55+
mov word [es:bx + FAKETABLE + 0], table
56+
mov word [es:bx + FAKETABLE + 2], cs
57+
58+
xor ax, ax
59+
jmp exit
60+
61+
error: mov ax, 8003h
62+
63+
exit: or ax, 0100h
64+
mov [es:di + STATUS], ax
65+
66+
popf
67+
pop es
68+
pop di
69+
pop bx
70+
pop ax
71+
72+
retf
73+
74+
75+
signature db 'SDIR'
76+
length dw 1
77+
78+
table ;db 11, "SHOWVER.EXE", 5, 00
79+
;db 12, "BUGGYPRG.EXE", 3, 31
80+
81+
db 0

0 commit comments

Comments
 (0)