Files
mars-dosutils/kern_wasm.asm
Mario Fetka a080dfaa56 tests
2026-05-23 16:56:04 +02:00

349 lines
7.0 KiB
NASM

; kern_wasm.asm
;
; Open Watcom WASM/MASM-syntax port of the old TASM IDEAL kern.asm.
; Intended for 16-bit DOS large memory model builds on Linux with Open Watcom v2.
;
; Keep kern.asm as the historical TASM source and use this file for the
; reproducible Open Watcom build.
.386
.model large
.data
enterIPX dd 0
.code
public _IPXinit
public _IPXopen_socket
public _IPXclose_socket
public _IPXlisten
public _xmemmove
public _Net_Call
public _C32_LoadNios_Probe
public _Net_Call_VLM_Raw
_IPXinit proc far
push bp
mov bp, sp
push ds
push si
push di
mov ax, 7A00h
int 2Fh
cmp al, 0FFh
jne ipxinit_done
mov cx, @data
mov ds, cx
mov word ptr enterIPX, di
mov ax, es
mov word ptr enterIPX+2, ax
mov al, 1
ipxinit_done:
mov ah, 0
pop di
pop si
pop ds
pop bp
ret
_IPXinit endp
_xmemmove proc far
push bp
mov bp, sp
; far procedure stack layout, large model:
; [bp+0] old bp
; [bp+2] return offset
; [bp+4] return segment
; [bp+6] z offset
; [bp+8] z segment
; [bp+10] q offset
; [bp+12] q segment
; [bp+14] nmbr
cli
mov cx, [bp+14]
or cx, cx
jz xmem_done
push ds
push si
push di
pushf
lds si, dword ptr [bp+10]
les di, dword ptr [bp+6]
cmp di, si
jl xmem_forward
std
dec cx
add di, cx
add si, cx
inc cx
jmp xmem_copy
xmem_forward:
cld
xmem_copy:
rep movsb
popf
pop di
pop si
pop ds
xmem_done:
pop bp
sti
ret
_xmemmove endp
_IPXopen_socket proc far
push bp
mov bp, sp
push ds
push si
push di
; int IPXopen_socket(UI sock, int live)
mov ax, [bp+8] ; live
mov dx, [bp+6] ; sock
mov bx, @data
mov ds, bx
mov bx, 0
call dword ptr enterIPX
cmp al, 0FFh
jne ipxopen_not_already
mov ax, -1 ; socket already open
jmp ipxopen_done
ipxopen_not_already:
cmp al, 0FEh
jne ipxopen_ok
mov ax, -2 ; socket table full
jmp ipxopen_done
ipxopen_ok:
mov ax, dx
ipxopen_done:
pop di
pop si
pop ds
pop bp
ret
_IPXopen_socket endp
_IPXclose_socket proc far
push bp
mov bp, sp
push ds
push si
push di
; void IPXclose_socket(UI sock)
mov dx, [bp+6]
mov bx, @data
mov ds, bx
mov bx, 1
call dword ptr enterIPX
pop di
pop si
pop ds
pop bp
ret
_IPXclose_socket endp
_IPXlisten proc far
push bp
mov bp, sp
push ds
push si
push di
; int IPXlisten(ECB *ecb)
les si, dword ptr [bp+6]
mov bx, @data
mov ds, bx
mov bx, 4
call dword ptr enterIPX
pop di
pop si
pop ds
pop bp
mov ah, 0
ret
_IPXlisten endp
_Net_Call proc far
push bp
mov bp, sp
; int Net_Call(UI func, void *req, void *repl)
; [bp+6] func
; [bp+8] req offset
; [bp+10] req segment
; [bp+12] repl offset
; [bp+14] repl segment
mov ax, [bp+6]
push ds
push si
push di
pushf
lds si, dword ptr [bp+8]
les di, dword ptr [bp+12]
int 21h
popf
pop di
pop si
pop ds
pop bp
mov ah, 0
ret
_Net_Call endp
; int Net_Call_VLM_Raw(UI ax, UI bx, UI cx, UI dx,
; void *req, void *repl,
; UI p1, UI p2, UI p3)
;
; Experimental VLM entry caller.
; INT 2F AX=7A20 returns ES:BX = VLM entry if AX == 0000.
;
; Register setup for VLM entry:
; AX, BX, CX, DX from function args
; DS:SI = req
; ES:DI = repl
;
; Extra stack args pushed before calling VLM entry:
; p3, p2, p1
;
; For NWCREQUEST/VLM test:
; AX=function
; BX=numReqFrags
; CX=connid
; DX=numReplyFrags
; DS:SI=reqFragList
; ES:DI=replyFragList
; p1=6, p2=20h, p3=0
_Net_Call_VLM_Raw proc far
push bp
mov bp, sp
sub sp, 4
push ds
push si
push di
push es
mov ax, 7A20h
xor bx, bx
int 2Fh
or ax, ax
jz vlm_raw_found
mov ax, 88FFh
jmp short vlm_raw_done
vlm_raw_found:
; save VLM entry ES:BX in stack locals
mov [bp-4], bx
mov ax, es
mov [bp-2], ax
; load caller-requested registers
mov ax, [bp+6]
mov bx, [bp+8]
mov cx, [bp+10]
mov dx, [bp+12]
lds si, dword ptr [bp+14]
les di, dword ptr [bp+18]
push word ptr [bp+26]
push word ptr [bp+24]
push word ptr [bp+22]
call dword ptr [bp-4]
vlm_raw_done:
pop es
pop di
pop si
pop ds
mov sp, bp
pop bp
ret
_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
;
; 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
_C32_LoadNios_Probe proc far
push bp
mov bp, sp
push ds
push es
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
les di, dword ptr [bp+8]
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
pop di
pop si
pop es
pop ds
pop bp
xor ah, ah
ret
_C32_LoadNios_Probe endp
end