Implement syscall interface and version data
This commit is contained in:
parent
576b2c6546
commit
f7d7f48026
145
src/@rdos.asm
145
src/@rdos.asm
@ -1,6 +1,21 @@
|
|||||||
org 0x700
|
org 0x700
|
||||||
cseg equ 0x0
|
cseg equ 0x0
|
||||||
jmp init
|
|
||||||
|
%include "version.inc"
|
||||||
|
|
||||||
|
jmp _entry
|
||||||
|
banner db "RDOS KERNEL 1.0", 0x0A, 0x0D, '$', 0x1A
|
||||||
|
_entry call .l01
|
||||||
|
.l01 pop ax
|
||||||
|
sub ax, .l01
|
||||||
|
mov cl, 4
|
||||||
|
shr ax, cl
|
||||||
|
mov cx, cs
|
||||||
|
add cx, ax
|
||||||
|
push cx
|
||||||
|
mov ax, start
|
||||||
|
push ax
|
||||||
|
retf
|
||||||
|
|
||||||
;;; Character I/O
|
;;; Character I/O
|
||||||
|
|
||||||
@ -138,10 +153,15 @@ gets mov si, dx
|
|||||||
call putc
|
call putc
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
;;; System functions
|
||||||
|
|
||||||
|
; Return OS version from version.inc
|
||||||
|
ver mov bx, bdosver | 0x1000
|
||||||
|
ret
|
||||||
|
|
||||||
;;; Disk i/o
|
;;; Disk i/o
|
||||||
|
|
||||||
%include "bpb.inc"
|
%include "bpb.inc"
|
||||||
%include "farptr.inc"
|
|
||||||
|
|
||||||
; dflags bitfields
|
; dflags bitfields
|
||||||
DRVLOG equ 0x01 ; bit 0 - drive logged in (see drvnum)
|
DRVLOG equ 0x01 ; bit 0 - drive logged in (see drvnum)
|
||||||
@ -150,23 +170,8 @@ DRVEXT equ 0x04 ; bit 2 - EBIOS supported
|
|||||||
DIRTY equ 0x08 ; bit 3 - dskbuf dirty
|
DIRTY equ 0x08 ; bit 3 - dskbuf dirty
|
||||||
DRVCHS equ 0x10 ; bit 4 - CHS geometry known
|
DRVCHS equ 0x10 ; bit 4 - CHS geometry known
|
||||||
|
|
||||||
align 16
|
|
||||||
; IBM Interrupt Sharing Protocol structure
|
|
||||||
i13isp jmp short int13i
|
|
||||||
dw 0,0xFFFF
|
|
||||||
dw 0x424B
|
|
||||||
db 0
|
|
||||||
iret
|
|
||||||
align 16
|
|
||||||
|
|
||||||
; Entry point when user program calls int13h
|
|
||||||
; TODO: flush buffer and log out drive
|
|
||||||
int13i call int13
|
|
||||||
iret
|
|
||||||
|
|
||||||
; Wrapper around int 13h
|
; Wrapper around int 13h
|
||||||
int13 pushf
|
int13 int 0x13
|
||||||
call far [i13isp+2]
|
|
||||||
; TODO: on error: reset & retry
|
; TODO: on error: reset & retry
|
||||||
; TODO: record errors
|
; TODO: record errors
|
||||||
; TODO: multi-track reading
|
; TODO: multi-track reading
|
||||||
@ -209,10 +214,10 @@ getprm test byte [dflags], DRVEXT
|
|||||||
test ax, ax
|
test ax, ax
|
||||||
jz .ret
|
jz .ret
|
||||||
; copy BIOS dpt table over ours
|
; copy BIOS dpt table over ours
|
||||||
mov dx, dpt
|
;mov dx, dpt
|
||||||
mov bx, di
|
;mov bx, di
|
||||||
mov cx, 11
|
;mov cx, 11
|
||||||
call lodfar
|
;call lodfar
|
||||||
.ret ret
|
.ret ret
|
||||||
|
|
||||||
; select a drive for io
|
; select a drive for io
|
||||||
@ -379,14 +384,13 @@ flush test word [cs:dflags], DIRTY
|
|||||||
; Sector number is read from [drvseek]
|
; Sector number is read from [drvseek]
|
||||||
diskio mov cl, 1 ; read len
|
diskio mov cl, 1 ; read len
|
||||||
; DS := ES := CS
|
; DS := ES := CS
|
||||||
call rstseg
|
mov ds, [cs:dseg]
|
||||||
; check if ebios supported
|
; check if ebios supported
|
||||||
test word [dflags], DRVEXT
|
test word [dflags], DRVEXT
|
||||||
jz .noext
|
jz .noext
|
||||||
; set up regs for ebios call
|
; set up regs for ebios call
|
||||||
mov ax, cx
|
xchg ax, cx
|
||||||
or ah, 0x40
|
or ah, 0x40
|
||||||
mov si, dap
|
|
||||||
jmp .do
|
jmp .do
|
||||||
; check if we can skip controller reset
|
; check if we can skip controller reset
|
||||||
.noext test word [dflags], DRVCTL
|
.noext test word [dflags], DRVCTL
|
||||||
@ -419,15 +423,19 @@ diskio mov cl, 1 ; read len
|
|||||||
; shuffle values around for bios
|
; shuffle values around for bios
|
||||||
xchg ax, cx
|
xchg ax, cx
|
||||||
xchg dh, dl
|
xchg dh, dl
|
||||||
mov bx, dskbuf
|
|
||||||
.do mov dl, [biosnum]
|
.do mov dl, [biosnum]
|
||||||
; ah: subfunction selected via cx previously
|
; ah: subfunction selected via cx previously
|
||||||
; al: 1 = reading 1 sector
|
; al: 1 = reading 1 sector
|
||||||
; cx: sector and cylinder number
|
; cx: sector and cylinder number
|
||||||
; dh: head number
|
; dh: head number
|
||||||
; dl: drive number
|
; dl: drive number
|
||||||
; bx: offset to disk buffer
|
push es
|
||||||
|
push si
|
||||||
|
mov si, dap
|
||||||
|
les bx, [si+4]
|
||||||
call int13
|
call int13
|
||||||
|
pop si
|
||||||
|
pop es
|
||||||
jc .err
|
jc .err
|
||||||
; clear dirty flag on success
|
; clear dirty flag on success
|
||||||
and word [dflags], ~DIRTY
|
and word [dflags], ~DIRTY
|
||||||
@ -439,39 +447,6 @@ diskio mov cl, 1 ; read len
|
|||||||
stc
|
stc
|
||||||
ret
|
ret
|
||||||
|
|
||||||
init mov ax, cs
|
|
||||||
; boot failure if loaded wrong
|
|
||||||
cmp ax, cseg
|
|
||||||
je $+4
|
|
||||||
int 0x18
|
|
||||||
call rstseg
|
|
||||||
; fetch current DPT
|
|
||||||
les bx, [4*0x1E]
|
|
||||||
mov dx, dpt
|
|
||||||
mov cx, 11
|
|
||||||
call lodfar
|
|
||||||
; set interrupt vector
|
|
||||||
mov word [4*0x1E], dpt
|
|
||||||
mov word [4*0x1E+2], ds
|
|
||||||
; save int 13 handler
|
|
||||||
les bx, [4*0x13]
|
|
||||||
mov [i13isp+2], bx
|
|
||||||
mov [i13isp+4], es
|
|
||||||
; install ours
|
|
||||||
mov word [4*0x13], int13i
|
|
||||||
mov [4*0x13+2], cs
|
|
||||||
|
|
||||||
; install int21h handler
|
|
||||||
mov word [4*0x21], int21h
|
|
||||||
mov [4*0x21+2], cs
|
|
||||||
|
|
||||||
mov dl, 0x36
|
|
||||||
mov ah, 2
|
|
||||||
int 0x21
|
|
||||||
|
|
||||||
halt hlt
|
|
||||||
jmp halt
|
|
||||||
|
|
||||||
;;; Export functions as syscalls
|
;;; Export functions as syscalls
|
||||||
; SP, BP, SI, DI and ES must be preserved by kernel code
|
; SP, BP, SI, DI and ES must be preserved by kernel code
|
||||||
; DL, DX or DS:DX is input argument from prog
|
; DL, DX or DS:DX is input argument from prog
|
||||||
@ -494,7 +469,9 @@ intE0h push bx
|
|||||||
; bx = syscall number
|
; bx = syscall number
|
||||||
; stack must be -> BX IP CS FL
|
; stack must be -> BX IP CS FL
|
||||||
; for return to prog
|
; for return to prog
|
||||||
sysc add bx, bx
|
sysc sti
|
||||||
|
cld
|
||||||
|
add bx, bx
|
||||||
mov bx, [cs:bx+stab]
|
mov bx, [cs:bx+stab]
|
||||||
test bh, srw >> 8 ; fork off bx returns
|
test bh, srw >> 8 ; fork off bx returns
|
||||||
jnz .l02
|
jnz .l02
|
||||||
@ -537,6 +514,38 @@ sysc add bx, bx
|
|||||||
pop dx
|
pop dx
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
start xor ax, ax
|
||||||
|
mov ds, ax
|
||||||
|
|
||||||
|
; install int20h handler
|
||||||
|
mov word [4*0x20], start
|
||||||
|
mov [4*0x20+2], cs
|
||||||
|
; install int21h handler
|
||||||
|
mov word [4*0x21], int21h
|
||||||
|
mov [4*0x21+2], cs
|
||||||
|
; install intE0h handler
|
||||||
|
mov word [4*0xE0], intE0h
|
||||||
|
mov [4*0xE0+2], cs
|
||||||
|
|
||||||
|
mov ax, cs
|
||||||
|
mov ds, ax
|
||||||
|
mov [dseg], ax
|
||||||
|
|
||||||
|
; print banner
|
||||||
|
mov dx, banner
|
||||||
|
call puts
|
||||||
|
|
||||||
|
; read cmdline
|
||||||
|
mov dl, '>'
|
||||||
|
call putc
|
||||||
|
mov dx, inbuf
|
||||||
|
mov byte [inbuf], 72
|
||||||
|
call gets
|
||||||
|
|
||||||
|
halt sti
|
||||||
|
hlt
|
||||||
|
jmp halt
|
||||||
|
|
||||||
section .rodata
|
section .rodata
|
||||||
|
|
||||||
; syscall table
|
; syscall table
|
||||||
@ -549,10 +558,10 @@ stab dw 0 ; 0 reboot
|
|||||||
dw 0 ; 6 direct console i/o
|
dw 0 ; 6 direct console i/o
|
||||||
dw 0 ; 7 read i/o byte
|
dw 0 ; 7 read i/o byte
|
||||||
dw 0 ; 8 get i/o byte
|
dw 0 ; 8 get i/o byte
|
||||||
dw 0 ; 9 string output
|
dw puts ; 9 string output
|
||||||
dw 0 ; 10 string input
|
dw gets ; 10 string input
|
||||||
dw 0 ; 11 console status
|
dw 0 ; 11 console status
|
||||||
dw 0 ; 12 get version number
|
dw ver ; 12 get version number
|
||||||
dw 0 ; 13 reset disks
|
dw 0 ; 13 reset disks
|
||||||
dw 0 ; 14 set drive
|
dw 0 ; 14 set drive
|
||||||
dw 0 ; 15 open file
|
dw 0 ; 15 open file
|
||||||
@ -587,7 +596,8 @@ section .data
|
|||||||
|
|
||||||
dap db 0x10, 0
|
dap db 0x10, 0
|
||||||
dw 1
|
dw 1
|
||||||
dw dskbuf, cseg
|
dw dskbuf
|
||||||
|
dseg dw 0
|
||||||
drvseek dw 0,0,0,0
|
drvseek dw 0,0,0,0
|
||||||
|
|
||||||
; bit 0 (1) - drive logged in (see drvnum)
|
; bit 0 (1) - drive logged in (see drvnum)
|
||||||
@ -603,9 +613,6 @@ drvnum resb 1
|
|||||||
; number, just for bios
|
; number, just for bios
|
||||||
biosnum resb 1
|
biosnum resb 1
|
||||||
|
|
||||||
; DPT tables for 4 floppy drives
|
|
||||||
dpt resb 4*14
|
|
||||||
|
|
||||||
; Information for logged in drive
|
; Information for logged in drive
|
||||||
drvss resb 1 ; sector size, 2^(7+n) bytes
|
drvss resb 1 ; sector size, 2^(7+n) bytes
|
||||||
drvcs resb 1 ; cluster size, 2^(7+n) bytes
|
drvcs resb 1 ; cluster size, 2^(7+n) bytes
|
||||||
@ -622,3 +629,5 @@ drvfn resb 2 ; sectors per fat table
|
|||||||
; disk buffer for I/O operations
|
; disk buffer for I/O operations
|
||||||
alignb 2
|
alignb 2
|
||||||
dskbuf resb 1024
|
dskbuf resb 1024
|
||||||
|
|
||||||
|
inbuf resb 128
|
||||||
|
@ -1,46 +0,0 @@
|
|||||||
; reset segments
|
|
||||||
rstseg mov ax, cs
|
|
||||||
mov ds, ax
|
|
||||||
mov es, ax
|
|
||||||
ret
|
|
||||||
|
|
||||||
; copy to far memory
|
|
||||||
; IN es:bx far memory ptr (preserved)
|
|
||||||
; ds:dx local ptr (preserved)
|
|
||||||
; cx number of bytes to transfer
|
|
||||||
; OUT cx set to zero
|
|
||||||
; si & di trashed
|
|
||||||
stofar mov si, dx
|
|
||||||
mov di, bx
|
|
||||||
rep movsb
|
|
||||||
ret
|
|
||||||
|
|
||||||
; copy from far memory
|
|
||||||
; IN es:bx far memory ptr (preserved)
|
|
||||||
; ds:dx local ptr (preserved)
|
|
||||||
; cx number of bytes to copy
|
|
||||||
; OUT cx set to zero
|
|
||||||
; si & di trashed
|
|
||||||
lodfar call swpds
|
|
||||||
mov si, bx
|
|
||||||
mov di, dx
|
|
||||||
rep movsb
|
|
||||||
|
|
||||||
; exchange es and ds
|
|
||||||
swpds push ds
|
|
||||||
push es
|
|
||||||
pop ds
|
|
||||||
pop es
|
|
||||||
ret
|
|
||||||
|
|
||||||
; normalize ptr in ds:dx
|
|
||||||
norm mov ax, ds
|
|
||||||
mov cl, 4
|
|
||||||
push dx
|
|
||||||
ror dx, cl
|
|
||||||
and dh, 0xF
|
|
||||||
add ax, dx
|
|
||||||
mov ds, ax
|
|
||||||
pop dx
|
|
||||||
and dx, 0xF
|
|
||||||
ret
|
|
2
src/version.inc
Normal file
2
src/version.inc
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
bdosver equ 0x10 ; CP/M 1.0
|
||||||
|
bdosrev equ 0
|
Loading…
Reference in New Issue
Block a user