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.asm" align 512