*************************************************************************
* 65536色用 zim 1line disp
*************************************************************************
* void zim1disp(int x,int y,unsint *buff,int len)
*************************************************************************

	.include	defines.mac

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

DOT1	macro	reg
	add.w	reg,reg		* <<1 for 輝度ビット
	move.w	reg,(a2)+
	endm

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

DDOT1	macro	reg
	add.w	reg,reg		* <<1 for 輝度ビット
	move.w	reg,(a2)+
	subq.w	#1,d0
	beq	sbit3
	endm

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

	.xdef	_zim1disp
_zim1disp:
	move.l	sp,a0		* copy stack pointer
	movem.l	d3-d7/a3-a4,-(sp)
	
	SUPERMODE		* SuperVisor mode
	move.l	d0,-(sp)	* save user mode stack pointer
	
	move.l	#GRAM,a2	* Gram top address
	move.l	4(a0),d1	* x
	add.l	d1,d1		* x (*2 for word)
	add.l	d1,a2
	move.l	8(a0),d1	* y
	lsl.l	#8,d1		* *256
	lsl.l	#2,d1		* *512*2 (*2 for word)
	add.l	d1,a2		* a2=line top address
	
	move.l	12(a0),a1	* buff (Green4)
	move.l	16(a0),d0	* len（実際はword:0〜1023まで）
	move.l	d0,d1
	addq.l	#7,d1		* len+7
	lsr.l	#3,d1		* (len+7)/8
	move.l	d1,a3		* = データバイト数（１プレーン分）
sbit:
	move.l	a1,a0
	*moveq.l #0,d1		* lowのみ
	*moveq.l #0,d2		* lowのみ
	*moveq.l #0,d3		* lowのみ
	*moveq.l #0,d4		* lowのみ
	*moveq.l #0,d5		* lowのみ
	*moveq.l #0,d6		* lowのみ
	*moveq.l #0,d7		* L/H
	swap	d0		* d0.h.w = len
	move.w	#15,a4		* 15 planes
sbit1:
	move.b	(a0),d0
	add.b	d0,d0
	addx.w	d1,d1		* 0bit
	add.b	d0,d0
	addx.w	d2,d2		* 1bit
	add.b	d0,d0
	addx.w	d3,d3		* 2bit
	add.b	d0,d0
	addx.w	d4,d4		* 3bit
	add.b	d0,d0
	addx.w	d5,d5		* 4bit
	add.b	d0,d0
	addx.w	d6,d6		* 5bit
	add.b	d0,d0
	addx.w	d7,d7		* 6bit
	swap	d7
	add.b	d0,d0
	addx.w	d7,d7		* 7bit
	swap	d7
	add.l	a3,a0
	subq.w	#1,a4
	cmp.w	#0,a4
	bne	sbit1
	
	swap	d0		* d0.l.w = len
	addq.l	#1,a1		* next 8bit data
	
	cmp.w	#8,d0		* 残り８ドット分あるか？
	bls	sbit2		* no : １〜８ドット分しかない
	* ８ドット分ある
	DOT1	d1		* 0dot
	DOT1	d2		* 1dot
	DOT1	d3		* 2dot
	DOT1	d4		* 3dot
	DOT1	d5		* 4dot
	DOT1	d6		* 5dot
	DOT1	d7		* 6dot
	swap	d7
	add.w	d7,d7		* <<1 for 輝度ビット
	move.w	d7,(a2)+	* 7dot
	* swap d7しないHigh/Low（どちらでもいいから）
	subq.w	#8,d0		* ８ドット分引く
	bra	sbit		* x loop

sbit2:	* ８ドット全て書き込めないとき
	DDOT1	d1		* 0dot
	DDOT1	d2		* 1dot
	DDOT1	d3		* 2dot
	DDOT1	d4		* 3dot
	DDOT1	d5		* 4dot
	DDOT1	d6		* 5dot
	DDOT1	d7		* 6dot
	swap	d7
	add.w	d7,d7		* <<1 for 輝度ビット
	move.w	d7,(a2)+	* 7dot
	* 終わり
sbit3:
	move.l	(sp)+,a1
	USERMODE		* to user mode
	movem.l	(sp)+,d3-d7/a3-a4
	rts

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