* ZIM圧縮展開ルーチン
*（PRO専用だと思ったけど、XVI/98にも使えるみたいなので、全部用！にする）
*
* Z'sSTAFF-PRO68K V2.0に付いていたﾛｰﾀﾞｰﾌﾟﾛｸﾞﾗﾑの中のﾗｲﾝ圧縮展開ﾙｰﾁﾝを利用（一部改良）
*
* void zim_expand(unchar *pdata,unchar *edata,unchar *work,int count)
* pdata = 圧縮データ格納エリア（２バイト目以降）
* edata = 展開後データ格納エリア（最大５１２／８＊１６バイト必要）
* work  = ワークエリア（edataと同じだけ大きさを用意する）
* count = データバイト数（０,１バイト目）
*
	.text

	.xdef	_zim_expand
_zim_expand:
	move.l	sp,a0
	movem.l	d3-d7/a3-a6,-(sp)
	move.l	a0,a6
	*
	movea.l	4(a6),a1		* a1=pdata
	movea.l	8(a6),a0		* a0=edata
	movea.l	12(a6),a2		* a2=work
	moveq.l	#0,d2
	moveq.l	#0,d3
	*
	move.b	1(a1),d7		* H（バイト境界からでも読めるように）
	lsl.w	#8,d7
	move.b	(a1)+,d7		* L
	addq.l	#1,a1
	
	move.w	d7,d0
	add.w	#63,d0
	lsr.w	#6,d0    		* d0=int((d0+63)/64)
	move.w	d7,d2
	add.w	#511,d2
	move.w	#9,d1
	lsr.w	d1,d2    		* d2=int((d2+511)/512)
	move.l	16(a6),d5
	subq.w	#2,d5    		* d5=all length
	bsr 	tenkai2
	*
	movea.l	12(a6),a1		* a1=work
	movea.l	8(a6),a2		* a2=edata
	move.w	d6,d5   		* d5=all length
	move.w	d7,d0
	addq.w	#7,D0
	lsr.w	#3,d0    		* d0=int((d0+7)/8)
	move.w	d7,d2
	add.w	#63,d2
	lsr.w	#6,d2    		* d2=int((d2+63)/64)
	bsr 	tenkai2
	*
	movea.l	8(a6),a1		* a1=edata
	movea.l	12(a6),a2		* a2=work
	move.w	d6,d5    		* d5=all length
	move.w	d7,d0
	move.w	d7,d2
	addq.w	#7,d2
	lsr.w	#3,d2   		* d2=int((d2+7)/8)
	bsr 	tenkai1
	*
	movea.l	12(a6),a1		* a1=work
	movea.l	8(a6),a2		* a2=edata
	move.w	d7,d0    		* d0=all length
	subq.w	#1,d0
	move.b	(a1)+,(a2)
re_xor0:
	move.b	(a2)+,d1
	move.b	(a1)+,d2
	eor.b	d2,d1
	move.b	d1,(a2)
	subq.w	#1,d0
	bne 	re_xor0
	*
	move.w	d7,d0
	addq.w	#1,d0			* d7+1
	lsr.w	#1,d0			* (d7+1)/2
	subq.w	#1,d0
	move.l	8(a6),a1		* a1=edata
re_xor1:
	move.w	(a1)+,d1
	eor.w	d1,(a1)
	subq.w	#1,d0
	bne 	re_xor1
	*
	movem.l	(sp)+,d3-d7/a3-a6
	rts
*
*
* 展開サブルーチン１
*
*	IN: A1=SORCE
*	    A2=DESTINATION
*	    D0=BIT
*	    D2=HEAD LENGTH
*	    D5=ALL LENGTH
*	OUT:HEAD+DATA (DESTINATION)
*	    D6=NEW ALL LENGTH
*
tenkai1:
	movea.l	a1,a3
	adda.l	d2,a3			* a3=data1
re_hed0:
	moveq.l	#0,d6			* write data bytes
	moveq.l	#0,d4			* read data bytes
re_hed00:
	moveq.l	#8-1,d3			* 1byte=8bits : -1 for dbra
re_hed1:
	move.b	(a1)+,d1		* read 1byte flag
	addq.w	#1,d4			* read bytes++
re_hed2:
	rol.b	#1,d1			* CY <- bit7
	bcc	re_hed3			* if CY=1 then store 0
	move.b	(a3)+,(a2)+
	addq.w	#1,d4			* read bytes++
	bra.s 	re_hed4
re_hed3:
	clr.b	(a2)+			* store 0
re_hed4:
	addq.w	#1,d6			* write bytes++
	subq.w	#1,d0			* add data read ?
	beq	re_hed6			* yes
	dbra	d3,re_hed2		* until 8 bits
	bra.s	re_hed00		* next 8bits
re_hed6:
	sub.w	d4,d5			* all length - read bytes
	rts
*
* 展開サブルーチン２
*
tenkai2:
	bsr 	tenkai1			* メイン展開
copyr0:					* 残りコピー
	ble	copyr1			* 残りがなくなったら終わり
	move.b	(a3)+,(a2)+
	addq.w	#1,d6
	subq.w	#1,d5
	bra.s 	copyr0
copyr1:
	rts
*
	.end
