From a31e574b3a29ab58af1c7f46ee2fef2f1a1702ce Mon Sep 17 00:00:00 2001 From: Ain <41307858+nero@users.noreply.github.com> Date: Mon, 18 May 2020 23:43:54 +0200 Subject: [PATCH] debug: Split commands into thematically organized files --- debug/edit.asm | 58 ++++++++++++++++++ debug/parse.asm | 28 ++++----- debug/run.asm | 83 +++++++++++++++++++++++++ debug/util.asm | 35 +++++++++++ rom/debug.asm | 157 +++--------------------------------------------- 5 files changed, 195 insertions(+), 166 deletions(-) create mode 100644 debug/run.asm create mode 100644 debug/util.asm diff --git a/debug/edit.asm b/debug/edit.asm index 93fe8cf..b3c6920 100644 --- a/debug/edit.asm +++ b/debug/edit.asm @@ -1,3 +1,61 @@ +; Commands and utils related to displaying or editing memory or registers + +cmd_r: cmp byte [si], 0 + je printregs + call eat_register + jc .err + mov al, [cs:bx+rnames] + call putc + mov al, [cs:bx+rnames+1] + call putc + call space + call edit_word + call crlf + ret +.err: mov di, eat_register.emsg + jmp parse_error + +printregs: + mov cx, 13 + xor bx, bx + mov ah, 0x0e + mov si, reg_ax +.loop: push cx + mov dx, [cs:si+rnames] + lodsw + call printreg + pop cx + loop .loop + + mov dx, [reg_fl] + mov si, fnames + mov cx, 16 +.floop: mov al, [cs:si] + inc si + cmp al, '+' + je .fskip + test dx, 0x8000 + jnz .fprnt + mov al, '-' +.fprnt: int 0x10 +.fskip: shl dx, 1 + loop .floop + call crlf + ret + +printreg: + push ax + mov al, dl + call putc + mov al, dh + call putc + mov al, '=' + call putc + pop dx + call print16 + call space + ret + ; let the user edit the word at ES:BX edit_word: push bx diff --git a/debug/parse.asm b/debug/parse.asm index 9a3e48a..0437f72 100644 --- a/debug/parse.asm +++ b/debug/parse.asm @@ -17,23 +17,17 @@ parse_error: ; Advance over whitespace ; IN DS:SI 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 +.loop: lodsb + cmp al, 0x20 + je .loop + cmp al, 0x0A + je .loop + cmp al, 0x0D + je .loop + cmp al, 0x09 + je .loop + dec si + ret ; Parse a register name ; IN DS:SI string to read diff --git a/debug/run.asm b/debug/run.asm new file mode 100644 index 0000000..d110254 --- /dev/null +++ b/debug/run.asm @@ -0,0 +1,83 @@ +; Commands related to executing debugged code + +cmd_g: and word [reg_fl+1], 0xfe + jmp return + +cmd_t: or word [reg_fl+1], 0x03 + jmp return + +int3entry: + ; save DS and load bss segment from IVT + push ds + mov ds, [cs:zero] + mov ds, [bssvec*4] + ; save AX so we can work with it + mov [reg_ax], ax + ; pop DS, IP, CS and flags from stack + pop ax + mov [reg_ds], ax + 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 ax, ds + mov es, ax + mov ss, ax + mov sp, stack + call crlf + call printregs + +loop: ; show prompt + mov al, '-' + call putc + ; read data + mov byte [inmin], 1 + mov byte [inmax], 16 + mov word [ingetc], getcu + call gets + pushf + call crlf + popf + jc loop + ; execute + call runcmd + jmp loop + +return: ; restore stack pointer + mov ss, [reg_ss] + mov sp, [reg_sp] + ; push flags, CS and IP + mov ax, [reg_fl] + push ax + mov ax, [reg_cs] + push ax + mov ax, [reg_ip] + push ax + ; restore GPR + mov ax, [reg_ax] + mov cx, [reg_cx] + mov dx, [reg_dx] + mov bx, [reg_bx] + mov bp, [reg_bp] + mov si, [reg_si] + mov di, [reg_di] + ; restore segment registers + ; DS must be last + mov es, [reg_es] + mov ds, [reg_ds] + ; final jump back + iret diff --git a/debug/util.asm b/debug/util.asm new file mode 100644 index 0000000..bc68815 --- /dev/null +++ b/debug/util.asm @@ -0,0 +1,35 @@ +; Utility commands + +cmd_h: call eat_whitespace + call eat_hex_word + jc .err + + mov bx, dx + + call eat_whitespace + call eat_hex_word + jc .err + + xchg bx, dx + + push dx + add dx, bx + call print16 + call space + pop dx + + sub dx, bx + call print16 + + jmp crlf +.err: mov di, eat_hex_word.emsg + jmp parse_error + +cmd_?: mov si, .txt + jmp putcs +.txt: db "G Go", 0x0A, 0x0D + db "H w w Add and subtract two values", 0x0A, 0x0D + db "R[r] Print register values", 0x0A, 0x0D + db "T Single-Step", 0x0A, 0x0D + db 0 + diff --git a/rom/debug.asm b/rom/debug.asm index c00725d..f406b90 100644 --- a/rom/debug.asm +++ b/rom/debug.asm @@ -57,93 +57,13 @@ init: push ds pop ds retf - %include "debug/parse.asm" - %include "debug/chario.asm" - %include "debug/edit.asm" - -int3entry: - ; save DS and load bss segment from IVT - push ds - mov ds, [cs:zero] - mov ds, [bssvec*4] - ; save AX so we can work with it - mov [reg_ax], ax - ; pop DS, IP, CS and flags from stack - pop ax - mov [reg_ds], ax - 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 ax, ds - mov es, ax - mov ss, ax - mov sp, stack - call crlf - call printregs - -loop: ; show prompt - mov al, '-' - call putc - ; read data - mov byte [inmin], 1 - mov byte [inmax], 16 - mov word [ingetc], getcu - call gets - pushf - call crlf - popf - jc loop - ; execute - call runcmd - jmp loop - -return: ; restore stack pointer - mov ss, [reg_ss] - mov sp, [reg_sp] - ; push flags, CS and IP - mov ax, [reg_fl] - push ax - mov ax, [reg_cs] - push ax - mov ax, [reg_ip] - push ax - ; restore GPR - mov ax, [reg_ax] - mov cx, [reg_cx] - mov dx, [reg_dx] - mov bx, [reg_bx] - mov bp, [reg_bp] - mov si, [reg_si] - mov di, [reg_di] - ; restore segment registers - ; DS must be last - mov es, [reg_es] - mov ds, [reg_ds] - ; final jump back - iret - - %include "debug/names.asm" - ; Expects DI to mark end of command runcmd: mov si, inbuf lodsb cmp al, 'G' je cmd_g + cmp al, 'H' + je cmd_h cmp al, 'R' je cmd_r cmp al, 'T' @@ -154,74 +74,13 @@ cerr: mov al, '?' call putc jmp crlf -cmd_?: mov si, .txt - jmp putcs -.txt: db "G Go", 0x0A, 0x0D - db "R[r] Print register values", 0x0A, 0x0D - db "T Single-Step", 0x0A, 0x0D - db 0 + %include "debug/chario.asm" + %include "debug/parse.asm" + %include "debug/names.asm" -cmd_g: and word [reg_fl+1], 0xfe - jmp return - -cmd_r: cmp byte [si], 0 - je printregs - call eat_register - jc .err - mov al, [cs:bx+rnames] - call putc - mov al, [cs:bx+rnames+1] - call putc - call space - call edit_word - call crlf - ret -.err: mov di, eat_register.emsg - jmp parse_error - -cmd_t: or word [reg_fl+1], 0x03 - jmp return - -printregs: - mov cx, 13 - xor bx, bx - mov ah, 0x0e - mov si, reg_ax -.loop: push cx - mov dx, [cs:si+rnames] - lodsw - call printreg - pop cx - loop .loop - - mov dx, [reg_fl] - mov si, fnames - mov cx, 16 -.floop: mov al, [cs:si] - inc si - cmp al, '+' - je .fskip - test dx, 0x8000 - jnz .fprnt - mov al, '-' -.fprnt: int 0x10 -.fskip: shl dx, 1 - loop .floop - call crlf - ret - -printreg: - push ax - mov al, dl - call putc - mov al, dh - call putc - mov al, '=' - call putc - pop dx - call print16 - call space - ret + %include "debug/edit.asm" + %include "debug/run.asm" + %include "debug/util.asm" align 512