diff --git a/Makefile b/Makefile index d319812..b05fd49 100644 --- a/Makefile +++ b/Makefile @@ -73,10 +73,6 @@ fate.bs: boot/fat.asm %.rom: rom/%.asm utils/fix-rom $(NASM) $(NASM_ARGS) -o $@ $< && utils/fix-rom $@ -# rdos drivers -%.drv: driver/%.asm - $(NASM) $(NASM_ARGS) -o $@ $< - fdimage.img: fat1.bs $(DISTFILES) mformat -C -i $@ -f $(FLOPPY) -B fat1.bs :: mmd -i $@ ::rdos diff --git a/driver/debug.asm b/driver/debug.asm deleted file mode 100644 index 1156368..0000000 --- a/driver/debug.asm +++ /dev/null @@ -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 diff --git a/rom/debug.asm b/rom/debug.asm index 19b139a..c365421 100644 --- a/rom/debug.asm +++ b/rom/debug.asm @@ -1,294 +1,180 @@ -cpu 8086 -org 0x0000 + cpu 8086 + org 0x0000 -%macro push8086 0 - push ss - push es - push ds - push di - push si - push bp - push sp - push bx - push dx - push cx - push ax +stacksize: equ 0x20 - ; adjust stored SP to be value before interrupt - mov bp, sp - mov [bp+08], bp - add WORD [bp+08], 28 -%endmacro + db 0x55, 0xAA + db 0x00 + jmp init + nop -%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 + times (0x18 - ($-$$)) db 0 + dw 0 + dw pnp -rom: - db 0x55, 0xAA -.sectors: - db 0x00 -.init: - jmp init - nop +pnp: db "$PnP" + db 1 ; version 1 + db 2 ; 2 * 16 length + dw 0 ; offset of next header + db 0 + 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 DEBUG", 0 +name: db "rdos debug" - times (0x18 - ($-$$)) db 0 -.pcir_ptr: - dw 0 +init: push ds + push es + push si + push di + push ax + push cx + xor ax, ax + mov si, ax + mov di, ax + ; load DS for + mov ds, ax - times (0x1A - ($-$$)) db 0 -.pnp_ptr: - dw pnp + 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 + pop ds + ; calculate our length + mov cx, codeend + rep movsb -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 rom.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 + pop cx + pop ax + pop di + pop si + pop es + pop ds + retf -init: - mov bx, 0 - mov dx, isr_divide_error - call hook_int +print16: + ; setup bx and ah for int 10h call + xor bx, bx + mov ah, 0x0e + mov cl, 4 + ; this double-call is essentially a 4 times repeating loop + call .c1 +.c1: call .c2 +.c2: ; grab highest nibble from dx + mov al, dh + ; remove highest nibble from dx + 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 - mov bx, 1 - mov dx, isr_singlestep - call hook_int +printregs: + mov cx, 14 + xor bx, bx + mov ah, 0x0e + 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 + pop cx + loop .loop + ret - mov bx, 2 - mov dx, isr_nmi - call hook_int +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) - mov bx, 3 - mov dx, isr_breakpoint - call hook_int + call printregs - mov bx, 4 - mov dx, isr_overflow - call hook_int +hlt: hlt + jmp hlt - ; 5 left out +names: db "AXCXDXBXSPBPSIDI" + db "DSESSSCSIPFL" - mov bx, 6 - mov dx, isr_invalid_opcode - call hook_int +codeend: - push cs - pop ds - mov si, rom.name - push cs - push si - call printf - db "%S %X", 0x0A, 0x0D, 0 - add sp, 4 +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 - retf +reg_es: dw 0 +reg_cs: dw 0 +reg_ss: dw 0 +reg_ds: dw 0 -; Hook interrupt -hook_int: - ; bx times 4 - add bx, bx - add bx, bx - ; store offset - mov [bx], dx - ; store segment - push ax - mov ax, cs - mov [bx+2], ax - pop ax - ret +reg_ip: dw 0 +reg_fl: dw 0 -putc: - push bx - push cx - mov ah, 0x0e - mov bx, 0x0000 - int 0x10 - pop cx - pop bx - ret - -; Names for words in debug frame -; Two characters per word, 14 words total -debug_frame_names: - ; general-purpose registers - db "AXCXDXBXSPBPSIDI" - ; extra registers - db "DSESSSIPCSFL" - -; Names for bits in debug_frame+26 (FL/Flags register) -; One character per bit, 16 bits total -debug_frame_flags: - db "++++ODIT" - db "SZ+A+P+C" - -; Print a single register from the frame -; in SI frame offset for register -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: - mov si, 0 - mov cx, 8 -.reg1loop: - call debug_frame_register_print - add si, 2 - loop .reg1loop - - mov dx, [ss:bp+26] - 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 - db 0x0A, 0x0D, 0 - - mov si, 16 - mov cx, 5 -.reg2loop: - call debug_frame_register_print - add si, 2 - loop .reg2loop - - call printf - db 0x0A, 0x0D, 0 - - ret - -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" +stack: times stacksize dw 0 align 512 diff --git a/rom/loaddrv.asm b/rom/loaddrv.asm deleted file mode 100644 index 26d340f..0000000 --- a/rom/loaddrv.asm +++ /dev/null @@ -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