📄 debemul.inc
字号:
.data
extrn CBrkTrace:byte
SavedSP dd 0
SavedBP dw 0
.code
OneStep proc near
call SetInt1
call DoOneStep
call ResetInt1
ret
OneStep endp
DoOneStep proc near
les di,Rg.rCSIP
mov al,es:[di]
cmp al,0cch
je @@2
cmp al,0cfh
je @@3
cmp al,9ch
je @@4
cmp al,9dh
je @@5
cmp al,0cdh
je @@1
or Rg.rFL,100h
push ExpectInt
mov ExpectInt,1
call Glop
pop ExpectInt
inc Rg.rIP
jmp @@8
@@1: jmp short @@6
@@2: inc Rg.rIP
ret
@@3: mov es,Rg.rSS
mov bx,Rg.rSP
mov ax,es:[bx]
mov cx,es:[bx+2]
mov dx,es:[bx+4]
mov Rg.rIP,ax
mov Rg.rCS,cx
mov Rg.rFL,dx
add Rg.rSP,6
jmp short @@8
@@4: sub Rg.rSP,2
mov bx,Rg.rSP
mov es,Rg.rSS
mov ax,Rg.rFL
mov es:[bx],ax
inc Rg.rIP
ret
@@5: mov bx,Rg.rSP
mov es,Rg.rSS
mov ax,es:[bx]
and ax,not 100h
mov Rg.rFL,ax
add Rg.rSP,2
inc Rg.rIP
ret
@@6: mov bl,es:[di+1]
xor bh,bh
shl bx,1
shl bx,1
add Rg.rIP,2
sub Rg.rSP,6
mov di,Rg.rSP
mov es,Rg.rSS
mov ax,Rg.rIP
stosw
mov ax,Rg.rCS
stosw
mov ax,Rg.rFL
stosw
push ds
add bx,offset SavedInts
test CBrkFlag,cbSecond
jz @@7
xor ax,ax
mov ds,ax
sub bx,offset SavedInts
@@7: mov ax,[bx]
mov dx,[bx+2]
pop ds
mov Rg.rIP,ax
mov Rg.rCS,dx
@@8: les di,Rg.rCSIP
cmp word ptr es:[0],3fcdh
je @@9
push es
call FindStubSeg
mov BptSeg,ax
ret
@@9: test CBrkFlag,cbSecond
jnz @@11
cmp word ptr es:[di],3fcdh
je @@10
cmp byte ptr es:[di],0eah
jne @@11
mov BptSeg,es
les ax,es:[di+1]
mov Rg.rIP,ax
mov Rg.rCS,es
ret
@@10: call ResetInt1
call SwitchToDebug
call Glop
call SwitchToTurbo
call SetInt1
cmp OvrBptByte,-1
je @@11
les di,OvrBptPtr
cmp byte ptr es:[di],0cch
jne @@11
mov al,byte ptr OvrBptByte
stosb
@@11: ret
DoOneStep endp
SwitchToDebug proc near
mov ah,51h
int 21h
mov SavedPID,bx
mov es,bx
mov ax,SavedStack.Offs
mov es:[2eh].Offs,ax
mov ax,SavedStack.Segm
mov es:[2eh].Segm,ax
mov bx,DebugPid
mov ah,50h
int 21h
cli
call SwapAllVectors
call SetHandlers
mov ExpectInt,3
ret
SwitchToDebug endp
SwitchToTurbo proc near
call RemoveHandlers
call SwapAllVectors
mov ExpectInt,0
sti
mov ah,51h
int 21h
mov DebugPid,bx
mov bx,SavedPID
mov ah,50h
int 21h
ret
SwitchToTurbo endp
SwapAllVectors proc near
xor ax,ax
mov bx,sp
sub sp,256*4+1
and sp,0fffeh
mov ds,ax
mov si,ax
push ss
pop es
mov di,sp
mov cx,256*2
rep movsw
nop
mov ds,DSeg
lea si,SavedInts
mov es,ax
mov di,ax
mov cx,256*2
rep movsw
mov si,sp
push ss
pop ds
lea di,SavedInts
mov es,DSeg
mov cx,256*2
rep movsw
mov ds,DSeg
mov es,DSeg
mov sp,bx
ret
SwapAllVectors endp
SetHandlers proc near
push ds
push cs
pop ds
xor ax,ax
mov es,ax
lea si,IntTable
mov cx,IntCount
@@1: lodsw
mov di,ax
mov ax,es:[di]
mov [si],ax
mov ax,es:[di+2]
mov [si+2],ax
add si,4
movsw
mov ax,cs
stosw
loop @@1
pop ds
ret
SetHandlers endp
RemoveHandlers proc near
mov bx,DebugPid
push ds
mov dx,cs
mov ds,dx
xor ax,ax
mov es,ax
lea si,IntTable
mov cx,IntCount
@@1: lodsw
mov di,ax
cmp dx,es:[di+2]
jne @@3
mov ax,[si+4]
cmp ax,es:[di]
jne @@3
@@2: movsw
movsw
inc si
inc si
loop @@1
pop ds
ret
@@3: cmp es:[di+2],bx
jb @@2
mov ds,dx
add si,6
loop @@1
pop ds
ret
RemoveHandlers endp
Glop proc near
mov SavedSP.Offs,sp
mov SavedSP.Segm,ss
mov SavedBP,bp
lea bx,Rg
mov ax,[bx].rAX
mov cx,[bx].rCX
mov dx,[bx].rDX
mov si,[bx].rSI
mov di,[bx].rDI
mov bp,[bx].rBP
mov es,[bx].rES
cli
mov ss,[bx].rSS
mov sp,[bx].rSP
push [bx].rFL
push [bx].rCSIP
mov bx,[bx].rBX
mov ds,Rg.rDS
iret
Int01_Entry proc far
cmp ExpectInt,1
je @Int
iret
Int01_Entry endp
Int03_Entry proc far
cmp ExpectInt,3
je @Int
iret
Int03_Entry endp
@Int: push ds
push bx
mov ds,DSeg
lea bx,Rg
mov [bx].rAX,ax
pop [bx].rBX
mov [bx].rCX,cx
mov [bx].rDX,dx
mov [bx].rSI,si
mov [bx].rDI,di
mov [bx].rBP,bp
pop [bx].rDS
mov [bx].rES,es
pop [bx].rCSIP
pop [bx].rFL
mov [bx].rSS,ss
mov [bx].rSP,sp
cli
mov ss,SavedSP.Segm
mov sp,SavedSP.Offs
sti
mov bp,SavedBP
and [bx].rFL,not 100h
dec Rg.rIP
cld
ret
db 'TDI9'
Int09_Entry proc far
push ds di
xor di,di
mov ds,di
mov di,6ch
push [di].Offs
push [di].Segm
cli
mov [di].Offs,offset Int1B_Entry
mov [di].Segm,cs
pushf
call Old09
cli
pop [di].Segm
pop [di].Offs
cmp CBrkPressed,0
je @@1
and byte ptr ds:[471h],7fh
mov CBrkPressed,0
push ax bx si
xor ah,ah
int 16h
pop si bx ax
@@1: pop di ds
test CBrkFlag,cbFirst
jnz Break
@Iret: iret
Int09_Entry endp
Int1B_Entry proc far
or CBrkFlag,1
test CBrkFlag,82h
jnz @@1
mov CBrkPressed,1
push ds
mov ds,DSeg
mov SrcLine.Offs,1
mov SrcLine.Segm,0
pop ds
iret
@@1: or CBrkFlag,80h
jmp Dos1B
Int1B_Entry endp
Break: or CBrkFlag,cbAccepted
cmp DontTrace,0
jne @Iret
push ds bx
test CBrkFlag,80h
jnz @@1
mov bx,seg _Data
mov ds,bx
cmp CBrkTrace,0
je @@1
mov CBrkFlag,cbAccepted+cbSecond
pop bx ds
jmp @Iret
@@1: mov ds,DSeg
lea bx,Rg
mov [bx].rAX,ax
pop [bx].rBX
mov [bx].rCX,cx
mov [bx].rDX,dx
mov [bx].rSI,si
mov [bx].rDI,di
mov [bx].rBP,bp
pop [bx].rDS
mov [bx].rES,es
pop [bx].rCSIP
pop [bx].rFL
mov [bx].rSS,ss
mov [bx].rSP,sp
cli
mov ss,InitSSSP.Segm
mov sp,InitSSSP.Offs
sti
mov bp,InitBP
test CBrkFlag,cbSecond
jnz @@6
mov CBrkFlag,cbAccepted+cbSecond
sti
call RemoveUserBpts
call DisableBpts
mov SrcLine.Offs,1
mov SrcLine.Segm,0
@@2: push Rg.rCS
call FindStubSeg
mov CurCS,ax
push ax
call FindUnit
or ax,ax
jnz @@4
mov ax,Rg.rCS
@@3: push ax
call SmartStep
pop ax
jnz @@6
cmp ax,Rg.rCS
je @@3
jmp @@2
@@4: push CurCS Rg.rIP ds
lea ax,Dummy
push ax
call FindSrcLine
mov bx,ax
or bx,dx
jnz @@7
@@5: mov ax,Rg.rCS
push ax
call SmartStep
pop ax
jnz @@6
cmp ax,Rg.rCS
je @@4
jmp @@2
@@6: neg SrcLine.Segm
mov CBrkFlag,0
jmp short @@8
@@7: mov SrcLine.Offs,ax
mov SrcLine.Segm,dx
call GetLineInfo
mov ax,LineBeg.Offs
cmp ax,Rg.rIP
jne @@5
mov ax,LineBeg.Segm
cmp ax,Rg.rCS
jne @@5
@@8: mov ah,51h
int 21h
mov DebugPid,bx
mov bx,SavedPID
mov ah,50h
int 21h
call RemoveHandlers
call SwapAllVectors
sti
neg SrcLine.Offs
jmp CBrkE
SmartStep proc near
mov di,Rg.rIP
mov es,Rg.rCS
cmp word ptr es:[di],21cdh
je @@3
cmp word ptr es:[di],13cdh
je @@3
cmp word ptr es:[di],10cdh
je @@3
push ExpectInt
mov ExpectInt,1
call DoOneStep
pop ExpectInt
cmp Rg.rIP,offset Int09_Entry
je @@2
@@1: test CBrkFlag,1
ret
@@2: mov bx,cs
cmp bx,Rg.rCS
jne @@1
push ExpectInt
mov ExpectInt,1
call Glop
pop ExpectInt
jmp @@1
@@3: mov DontTrace,1
inc di
inc di
mov al,es:[di]
mov byte ptr es:[di],0cch
push ax
@@4: push es di ExpectInt
mov ExpectInt,3
call Glop
pop ExpectInt di es
mov dx,es
cmp dx,Rg.rCS
jne @@4
cmp di,Rg.rIP
jne @@4
pop ax
mov es:[di],al
mov DontTrace,0
test CBrkFlag,1
ret
SmartStep endp
Int13_Entry proc far
inc DontTrace
pushf
call Old13
jmp short @Check
Int13_Entry endp
Int10_Entry proc far
inc DontTrace
pushf
call Old10
jmp short @Check
Int10_Entry endp
Nested db 0
Int21_Entry proc far
cmp Nested,0
jne @@1
inc DontTrace
cmp ah,4bh
je @@2
clc
pushf
call Dos21
@Check: push bp
mov bp,sp
push ax
lahf
mov [bp+6],ah
pop ax bp
dec DontTrace
test CBrkFlag,cbFirst
jnz @Break
iret
@@1: jmp Dos21
@@2: inc Nested
pushf
call Dos21
pushf
dec Nested
popf
jmp @Check
@Break: jmp Break
Int21_Entry endp
Glop endp
SetInt1 proc near
mov si,1*4
lea di,Old01
lea ax,Int01_Entry
push ds
xor bx,bx
mov ds,bx
push cs
pop es
movsw
movsw
pop ds
mov es,bx
lea di,[si-4]
cli
stosw
mov ax,cs
stosw
sti
push ds
pop es
ret
SetInt1 endp
ResetInt1 proc near
mov di,1*4
lea si,Old01
lea ax,Int01_Entry
push ds
xor bx,bx
mov es,bx
cmp ax,es:[di]
jne @@1
push cs
pop ds
cli
movsw
movsw
sti
@@1: pop ds
push ds
pop es
ret
ResetInt1 endp
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -