kernel: add syscall handling stub
This commit is contained in:
parent
c0b8c107c4
commit
576b2c6546
199
src/@rdos.asm
199
src/@rdos.asm
@ -2,15 +2,13 @@
|
|||||||
cseg equ 0x0
|
cseg equ 0x0
|
||||||
jmp init
|
jmp init
|
||||||
|
|
||||||
%include "bpb.inc"
|
;;; Character I/O
|
||||||
%include "farptr.inc"
|
|
||||||
|
|
||||||
; dflags bitfields
|
; direct console I/O
|
||||||
DRVLOG equ 0x01 ; bit 0 - drive logged in (see drvnum)
|
; IN dl character to output or 0xFF if input
|
||||||
DRVCTL equ 0x02 ; bit 1 - controller configured
|
; OUT al character to read
|
||||||
DRVEXT equ 0x04 ; bit 2 - EBIOS supported
|
conio cmp dl, 0xFF
|
||||||
DIRTY equ 0x08 ; bit 3 - dskbuf dirty
|
je conin
|
||||||
DRVCHS equ 0x10 ; bit 4 - CHS geometry known
|
|
||||||
|
|
||||||
; raw console output
|
; raw console output
|
||||||
; IN dl character
|
; IN dl character
|
||||||
@ -20,16 +18,6 @@ conout xchg ax, dx
|
|||||||
int 0x10
|
int 0x10
|
||||||
ret
|
ret
|
||||||
|
|
||||||
; check if character has characters ready
|
|
||||||
; OUT al 0xFF if data, 0 if none
|
|
||||||
const mov ah, 1
|
|
||||||
int 0x16
|
|
||||||
jz .emp
|
|
||||||
mov ax, 0xFF
|
|
||||||
ret
|
|
||||||
.emp mov al, 0
|
|
||||||
ret
|
|
||||||
|
|
||||||
; read character from console
|
; read character from console
|
||||||
; OUT al character or zero
|
; OUT al character or zero
|
||||||
conin call const
|
conin call const
|
||||||
@ -39,6 +27,16 @@ conin call const
|
|||||||
int 0x16
|
int 0x16
|
||||||
.ret ret
|
.ret ret
|
||||||
|
|
||||||
|
; check if character has characters ready
|
||||||
|
; OUT al 0xFF if data, 0 if none
|
||||||
|
const mov ah, 1
|
||||||
|
int 0x16
|
||||||
|
jz .emp
|
||||||
|
mov ax, 0xFF
|
||||||
|
ret
|
||||||
|
.emp mov al, 0
|
||||||
|
ret
|
||||||
|
|
||||||
; dummy: write to auxillary dev
|
; dummy: write to auxillary dev
|
||||||
auxout ret
|
auxout ret
|
||||||
|
|
||||||
@ -71,13 +69,6 @@ readc call const
|
|||||||
; IN dl character
|
; IN dl character
|
||||||
putc jmp conout
|
putc jmp conout
|
||||||
|
|
||||||
; direct console I/O
|
|
||||||
; IN dl character to output or 0xFF if input
|
|
||||||
; OUT al character to read
|
|
||||||
dcon cmp dl, 0xFF
|
|
||||||
je conin
|
|
||||||
jmp conout
|
|
||||||
|
|
||||||
; output character string
|
; output character string
|
||||||
; IN ds:dx far ptr to string, '$'-terminated
|
; IN ds:dx far ptr to string, '$'-terminated
|
||||||
puts push si
|
puts push si
|
||||||
@ -147,6 +138,18 @@ gets mov si, dx
|
|||||||
call putc
|
call putc
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
;;; Disk i/o
|
||||||
|
|
||||||
|
%include "bpb.inc"
|
||||||
|
%include "farptr.inc"
|
||||||
|
|
||||||
|
; dflags bitfields
|
||||||
|
DRVLOG equ 0x01 ; bit 0 - drive logged in (see drvnum)
|
||||||
|
DRVCTL equ 0x02 ; bit 1 - controller configured
|
||||||
|
DRVEXT equ 0x04 ; bit 2 - EBIOS supported
|
||||||
|
DIRTY equ 0x08 ; bit 3 - dskbuf dirty
|
||||||
|
DRVCHS equ 0x10 ; bit 4 - CHS geometry known
|
||||||
|
|
||||||
align 16
|
align 16
|
||||||
; IBM Interrupt Sharing Protocol structure
|
; IBM Interrupt Sharing Protocol structure
|
||||||
i13isp jmp short int13i
|
i13isp jmp short int13i
|
||||||
@ -436,29 +439,6 @@ diskio mov cl, 1 ; read len
|
|||||||
stc
|
stc
|
||||||
ret
|
ret
|
||||||
|
|
||||||
; Get interrupt vector
|
|
||||||
; IN al interrupt number
|
|
||||||
; OUT es:bx vector
|
|
||||||
getint mov bl, al
|
|
||||||
mov bh, 0
|
|
||||||
; multiply with 4
|
|
||||||
add bx, bx
|
|
||||||
add bx, bx
|
|
||||||
les bx, [cs:bx]
|
|
||||||
ret
|
|
||||||
|
|
||||||
; Set interrupt vector
|
|
||||||
; IN al interrupt number
|
|
||||||
; ds:dx vector
|
|
||||||
setint mov bl, al
|
|
||||||
mov bh, 0
|
|
||||||
; multiply with 4
|
|
||||||
add bx, bx
|
|
||||||
add bx, bx
|
|
||||||
mov [cs:bx], dx
|
|
||||||
mov [cs:bx+2], ds
|
|
||||||
ret
|
|
||||||
|
|
||||||
init mov ax, cs
|
init mov ax, cs
|
||||||
; boot failure if loaded wrong
|
; boot failure if loaded wrong
|
||||||
cmp ax, cseg
|
cmp ax, cseg
|
||||||
@ -481,11 +461,130 @@ init mov ax, cs
|
|||||||
mov word [4*0x13], int13i
|
mov word [4*0x13], int13i
|
||||||
mov [4*0x13+2], cs
|
mov [4*0x13+2], cs
|
||||||
|
|
||||||
mov ax, 0x0e37
|
; install int21h handler
|
||||||
int 0x10
|
mov word [4*0x21], int21h
|
||||||
|
mov [4*0x21+2], cs
|
||||||
|
|
||||||
|
mov dl, 0x36
|
||||||
|
mov ah, 2
|
||||||
|
int 0x21
|
||||||
|
|
||||||
halt hlt
|
halt hlt
|
||||||
jmp halt
|
jmp halt
|
||||||
|
|
||||||
|
;;; Export functions as syscalls
|
||||||
|
; SP, BP, SI, DI and ES must be preserved by kernel code
|
||||||
|
; DL, DX or DS:DX is input argument from prog
|
||||||
|
; AL, BX or ES:BX is return value to prog
|
||||||
|
|
||||||
|
srb equ 0x8000
|
||||||
|
srw equ 0x4000
|
||||||
|
|
||||||
|
; DOS style syscall interface
|
||||||
|
int21h push bx
|
||||||
|
xor bx, bx
|
||||||
|
mov bl, ah
|
||||||
|
jmp sysc
|
||||||
|
|
||||||
|
; CP/M-86 style syscall interface
|
||||||
|
intE0h push bx
|
||||||
|
xor bx, bx
|
||||||
|
mov bl, cl
|
||||||
|
|
||||||
|
; bx = syscall number
|
||||||
|
; stack must be -> BX IP CS FL
|
||||||
|
; for return to prog
|
||||||
|
sysc add bx, bx
|
||||||
|
mov bx, [cs:bx+stab]
|
||||||
|
test bh, srw >> 8 ; fork off bx returns
|
||||||
|
jnz .l02
|
||||||
|
test bh, srb >> 8 ; fork off al returns
|
||||||
|
jnz .l01
|
||||||
|
; syscall with no return value
|
||||||
|
push dx
|
||||||
|
push cx
|
||||||
|
push ax
|
||||||
|
push ds
|
||||||
|
call bx
|
||||||
|
pop ds
|
||||||
|
pop ax
|
||||||
|
pop cx
|
||||||
|
pop dx
|
||||||
|
pop bx
|
||||||
|
iret
|
||||||
|
; syscalls returning byte in al
|
||||||
|
.l01 push dx
|
||||||
|
push cx
|
||||||
|
push ds
|
||||||
|
and bh, ~(srb >> 8)
|
||||||
|
call bx
|
||||||
|
pop ds
|
||||||
|
pop cx
|
||||||
|
pop dx
|
||||||
|
pop bx
|
||||||
|
iret
|
||||||
|
; syscalls returning bx or es:bx
|
||||||
|
.l02 add sp, 2 ; discard bx on the stack
|
||||||
|
push dx
|
||||||
|
push cx
|
||||||
|
push ax
|
||||||
|
push ds
|
||||||
|
and bh, ~(srw >> 8)
|
||||||
|
call bx
|
||||||
|
pop ds
|
||||||
|
pop ax
|
||||||
|
pop cx
|
||||||
|
pop dx
|
||||||
|
ret
|
||||||
|
|
||||||
|
section .rodata
|
||||||
|
|
||||||
|
; syscall table
|
||||||
|
stab dw 0 ; 0 reboot
|
||||||
|
dw getc + srb ; 1 console input
|
||||||
|
dw putc ; 2 console output
|
||||||
|
dw auxin ; 3 reader in
|
||||||
|
dw auxout + srb ; 4 puncher out
|
||||||
|
dw lstout ; 5 lister out
|
||||||
|
dw 0 ; 6 direct console i/o
|
||||||
|
dw 0 ; 7 read i/o byte
|
||||||
|
dw 0 ; 8 get i/o byte
|
||||||
|
dw 0 ; 9 string output
|
||||||
|
dw 0 ; 10 string input
|
||||||
|
dw 0 ; 11 console status
|
||||||
|
dw 0 ; 12 get version number
|
||||||
|
dw 0 ; 13 reset disks
|
||||||
|
dw 0 ; 14 set drive
|
||||||
|
dw 0 ; 15 open file
|
||||||
|
dw 0 ; 16 close file
|
||||||
|
dw 0 ; 17 find first
|
||||||
|
dw 0 ; 18 find next
|
||||||
|
dw 0 ; 19 delete file
|
||||||
|
dw 0 ; 20 sequential read
|
||||||
|
dw 0 ; 21 sequential write
|
||||||
|
dw 0 ; 22 create file
|
||||||
|
dw 0 ; 23 rename file
|
||||||
|
dw 0 ; 24 get login vector
|
||||||
|
dw 0 ; 25 get drive
|
||||||
|
dw 0 ; 26 set dma addr
|
||||||
|
dw 0 ; 27 alloc vector
|
||||||
|
dw 0 ; 28 set drive r/o
|
||||||
|
dw 0 ; 29 get r/o vector
|
||||||
|
dw 0 ; 30 file attr
|
||||||
|
dw 0 ; 31 get addr of disk parameter block
|
||||||
|
dw 0 ; 32 get user number
|
||||||
|
dw 0 ; 33 random read
|
||||||
|
dw 0 ; 34 random write
|
||||||
|
dw 0 ; 35 calculate file size
|
||||||
|
dw 0 ; 36 calculate cur record number
|
||||||
|
dw 0 ; 37 reset drive
|
||||||
|
dw 0 ; 38
|
||||||
|
dw 0 ; 39
|
||||||
|
dw 0 ; 40 random write with block init
|
||||||
|
stab_e nop
|
||||||
|
|
||||||
|
section .data
|
||||||
|
|
||||||
dap db 0x10, 0
|
dap db 0x10, 0
|
||||||
dw 1
|
dw 1
|
||||||
dw dskbuf, cseg
|
dw dskbuf, cseg
|
||||||
|
Loading…
Reference in New Issue
Block a user