rdos/debug/run.asm

84 lines
1.4 KiB
NASM

; 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