Revamp debugger, including support for printing padded numbers

This commit is contained in:
Nero 2019-05-05 11:18:36 +00:00
parent dab565ee41
commit 8aafa98c6a
2 changed files with 132 additions and 34 deletions

View File

@ -1,3 +1,93 @@
; Names for words in debug frame
; Two characters per word, 14 words total
debug_frame_names:
; general-purpose registers
db "AXBXCXDXSPBPSIDI"
; 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 ; this prints registers
; expect to be called as interrupt routine ; expect to be called as interrupt routine
isr_debug: isr_debug:
@ -13,34 +103,20 @@ isr_debug:
push bx push bx
push ax push ax
call printf
db "AX=%X BX=%X CX=%X DX=%X", 0x20
db "SP=%X BP=%X SI=%X DI=%X", 0x0A, 0x0D
db "DS=%X ES=%X SS=%X IP=%X CS=%X", 0x20, 0
mov bp, sp mov bp, sp
mov bx, [ss:bp+26] mov [bp+08], bp
mov si, .flags add WORD [bp+08], 28
mov cx, 0x0010
.loop:
mov al, [cs:si]
inc si
test bx, 0x8000
jnz .write
mov al, '-'
.write:
sal bx, 1
call putc
loop .loop
call printf call printf
db 0x0A, 0x0D, 0 db 0x0A, 0x0D, 0
call debug_frame_print
pop ax pop ax
pop bx pop bx
pop cx pop cx
pop dx pop dx
pop sp pop bp ; sp to be ignored
pop bp pop bp
pop si pop si
pop di pop di
@ -48,6 +124,3 @@ isr_debug:
pop es pop es
pop ss pop ss
iret iret
.flags:
; 16 letters for each bit in flags register
db "++++ODITSZ+A+P+C"

View File

@ -48,24 +48,46 @@ printf:
call print_string call print_string
jmp .loop jmp .loop
; converts a integer to ascii
; in ax input integer
; bx base
; cx minimum number of digits
; out bx garbled
; dx garbled
print_number_padded:
xor dx, dx
div bx
push dx
dec cx
jz .nopad
call print_number_padded
jmp print_number.end
.nopad:
call print_number
jmp print_number.end
; converts a integer to ascii
; in ax input integer
; bx base
; out bx garbled
; dx garbled
print_number: print_number:
xor dx, dx xor dx, dx
div bx ; ax = dx:ax / 10, dx = dx:ax % 10 div bx ; ax = dx:ax / 10, dx = dx:ax % 10
and ax, ax
jz .print
push dx push dx
and ax, ax
jz .end
call print_number call print_number
pop dx .end:
.print: pop bx
mov al, dl xor bh, bh
add al, 0x30 add bx, print_chars
cmp al, 0x3A mov al, [cs:bx]
jl .noadj
add al, 0x07
.noadj:
call putc call putc
ret ret
; putc's a string
; in DS:AX null-terminated string
print_string: print_string:
push si push si
mov si, ax mov si, ax
@ -78,3 +100,6 @@ print_string:
.end: .end:
pop si pop si
ret ret
print_chars:
db "0123456789ABCDEF"