*************************************************************************
* 512*512:65535色 -> 768 or 512*512,512*2/3:16色変換
* 共通マクロルーチン
*************************************************************************
* 定数定義

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

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

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
	cmp.w	d2,d3				* 青：ＯＮになる明るさは以上？
	blt	blue1				* no : <LIGHT
	sub.w	d2,d3				* -=LIGHT
	moveq.l	#%0001,d0			* on パターン
blue1:
	cmp.w	d2,d4				* 赤：ＯＮになる明るさは以上？
	blt	red1				* no : <LIGHT
	sub.w	d2,d4				* -=LIGHT
	or.w	#%0010,d0			* on パターン
red1:	* 緑は３段階ある
	cmp.w	d2,d5				* ＯＮになる明るさは以上？
	blt	green1				* no : <LIGHT
	sub.w	d2,d5				* -=LIGHT
	or.w	#%1100,d0			* 書き込みパターン（輝度込み）
	bra.s	green0
green1:
	cmp.w	#(LIGHT*2)/3,d5			* ２／３でＯＮになる明るさは以上？
	blt	green2				* no : <LIGHT*2/3
	sub.w	#(LIGHT*2)/3,d5			* -=LIGHT*2/3
	or.w	#%1000,d0			* 書き込みパターン（輝度のみ）
	bra.s	green0
green2:
	cmp.w	#LIGHT/3,d5			* １／３でＯＮになる明るさは以上？
	blt	green0				* no : <LIGHT/3
	sub.w	#LIGHT/3,d5			* -=LIGHT/3
	or.w	#%0100,d0			* 書き込みパターン
green0:
	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

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