www.pudn.com > tp60src.zip > 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