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


	model	large compiler_text,pascal 
	include	compiler.inc 
 
	.data? 
 
CodeSz		dw	? 
FixupSz		dw	? 
JumpChain	dw	? 
CurLine		dw	? 
CurCode		dw	? 
 
	.code	compiler_text 
 
	public	AddGoal 
	public	FlushGoals 
	public	Use2Exprs 
	public	UseExpr 
	public	UseGoal 
	public	DoneExpr 
	public	DoneGoal 
	public	PutLineNumber 
	public	GetLineNumber 
	public	PutByte 
	public	PutWord 
	public	PutJmp 
	public	AddToChain 
	public	PutLabel 
	public	PutSystemCall 
	public	PutFixup 
	public	PutUseUnit 
	public	PutCodeConst 
	public	PutConst 
	public	WordAlignConst 
	public	PutConstFixup 
	public	RearrangeCode 
 
AddGoal	proc	near 
	cmp	word ptr [bx],62 
	je	@@1 
	add	word ptr [bx],2 
	add	bx,[bx] 
	mov	[bx],ax 
	ret 
@@1:	push	bx ax 
	call	FlushGoals 
	pop	ax 
	call	UseGoal 
	call	DoneGoal 
	pop	bx 
	mov	word ptr [bx],2 
	mov	[bx+2],ax 
	ret 
AddGoal	endp 
 
FlushGoals	proc	near 
	mov	cx,[bx] 
	shr	cx,1 
	jz	@@2 
@@1:	add	bx,2 
	mov	ax,[bx] 
	push	bx 
	call	UseGoal 
	pop	bx 
	loop	@@1 
@@2:	ret 
FlushGoals	endp 
 
Use2Exprs	proc	near 
	call	UseExpr 
	xchg	si,di 
	call	UseExpr 
	xchg	si,di 
	ret 
Use2Exprs	endp 
 
UseExpr	proc	near 
	xor	ax,ax 
	xchg	ax,[di].exCode 
UseGoal	label	near 
	or	ax,ax 
	jz	@@1 
	push	es di ax 
	mov	ax,3 
	Invoke	GetStmtMem 
	mov	al,0 
	stosb 
	pop	ax 
	stosw 
	pop	di 
	pop	es 
@@1:	ret 
UseExpr	endp 
 
DoneExpr	proc	near 
	call	DoneGoal 
	mov	[di].exCode,ax 
	ret 
DoneExpr	endp 
 
DoneGoal	proc	near 
	mov	ax,LastGoal 
	sub	ax,StmtPart.Offs 
	jz	@@1 
	push	es di 
	mov	ax,1 
	Invoke	GetStmtMem 
	mov	al,2 
	stosb 
	mov	ax,di 
	xchg	ax,LastGoal 
	pop	di es 
@@1:	ret 
DoneGoal	endp 
 
PutLineNumber	proc	near 
	or	ax,ax 
	jz	@@1 
	push	es di ax 
	mov	ax,3 
	Invoke	GetStmtMem 
	mov	al,18 
	stosb 
	pop	ax 
	stosw 
	pop	di es 
@@1:	ret 
PutLineNumber	endp 
 
GetLineNumber	proc	near 
	test	GlobalOptions,coDebugInfo 
	jz	@@1 
	mov	di,FileStackPtr 
	mov	ax,[di].fsLineNumber 
	cmp	ax,LastLineNumber 
	je	@@1 
	mov	LastLineNumber,ax 
	ret 
@@1:	xor	ax,ax 
	ret 
GetLineNumber	endp 
 
PutByte	proc	near 
	push	es di ax 
	mov	ax,2 
	Invoke	GetStmtMem 
	mov	al,4 
	stosb 
	pop	ax 
	stosb 
	pop	di es 
	ret 
PutByte	endp 
 
PutWord	proc	near 
	push	es di ax 
	mov	ax,3 
	Invoke	GetStmtMem 
	mov	al,6 
	stosb 
	pop	ax 
	stosw 
	pop	di es 
	ret 
PutWord	endp 
 
PutJmp	proc	near 
	mov	dx,StmtPart.Offs 
	xchg	dx,[bx] 
	push	es di ax 
	mov	ax,8 
	Invoke	GetStmtMem 
	mov	al,8 
	stosb 
	pop	ax 
	stosb 
	mov	ax,dx 
	stosw 
	pop	di es 
	ret 
PutJmp	endp 
 
AddToChain	proc	near 
	mov	dx,[bx] 
	or	dx,dx 
	jnz	@@1 
	mov	[bx],ax 
	ret 
@@1:	push	ds 
	mov	ds,StmtPart.segm 
@@2:	mov	bx,dx 
	mov	dx,[bx+2] 
	or	dx,dx 
	jnz	@@2 
	mov	[bx+2],ax 
	pop	ds 
	ret 
AddToChain	endp 
 
PutLabel	proc	near 
	mov	ax,[bx] 
	sub	[bx],ax 
	or	ax,ax 
	jnz	@@1 
	ret 
@@1:	push	es di ax 
	mov	ax,3 
	Invoke	GetStmtMem 
	mov	al,12 
	stosb 
	pop	ax 
@@2:	mov	bx,ax 
	mov	ax,es:[bx+2] 
	mov	es:[bx+2],di 
	or	ax,ax 
	jnz	@@2 
	pop	di es 
	ret 
PutLabel	endp 
 
PutSystemCall	proc	near 
	shl	ax,1 
	jnc	@@1 
	Invoke	Need8087 
@@1:	push	ax 
	mov	al,9ah			; call	far ptr ... 
	call	PutByte 
	pop	bx 
	mov	ax,SystemUnit 
	mov	cx,ffProc+ffPtr 
	xor	dx,dx 
PutFixup	label	near 
	push	es di bx 
	call	PutUseUnit 
	or	cx,ax 
	mov	ax,7 
	Invoke	GetStmtMem 
	mov	al,14 
	stosb 
	mov	ax,cx 
	stosw 
	pop	ax 
	stosw 
	mov	ax,dx 
	stosw 
	pop	di es 
	ret 
PutSystemCall	endp 
 
PutUseUnit	proc	near 
	mov	es,UnitList.Segm 
	xor	di,di 
	xor	bx,bx 
	jmp	short @@2 
@@1:	cmp	ax,es:[di].ulSegment 
	je	@@3 
	mov	bl,es:[di].ulName.B0 
	lea	di,[di+size TUnitList+bx] 
@@2:	cmp	di,UnitList.Offs 
	jne	@@1 
	push	cx si ds ax 
	mov	es,ax 
	mov	si,es:uhName 
	add	si,seName 
	mov	al,es:[si].B0 
	mov	ah,0 
	inc	ax 
	mov	cx,ax 
	add	ax,size TUnitList-1 
	lea	bx,UnitList 
	Invoke	GetMemory 
	pop	ax 
	push	di 
	stosw 
	mov	ds,ax 
	rep	movsb 
	pop	di ds si cx 
@@3:	mov	ax,di 
	ret 
PutUseUnit	endp 
 
PutCodeConst	proc	near 
	push	di si 
	lea	si,CompiledCode 
	mov	di,CodeSectStart 
	call	CheckDupes 
	mov	bx,CodeMap.Offs 
	sub	dx,CodeSectStart 
	pop	si di 
	ret 
PutCodeConst	endp 
 
PutConst	proc	near 
	push	di si 
	lea	si,CompiledConst 
	mov	di,ConstSectStart2 
	call	CheckDupes 
	mov	bx,ConstMap.Offs 
	sub	dx,ConstSectStart 
	pop	si di 
	ret 
PutConst	endp 
 
CheckDupes	proc	near 
	push	es 
	xchg	ax,dx 
	xchg	bx,si 
	les	cx,[bx] 
	sub	cx,di 
	sub	cx,dx 
	jc	@@4 
	inc	cx 
	lodsb 
@@1:	repne	scasb 
	jne	@@3 
	push	cx 
	mov	cx,dx 
	dec	cx 
	jz	@@2 
	push	di si 
	repe	cmpsb 
	pop	si di 
@@2:	pop	cx 
	jz	@@5 
	or	cx,cx 
	jnz	@@1 
@@3:	dec	si 
@@4:	mov	ax,dx 
	Invoke	GetMemory 
	push	di 
	mov	cx,dx 
	rep	movsb 
	pop	di 
	inc	di 
@@5:	dec	di 
	mov	dx,di 
	mov	ax,Dictionary.segm 
	pop	es 
	ret 
CheckDupes	endp 
 
WordAlignConst	proc	near 
	mov	ax,1 
	test	CompiledConst.Offs,ax 
	jz	@@1 
	push	di es 
	lea	bx,CompiledConst 
	Invoke	GetMemory 
	xor	al,al 
	stosb 
	pop	es di 
@@1:	ret 
WordAlignConst	endp 
 
PutConstFixup	proc	near 
	push	es di bx 
	call	PutUseUnit 
	or	cx,ax 
	mov	ax,size TFixup 
	lea	bx,ConstFixups 
	Invoke	GetMemory 
	mov	ax,cx 
	stosw 
	pop	ax 
	stosw 
	mov	ax,dx 
	stosw 
	mov	ax,si 
	sub	ax,ConstSectStart 
	stosw 
	pop	di es 
	ret 
PutConstFixup	endp 
 
RearrangeCode	proc	near 
	test	GlobalOptions,coDebugInfo 
	jz	@@1 
	mov	ax,3 
	Invoke	GetStmtMem 
	mov	al,18 
	stosb 
	mov	ax,LastLineNumber 
	inc	ax 
	stosw 
@@1:	mov	ax,1 
	Invoke	GetStmtMem 
	mov	al,20 
	stosb 
@@2:	call	ScanCode 
	call	OptimizeJumps 
	jnz	@@2 
	jmp	Rearrange 
RearrangeCode	endp 
 
ScanCode	proc	near 
	xor	cx,cx 
	xor	dx,dx 
	mov	di,CompiledCode.offs 
	mov	si,LastGoal 
	mov	ds,StmtPart.segm 
@@1:	lodsb 
	mov	bl,al 
	xor	bh,bh 
	jmp	cs:@@2[bx] 
@@2	dw	@@Use 
	dw	@@Done 
	dw	@@Byte 
	dw	@@Word 
	dw	@@Jmp 
	dw	@@Jmps 
	dw	@@Lbl 
	dw	@@Fixp 
	dw	@@Fixp 
	dw	@@Line 
	dw	@@End 
@@Use:	lodsw 
	push	si 
	mov	si,ax 
	jmp	@@1 
@@Done:	pop	si 
	jmp	@@1 
@@Byte:	inc	si 
	inc	di 
	jmp	@@1 
@@Word:	inc	si 
	inc	si 
	inc	di 
	inc	di 
	jmp	@@1 
@@Jmp:	mov	[si+3],di 
	mov	[si+5],dx 
	mov	dx,si 
	lodsb 
	add	si,6 
	add	di,3 
	cmp	al,80h 
	jae	@@1 
	inc	di 
	inc	di 
	jmp	@@1 
@@Jmps:	add	si,7 
	inc	di 
	inc	di 
	jmp	@@1 
@@Lbl:	mov	[si],di 
	inc	si 
	inc	si 
	jmp	@@1 
@@Fixp:	lodsw 
	add	si,4 
	add	cx,8 
	inc	di 
	inc	di 
	and	ax,ffPtr 
	cmp	ax,ffPtr 
	jne	@@1 
	inc	di 
	inc	di 
	jmp	@@1 
@@Line:	inc	si 
	inc	si 
	jmp	@@1 
@@End:	push	ss 
	pop	ds 
	mov	FixupSz,cx 
	mov	JumpChain,dx 
	sub	di,CompiledCode.Offs 
	mov	CodeSz,di 
	ret 
ScanCode	endp 
 
OptimizeJumps	proc	near 
	xor	cx,cx 
	mov	si,JumpChain 
	mov	ds,StmtPart.Segm 
	jmp	short @@3 
@@1:	mov	bx,[si+1] 
	mov	ax,[bx] 
	sub	ax,[si+3] 
	cmp	ax,129 
	jg	@@2 
	cmp	ax,-126 
	jl	@@2 
	mov	byte ptr [si-1],0ah 
	inc	cx 
@@2:	mov	si,[si+5] 
@@3:	or	si,si 
	jnz	@@1 
	push	ss 
	pop	ds 
	or	cx,cx 
	ret 
OptimizeJumps	endp 
 
Rearrange	proc	near 
	test	GlobalOptions,coDebugInfo 
	jz	@@3 
	mov	es,Dictionary.segm 
	mov	di,CurProc 
	mov	cl,es:[di] 
	mov	ax,LastLineNumber 
	sub	ax,FirstLineNumber 
	shl	ax,1 
	add	ax,size TTraceTable+2 
	lea	bx,TraceTable 
	Invoke	GetMemory 
	xor	ax,ax 
	test	GlobalOptions,coLocalSymbols 
	jz	@@2 
	test	cl,pfAssembler 
	jz	@@1 
	mov	ax,ParamsSize 
	or	ax,LocalsSize 
	jz	@@2 
@@1:	mov	ax,CurScope 
@@2:	stosw 
	mov	bx,FileStackPtr 
	mov	ax,[bx].fsNameEntry 
	stosw 
	mov	ax,CompiledCode.Offs 
	mov	CurCode,ax 
	sub	ax,CodeSectStart 
	stosw 
	mov	ax,FirstLineNumber 
	mov	CurLine,ax 
	stosw 
	mov	ax,LastLineNumber 
	sub	ax,FirstLineNumber 
	inc	ax 
	stosw 
	mov	TraceTable.Offs,di 
@@3:	mov	ax,FixupSz 
	lea	bx,CodeFixups 
	Invoke	GetMemory 
	mov	CodeFixups.Offs,di 
	mov	ax,CodeSz 
	lea	bx,CompiledCode 
	Invoke	GetMemory 
	mov	si,LastGoal 
	mov	ds,StmtPart.Segm 
	assume	ds:nothing 
@@4:	lodsb 
	mov	bl,al 
	xor	bh,bh 
	jmp	cs:@@5[bx] 
@@5	dw	@@Use 
	dw	@@Done 
	dw	@@Byte 
	dw	@@Word 
	dw	@@Jmp 
	dw	@@Jmps 
	dw	@@Lbl 
	dw	@@Fixp 
	dw	@@Fixa 
	dw	@@Line 
	dw	@@End 
@@Use:	lodsw 
	push	si 
	mov	si,ax 
	jmp	@@4 
@@Done:	pop	si 
	jmp	@@4 
@@Byte:	movsb 
	jmp	@@4 
@@Word:	movsw 
	jmp	@@4 
@@Jmp:	lodsb 
	cmp	al,cdAlways 
	je	@@6 
	cmp	al,80h 
	jae	@@7 
	xor	al,1 
	mov	ah,3 
	stosw 
@@6:	mov	al,0e9h 
	stosb 
	lodsw 
	mov	bx,ax 
	mov	ax,[bx] 
	sub	ax,di 
	dec	ax 
	dec	ax 
	stosw 
	add	si,4 
	jmp	@@4 
@@7:	push	ss 
	pop	ds 
	mov	ax,161 
	Chain	CompileError 
@@Jmps:	movsb 
	lodsw 
	mov	bx,ax 
	mov	ax,[bx] 
	sub	ax,di 
	dec	ax 
	stosb 
	add	si,4 
	jmp	@@4 
@@Lbl:	inc	si 
	inc	si 
	jmp	@@4 
@@Fixp:	mov	cx,di 
	les	di,CodeFixups 
	lodsw 
	stosw 
	mov	dx,ax 
	movsw 
	movsw 
@@8:	mov	ax,cx 
	sub	ax,CodeSectStart 
	stosw 
	mov	CodeFixups.offs,di 
	mov	di,cx 
	mov	es,CompiledCode.segm 
	xor	ax,ax 
	stosw 
	and	dx,ffPtr 
	cmp	dx,ffPtr 
	jne	@@9 
	stosw 
@@9:	jmp	@@4 
@@Fixa:	mov	cx,di 
	lodsw 
	xchg	ax,di 
	lodsw 
	xchg	ax,di 
	mov	es,Dictionary.Segm 
	mov	bl,es:[di].seName.B0 
	mov	bh,0 
	mov	bx,es:[di+size TSymbol+bx] 
	or	bx,bx 
	jz	@@10 
	les	di,CodeFixups 
	stosw 
	mov	dx,ax 
	mov	ax,CodeMap.Offs 
	stosw 
	lodsw 
	add	ax,[bx] 
	sub	ax,CodeSectStart 
	stosw 
	jmp	@@8 
@@10:	push	ss 
	pop	ds 
	mov	ax,82 
	add	di,seName 
	Chain	ParamError 
@@Line:	lodsw 
	mov	cx,ax 
	sub	cx,CurLine 
	jbe	@@12 
	mov	CurLine,ax 
	mov	ax,di 
	sub	ax,CurCode 
	mov	CurCode,di 
	mov	dx,di 
	mov	bx,es 
	les	di,TraceTable 
	cmp	ax,80h 
	jb	@@11 
	xchg	al,ah 
	or	al,80h 
	stosb 
	xchg	al,ah 
@@11:	stosb 
	xor	al,al 
	dec	cx 
	rep	stosb 
	mov	TraceTable.Offs,di 
	mov	di,dx 
	mov	es,bx 
@@12:	jmp	@@4 
@@End:	push	ss 
	pop	ds 
	ret 
Rearrange	endp 
 
	end