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


	model	large compiler_text,pascal 
	include	compiler.inc 
 
	.code	compiler_text 
 
	public	CompoundStmt 
	public	ProcessInline 
	public	PutInline 
 
Statement	proc	near 
	mov	ax,GlobalOptions 
	mov	CompilerOptions,ax 
	Invoke	Number2Ident 
	Invoke	GetSymbol 
	lea	bx,@@3 
	Invoke	ChooseToken 
	jnz	@@2 
	Invoke	GetLineNumber 
	push	ax TempLocalsSize 
	call	word ptr cs:[bx+1] 
	pop	TempLocalsSize dx 
	or	dx,dx 
	jz	@@1 
	xchg	ax,dx 
	Invoke	PutLineNumber 
	xchg	ax,dx 
	Invoke	UseGoal 
	Invoke	DoneGoal 
@@1:	mov	bl,1 
	ret 
@@2:	xor	ax,ax 
	xor	bx,bx 
	ret 
@@3	db	22,3 
	db	t_Var 
	dw	Assignment 
	db	t_Proc 
	dw	Assignment 
	db	t_StdProc 
	dw	ProcedureCall 
	db	tBegin 
	dw	CompoundStmt 
	db	tIf 
	dw	IfStatement 
	db	tWhile 
	dw	WhileStatement 
	db	tRepeat 
	dw	RepeatStatement 
	db	tFor 
	dw	ForStatement 
	db	tCase 
	dw	CaseStatement 
	db	tWith 
	dw	WithStatement 
	db	tGoto 
	dw	GotoStatement 
	db	t_Label 
	dw	_Label 
	db	tAsm 
	dw	AsmStatement 
	db	tInline 
	dw	InlineStatement 
	db	t_New 
	dw	ProcedureCall 
	db	t_Type 
	dw	Assignment 
	db	tString 
	dw	Assignment 
	db	tFile 
	dw	Assignment 
	db	t_StdFun 
	dw	Assignment 
	db	tAt 
	dw	Assignment 
	db	t_Mem 
	dw	Assignment 
	db	t_Port 
	dw	PortAssignment 
Statement	endp 
 
ProcedureCall	proc	near 
	Chain	StdProcedure 
ProcedureCall	endp 
 
AsmStatement	proc	near 
	Chain	AsmClause 
AsmStatement	endp 
 
_Label	proc	near 
	Invoke	GetHash 
	les	di,CurrentSymbol 
	cmp	di,si 
	jb	@@1 
	cmp	es:[di].lsLink,0 
	jne	@@2 
	dec	es:[di].lsLink 
	Invoke	GetToken 
	mov	al,tColon 
	Invoke	NeedToken 
	push	es di 
	call	Statement 
	push	ax 
	mov	ax,3 
	Invoke	GetStmtMem 
	mov	al,12 
	stosb 
	mov	bx,di 
	pop	ax di es 
	mov	es:[di],bx 
	Invoke	UseGoal 
	Chain	DoneGoal 
@@1:	mov	ax,80 
	Chain	CompileError 
@@2:	mov	ax,81 
	Chain	CompileError 
_Label	endp 
 
CompoundStmt	proc	near 
	mov	ax,tBegin+tEnd*256 
Closure	label	near 
	Loc	FinToken,byte,1 
	Loc	WasStmt,byte,1 
	Loc	Buffer,word,64 
	Entry 
	mov	FinToken,ah 
	Invoke	NeedToken 
	mov	Buffer[0],0 
@@1:	call	Statement 
	mov	WasStmt,bl 
	lea	bx,Buffer 
	Invoke	AddGoal 
	mov	al,CurrentToken 
	cmp	al,FinToken 
	je	@@2 
	cmp	al,tSemicolon 
	jne	@@3 
	Invoke	GetToken 
	jmp	@@1 
@@2:	lea	bx,Buffer 
	Invoke	FlushGoals 
	Invoke	GetLineNumber 
	Invoke	PutLineNumber 
	Invoke	DoneGoal 
	Invoke	GetToken 
	Exit 
@@3:	mov	ax,85 
	cmp	WasStmt,0 
	jne	@@4 
	mov	ax,113 
@@4:	Chain	CompileError 
CompoundStmt	endp 
 
IfStatement	proc	near 
	Loc	Condition,byte, 
	Loc	ThenGoal,word,1 
	Loc	ElseGoal,word,1 
	Loc	EndLabel,word,1 
	Entry 
	Invoke	GetToken 
	mov	ElseGoal,0 
	mov	EndLabel,0 
	lea	di,Condition 
	Invoke	GetBooleanExpr 
	mov	ax,tThen 
	Invoke	NeedToken 
	call	Statement 
	mov	ThenGoal,ax 
	mov	al,tElse 
	Invoke	CheckToken 
	jnz	@@1 
	call	Statement 
	mov	ElseGoal,ax 
@@1:	cmp	Condition.exLocation,elImmediate 
	jne	@@2 
	mov	ax,ThenGoal 
	cmp	Condition.exValue.B0,0 
	jne	@@4 
	mov	ax,ElseGoal 
	jmp	short @@4 
@@2:	mov	ax,Condition.exCode 
	Invoke	UseGoal 
	mov	ax,ThenGoal 
	Invoke	UseGoal 
	cmp	ElseGoal,0 
	je	@@3 
	mov	al,cdAlways 
	lea	bx,EndLabel 
	Invoke	PutJmp 
@@3:	lea	bx,Condition.exChain2 
	Invoke	PutLabel 
	mov	ax,ElseGoal 
	Invoke	UseGoal 
	lea	bx,EndLabel 
	Invoke	PutLabel 
	Invoke	DoneGoal 
@@4:	Exit 
IfStatement	endp 
 
WhileStatement	proc	near 
	Loc	Condition,byte  
	Loc	EndLabel,word,1 
	Entry 
	Invoke	GetToken 
	mov	EndLabel,0 
	lea	di,Condition 
	Invoke	GetBooleanExpr 
	mov	ax,tDo 
	Invoke	NeedToken 
	call	Statement 
	cmp	Condition.exLocation,elImmediate 
	jne	@@2 
	cmp	Condition.exValue.B0,0 
	jne	@@1 
	xor	ax,ax 
	jmp	short @@3 
@@1:	mov	Condition.exChain2,0 
@@2:	Invoke	UseGoal 
	mov	al,cdAlways 
	lea	bx,EndLabel 
	Invoke	PutJmp 
	Invoke	DoneGoal 
	push	ax 
	lea	bx,EndLabel 
	Invoke	PutLabel 
	mov	ax,Condition.exCode 
	Invoke	UseGoal 
	pop	ax 
	Invoke	UseGoal 
	lea	bx,Condition.exChain2 
	Invoke	PutLabel 
	Invoke	DoneGoal 
@@3:	Exit 
WhileStatement	endp 
 
RepeatStatement	proc	near 
	Loc	Condition,byte, 
	Loc	Body,word,1 
	Entry 
	mov	ax,tRepeat+tUntil*256 
	call	Closure 
	mov	Body,ax 
	lea	di,Condition 
	Invoke	GetBooleanExpr 
	cmp	Condition.exLocation,elImmediate 
	jne	@@1 
	mov	ax,Body 
	cmp	Condition.exValue.B0,0 
	jne	@@2 
	mov	Condition.exChain2,0 
	mov	al,cdAlways 
	lea	bx,Condition.exChain2 
	Invoke	PutJmp 
	Invoke	DoneGoal 
	mov	Condition.exCode,ax 
@@1:	lea	bx,Condition.exChain2 
	Invoke	PutLabel 
	mov	ax,Body 
	Invoke	UseGoal 
	mov	ax,Condition.exCode 
	Invoke	UseGoal 
	Invoke	DoneGoal 
@@2:	Exit 
RepeatStatement	endp 
 
ForStatement	proc	near 
	Loc	ControlVar,byte, 
	Loc	LowerBound,byte, 
	Loc	UpperBound,byte, 
	Loc	X,byte, 
	Loc	Y,byte, 
	Loc	Z,byte, 
	Loc	Action,word,1 
	Loc	Body,word,1 
	Loc	SmartLabel,word,1 
	Entry 
	Invoke	GetToken 
	mov	SmartLabel,0 
	lea	di,ControlVar 
	Invoke	GetReference 
	les	bx,[di].exType 
	cmp	es:[bx].tdType,ttInteger 
	jb	@@1 
	test	[di].exMisc,efDS+efSS 
	jz	@@1 
	test	[di].exMisc,efDI 
	jz	@@2 
@@1:	mov	ax,97 
	Chain	CompileError 
@@2:	mov	ax,tAssign 
	Invoke	NeedToken 
	lea	di,LowerBound 
	call	GetBound 
	lea	bx,ToDownto 
	Invoke	ChooseToken 
	jz	@@3 
	mov	ax,58 
	Chain	CompileError 
@@3:	mov	Action,bx 
	Invoke	GetToken 
	lea	di,UpperBound 
	call	GetBound 
	cmp	LowerBound.exLocation,elImmediate 
	jne	@@4 
	cmp	UpperBound.exLocation,elImmediate 
	je	@@5 
@@4:	lea	di,LowerBound 
	Invoke	UseExpr 
	mov	al,lvAX 
	Invoke	LoadValue 
	Invoke	DoneExpr 
	cmp	UpperBound.exLocation,elImmediate 
	je	@@5 
	lea	di,UpperBound 
	Invoke	CreateTempInt 
	mov	[di].exRegsUsed,0 
@@5:	mov	ax,tDo 
	Invoke	NeedToken 
	call	Statement 
	mov	Body,ax 
	lea	di,X 
	lea	si,LowerBound 
	call	CopyExpr 
	lea	di,Z 
	lea	si,UpperBound 
	call	CopyExpr 
	lea	di,X 
	lea	si,Z 
	mov	bx,Action 
	mov	al,cs:[bx+1] 
	call	Compare 
	lea	di,Y 
	lea	si,ControlVar 
	call	CopyExpr 
	lea	di,Z 
	lea	si,UpperBound 
	call	CopyExpr 
	lea	di,Y 
	lea	si,Z 
	mov	al,opNotEqual 
	call	Compare 
	lea	di,Z 
	lea	si,LowerBound 
	call	CopyExpr 
	lea	di,ControlVar 
	lea	si,Z 
	Invoke	Store 
	cmp	X.exLocation,elImmediate 
	jne	@@7 
	cmp	X.exValue.B0,0 
	je	@@6 
	xor	ax,ax 
	jmp	short @@8 
@@6:	mov	X.exValue.W0,0 
@@7:	mov	ax,UpperBound.exCode 
	Invoke	UseGoal 
	mov	ax,LowerBound.exCode 
	Invoke	UseGoal 
	mov	ax,X.exCode 
	Invoke	UseGoal 
	mov	ax,ControlVar.exCode 
	Invoke	UseGoal 
	mov	al,cdAlways 
	lea	bx,SmartLabel 
	Invoke	PutJmp 
	lea	bx,Y.exChain1 
	Invoke	PutLabel 
	call	AdvanceVar 
	lea	bx,SmartLabel 
	Invoke	PutLabel 
	mov	ax,Body 
	Invoke	UseGoal 
	mov	ax,Y.exCode 
	Invoke	UseGoal 
	lea	bx,X.exChain1 
	Invoke	PutLabel 
	Invoke	DoneGoal 
@@8:	Exit 
 
CopyExpr	proc	near 
	mov	cx,size TExpr shr 1 
	push	ds 
	pop	es 
	rep	movsw 
	mov	[di-size TExpr].exCode,cx 
	ret 
CopyExpr	endp 
 
GetBound	proc	near 
	Invoke	GetExpr 
	lea	si,ControlVar 
	Invoke	TypeCompat 
	Chain	CastOrdinal 
GetBound	endp 
 
Compare	proc	near 
	Invoke	Operation 
	cmp	[di].exLocation,elImmediate 
	je	@@1 
	Invoke	UseExpr 
	mov	al,[di].exMisc 
	lea	bx,[di].exChain1 
	Invoke	PutJmp 
	lea	bx,[di].exChain2 
	Invoke	PutLabel 
	Chain	DoneExpr 
@@1:	ret 
Compare	endp 
 
AdvanceVar	proc	near 
	lea	di,ControlVar 
	mov	si,Action 
	test	[di].exModifier,emXX 
	jnz	@@1 
	mov	dl,0feh 
	mov	dh,cs:[si+2] 
	Chain	PutRM 
@@1:	mov	ax,1 
	mov	dl,cs:[si+3] 
	Invoke	PutArOpRMImm 
	add	[di].exOffset,2 
	xor	ax,ax 
	mov	dl,cs:[si+4] 
	Invoke	PutArOpRMImm 
	sub	[di].exOffset,2 
	ret 
AdvanceVar	endp 
 
ToDownto	db	2,5 
		db	tTo 
		db	opGreater 
		db	0		; inc 
		db	0		; add 
		db	10h		; adc 
		db	tDownTo 
		db	opLess 
		db	8		; dec 
		db	28h		; sub 
		db	18h		; sbb 
ForStatement	endp 
 
CaseStatement	proc	near 
	Loc	CaseLabel,word,1 
	Loc	NextLabel,word,1 
	Loc	EndLabel,word,1 
	Loc	BaseType,dword,1 
	Loc	CaseExpr,byte, 
	Loc	CaseConst,byte, 
	Loc	Buffer,word,64 
	Entry 
	Invoke	GetToken 
	xor	ax,ax 
	mov	CaseLabel,ax 
	mov	NextLabel,ax 
	mov	EndLabel,ax 
	mov	Buffer[0],ax 
	lea	di,CaseExpr 
	Invoke	GetOrdExpr 
	mov	si,es:[bx].itBase.Offs 
	mov	bx,es:[bx].itBase.Segm 
	mov	es,es:[bx] 
	mov	BaseType.Offs,si 
	mov	BaseType.Segm,es 
	test	[di].exModifier,emXX 
	jz	@@1 
	Invoke	CastInt 
@@1:	Invoke	UseExpr 
	mov	al,lvAX 
	Invoke	LoadValue 
	Invoke	DoneGoal 
	lea	bx,Buffer 
	Invoke	AddGoal 
	mov	al,tOf 
	Invoke	NeedToken 
@@2:	call	Case 
	Invoke	DoneGoal 
	lea	bx,Buffer 
	Invoke	AddGoal 
	call	Statement 
	lea	bx,Buffer 
	Invoke	AddGoal 
	mov	al,tSemicolon 
	Invoke	CheckToken 
	jnz	@@3 
	cmp	CurrentToken,tEnd 
	je	@@3 
	cmp	CurrentToken,tElse 
	je	@@3 
	mov	al,cdAlways 
	lea	bx,EndLabel 
	Invoke	PutJmp 
	lea	bx,NextLabel 
	Invoke	PutLabel 
	jmp	@@2 
@@3:	mov	al,tElse 
	Invoke	CheckToken 
	jnz	@@5 
	mov	al,cdAlways 
	lea	bx,EndLabel 
	Invoke	PutJmp 
	lea	bx,NextLabel 
	Invoke	PutLabel 
	Invoke	DoneGoal 
	lea	bx,Buffer 
	Invoke	AddGoal 
@@4:	call	Statement 
	lea	bx,Buffer 
	Invoke	AddGoal 
	cmp	CurrentToken,tEnd 
	je	@@5 
	mov	al,tSemicolon 
	Invoke	NeedToken 
	jmp	@@4 
@@5:	mov	al,tEnd 
	Invoke	NeedToken 
	lea	bx,Buffer 
	Invoke	FlushGoals 
	lea	bx,EndLabel 
	mov	ax,NextLabel 
	Invoke	AddToChain 
	lea	bx,EndLabel 
	Invoke	PutLabel 
	Invoke	DoneGoal 
	Exit 
 
Case	proc	near 
	Invoke	GetLineNumber 
	Invoke	PutLineNumber 
@@1:	call	CaseConstant 
	mov	dl,cdEqual 
	mov	al,tRange 
	Invoke	CheckToken 
	jnz	@@3 
	mov	al,cdLess 
	mov	dl,cdNotGreater 
	test	CaseExpr.exModifier,emUnsigned 
	jz	@@2 
	mov	al,cdBelow 
	mov	dl,cdNotAfter 
@@2:	push	dx 
	lea	bx,NextLabel 
	Invoke	PutJmp 
	call	CaseConstant 
	pop	dx 
@@3:	mov	al,tComma 
	Invoke	CheckToken 
	jnz	@@4 
	mov	al,dl 
	lea	bx,CaseLabel 
	Invoke	PutJmp 
	lea	bx,NextLabel 
	Invoke	PutLabel 
	jmp	@@1 
@@4:	mov	al,dl 
	xor	al,1 
	lea	bx,NextLabel 
	Invoke	PutJmp 
	lea	bx,CaseLabel 
	Invoke	PutLabel 
	mov	al,tColon 
	Chain	NeedToken 
Case	endp 
 
CaseConstant	proc	near 
	lea	di,CaseConst 
	Invoke	GetConstExpr 
	cmp	bx,BaseType.Offs 
	jnz	@@2 
	mov	ax,es 
	cmp	ax,BaseType.Segm 
	jnz	@@2 
	mov	al,CaseExpr.exModifier 
	mov	ah,[di].exModifier 
	Invoke	IntExtension 
	cmp	al,CaseExpr.exModifier 
	jne	@@3 
	test	al,emX 
	jz	@@1 
	mov	al,3dh			; cmp	ax, 
	Invoke	PutByte 
	mov	ax,[di].exValue.W0 
	Chain	PutWord 
@@1:	mov	al,3ch			; cmp	al, 
	mov	ah,[di].exValue.B0 
	Chain	PutWord 
@@2:	mov	ax,74 
	Chain	CompileError 
@@3:	mov	ax,112 
	Chain	CompileError 
CaseConstant	endp 
 
CaseStatement	endp 
 
WithStatement	proc	near 
	Loc	SaveWithChain,word,1 
	Loc	WithVar,byte, 
	Loc	Buffer,word,32 
	Entry 
	Invoke	GetToken 
	mov	ax,WithChain 
	mov	SaveWithChain,ax 
	mov	Buffer[0],0 
@@1:	lea	di,WithVar 
	Invoke	GetReference 
	les	bx,[di].exType 
	cmp	es:[bx].tdType,ttRecord 
	je	@@2 
	cmp	es:[bx].tdType,ttObject 
	je	@@2 
	mov	ax,75 
	Chain	CompileError 
@@2:	sub	sp,size TWithChain 
	mov	si,sp 
	mov	ax,WithChain 
	mov	[si].wcNext,ax 
	mov	WithChain,si 
	mov	[si].wcOwner.Offs,bx 
	mov	[si].wcOwner.Segm,es 
	mov	al,[di].exMisc 
	test	al,efDS+efSS 
	jz	@@3 
	test	al,efDI 
	jnz	@@3 
	mov	[si].wcType,wfNoTempVar 
	mov	[si].wcFlags,al 
	mov	ax,[di].exOffset 
	mov	[si].wcOffset,ax 
	mov	ax,[di].exMap 
	mov	[si].wcMap,ax 
	mov	ax,[di].exSegment 
	mov	[si].wcSegment,ax 
	jmp	short @@4 
@@3:	mov	ax,4 
	Invoke	AllocStack 
	mov	[si].wcType,wfTempVar 
	mov	[si].wcFlags,efSS+efBP 
	mov	[si].wcOffset,ax 
	xor	ax,ax 
	mov	[si].wcMap,ax 
	mov	[si].wcSegment,ax 
	Invoke	UseExpr 
	Invoke	LoadSegDI 
	push	ax 
	mov	dx,3e89h		; mov	[bp-...],di 
	mov	ax,[si].wcOffset 
	Invoke	AddOffset 
	pop	ax 
	mov	dx,68ch			; mov	[bp-...],es 
	or	dh,al 
	mov	ax,[si].wcOffset 
	add	ax,2 
	Invoke	AddOffset 
	Invoke	DoneGoal 
	lea	bx,Buffer 
	Invoke	AddGoal 
@@4:	mov	al,tComma 
	Invoke	CheckToken 
	jnz	@@5 
	jmp	@@1 
@@5:	mov	al,tDo 
	Invoke	NeedToken 
	call	Statement 
	lea	bx,Buffer 
	Invoke	AddGoal 
	mov	ax,SaveWithChain 
	mov	WithChain,ax 
	lea	bx,Buffer 
	Invoke	FlushGoals 
	Invoke	DoneGoal 
	Exit 
WithStatement	endp 
 
GotoStatement	proc	near 
	Invoke	GetToken 
	Invoke	Number2Ident 
	Invoke	GetSymbol 
	mov	al,t_Label 
	Invoke	NeedToken 
	Invoke	GetHash 
	mov	dx,CurrentHash 
	cmp	dx,si 
	jb	@@1 
	mov	ax,8 
	Invoke	GetStmtMem 
	push	di 
	mov	ax,0eb08h 
	stosw 
	mov	ax,dx 
	stosw 
	pop	ax 
	xchg	ax,LabelChain 
	stosw 
	Chain	DoneGoal 
@@1:	mov	ax,80 
	Chain	CompileError 
GotoStatement	endp 
 
InlineStatement	proc	near 
	Invoke	GetToken 
	push	Dictionary.Offs 
	call	ProcessInline 
	call	PutInline 
	pop	Dictionary.Offs 
	Chain	DoneGoal 
InlineStatement	endp 
 
ProcessInline	proc	near 
	Loc	Temp,byte, 
	Entry 
	push	Dictionary.Offs 
	mov	SlashToken,tInlineSlash 
	mov	al,tOParen 
	Invoke	NeedToken 
@@1:	mov	al,tGreater 
	Invoke	CheckToken 
	mov	al,itWord 
	jz	@@2 
	mov	al,tLess 
	Invoke	CheckToken 
	mov	al,itByte 
	jz	@@2 
	mov	al,-1 
@@2:	mov	Temp.irType,al 
	Invoke	GetSymbol 
	cmp	CurrentToken,t_Var 
	jne	@@7 
	les	di,CurrentSymbol 
@@3:	test	es:[di].vsFlags,vfAlias 
	jz	@@4 
	mov	bx,es:[di].vsLink.Segm 
	mov	di,es:[di].vsLink.Offs 
	mov	es,es:[bx] 
	jmp	@@3 
@@4:	mov	al,es:[di].vsFlags 
	test	al,vfLocal 
	jnz	@@5 
	cmp	Temp.irType,0 
	je	@@6 
	and	al,vfConst+vfLocal 
	add	al,itDataFixup 
	mov	Temp.irType,al 
	mov	ax,es:[di].vsScope 
	mov	Temp.irFixup.Offs,ax 
	mov	dx,es 
	Invoke	SearchUnit 
	mov	Temp.irFixup.Segm,dx 
@@5:	mov	ax,es:[di].vsOffset 
	jmp	short @@8 
@@6:	mov	ax,105 
	Chain	CompileError 
@@7:	cmp	CurrentToken,t_Proc 
	jne	@@11 
	Invoke	GetReturnVar 
	jc	@@11 
@@8:	mov	Temp.irValue,ax 
	cmp	Temp.irType,0 
	jge	@@9 
	mov	Temp.irType,itWord 
@@9:	Invoke	GetToken 
	Invoke	GetPlusMinus 
	or	al,al 
	jz	@@12 
	push	ax 
	Invoke	GetIntConstExpr 
	pop	cx 
	cmp	cl,tMinus 
	jne	@@10 
	neg	ax 
@@10:	add	Temp.irValue,ax 
	jmp	short @@12 
@@11:	Invoke	GetIntConstExpr 
	mov	Temp.irValue,ax 
@@12:	mov	al,Temp.irType 
	cmp	al,-1 
	jne	@@14 
	mov	al,itByte 
	cmp	Temp.irValue.B1,0 
	je	@@13 
	mov	al,itWord 
@@13:	mov	Temp.irType,al 
@@14:	mov	cl,al 
	add	cl,2 
	cmp	al,itDataFixup 
	jb	@@15 
	mov	cl,7 
@@15:	xor	ch,ch 
	mov	ax,cx 
	Invoke	GetDictMem 
	lea	si,Temp 
	rep	movsb 
	mov	al,tInlineSlash 
	Invoke	CheckToken 
	jnz	@@16 
	jmp	@@1 
@@16:	mov	SlashToken,tSlash 
	mov	al,tCParen 
	Invoke	NeedToken 
	pop	di 
	les	cx,Dictionary 
	sub	cx,di 
	Exit 
ProcessInline	endp 
 
PutInline	proc	near 
	add	cx,di 
	jmp	short @@6 
@@1:	push	cx 
	mov	al,es:[di].irType 
	cmp	al,itByte 
	je	@@4 
	cmp	al,itWord 
	je	@@3 
	mov	cx,ffData+ffOffs 
	cmp	al,itDataFixup 
	je	@@2 
	mov	cx,ffConst+ffOffs 
@@2:	mov	bx,es:[di].irFixup.Segm 
	mov	ax,es:[bx] 
	mov	bx,es:[di].irFixup.Offs 
	mov	dx,es:[di].irValue 
	Invoke	PutFixup 
	add	di,7 
	jmp	short @@5 
@@3:	mov	ax,es:[di].irValue 
	Invoke	PutWord 
	add	di,3 
	jmp	short @@5 
@@4:	mov	al,es:[di].irValue.B0 
	Invoke	PutByte 
	inc	di 
	inc	di 
@@5:	pop	cx 
@@6:	cmp	di,cx 
	jne	@@1 
	ret 
PutInline	endp 
 
PortAssignment	proc	near 
	Loc	Opcode,byte,2 
	Loc	PortNum,byte, 
	Loc	Value,byte, 
	Entry 
	Invoke	GetToken 
	les	si,CurrentSymbol 
	mov	al,0e6h			; out	...,al 
	add	al,es:[si] 
	mov	Opcode,al 
	mov	al,tOBracket 
	Invoke	NeedToken 
	lea	di,PortNum 
	Invoke	GetIntExpr 
	Invoke	CastWord 
	mov	al,tCBracket 
	Invoke	NeedToken 
	mov	al,tAssign 
	Invoke	NeedToken 
	lea	di,Value 
	Invoke	GetIntExpr 
	test	Opcode,1 
	jz	@@1 
	Invoke	CastWord 
	jmp	short @@2 
@@1:	Invoke	CastByte 
@@2:	lea	si,PortNum 
	cmp	[si].exLocation,elImmediate 
	jne	@@3 
	cmp	[si].exValue.B1,0 
	jne	@@3 
	Invoke	UseExpr 
	mov	al,lvAX 
	Invoke	LoadValue 
	mov	al,Opcode 
	mov	ah,[si].exValue.B0 
	Invoke	PutWord 
	jmp	short @@4 
@@3:	Invoke	MakePtr 
	mov	al,Opcode 
	or	al,8 
	Invoke	PutByte 
@@4:	Invoke	DoneGoal 
	Exit 
PortAssignment	endp 
 
Assignment	proc	near 
	Loc	Left,byte, 
	Loc	Right,byte, 
	Entry 
	lea	di,Left 
	Invoke	GetLvalue 
@@1:	les	bx,[di].exType 
	cmp	es:[bx].tdType,ttProc 
	jne	@@3 
	cmp	[di].exLocation,elCall 
	je	@@2 
	cmp	CurrentToken,tAssign 
	je	@@4 
@@2:	Invoke	PutCall 
	les	bx,[di].exType 
	cmp	es:[bx].ptResult.Offs,0 
	je	@@5 
	Invoke	ReturnValue 
	Invoke	Qualifier 
	jz	@@1 
	test	GlobalOptions,coExtSyntax 
	jz	@@4 
	cmp	CurrentToken,tAssign 
	je	@@4 
	Invoke	DiscardReturn 
	jmp	short @@5 
@@3:	Invoke	Qualifier 
	jz	@@1 
@@4:	cmp	[di].exLocation,elMemory 
	jne	@@6 
	test	[di].exMisc,efReadOnly 
	jnz	@@6 
	les	bx,[di].exType 
	mov	al,es:[bx].tdType 
	cmp	al,ttVoid 
	je	@@7 
	cmp	al,ttFile 
	je	@@7 
	cmp	al,ttText 
	je	@@7 
	mov	al,tAssign 
	Invoke	NeedToken 
	lea	di,Right 
	lea	si,Left 
	Invoke	GetExpression 
	lea	si,Left 
	Invoke	AssignmentCast 
	Invoke	TypeCompat 
	Invoke	CastOrdinal 
	xchg	si,di 
	Invoke	Store 
@@5:	mov	ax,[di].exCode 
	Exit 
@@6:	mov	ax,122 
	Chain	CompileError 
@@7:	mov	ax,43 
	Chain	CompileError 
Assignment	endp 
 
	end