*   Routine di stampa veloce di View80

*   a0=puntatore a struct line
*   a1=puntatore a destinazione


	CSECT	text

	xdef	_fasttext

	xref	_CharData
	xref	_tab


* Inizio routine
_fasttext:

	movem.l	d2/d3/a2/a3/a5/a6,-(a7)

	moveq	#0,d1		;d1 e` usato solo per bytes
	movea.l	a1,a6		;a6=inizio destinazione

	move.b	4(a0),d0
	addq.b	#1,d0		;d0=len+1
	movea.l	(a0),a0		;a0=add
	lea		_CharData(a4),a5

* Main Loop
mainloop:
	subq.b	#1,d0
	beq.b	fine
	move.b	(a0)+,d1
	cmpi.b	#9,d1
	beq.b	tab
normal:
	lea		0(a5,d1.w),a3	;a3=sorc
	movea.l	a1,a2		;a2=dest
	addq	#1,a1
	moveq.l	#7,d2
writeloop:
	move.b	(a3),(a2)
	adda.w	#256,a3
	adda.w	#80,a2
	dbf		d2,writeloop
	bra.b	mainloop

* Gestione tab
tab:
	move.b	_tab(a4),d2
	beq.b	normal
	move.l	a6,d3
	sub.l	a1,d3
	neg.l	d3
	and.b	#%111,d3
	cmpi.b	#8,d2
	beq.b	tab2
	and.b	#%11,d3
	cmpi.b	#4,d2
	beq.b	tab2
	and.b	#%1,d3
	cmpi.b	#2,d2
	beq.b	tab2
	moveq	#0,d3
tab2:
	sub.b	d3,d2
	ext.w	d2
	adda.w	d2,a1
	bra.b	mainloop

* Fine
fine:
	movem.l	(a7)+,d2/d3/a2/a3/a5/a6
	rts


	end
