*************************************************************************
* 512*512:65535色 -> 256*256:8色 変換（バッファー格納型）
*************************************************************************
* void b8conv_256(unchar buff[256*256])
*************************************************************************

SHIFT1		equ 3		* /8
AND1		equ %111	* %8

	* 使用ワークエリア
	.xref		tonebuf0
	.xref		tonebuf1
	
	.include	bg800.ss
	.include	avgread.ss

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

READ2	macro					* ２ライン平均読み出し
	AVGREAD					* 平均読み出し
	
	* 定数ロード
	move.w	#%11111_00000_00000_0,d6	* 緑の読み出し/dot on パターン
	move.w	#AND1,d7			* %8のand.wパターン
	move.w	#LIGHT,d2			* ＤＯＴ　ＯＮになる明るさの値
	endm

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

	.xdef	_b8conv_256		* Ｃインターフェース
_b8conv_256:
	move.l	4(sp),a0		* buffer address
	movem.l	d3-d7/a3-a5,-(sp)
	
	SUPERMODE			* SuperVisor mode
	move.l	d0,-(sp)		* save user mode stack pointer
	
	* 行バッファークリア
	move.l	a0,a5			* buffer address（a0は使うので）
	move.l	#tonebuf0,a0		* tonebuf0/1はつながっているので連続で消す
	move.w	#SIZE_OF_X*3-1,d0	* *3 for 青赤緑 , -1 for dbra
l1:
	clr.l	(a0)+			* .wのところを.lにすることで倍の領域を消す
	dbra	d0,l1
	
	move.l	#GRAM,a2		* GRAM line top address
	move.l	#tonebuf0,a4		* a3=下のラインバッファー、a4=今のラインバッファー
	move.l	#tonebuf1,a3		* 最初のexgで入れ替わるから逆にしておく
	
	move.w	#(SIZE_OF_Y/2)-1,d1	* y
l2:
	swap	d1
	
	exg	a3,a4			* a3=今のラインバッファー、a4=下のラインバッファー
					* １行毎に入れ替える
	move.l	a4,a1
	move.l	a3,a0
	
	* Ｘ方向展開
	* 行最初のドット
	moveq.l	#0,d3			* 青 : carry=0
	moveq.l	#0,d4			* 赤 : carry=0
	moveq.l	#0,d5			* 緑 : carry=0
	
	READ2				* (GRAM+GRAM+1/2).w -> d0
	DOT_SUB				* ドット書き込み
	DOT_MAWARI1	d3		* 周りへの分配：青
	DOT_MAWARI1	d4		* 赤
	DOT_MAWARI1	d5		* 緑
	
	* 中間の５１２−４ドット
	move.w	#(SIZE_OF_X-4)/2-1,d1	* -1 for dbra
l3:
	READ2				* (GRAM+GRAM+1/2).w -> d0
	DOT_SUB				* ドット書き込み
	DOT_MAWARI2	d3		* 周りへの分配：青
	DOT_MAWARI2	d4		* 赤
	DOT_MAWARI2	d5		* 緑
	
	dbra	d1,l3			* x - loop
	
	* 行最後のドット
	READ2				* (GRAM+GRAM+1/2).w -> d0
	DOT_SUB				* ドット書き込み
	DOT_MAWARI3	d3		* 周りへの分配：青
	DOT_MAWARI3	d4		* 赤
	DOT_MAWARI3	d5		* 緑
	
	lea.l	2*512(a2),a2		* 次の１行を飛ばす
	swap	d1
	dbra	d1,l2			* y - loop
	
	move.l	(sp)+,a1
	USERMODE			* to user mode
	movem.l	(sp)+,d3-d7/a3-a5
	rts

*************************************************************************
	.end
