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


	model	large compiler_text,pascal 
	include	compiler.inc 
 
	.data 
SelfStr		db	4,'SELF' 
PrivateStr	db	7,'PRIVATE' 
FirstOnConst	db	0 
FirstOnData	db	0 
 
	.data? 
 
ForwardTypes	dw	? 
NameListPtr	dw	? 
PrevField	dw	? 
ConstPtr	dw	? 
DummyCount	dw	? 
FirstVar	dw	? 
VarCount	dw	? 
VarSize		dw	? 
TempStub	TVarStub	<> 
 
	.code	compiler_text 
 
	public	DeclarationPart 
	public	CheckUndefs 
	public	Number2Ident 
	public	StackRequired 
	public	ParamSize 
	public	FlushProcMap 
	public	FlushCodeMap 
	public	FlushConstMap 
	public	FlushDataMap 
	public	GetTypeName 
	public	SearchUnit 
	public	GetConstExpr 
	public	GetIntConstExpr 
	public	FitConstType 
	public	IntExtension 
 
DeclarationPart	proc	near 
@@1:	mov	ax,GlobalOptions 
	mov	CompilerOptions,ax 
	lea	bx,@@4 
	Invoke	ChooseToken 
	jz	@@2 
	cmp	ProgramSection,psInterface 
	je	@@3 
	lea	bx,@@5 
	Invoke	ChooseToken 
	jnz	@@3 
@@2:	call	word ptr cs:[bx+1] 
	jmp	@@1 
@@3:	ret 
@@4	db	5,3 
	db	tConst 
	dw	ConstDecl 
	db	tType 
	dw	TypeDecl 
	db	tVar 
	dw	VarDecl 
	db	tProcedure 
	dw	ProcDecl 
	db	tFunction 
	dw	ProcDecl 
@@5	db	3,3 
	db	tLabel 
	dw	LabelDecl 
	db	tConstructor 
	dw	ProcDecl 
	db	tDestructor 
	dw	ProcDecl 
DeclarationPart	endp 
 
CheckUndefs	proc	near 
	mov	di,size TProcMap 
CheckLocUndefs	label	near 
	les	dx,ProcMap 
	mov	ax,-1 
	jmp	short @@2 
@@1:	cmp	ax,es:[di].pmCodeMap 
	je	@@3 
	add	di,size TProcMap 
@@2:	cmp	di,dx 
	jne	@@1 
	ret 
@@3:	mov	di,es:[di].pmEntryPoint 
	mov	es,Dictionary.Segm 
	lea	si,IdentBuf 
	mov	bl,es:[di].seName.B0 
	mov	bh,0 
	mov	dl,es:[di+size TSymbol+bx].psFlags 
	test	dl,pfMethod 
	jz	@@4 
	push	di 
	mov	di,es:[di+size TSymbol+bx].psScope 
	mov	di,es:[di].otName 
	add	di,seName 
	Invoke	Pas2C 
	mov	byte ptr [si-1],'.' 
	pop	di 
@@4:	add	di,seName 
	Invoke	Pas2C 
	mov	ax,59 
	test	dl,pfExternal 
	jz	@@5 
	mov	ax,46 
@@5:	lea	dx,IdentBuf 
	Chain	ParamError2 
CheckUndefs	endp 
 
Number2Ident	proc	near 
	cmp	CurrentToken,t_Constant 
	jne	@@2 
	cmp	SymbolType.Offs,_Longint 
	jne	@@2 
	mov	ax,SymbolValue.W0 
	mov	dx,SymbolValue.W2 
	or	dx,dx 
	jnz	@@2 
	or	ax,ax 
	jl	@@2 
	cmp	ax,9999 
	jg	@@2 
	mov	bx,4 
	xor	cx,cx 
	mov	di,10 
	mov	IdentBuf[0],bl 
@@1:	cwd 
	div	di 
	add	dl,'0' 
	mov	IdentBuf[bx],dl 
	dec	dl 
	add	cl,dl 
	dec	bx 
	jnz	@@1 
	shl	cl,1 
	mov	SymbolHash,cl 
	mov	CurrentToken,t_Ident 
@@2:	ret 
Number2Ident	endp 
 
LabelDecl	proc	near 
	Invoke	GetToken 
@@1:	call	Number2Ident 
	mov	ax,size TLabelStub 
	Invoke	AddIdent2Dict 
	mov	es:[bx].seType,t_Label 
	mov	al,tComma 
	Invoke	CheckToken 
	jz	@@1 
	mov	al,tSemicolon 
	Chain	NeedToken 
LabelDecl	endp 
 
ConstDecl	proc	near 
	Loc	Temp,byte, 
	Entry 
	Invoke	GetToken 
@@1:	xor	ax,ax 
	Invoke	AddIdent2Dict 
	mov	al,tColon 
	Invoke	CheckToken 
	jnz	@@3 
	push	bx 
	mov	ax,size TVarStub 
	Invoke	GetDictMem 
	push	es di 
	mov	EqualToken,tConstEqual 
	call	GetTypeNoForw 
	mov	EqualToken,tEqual 
	test	GlobalOptions,coWordAlign 
	jz	@@2 
	cmp	es:[di].tdSizeOf,1 
	je	@@2 
	Invoke	WordAlignConst 
@@2:	mov	FirstOnConst,1 
	mov	TempStub.vsFlags,vfConst 
	mov	ax,CompiledConst.Offs 
	sub	ax,ConstSectStart 
	mov	TempStub.vsOffset,ax 
	mov	ax,ConstMap.Offs 
	mov	TempStub.vsMap,ax 
	call	_SearchUnit 
	mov	TempStub.vsType.Offs,ax 
	mov	TempStub.vsType.Segm,dx 
	mov	al,tConstEqual 
	Invoke	NeedToken 
	call	GetInitializer 
	pop	di es bx 
	mov	es:[bx].seType,t_Var 
	lea	si,TempStub 
	mov	cx,size TVarStub 
	rep	movsb 
	jmp	short @@5 
@@3:	push	es bx 
	mov	al,tEqual 
	Invoke	NeedToken 
	lea	di,Temp 
	call	GetConstExpr 
	pop	bx es 
	mov	es:[bx].seType,t_Const 
	lea	si,[di].exValue 
	les	di,[di].exType 
	mov	al,es:[di].tdType 
	mov	cx,4 
	cmp	al,ttInteger 
	jae	@@4 
	cmp	al,ttPointer 
	je	@@4 
	mov	cl,10 
	cmp	al,tt8087 
	je	@@4 
	mov	si,[si].Offs 
	mov	cl,32 
	cmp	al,ttSet 
	je	@@4 
	mov	cl,[si] 
	inc	cx 
@@4:	call	_SearchUnit 
	push	dx ax 
	mov	ax,size TConstStub 
	add	ax,cx 
	Invoke	GetDictMem 
	pop	ax 
	stosw 
	pop	ax 
	stosw 
	rep	movsb 
@@5:	mov	al,tSemicolon 
	Invoke	NeedToken 
	cmp	CurrentToken,t_Ident 
	jne	@@6 
	jmp	@@1 
@@6:	call	FlushConstMap 
	Exit 
ConstDecl	endp 
 
TypeDecl	proc	near 
	Invoke	GetToken 
	mov	ForwardTypes,0 
@@1:	mov	ax,size TTypeStub 
	Invoke	AddIdent2Dict 
	push	bx di es 
	mov	al,tEqual 
	Invoke	NeedToken 
	call	GetStdType 
	call	GetType 
	call	_SearchUnit 
	pop	es di bx 
	mov	es:[bx].seType,t_Type 
	stosw 
	mov	ax,dx 
	stosw 
	mov	al,tSemicolon 
	Invoke	NeedToken 
	cmp	CurrentToken,t_Ident 
	je	@@1 
ResolveForward	label	near 
@@2:	mov	di,ForwardTypes 
	or	di,di 
	jz	@@3 
	mov	es,Dictionary.Segm 
	mov	di,es:[di].ptBase.Segm 
	mov	es,TempDict.Segm 
	Invoke	CalcHash 
	Invoke	SearchSymbol 
	jnz	@@4 
	cmp	al,t_Type 
	jne	@@4 
	mov	bx,es:[di].tsType.Segm 
	mov	di,es:[di].tsType.Offs 
	mov	es,es:[bx] 
	call	_SearchUnit 
	mov	di,ForwardTypes 
	mov	es,Dictionary.Segm 
	xchg	ax,es:[di].ptBase.Offs 
	mov	es:[di].ptBase.Segm,dx 
	mov	ForwardTypes,ax 
	jmp	@@2 
@@3:	ret 
@@4:	mov	ax,19 
	Chain	IdentError 
TypeDecl	endp 
 
GetStdType	proc	near 
	mov	al,CurrentToken 
	cmp	al,tObject 
	je	@@1 
	cmp	al,tProcedure 
	je	@@1 
	cmp	al,tFunction 
	je	@@1 
	ret 
@@1:	mov	es:[bx].seType,t_StdType 
	push	es di 
	les	di,Dictionary 
	call	_SearchUnit 
	pop	di es 
	stosw 
	mov	ax,dx 
	stosw 
	ret 
GetStdType	endp 
 
VarDecl	proc	near 
	Invoke	GetToken 
@@1:	call	GetVarList 
	mov	al,tColon 
	Invoke	NeedToken 
	call	GetVarType 
	mov	al,tAbsolute 
	Invoke	CheckDirective 
	jnz	@@3 
	Invoke	GetSymbol 
	mov	al,t_Var 
	Invoke	CheckToken 
	jnz	@@2 
	les	di,CurrentSymbol 
	call	_SearchUnit 
	mov	TempStub.vsLink.Offs,ax 
	mov	TempStub.vsLink.Segm,dx 
	mov	al,vfAlias 
	jmp	short @@5 
@@2:	call	GetIntConstExpr 
	mov	TempStub.vsAddress.Segm,ax 
	mov	al,tColon 
	Invoke	NeedToken 
	call	GetIntConstExpr 
	mov	TempStub.vsAddress.Offs,ax 
	mov	al,vfAbsolute 
	jmp	short @@5 
@@3:	mov	ax,CurScope 
	or	ax,ax 
	jz	@@4 
	mov	TempStub.vsScope,ax 
	mov	al,vfLocal 
	jmp	short @@5 
@@4:	mov	FirstOnData,1 
	mov	ax,DataMap.offs 
	mov	TempStub.vsMap,ax 
	mov	al,vfVar 
@@5:	mov	TempStub.vsFlags,al 
	call	FillVarTypes 
	mov	al,tSemicolon 
	Invoke	NeedToken 
	cmp	CurrentToken,t_Ident 
	je	@@1 
	jmp	FlushDataMap 
VarDecl	endp 
 
GetVarList	proc	near 
	mov	ax,Dictionary.Offs 
	mov	FirstVar,ax 
	xor	ax,ax 
	mov	VarCount,ax 
@@1:	mov	ax,size TVarStub 
	Invoke	AddIdent2Dict 
	inc	VarCount 
	mov	al,tComma 
	Invoke	CheckToken 
	jz	@@1 
	ret 
GetVarList	endp 
 
GetVarType	proc near 
	call	GetTypeNoForw 
	mov	ax,es:[di].tdSizeOf 
	mov	VarSize,ax 
	call	_SearchUnit 
	mov	TempStub.vsType.Offs,ax 
	mov	TempStub.vsType.Segm,dx 
	ret 
GetVarType	endp 
 
FillVarTypes	proc	near 
	mov	dx,VarSize 
	mov	di,FirstVar 
	mov	es,Dictionary.Segm 
@@1:	mov	si,di 
	mov	al,PrivateFlag 
	or	al,t_Var 
	mov	es:[di].seType,al 
	mov	bl,es:[di].seName.B0 
	mov	bh,0 
	lea	di,[di+size TSymbol+bx] 
	mov	al,TempStub.vsFlags 
	cmp	al,vfVar 
	jne	@@3 
	mov	ax,VarsSize 
	test	GlobalOptions,coWordAlign 
	jz	@@2 
	cmp	dx,1 
	je	@@2 
	inc	ax 
	jz	@@5 
	and	ax,0fffeh 
@@2:	add	ax,dx 
	jc	@@5 
	mov	VarsSize,ax 
	sub	ax,dx 
	sub	ax,DataSectStart 
	jmp	short @@7 
@@3:	cmp	al,vfLocal 
	jne	@@6 
	mov	ax,LocalsSize 
	dec	ax 
	sub	ax,dx 
	inc	ax 
	jc	@@5 
	test	GlobalOptions,coWordAlign 
	jz	@@4 
	cmp	dx,1 
	je	@@4 
	and	ax,0fffeh 
@@4:	mov	LocalsSize,ax 
	jmp	short @@7 
@@5:	mov	ax,96 
	Chain	CompileError 
@@6:	cmp	al,vfField 
	jne	@@8 
	mov	bx,PrevField 
	mov	es:[bx],si 
	lea	ax,[di].vsNext 
	mov	PrevField,ax 
	mov	bx,CurOwner 
	mov	ax,es:[bx].tdSizeOf 
	add	es:[bx].tdSizeOf,dx 
	jnc	@@7 
	mov	ax,22 
	Chain	CompileError 
@@7:	mov	TempStub.vsOffset,ax 
@@8:	lea	si,TempStub 
	mov	cx,size TVarStub 
	rep	movsb 
	dec	VarCount 
	jz	@@9 
	jmp	@@1 
@@9:	ret 
FillVarTypes	endp 
 
ProcDecl	proc	near 
	push	ax 
	Invoke	GetToken 
	Invoke	NeedIdent 
	Invoke	LocalSearch 
	mov	cl,al 
	pop	ax 
	jnz	@@7 
	cmp	ProgramSection,psInterface 
	je	@@4 
	cmp	cl,t_Proc 
	je	@@1 
	cmp	cl,t_Type 
	jne	@@3 
	mov	bx,es:[di].tsType.Segm 
	mov	di,es:[di].tsType.Offs 
	mov	es,es:[bx] 
	cmp	es:[di].tdType,ttObject 
	jne	@@3 
	push	ax 
	Invoke	GetToken 
	mov	al,tPoint 
	Invoke	NeedToken 
	Invoke	NeedIdent 
	mov	di,es:[di].rtHash 
	Invoke	SearchHash 
	jnz	@@6 
	cmp	al,t_Proc 
	jne	@@6 
	pop	ax 
	jmp	short @@2 
@@1:	test	es:[di].psFlags,pfMethod 
	jnz	@@4 
@@2:	push	es 
	mov	si,es:[di].psProcMap 
	mov	es,ProcMap.Segm 
	cmp	es:[si].pmCodeMap,-1 
	pop	es 
	jne	@@4 
	Invoke	GetToken 
	call	MatchForward 
	jmp	@@15 
@@3:	cmp	al,tConstructor 
	je	@@5 
	cmp	al,tDestructor 
	je	@@5 
@@4:	mov	ax,4 
	Chain	CompileError 
@@5:	mov	ax,147 
	Chain	CompileError 
@@6:	mov	ax,150 
	Chain	CompileError 
@@7:	cmp	al,tConstructor 
	je	@@5 
	cmp	al,tDestructor 
	je	@@5 
	push	ax 
	mov	ax,size TProcStub 
	Invoke	LocalAddIdent 
	mov	es:[bx].seType,t_Proc 
	Invoke	GetToken 
	pop	ax 
	push	TempDict.Offs bx es di 
	call	GetProcHeader 
	pop	di es bx dx 
	mov	al,tSemicolon 
	Invoke	NeedToken 
	mov	al,tInline 
	Invoke	CheckToken 
	jnz	@@8 
	push	es di 
	Invoke	ProcessInline 
	pop	di es 
	or	es:[di].psFlags,pfInline 
	mov	es:[di].psInlineLen,cx 
	mov	al,tSemicolon 
	Chain	NeedToken 
@@8:	mov	es:[di].psHash,dx 
	call	FlushProcMap 
	mov	ax,CurScope 
	mov	es:[di].psScope,ax 
	or	ax,ax 
	jnz	@@9 
	mov	al,tInterrupt 
	Invoke	CheckDirective 
	jnz	@@9 
	or	es:[di].psFlags,pfInterrupt 
	mov	al,tSemicolon 
	Invoke	NeedToken 
	jmp	short @@13 
@@9:	cmp	ProgramSection,psInterface 
	je	@@12 
	mov	al,tNear 
	Invoke	CheckDirective 
	jz	@@10 
	mov	al,tFar 
	Invoke	CheckDirective 
	jnz	@@11 
	or	es:[di].psFlags,pfFar 
@@10:	mov	al,tSemicolon 
	Invoke	NeedToken 
	jmp	short @@13 
@@11:	test	CompilerOptions,coForceFarCalls 
	jz	@@13 
@@12:	or	es:[di].psFlags,pfFar 
@@13:	cmp	ProgramSection,psInterface 
	je	@@14 
	mov	al,tForward 
	Invoke	CheckDirective 
	jnz	@@15 
	mov	al,tSemicolon 
	Chain	NeedToken 
@@14:	ret 
@@15:	cmp	CurScope,0 
	jne	@@16 
	mov	al,tExternal 
	Invoke	CheckDirective 
	jnz	@@16 
	or	es:[di].psFlags,pfExternal 
	mov	es:[di].psHash,0 
	jmp	@@18 
@@16:	mov	al,tAssembler 
	Invoke	CheckDirective 
	jnz	@@17 
	or	es:[di].psFlags,pfAssembler 
	mov	al,tSemicolon 
	Invoke	NeedToken 
@@17:	push	ParamsSize ParamsBottom ProcResult LocalsSize LocalsBottom 
	push	CurProc CurScope 
	push	ProcMap.Offs 
	mov	CurScope,bx 
	mov	CurProc,di 
	mov	ax,es:[di].psHash 
	mov	NameListPtr,ax 
	mov	ax,Dictionary.offs 
	mov	es:[di].psHash,ax 
	mov	di,es:[di].psProcMap 
	mov	es,ProcMap.segm 
	mov	es:[di].pmCodeMap,-2 
	mov	ax,4 
	Invoke	CreateHashTable 
	call	CreateProcDict 
	call	DeclarationPart 
	Invoke	StatementPart 
	mov	es,Dictionary.segm 
	mov	di,CurProc 
	mov	di,es:[di].psProcMap 
	mov	es,ProcMap.segm 
	mov	es:[di].psHash,ax 
	mov	ax,CodeMap.offs 
	mov	es:[di].psScope,ax 
	call	FlushCodeMap 
	call	FlushConstMap 
	pop	di 
	call	CheckLocUndefs 
	mov	es,Dictionary.segm 
	mov	di,CurProc 
	pop	CurScope CurProc 
	pop	LocalsBottom LocalsSize ProcResult ParamsBottom ParamsSize 
	mov	ax,GlobalOptions 
	and	ax,coDebugInfo+coLocalSymbols 
	cmp	ax,coDebugInfo+coLocalSymbols 
	je	@@18 
	xor	ax,ax 
	xchg	ax,es:[di].psHash 
	mov	Dictionary.offs,ax 
@@18:	mov	al,tSemicolon 
	Chain	NeedToken 
ProcDecl	endp 
 
MatchForward	proc	near 
	mov	ah,tFunction 
	cmp	es:[di].psType.ptResult.Offs,0 
	jne	@@1 
	mov	ah,tConstructor 
	test	es:[di].psFlags,pfConstructor 
	jnz	@@1 
	mov	ah,tDestructor 
	test	es:[di].psFlags,pfDestructor 
	jnz	@@1 
	mov	ah,tProcedure 
@@1:	cmp	al,ah 
	jne	@@4 
	cmp	CurrentToken,tOParen 
	je	@@2 
	cmp	CurrentToken,tColon 
	jne	@@3 
@@2:	push	TempDict.Offs 
	push	es di bx 
	call	GetProcHeader 
	mov	si,di 
	pop	bx di es 
	push	di ds 
	mov	cx,Dictionary.Offs 
	mov	Dictionary.Offs,si 
	sub	cx,si 
	add	di,psType 
	push	es 
	pop	ds 
	mov	ax,[di].tdNext 
	mov	[si].tdNext,ax 
	repe	cmpsb 
	pop	ds di 
	pop	si 
	jne	@@4 
	push	di ds es 
	mov	cx,TempDict.Offs 
	mov	TempDict.Offs,si 
	sub	cx,si 
	mov	di,es:[di].psHash 
	mov	es,TempDict.Segm 
	push	es 
	pop	ds 
	repe	cmpsb 
	pop	es ds di 
	jne	@@4 
@@3:	mov	al,tSemicolon 
	Chain	NeedToken 
@@4:	mov	ax,131 
	Chain	CompileError 
MatchForward	endp 
 
CreateProcDict	proc	near 
	Loc	ParamOffset,word,1 
	Loc	AsmFlag,byte,2 
	Entry 
	mov	es,Dictionary.Segm 
	mov	di,CurProc 
	mov	al,es:[di].psFlags 
	and	al,pfAssembler 
	mov	AsmFlag,al 
	call	StackRequired 
	mov	ParamsSize,ax 
	mov	ParamsBottom,dx 
	mov	ParamOffset,dx 
	call	LocalSize 
	mov	ProcResult,ax 
	mov	LocalsSize,ax 
	mov	LocalsBottom,dx 
	push	NameListPtr 
	mov	cx,es:[di].psType.ptParamCount 
	add	di,psType.ptParams 
	jcxz	@@4 
@@1:	push	cx es di 
	mov	al,es:[di].ppFlags 
	mov	ah,AsmFlag 
	mov	bx,es:[di].ppType.Segm 
	mov	di,es:[di].ppType.Offs 
	mov	es,es:[bx] 
	call	ParamSize 
	or	al,vfParam 
	mov	TempStub.vsFlags,al 
	mov	bx,dx 
	call	_SearchUnit 
	mov	TempStub.vsType.Offs,ax 
	mov	TempStub.vsType.Segm,dx 
	sub	ParamOffset,cx 
	mov	ax,ParamOffset 
	or	bx,bx 
	jz	@@3 
	mov	ax,LocalsSize 
	sub	ax,bx 
	test	GlobalOptions,coWordAlign 
	jz	@@2 
	cmp	bx,1 
	je	@@2 
	and	ax,0fffeh 
@@2:	mov	LocalsSize,ax 
@@3:	mov	TempStub.vsOffset,ax 
	mov	ax,CurScope 
	mov	TempStub.vsScope,ax 
	mov	di,NameListPtr 
	mov	es,TempDict.Segm 
	Invoke	CalcHash 
	mov	NameListPtr,di 
	mov	ax,size TVarStub 
	Invoke	AddNewIdent 
	mov	es:[bx].seType,t_Var 
	lea	si,TempStub 
	mov	cx,size TVarStub 
	rep	movsb 
	pop	di es cx 
	add	di,size TProcParam 
	loop	@@1 
@@4:	mov	di,CurProc 
	test	es:[di].psFlags,pfMethod 
	jz	@@5 
	mov	TempStub.vsFlags,vfLocal+vfAddress 
	mov	TempStub.vsOffset,6 
	mov	ax,CurScope 
	mov	TempStub.vsScope,ax 
	mov	di,es:[di].psScope 
	call	_SearchUnit 
	mov	TempStub.vsType.Offs,ax 
	mov	TempStub.vsType.Segm,dx 
	lea	di,SelfStr 
	push	ds 
	pop	es 
	Invoke	CalcHash 
	mov	ax,size TVarStub 
	Invoke	AddNewIdent 
	mov	es:[bx].seType,t_Var 
	lea	si,TempStub 
	mov	cx,size TVarStub 
	rep	movsb 
@@5:	mov	ax,NameListPtr 
	cmp	ax,TempDict.Offs 
	pop	ax 
	jne	@@6 
	mov	TempDict.Offs,ax 
@@6:	Exit 
CreateProcDict	endp 
 
StackRequired	proc	near 
	xor	ax,ax 
	cmp	es:[di].psScope,0 
	je	@@1 
	mov	al,2 
	test	es:[di].psFlags,pfMethod 
	jz	@@1 
	mov	al,4 
	test	es:[di].psFlags,pfConstructor+pfDestructor 
	jz	@@1 
	mov	al,6 
@@1:	mov	cx,es:[di].psType.ptParamCount 
	jcxz	@@3 
	push	di 
	add	di,psType.ptParams 
@@2:	push	cx 
	push	ax es di 
	mov	al,es:[di].ppFlags 
	xor	ah,ah 
	mov	bx,es:[di].ppType.Segm 
	mov	di,es:[di].ppType.Offs 
	mov	es,es:[bx] 
	call	ParamSize 
	pop	di es ax 
	add	ax,cx 
	pop	cx 
	add	di,size TProcParam 
	loop	@@2 
	pop	di 
@@3:	mov	dx,ax 
	test	es:[di].psFlags,pfInterrupt 
	jnz	@@4 
	add	dx,4 
	test	es:[di].psFlags,pfFar 
	jz	@@4 
	inc	dx 
	inc	dx 
@@4:	ret 
StackRequired	endp 
 
ParamSize	proc	near 
	xor	dx,dx 
	test	al,vfAddress 
	jnz	@@3 
	mov	bl,es:[di].tdType 
	mov	cx,es:[di].tdSizeOf 
	cmp	bl,tt8087 
	jae	@@1 
	cmp	bl,ttString 
	je	@@2 
	cmp	bl,ttPointer 
	je	@@1 
	cmp	bl,ttSet 
	je	@@2 
	cmp	cx,1 
	je	@@1 
	cmp	cx,2 
	je	@@1 
	cmp	cx,4 
	jne	@@2 
@@1:	inc	cx 
	and	cx,0fffeh 
	ret 
@@2:	or	ah,ah 
	jnz	@@4 
	mov	dx,cx 
@@3:	mov	cx,4 
	ret 
@@4:	or	al,vfAddress 
	cmp	bl,ttSet 
	jne	@@3 
	mov	bx,es:[di].stBase.Segm 
	mov	di,es:[di].stBase.Offs 
	mov	es,es:[bx] 
	mov	bx,es:[di].itBase.Segm 
	mov	di,es:[di].itBase.Offs 
	mov	es,es:[bx] 
	add	di,size TOrdinalType 
	jmp	@@3 
ParamSize	endp 
 
LocalSize	proc	near 
	xor	ax,ax 
	mov	dx,ax 
	mov	bx,es:[di].psType.ptResult.Segm 
	or	bx,bx 
	jz	@@2 
	test	es:[di].psFlags,pfAssembler 
	jnz	@@2 
	push	es di 
	mov	di,es:[di].psType.ptResult.Offs 
	mov	es,es:[bx] 
	cmp	es:[di].tdType,ttString 
	je	@@1 
	sub	ax,es:[di].tdSizeOf 
@@1:	pop	di es 
@@2:	ret 
LocalSize	endp 
 
FlushProcMap	proc	near 
	push	es di bx 
	mov	ax,size TProcMap 
	lea	bx,ProcMap 
	Invoke	GetMemory 
	pop	bx 
	mov	dx,di 
	xor	ax,ax 
	stosw 
	stosw 
	dec	ax 
	stosw 
	mov	ax,bx 
	stosw 
	pop	di es 
	mov	es:[di].psProcMap,dx 
	ret 
FlushProcMap	endp 
 
FlushCodeMap	proc	near 
	mov	ax,size TSegMap 
	lea	bx,CodeMap 
	Invoke	GetMemory 
	xor	ax,ax 
	stosw 
	mov	ax,CompiledCode.Offs 
	sub	ax,CodeSectStart 
	stosw 
	mov	ax,CodeFixups.Offs 
	sub	ax,LastCodeFixup 
	stosw 
	mov	ax,LastTraceTable 
	cmp	ax,TraceTable.Offs 
	jne	@@1 
	mov	ax,-1 
@@1:	stosw 
	mov	ax,CompiledCode.offs 
	mov	CodeSectStart,ax 
	mov	ax,CodeFixups.Offs 
	mov	LastCodeFixup,ax 
	mov	ax,TraceTable.Offs 
	mov	LastTraceTable,ax 
	ret 
FlushCodeMap	endp 
 
FlushConstMap		 proc near 
	Invoke	WordAlignConst 
	mov	ax,CompiledConst.Offs 
	sub	ax,ConstSectStart 
	jnz	@@1 
	cmp	FirstOnConst,0 
	je	@@2 
@@1:	mov	FirstOnConst,0 
	push	ax 
	mov	ax,size TSegMap 
	lea	bx,ConstMap 
	Invoke	GetMemory 
	xor	ax,ax 
	stosw 
	pop	ax 
	stosw 
	mov	ax,ConstFixups.Offs 
	sub	ax,LastConstFixup 
	stosw 
	mov	ax,CurOwner 
	stosw 
	mov	ax,CompiledConst.Offs 
	mov	ConstSectStart,ax 
	mov	ConstSectStart2,ax 
	mov	ax,ConstFixups.Offs 
	mov	LastConstFixup,ax 
@@2:	ret 
FlushConstMap	endp 
 
FlushDataMap		 proc near 
	mov	ax,VarsSize 
	inc	ax 
	jz	@@3 
	and	ax,0fffeh 
	mov	VarsSize,ax 
	sub	ax,DataSectStart 
	jnz	@@1 
	cmp	FirstOnData,0 
	je	@@2 
@@1:	mov	FirstOnData,0 
	push	ax 
	mov	ax,size TSegMap 
	lea	bx,DataMap 
	Invoke	GetMemory 
	xor	ax,ax 
	stosw 
	pop	ax 
	stosw 
	xor	ax,ax 
	stosw 
	stosw 
	mov	ax,VarsSize 
	mov	DataSectStart,ax 
@@2:	ret 
@@3:	mov	ax,96 
	Chain	CompileError 
FlushDataMap	endp 
 
GetTypeNoForw	proc	near 
	mov	ForwardTypes,0 
	call	GetTypeNoObj 
	push	es di 
	Invoke	GetDirective 
	call	ResolveForward 
	pop	di es 
	ret 
GetTypeNoForw	endp 
 
GetType	proc	near 
	cmp	CurrentToken,tObject 
	jne	GetTypeNoObj 
	jmp	ObjectType 
GetType	endp 
 
GetTypeNoObj	proc	near 
	mov	al,tPacked 
	Invoke	CheckToken 
	Invoke	GetSymbol 
	lea	bx,@@2 
	Invoke	ChooseToken 
	jnz	@@1 
	jmp	word ptr cs:[bx+1] 
@@1:	mov	ax,21 
	Chain	CompileError 
@@2	db	16,3 
	db	t_Type 
	dw	TypeName 
	db	tArray 
	dw	ArrayType 
	db	tRecord 
	dw	RecordType 
	db	tCaret 
	dw	PointerType 
	db	tString 
	dw	StringType 
	db	tFile 
	dw	FileType 
	db	tSet 
	dw	SetType 
	db	tOParen 
	dw	EnumType 
	db	tProcedure 
	dw	ProcedureType 
	db	tFunction 
	dw	ProcedureType 
	db	t_Constant 
	dw	RangeType 
	db	t_Const 
	dw	RangeType 
	db	tMinus 
	dw	RangeType 
	db	tPlus 
	dw	RangeType 
	db	t_StdFun 
	dw	RangeType 
	db	tNot 
	dw	RangeType 
GetTypeNoObj	endp 
 
_GetTypeName	proc	near 
	Invoke	GetSymbol 
	cmp	CurrentToken,t_StdType 
	je	TypeName 
GetTypeName	label	near 
	mov	al,CurrentToken 
	mov	di,_String 
	cmp	al,tString 
	je	@@1 
	mov	di,_File 
	cmp	al,tFile 
	jne	@@2 
@@1:	mov	es,SystemUnit 
	Chain	GetToken 
@@2:	Invoke	GetSymbol 
	cmp	CurrentToken,t_Type 
	je	TypeName 
	mov	ax,12 
	Chain	CompileError 
_GetTypeName	endp 
 
TypeName	proc	near 
	les	di,CurrentSymbol 
	mov	bx,es:[di].tsType.Segm 
	mov	di,es:[di].tsType.Offs 
	mov	es,es:[bx] 
	Chain	GetToken 
TypeName	endp 
 
ArrayType	proc	near 
	Invoke	GetToken 
	mov	al,tOBracket 
	Invoke	NeedToken 
	xor	cx,cx 
@@1:	push	cx 
	call	GetBound 
	pop	cx 
	push	es di 
	inc	cx 
	mov	al,tComma 
	Invoke	CheckToken 
	jz	@@1 
	push	cx 
	mov	al,tCBracket 
	Invoke	NeedToken 
	mov	al,tOf 
	Invoke	NeedToken 
	call	GetTypeNoObj 
	pop	cx 
@@2:	call	_SearchUnit 
	mov	bx,es:[di].tdSizeOf 
	pop	di es 
	push	cx dx ax 
	mov	ax,es:[di].itUpperBound.W0 
	sub	ax,es:[di].itLowerBound.W0 
	inc	ax 
	jz	@@3 
	mul	bx 
	jc	@@3 
	mov	bx,ax 
	call	_SearchUnit 
	push	dx ax 
	mov	ax,size TArrayType 
	mov	cx,ttArray 
	call	PutTypePrefix 
	pop	es:[di].atBounds 
	pop	es:[di].atBase 
	pop	cx 
	loop	@@2 
	ret 
@@3:	mov	ax,22 
	Chain	CompileError 
ArrayType	endp 
 
RecordType	proc	near 
	push	ForwardTypes PrevField FirstVar VarCount 
	mov	ax,size TRecordType 
	xor	bx,bx 
	mov	cx,ttRecord 
	call	PutTypePrefix 
	mov	CurOwner,di 
	mov	ax,Dictionary.Offs 
	mov	es:[di].rtHash,ax 
	mov	es:[di].rtFirst,0 
	lea	ax,[di].rtFirst 
	mov	PrevField,ax 
	push	es di 
	mov	ax,4 
	Invoke	CreateHashTable 
	mov	ax,tRecord+tEnd*256 
	call	RecordSection 
	pop	di es 
	xor	ax,ax 
	mov	CurOwner,ax 
	pop	VarCount FirstVar PrevField ForwardTypes 
	ret 
RecordType	endp 
 
RecordSection	proc	near 
	Loc	EndingToken,byte,2 
	Loc	Temp,byte, 
	Entry 
	mov	EndingToken,ah 
	Invoke	NeedToken 
@@1:	mov	al,CurrentToken 
	cmp	al,EndingToken 
	je	@@8 
	mov	al,tCase 
	Invoke	CheckToken 
	jz	@@2 
	call	RecordGroup 
	mov	al,tSemicolon 
	Invoke	CheckToken 
	jz	@@1 
	jmp	short @@8 
@@2:	Invoke	NeedIdent 
	Invoke	SearchSymbol 
	jnz	@@3 
	cmp	al,t_Type 
	jnz	@@3 
	Invoke	GetToken 
	jmp	short @@4 
@@3:	call	RecordGroup 
@@4:	mov	al,tOf 
	Invoke	NeedToken 
	mov	es,Dictionary.Segm 
	mov	di,CurOwner 
	mov	dx,es:[di].tdSizeOf 
@@5:	mov	ax,dx 
	xchg	ax,es:[di].tdSizeOf 
	push	ax dx es di 
@@6:	lea	di,Temp 
	call	GetConstExpr 
	mov	al,tComma 
	Invoke	CheckToken 
	jz	@@6 
	mov	al,tColon 
	Invoke	NeedToken 
	mov	ax,tOParen+tCParen*256 
	call	RecordSection 
	pop	di es dx ax 
	cmp	ax,es:[di].tdSizeOf 
	jbe	@@7 
	mov	es:[di].tdSizeOf,ax 
@@7:	mov	al,tSemicolon 
	Invoke	CheckToken 
	jnz	@@8 
	mov	al,CurrentToken 
	cmp	al,EndingToken 
	jne	@@5 
@@8:	mov	al,EndingToken 
	Invoke	NeedToken 
	Exit 
RecordSection	endp 
 
RecordGroup	proc	near 
	call	GetVarList 
	mov	al,tColon 
	Invoke	NeedToken 
	push	CurOwner 
	xor	ax,ax 
	mov	CurOwner,ax 
	call	GetVarType 
	pop	CurOwner 
	mov	TempStub.vsFlags,vfField 
	xor	ax,ax 
	mov	TempStub.vsScope,ax 
	jmp	FillVarTypes 
@@1:	mov	ax,22 
	Chain	CompileError 
RecordGroup	endp 
 
ObjectType	proc	near 
	push	ForwardTypes 
	cmp	CurScope,0 
	jne	@@1 
	Invoke	GetToken 
	push	bx 
	mov	ax,size TObjectType 
	xor	bx,bx 
	mov	cx,ttObject 
	call	PutTypePrefix 
	pop	es:[di].otName 
	mov	es:[di].otReserved3.Offs,ax 
	mov	es:[di].otReserved3.Segm,ax 
	mov	CurOwner,di 
	mov	al,tOParen 
	Invoke	CheckToken 
	jnz	@@3 
	call	GetTypeName 
	cmp	es:[di].tdType,ttObject 
	jne	@@2 
	mov	al,tCParen 
	Invoke	NeedToken 
	push	es:[di].otReserved2 
	push	es:[di].otVMTOffset 
	push	es:[di].otVMTSize 
	push	es:[di].tdSizeOf 
	call	_SearchUnit 
	jmp	short @@4 
@@1:	mov	ax,148 
	Chain	CompileError 
@@2:	mov	ax,147 
	Chain	CompileError 
@@3:	xor	ax,ax 
	xor	dx,dx 
	push	ax 
	dec	ax 
	push	ax 
	inc	ax 
	push	ax ax 
@@4:	mov	es,Dictionary.Segm 
	mov	di,CurOwner 
	pop	es:[di].tdSizeOf 
	pop	es:[di].otVMTSize 
	pop	es:[di].otVMTOffset 
	pop	es:[di].otReserved2 
	mov	es:[di].otParent.Offs,ax 
	mov	es:[di].otParent.Segm,dx 
	xor	ax,ax 
	mov	es:[di].rtFirst,ax 
	mov	es:[di].otReserved3.Offs,ax 
	mov	es:[di].otReserved3.Segm,ax 
	dec	ax 
	mov	es:[di].otVMTAddr,ax 
	mov	es:[di].otReserved,ax 
	mov	ax,Dictionary.Offs 
	mov	es:[di].rtHash,ax 
	lea	ax,[di].rtFirst 
	mov	PrevField,ax 
	xor	ax,ax 
	mov	DummyCount,ax 
	push	es di 
	mov	ax,4 
	Invoke	CreateHashTable 
	call	ObjectGroup 
	mov	al,tPrivate 
	Invoke	CheckToken 
	jnz	@@5 
	mov	PrivateFlag,t_Private 
	call	ObjectGroup 
	mov	PrivateFlag,0 
@@5:	mov	al,tEnd 
	Invoke	NeedToken 
	pop	di es 
	call	PutVMT 
	xor	ax,ax 
	mov	CurOwner,ax 
	pop	ForwardTypes 
	ret 
ObjectType	endp 
 
	HValue	PRIVATE,128 
 
ObjectGroup	proc	near 
@@1:	xor	cx,cx 
@@2:	mov	al,@HS 
	lea	di,PrivateStr 
	Invoke	CompareSymbol 
	jnz	@@3 
	mov	CurrentToken,tPrivate 
@@3:	mov	al,CurrentToken 
	cmp	al,tProcedure 
	je	@@5 
	cmp	al,tFunction 
	je	@@5 
	cmp	al,tConstructor 
	je	@@4 
	cmp	al,tDestructor 
	je	@@4 
	or	cx,cx 
	jnz	@@6 
	cmp	al,tPrivate 
	je	@@6 
	cmp	al,tEnd 
	je	@@6 
	call	RecordGroup 
	mov	al,tSemicolon 
	Invoke	NeedToken 
	jmp	@@1 
@@4:	call	InitVMT 
@@5:	call	Method 
	mov	cx,-1 
	jmp	@@2 
@@6:	ret 
ObjectGroup	endp 
 
InitVMT	proc	near 
	mov	es,Dictionary.Segm 
	mov	di,CurOwner 
	cmp	es:[di].otVMTSize,0 
	jne	@@1 
	mov	es:[di].otVMTSize,4 
@@1:	ret 
InitVMT	endp 
 
Method	proc	near 
	Loc	CurMethod,dword,1 
	Loc	OldMethod,dword,1 
	Entry 
	push	ax 
	Invoke	GetToken 
	Invoke	NeedIdent 
	Invoke	LocalSearch 
	jnz	@@2 
	cmp	al,t_Proc 
	jne	@@1 
	mov	ax,es 
	cmp	ax,Dictionary.Segm 
	jne	@@3 
	mov	ax,es:[di].psScope 
	cmp	ax,CurOwner 
	jne	@@3 
@@1:	mov	ax,4 
	Chain	CompileError 
@@2:	xor	di,di 
	mov	es,di 
@@3:	mov	OldMethod.Offs,di 
	mov	OldMethod.Segm,es 
	mov	ax,size TProcStub 
	Invoke	LocalAddIdent 
	Invoke	GetToken 
	mov	CurMethod.Offs,di 
	mov	CurMethod.Segm,es 
	mov	al,PrivateFlag 
	or	al,t_Proc 
	mov	es:[bx].seType,al 
	mov	ax,CurOwner 
	mov	es:[di].psScope,ax 
	mov	ax,TempDict.Offs 
	mov	es:[di].psHash,ax 
	mov	si,PrevField 
	mov	es:[si],bx 
	lea	si,[di].psType.tdNext 
	mov	PrevField,si 
	call	FlushProcMap 
	pop	ax 
	mov	ah,pfFar+pfMethod+pfConstructor 
	cmp	al,tConstructor 
	je	@@4 
	mov	ah,pfFar+pfMethod+pfDestructor 
	cmp	al,tDestructor 
	je	@@4 
	mov	ah,pfFar+pfMethod 
@@4:	mov	es:[di].psFlags,ah 
	call	GetProcHeader 
	mov	al,tSemicolon 
	Invoke	NeedToken 
	les	di,OldMethod 
	or	di,di 
	jz	@@5 
	cmp	es:[di].psOwner,0 
	je	@@5 
	call	Override 
	jmp	short @@6 
@@5:	call	NewMethod 
@@6:	les	di,CurMethod 
	mov	es:[di].psOwner,ax 
	Exit 
 
Override	proc	near 
	mov	al,tVirtual 
	Invoke	CheckDirective 
	jnz	@@1 
	les	di,OldMethod 
	mov	al,es:[di].psFlags 
	les	di,CurMethod 
	xor	al,es:[di].psFlags 
	and	al,pfConstructor+pfDestructor 
	jnz	@@2 
	lea	di,CurMethod 
	lea	si,OldMethod 
	add	[di].Offs,psType 
	add	[si].Offs,psType 
	Invoke	ProcCompat 
	jnz	@@2 
	sub	[di].Offs,psType 
	sub	[si].Offs,psType 
	mov	al,tSemicolon 
	Invoke	NeedToken 
	les	di,OldMethod 
	mov	ax,es:[di].psOwner 
	ret 
@@1:	mov	ax,149 
	Chain	CompileError 
@@2:	mov	ax,131 
	Chain	CompileError 
Override	endp 
 
NewMethod	proc	near 
	mov	al,tVirtual 
	Invoke	CheckDirective 
	mov	ax,0 
	jnz	@@1 
	les	di,CurMethod 
	test	es:[di].psFlags,pfConstructor 
	jnz	@@2 
	mov	al,tSemicolon 
	Invoke	NeedToken 
	call	InitVMT 
	mov	ax,es:[di].otVMTSize 
	add	es:[di].otVMTSize,4 
@@1:	ret 
@@2:	mov	ax,151 
	Chain	CompileError 
NewMethod	endp 
 
Method	endp 
 
PutVMT	proc	near 
	mov	ax,es:[di].otVMTSize 
	or	ax,ax 
	jnz	@@1 
	ret 
@@1:	mov	dx,es:[di].tdSizeOf 
	cmp	es:[di].otVMTOffset,-1 
	jne	@@2 
	mov	es:[di].otVMTOffset,dx 
	inc	dx 
	inc	dx 
	mov	es:[di].tdSizeOf,dx 
@@2:	push	es di 
	mov	cx,ax 
	lea	bx,CompiledConst 
	Invoke	GetMemory 
	mov	ConstPtr,di 
	mov	ax,dx 
	stosw 
	neg	ax 
	stosw 
	sub	cx,4 
	mov	al,-1 
	rep	stosb 
	pop	di es 
	mov	ax,ConstMap.Offs 
	mov	es:[di].otVMTAddr,ax 
	push	es di 
@@3:	push	di 
	mov	di,es:[di].rtFirst 
	jmp	short @@8 
@@4:	mov	al,es:[di].seType 
	mov	bl,es:[di].seName.B0 
	xor	bh,bh 
	lea	di,[di+size TSymbol+bx] 
	and	al,not t_Private 
	cmp	al,t_Var 
	jne	@@5 
	mov	di,es:[di].vsNext 
	jmp	short @@8 
@@5:	mov	si,es:[di].psOwner 
	or	si,si 
	jz	@@7 
	mov	ax,es 
	mov	bx,es:[di].psProcMap 
	mov	cx,ffProc+ffPtr 
	xor	dx,dx 
	add	si,ConstPtr 
	push	es 
	mov	es,CompiledConst.Segm 
	cmp	dx,es:[si].Offs 
	je	@@6 
	mov	es:[si].Offs,dx 
	mov	es:[si].Segm,dx 
	Invoke	PutConstFixup 
@@6:	pop	es 
@@7:	mov	di,es:[di].psType.tdNext 
@@8:	or	di,di 
	jnz	@@4 
	pop	di 
	mov	bx,es:[di].otParent.Segm 
	or	bx,bx 
	jz	@@9 
	mov	di,es:[di].otParent.Offs 
	mov	es,es:[bx] 
	jmp	@@3 
@@9:	call	FlushConstMap 
	pop	di es 
	ret 
PutVMT	endp 
 
ProcedureType	proc	near 
	Invoke	GetToken 
	push	TempDict.Offs 
	call	GetProcHeader 
	pop	TempDict.Offs 
	ret 
ProcedureType	endp 
 
GetProcHeader	proc	near 
	push	ax 
	mov	ax,size TProcType 
	mov	bx,4 
	mov	cx,ttProc+emLongint*256 
	call	PutTypePrefix 
	xor	ax,ax 
	mov	es:[di].ptResult.Offs,ax 
	mov	es:[di].ptResult.Segm,ax 
	mov	es:[di].ptParamCount,ax 
	mov	al,tOParen 
	Invoke	CheckToken 
	jnz	@@1 
	push	es di 
	call	GetParamList 
	pop	di es 
	mov	es:[di].ptParamCount,cx 
	mov	al,tCParen 
	Invoke	NeedToken 
@@1:	pop	ax 
	cmp	al,tFunction 
	jne	@@2 
	mov	al,tColon 
	Invoke	NeedToken 
	push	es di 
	call	GetTypeName 
	cmp	es:[di].tdType,ttPointer 
	jb	@@3 
	call	_SearchUnit 
	pop	di es 
	mov	es:[di].ptResult.Offs,ax 
	mov	es:[di].ptResult.Segm,dx 
@@2:	ret 
@@3:	mov	ax,34 
	Chain	CompileError 
GetProcHeader	endp 
 
GetParamList	proc	near 
	Loc	Flags,byte,2 
	Loc	CurCount,word,1 
	Loc	TotalCount,word,1 
	Entry 
	mov	TotalCount,0 
@@1:	mov	CurCount,0 
	mov	al,tVar 
	Invoke	CheckToken 
	mov	al,vfLocal+vfAddress 
	jz	@@2 
	mov	al,vfLocal 
@@2:	mov	Flags,al 
@@3:	call	GetIdent 
	inc	CurCount 
	mov	al,tComma 
	Invoke	CheckToken 
	jz	@@3 
	test	Flags,vfAddress 
	jz	@@4 
	mov	es,SystemUnit 
	mov	di,_Void 
	cmp	CurrentToken,tColon 
	jne	@@5 
@@4:	mov	al,tColon 
	Invoke	NeedToken 
	call	_GetTypeName 
	test	Flags,vfAddress 
	jnz	@@5 
	cmp	es:[di].tdType,ttFile 
	je	@@8 
	cmp	es:[di].tdType,ttText 
	je	@@8 
@@5:	call	_SearchUnit 
	push	dx ax 
	mov	ax,size TProcParam 
	mul	CurCount 
	Invoke	GetDictMem 
	pop	ax dx 
	mov	bl,Flags 
	mov	cx,CurCount 
@@6:	mov	es:[di].ppType.Offs,ax 
	mov	es:[di].ppType.Segm,dx 
	mov	es:[di].ppFlags,bl 
	add	di,size TProcParam 
	loop	@@6 
	mov	ax,CurCount 
	add	TotalCount,ax 
	mov	al,tSemicolon 
	Invoke	CheckToken 
	jnz	@@7 
	jmp	@@1 
@@7:	mov	cx,TotalCount 
	Exit 
@@8:	mov	ax,126 
	Chain	CompileError 
GetParamList	endp 
 
GetIdent	proc	near 
	Invoke	NeedIdent 
	lea	si,IdentBuf 
	mov	al,[si] 
	mov	ah,0 
	inc	ax 
	mov	cx,ax 
	lea	bx,TempDict 
	Invoke	GetMemory 
	rep	movsb 
	Chain	GetToken 
GetIdent	endp 
 
SetType	proc	near 
	Invoke	GetToken 
	mov	al,tOf 
	Invoke	NeedToken 
	call	GetBound 
	mov	ax,es:[di].itLowerBound.W0 
	mov	bx,es:[di].itUpperBound.W0 
	or	ah,bh 
	jnz	@@1 
	mov	cl,3 
	shr	ax,cl 
	shr	bx,cl 
	sub	bx,ax 
	inc	bx 
	call	_SearchUnit 
	push	dx ax 
	mov	ax,size TSetType 
	mov	cx,ttSet 
	call	PutTypePrefix 
	pop	es:[di].stBase 
	ret 
@@1:	mov	ax,23 
	Chain	CompileError 
SetType	endp 
 
PointerType	proc	near 
	Invoke	GetToken 
	mov	al,CurrentToken 
	mov	di,_String 
	cmp	al,tString 
	je	@@1 
	mov	di,_File 
	cmp	al,tFile 
	je	@@1 
	push	TempDict.Offs 
	call	GetIdent 
	mov	ax,size TPointerType 
	mov	bx,4 
	mov	cx,ttPointer+emLongint*256 
	call	PutTypePrefix 
	mov	ax,ForwardTypes 
	mov	es:[di].ptBase.Offs,ax 
	pop	es:[di].ptBase.Segm 
	mov	ForwardTypes,di 
	ret 
@@1:	mov	es,SystemUnit 
	call	_SearchUnit 
	push	dx ax 
	mov	ax,size TPointerType 
	mov	bx,4 
	mov	cx,ttPointer+emLongint*256 
	call	PutTypePrefix 
	pop	es:[di].ptBase 
	Chain	GetToken 
PointerType	endp 
 
FileType	proc	near 
	Invoke	GetToken 
	mov	al,tOf 
	Invoke	CheckToken 
	jnz	@@1 
	call	GetTypeNoObj 
	mov	al,es:[di].tdType 
	cmp	al,ttObject 
	je	@@2 
	cmp	al,ttFile 
	je	@@2 
	cmp	al,ttText 
	je	@@2 
	call	_SearchUnit 
	push	dx ax 
	mov	ax,size TFileType 
	mov	bx,128 
	mov	cx,4 
	call	PutTypePrefix 
	pop	es:[di].ftBase 
	ret 
@@1:	mov	es,SystemUnit 
	mov	di,_File 
	ret 
@@2:	mov	ax,24 
	Chain	CompileError 
FileType	endp 
 
StringType	proc	near 
	Invoke	GetToken 
	mov	al,tOBracket 
	Invoke	CheckToken 
	jz	@@2 
	mov	es,SystemUnit 
	mov	di,_String 
	ret 
@@1:	mov	ax,25 
	Chain	CompileError 
@@2:	call	GetIntConstExpr 
	or	dx,dx 
	jnz	@@1 
	or	ah,ah 
	jnz	@@1 
	or	al,al 
	jz	@@1 
	push	ax 
	mov	di,_Longint 
	mov	es,SystemUnit 
	call	_SearchUnit 
	push	dx ax 
	mov	ax,size TOrdinalType 
	mov	bx,1 
	mov	cx,ttInteger+emByte*256 
	call	PutTypePrefix 
	pop	es:[di].itBase 
	pop	bx 
	xor	ax,ax 
	mov	es:[di].itLowerBound.W0,ax 
	mov	es:[di].itLowerBound.W2,ax 
	mov	es:[di].itUpperBound.W0,bx 
	mov	es:[di].itUpperBound.W2,ax 
	inc	bx 
	call	_SearchUnit 
	push	dx ax 
	mov	di,_Char 
	mov	es,SystemUnit 
	call	_SearchUnit 
	push	dx ax 
	mov	ax,size TArrayType 
	mov	cx,ttString 
	call	PutTypePrefix 
	pop	es:[di].atBase 
	pop	es:[di].atBounds 
	mov	al,tCBracket 
	Chain	NeedToken 
StringType	endp 
 
EnumType	proc	near 
	Invoke	GetToken 
	mov	ax,size TOrdinalType 
	xor	bx,bx 
	mov	cx,ttEnum 
	call	PutTypePrefix 
	push	es di 
	call	_SearchUnit 
	mov	es:[di].itBase.Offs,ax 
	mov	es:[di].itBase.Segm,dx 
	push	dx ax 
	mov	ax,size TSetType+2 
	mov	bx,32 
	mov	cx,ttSet 
	call	PutTypePrefix 
	pop	bx dx 
	mov	es:[di].stBase.Offs,bx 
	mov	es:[di].stBase.Segm,dx 
	mov	cx,-1 
@@1:	inc	cx 
	push	bx cx dx 
	mov	ax,size TConstStub+4 
	Invoke	AddIdent2Dict 
	mov	es:[bx].seType,t_Const 
	pop	dx cx bx 
	mov	ax,bx 
	stosw 
	mov	ax,dx 
	stosw 
	mov	ax,cx 
	stosw 
	xor	ax,ax 
	stosw 
	mov	al,tComma 
	Invoke	CheckToken 
	jz	@@1 
	mov	al,tCParen 
	Invoke	NeedToken 
	mov	ax,cx 
	xor	dx,dx 
	call	FitConstType 
	mov	bx,1 
	test	al,emX 
	jz	@@2 
	inc	bx 
@@2:	pop	di es 
	mov	es:[di].tdModifier,al 
	mov	es:[di].tdSizeOf,bx 
	xor	ax,ax 
	mov	es:[di].itLowerBound.W0,ax 
	mov	es:[di].itLowerBound.W2,ax 
	mov	es:[di].itUpperBound.W0,cx 
	mov	es:[di].itUpperBound.W2,ax 
	mov	es:[di].etReserved,ax 
	ret 
EnumType	endp 
 
RangeType	proc	near 
	Loc	LowerBound,byte, 
	Loc	UpperBound,byte, 
	Entry 
	lea	di,LowerBound 
	call	GetConstExpr 
	cmp	es:[bx].tdType,ttInteger 
	jae	@@1 
	mov	ax,27 
	Chain	CompileError 
@@1:	mov	al,tRange 
	Invoke	NeedToken 
	lea	di,UpperBound 
	call	GetConstExpr 
	cmp	bx,LowerBound.exType.Offs 
	jne	@@2 
	mov	ax,es 
	cmp	ax,LowerBound.exType.Segm 
	je	@@3 
@@2:	mov	ax,26 
	Chain	CompileError 
@@3:	mov	ax,UpperBound.exValue.W0 
	mov	dx,UpperBound.exValue.W2 
	sub	ax,LowerBound.exValue.W0 
	sbb	dx,LowerBound.exValue.W2 
	jge	@@4 
	mov	ax,28 
	Chain	CompileError 
@@4:	mov	ax,LowerBound.exValue.W0 
	mov	dx,LowerBound.exValue.W2 
	call	FitConstType 
	mov	cl,al 
	mov	ax,UpperBound.exValue.W0 
	mov	dx,UpperBound.exValue.W2 
	call	FitConstType 
	mov	ah,cl 
	call	IntExtension 
	mov	bx,1 
	test	al,emX 
	jz	@@5 
	inc	bx 
	test	al,emXX 
	jz	@@5 
	inc	bx 
	inc	bx 
@@5:	les	di,LowerBound.exType 
	mov	cl,es:[di].tdType 
	mov	ch,al 
	call	_SearchUnit 
	push	dx ax 
	mov	ax,size TOrdinalType 
	call	PutTypePrefix 
	mov	ax,LowerBound.exValue.W0 
	mov	es:[di].itLowerBound.W0,ax 
	mov	ax,LowerBound.exValue.W2 
	mov	es:[di].itLowerBound.W2,ax 
	mov	ax,UpperBound.exValue.W0 
	mov	es:[di].itUpperBound.W0,ax 
	mov	ax,UpperBound.exValue.W2 
	mov	es:[di].itUpperBound.W2,ax 
	pop	es:[di].itBase 
	Exit 
RangeType	endp 
 
GetBound	proc	near 
	Invoke	ProcessCaret 
	call	GetTypeNoObj 
	cmp	es:[di].tdType,ttInteger 
	jb	@@1 
	cmp	es:[di].tdSizeOf,2 
	ja	@@1 
	ret 
@@1:	mov	ax,29 
	Chain	CompileError 
GetBound	endp 
 
PutTypePrefix	proc	near 
	push	bx 
	Invoke	GetDictMem 
	pop	bx 
	mov	word ptr es:[di].tdType,cx 
	mov	es:[di].tdSizeOf,bx 
	mov	es:[di].tdNext,0 
	ret 
PutTypePrefix	endp 
 
_SearchUnit	proc	near 
	mov	ax,di 
	mov	dx,es 
SearchUnit	label	near 
	push	bx di ds 
	mov	ds,Dictionary.Segm 
	mov	di,ds:uhName 
	xor	bx,bx 
	jmp	short @@2 
@@1:	mov	di,[di+size TSymbol+bx].usNext 
	or	di,di 
	jz	@@3 
@@2:	mov	bl,[di].seName.B0 
	cmp	dx,[di+size TSymbol+bx].usAddress 
	jne	@@1 
	lea	dx,[di+size TSymbol+bx] 
	pop	ds di bx 
	ret 
@@3:	pop	ds 
	mov	ax,136 
	Chain	CompileError 
_SearchUnit	endp 
 
GetInitializer	proc	near 
	push	es di 
	mov	ax,es:[di].tdSizeOf 
	lea	bx,CompiledConst 
	mov	cx,ax 
	Invoke	GetMemory 
	mov	ConstPtr,di 
	xor	al,al 
	rep	stosb 
	mov	ConstSectStart2,di 
	pop	di es 
	call	_GetInit 
	mov	ax,ConstSectStart 
	mov	ConstSectStart2,ax 
	ret 
GetInitializer	endp 
 
_GetInit	proc	near 
	mov	bl,es:[di] 
	xor	bh,bh 
	shl	bx,1 
	jmp	cs:@@1[bx] 
@@1	dw	InitError 
	dw	InitArray 
	dw	InitRecord 
	dw	InitRecord 
	dw	InitError 
	dw	InitError 
	dw	InitNumber 
	dw	InitSet 
	dw	InitNumber 
	dw	InitString 
	dw	InitNumber 
	dw	InitNumber 
	dw	InitNumber 
	dw	InitNumber 
	dw	InitNumber 
	dw	InitNumber 
_GetInit	endp 
 
InitError	proc	near 
	mov	ax,99 
	Chain	CompileError 
InitError	endp 
 
InitArray	proc	near 
	Loc	_Type,dword,1 
	Entry 
	mov	_Type.Offs,di 
	mov	_Type.Segm,es 
	lea	di,_Type 
	Invoke	CheckPackedChar 
	jnz	@@2 
	cmp	CurrentToken,tOParen 
	je	@@2 
	call	GetStrConstExpr 
	mov	cl,[bx] 
	xor	ch,ch 
	inc	bx 
	les	di,_Type 
	mov	ax,es:[di].tdSizeOf 
	cmp	cx,ax 
	jne	@@1 
	call	PutConst 
	jmp	short @@5 
@@1:	mov	ax,100 
	Chain	CompileError 
@@2:	mov	al,tOParen 
	Invoke	NeedToken 
	les	di,_Type 
	mov	bx,es:[di].atBounds.Segm 
	mov	di,es:[di].atBounds.Offs 
	mov	es,es:[bx] 
	mov	cx,es:[di].itUpperBound.W0 
	sub	cx,es:[di].itLowerBound.W0 
	les	di,_Type 
	mov	bx,es:[di].atBase.Segm 
	mov	di,es:[di].atBase.Offs 
	mov	es,es:[bx] 
@@3:	push	cx es di 
	call	_GetInit 
	pop	di es cx 
	dec	cx 
	js	@@4 
	mov	al,tComma 
	Invoke	NeedToken 
	jmp	@@3 
@@4:	mov	al,tCParen 
	Invoke	NeedToken 
@@5:	Exit 
InitArray	endp 
 
InitRecord	proc	near 
	Loc	_Type,dword,1 
	Loc	SaveConstPtr,word,1 
	Loc	VMTOffset,word,1 
	Entry 
	mov	_Type.Offs,di 
	mov	_Type.Segm,es 
	mov	ax,ConstPtr 
	mov	SaveConstPtr,ax 
	mov	ax,-1 
	cmp	es:[di].tdType,ttObject 
	jne	@@1 
	cmp	es:[di].otVMTSize,0 
	je	@@1 
	mov	ax,es 
	mov	bx,es:[di].otVMTAddr 
	mov	cx,ffConst+ffOffs 
	xor	dx,dx 
	mov	si,ConstPtr 
	add	si,es:[di].otVMTOffset 
	Invoke	PutConstFixup 
	mov	ax,es:[di].otVMTOffset 
@@1:	mov	VMTOffset,ax 
	mov	al,tOParen 
	Invoke	NeedToken 
	cmp	CurrentToken,tCParen 
	je	@@4 
@@2:	mov	ax,ConstPtr 
	sub	ax,SaveConstPtr 
	cmp	ax,VMTOffset 
	jne	@@3 
	add	ConstPtr,2 
@@3:	les	si,_Type 
	Invoke	SearchField 
	jnz	@@5 
	cmp	al,t_Var 
	jne	@@5 
	Invoke	GetToken 
	mov	ax,ConstPtr 
	sub	ax,SaveConstPtr 
	cmp	ax,es:[di].vsOffset 
	jne	@@6 
	mov	al,tColon 
	Invoke	NeedToken 
	mov	bx,es:[di].vsType.Segm 
	mov	di,es:[di].vsType.Offs 
	mov	es,es:[bx] 
	call	_GetInit 
	mov	al,tSemicolon 
	Invoke	CheckToken 
	jz	@@2 
@@4:	mov	al,tCParen 
	Invoke	NeedToken 
	les	di,_Type 
	mov	ax,SaveConstPtr 
	add	ax,es:[di].tdSizeOf 
	mov	ConstPtr,ax 
	Exit 
@@5:	mov	ax,44 
	Chain	CompileError 
@@6:	mov	ax,101 
	Chain	CompileError 
InitRecord	endp 
 
InitSet	proc	near 
	Loc	Temp,byte, 
	Entry 
	push	es di 
	lea	di,Temp 
	call	GetConstExpr 
	mov	si,sp 
	Invoke	TypeCompat 
	pop	bx es 
	Invoke	SetBaseAndSize 
	mov	bl,ah 
	xor	bh,bh 
	add	bx,Temp.exOffset 
	xor	ah,ah 
	mov	cx,ax 
	call	PutConst 
	Exit 
InitSet	endp 
 
InitString	proc	near 
	push	es:[di].tdSizeOf 
	call	GetStrConstExpr 
	pop	ax 
	dec	ax 
	mov	cl,[bx] 
	xor	ch,ch 
	cmp	cx,ax 
	jbe	@@1 
	mov	cx,ax 
	mov	[bx],cl 
@@1:	inc	ax 
	inc	cx 
	jmp	PutConst 
InitString	endp 
 
InitNumber	proc	near 
	Loc	Temp,byte, 
	Entry 
	push	StmtPart.Offs es di 
	lea	di,Temp 
	mov	si,sp 
	Invoke	GetExpression 
	mov	si,sp 
	Invoke	AssignmentCast 
	Invoke	TypeCompat 
	Invoke	CastOrdinal 
	pop	di es ax 
	cmp	ax,StmtPart.Offs 
	jne	@@8 
	cmp	es:[di].tdType,tt8087 
	jne	@@1 
	mov	al,es:[di].tdModifier 
	lea	bx,Temp.exValue 
	Invoke	Extended2Float 
@@1:	mov	ax,es:[di].tdSizeOf 
	cmp	Temp.exLocation,elAddress 
	je	@@2 
	lea	bx,Temp.exValue 
	mov	cx,ax 
	call	PutConst 
	jmp	short @@7 
@@2:	test	Temp.exMisc,efSS+efES+efBP+efDI 
	jnz	@@8 
	push	ax 
	mov	ax,Temp.exSegment 
	mov	bx,Temp.exMap 
	mov	dx,Temp.exOffset 
	test	Temp.exMisc,efDS 
	jnz	@@3 
	xor	cx,cx 
	test	Temp.exMisc,efCS 
	jz	@@4 
	mov	cx,ffCode 
	jmp	short @@4 
@@3:	mov	cx,ffData 
	test	Temp.exMisc,efConst 
	jz	@@4 
	mov	cx,ffConst 
@@4:	test	Temp.exMisc,efSeg 
	jnz	@@5 
	or	cx,ffOffs 
	test	Temp.exModifier,emXX 
	jz	@@6 
@@5:	or	cx,ffSegm 
@@6:	mov	si,ConstPtr 
	Invoke	PutConstFixup 
	pop	ax 
	add	ConstPtr,ax 
@@7:	Exit 
@@8:	mov	ax,133 
	Chain	CompileError 
InitNumber	endp 
 
PutConst	proc	near 
	mov	si,bx 
	mov	di,ConstPtr 
	mov	es,CompiledConst.Segm 
	rep	movsb 
	add	ConstPtr,ax 
	ret 
PutConst	endp 
 
GetConstExpr	proc	near 
	push	StmtPart.Offs 
	Invoke	GetExpr 
	pop	ax 
	cmp	ax,StmtPart.Offs 
	jne	@@2 
	cmp	[di].exLocation,elImmediate 
	jne	@@2 
	les	bx,[di].exType 
	cmp	es:[bx].tdType,ttInteger 
	jb	@@1 
	mov	si,es:[bx].itBase.Segm 
	mov	bx,es:[bx].itBase.Offs 
	mov	es,es:[si] 
	mov	[di].exType.Offs,bx 
	mov	[di].exType.Segm,es 
@@1:	ret 
@@2:	mov	ax,133 
	Chain	CompileError 
GetConstExpr	endp 
 
GetIntConstExpr	proc	near 
	Loc	Temp,byte, 
	Entry 
	lea	di,Temp 
	call	GetConstExpr 
	cmp	es:[bx].tdType,ttInteger 
	jne	@@1 
	mov	ax,[di].exValue.W0 
	mov	dx,[di].exValue.W2 
	Exit 
@@1:	mov	ax,30 
	Chain	CompileError 
GetIntConstExpr	endp 
 
GetStrConstExpr	proc	near 
	Loc	Temp,byte, 
	Entry 
	lea	di,Temp 
	call	GetConstExpr 
	Invoke	ConvChar2String 
	les	bx,[di].exType 
	cmp	es:[bx].tdType,ttString 
	jne	@@1 
	mov	bx,[di].exOffset 
	Exit 
@@1:	mov	ax,102 
	Chain	CompileError 
GetStrConstExpr	endp 
 
FitConstType	proc	near 
	or	dx,dx 
	js	@@5 
	jnz	@@4 
	or	ah,ah 
	js	@@3 
	jnz	@@2 
	or	al,al 
	js	@@1 
	xor	al,al 
	ret 
@@1:	mov	al,emByte 
	ret 
@@2:	mov	al,emX 
	ret 
@@3:	mov	al,emWord 
	ret 
@@4:	mov	al,emX+emXX 
	ret 
@@5:	cmp	dx,-1 
	jne	@@7 
	cmp	ah,-1 
	jne	@@6 
	or	al,al 
	jns	@@6 
	mov	al,emShortint 
	ret 
@@6:	or	ah,ah 
	jns	@@7 
	mov	al,emInteger 
	ret 
@@7:	mov	al,emLongint 
	ret 
FitConstType	endp 
 
IntExtension	proc	near 
	cmp	al,ah 
	jae	@@1 
	xchg	al,ah 
@@1:	test	ah,emSigned 
	jz	@@3 
	test	al,emUnsigned 
	jz	@@2 
	shl	al,1 
@@2:	or	al,emSigned 
@@3:	ret 
IntExtension	endp 
 
	end