debug: Implement parsing of register names
This commit is contained in:
parent
2a7087a21f
commit
fc1aa47039
2
Makefile
2
Makefile
@ -65,7 +65,7 @@ fate.bs: boot/fat.asm
|
||||
$(NASM) $(NASM_ARGS) -DFAT16 -DLBA -DLARGE -o $@ $<
|
||||
|
||||
# BIOS option roms
|
||||
%.rom: rom/%.asm utils/fix-rom
|
||||
%.rom: rom/%.asm %/*.asm utils/fix-rom
|
||||
$(NASM) $(NASM_ARGS) -o $@ $< && utils/fix-rom $@
|
||||
|
||||
fdimage.img: fat1.bs $(DISTFILES)
|
||||
|
10
debug/names.asm
Normal file
10
debug/names.asm
Normal file
@ -0,0 +1,10 @@
|
||||
rnames: ; general purpose regs
|
||||
db "AXCXDXBXSPBPSIDI"
|
||||
; segment regs
|
||||
db "ESCSSSDS"
|
||||
; special regs
|
||||
db "IPFL"
|
||||
fnames: ; control flags
|
||||
db "++++ODIT"
|
||||
; status flags
|
||||
db "SZ+A+P+C"
|
58
debug/parse.asm
Normal file
58
debug/parse.asm
Normal file
@ -0,0 +1,58 @@
|
||||
; IN DS:SI remaining unparsed string
|
||||
; CS:DI error message
|
||||
parse_error:
|
||||
push si
|
||||
mov si, di
|
||||
call putcs
|
||||
mov al, ':'
|
||||
call putc
|
||||
mov al, ' '
|
||||
call putc
|
||||
pop si
|
||||
call putds
|
||||
jmp crlf
|
||||
|
||||
eat_whitespace:
|
||||
; peek on next char
|
||||
mov al, [si]
|
||||
; ES := CS
|
||||
push es
|
||||
push cs
|
||||
pop es
|
||||
; string search
|
||||
mov di, .chars
|
||||
mov cx, 4
|
||||
scasb
|
||||
; restore bss segment
|
||||
pop es
|
||||
jne .ret
|
||||
inc si
|
||||
jmp eat_whitespace
|
||||
.chars: db 0x09, 0x0A, 0x0D, 0x20
|
||||
.ret: ret
|
||||
|
||||
; IN: DS:SI string to read
|
||||
; OUT: CF set if no match
|
||||
; BX register number * 2 if CF clear
|
||||
eat_register:
|
||||
push si
|
||||
push es
|
||||
lodsw
|
||||
and ax, 0xDFDF
|
||||
; ES := CS
|
||||
push cs
|
||||
pop es
|
||||
mov di, rnames
|
||||
mov cx, 14
|
||||
repne scasw
|
||||
pop es
|
||||
jne .fail
|
||||
pop bx
|
||||
mov bx, di
|
||||
sub bx, (rnames+2)
|
||||
clc
|
||||
ret
|
||||
.fail: pop si
|
||||
stc
|
||||
ret
|
||||
.emsg: db "Not a register name", 0
|
131
rom/debug.asm
131
rom/debug.asm
@ -6,8 +6,7 @@ bssvec: equ 0xB6
|
||||
|
||||
db 0x55, 0xAA
|
||||
db 0x00
|
||||
jmp init
|
||||
nop
|
||||
jmp near init
|
||||
|
||||
times (0x18 - ($-$$)) db 0
|
||||
dw 0
|
||||
@ -58,6 +57,8 @@ init: push ds
|
||||
pop ds
|
||||
retf
|
||||
|
||||
%include "debug/parse.asm"
|
||||
|
||||
; Print AL
|
||||
space: mov al, ' '
|
||||
putc: xor bx, bx
|
||||
@ -65,17 +66,21 @@ putc: xor bx, bx
|
||||
int 0x10
|
||||
ret
|
||||
|
||||
; Print CS:SI
|
||||
puts: push ds
|
||||
; Print code string CS:SI
|
||||
putcs: push ds
|
||||
push cs
|
||||
pop ds
|
||||
.loop: lodsb
|
||||
call putds
|
||||
pop ds
|
||||
ret
|
||||
|
||||
; Print data string DS:SI
|
||||
putds: lodsb
|
||||
test al, al
|
||||
jz .ret
|
||||
call putc
|
||||
jmp .loop
|
||||
.ret: pop ds
|
||||
ret
|
||||
jmp putds
|
||||
.ret: ret
|
||||
|
||||
crlf: mov al, 0x0A
|
||||
call putc
|
||||
@ -106,6 +111,47 @@ print16:
|
||||
.noadj: int 0x10
|
||||
ret
|
||||
|
||||
getc: xor ax, ax
|
||||
int 0x16
|
||||
test al, al
|
||||
jz getc
|
||||
ret
|
||||
|
||||
read: mov di, cmdbuf
|
||||
.loop: call getc
|
||||
cmp al, 0x03
|
||||
je .can
|
||||
cmp al, 0x0D
|
||||
je .enter
|
||||
cmp al, 0x08
|
||||
je .bs
|
||||
cmp di, cmdbuf+cmdlen-1
|
||||
jnc .loop
|
||||
stosb
|
||||
mov ah, 0x0e
|
||||
xor bx, bx
|
||||
int 0x10
|
||||
jmp .loop
|
||||
ret
|
||||
.bs: cmp di, cmdbuf
|
||||
jbe .loop
|
||||
xor bx, bx
|
||||
mov ax, 0x0e08
|
||||
int 0x10
|
||||
mov al, 0x20
|
||||
int 0x10
|
||||
mov al, 0x08
|
||||
int 0x10
|
||||
dec di
|
||||
jmp .loop
|
||||
.can: xor al, al
|
||||
stosb
|
||||
stc
|
||||
ret
|
||||
.enter: xor al, al
|
||||
stosb
|
||||
ret
|
||||
|
||||
int3entry:
|
||||
; save DS and load bss segment from IVT
|
||||
push ds
|
||||
@ -143,7 +189,7 @@ int3entry:
|
||||
|
||||
loop: ; show prompt
|
||||
mov al, '-'
|
||||
int 0x10
|
||||
call putc
|
||||
; read data
|
||||
call read
|
||||
pushf
|
||||
@ -179,54 +225,11 @@ return: ; restore stack pointer
|
||||
; final jump back
|
||||
iret
|
||||
|
||||
names: ; general purpose regs
|
||||
db "AXCXDXBXSPBPSIDI"
|
||||
; segment regs
|
||||
db "ESCSSSDS"
|
||||
; special regs
|
||||
db "IPFL"
|
||||
fnames: ; control flags
|
||||
db "++++ODIT"
|
||||
; status flags
|
||||
db "SZ+A+P+C"
|
||||
%include "debug/names.asm"
|
||||
|
||||
getc: xor ax, ax
|
||||
int 0x16
|
||||
test al, al
|
||||
jz getc
|
||||
ret
|
||||
|
||||
read: mov di, cmdbuf
|
||||
.loop: call getc
|
||||
cmp al, 0x03
|
||||
je .can
|
||||
cmp al, 0x0D
|
||||
je .enter
|
||||
cmp al, 0x08
|
||||
je .bs
|
||||
cmp di, cmdbuf+cmdlen
|
||||
jnc .loop
|
||||
stosb
|
||||
mov ah, 0x0e
|
||||
xor bx, bx
|
||||
int 0x10
|
||||
jmp .loop
|
||||
ret
|
||||
.bs: cmp di, cmdbuf
|
||||
jbe .loop
|
||||
xor bx, bx
|
||||
mov ax, 0x0e08
|
||||
int 0x10
|
||||
mov al, 0x20
|
||||
int 0x10
|
||||
mov al, 0x08
|
||||
int 0x10
|
||||
dec di
|
||||
jmp .loop
|
||||
.can: stc
|
||||
.enter: ret
|
||||
|
||||
runcmd: mov al, [cmdbuf]
|
||||
; Expects DI to mark end of command
|
||||
runcmd: mov si, cmdbuf
|
||||
lodsb
|
||||
cmp al, 'g'
|
||||
je cmd_g
|
||||
cmp al, 'r'
|
||||
@ -235,12 +238,12 @@ runcmd: mov al, [cmdbuf]
|
||||
je cmd_t
|
||||
cmp al, '?'
|
||||
je cmd_?
|
||||
mov al, '?'
|
||||
cerr: mov al, '?'
|
||||
call putc
|
||||
jmp crlf
|
||||
|
||||
cmd_?: mov si, .txt
|
||||
jmp puts
|
||||
jmp putcs
|
||||
.txt: db "g Go", 0x0A, 0x0D
|
||||
db "r Print register values", 0x0A, 0x0D
|
||||
db "t Single-Step", 0x0A, 0x0D
|
||||
@ -249,7 +252,15 @@ cmd_?: mov si, .txt
|
||||
cmd_g: and word [reg_fl+1], 0xfe
|
||||
jmp return
|
||||
|
||||
cmd_r: jmp printregs
|
||||
cmd_r: cmp di, si
|
||||
je printregs
|
||||
call eat_register
|
||||
jc .err
|
||||
mov dx, si
|
||||
call print16
|
||||
ret
|
||||
.err: mov di, eat_register.emsg
|
||||
jmp parse_error
|
||||
|
||||
cmd_t: or word [reg_fl+1], 0x03
|
||||
jmp return
|
||||
@ -260,7 +271,7 @@ printregs:
|
||||
mov ah, 0x0e
|
||||
mov si, reg_ax
|
||||
.loop: push cx
|
||||
mov dx, [cs:si+names]
|
||||
mov dx, [cs:si+rnames]
|
||||
lodsw
|
||||
call printreg
|
||||
pop cx
|
||||
|
Loading…
Reference in New Issue
Block a user