Drop debug.drv, rework debug rom instead

This commit is contained in:
Nero 2020-05-12 20:47:34 +00:00
parent 2569dde385
commit c8adeb35d2
4 changed files with 159 additions and 396 deletions

View File

@ -73,10 +73,6 @@ fate.bs: boot/fat.asm
%.rom: rom/%.asm utils/fix-rom %.rom: rom/%.asm utils/fix-rom
$(NASM) $(NASM_ARGS) -o $@ $< && utils/fix-rom $@ $(NASM) $(NASM_ARGS) -o $@ $< && utils/fix-rom $@
# rdos drivers
%.drv: driver/%.asm
$(NASM) $(NASM_ARGS) -o $@ $<
fdimage.img: fat1.bs $(DISTFILES) fdimage.img: fat1.bs $(DISTFILES)
mformat -C -i $@ -f $(FLOPPY) -B fat1.bs :: mformat -C -i $@ -f $(FLOPPY) -B fat1.bs ::
mmd -i $@ ::rdos mmd -i $@ ::rdos

View File

@ -1,76 +0,0 @@
jmp init
align 4
db "rDos"
align 8
; hook interrupt 3
db 3
db 0
dw int3entry
dd 0
; end of header
db 0
stacksize: equ 0x20
init:
mov ax, 0x0e33
xor bx, bx
int 0x10
retf
int3entry:
; save DS and AX
mov [cs:reg_ds], ds
mov [cs:reg_ax], ax
; use AX to load DS=CS
mov ax, cs
mov ds, ax
; pop IP, CS and flags from stack
pop ax
mov [reg_ip], ax
pop ax
mov [reg_cs], ax
pop ax
mov [reg_fl], ax
; save the other registers
mov [reg_cx], cx
mov [reg_dx], dx
mov [reg_bx], bx
mov [reg_sp], sp
mov [reg_bp], bp
mov [reg_si], si
mov [reg_di], di
; save other segment registers we can access
mov [reg_ss], ss
mov [reg_es], es
; initialize other segments and setup stack
mov es, ax
mov ss, ax
mov sp, (stack+stacksize)
hlt: hlt
jmp hlt
reg_ax: dw 0
reg_cx: dw 0
reg_dx: dw 0
reg_bx: dw 0
reg_sp: dw 0
reg_bp: dw 0
reg_si: dw 0
reg_di: dw 0
reg_es: dw 0
reg_cs: dw 0
reg_ss: dw 0
reg_ds: dw 0
reg_ip: dw 0
reg_fl: dw 0
names: db "AXCXDXBXSPBPSIDI"
db "DSESSSCSIPFL"
stack: times stacksize dw 0
align 16

View File

@ -1,71 +1,26 @@
cpu 8086 cpu 8086
org 0x0000 org 0x0000
%macro push8086 0 stacksize: equ 0x20
push ss
push es
push ds
push di
push si
push bp
push sp
push bx
push dx
push cx
push ax
; adjust stored SP to be value before interrupt
mov bp, sp
mov [bp+08], bp
add WORD [bp+08], 28
%endmacro
%macro pop8086 0
pop ax
pop cx
pop dx
pop bx
add sp, 2 ; skip SP
pop bp
pop si
pop di
pop ds
pop es
add sp, 2 ; skip SS
%endmacro
rom:
db 0x55, 0xAA db 0x55, 0xAA
.sectors:
db 0x00 db 0x00
.init:
jmp init jmp init
nop nop
.name:
db "RDOS DEBUG", 0
times (0x18 - ($-$$)) db 0 times (0x18 - ($-$$)) db 0
.pcir_ptr:
dw 0 dw 0
times (0x1A - ($-$$)) db 0
.pnp_ptr:
dw pnp dw pnp
pnp: pnp: db "$PnP"
db "$PnP"
.version:
db 1 ; version 1 db 1 ; version 1
.length:
db 2 ; 2 * 16 length db 2 ; 2 * 16 length
dw 0 ; offset of next header dw 0 ; offset of next header
db 0 db 0
.checksum:
db 0 ; checksum (filled by fix-rom) db 0 ; checksum (filled by fix-rom)
dd 0 ; device identifier dd 0 ; device identifier
dw 0 ; manufacturer string dw 0 ; manufacturer string
dw rom.name ; product name string dw name ; product name string
db 0,0,0 ; device type string db 0,0,0 ; device type string
db 0x20 ; device indicator, bit for "read cacheable" set db 0x20 ; device indicator, bit for "read cacheable" set
dw 0 ; boot connection vector dw 0 ; boot connection vector
@ -74,221 +29,152 @@ pnp:
dw 0 ; reserved dw 0 ; reserved
dw 0 dw 0
init: name: db "rdos debug"
mov bx, 0
mov dx, isr_divide_error
call hook_int
mov bx, 1 init: push ds
mov dx, isr_singlestep push es
call hook_int push si
push di
mov bx, 2 push ax
mov dx, isr_nmi push cx
call hook_int xor ax, ax
mov si, ax
mov bx, 3 mov di, ax
mov dx, isr_breakpoint ; load DS for
call hook_int mov ds, ax
mov bx, 4
mov dx, isr_overflow
call hook_int
; 5 left out
mov bx, 6
mov dx, isr_invalid_opcode
call hook_int
mov al, [cs:2]
inc ax
shr ax, 1
; move down int 0x12 ptr to make space for us
sub [0x413], ax
; calculate segment from kilobytes
mov ax, [0x413]
mov cl, 6
shl ax, cl
; load ES for relocate
mov es, ax
; store interrupt vector
mov word [3*4], int3entry
mov word [3*4+2], es
; load DS for relocate
push cs push cs
pop ds pop ds
mov si, rom.name ; calculate our length
push cs mov cx, codeend
push si rep movsb
call printf
db "%S %X", 0x0A, 0x0D, 0
add sp, 4
pop cx
pop ax
pop di
pop si
pop es
pop ds
retf retf
; Hook interrupt print16:
hook_int: ; setup bx and ah for int 10h call
; bx times 4 xor bx, bx
add bx, bx mov ah, 0x0e
add bx, bx mov cl, 4
; store offset ; this double-call is essentially a 4 times repeating loop
mov [bx], dx call .c1
; store segment .c1: call .c2
push ax .c2: ; grab highest nibble from dx
mov ax, cs mov al, dh
mov [bx+2], ax ; remove highest nibble from dx
pop ax shl dx, cl
; shift away second-highest nibble that we accidentally copied
shr al, cl
; map 0-9 to ascii codes for '0' to '9'
add al, 0x30
; if result is larger than '9', ...
cmp al, 0x3a
jl .noadj
; ... add 7 so we continue at 'A'
add al, 7
.noadj: int 0x10
ret ret
putc: printregs:
push bx mov cx, 14
push cx xor bx, bx
mov ah, 0x0e mov ah, 0x0e
mov bx, 0x0000 mov si, reg_ax
.loop: push cx
mov dx, [si+(names-reg_ax)]
mov al, dl
int 0x10
mov al, dh
int 0x10
mov al, '='
int 0x10
lodsw
mov dx, ax
call print16
mov al, ' '
int 0x10 int 0x10
pop cx pop cx
pop bx loop .loop
ret ret
; Names for words in debug frame int3entry:
; Two characters per word, 14 words total ; save DS and AX
debug_frame_names: mov [cs:reg_ds], ds
; general-purpose registers mov [cs:reg_ax], ax
db "AXCXDXBXSPBPSIDI" ; use AX to load DS=CS
; extra registers mov ax, cs
db "DSESSSIPCSFL" mov ds, ax
; pop IP, CS and flags from stack
pop ax
mov [reg_ip], ax
pop ax
mov [reg_cs], ax
pop ax
mov [reg_fl], ax
; save the other registers
mov [reg_cx], cx
mov [reg_dx], dx
mov [reg_bx], bx
mov [reg_sp], sp
mov [reg_bp], bp
mov [reg_si], si
mov [reg_di], di
; save other segment registers we can access
mov [reg_ss], ss
mov [reg_es], es
; initialize other segments and setup stack
mov es, ax
mov ss, ax
mov sp, (stack+stacksize)
; Names for bits in debug_frame+26 (FL/Flags register) call printregs
; One character per bit, 16 bits total
debug_frame_flags:
db "++++ODIT"
db "SZ+A+P+C"
; Print a single register from the frame hlt: hlt
; in SI frame offset for register jmp hlt
debug_frame_register_print:
mov bx, debug_frame_names
mov al, [cs:bx+si] ; first name char load
call putc
mov al, [cs:bx+si+1] ; second name char load
call putc
mov al, '='
call putc
mov ax, [ss:bp+si] ; value load
; prepare call to print_number
push bx
push cx
mov bx, 0x0010
mov cx, 3
call print_number_padded
pop cx
pop bx
mov al, ' '
call putc
ret
debug_frame_print: names: db "AXCXDXBXSPBPSIDI"
mov si, 0 db "DSESSSCSIPFL"
mov cx, 8
.reg1loop:
call debug_frame_register_print
add si, 2
loop .reg1loop
mov dx, [ss:bp+26] codeend:
mov di, debug_frame_flags
mov cx, 0x0010
.flag_loop:
mov al, [cs:di]
inc di
cmp al, '+'
je .next
test dx, 0x8000
jnz .write
mov al, '-'
.write:
call putc
.next:
sal dx, 1
loop .flag_loop
call printf reg_ax: dw 0
db 0x0A, 0x0D, 0 reg_cx: dw 0
reg_dx: dw 0
reg_bx: dw 0
reg_sp: dw 0
reg_bp: dw 0
reg_si: dw 0
reg_di: dw 0
mov si, 16 reg_es: dw 0
mov cx, 5 reg_cs: dw 0
.reg2loop: reg_ss: dw 0
call debug_frame_register_print reg_ds: dw 0
add si, 2
loop .reg2loop
call printf reg_ip: dw 0
db 0x0A, 0x0D, 0 reg_fl: dw 0
ret stack: times stacksize dw 0
isr_divide_error:
push8086
call printf
db 0x0A, 0x0D, "INT 0 - DIVIDE ERROR", 0x0A, 0x0D, 0
call debug_frame_print
jmp halt
isr_singlestep:
push8086
call printf
db 0x0A, 0x0D, 0
call debug_frame_print
; wait for keypress
xor ax, ax
int 0x16
; enable trace flag so we fire again after next instruction
or word [ss:bp+26], 0x0100
pop8086
iret
isr_nmi:
push8086
call printf
db 0x0A, 0x0D, "INT 2 - NON-MASKABLE INTERRUPT", 0x0A, 0x0D, 0
call debug_frame_print
jmp halt
isr_breakpoint:
push8086
call printf
db 0x0A, 0x0D, 0
call debug_frame_print
pop8086
iret
isr_overflow:
push8086
call printf
db 0x0A, 0x0D, "INT 4 - OVERFLOW", 0x0A, 0x0D, 0
call debug_frame_print
jmp halt
isr_invalid_opcode:
push8086
call printf
db 0x0A, 0x0D, "INT 6 - INVALID OPCODE", 0x0A, 0x0D, 0
call debug_frame_print
jmp halt
halt:
call printf
db "HALTED", 0x0A, 0x0D, 0
.loop:
hlt
jmp halt
%include "printf.asm"
align 512 align 512

View File

@ -1,43 +0,0 @@
cpu 8086
org 0x0000
db 0x55, 0xAA
db 0x00
jmp init
nop
times (0x18 - ($-$$)) db 0
dw 0
dw pnp
pnp:
db "$PnP"
.version:
db 1 ; version 1
.length:
db 2 ; 2 * 16 length
dw 0 ; offset of next header
db 0
.checksum:
db 0 ; checksum (filled by fix-rom)
dd 0 ; device identifier
dw 0 ; manufacturer string
dw name ; product name string
db 0,0,0 ; device type string
db 0x20 ; device indicator, bit for "read cacheable" set
dw 0 ; boot connection vector
dw 0 ; boot disconnect vector
dw 0 ; bootstrap entry point
dw 0 ; reserved
dw 0
name:
db "rdos drv loader"
init:
mov ax, 0x0e37
xor bx, bx
int 0x10
retf
align 512