*************************************************************************
* 512*512:65535色 -> 512*512,512*2/3:256色変換
* 共通マクロルーチン
*************************************************************************

SIZE_OF_X	equ	512
SIZE_OF_Y	equ	512
LIGHT		equ	%111110.shl.7	* これ以上の値になる時はドットＯＮにする
					* 整数化演算をするため＊１２８する（本当は＊１００）

*************************************************************************
* 青レベルの変換

LEVELB	macro reg
* reg=d3（青）
* 青は３段階ある
local	lb1,lb2,lb3
	cmp.w	d2,reg			* ＯＮになる明るさは以上？
	blt	lb1			* no : <LIGHT
	sub.w	d2,reg			* -=LIGHT
	moveq.l	#%000_000_11,d0		* 書き込みパターン（輝度込み）
	bra.s	lb3
lb1:
	cmp.w	#(LIGHT*2)/3,reg	* ２／３でＯＮになる明るさは以上？
	blt	lb2			* no : <LIGHT*2/3
	sub.w	#(LIGHT*2)/3,reg	* -=LIGHT*2/3
	moveq.l	#%000_000_10,d0		* 書き込みパターン（輝度のみ）
	bra.s	lb3
lb2:
	cmp.w	#LIGHT/3,reg		* １／３でＯＮになる明るさは以上？
	blt	lb3			* no : <LIGHT/3
	sub.w	#LIGHT/3,reg		* -=LIGHT/3
	moveq.l	#%000_000_01,d0		* 書き込みパターン
lb3:
	endm

*************************************************************************
* 赤、緑レベルの変換

LEVELRG	macro	reg,sft
* reg=d4（赤）, d5（緑）
* 赤、緑は７段階ある
local	lg1,lg2,lg3,lg4,lg5,lg6,lg7
	cmp.w	d2,reg			* ＯＮになる明るさは以上？
	blt	lg1			* no : <LIGHT
	sub.w	d2,reg			* -=LIGHT
	or.w	#%111.shl.sft,d0	* 書き込みパターン（輝度込み）
	bra.s	lg7
lg1:
	cmp.w	#(LIGHT*6)/7,reg	* ６／７でＯＮになる明るさは以上？
	blt	lg2			* no : <LIGHT*6/7
	sub.w	#(LIGHT*6)/7,reg	* -=LIGHT*6/7
	or.w	#%110.shl.sft,d0	* 書き込みパターン（輝度のみ）
	bra.s	lg7
lg2:
	cmp.w	#(LIGHT*5)/7,reg	* ５／７でＯＮになる明るさは以上？
	blt	lg3			* no : <LIGHT*5/7
	sub.w	#(LIGHT*5)/7,reg	* -=LIGHT*5/7
	or.w	#%101.shl.sft,d0	* 書き込みパターン
	bra.s	lg7
lg3:
	cmp.w	#(LIGHT*4)/7,reg	* ４／７でＯＮになる明るさは以上？
	blt	lg4			* no : <LIGHT*4/7
	sub.w	#(LIGHT*4)/7,reg	* -=LIGHT*4/7
	or.w	#%100.shl.sft,d0	* 書き込みパターン（輝度のみ）
	bra.s	lg7
lg4:
	cmp.w	#(LIGHT*3)/7,reg	* ３／７でＯＮになる明るさは以上？
	blt	lg5			* no : <LIGHT*3/7
	sub.w	#(LIGHT*3)/7,reg	* -=LIGHT*3/7
	or.w	#%011.shl.sft,d0	* 書き込みパターン（輝度のみ）
	bra.s	lg7
lg5:
	cmp.w	#(LIGHT*2)/7,reg	* ２／７でＯＮになる明るさは以上？
	blt	lg6			* no : <LIGHT*2/7
	sub.w	#(LIGHT*2)/7,reg	* -=LIGHT*2/7
	or.w	#%010.shl.sft,d0	* 書き込みパターン
	bra.s	lg7
lg6:
	cmp.w	#LIGHT/7,reg		* １／７でＯＮになる明るさは以上？
	blt	lg7			* no : <LIGHT/7
	sub.w	#LIGHT/7,reg		* -=LIGHT/7
	or.w	#%001.shl.sft,d0	* 書き込みパターン
lg7:
	endm

*************************************************************************
* １ドット分変換

DOT_SUB	macro
local	blue1,red1,green1,green2,green0
	move.w	d0,d3		* 青
	move.w	d0,d4		* 赤
	move.w	d0,d5		* 緑
	and.w	#1,d0		* 輝度
	lsl.w	#7,d0
	
	and.w	#%00000_00000_11111_1,d3	* 青＋輝度を取り出す
	lsl.w	#7,d3		* *128（整数演算のため）
	
	and.w	#%00000_11111_00000_0,d4	* 赤を取り出す
	add.w	d4,d4		* lsl.w #2,d4よりこのほうが速い
	add.w	d4,d4		* *128（整数演算のため）
	or.w	d0,d4		* 赤＋輝度
	
	and.w	d6,d5		* 緑を取り出す
	lsr.w	#3,d5		* *128（整数演算のため）
	or.w	d0,d5		* 緑＋輝度
	
	* +現在行バッファー
	add.w	(a0)+,d3	* 青
	add.w	(a0)+,d4	* 赤
	add.w	(a0)+,d5	* 緑
	
	* +carry
	move.l	d3,d0		* 青
	swap	d0
	add.w	d0,d3
	
	move.l	d4,d0		* 赤
	swap	d0
	add.w	d0,d4
	
	move.l	d5,d0		* 緑
	swap	d0
	add.w	d0,d5
	
	* 変換結果書き込み
	moveq.l	#0,d0
	LEVELB	d3		* 青
	LEVELRG	d4,2		* 赤
	LEVELRG	d5,5		* 緑
	move.b	d0,(a5)+	* 変換結果書き込み
	
	endm

*************************************************************************
* 最初ドットの周りへの配分

DOT_MAWARI1	macro	reg
* reg=d3（青）, d4（赤）, d5（緑）
	move.w	reg,d0
	and.w	d7,d0			* tone%8
	lsr.w	#3,reg			* tone/8 = carry
	move.w	reg,6(a1)		* carry -> 右下への送り分
	add.w	reg,d0			* (tone/8+tone%8:真下)
	add.w	reg,reg			* carry*2
	add.w	reg,d0			* (tone/8+tone%8:真下)+(carry*2:左下)
	move.w	d0,(a1)+		*  -> 真下への送り分
	add.w	reg,reg			* carry*2*2
	swap	reg			* reg.h.w=carry*4 -> 右への送り分
	endm

*************************************************************************
* 途中ドットの周りへの配分

DOT_MAWARI2	macro	reg
* reg=d3（青）, d4（赤）, d5（緑）
	move.w	reg,d0
	and.w	d7,d0			* tone%8
	lsr.w	#3,reg			* tone/8 = carry
	move.w	reg,6(a1)		* carry -> 右下への送り分
	add.w	reg,d0			* tone/8+tone%8
	add.w	d0,(a1)+		*  -> 真下への送り分
	add.w	reg,reg			* carry*2
	add.w	reg,-8(a1)		* -> 左下への送り分
	add.w	reg,reg			* carry*2*2
	swap	reg			* reg.h.w=carry*4 -> 右への送り分
	endm

*************************************************************************
* 最終ドットの周りへの配分

DOT_MAWARI3	macro	reg
* reg=d3（青）, d4（赤）, d5（緑）
	move.w	reg,d0
	and.w	d7,d0			* tone%8
	lsr.w	#2,reg			* tone/4 = carry*2
	add.w	reg,-6(a1)		* carry*2 -> 左下への送り分
	add.w	reg,d0			* (tone/8+tone%8:真下)+(tone/8:右下)=tone/8*2+tone%8
	add.w	d0,(a1)+		* -> 真下への送り分
	endm

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