www.pudn.com > tp60src.zip > DEBUG2.ASM
model large,pascal locals @@ Offs equ (word ptr 0) Segm equ (word ptr 2) ECB_S struc Env_Seg dw ? Cmd_L dd ? FCB1 dd ? FCB2 dd ? SS_SP dd ? CS_IP dd ? ends extrn DoneDebug:far,InitDebug:far .data extrn CurRegs:dword,DebugSP:word DPID dw 0 .data? extrn PrefixSeg:word ECB ECB_S <> SaveSP dw ? SaveStk dd ? .code public BuildPSP BuildPSP proc pascal far CmdLine:dword uses ds mov es,PrefixSeg mov di,80h lds si,CmdLine cld lodsb stosb xor ah,ah xchg ax,cx rep movsb mov al,0dh stosb push es pop ds mov si,81h mov di,5ch mov ax,2901h int 21h mov di,6ch mov ax,2901h int 21h ret BuildPSP endp GetStack proc near mov es,PrefixSeg mov ax,es:[2eh].Offs mov SaveStk.Offs,ax mov ax,es:[2eh].Segm mov SaveStk.Segm,ax ret GetStack endp SetStack proc near mov es,PrefixSeg mov ax,SaveStk.Offs mov es:[2eh].Offs,ax mov ax,SaveStk.Segm mov es:[2eh].Segm,ax ret SetStack endp public LoadProgram LoadProgram proc pascal far Path:dword lea bx,ECB push ds pop es mov ds,PrefixSeg mov di,bx cld mov ax,ds:[2ch] stosw mov ax,80h stosw mov ax,ds stosw mov ax,5ch stosw mov ax,ds stosw mov ax,6ch stosw mov ax,ds stosw push es pop ds push ds:[2eh].Offs ds:[2eh].Segm mov SaveSP,sp mov sp,DebugSP lds dx,Path mov ax,4b01h int 21h mov dx,seg _Data mov ds,dx cli mov ss,dx mov sp,SaveSP sti pushf push ax mov ah,30h int 21h xchg al,ah cmp ax,2*256+10 jae @@1 mov es,PrefixSeg mov ax,ds:[2eh].Offs mov es:[2eh].Offs,ax mov ax,ds:[2eh].Segm mov es:[2eh].Segm,ax @@1: pop ax popf pop ds:[2eh].Segm ds:[2eh].Offs jc @@2 call GetStack xor ax,ax jmp short @@3 @@2: xchg ax,dx mov ax,-2 cmp dl,2 je @@3 mov al,-4 cmp dl,8 je @@3 mov al,-6 @@3: ret LoadProgram endp public EmulateLoad EmulateLoad proc pascal far PID:word,MemTop:word,EntryPoint:dword,StackPtr:dword les ax,EntryPoint mov ECB.CS_IP.Offs,ax mov ECB.CS_IP.Segm,es les ax,StackPtr mov ECB.SS_SP.Offs,ax mov ECB.SS_SP.Segm,es mov SaveSP,sp mov sp,DebugSP mov dx,PID mov si,MemTop mov ah,55h int 21h mov es,PID mov ax,MemTop mov es:[2],ax mov sp,SaveSP call GetStack ret EmulateLoad endp public RunProgram RunProgram proc far push bp mov ah,51h int 21h call SetStack mov SaveSP,sp cli mov ss,ECB.SS_SP.Segm mov sp,ECB.SS_SP.Offs sti les ax,ECB.CS_IP push es ax mov ds,bx mov es,bx mov ds:[0ah].Offs,offset @@1 mov ds:[0ah].Segm,cs retf @@1: mov ax,seg _Data mov ds,ax cli mov ss,ax mov sp,SaveSP sti mov ah,4dh int 21h pop bp ret RunProgram endp public InitProgram InitProgram proc far push bp mov ah,51h int 21h mov DPID,bx les di,CurRegs cld xor ax,ax mov cx,7 rep stosw mov ax,bx stosw stosw mov ax,ECB.CS_IP.Offs stosw mov ax,ECB.CS_IP.Segm stosw pushf pop ax stosw mov ax,ECB.SS_SP.Offs stosw mov ax,ECB.SS_SP.Segm stosw mov es,bx mov es:[0ah].Offs,offset @@1 mov es:[0ah].Segm,cs push bx call InitDebug mov bx,PrefixSeg mov ah,50h int 21h mov ax,DPID add ax,10h pop bp ret @@1: mov ax,seg _Data mov ds,ax cli mov ss,ax mov sp,DebugSP sti mov ah,4dh int 21h push ax xor ax,ax mov DPID,ax call DoneDebug InitProgram endp public ExitProgram ExitProgram proc far push bp mov bx,DPID or bx,bx jz @@2 call SetStack mov SaveSP,sp mov es,bx mov es:[0ah].Offs,offset @@1 mov es:[0ah].Segm,cs mov ah,50h int 21h mov ax,4c00h int 21h @@1: mov ax,seg _Data mov ds,ax cli mov ss,ax mov sp,SaveSP sti xor ax,ax mov DPID,ax @@2: les di,CurRegs cld xor ax,ax mov cx,14 rep stosw pop bp ret ExitProgram endp end