This commit is contained in:
Mario Fetka
2026-05-23 16:59:44 +02:00
parent a080dfaa56
commit c68d73faa6
2 changed files with 41 additions and 42 deletions

View File

@@ -6,7 +6,7 @@
; Keep kern.asm as the historical TASM source and use this file for the
; reproducible Open Watcom build.
.386
.286
.model large
.data
@@ -290,21 +290,19 @@ _Net_Call_VLM_Raw endp
; int C32_LoadNios_Probe(UI axfunc, void *outbuf)
;
; Probe the Client32/NIOS INT 2F entry used by DeveloperNet dninit.asm:
; AX = axfunc, normally D8C1h
; INT 2Fh
; AX = 0000 on success
; ESI and ECX contain Client32/NIOS function pointers/data
; 16-bit-safe Client32/NIOS probe.
; Calls INT 2F AX=D8C1 like DeveloperNet LoadNiosFunctions,
; but stores only 16-bit visible registers so kern.obj stays 16-bit.
;
; outbuf layout, little endian:
; +00 word AX after int 2F
; +02 dword ESI after int 2F
; +06 dword ECX after int 2F
; +0A word BX
; +0C word CX low
; +0E word DX
; +10 word SI low
; +12 word DI low
; outbuf:
; +00 AX
; +02 BX
; +04 CX
; +06 DX
; +08 SI
; +0A DI
; +0C DS
; +0E ES
_C32_LoadNios_Probe proc far
push bp
mov bp, sp
@@ -314,26 +312,25 @@ _C32_LoadNios_Probe proc far
push si
push di
xor ecx, ecx
xor esi, esi
xor ebx, ebx
xor edx, edx
xor edi, edi
mov ax, [bp+6]
int 2Fh
push ds
push ax
les di, dword ptr [bp+8]
pop ax
mov es:[di+0], ax
mov dword ptr es:[di+2], esi
mov dword ptr es:[di+6], ecx
mov es:[di+10], bx
mov es:[di+12], cx
mov es:[di+14], dx
mov es:[di+16], si
; DI currently points at outbuf, so store caller-visible DI is not useful.
mov word ptr es:[di+18], 0
mov es:[di+2], bx
mov es:[di+4], cx
mov es:[di+6], dx
mov es:[di+8], si
; store caller-visible DI is lost because DI now points to outbuf
mov word ptr es:[di+10], 0
pop ax
mov es:[di+12], ax
mov ax, es
mov es:[di+14], ax
pop di
pop si

View File

@@ -1147,33 +1147,35 @@ static int tests_c32type(void)
uint8 out[32];
int rc;
uint16 ax;
uint32 esi;
uint32 ecx;
uint16 bx;
uint16 cx;
uint16 dx;
uint16 si;
uint16 di;
uint16 dsreg;
uint16 esreg;
memset(out, 0, sizeof(out));
fprintf(stdout, "TEST Client32/NIOS probe\n");
fprintf(stdout, "TEST Client32/NIOS probe 16-bit safe\n");
fprintf(stdout, "Call INT 2F AX=D8C1 like DeveloperNet dninit.asm\n\n");
rc = C32_LoadNios_Probe(0xD8C1, out);
ax = tests_get_word_lh(out + 0);
esi = tests_get_dword_lh2(out + 2);
ecx = tests_get_dword_lh2(out + 6);
bx = tests_get_word_lh(out + 10);
cx = tests_get_word_lh(out + 12);
dx = tests_get_word_lh(out + 14);
si = tests_get_word_lh(out + 16);
ax = tests_get_word_lh(out + 0);
bx = tests_get_word_lh(out + 2);
cx = tests_get_word_lh(out + 4);
dx = tests_get_word_lh(out + 6);
si = tests_get_word_lh(out + 8);
di = tests_get_word_lh(out + 10);
dsreg = tests_get_word_lh(out + 12);
esreg = tests_get_word_lh(out + 14);
fprintf(stdout, "C32 probe rc=%04X\n", rc);
fprintf(stdout, "INT2F D8C1 result AX=%04X\n", ax);
fprintf(stdout, "ESI=%08lX ECX=%08lX\n", esi, ecx);
fprintf(stdout, "BX=%04X CX=%04X DX=%04X SI=%04X\n", bx, cx, dx, si);
tests_dump_bytes("RAW:", out, 20);
fprintf(stdout, "BX=%04X CX=%04X DX=%04X SI=%04X DI=%04X\n", bx, cx, dx, si, di);
fprintf(stdout, "DS=%04X ES=%04X\n", dsreg, esreg);
tests_dump_bytes("RAW:", out, 16);
if (ax == 0) {
fprintf(stdout, "\nClient32/NIOS entry appears present.\n");