*************************************************************************
* 512*512:65535色 -> 白黒 PIX 変換（バッファー格納型）
* この中では画面の初期化はしないので外部で行なうこと
*************************************************************************
* void bbwconv_pix(unchar buff[512*512*2/3])
*************************************************************************
* ５１２＊５１２ -> ５１２＊（５１２＊２／３）：ＰＩＸ圧縮
* 横方向は５１２のまま
* 縦方向は２／３する
* ３ラインを単位として圧縮する
* 第１、第２ラインは平均して１ラインとし、第３ラインはそのまま出す
* だたし、５１２ラインは３で割り切れないので最後は２ラインの圧縮で終わる
*************************************************************************

	.include	defines.mac

	* 使用ワークエリア
	.xref		btonebuf0
	.xref		btonebuf1

	.include	bwhs0.ss

*************************************************************************
* １行処理マクロ

YLINE	macro	READ
local	gb4
	exg	a3,a4		* a3=今のラインバッファー、a4=下のラインバッファー
				* １行毎に入れ替える
	move.l	a4,a1
	move.l	a3,a0
	
	moveq.l	#0,d2		* carry=0
	
	* Ｘ方向展開
	* 行最初のドット
	READ			* (GRAM).w -> d0
	DOT_SUB			* ドット書き込み
	MAWARI1			* 周りへの配分
	
	* 中間の５１２−２ドット
	move.w	#SIZE_OF_X-2-1,d1	* -1 for dbra
gb4:
	READ			* (GRAM).w -> d0
	DOT_SUB			* ドット書き込み
	MAWARI			* 周りへの配分
	
	dbra	d1,gb4		* x - loop
	
	* 行最後のドット
	READ			* (GRAM).w -> d0
	DOT_SUB			* ドット書き込み
	MAWARI2			* 周りへの配分
	
	endm

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

GREAD	macro				* そのまま読み出し
	move.w	(a2)+,d0		* (GRAM).w -> d0
	endm

GREAD2	macro				* ２ライン平均読み出し
	move.l	d2,-(sp)
					* SXIMAGEの第１第２ライン平均処理を参考
	move.w	(a2)+,d0		* 第１ライン
	move.w	2*512-2(a2),d2		* 第２ライン
	move.w	d0,d6
	move.w	d2,d7
	
	and.w	#%11111_00000_11111_0,d0	* 第１ライン 緑|青
	and.w	#%11111_00000_11111_0,d2	* 第２ライン 緑|青
	add.w	d2,d0				* 第１＋第２ライン(-> carry)
	roxr.w	#1,d0				* ／２＝平均(with carry)
	and.w	#%11111_00000_11111_0,d0
	
	move.w	#%00000_11111_00000_1,d2	* 赤|輝度 パターン
	and.w	d2,d6				* 第１ライン 赤|輝度
	and.w	d2,d7				* 第２ライン 赤|輝度
	add.w	d6,d7				* 第１＋第２ライン(-> carry)
	roxr.w	#1,d7				* ／２＝平均(with carry)
	and.w	d2,d7
	
	or.w	d7,d0
	move.l	(sp)+,d2
	
	* 定数ロード
	move.w	#WHITE,d6	* 白になる明るさ
	move.w	#%111110,d7	* 色信号取り出しＡＮＤパターン
	endm

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

	.xdef	_bbwconv_pix
_bbwconv_pix:
	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	#btonebuf0,a0	* btonebuf0/1はつながっているので連続で消す
	move.w	#SIZE_OF_X-1,d0	* -1 for dbra
gb1:
	clr.l	(a0)+		* .wのところを.lにすることで倍の領域を消す
	dbra	d0,gb1
	
	move.l	#GRAM,a2	* GRAM line top address
	move.l	#btonebuf0,a4	* a3=今のラインバッファー、a4=下のラインバッファー
	move.l	#btonebuf1,a3	* 最初のexgで入れ替わるから逆にしておく
	
	move.w	#(SIZE_OF_Y/3)-1,d1	* y
l2:
	swap	d1
	YLINE	GREAD2
	lea.l	2*512(a2),a2	* 次の１行を飛ばす
	YLINE	GREAD
	swap	d1
	dbra	d1,l2		* y - loop
	
	YLINE	GREAD2		* 最後は２行平均で終わる（５１２＝５１０＋２）
	
	move.l	(sp)+,a1
	USERMODE		* to user mode
	movem.l	(sp)+,d3-d7/a3-a5
	rts

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