*******************************************************************************
* TEXTPUT2(int x,int y,_FNTBUF *fnt,int col)
*******************************************************************************

	.include	defines.mac

	.if	0
	.text
FNTTEST	macro	size,code,x,y,col
	lea	work(pc),a1
	move.l	#size.shl.16+code,d1
	IOCS	_FNTGET
	pea	col.w
	pea	work(pc)
	pea	y.w
	pea	x.w
	jsr	_TEXTPUT2
	lea	4*4(sp),sp
	endm

	FNTTEST	 8,'R',80,0,%11
	FNTTEST	 8,'R',82,20,%10
	FNTTEST	12,'R',80,100,%01
	FNTTEST	12,'R',84,130,%11
	FNTTEST	 8,'Ｒ',80,200,%11
	FNTTEST	 8,'Ｒ',87,220,%01
	FNTTEST	12,'Ｒ',80,300,%10
	FNTTEST	12,'Ｒ',86,330,%11
	clr.w	-(sp)
	DOS	_EXIT2

work:	.ds.w	2
	.ds.b	3*24
	.even
	.endif

********************************************************************
dPUT	macro	reg		* 非byte境界データput
	move.b	(a1)+,d0	* read data
	ror.w	d4,d0		* SHIFT data pattern
	*
	not.b	d6		* 逆パターン
	and.b	d6,(reg)	* and with under
	or.b	d0,(reg)+	* pattern or
	*
	lsr.w	#8,d0
	not.b	d6		* 元に戻す
	and.b	d6,(reg)	* and with under
	or.b	d0,(reg)
	endm
********************************************************************
dCLR	macro	reg		* 非byte境界データclear
	not.b	d6		* 逆パターン
	and.b	d6,(reg)+
	not.b	d6		* 元に戻す
	and.b	d6,(reg)	* 下のパターンのandパターンを作る
	* これで下のパターンがクリアされた
	endm
********************************************************************

	.xdef	_TEXTPUT2	* Ｃインターフェース
_TEXTPUT2:
	move.l	sp,a2
	movem.l	d3-d6,-(sp)	* push registers
	SUPERMODE		* SuperVisor mode
	move.l	d0,spp		* save SSP
	IOCS	_B_CUROFF	* カーソルを消しておかないと時々変になる
				* カーソルが下パターンを復帰しようとするから
	* データサイズ読み出し
	move.l	12(a2),a1	* フォント構造体アドレス
	move.w	(a1)+,d1	* xl
	addq.w	#7,d1
	lsr.w	#3,d1		* (xl+7)/8 = byte数 -> d1
	move.w	(a1)+,d2	* yl -> d2
	* a1.l = font address
	
	* 表示位置アドレス算出
	* text 1line = graphic 16lines , graphic 1line = 1024/8=128bytes
	* text 1line = 16*128=2048bytes
	* a0 <- plane 0 address
	move.l	#TPLANE0,a0	* plane 0 top address
	moveq.l	#0,d0		* for longword
	move.w	8+2(a2),d0	* y
	lsl.l	#7,d0		* y*1024/8=y*128
	add.l	d0,a0		* +line offset
	move.w	4+2(a2),d0	* +x
	move.w	d0,d4		* d4=x(dots)
	lsr.w	#3,d0		* x-bytes
	add.w	d0,a0		* +x-bytes
	*
	and.l	#%111,d4	* x%8 (longword)
	moveq.l	#$ff,d6
	lsr.b	d4,d6		* and pattern
	move.w	#1024/8,d5	* 1line size
	sub.w	d1,d5		* 座標移動後に次のライン移動に必要なオフセット
	
	* 表示処理
	* d1.w = xl bytes
	* d2.w = yl lines
	* d4.w = x%8
	* d6.b = and pattern
	* a0.l = text-vram adrs (plane0)
	* a1.l = data adrs
	*
	subq.w	#1,d1		* xbytes -1 for dbra
	subq.w	#1,d2		* -1 for dbra
	*
	move.w	CRTCR21,-(sp)	* 画面モード保存
	move.w	16+2(a2),d0	* 色
	and.b	#%11,d0		* 色のみ取り出し
	beq	pblack		* 黒
	cmp.b	#%11,d0		* 白？
	bne	f2		* no -> 水色／黄色
	* 白Put
	move.w	#$133,CRTCR21	* plane0/1同時アクセス
	tst.w	d4		* byte境界？
	beq	f200		* yes
f201:	* 非byte境界
	move.w	d1,d3		* xbytes-1
f301:	dPUT	a0
	dbra	d3,f301
	lea	(d5.w,a0),a0	* to next line (plane 0)
	dbra	d2,f201
	bra	f40
	*
f200:	* byte境界
	move.w	d1,d3		* xbytes-1
f300:	move.b	(a1)+,(a0)+	* plane put
	dbra	d3,f300
	lea	(d5.w,a0),a0	* to next line (plane 0)
	dbra	d2,f200
	bra	f40

pblack:	* 黒Put
	move.w	#$133,CRTCR21	* plane0/1同時アクセス
	tst.w	d4		* byte境界？
	beq	f2000		* yes
f2001:	* 非byte境界
	move.w	d1,d3		* xbytes-1
f3001:	dCLR	a0
	dbra	d3,f3001
	lea	(d5.w,a0),a0	* to next line (plane 0)
	dbra	d2,f2001
	bra	f40
	*
f2000:	* byte境界
	move.w	d1,d3		* xbytes-1
f3000:	clr.b	(a0)+		* plane clear
	dbra	d3,f3000
	lea	(d5.w,a0),a0	* to next line (plane 0)
	dbra	d2,f2000
	bra	f40
	*
f2:	* 水色／黄色
	move.w	#$033,CRTCR21	* plane0/1同時アクセスなし
	move.l	a0,a2		* a0.l = plane 0 adrs (for put)
	add.l	#TPSIZE,a2	* a2.l = plane 1 adrs (for clear)
	cmp.b	#%10,d0		* 黄色？
	bne	f3		* no = 水色
	exg	a0,a2		* plane 0 clear , plane 1 put
f3:	tst.w	d4		* byte境界？
	beq	f20		* yes
f21:	* 非byte境界
	move.w	d1,d3		* xbytes-1
f31:	dPUT	a0		* plane put
	dCLR	a2		* plane clear
	dbra	d3,f31
	lea	(d5.w,a0),a0	* to next line (plane 0)
	lea	(d5.w,a2),a2	* to next line (plane 1)
	dbra	d2,f21
	bra	f40
	*
f20:	* byte境界
	move.w	d1,d3		* xbytes-1
f30:	move.b	(a1)+,(a0)+	* plane put
	clr.b	(a2)+		* plane clear
	dbra	d3,f30
	lea	(d5.w,a0),a0	* to next line (plane 0)
	lea	(d5.w,a2),a2	* to next line (plane 1)
	dbra	d2,f20
	*
f40:	move.w	(sp)+,CRTCR21	* 同時アクセス解除
f8:				* カーソル戻し
	tst.b	CURMODE		; カーソル表示スイッチ(<>0で表示)
				* 元はカーソルＯＦＦ？
	beq	cret		* yes
	IOCS	_B_CURON	* カーソル ON
cret:
	move.l	spp,a1		* a1=SSP
	USERMODE		* ユーザーモードに戻る
	movem.l	(sp)+,d3-d6	* pop registers
	rts

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

	.bss
spp:	* スタックポインター
	.ds.l	1

*******************************************************************************
* 場合分けが多いからソースが長いね。速度さえ無視すればもう「だいぶ」短く
* 出来るんだけどね。
* 後、ビットマスクを使うとか、byte単位書き込みの場合分けとかを入れれば
* もっと速くなるでしょう。
* そうそう、xl%8!=0のときに横に余分なデータが出るのも将来的にはなんとかしたいかな。
* このせいでprint12を連続表示した時にちょっとちらつくもんね。
*******************************************************************************
	.end
