************************************************************
* 圧縮テキスト画面データ展開（パターン＋色）
* void _puttext3(int adrs,unchar *buff,unchar *cbuff)
* buff[0,1]=wx(text)
* buff[2,3]=wy(text)
* buff[12〜27]=code table(16)
* buff[4,5,6,7]=buff size
* buff[8,9,10,11]=cbuff size
************************************************************

	.include	defines.mac
	.include	getput3.mac

************************************************************

READLEN	macro	c,len,buff,LIM	* 長さ読みだし
local	L2,L4
	move.b	c,len
	and.w	#LIM,len	* for wordを兼ねる
	bne	L2
	* len=$00 : 次の８ビットが長さ
	move.b	(buff)+,len
	add.w	#LIM,len
	bra.s	L4
	*
L2:	cmp.w	#LIM,len
	bne	L4
	* len=LIM : 次の１６ビット(High/Low)が長さ
	move.b	(buff)+,len
	lsl.w	#8,len
	move.b	(buff)+,len
L4:
	endm

************************************************************

LENPRS	macro			* 非圧縮コード展開
local	L5,L6,L8
	moveq.l	#1,d1		* len=1(word拡張も含む)
	cmp.b	#C16,d0		* 制御コード?
	bhi	L5		* No = 通常１バイトコード
	* 2byte/ﾗﾝﾚﾝｸﾞｽ圧縮
	tst.b	d0		* 2byte code?(=cmp.b #C0,d0)
	beq	L8		* Yes
	cmp.b	#C8,d0		* 8bitランレングス?
	beq	L6		* Yes = 8bit長さ読みだしへ
	* C16 : 16bitランレングス
	move.b	(a0)+,d1	* 16bit上位
	lsl.w	#8,d1
L6:	move.b	(a0)+,d1	* 8bit/16bit下位
L8:	move.b	(a0)+,d0	* 次の１バイトがコード
L5:
	endm

************************************************************

NEXTADRS	macro			* 次の座標へ
local	L14
	lea	TX(a5),a5		* ad+=TX
	dbra	d6,L14			* yy-- , yy>=0
	moveq.l	#CHY-1,d6		* yy=CHY , -1 for dbra
	lea	-TX*CHY+1(a5),a5	* next char
	dbra	d4,L14			* x-- , x>=0
	move.w	-12(a1),d4		* x=wx
	subq.w	#1,d4			* -1 for dbra
	lea	TX*CHY(a3),a3		* ad0+=(TX*CHY)
	move.l	a3,a5
	subq.w	#1,d5			* y-=CHY/CHY
L14:
	endm

************************************************************

	.xdef	__puttext3
__puttext3:
	move.l	sp,a2
	movem.l	d3-d7/a3-a5,-(sp)
	
	SUPERMODE		* SuperVisor mode
	move.l	d0,-(sp)	* push SSP
	
	moveq.l	#0,d0		* for word
	moveq.l	#0,d3		* clen=0
	moveq.l	#CHY-1,d6	* yy=CHY , -1 for dbra
	
	move.l	4(a2),a3	* VRAM初期アドレス
	move.l	a3,a5		* active VRAM address
	move.l	8(a2),a0	* buff
	move.l	12(a2),a2	* cbuff
	move.w	(a0)+,d4	* x=wx
	subq.w	#1,d4		* -1 for dbra
	move.w	(a0)+,d5	* y=wy
	addq.w	#8,a0		* skip size of buff&cbuff
	move.l	a0,a1		* buff0=buff
	lea	JOUI(a0),a0	* buff+=JOUI
	move.l	#CRTCR21,a4	* CRTC R21 address
	move.w	(a4),-(sp)	* save CRTC R21
	*
L0:	* パターン読みだし
	move.b	(a0)+,d0
	bclr.l	#7,d0		* bit7 check & clear
	beq	L1		* 非圧縮コード
	* 圧縮コード
	READLEN	d0,d1,a0,LIM	* 長さ読みだし
	lsr.b	#SFT,d0
	move.b	(a1,d0.w),d0	* コード読みだし
	bra	L6
L1:	* 非圧縮コード
	LENPRS			* 非圧縮コード展開
L6:	subq.w	#1,d1		* 長さ-1 for dbra
	* プレーンへの書き込み
L5:	dbra	d3,L9		* if (--clen)!=-1? then goto L9
	* 色&色長さ読みだし
	move.b	(a2)+,d2
	READLEN	d2,d3,a2,CLIM	* 色&長さ読みだし
	subq.w	#1,d3		* 長さ-1 for dbra
	and.w	#COL,d2		* 色読みだし
	or.w	#%1_00000000,d2	* 書き込み同時アクセスパターン
	move.w	d2,d7
	eor.w	#%0_00110000,d7	* クリア同時アクセスパターン
L9:	* パターン書き込み
	move.w	d2,(a4)		* 書き込み同時アクセス
	move.b	d0,(a5)		* plane on
	move.w	d7,(a4)		* クリア同時アクセス
	clr.b	(a5)		* plane off
	NEXTADRS		* 次の座標へ
	dbra	d1,L5		* len-- : 長さ分コード書き込み
	tst.w	d5		* y==0?
	bne	L0		* No
	*
	move.w	(sp)+,(a4)	* load CRTC R21
	
	move.l	(sp)+,a1	* pop SSP
	USERMODE		* to user mode
	
	movem.l	(sp)+,d3-d7/a3-a5
	rts

************************************************************
*	d0.b(w)	c		a0	buff
*	d1.w	len		a1	buff0
*	d2.w	color mask	a2	cbuff
*	d3.w	clen		a3	VRAM Plane
*	d4.w	x		a4	CRTC R21
*	d5.w	y		a5	active Plane
*	d6.w	yy		a6	未使用
*	d7.w	clear mask
************************************************************
	.end
