📄 mtrap.asm
字号:
;
; GRDB
;
; Copyright(c) LADsoft
;
; David Lindauer, camille@bluegrass.net
;
;
; mtrap.asm
;
; Function: handle the all traps. Int 3 and Int 1 are debug traps and
; are handled specially
;MASM MODE
.model small
.386
.stack 1024
include iversion.inc
include eprints.inc
include eregs.inc
include einput.inc
include ebreaks.inc
include eenv.inc
include eloader.inc
include elogging.inc
include edos.inc
include eMemory.inc
include eints.inc
include eexec.inc
include eoptions.inc
include eloader.inc
include ehistory.inc
include eswift.inc
include efp.inc
include ehbreak.inc
public entry3,indos,entry1
PUBLIC RegdumpFLAGS,RegdumpEAX,RegdumpEBX,RegdumpECX,RegdumpEDX
PUBLIC RegdumpESI,RegdumpEDI,RegdumpEBP
PUBLIC RegdumpESP,RegdumpEIP
PUBLIC RegdumpCS,RegdumpES,RegdumpDS,RegdumpSS,RegdumpFS,RegdumpGS
PUBLIC TrapHandler, _exit, psp
PUBLIC reentry, grdbname, veclist, entry1
PUBLIC stackseg,stackofs, dosver
extrn checkcpu : PROC, FileLoadErr : PROC, trapcount : dword
extrn ReTrap : PROC
EXTRN initflatreal:PROC, rundownflatreal : PROC
;
; CPU instruction trap enable flag
;
TRAPFLAG = 100h
.data
stackofs dw 0 ;to restore out stack in INT1
stackseg dw 0
;
; Register image
;
veclist db 00h
dw entry0
db 1
dw entry1
db 3
dw entry3
db 1bh
dw int1bh
db 20h
dw int20handle
db 21h
dw int21handle
db 0ffh ; trailer
RegdumpFLAGS dd 0
RegdumpEAX dd 0
RegdumpEBX dd 0
RegdumpECX dd 0
RegdumpEDX dd 0
RegdumpESI dd 0
RegdumpEDI dd 0
RegdumpEBP dd 0
RegdumpESP dd 0
RegdumpEIP dd 0
RegdumpCS dw 0
RegdumpES dw 0
RegdumpDS dw 0
RegdumpSS dw 0
RegdumpFS dw 0
RegdumpGS dw 0
;
dosver dw 0
haserr dw 0 ; If there is an error# on stack
errnum dw 0 ; The error#
trapnum dw 0 ; The trap#
indos dd 0 ; pointer to indos flag
grdbname db '********',0
psp dw 0 ;debugger PSP
neederr db 0 ;flag for file load result from command line
trappop dd 6790h ;traps that need to pop a value
.code
cpuerr db "GRDB requires a 386 or better processor",0
memerr db "not enough memory/corrupt arena",0
vererr db "GRDB requires MSDOS 4.0 or better"
nomsg db 0
;This macro generates a front end for the interrupt handlers installed for
;int 0, 1 and 3.
entry macro num
local est
entry&num:
if num EQ 1
call hdwechk
jc est
call swiftrace
ENDIF
IF num EQ 3
call swiftrace
ENDIF
est:
push gs
push fs
push es
push ds
pushad
mov al,num
jmp traphandler
endm
entry 0
entry 1
entry 3
;
; Save an image of the regs
; This MUST BE the first thing the trap handler calls; it assumes
; there is ONE PUSH (return address) followed by the DS at the time
; of interrupt followed by the interrupt data
;
saveregs PROC
pop cx
pop [RegdumpEDI]
pop [RegdumpESI]
pop [RegdumpEBP]
pop eax
pop [RegdumpEBX]
pop [RegdumpEDX]
pop [RegdumpECX]
pop [RegdumpEAX]
pop [RegdumpDS]
pop [RegdumpES]
pop [RegdumpFS]
pop [RegdumpGS]
bt [haserr],0 ; See if an error
jnc short noerr ;
pop eax ; Get the error #
mov [errnum],ax ;
noerr:
pop word ptr [RegdumpEIP]
pop [RegdumpCS]
pop word ptr [RegdumpFLAGS]
mov ax,ss ; Otherwise just save the current
mov [RegdumpSS],ax ; stack pointer before we started pushing
mov [RegdumpESP],esp ;
jmp cx
saveregs ENDP
;
; Adjust EIP to the trap if it's not int 3
;
adjusteip PROC
cmp [trapnum],3 ; See if int 3
jnz short noadj ; No, get out
mov ebx,[RegdumpEIP] ;
mov fs,[RegdumpCS] ;
cmp BYTE PTR fs:[bx-1],0cch ; See if is an INT 3
jz short nodecrement ; Get out if so
dec word ptr [RegdumpEIP] ; Else point at trap
nodecrement:
noadj:
ret
adjusteip ENDP
;
; Generic trap handler
;
traphandler PROC
cld
sti
mov bx,dgroup
mov ds,bx
mov es,bx
mov [CtrlBrkPressedInDOS],0
movzx eax,al
mov [trapnum],ax
bt [trappop],eax
jnc noerr2
inc [haserr] ; Set the error flag
noerr2:
mov si,offset veclist
call ReleaseRMInts
call saveregs ; Save Regs
and [RegdumpFLAGS],NOT TRAPFLAG ; reset trap flag in flags image
mov ss,[stackseg] ; load our stack
movzx esp,[stackofs] ; clear top of ESP just in case...
call disableBreaks ; Disable breakpoints if not
call adjusteip ; Adjust the EIP to point to the breakpoint
call SetDebugPSP
call crlf
cmp [trapnum],3 ; No stats if it is int 3
jz short reentry ;
cmp [trapnum],1 ; Or int 1
jz short reentry ;
PRINT_MESSAGE <'Trap: '>
mov ax,[trapnum] ; Say which one
call printbyte ;
call crlf
btr [haserr],0 ; If has error
jnc reentry ;
PRINT_MESSAGE <'Error: '>
mov ax,[errnum] ; Say which one
call printword
call crlf
; fall through
traphandler ENDP
reentry PROC
call DisplayRegisters; Display registers
test [trapcount],-1
jz noretrace
dec [trapcount]
jmp ReTrap
noretrace:
call initflatreal
test [neederr],-1
jz InputHandler
mov ah,[neederr]
mov [neederr],0
sahf
call FileLoadErr
jmp InputHandler ; Go do input
reentry ENDP
;
; Monitor init routine, point all traps to point to the monitor handler
;
start:
mov bx,dgroup ; setup
mov ds,bx
mov [psp],es ; our PSP
mov es,bx ;set ES to DX
mov ax,ss ; have to adjust stack to be DS-relative
sub ax,bx ; the disassembler requires it
shl ax,4 ;to segment
add ax,sp ;add in the stack pointer
mov ss,bx ;set SS to DS
mov sp,ax ;and new stack based on DS
mov [stackseg],ss
mov [stackofs],sp
PRINT_MESSAGE <"GRDB version ",30h +VERID/10,'.',30h + VERID MOD 10, " Copyright (c) LADsoft",13,10>
mov ah,30h ; dos version check
int 21h
cmp al,4
mov dx,offset cs:vererr
jc errx
xchg ah,al
mov [dosver],ax
push es ; get indos flag
mov ah,34h
int 21h
mov word ptr [indos],bx
mov word ptr [indos+2],es
pop es
call checkcpu ; validate CPU
mov dx,offset cs:cpuerr
jc errx
IFNDEF TEST1
call ResizeMem ; cut mem back
mov dx,offset cs:memerr
jc errx
call IntSnapshot ; grab the ints so we can
; restoire context later
mov dx,offset cs:memerr
jc errx2
mov si,offset grdbname ; create data spaces for
call MakeEmptyProg ; empty prog
mov dx,offset cs:memerr
jc errx2
call ReadOptions ; read the options disk file
call FloatCheck ; check for an FP coprocessor
push ds ; parse command line params
mov ds,[psp]
mov si,81h
call ParseProgName
pop ds
test [loadfile],-1 ; load program
jz dohist
sub ax,ax
call LoadProgram ; load the program
lahf
mov [neederr],ah
dohist:
test [opthist],0ffh ; init history
jz reentry
call LoadHistory
ENDIF
jmp reentry ; get us started
;
; program exit
;
_exit:
IFNDEF TEST1
call KillFiles ; close files they opened
call CloseLogFile ; close our log file
call rundownflatreal ; no more flat real mode
mov dx,offset cs:nomsg
ENDIF
errx2:
IFNDEF TEST1
push dx
call UnLoadInts ; unload int vects
call ReleaseMemory ; release any memory tagged
; to them
call ReleaseDebugMem ; release any memory tagged
; to us
call WriteOptions ; write options file
pop dx
ENDIF
errx:
mov bx,dx
call olMessage
mov bx,0 ; close the input file
mov ah,3eh
int 21h
mov ax,4c00h
int 21h
END start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -