www.pudn.com > tp60src.zip > DEBANALZ.INC
.data MarkBuf dd 0 MarkBufLen dw 0 BptBuf dd 0 BptPtr dw 0 BptBufEnd dw 0 BptCount dw 0 StackPtr dw 0 StageBeg dd 0 StageStubSeg dw 0 StageEnd dw 0 StagePtr dw 0 StageEnd2 dw 0 BptAddr dw 0 BptType dw 0 MarkOffset dw 0 BitMask dw 0 BitCount dw 0 SpecCode dw 0 InstrLen dw 0 NextInstr dd 0 NextInstr2 dd 0 IntBptSet dw 0 ScreenSwapped dw 0 .code Dummy1 db 0 Dummy2 db 0 InitAnalyse proc near mov BptBuf.segm,ax mov BptBuf.offs,bx mov BptPtr,bx mov BptCount,0 add bx,dx mov BptBufEnd,bx mov MarkBuf.offs,di mov MarkBuf.segm,es mov ax,cx shl ax,1 shl ax,1 shl ax,1 mov MarkBufLen,ax shr cx,1 xor ax,ax rep stosw mov ScreenSwapped,ax mov Dummy1,al ret InitAnalyse endp Analyse proc near cmp cx,MarkBufLen jbe @@1 jmp @@18 @@1: mov StageEnd2,ax mov StageBeg.offs,bx mov StageBeg.segm,es mov StageStubSeg,dx add cx,bx mov StageEnd,cx mov IntBptSet,0 mov Dummy2,-1 ContAnalyse label near mov ax,BptBufEnd mov StackPtr,ax @@2: mov StagePtr,si call CalcMask mov MarkOffset,bx mov BitMask,dx mov BitCount,cx @@3: mov si,MarkOffset mov es,MarkBuf.segm mov ax,BitMask test ax,es:[si] jnz @@7 mov di,StagePtr mov es,StageBeg.segm call disasm mov InstrLen,cx mov NextInstr.offs,di mov NextInstr.segm,es mov SpecCode,ax mov si,MarkOffset mov es,MarkBuf.segm mov ax,BitMask mov dx,BitCount @@4: or es:[si],ax shl ax,1 dec dx jnz @@5 mov ax,1 mov dx,16 add si,2 add MarkOffset,2 @@5: loop @@4 mov BitMask,ax mov BitCount,dx mov ax,SpecCode cmp ax,scInt je @@9 mov IntBptSet,0 and ax,ax jnz @@9 @@6: mov ax,InstrLen add StagePtr,ax mov ax,StagePtr cmp ax,StageEnd jae @@7 jmp @@3 @@7: mov si,StackPtr cmp si,BptBufEnd je @@8 mov es,MarkBuf.segm mov si,es:[si] add StackPtr,2 mov IntBptSet,0 jmp @@2 @@8: clc ret @@9: mov bx,ax and bx,7fh shl bx,1 jmp @@Tbl[bx-2] .data @@Tbl dw @@Ret,@@Jmp,@@Jcc,@@Call,@@Int,@@DS,@@ES,@@Both .code @@Ret: mov al,bpRet call SetBptHere jmp @@6 @@Jmp: test ax,scInd jz @@Jcc @@13: mov al,bpICall call SetBptHere jmp @@7 @@14: cmp SpecCode,scJcc je @@16 @@15: mov si,NextInstr.offs jmp @@2 @@16: mov si,NextInstr.offs call CalcMask mov es,MarkBuf.segm test dx,es:[bx] jnz @@17 mov bx,MarkOffset mov ax,BitMask and ax,es:[bx] jnz @@15 sub StackPtr,2 mov di,StackPtr cmp di,BptPtr jb @@18 mov ax,NextInstr.offs stosw @@17: jmp @@6 @@18: call RemoveBpts stc ret @@Jcc: mov ax,NextInstr.segm cmp ax,StageBeg.segm jne @@20 mov ax,StageStubSeg mov NextInstr.segm,ax mov ax,NextInstr.offs cmp ax,StageBeg.offs jb @@20 cmp ax,StageEnd jb @@14 @@20: push NextInstr ds lea ax,NextInstr2 push ax call FindSrcLine or ax,dx jz @@13 mov al,bpStop les di,NextInstr call SetBpt cmp SpecCode,scJcc je @@24 jmp @@7 @@Int: cmp IntBptSet,0 jne @@22 mov IntBptSet,1 mov al,bpInt call SetBptHere @@22: jmp @@6 @@Call: cmp Action,acTraceInto jne @@29 test ax,scInd jz @@25 mov al,bpIJmp call SetBptHere @@24: jmp @@6 @@25: les di,NextInstr cmp word ptr es:[0],3fcdh jne @@27 mov ax,es:[di+1] cmp byte ptr es:[di],0eah je @@26 mov ax,es:[di+2] @@26: mov NextInstr.offs,ax @@27: mov ax,NextInstr.segm cmp ax,StageBeg.segm jne @@28 mov ax,StageStubSeg mov NextInstr.segm,ax @@28: push NextInstr ds lea ax,NextInstr2 push ax call FindSrcLine or ax,dx jz @@29 mov al,bpStop les di,NextInstr2 call SetBpt jmp @@6 @@29: mov al,bpCall call SetBptHere jmp @@6 @@DS: mov al,bpDS call SetBptHere jmp @@6 @@ES: mov al,bpES call SetBptHere jmp @@6 @@Both: mov al,bpBoth call SetBptHere jmp @@6 Analyse endp .data Masks dw 0001h,16 dw 0002h,15 dw 0004h,14 dw 0008h,13 dw 0010h,12 dw 0020h,11 dw 0040h,10 dw 0080h,9 dw 0100h,8 dw 0200h,7 dw 0400h,6 dw 0800h,5 dw 1000h,4 dw 2000h,3 dw 4000h,2 dw 8000h,1 .code CalcMask proc near sub si,StageBeg.offs mov bx,si mov cl,4 shr bx,cl shl bx,1 add bx,MarkBuf.offs and si,0fh shl si,1 shl si,1 mov dx,Masks[si] mov cx,Masks[si+2] ret CalcMask endp GetRealSeg proc near cmp word ptr es:[0],3fcdh jne @@1 cmp word ptr es:[10h],0 je @@2 mov es,es:[10h] @@1: clc ret @@2: stc ret GetRealSeg endp SetBptHere proc near mov di,StagePtr mov es,StageBeg.segm SetBpt label near call BptOnAddr jz @@2 mov bx,BptPtr lea dx,[bx+size DBpt] cmp dx,StackPtr ja @@3 push ds mov ds,BptBuf.segm mov [bx].Adr.Offs,di mov [bx].Adr.Segm,es mov [bx].Typ,al call GetRealSeg jc @@1 mov al,es:[di] mov [bx].OldB,al mov byte ptr es:[di],0cch @@1: pop ds add BptPtr,size DBpt inc BptCount @@2: ret @@3: call RemoveBpts call RemoveUserBpts jmp StkOv SetBptHere endp RemoveBpts proc near mov cx,BptCount jcxz @@3 push ds lds si,BptBuf @@1: les di,[si].Adr call GetRealSeg jc @@2 cmp byte ptr es:[di],0cch jne @@2 mov al,[si].OldB mov es:[di],al @@2: add si,size DBpt loop @@1 pop ds mov ax,BptBuf.offs mov BptPtr,ax mov BptCount,0 @@3: ret RemoveBpts endp BptOnAddr proc near push es ds mov dx,es mov cx,BptCount jcxz @@3 lds si,BptBuf @@1: cmp di,[si].Adr.Offs jne @@2 cmp dx,[si].Adr.Segm je @@7 @@2: add si,size DBpt loop @@1 @@3: pop ds push ds mov cx,UserBptCount jcxz @@6 lds si,UserBptBuf @@4: cmp [si].Typ,0 je @@5 cmp di,[si].Adr.Offs jne @@5 cmp dx,[si].Adr.Segm je @@7 @@5: add si,size DBpt loop @@4 @@6: or cl,1 @@7: pop ds es ret BptOnAddr endp PassBpt proc near mov si,BptAddr mov es,BptBuf.Segm les di,es:[si].Adr call GetRealSeg jc @@1 cmp byte ptr es:[di],0cch jne @@1 mov al,[si].OldB mov es:[di],al call OneStep mov si,BptAddr mov es,BptBuf.Segm les di,[si].Adr mov al,es:[di] mov [si].OldB,al mov byte ptr es:[di],0cch @@1: ret PassBpt endp .data BptSeg dw 0 .code ProcessBpt proc near mov cx,BptCount jcxz @@3 mov di,BptBuf.Offs mov es,BptBuf.Segm mov ax,Rg.rIP mov dx,Rg.rCS @@1: scasw je @@4 @@2: add di,size DBpt-2 loop @@1 @@3: stc ret @@4: push es mov es,es:[di-2].Adr.Segm call GetRealSeg mov bx,es pop es jc @@2 cmp dx,bx jne @@2 mov ax,es:[di-2].Adr.Segm mov BptSeg,ax sub di,2 mov BptAddr,di mov al,es:[di].Typ cbw mov BptType,ax mov bx,ax cmp al,bpIJmp je @@6 cmp al,bpICall je @@6 push ds es les si,es:[di].Adr call GetRealSeg push es pop ds pop es jc @@5 cmp byte ptr [si],0cch jne @@5 mov al,es:[di].OldB mov [si],al @@5: pop ds @@6: shl bx,1 jmp @@Tbl[bx] .data @@Tbl dw @@DS,@@ES,@@Both,@@Call,@@Call,@@Ret,@@Stop,@@IJmp,@@ICall .code @@ICall:call PassBpt mov si,Rg.rCS cmp si,StageBeg.Segm jne @@Stop mov si,Rg.rIP cmp si,StageBeg.Offs jb @@Stop cmp si,StageEnd jae @@Stop call CalcMask mov es,MarkBuf.segm test dx,es:[bx] jnz @@9 mov si,Rg.rIP call ContAnalyse @@9: xor al,al ret @@IJmp: call PassBpt jmp short @@Stop @@Ret: mov OvrBptFlag,1 call OneStep mov OvrBptFlag,0 cmp Action,acStepOver jne @@Stop mov Action,acTraceInto @@Stop: push BptSeg Rg.rIP ds lea ax,NextInstr2 push ax call FindSrcLine cmp BptType,bpIJmp jne @@13 mov bx,ax or bx,dx jz @@Call @@13: push ax dx call RemoveBpts pop dx ax mov bx,ax or bx,dx jnz @@14 call ScreenSwap xor ax,ax xor dx,dx @@14: ret @@DS: mov ax,Rg.rDS @@16: push ax mov di,BptAddr push ds mov ds,BptBuf.Segm les si,[di].Adr call GetRealSeg cmp byte ptr es:[si],0cch jne @@17 mov al,[di].OldB mov es:[si],al @@17: pop ds ax cmp ax,50h jb @@Call cmp ax,0a000h jb @@18 cmp ax,0c000h jb @@Call @@18: xor al,al ret @@Both: mov ax,Rg.rDS cmp ax,0a000h jae @@16 cmp ax,50h jb @@16 @@ES: mov ax,Rg.rES jmp @@16 @@Call: cmp ScreenSwapped,0 jne @@24 call ScreenSwap mov ScreenSwapped,1 mov cx,BptCount push ds lds si,BptBuf @@22: cmp [si].Typ,bpInt ja @@23 les di,[si].Adr cmp byte ptr es:[di],0cch jne @@23 mov al,[si].OldB mov es:[di],al @@23: add si,size DBpt loop @@22 pop ds @@24: xor al,al ret ProcessBpt endp DisableBpts proc near mov cx,BptCount jcxz @@3 push ds lds si,BptBuf @@1: les di,[si].Adr cmp byte ptr es:[di],0cch jne @@2 mov al,[si].OldB mov es:[di],al @@2: add si,size DBpt loop @@1 pop ds @@3: ret DisableBpts endp