Implement entrypoint and table for syscalls
This commit is contained in:
parent
015eea2f2f
commit
1dbfb2f592
@ -14,7 +14,7 @@ init: cli
|
|||||||
mov ds, ax
|
mov ds, ax
|
||||||
mov es, ax
|
mov es, ax
|
||||||
mov ss, ax
|
mov ss, ax
|
||||||
mov sp, ( stack+stacksize )
|
mov sp, ax
|
||||||
|
|
||||||
call printf
|
call printf
|
||||||
%defstr VERSIONSTR VERSION
|
%defstr VERSIONSTR VERSION
|
||||||
@ -31,20 +31,25 @@ init: cli
|
|||||||
|
|
||||||
call logdrv
|
call logdrv
|
||||||
|
|
||||||
mov bx, testfcb
|
mov word [0x21*4], int21
|
||||||
call open
|
mov word [0x21*4+2], cs
|
||||||
push ax
|
mov word [curpsp], 0x1000
|
||||||
call printf
|
|
||||||
db "AX=",2,0x0A,0x0D,0
|
|
||||||
|
|
||||||
|
mov ah, 2
|
||||||
|
mov dl, 0x37
|
||||||
|
int 0x21
|
||||||
|
|
||||||
|
restart:
|
||||||
hlt: hlt
|
hlt: hlt
|
||||||
jmp hlt
|
jmp hlt
|
||||||
|
|
||||||
|
%include "kernel/bdos.asm"
|
||||||
%include "kernel/far.asm"
|
%include "kernel/far.asm"
|
||||||
%include "kernel/fcb.asm"
|
%include "kernel/fcb.asm"
|
||||||
%include "kernel/find.asm"
|
%include "kernel/find.asm"
|
||||||
%include "kernel/drive.asm"
|
%include "kernel/drive.asm"
|
||||||
%include "kernel/printf.asm"
|
%include "kernel/printf.asm"
|
||||||
|
%include "kernel/char.asm"
|
||||||
|
|
||||||
section .data
|
section .data
|
||||||
|
|
||||||
@ -54,4 +59,5 @@ testfcb: db 0
|
|||||||
|
|
||||||
section .bss
|
section .bss
|
||||||
|
|
||||||
|
alignb 2
|
||||||
stack: resb stacksize
|
stack: resb stacksize
|
||||||
|
89
kernel/bdos.asm
Normal file
89
kernel/bdos.asm
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
section .bss
|
||||||
|
|
||||||
|
curpsp: resw 1
|
||||||
|
|
||||||
|
|
||||||
|
absolute 0
|
||||||
|
|
||||||
|
resb 2 ; ret 0 exit
|
||||||
|
resb 2 ; allocation length
|
||||||
|
resb 1
|
||||||
|
resb 5 ; CP/M entry point
|
||||||
|
|
||||||
|
; SS:SP, DS:DX, ES:BX and AX from the program
|
||||||
|
PSPAX: resw 1
|
||||||
|
PSPSS: resw 1
|
||||||
|
PSPSP: resw 1
|
||||||
|
PSPDS: resw 1
|
||||||
|
PSPDX: resw 1
|
||||||
|
PSPES: resw 1
|
||||||
|
PSPBX: resd 1
|
||||||
|
|
||||||
|
|
||||||
|
section .text
|
||||||
|
|
||||||
|
; OUT ds PSP segment
|
||||||
|
pspds: xor ax, ax
|
||||||
|
mov ds, ax
|
||||||
|
mov ds, [curpsp]
|
||||||
|
ret
|
||||||
|
|
||||||
|
int21: push ds
|
||||||
|
; load program PSP and save userdata
|
||||||
|
push ax
|
||||||
|
call pspds
|
||||||
|
pop word [PSPAX]
|
||||||
|
pop word [PSPDS]
|
||||||
|
mov [PSPSS], ss
|
||||||
|
mov [PSPSP], sp
|
||||||
|
mov [PSPDX], dx
|
||||||
|
mov [PSPES], es
|
||||||
|
mov [PSPBX], bx
|
||||||
|
|
||||||
|
mov ss, ax
|
||||||
|
mov sp, ( stack+stacksize )
|
||||||
|
|
||||||
|
mov al, [PSPAX+1]
|
||||||
|
shl ax, 1
|
||||||
|
shl ax, 1
|
||||||
|
call .etbl
|
||||||
|
; syscall table
|
||||||
|
; cells: ptr to handler, ptr to sysret
|
||||||
|
dw restart, sret
|
||||||
|
dw getc, sretb
|
||||||
|
dw putc, sret
|
||||||
|
; set up a return chain and execute it
|
||||||
|
; first return into handler function
|
||||||
|
; second return into appropiate sysret
|
||||||
|
.etbl: pop bx
|
||||||
|
add bx, ax
|
||||||
|
push word [cs:bx+2]
|
||||||
|
push word [cs:bx]
|
||||||
|
ret
|
||||||
|
|
||||||
|
; sysret handlers
|
||||||
|
; return ES:BX to user
|
||||||
|
sretd: call pspds
|
||||||
|
jmp sret.l02
|
||||||
|
|
||||||
|
; return BX to user
|
||||||
|
sretw: call pspds
|
||||||
|
mov es, [PSPES]
|
||||||
|
jmp sret.l02
|
||||||
|
|
||||||
|
; return AL to user
|
||||||
|
sretb: push ax
|
||||||
|
call pspds
|
||||||
|
pop ax
|
||||||
|
mov ah, [PSPAX+1]
|
||||||
|
les bx, [PSPBX]
|
||||||
|
jmp sret.l03
|
||||||
|
|
||||||
|
; return without result
|
||||||
|
sret: call pspds
|
||||||
|
.l01: les bx, [PSPBX]
|
||||||
|
.l02: mov ax, [PSPAX]
|
||||||
|
.l03: mov ss, [PSPSS]
|
||||||
|
mov sp, [PSPSP]
|
||||||
|
lds dx, [PSPDX]
|
||||||
|
iret
|
11
kernel/char.asm
Normal file
11
kernel/char.asm
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
getc: xor ax, ax
|
||||||
|
int 0x16
|
||||||
|
test al, al
|
||||||
|
jz getc
|
||||||
|
ret
|
||||||
|
|
||||||
|
putc: mov al, dl
|
||||||
|
mov ah, 0x0e
|
||||||
|
xor bx, bx
|
||||||
|
int 0x10
|
||||||
|
ret
|
Loading…
Reference in New Issue
Block a user