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


	model	large compiler_text,pascal 
	include	compiler.inc 
 
	.code	compiler_text 
 
	public	GetMemOnBottom 
	public	FreeMemOnBottom 
	public	GetMemOnTop 
	public	FreeMemOnTop 
	public	MarkMem 
	public	ReleaseMem 
	public	GetMemAvail 
	public	InitHeap 
	public	GetDictMem 
	public	GetStmtMem 
	public	GetMemory 
	public	SaveHeap 
	public	RestoreHeap 
	public	ReadFile 
 
GetMemOnBottom	proc	near 
	add	ax,15 
	mov	cl,4 
	shr	ax,cl 
	mov	bx,CompMemPtr 
	add	ax,bx 
	cmp	ax,CompMemTop 
	ja	NoMemory 
	mov	CompMemPtr,ax 
	ret 
GetMemOnBottom	endp 
 
FreeMemOnBottom	proc	near 
	mov	CompMemPtr,bx 
	ret 
FreeMemOnBottom	endp 
 
GetMemOnTop	proc	near 
	add	ax,15 
	mov	cl,4 
	shr	ax,cl 
	mov	bx,CompMemTop 
	sub	bx,ax 
	cmp	bx,CompMemPtr 
	jb	NoMemory 
	mov	CompMemTop,bx 
	ret 
GetMemOnTop	endp 
 
FreeMemOnTop	proc	near 
	add	ax,15 
	mov	cl,4 
	shr	ax,cl 
	add	ax,bx 
	mov	CompMemTop,ax 
	ret 
FreeMemOnTop	endp 
 
MarkMem	proc	near 
	mov	bx,CompMemPtr 
	ret 
MarkMem	endp 
 
ReleaseMem	proc	near 
	mov	CompMemPtr,bx 
	ret 
ReleaseMem	endp 
 
NoMemory	proc	near 
	mov	ax,1 
	Chain	CompileError 
NoMemory	endp 
 
GetMemAvail	proc	near 
	mov	ax,CompMemTop 
	sub	ax,CompMemPtr 
	mov	cl,4 
	rol	ax,cl 
	mov	dx,ax 
	and	ax,0fff0h 
	and	dx,0fh 
	ret 
GetMemAvail	endp 
 
InitHeap	proc	near 
	mov	FirstHeapRec,di 
	mov	EndHeapRec,dx 
	push	ds 
	pop	es 
@@1:	xor	ax,ax 
	stosw 
	mov	ax,CompMemPtr 
	stosw 
	xor	ax,ax 
	stosw 
	movsw 
	cmp	di,dx 
	jne	@@1 
	ret 
InitHeap	endp 
 
GetDictMem	proc	near 
	lea	bx,Dictionary 
	jmp	short GetMemory 
GetStmtMem	label	near 
	lea	bx,StmtPart 
GetMemory	label	near 
	les	di,[bx].hrAddress 
	add	ax,di 
	jc	@@2 
	mov	[bx].hrAddress.Offs,ax 
	cmp	ax,[bx].hrLimit 
	ja	@@3 
	ret 
@@2:	mov	ax,[bx].hrError 
	Chain	CompileError 
@@3:	cmp	ax,0fff0h 
	ja	@@2 
	push	cx dx si di es 
	add	ax,15 
	and	ax,0fff0h 
	cmp	ExactAlloc,0 
	jne	@@6 
	mov	ax,200h 
@@4:	cmp	ax,[bx].hrAddress.Offs 
	ja	@@6 
	shl	ax,1 
	cmp	ax,2000h 
	jb	@@4 
@@5:	cmp	ax,[bx].hrAddress.Offs 
	ja	@@6 
	add	ax,2000h 
	jae	@@5 
	mov	ax,0fff0h 
@@6:	sub	ax,[bx].hrLimit 
	mov	cl,4 
	shr	ax,cl 
	mov	dx,CompMemTop 
	sub	dx,CompMemPtr 
	cmp	ax,dx 
	jbe	@@7 
	mov	ax,dx 
	shl	ax,cl 
	add	ax,[bx].hrLimit 
	cmp	ax,[bx].hrAddress.Offs 
	jb	@@10 
	mov	ax,dx 
@@7:	add	CompMemPtr,ax 
	mov	dx,ax 
	shl	dx,cl 
	add	[bx].hrLimit,dx 
	mov	dx,bx 
	mov	bx,EndHeapRec 
@@8:	sub	bx,size THeapRecord 
	cmp	bx,dx 
	je	@@9 
	push	ds 
	lds	cx,[bx].hrAddress 
	mov	di,ds 
	add	di,ax 
	mov	es,di 
	xor	si,si 
	xor	di,di 
	Invoke	MoveBlockRev 
	pop	ds 
	add	[bx].hrAddress.Segm,ax 
	jmp	@@8 
@@9:	pop	es di si dx cx 
	ret 
@@10:	mov	ax,1 
	Chain	CompileError 
GetDictMem	endp 
 
SaveHeap	proc	near 
	mov	bx,FirstHeapRec 
	mov	ax,[bx].hrAddress.Segm 
	mov	CompMemPtr,ax 
	mov	bx,EndHeapRec 
	mov	dx,CompMemTop 
@@1:	sub	bx,size THeapRecord 
	mov	ax,[bx].hrAddress.Offs 
	add	ax,15 
	and	ax,0fff0h 
	mov	[bx].hrLimit,ax 
	mov	cl,4 
	shr	ax,cl 
	sub	dx,ax 
	push	ds 
	lds	cx,[bx].hrAddress 
	mov	es,dx 
	xor	si,si 
	xor	di,di 
	Invoke	MoveBlockRev 
	pop	ds 
	mov	[bx].hrAddress.Segm,dx 
	cmp	bx,FirstHeapRec 
	jne	@@1 
	mov	CompMemTop,dx 
	ret 
SaveHeap	endp 
 
RestoreHeap	proc	near 
	mov	bx,EndHeapRec 
	mov	ax,[bx-size THeapRecord].hrLimit 
	mov	cl,4 
	shr	ax,cl 
	add	ax,[bx-size THeapRecord].hrAddress.Segm 
	mov	CompMemTop,ax 
	mov	bx,FirstHeapRec 
	mov	dx,CompMemPtr 
@@1:	push	ds 
	lds	cx,[bx].hrAddress 
	mov	es,dx 
	xor	si,si 
	xor	di,di 
	Invoke	MoveBlock 
	pop	ds 
	mov	[bx].hrAddress.Segm,dx 
	mov	ax,[bx].hrAddress.Offs 
	add	ax,15 
	mov	cl,4 
	shr	ax,cl 
	add	dx,ax 
	add	bx,8 
	cmp	bx,EndHeapRec 
	jne	@@1 
	mov	CompMemPtr,dx 
	ret 
RestoreHeap	endp 
 
ReadFile	proc	near 
	mov	es,CompMemPtr 
@@1:	mov	ax,CompMemTop 
	mov	dx,CompMemPtr 
	sub	ax,dx 
	jz	@@3 
	cmp	ax,1000h 
	jb	@@2 
	mov	ax,0fffh 
@@2:	mov	cl,4 
	shl	ax,cl 
	mov	cx,ax 
	xor	ax,ax 
	push	bx 
	push	cx 
	Invoke	ReadHandle 
	push	ax 
	add	ax,15 
	mov	cl,4 
	shr	ax,cl 
	add	CompMemPtr,ax 
	pop	ax cx bx 
	cmp	ax,cx 
	je	@@1 
	ret 
@@3:	mov	ax,1 
	Chain	CompileError 
ReadFile	endp 
 
	end