diff --git a/Makefile b/Makefile index 3d08835..6ad8604 100644 --- a/Makefile +++ b/Makefile @@ -13,6 +13,8 @@ endif ifdef DEBUG QEMU_ARGS += -chardev file,path=debugcon.log,id=seabios QEMU_ARGS += -device isa-debugcon,iobase=0x402,chardev=seabios +QEMU_ARGS += -option-rom debug.rom +DEBUGROM = debug.rom endif ifndef DISPLAY @@ -26,6 +28,9 @@ default: kernel.rom kernel.rom: kernel/*.asm lib/*.inc nasm -s -o $@ -I lib -I kernel kernel/main.asm && scripts/fix-rom.sh $@ +debug.rom: debug/*.asm lib/*.inc + nasm -s -o $@ -I lib -I debug debug/main.asm && scripts/fix-rom.sh $@ + boot/%.bin: boot/%.asm lib/*.inc nasm -s -o $@ -I boot -I lib $< @@ -38,11 +43,11 @@ fdimage.img: boot/floppy.bin kernel.rom clean: rm -f *.com *.bin *.rom *.img *.log boot/*.bin -qemu-rom: kernel.rom +qemu-rom: kernel.rom $(DEBUGROM) $(QEMU) $(QEMU_ARGS) -option-rom kernel.rom -qemu-floppy: fdimage.img +qemu-floppy: fdimage.img $(DEBUGROM) $(QEMU) $(QEMU_ARGS) -boot c -hda fdimage.img -qemu-serial: boot/serial.bin +qemu-serial: boot/serial.bin $(DEBUGROM) $(QEMU) $(QEMU_ARGS) -hda boot/serial.bin diff --git a/kernel/debug.asm b/debug/debug.asm similarity index 90% rename from kernel/debug.asm rename to debug/debug.asm index 46cf138..05c7910 100644 --- a/kernel/debug.asm +++ b/debug/debug.asm @@ -116,11 +116,12 @@ isr_debug: pop cx pop dx pop bx - pop bp ; sp to be ignored + add sp, 2 ; ignore SP + pop bp pop bp pop si pop di pop ds pop es - pop ss - iret \ No newline at end of file + add sp, 2 ; ignore SS + iret diff --git a/debug/main.asm b/debug/main.asm new file mode 100644 index 0000000..45ca7df --- /dev/null +++ b/debug/main.asm @@ -0,0 +1,206 @@ +cpu 8086 +org 0x0000 +rom: + db 0x55, 0xAA +.sectors: + db 0x00 +.init: + mov dx, isr_debug + mov al, 0x1 + call intr_register + mov al, 0x03 + call intr_register + retf + +.name: + db "rDebug", 0 + + times (0x18 - ($-$$)) db 0 +.pcir_ptr: + dw 0 + + times (0x1A - ($-$$)) db 0 +.pnp_ptr: + 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 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 + +putc: + push bx + push cx + mov ah, 0x0e + mov bx, 0x0000 + int 0x10 + pop cx + pop bx + ret + +intr_register: + ; DI = AL * 4 + mov ah, 4 + mul ah + mov di, ax + + ; ES = 0 + xor ax, ax + mov es, ax + + ; store offset + mov ax, dx + stosw + + ; store segment + mov ax, cs + stosw + + 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, 3 +.reg2loop: + call debug_frame_register_print + add si, 2 + loop .reg2loop + + mov ax, [bp+24] + mov bx, 0x0010 + mov cx, 3 + call print_number_padded + + mov al, ':' + call putc + + mov ax, [bp+22] + mov bx, 0x0010 + mov cx, 3 + call print_number_padded + + call printf + db 0x0A, 0x0D, 0 + + ret + +; this prints registers +; expect to be called as interrupt routine +isr_debug: + push ss + push es + push ds + push di + push si + push bp + push sp + push bx + push dx + push cx + push ax + + mov bp, sp + mov [bp+08], bp + add WORD [bp+08], 28 + + call printf + db 0x0A, 0x0D, 0 + + call debug_frame_print + + pop ax + pop cx + pop dx + pop bx + pop bp + pop bp + pop si + pop di + pop ds + pop es + pop ss + iret + +%include "printf.inc" + +align 512 diff --git a/kernel/main.asm b/kernel/main.asm index 6c91443..32cb154 100644 --- a/kernel/main.asm +++ b/kernel/main.asm @@ -1,15 +1,29 @@ cpu 8086 org 0x0000 +rom: db 0x55, 0xAA -optrom_length: +.sectors: db 0x00 - jmp optrom_init +.init: + push cs + pop es -; reserved area -times (0x1A - ($-$$)) db 0 + mov di, start + mov ax, 0x18 + call intr_register + + retf +.name: + db "ROM DOS", 0 + + times (0x18 - ($-$$)) db 0 +.pcir_ptr: + dw 0 + + times (0x1A - ($-$$)) db 0 +.pnp_ptr: dw pnp -align 16 pnp: db "$PnP" .version: @@ -21,8 +35,8 @@ pnp: .checksum: db 0 ; checksum (filled by fix-rom) dd 0 ; device identifier - dw str_vendor ; manufacturer string - dw str_product ; product name string + 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 @@ -31,40 +45,6 @@ pnp: dw 0 ; reserved dw 0 -str_vendor: - db "Nero", 0 -str_product: - db "Nero DOS ", 60, 234, 62, 0 - -optrom_init: - push cs - pop es - - mov di, isr_debug - mov ax, 0x1 - call intr_register - mov ax, 0x3 - call intr_register - - mov di, start - mov ax, 0x18 - call intr_register - - retf - -announce: - push ds - push cs - push cs - pop ds - mov ax, str_product - push ax - call printf - db "%S (CS=%Xh)", 0x0A, 0x0D, 0x00 - add sp, 4 - pop ds - ret - start: xor ax, ax mov ds, ax @@ -73,8 +53,6 @@ start: mov sp, 0x800 mov di, sp - call announce - call drvtab_create push cs @@ -86,6 +64,7 @@ start: .loop: mov ah, 0x01 int 0x21 + int3 jmp .loop cli @@ -112,9 +91,4 @@ isr_return: %include "chario.asm" -%include "printf.inc" -%include "print.asm" - -%include "debug.asm" - align 512