Implement syscall subfunction jump table

This commit is contained in:
Nero 2020-04-13 18:03:54 +02:00
parent 39ef1f9a3e
commit 6b49a20865
1 changed files with 62 additions and 15 deletions

View File

@ -26,8 +26,8 @@ int21h: push bp
; Save user stack ; Save user stack
mov ax, ss mov ax, ss
mov [stack-2], ax mov [cs:stack-2], ax
mov [stack-4], sp mov [cs:stack-4], sp
; Set up kernel stack ; Set up kernel stack
xor ax, ax xor ax, ax
@ -48,7 +48,7 @@ scall: sub sp, framsz
mov bp, sp mov bp, sp
call getax call getax
int 3 call jmptab
; Restore user stack ; Restore user stack
mov sp, [bp+framsz] mov sp, [bp+framsz]
@ -59,6 +59,19 @@ scall: sub sp, framsz
pop bp pop bp
iret iret
; Lookup address of subfunction
; Mesh up the stack so we return to subfunction
; and subfunction later returns to scall
jmptab: push ax
push bx
xor bx, bx
add bl, ah
add bl, ah
mov bx, [cs:bx+sftab]
mov [bp-4], bx
pop bx
ret
; Get AX from the user stack ; Get AX from the user stack
getax: push ds getax: push ds
push si push si
@ -73,40 +86,66 @@ sferr: stc
ret ret
; Subfunction table ; Subfunction table
align 2
sftab: dw sferr, sferr, sferr, sferr sftab: dw sferr, sferr, sferr, sferr
dw sferr, sferr, sferr, sferr dw sferr, sferr, sferr, sferr
dw sferr, sferr, sferr, sferr dw sferr, sferr, sferr, sferr
dw sferr, sferr, sferr, sferr dw sferr, sferr, sferr, sferr
; 10
dw sferr, sferr, sferr, sferr dw sferr, sferr, sferr, sferr
dw sferr, sferr, sferr, sferr dw sferr, sferr, sferr, sferr
dw sferr, sferr, sferr, sferr dw sferr, sferr, sferr, sferr
dw sferr, sferr, sferr, sferr dw sferr, sferr, sferr, sferr
; 20
dw sferr, sferr, sferr, sferr dw sferr, sferr, sferr, sferr
dw sferr, setint, sferr, sferr dw sferr, setint, sferr, sferr
dw sferr, sferr, sferr, sferr dw sferr, sferr, sferr, sferr
dw sferr, sferr, sferr, sferr dw sferr, sferr, sferr, sferr
; 30
dw sferr, sferr, sferr, sferr dw sferr, sferr, sferr, sferr
dw sferr, sferr, sferr, sferr dw sferr, getint, sferr, sferr
dw sferr, sferr, sferr, sferr dw sferr, sferr, sferr, sferr
dw sferr, sferr, sferr, sferr dw sferr, sferr, sferr, sferr
; DOS 25h: Set interrupt vector ; IN al number
; IN al interrupt number ; OUT bx al * 4
; ds:dx entry point times4: push ax
setint: push ax
push bx
xor ah, ah xor ah, ah
add al, al add al, al
add al, al add al, al
mov bx, ax mov bx, ax
mov [cs:bx], dx
mov ax, ds
mov [cs:bx+2], ds
pop bx
pop ax pop ax
ret ret
; DOS 2+ - GET INTERRUPT VECTOR
; IN al interrupt number
; OUT es:bx current interrupt handler
getint: push ds
; DS=0
xor bx, bx
mov ds, bx
; BX=AL*4
call times4
les bx, [bx]
pop ds
ret
; DOS 25h: Set interrupt vector
; IN al interrupt number
; ds:dx entry point
setint: push es
push bx
; ES=0
xor bx, bx
mov es, bx
; BX=AL*4
call times4
mov [es:bx], dx
mov ax, ds
mov [es:bx+2], ds
pop bx
pop es
ret
; ===== end of resident, begin of transient startup code ; ===== end of resident, begin of transient startup code
init: xor ax, ax init: xor ax, ax
@ -122,7 +161,15 @@ init: xor ax, ax
mov ax, 0x2520 mov ax, 0x2520
mov dx, int20h mov dx, int20h
call setint int 0x21
mov ax, 0x3520
int 0x21
mov ah, 0x3f
int 3
int 0x21
int 3
main: push cs main: push cs
pop ds pop ds