www.pudn.com > tp60src.zip > DEBUG.ASM
model large,pascal locals @@ Offs equ (word ptr 0) Segm equ (word ptr 2) acTraceInto equ 0 acStepOver equ 1 acRun equ 2 acGoToCursor equ 3 scNorm equ 0 scRet equ 1 scJmp equ 2 scJcc equ 3 scCall equ 4 scInt equ 5 scDS equ 6 scES equ 7 scBoth equ 8 scInd equ 80h bpDS equ 0 bpES equ 1 bpBoth equ 2 bpCall equ 3 bpInt equ 4 bpRet equ 5 bpStop equ 6 bpIJmp equ 7 bpICall equ 8 cbFirst equ 1 cbAccepted equ 2 cbSecond equ 80h Regs struc rAX dw ? rBX dw ? rCX dw ? rDX dw ? rBP dw ? rSI dw ? rDI dw ? rDS dw ? rES dw ? rCSIP label dword rIP dw ? rCS dw ? rFL dw ? rSP dw ? rSS dw ? ends DBpt struc Adr dd ? OldB db ? Typ db ? ends extrn FindCode:far extrn FindSrcLine:far extrn FindUnit:far extrn FindStubSeg:far extrn ScreenSwap:far .data extrn SaveInt1B:dword,SaveInt21:dword,SaveInt23:dword extrn Rg:Regs Work1 db 256 dup(0) Work2 db 256 dup(0) DebugPID dw 0 SavedPID dw 0 SavedInts dd 256 dup(0) OvrBptByte dw 0 OvrBptPtr dd 0 OvrBptFlag dw 0 UserBptCnt dw 0 UserBpts dd 0 SrcLine dd 0 LineBeg dd 0 LineLen dw 0 LineEnd dw 0 dw 0,0,0 FirstSet dw 0 FinBptByte dd 0 Dummy dd 0 InitBP dw 0 InitSSSP dd 0 CurCS dw 0 SavedStack dd 0 dd 0 PrevCSIP dd 0 .code db '$*$*$*',0,10,0,1,'DEBUG',0 DSeg dw seg _Data IntTable equ $ irp I,<01,03,09,10,13> dw 4*I&H Old&I dd 0 dw Int&I&_Entry endm IntCount dw ($-IntTable)/8 DOS1B dd 0 DOS21 dd 0 ExpectInt dw 0 DontTrace dw 0 CBrkFlag db 0 CBrkPressed db 0 dd 0,0 public Step Step proc far UserBptCount:word,UserBptBuf:dword,Action:word uses si,di cld mov ax,DSeg mov ds,ax mov es,ax mov InitSSSP.Segm,ss mov InitSSSP.Offs,sp mov InitBP,bp mov ax,CurCS cmp ax,-1 jne @@1 mov ax,Rg.rCS @@1: push ax Rg.rIP ds lea ax,Dummy push ax call FindSrcLine mov SrcLine.Offs,ax mov SrcLine.Segm,dx or ax,dx jnz @@3 call SetUserBpts mov Action,acRun @@2: call ScreenSwap jmp @@6 @@3: call GetLineInfo call SetUserBpts @@4: mov ax,ds mov es,ax lea di,Work1 mov cx,256 mov ax,ds lea bx,Work2 mov dx,256 call InitAnalyse cmp Action,acRun je @@2 mov ax,LineBeg.Offs add ax,LineLen mov LineEnd,ax les bx,LineBeg mov dx,CurCS mov cx,LineLen mov si,Rg.rIP mov ax,Action call Analyse jnc @@5 StkOv: mov sp,InitSSSP.Offs mov bp,InitBP xor ax,ax mov dx,-1 jmp DExit @@5: mov di,LineEnd mov es,CurCS mov al,bpStop nop call SetBpt @@6: cmp FirstSet,0 je @@7 les di,LineBeg cmp byte ptr es:[di],0cch je @@7 call OneStep call RemoveFinBpt @@7: mov DontTrace,0 mov CBrkFlag,0 mov cs:Nested,0 mov ax,Rg.rIP mov PrevCSIP.Offs,ax mov ax,Rg.rCS mov PrevCSIP.Segm,ax call SwitchToDebug call Glop call SwitchToTurbo mov ax,Rg.rIP mov dx,Rg.rCS mov cx,UserBptCount jcxz @@10 les di,UserBptBuf @@8: cmp es:[di].Typ,0 je @@9 cmp ax,es:[di].Adr.Offs jne @@9 push es mov es,es:[di].Adr.Segm mov BptSeg,es call GetRealSeg mov bx,es pop es jc @@15 cmp dx,bx je @@15 @@9: add di,size DBpt loop @@8 @@10: call ProcessBpt jnc @@13 mov cx,1 mov ax,Rg.rIP cmp ax,PrevCSIP.Offs jne @@11 mov ax,Rg.rCS cmp ax,PrevCSIP.Segm jne @@11 mov PrevCSIP.Offs,-1 inc Rg.rIP dec cx cmp Action,acRun je @@14 @@11: mov PrevCSIP.Offs,-1 push cx push Rg.rCSIP ds lea ax,Dummy push ax call FindSrcLine pop cx mov bx,ax or bx,dx jz @@12 push cx mov SrcLine.Offs,ax mov SrcLine.Segm,dx call GetLineInfo pop cx mov ax,LineBeg.Offs cmp ax,Rg.rIP jne @@12 mov ax,LineBeg.Segm cmp ax,Rg.rCS je @@18 @@12: add Rg.rIP,cx jmp @@7 @@13: jnz @@16 @@14: jmp @@7 @@15: push BptSeg Rg.rIP ds lea ax,Dummy push ax call FindSrcLine @@16: mov SrcLine.Offs,ax mov SrcLine.Segm,dx call GetLineInfo mov ax,LineBeg.Offs cmp ax,Rg.rIP jne @@17 mov ax,LineBeg.Segm cmp ax,Rg.rCS je @@18 @@17: jmp @@4 @@18: call RemoveUserBpts call RemoveBpts CBrkE: mov ax,SrcLine.Offs mov dx,SrcLine.Segm DExit: ret RemoveFinBpt proc near les di,LineBeg mov al,es:[di] mov byte ptr es:[di],0cch les di,FinBptByte stosb mov FirstSet,0 ret RemoveFinBpt endp include debanalz.inc public DoneDebug DoneDebug proc far push bp mov bp,sp push si di mov dx,Action cli mov ss,InitSSSP.Segm mov sp,InitSSSP.Offs sti mov bp,InitBP mov ds,DSeg push dx call RemoveHandlers call SwapAllVectors call RemoveUserBpts call RemoveBpts xor ax,ax pop dx xor dh,dh cmp CBrkFlag,0 je @@1 mov dx,ax dec ax @@1: jmp DExit DoneDebug endp public InitDebug InitDebug proc far PID:word uses si,di cld push ds mov ds,DSeg mov ax,PID mov ax,Rg.rDS mov DebugPID,ax or Rg.rFL,200h mov es,ax mov es,es:[16h] les si,es:[2eh] mov SavedStack.Offs,si mov SavedStack.Segm,es mov CurCS,-1 mov OvrBptFlag,0 mov es,DSeg xor ax,ax mov ds,ax xor si,si lea di,SavedInts mov cx,256*2 rep movsw mov ds,DSeg lea si,SaveInt1B lea di,SavedInts+1bh*4 lodsw stosw mov DOS1B.Offs,ax lodsw stosw mov DOS1B.Segm,ax lea si,SaveInt21 lodsw mov DOS21.Offs,ax lodsw mov DOS21.Segm,ax lea di,SavedInts+21h*4 lea ax,Int21_Entry stosw mov ax,cs stosw lea si,SaveInt23 lea di,SavedInts+23h*4 movsw movsw movsw movsw pop ds ret InitDebug endp public OvrDebugHook OvrDebugHook proc far test CBrkFlag,80h jz @@1 ret @@1: push ds mov ds,DSeg mov BptSeg,es mov dx,es call GetRealSeg or ax,ax jz @@7 mov cx,UserBptCnt jcxz @@4 push ds lds si,UserBpts @@2: cmp dx,[si].Adr.Segm jne @@3 mov di,[si].Adr.Offs mov al,es:[di] mov [si].OldB,al mov byte ptr es:[di],0cch @@3: add si,size DBpt loop @@2 pop ds @@4: mov cx,BptCount jcxz @@7 push ds lds si,BptBuf @@5: cmp dx,[si].Adr.Segm jne @@6 mov di,[si].Adr.Offs mov al,es:[di] mov [si].Oldb,al mov byte ptr es:[di],0cch @@6: add si,size DBpt loop @@5 pop ds @@7: cmp OvrBptFlag,0 je @@8 mov di,bx mov bl,es:[di] xor bh,bh mov byte ptr es:[di],0cch mov OvrBptPtr.Offs,di mov OvrBptPtr.Segm,es @@8: mov OvrBptByte,bx pop ds ret OvrDebugHook endp GetLineInfo proc near push SrcLine ds lea ax,LineBeg push ax ds lea ax,LineLen push ax call FindCode or ax,ax jz @@1 mov es,LineBeg.Segm mov CurCS,es call GetRealSeg jc @@1 mov LineBeg.Segm,es @@1: or ax,ax ret GetLineInfo endp Finish dd 0 SetUserBpts proc near mov FirstSet,0 mov cx,UserBptCount mov UserBptCnt,cx jcxz @@2 les bx,UserBptBuf mov UserBpts.Offs,bx mov UserBpts.Segm,es @@1: push cx push bx es mov ax,es:[bx].Adr.Offs mov Finish.Offs,ax mov ax,es:[bx].Adr.Segm mov Finish.Segm,ax mov ax,Finish.Offs cmp ax,Rg.rIP jne @@3 push es mov es,Finish.Segm call GetRealSeg mov ax,es pop es jc @@3 cmp ax,Rg.rCS jne @@3 xor al,al cmp Action,acRun jne @@6 cmp FirstSet,0 jne @@6 pop es bx push bx es mov FirstSet,1 lea ax,[bx].Oldb mov FinBptByte.Offs,ax mov FinBptByte.Segm,es les di,Finish jmp short @@5 @@2: jmp short @@7 @@3: les di,Finish push es call GetRealSeg jc @@4 mov ah,es:[di] mov byte ptr es:[di],0cch @@4: pop es @@5: mov al,1 mov dx,es @@6: pop es bx mov es:[bx].Typ,al mov es:[bx].Oldb,ah pop cx add bx,size DBpt dec cx jz @@7 jmp @@1 @@7: ret SetUserBpts endp RemoveUserBpts proc near mov cx,UserBptCount jcxz @@3 push ds lds si,UserBptBuf @@1: cmp [si].Typ,0 je @@2 mov di,[si].Adr.Offs mov es,[si].Adr.Segm call GetRealSeg 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 RemoveUserBpts endp include debopcod.inc include debemul.inc Step endp end