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


	model	large compiler_text,pascal 
	include	compiler.inc 
 
	.code	compiler_text 
 
	public	SaveState 
	public	RestoreState 
	public	Add2TpuList 
	public	FormUnit 
	public	WriteUnit 
	public	ReadUnit 
	public	DiscardUnits 
	public	ReadLibrary 
 
SaveState	proc	near 
	Invoke	SaveHeap 
	mov	cx,CompMemPtr 
	mov	dx,CompMemTop 
	call	UpdateLinks 
	lea	si,CompilerFlags 
	lea	ax,FileNameBuf 
	sub	ax,si 
	push	ax 
	add	ax,15 
	mov	cl,4 
	shr	ax,cl 
	sub	CompMemTop,ax 
	pop	cx 
	xor	di,di 
	mov	es,CompMemTop 
	rep	movsb 
	ret 
SaveState	endp 
 
RestoreState	proc	near 
	lea	di,CompilerFlags 
	lea	ax,FileNameBuf 
	sub	ax,di 
	mov	cx,ax 
	xor	si,si 
	push	ds 
	pop	es 
	mov	ds,CompMemTop 
	rep	movsb 
	push	es 
	pop	ds 
	add	ax,15 
	mov	cl,4 
	shr	ax,cl 
	add	CompMemTop,ax 
	push	CompMemPtr CompMemTop 
	Invoke	RestoreHeap 
	pop	cx dx 
UpdateLinks	label	near 
	xor	bx,bx 
	lea	di,FirstUnit 
	call	_UpdateLinks 
	lea	di,UsedUnit 
	call	_UpdateLinks 
	mov	es,UnitList.Segm 
	xor	di,di 
	jmp	short @@3 
@@1:	cmp	es:[di].ulSegment,cx 
	jne	@@2 
	mov	es:[di].ulSegment,dx 
@@2:	mov	bl,es:[di].ulName.B0 
	lea	di,[di+size TUnitList+bx] 
@@3:	cmp	di,UnitList.Offs 
	jne	@@1 
	ret 
RestoreState	endp 
 
_UpdateLinks	proc	near 
	mov	ax,[di] 
	cmp	ax,cx 
	jne	@@4 
	mov	ax,dx 
	mov	[di],ax 
	jmp	short @@4 
@@1:	mov	es,ax 
	mov	di,es:uhName 
@@2:	mov	bl,es:[di].seName.B0 
	cmp	es:[di+size TSymbol+bx].usAddress,cx 
	jne	@@3 
	mov	es:[di+size TSymbol+bx].usAddress,dx 
@@3:	mov	di,es:[di+size TSymbol+bx].usNext 
	or	di,di 
	jnz	@@2 
	mov	ax,es:uhNext 
	cmp	ax,cx 
	jne	@@4 
	mov	ax,dx 
	mov	es:uhNext,ax 
@@4:	or	ax,ax 
	jnz	@@1 
	ret 
_UpdateLinks	endp 
 
Add2TpuList	proc	near 
	mov	ax,CompiledCode.Segm 
	mov	CompMemPtr,ax 
	mov	di,TpuListPtr 
	cmp	di,offset TpuList[4016] 
	ja	@@1 
	mov	es,FirstUnit 
	mov	es:uhTpuName,di 
	Invoke	CopyDSCStr 
	mov	TpuListPtr,di 
	ret 
@@1:	mov	ax,18 
	Chain	CompileError 
Add2TpuList	endp 
 
FormUnit	proc	near 
	lea	si,Dictionary 
	xor	ax,ax 
@@1:	add	ax,[si].hrAddress.Offs 
	jc	@@2 
	add	si,size THeapRecord 
	cmp	si,offset TempDict 
	jne	@@1 
	cmp	ax,0fff0h 
	jbe	@@3 
@@2:	mov	ax,123 
	Chain	CompileError 
@@3:	les	ax,Dictionary 
	mov	di,uhProcMap 
	lea	si,ProcMap 
@@4:	stosw 
	xchg	ax,di 
	push	ds si 
	lds	cx,[si].hrAddress 
	xor	si,si 
	Invoke	MoveBlock 
	pop	si ds 
	xchg	ax,di 
	add	si,size THeapRecord 
	cmp	si,offset TempDict 
	jne	@@4 
	mov	Dictionary.Offs,ax 
	stosw 
	mov	ax,CompiledCode.Offs 
	stosw 
	mov	ax,CompiledConst.Offs 
	stosw 
	mov	ax,CodeFixups.Offs 
	stosw 
	mov	ax,ConstFixups.Offs 
	stosw 
	mov	ax,VarsSize 
	stosw 
	mov	di,Dictionary.Offs 
	call	Normalize 
	lea	si,CompiledCode 
@@5:	push	ds si 
	lds	cx,[si].hrAddress 
	xor	si,si 
	xor	di,di 
	Invoke	MoveBlock 
	call	Normalize 
	pop	si 
	pop	ds 
	mov	[si].hrAddress.Segm,ax 
	add	si,size THeapRecord 
	cmp	si,offset StmtPart 
	jne	@@5 
	mov	CompMemPtr,es 
	ret 
FormUnit	endp 
 
Normalize	proc	near 
	mov	cx,di 
	neg	cx 
	and	cx,0fh 
	xor	ax,ax 
	rep	stosb 
	mov	cl,4 
	shr	di,cl 
	mov	ax,es 
	add	di,ax 
	mov	es,di 
	ret 
Normalize	endp 
 
WriteUnit	proc	near 
	mov	dx,Dictionary.Segm 
@@1:	mov	ax,CompMemPtr 
	sub	ax,dx 
	jz	@@3 
	cmp	ax,1000h 
	jb	@@2 
	mov	ax,0fffh 
@@2:	push	ax dx 
	mov	cl,4 
	shl	ax,cl 
	mov	cx,ax 
	xor	ax,ax 
	mov	bx,FileHandle 
	Invoke	WriteHandle 
	pop	dx ax 
	add	dx,ax 
	jmp	@@1 
@@3:	ret 
WriteUnit	endp 
 
ReadUnit	proc	near 
	mov	dx,es:uhTpuName 
	or	dx,dx 
	jz	@@2 
	Invoke	OpenHandle 
	mov	bx,ax 
	mov	ax,es:uhEndTrace 
	add	ax,15 
	and	ax,0fff0h 
	xor	dx,dx 
	or	di,di 
	jz	@@1 
	mov	cx,es:uhCodeSize 
	call	AddLong 
	mov	cx,es:uhConstSize 
	call	AddLong 
@@1:	xor	cx,cx 
	push	bx 
	Invoke	SeekHandle 
	pop	bx 
	push	es 
	Invoke	ReadFile 
	Invoke	CloseHandle 
	mov	bx,es 
	pop	es 
	mov	es:uhCodeSeg,bx 
	mov	ax,es:uhCodeSize 
	call	CondAddPara 
	mov	es:uhConstSeg,bx 
	mov	ax,es:uhConstSize 
	call	CondAddPara 
	mov	es:uhCodeFixupSeg,bx 
	mov	ax,es:uhCodeFixupSize 
	call	AddPara 
	mov	es:uhConstFixupSeg,bx 
@@2:	Chain	UpdateCompInfo 
ReadUnit	endp 
 
AddLong	proc	near 
	add	cx,15 
	and	cx,0fff0h 
	add	ax,cx 
	adc	dx,0 
	ret 
AddLong	endp 
 
CondAddPara	proc	near 
	or	di,di 
	jnz	@@1 
AddPara	label	near 
	add	ax,15 
	mov	cl,4 
	shr	ax,cl 
	add	bx,ax 
@@1:	ret 
CondAddPara	endp 
 
DiscardUnits	proc	near 
	mov	es,FirstUnit 
	mov	ax,es:uhCodeSeg 
	mov	CompMemPtr,ax 
	ret 
DiscardUnits	endp 
 
ReadLibrary	proc	near 
	cld 
	lea	ax,@@4 
	Invoke	SetErrHandler 
	xor	ax,ax 
	mov	LibraryUnits,ax 
	mov	dx,UnitName 
	or	dx,dx 
	jz	@@2 
	Invoke	OpenHandle 
	mov	bx,ax 
	Invoke	ReadFile 
	Invoke	CloseHandle 
@@1:	cmp	es:uhSignature.W0,'PT' 
	jne	@@3 
	cmp	es:uhSignature.W2,'9U' 
	jne	@@3 
	mov	bx,es 
	call	CalcSegs 
	mov	ax,LibraryUnits 
	mov	es:uhLink,ax 
	mov	LibraryUnits,es 
	mov	es,bx 
	cmp	bx,CompMemPtr 
	jne	@@1 
@@2:	ret 
@@3:	mov	ax,72 
	mov	dx,UnitName 
	Chain	ParamError2 
@@4:	xor	ax,ax 
	mov	LibraryUnits,ax 
	ret 
ReadLibrary	endp 
 
CalcSegs	proc	near 
	mov	ax,es:uhEndTrace 
	call	@@1 
	mov	es:uhCodeSeg,bx 
	mov	ax,es:uhCodeSize 
	call	@@1 
	mov	es:uhConstSeg,bx 
	mov	ax,es:uhConstSize 
	call	@@1 
	mov	es:uhCodeFixupSeg,bx 
	mov	ax,es:uhCodeFixupSize 
	call	@@1 
	mov	es:uhConstFixupSeg,bx 
	mov	ax,es:uhDataFixupSize 
@@1:	add	ax,15 
	mov	cl,4 
	shr	ax,cl 
	add	bx,ax 
	ret 
CalcSegs	endp 
 
	end