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
|
default: kernel.rom
|
||||||
|
|
||||||
kernel.com: kernel/*.asm lib/*.inc
|
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
|
debug.rom: debug/*.asm lib/*.inc
|
||||||
nasm -s -o $@ -I lib -I debug debug/main.asm && scripts/fix-rom.sh $@
|
nasm -s -o $@ -I lib -I debug debug/main.asm && scripts/fix-rom.sh $@
|
||||||
|
@ -1,18 +1,35 @@
|
|||||||
putc:
|
; Reads a single character with echo
|
||||||
pushf
|
; out AL character
|
||||||
push cs
|
isr_getc_echo:
|
||||||
call isr_putc
|
xor ax, ax
|
||||||
ret
|
int 0x16
|
||||||
|
test al, al
|
||||||
|
jz isr_getc_echo
|
||||||
|
call putc
|
||||||
|
iret
|
||||||
|
|
||||||
|
; Reads a single character without echo
|
||||||
|
; out AL character
|
||||||
isr_getc:
|
isr_getc:
|
||||||
xor ax, ax
|
xor ax, ax
|
||||||
int 0x16
|
int 0x16
|
||||||
test al, al
|
test al, al
|
||||||
jz isr_getc
|
jz isr_getc
|
||||||
|
iret
|
||||||
|
|
||||||
|
; Prints a single character
|
||||||
|
; in DL character
|
||||||
isr_putc:
|
isr_putc:
|
||||||
|
push ax
|
||||||
|
mov al, dl
|
||||||
|
call putc
|
||||||
|
pop ax
|
||||||
|
iret
|
||||||
|
|
||||||
|
putc:
|
||||||
push bx
|
push bx
|
||||||
mov ah, 0x0e
|
mov ah, 0x0e
|
||||||
mov bx, 0x0000
|
mov bx, 0x0000
|
||||||
int 0x10
|
int 0x10
|
||||||
pop bx
|
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
|
mov ax, 0x21
|
||||||
call intr_register
|
call intr_register
|
||||||
|
|
||||||
.loop:
|
int3
|
||||||
mov ah, 0x01
|
|
||||||
int 0x21
|
|
||||||
jmp .loop
|
|
||||||
|
|
||||||
cli
|
cli
|
||||||
.halt:
|
.halt:
|
||||||
@ -17,10 +14,41 @@ org 0x0100
|
|||||||
jmp .halt
|
jmp .halt
|
||||||
|
|
||||||
isr_dos_main:
|
isr_dos_main:
|
||||||
cmp ah, 0x01
|
; Bail out if subfunction number too high
|
||||||
je isr_getc
|
cmp ah, 0x0F
|
||||||
cmp ah, 0x02
|
jnc isr_invalid
|
||||||
je isr_putc
|
|
||||||
|
; 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:
|
isr_error:
|
||||||
push bp
|
push bp
|
||||||
mov bp, sp
|
mov bp, sp
|
||||||
@ -30,9 +58,31 @@ isr_error:
|
|||||||
isr_return:
|
isr_return:
|
||||||
iret
|
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 "intr.asm"
|
||||||
%include "drvtab.asm"
|
|
||||||
|
|
||||||
%include "chario.asm"
|
%include "chario.asm"
|
||||||
|
|
||||||
times 1000 db 0xEA
|
kernel_end:
|
||||||
|
Loading…
Reference in New Issue
Block a user