Work on interrupt subfunctions, remove drvtab experiments
This commit is contained in:
parent
05c7e905d0
commit
cd258ccbe4
2
Makefile
2
Makefile
@ -26,7 +26,7 @@ endif
|
||||
default: kernel.rom
|
||||
|
||||
kernel.com: kernel/*.asm lib/*.inc
|
||||
nasm -s -o $@ -I lib -I kernel kernel/main.asm
|
||||
nasm -s -o $@ -l kernel.lst -I lib -I kernel kernel/main.asm
|
||||
|
||||
debug.rom: debug/*.asm lib/*.inc
|
||||
nasm -s -o $@ -I lib -I debug debug/main.asm && scripts/fix-rom.sh $@
|
||||
|
@ -1,18 +1,35 @@
|
||||
putc:
|
||||
pushf
|
||||
push cs
|
||||
call isr_putc
|
||||
ret
|
||||
; Reads a single character with echo
|
||||
; out AL character
|
||||
isr_getc_echo:
|
||||
xor ax, ax
|
||||
int 0x16
|
||||
test al, al
|
||||
jz isr_getc_echo
|
||||
call putc
|
||||
iret
|
||||
|
||||
; Reads a single character without echo
|
||||
; out AL character
|
||||
isr_getc:
|
||||
xor ax, ax
|
||||
int 0x16
|
||||
test al, al
|
||||
jz isr_getc
|
||||
iret
|
||||
|
||||
; Prints a single character
|
||||
; in DL character
|
||||
isr_putc:
|
||||
push ax
|
||||
mov al, dl
|
||||
call putc
|
||||
pop ax
|
||||
iret
|
||||
|
||||
putc:
|
||||
push bx
|
||||
mov ah, 0x0e
|
||||
mov bx, 0x0000
|
||||
int 0x10
|
||||
pop bx
|
||||
iret
|
||||
ret
|
||||
|
@ -1,51 +0,0 @@
|
||||
; Drive table
|
||||
; Header:
|
||||
; byte number of drives
|
||||
; Item (type BIOS CHS):
|
||||
; byte type (1)
|
||||
; byte drive number
|
||||
; word number of cylinders
|
||||
; byte number of heads
|
||||
; word number of sectors per cylinder
|
||||
; 3 bytes padding
|
||||
; Item (type BIOS LBA):
|
||||
; byte type (2)
|
||||
; byte drive number
|
||||
; dword offset
|
||||
; dword size
|
||||
|
||||
; Create a drive table at ES:DI
|
||||
drvtab_create:
|
||||
mov ax, 0x2B
|
||||
call intr_register
|
||||
|
||||
mov al, 8 ; 8 drives per default
|
||||
mov ah, 10 ; 10 bytes per drive
|
||||
stosb
|
||||
mul ah
|
||||
|
||||
xor cx, cx
|
||||
xchg cx, ax
|
||||
rep stosb
|
||||
|
||||
ret
|
||||
|
||||
; Get drive table item
|
||||
; IN DL drive number (A=0, B=1, ...)
|
||||
; OUT DS:SI ptr to drive struct
|
||||
drvtab_load:
|
||||
push ax
|
||||
mov ax, 0x2B
|
||||
call intr_load
|
||||
cmp dl, [ds:si]
|
||||
jnb .err
|
||||
mov al, 10
|
||||
mul dl
|
||||
inc ax
|
||||
add si, ax
|
||||
pop ax
|
||||
ret
|
||||
.err:
|
||||
pop ax
|
||||
stc
|
||||
ret
|
@ -6,10 +6,7 @@ org 0x0100
|
||||
mov ax, 0x21
|
||||
call intr_register
|
||||
|
||||
.loop:
|
||||
mov ah, 0x01
|
||||
int 0x21
|
||||
jmp .loop
|
||||
int3
|
||||
|
||||
cli
|
||||
.halt:
|
||||
@ -17,10 +14,41 @@ org 0x0100
|
||||
jmp .halt
|
||||
|
||||
isr_dos_main:
|
||||
cmp ah, 0x01
|
||||
je isr_getc
|
||||
cmp ah, 0x02
|
||||
je isr_putc
|
||||
; Bail out if subfunction number too high
|
||||
cmp ah, 0x0F
|
||||
jnc isr_invalid
|
||||
|
||||
; allocate our return address
|
||||
push bx
|
||||
; actual BX backup
|
||||
push bx
|
||||
|
||||
; transfer subfunction number into BX
|
||||
xor bx, bx
|
||||
mov bl, ah
|
||||
; table offset = AH * 2
|
||||
shl bx, 1
|
||||
; fetch from table
|
||||
mov bx, [dos_functions+bx]
|
||||
|
||||
; inject our address into the stack
|
||||
add sp, 4
|
||||
push bx
|
||||
sub sp, 2
|
||||
|
||||
; restore BX
|
||||
pop bx
|
||||
; reads our address from the stack and jumps there
|
||||
ret
|
||||
|
||||
; ISR for invalid subfunctions or unimplemented
|
||||
isr_invalid:
|
||||
mov bp, 0xFEFE
|
||||
int3
|
||||
.hlt:
|
||||
hlt
|
||||
jmp .hlt
|
||||
; ISR tail to set carry flag to signal error
|
||||
isr_error:
|
||||
push bp
|
||||
mov bp, sp
|
||||
@ -30,9 +58,31 @@ isr_error:
|
||||
isr_return:
|
||||
iret
|
||||
|
||||
; Table for DOS subfunctions
|
||||
dos_functions:
|
||||
; AH 00-03
|
||||
dw isr_invalid
|
||||
dw isr_getc_echo
|
||||
dw isr_putc
|
||||
dw isr_invalid
|
||||
; AH 04-07
|
||||
dw isr_invalid
|
||||
dw isr_invalid
|
||||
dw isr_invalid
|
||||
dw isr_invalid
|
||||
; AH 08-0B
|
||||
dw isr_invalid
|
||||
dw isr_invalid
|
||||
dw isr_invalid
|
||||
dw isr_invalid
|
||||
; AH 0C-0F
|
||||
dw isr_invalid
|
||||
dw isr_invalid
|
||||
dw isr_invalid
|
||||
dw isr_invalid
|
||||
|
||||
%include "intr.asm"
|
||||
%include "drvtab.asm"
|
||||
|
||||
%include "chario.asm"
|
||||
|
||||
times 1000 db 0xEA
|
||||
kernel_end:
|
||||
|
Loading…
Reference in New Issue
Block a user