www.pudn.com > tp60src.zip > CODEGEN.ASM


	model	large compiler_text,pascal 
	include	compiler.inc 
 
	.code	compiler_text 
 
	public	LoadSegDI 
	public	PushFloat 
	public	PutFwait 
	public	PutEmulInt 
	public	Need8087 
	public	PushReal 
	public	LoadReal 
	public	ConvertOrdinal 
	public	Increment 
	public	PushValue 
	public	PutPush 
	public	FindEmptyReg 
	public	PopValue 
	public	Scale 
	public	BackScale 
	public	MakePtr 
	public	FreeRegs 
	public	LoadValue 
	public	StoreValue 
	public	SwapSegOfs 
	public	AllocStack 
	public	CreateLocalVar 
	public	SetBaseAndSize 
	public	PushSetAddr 
	public	PushWord 
	public	LoadReg 
	public	LoadWord 
	public	StoreReg 
	public	PutMovRMImm 
	public	PutArOpAX 
	public	PutArOp 
	public	PutLogOp 
	public	PutArOpImm 
	public	PutArOpRMImm 
	public	FloatAddOffset 
	public	AddOffset 
	public	PutFloatRM 
	public	PutRM 
	public	AddReg 
	public	PutPrefix 
 
LoadSegDI	proc	near 
	call	LoadDI 
	jmp	GetSegment 
LoadSegDI	endp 
 
LoadDI	proc	near 
	test	[di].exMisc,efBP 
	jz	@@1 
	mov	dx,388dh		; lea	di,... 
	jmp	AddReg 
@@1:	test	[di].exMisc,efDI 
	jz	@@3 
	test	[di].exMisc,efDS+efCS+efConst 
	jnz	@@2 
	cmp	[di].exOffset,0 
	je	@@5 
@@2:	mov	ax,0c781h		; add	di,... 
	Invoke	PutWord 
	jmp	short @@4 
@@3:	mov	al,0bfh			; mov	di,... 
	Invoke	PutByte 
@@4:	jmp	PutOffset 
@@5:	ret 
LoadDI	endp 
 
PushFloat	proc	near 
	cmp	[di].exLocation,elImmediate 
	jne	@@2 
	les	bx,[si].exType 
	mov	al,es:[bx].tdModifier 
	lea	bx,[di].exValue 
	push	ax 
	Invoke	Extended2Float 
	pop	ax 
	mov	bx,10 
	cmp	al,emExtended 
	je	@@1 
	mov	bl,8 
	cmp	al,emSingle 
	jne	@@1 
	mov	bl,4 
@@1:	dec	bx 
	dec	bx 
	mov	ax,word ptr [di+bx].exValue 
	push	bx 
	call	PushWord 
	pop	bx 
	or	bx,bx 
	jnz	@@1 
	Chain	DoneExpr 
@@2:	cmp	[di].exLocation,elMemory 
	jne	@@4 
	mov	al,[di].exModifier 
	les	bx,[si].exType 
	cmp	al,es:[bx].tdModifier 
	jne	@@3 
	mov	cx,es:[bx].tdSizeOf 
	Invoke	UseExpr 
	call	PushMemory 
	Chain	DoneExpr 
@@3:	Invoke	PushExt 
@@4:	Invoke	UseExpr 
	les	bx,[si].exType 
	mov	ax,es:[bx].tdSizeOf 
	mov	dl,0ech			; sub	sp,... 
	call	PutArOpImm 
	mov	ax,0e389h		; mov	bx,sp 
	Invoke	PutWord 
	call	PutEmulInt 
	mov	al,3ch 
	Invoke	PutByte 
	mov	ax,1f59h		; fstp	ss:[bx] 
	les	bx,[si].exType 
	or	al,es:[bx].tdModifier 
	test	al,2 
	jz	@@5 
	mov	ah,3fh 
@@5:	Invoke	PutWord 
	call	PutFwait 
	Chain	DoneExpr 
PushFloat	endp 
 
PutFwait	proc	near 
	mov	ax,3dcdh		; fwait 
	Chain	PutWord 
PutFwait	endp 
 
PutEmulInt	proc	near 
	call	Need8087 
	mov	al,0cdh			; int 
	Chain	PutByte 
PutEmulInt	endp 
 
Need8087	proc	near 
	test	CompilerOptions,co8087 
	jz	@@1 
	push	ds 
	mov	ds,Dictionary.Segm 
	or	ds:uhFlags,uf8087 
	pop	ds 
	ret 
@@1:	mov	ax,116 
	Chain	CompileError 
Need8087	endp 
 
PushReal	proc	near 
	Invoke	UseExpr 
	call	_PushReal 
	Chain	DoneExpr 
PushReal	endp 
 
_PushReal	proc	near 
	cmp	[di].exLocation,elMemory 
	jne	@@1 
	mov	cx,6 
	jmp	PushMemory 
@@1:	mov	al,lrR1 
	call	LoadReal 
	mov	ax,5352h		; push	dx	push	bx 
	Invoke	PutWord 
	mov	al,50h			; push	ax 
	Chain	PutByte 
_PushReal	endp 
 
LoadReal	proc	near 
	cmp	[di].exLocation,elRegister 
	je	@@1 
	mov	cl,al 
	mov	ax,lvAX+lvCX*256 
	call	ShiftReal 
	mov	ax,lvBX+lvSI*256 
	call	ShiftReal 
	mov	ax,lvDX+lvDI*256 
	call	ShiftReal 
	mov	[di].exLocation,elRegister 
@@1:	mov	[di].exRegsUsed,erAll 
	ret 
LoadReal	endp 
 
ShiftReal	proc	near 
	or	cl,cl 
	jz	@@1 
	mov	al,ah 
@@1:	call	LoadReg 
	cmp	[di].exLocation,elMemory 
	jne	@@2 
	add	[di].exOffset,2 
	ret 
@@2:	mov	ax,[di].exValue.W2 
	mov	[di].exValue.W0,ax 
	mov	ax,[di].exValue.W4 
	mov	[di].exValue.W2,ax 
	ret 
ShiftReal	endp 
 
ConvertOrdinal	proc	near 
	mov	cl,[di].exModifier 
	mov	ch,al 
	cmp	[di].exLocation,elImmediate 
	jne	@@3 
	mov	ax,[di].exValue.W0 
	mov	dx,[di].exValue.W2 
	test	ch,emX 
	jnz	@@1 
	cbw 
	test	ch,emUnsigned 
	jz	@@1 
	xor	ah,ah 
@@1:	test	ch,emXX 
	jnz	@@2 
	cwd 
	test	ch,emUnsigned 
	jz	@@2 
	xor	dx,dx 
@@2:	mov	[di].exValue.W0,ax 
	mov	[di].exValue.W2,dx 
	jmp	short @@7 
@@3:	xor	ax,ax 
	xor	dx,dx 
	test	ch,emX 
	jz	@@4 
	test	cl,emX 
	jnz	@@4 
	mov	al,98h			; cbw 
	test	cl,emUnsigned 
	jz	@@4 
	mov	ax,0e430h		; xor	ah,ah 
@@4:	test	ch,emXX 
	jz	@@5 
	test	cl,emXX 
	jnz	@@5 
	or	[di].exRegsUsed,erDX 
	mov	dl,99h			; cwd 
	test	cl,emUnsigned 
	jz	@@5 
	mov	dx,0d231h		; xor	dx,dx 
@@5:	mov	bx,ax 
	or	bx,dx 
	jnz	@@6 
	cmp	[di].exLocation,elAddress 
	jne	@@7 
	test	ch,emX 
	jnz	@@7 
@@6:	push	cx dx ax 
	Invoke	UseExpr 
	mov	al,lvAX 
	call	LoadValue 
	pop	ax 
	call	PutBytes 
	pop	ax 
	call	PutBytes 
	Invoke	DoneExpr 
	pop	cx 
@@7:	mov	[di].exModifier,ch 
	ret 
ConvertOrdinal	endp 
 
PutBytes	proc	near 
	or	ax,ax 
	jz	@@2 
	or	ah,ah 
	jz	@@1 
	Chain	PutWord 
@@1:	Chain	PutByte 
@@2:	ret 
PutBytes	endp 
 
Increment	proc	near 
	cmp	[si].exLocation,elImmediate 
	jne	@@3 
	Invoke	UseExpr 
	test	[di].exModifier,emXX 
	jnz	@@1 
	cmp	[si].exValue.W0,1 
	jne	@@1 
	cmp	[si].exValue.W2,0 
	jne	@@1 
	mov	dl,0feh			; inc 
	call	PutRM 
	Chain	DoneExpr 
@@1:	mov	ax,[si].exValue.W0 
	push	dx 
	call	PutArOpRMImm 
	pop	dx 
	test	[di].exModifier,emXX 
	jz	@@2 
	add	[di].exOffset,2 
	mov	ax,[si].exValue.W2 
	mov	dl,dh 
	or	dl,10h			; adc 
	call	PutArOpRMImm 
	sub	[di].exOffset,2 
@@2:	Chain	DoneExpr 
@@3:	push	dx 
	xchg	si,di 
	Invoke	UseExpr 
	mov	al,[si].exRegsUsed 
	call	FindEmptyReg 
	xchg	si,di 
	Invoke	UseExpr 
	xchg	si,di 
	xor	al,al 
	call	PopValue 
	xchg	si,di 
	pop	dx 
	mov	cl,dh 
	mov	dh,[si].exMisc 
	shl	dh,1 
	shl	dh,1 
	shl	dh,1 
	mov	ch,dh 
	call	PutRM 
	test	[di].exModifier,emXX 
	jz	@@4 
	add	[di].exOffset,2 
	mov	dx,cx 
	or	dx,1010h		; adc 
	call	PutRM 
	sub	[di].exOffset,2 
@@4:	Chain	DoneExpr 
Increment	endp 
 
PushValue	proc	near 
	Invoke	UseExpr 
	call	PutPush 
	Chain	DoneExpr 
PushValue	endp 
 
PutPush	proc	near 
	cmp	[di].exLocation,elMemory 
	jne	@@2 
	test	[di].exModifier,emX 
	jz	@@5 
	test	[di].exModifier,emXX 
	jz	@@1 
	add	[di].exOffset,2 
	mov	dx,30ffh		; push 
	call	AddReg 
	sub	[di].exOffset,2 
@@1:	mov	dx,30ffh		; push 
	call	AddReg 
	jmp	short @@13 
@@2:	cmp	[di].exLocation,elRegister 
	je	@@6 
	cmp	[di].exLocation,elAddress 
	je	@@8 
	test	CompilerOptions,co286Code 
	jz	@@5 
	test	[di].exModifier,emXX 
	jz	@@3 
	mov	ax,[di].exValue.W2 
	call	PushWord286 
@@3:	mov	ax,[di].exValue.W0 
	test	[di].exModifier,emX 
	jnz	@@4 
	cbw 
@@4:	call	PushWord286 
	jmp	short @@13 
@@5:	mov	al,lvAX 
	call	LoadValue 
@@6:	test	[di].exModifier,emXX 
	jz	@@7 
	mov	al,52h			; push	dx 
	Invoke	PutByte 
@@7:	mov	al,50h			; push	ax 
	Invoke	PutByte 
	jmp	short @@13 
@@8:	test	[di].exMisc,efSeg 
	jnz	@@9 
	call	LoadDI 
	test	[di].exModifier,emXX 
	jz	@@12 
@@9:	test	[di].exMisc,efDS+efSS+efCS+efES 
	jnz	@@10 
	mov	al,0b8h			; mov	ax, 
	call	LoadSegment 
	mov	al,50h			; push	ax 
	jmp	short @@11 
@@10:	call	GetPrefix 
	or	al,6			; push 
@@11:	Invoke	PutByte 
	test	[di].exModifier,emXX 
	jz	@@13 
@@12:	mov	al,57h			; push	di 
	Invoke	PutByte 
@@13:	mov	[di].exLocation,elPushed 
	ret 
PutPush	endp 
 
FindEmptyReg	proc	near 
	test	[di].exModifier,emXX 
	jnz	@@1 
	test	al,erAX 
	jz	@@2 
	test	al,erDX 
	jz	@@3 
	test	al,erCX 
	jz	@@4 
	test	al,erBX 
	jz	@@5 
	jmp	PutPush 
@@1:	test	al,erAX+erDX 
	jz	@@2 
	test	al,erCX+erBX 
	jz	@@4 
	jmp	PutPush 
@@2:	mov	al,lvAX 
	jmp	LoadValue 
@@3:	mov	al,lvDX 
	jmp	LoadValue 
@@4:	mov	al,lvCX 
	jmp	LoadValue 
@@5:	mov	al,lvBX 
	jmp	LoadValue 
FindEmptyReg	endp 
 
PopValue	proc	near 
	cmp	[di].exLocation,elPushed 
	jne	@@4 
	mov	[di].exLocation,elRegister 
	test	[di].exModifier,emXX 
	jnz	@@2 
	mov	ah,58h			; pop	ax 
	mov	cx,erAX+lvAX*256 
	test	al,cl 
	jz	@@1 
	mov	ah,5ah			; pop	dx 
	mov	cx,erDX+lvDX*256 
	test	al,cl 
	jz	@@1 
	mov	ah,59h			; pop	cx 
	mov	cx,erCX+lvCX*256 
	test	al,cl 
	jz	@@1 
	mov	ah,5bh			; pop	bx 
	mov	cx,erBX+lvBX*256 
@@1:	or	[di].exRegsUsed,cl 
	mov	[di].exMisc,ch 
	mov	al,ah 
	Chain	PutByte 
@@2:	mov	cx,erAX+erDX+lvAX*256 
	test	al,cl 
	mov	ax,5a58h		; pop	ax	pop	dx 
	jz	@@3 
	mov	cx,erCX+erBX+lvCX*256 
	mov	ax,5b59h		; pop	cx	pop	bx 
@@3:	or	[di].exRegsUsed,cl 
	mov	[di].exMisc,ch 
	Chain	PutWord 
@@4:	ret 
PopValue	endp 
 
Scale	proc	near 
	cmp	cx,1 
	jb	@@10 
	je	@@7 
	mov	bx,cx 
	mov	dx,-1 
@@1:	inc	dx 
	shr	bx,1 
	jnc	@@1 
	jz	@@8 
	cmp	cx,7 
	jae	@@10 
	mov	ch,al 
	push	cx 
	call	LoadValue 
	pop	cx 
	cmp	cl,6 
	jne	@@2 
	call	@@5 
@@2:	mov	ax,0f08bh		; mov	si, 
	call	@@6 
	call	@@5 
	cmp	cl,5 
	jne	@@3 
	call	@@5 
@@3:	mov	ax,0f001h		; add	,si 
	jmp	short @@6 
@@4:	call	@@5 
@@5:	mov	ax,0e0d1h		; shl	,1 
@@6:	or	ah,ch 
	Chain	PutWord 
@@7:	ret 
@@8:	mov	cl,dl 
	mov	ch,al 
	push	cx 
	call	LoadValue 
	pop	cx 
	cmp	cl,1 
	je	@@5 
	test	CompilerOptions,co286Code 
	jnz	@@9 
	cmp	cl,2 
	je	@@4 
	or	[di].exRegsUsed,erCX 
	mov	al,0b1h			; mov	cl, 
	mov	ah,cl 
	Invoke	PutWord 
	mov	ax,0e0d3h		; shl	ax,cl 
	jmp	@@6 
@@9:	mov	ax,0e0c1h		; shl	ax, 
	call	@@6 
	mov	al,cl 
	Chain	PutByte 
@@10:	test	CompilerOptions,co286Code 
	jnz	@@12 
	or	[di].exRegsUsed,erDX 
	cmp	[di].exLocation,elRegister 
	jne	@@11 
	cmp	[di].exMisc,lvAX 
	jne	@@11 
	mov	al,0bah			; mov	dx, 
	Invoke	PutByte 
	mov	ax,cx 
	Invoke	PutWord 
	mov	ax,0e2f7h		; mul	dx 
	Chain	PutWord 
@@11:	mov	al,0b8h			; mov	ax, 
	Invoke	PutByte 
	mov	ax,cx 
	Invoke	PutWord 
	mov	dx,20f7h		; mul 
	call	AddReg 
	mov	cl,lvAX 
	jmp	short @@15 
@@12:	push	ax 
	shl	al,1 
	shl	al,1 
	shl	al,1 
	mov	dh,al 
	mov	ax,cx 
	cbw 
	cmp	ax,cx 
	jz	@@13 
	mov	dl,69h			; imul 
	call	AddReg 
	mov	ax,cx 
	Invoke	PutWord 
	jmp	short @@14 
@@13:	mov	dl,6bh			; imul 
	call	AddReg 
	mov	al,cl 
	Invoke	PutByte 
@@14:	pop	cx 
@@15:	mov	al,1 
	shl	al,cl 
	mov	[di].exLocation,elRegister 
	mov	[di].exMisc,cl 
	or	[di].exRegsUsed,al 
	ret 
Scale	endp 
 
BackScale	proc	near 
	cmp	cx,1 
	je	@@9 
	mov	dx,0f9f7h		; idiv	cx 
	test	[di].exModifier,emSigned 
	jnz	@@6 
	mov	bx,cx 
	mov	dx,-1 
@@1:	inc	dx 
	shr	bx,1 
	jnc	@@1 
	jnz	@@5 
	cmp	dl,1 
	je	@@3 
	test	CompilerOptions,co286Code 
	jnz	@@4 
	cmp	dl,2 
	je	@@2 
	or	[di].exRegsUsed,erCX 
	mov	al,0b1h			; mov	cl, 
	mov	ah,dl 
	Invoke	PutWord 
	mov	ax,0e8d3h		; shr	ax,cl 
	Chain	PutWord 
@@2:	call	@@3 
@@3:	mov	ax,0e8d1h		; shr	ax,1 
	Chain	PutWord 
@@4:	mov	ax,0e8c1h		; shr	ax, 
	Invoke	PutWord 
	mov	al,dl 
	Chain	PutByte 
@@5:	mov	dx,0f1f7h		; div	cx 
	test	[di].exModifier,emUnsigned 
	jnz	@@7 
@@6:	mov	al,99h			; cwd 
	Invoke	PutByte 
	jmp	short @@8 
@@7:	mov	ax,0d231h		; xor	dx,dx 
	Invoke	PutWord 
@@8:	mov	al,0b9h			; mov	cx, 
	Invoke	PutByte 
	mov	ax,cx 
	Invoke	PutWord 
	mov	ax,dx 
	Invoke	PutWord 
	or	[di].exRegsUsed,erCX+erDX 
@@9:	ret 
BackScale	endp 
 
MakePtr	proc	near 
	mov	al,erAX 
	call	FreeRegs 
	xchg	si,di 
	mov	al,lvDX 
	call	LoadValue 
	xchg	si,di 
	ret 
MakePtr	endp 
 
FreeRegs	proc	near 
	test	[si].exRegsUsed,al 
	jnz	@@1 
	Invoke	UseExpr 
	mov	al,lvAX 
	call	LoadValue 
	xchg	si,di 
	Invoke	UseExpr 
	xchg	si,di 
	ret 
@@1:	push	ax 
	or	al,[di].exRegsUsed 
	push	ax 
	xchg	si,di 
	Invoke	UseExpr 
	pop	ax 
	call	FindEmptyReg 
	xchg	si,di 
	Invoke	UseExpr 
	mov	al,lvAX 
	call	LoadValue 
	xchg	si,di 
	pop	ax 
	call	PopValue 
	xchg	si,di 
	ret 
FreeRegs	endp 
 
LoadValue	proc	near 
	mov	cl,al 
	test	[di].exModifier,emXX 
	jz	@@1 
	call	LoadReg 
	mov	ax,2 
	call	SwapSegOfs 
	mov	al,cl 
	add	al,2 
	call	LoadReg 
	mov	al,erAX+erDX 
	jmp	short @@2 
@@1:	call	LoadReg 
	mov	al,erAX 
@@2:	shl	al,cl 
	mov	[di].exLocation,elRegister 
	or	[di].exRegsUsed,al 
	mov	[di].exMisc,cl 
	ret 
LoadValue	endp 
 
StoreValue	proc	near 
	mov	cl,al 
	call	StoreReg 
	test	[di].exModifier,emXX 
	jz	@@1 
	add	[di].exOffset,2 
	mov	al,cl 
	add	al,2 
	call	StoreReg 
	sub	[di].exOffset,2 
@@1:	ret 
StoreValue	endp 
 
SwapSegOfs	proc	near 
	cmp	[di].exLocation,elMemory 
	jne	@@1 
	add	[di].exOffset,ax 
	ret 
@@1:	cmp	[di].exLocation,elRegister 
	jne	@@2 
	add	[di].exMisc,al 
	ret 
@@2:	cmp	[di].exLocation,elImmediate 
	jne	@@3 
	mov	ax,[di].exValue.Offs 
	xchg	ax,[di].exValue.Segm 
	mov	[di].exValue.Offs,ax 
	ret 
@@3:	xor	[di].exMisc,efSeg 
	ret 
SwapSegOfs	endp 
 
AllocStack	proc	near 
	mov	bx,ax 
	mov	ax,TempLocalsSize 
	sub	ax,bx 
	test	CompilerOptions,coWordAlign 
	jz	@@1 
	cmp	bx,1 
	je	@@1 
	and	ax,0fffeh 
@@1:	mov	TempLocalsSize,ax 
	mov	bx,LocalsSize 
	or	bx,bx 
	jz	@@2 
	cmp	ax,bx 
	jae	@@3 
@@2:	mov	LocalsSize,ax 
@@3:	ret 
AllocStack	endp 
 
CreateLocalVar	proc	near 
	call	AllocStack 
	mov	dx,3e8dh		; lea	di, 
	call	AddOffset 
	mov	ax,5716h		; push	ss	push	di 
	Invoke	PutWord 
	mov	[di].exLocation,elStack 
	ret 
CreateLocalVar	endp 
 
SetBaseAndSize	proc	near 
	mov	al,es:[bx].tdSizeOf.B0 
	mov	cx,es:[bx].stBase.Offs 
	mov	bx,es:[bx].stBase.Segm 
	mov	es,es:[bx] 
	mov	bx,cx 
	mov	ah,es:[bx].itLowerBound.B0 
	mov	cl,3 
	shr	ah,cl 
	ret 
SetBaseAndSize	endp 
 
PushSetAddr	proc	near 
	call	SetBaseAndSize 
PushWord	label	near 
	test	CompilerOptions,co286Code 
	jnz	PushWord286 
	mov	dx,ax 
	mov	al,lvAX 
	call	LoadWord 
	mov	al,50h			; push	ax 
	Chain	PutByte 
PushSetAddr	endp 
 
PushWord286	proc	near 
	mov	dx,ax 
	cbw 
	cmp	ax,dx 
	jne	@@1 
	mov	ah,al 
	mov	al,6ah			; push 
	Chain	PutWord 
@@1:	mov	al,68h			; push 
	Invoke	PutByte 
	mov	ax,dx 
	Chain	PutWord 
PushWord286	endp 
 
PushMemory	proc	near 
	add	[di].exOffset,cx 
	shr	cx,1 
@@1:	sub	[di].exOffset,2 
	mov	dx,30ffh		; push 
	call	AddReg 
	loop	@@1 
	ret 
PushMemory	endp 
 
LoadReg	proc	near 
	cmp	[di].exLocation,elMemory 
	jne	@@2 
	cmp	al,lvAX 
	jne	@@3 
	test	[di].exMisc,efBP+efDI 
	jnz	@@3 
	call	PutPrefix 
	mov	al,0a1h			; mov	ax, 
	test	[di].exModifier,emX 
	jnz	@@1 
	mov	al,0a0h			; mov	al, 
@@1:	Invoke	PutByte 
	jmp	PutOffset 
@@2:	cmp	[di].exLocation,elRegister 
	jne	@@4 
	cmp	al,[di].exMisc 
	jne	@@3 
	ret 
@@3:	mov	dl,8ah			; mov 
	shl	al,1 
	shl	al,1 
	shl	al,1 
	mov	dh,al 
	jmp	PutRM 
@@4:	cmp	[di].exLocation,elAddress 
	jne	@@9 
	test	[di].exMisc,efSeg 
	jnz	@@7 
	test	[di].exMisc,efBP 
	jnz	@@6 
	test	[di].exMisc,efDI 
	jnz	@@5 
	test	[di].exMisc,efDS+efCS+efConst 
	jz	@@10 
	or	al,0b8h			; mov 
	Invoke	PutByte 
	jmp	PutOffset 
@@5:	test	[di].exMisc,efDS+efCS+efConst 
	jnz	@@6 
	cmp	[di].exOffset,0 
	jne	@@6 
	mov	dl,al 
	mov	ax,0f889h		; mov	,di 
	or	ah,dl 
	Chain	PutWord 
@@6:	mov	dl,8dh			; lea 
	shl	al,1 
	shl	al,1 
	shl	al,1 
	mov	dh,al 
	jmp	AddReg 
@@7:	test	[di].exMisc,efDS+efSS+efCS+efES 
	jz	@@8 
	mov	dl,al 
	call	GetPrefix 
	or	dl,al 
	mov	ax,0c08ch		; mov	ax, 
	or	ah,dl 
	Chain	PutWord 
@@8:	or	al,0b8h			; mov	ax, 
	jmp	LoadSegment 
@@9:	test	[di].exModifier,emX 
	jnz	@@10 
	or	al,0b0h			; mov	al, 
	mov	ah,[di].exValue.B0 
	Chain	PutWord 
@@10:	mov	dx,[di].exValue.W0 
LoadWord	label	near 
	or	dx,dx 
	jz	@@11 
	or	al,0b8h			; mov	ax, 
	Invoke	PutByte 
	mov	ax,dx 
	Chain	PutWord 
@@11:	mov	ah,0c0h 
	or	ah,al 
	shl	al,1 
	shl	al,1 
	shl	al,1 
	or	ah,al 
	mov	al,31h			; xor 
	Chain	PutWord 
LoadReg	endp 
 
StoreReg	proc	near 
	cmp	al,lvAX 
	jne	@@2 
	test	[di].exMisc,efBP+efDI 
	jnz	@@2 
	call	PutPrefix 
	mov	al,0a3h			; mov	,ax 
	test	[di].exModifier,emX 
	jnz	@@1 
	mov	al,0a2h			; mov	,al 
@@1:	Invoke	PutByte 
	jmp	PutOffset 
@@2:	mov	dl,88h			; mov 
	shl	al,1 
	shl	al,1 
	shl	al,1 
	mov	dh,al 
	jmp	PutRM 
StoreReg	endp 
 
PutMovRMImm	proc	near 
	mov	cx,ax 
	mov	dx,0c6h			; mov 
	call	PutRM 
	mov	ax,cx 
	test	[di].exModifier,emX 
	jz	@@1 
	Chain	PutWord 
@@1:	Chain	PutByte 
PutMovRMImm	endp 
 
PutArOpAX	proc	near 
	cmp	[di].exLocation,elImmediate 
	jne	@@2 
	mov	al,dl 
	test	[di].exModifier,emX 
	jz	@@1 
	or	al,5 
	Invoke	PutByte 
	mov	ax,[di].exValue.W0 
	Chain	PutWord 
@@1:	or	al,4 
	mov	ah,[di].exValue.B0 
	Chain	PutWord 
@@2:	or	dl,2 
	xor	dh,dh 
	jmp	PutRM 
PutArOpAX	endp 
 
PutArOp	proc	near 
	cmp	[di].exLocation,elImmediate 
	jne	@@1 
	mov	ax,[di].exValue.W0 
	or	dl,0c2h 
	jmp	PutArOpImm 
@@1:	or	dl,3 
	mov	dh,10h 
	jmp	AddReg 
PutArOp	endp 
 
PutLogOp	proc	near 
	cmp	[di].exLocation,elImmediate 
	jne	@@1 
	or	dl,0c2h 
	mov	ah,dl 
	mov	al,81h 
	Invoke	PutWord 
	mov	ax,[di].exValue.W0 
	Chain	PutWord 
@@1:	or	dl,3 
	mov	dh,10h 
	jmp	AddReg 
PutLogOp	endp 
 
PutArOpImm	proc	near 
	mov	cx,ax 
	cbw 
	cmp	ax,cx 
	jne	@@1 
	mov	ah,dl 
	mov	al,83h 
	Invoke	PutWord 
	mov	al,cl 
	Chain	PutByte 
@@1:	mov	ah,dl 
	mov	al,81h 
	Invoke	PutWord 
	mov	ax,cx 
	Chain	PutWord 
PutArOpImm	endp 
 
PutArOpRMImm	proc	near 
	mov	cx,ax 
	mov	dh,dl 
	mov	dl,80h 
	test	[di].exModifier,emX 
	jz	@@1 
	mov	dl,83h 
	cbw 
	cmp	cx,ax 
	je	@@1 
	mov	dl,81h 
	call	AddReg 
	mov	ax,cx 
	Chain	PutWord 
@@1:	call	AddReg 
	mov	al,cl 
	Chain	PutByte 
PutArOpRMImm	endp 
 
FloatAddOffset	proc	near 
	push	ax 
	call	PutEmulInt 
	pop	ax 
	sub	dl,0a4h 
AddOffset	label	near 
	mov	cl,dh 
	and	cl,7 
	cmp	cl,6 
	je	@@1 
	or	ax,ax 
	jnz	@@1 
	mov	ax,dx 
	Chain	PutWord 
@@1:	mov	cx,ax 
	cbw 
	cmp	ax,cx 
	jne	@@2 
	or	dh,40h 
	mov	ax,dx 
	Invoke	PutWord 
	mov	al,cl 
	Chain	PutByte 
@@2:	or	dh,80h 
	mov	ax,dx 
	Invoke	PutWord 
	mov	ax,cx 
	Chain	PutWord 
FloatAddOffset	endp 
 
PutFloatRM	proc	near 
	test	[di].exMisc,efDS+efBP 
	jz	@@1 
	call	PutEmulInt 
	sub	dl,0a4h 
	jmp	short @@3 
@@1:	call	GetSegment 
	push	ax 
	call	PutEmulInt 
	mov	al,3ch 
	Invoke	PutByte 
	pop	ax 
	shl	al,1 
	shl	al,1 
	shl	al,1 
	xor	dl,al 
	jmp	short @@3 
PutRM	label	near 
	test	[di].exModifier,emX 
	jz	AddReg 
	or	dl,1 
AddReg	label	near 
	cmp	[di].exLocation,elRegister 
	jne	@@2 
	or	dh,[di].exMisc 
	or	dh,0c0h 
	mov	ax,dx 
	Chain	PutWord 
@@2:	call	PutPrefix 
@@3:	mov	al,[di].exMisc 
	test	al,efBP 
	jnz	@@4 
	or	dh,6 
	test	al,efDI 
	jz	@@7 
	xor	dh,3 
	test	al,efDS+efCS+efConst 
	jnz	@@6 
	cmp	[di].exOffset,0 
	jne	@@5 
	mov	ax,dx 
	Chain	PutWord 
@@4:	or	dh,6 
	test	al,efDI 
	jz	@@5 
	xor	dh,5 
@@5:	mov	ax,[di].exOffset 
	cbw 
	cmp	ax,[di].exOffset 
	jne	@@6 
	or	dh,40h 
	mov	ax,dx 
	Invoke	PutWord 
	mov	ax,[di].exOffset 
	Chain	PutByte 
@@6:	or	dh,80h 
@@7:	mov	ax,dx 
	Invoke	PutWord 
PutOffset	label	near 
	test	[di].exMisc,efDS+efCS+efConst 
	jnz	@@8 
	mov	ax,[di].exOffset 
	Chain	PutWord 
@@8:	push	cx 
	mov	ax,[di].exSegment 
	mov	bx,[di].exMap 
	mov	dx,[di].exOffset 
	test	[di].exMisc,efDS 
	jnz	@@9 
	mov	cx,ffCode+ffOffs 
	test	[di].exMisc,efCS 
	jnz	@@10 
	mov	cx,ffProc+ffOffs 
	jmp	short @@10 
@@9:	mov	cx,ffConst+ffOffs 
	test	[di].exMisc,efConst 
	jnz	@@10 
	mov	cx,ffData+ffOffs 
@@10:	Invoke	PutFixup 
	pop	cx 
	ret 
PutFloatRM	endp 
 
PutPrefix	proc	near 
	test	[di].exMisc,efDS+efBP 
	jnz	@@1 
	call	GetSegment 
	or	al,26h 
	Chain	PutByte 
@@1:	ret 
PutPrefix	endp 
 
GetSegment	proc	near 
	test	[di].exMisc,efDS+efSS+efCS+efES 
	jnz	GetPrefix 
	mov	al,0beh			; mov	si, 
	call	LoadSegment 
	mov	ax,0c68eh		; mov	,si 
	Invoke	PutWord 
	mov	al,0 
	ret 
GetSegment	endp 
 
GetPrefix	proc	near 
	mov	al,[di].exMisc 
	mov	ah,18h 
	test	al,efDS 
	jnz	@@1 
	mov	ah,10h 
	test	al,efSS 
	jnz	@@1 
	mov	ah,08h 
	test	al,efCS 
	jnz	@@1 
	mov	ah,0 
@@1:	mov	al,ah 
	ret 
GetPrefix	endp 
 
LoadSegment	proc	near 
	Invoke	PutByte 
	test	[di].exMisc,efConst 
	jz	@@1 
	push	cx dx 
	mov	ax,[di].exSegment 
	mov	bx,[di].exMap 
	mov	cx,ffSegm 
	xor	dx,dx 
	Invoke	PutFixup 
	pop	dx cx 
	ret 
@@1:	mov	ax,[di].exMap 
	Chain	PutWord 
LoadSegment	endp 
 
	end