
		incdir	"asminc:"

		include	"lvo30/exec_lib.i"
		include	"gcmacros_new.i"

		XDEF	_unpackbody,_copybody
		XREF	_SysBase

		opt	alink

		section	unpackbody,code

; a0 - BYTE *source
; a1 - BYTE *sinkbuf
; a2 - BYTE **planes;
; d0 - LONG bodylen	**not used
; d4 - WORD rows
; d5 - WORD srcplanes
; d6 - WORD srcbytes
; d7 - WORD destbytes


; result - non-0 if ok, 0 otherwise


_unpackbody	movem.l	d2-d7/a2-a6,-(sp)

		lea	planesbuf-4(pc),a3
		move	d5,d1
		subq	#1,d1
.copyptrs	move	d1,d3
		add	d3,d3
		add	d3,d3
		move.l	(a2)+,4(a3,d3.w)
		dbf	d1,.copyptrs
		
		moveq	#0,d2
		addq	#1,d4
		addq	#1,d5
		move	d5,a5

		sub	d6,d7		; destbytes - srcbytes
		move	d7,a6

		sub.l	a2,a2		; exit flag ( 0 = wrong )

.rowsloop	subq	#1,d4
		beq.s	.ok		;--

		move	a5,d5

.planeloop	subq	#1,d5
		beq.s	.rowsloop

		move	d5,d7
		add	d7,d7
		add	d7,d7
		
		move.l	(a3,d7.w),a4
		cmp.l	#0,a4
		bne.s	.nosink
		move.l	a1,a4		
.nosink
		move	d6,d1

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

.loop		moveq	#0,d2
		move.b	(a0)+,d2	* get byte from source
		bmi.s	.neg		; if <0 then 

*** [0..127]   : followed by n+1 bytes of data.

		sub	d2,d1
		subq	#1,d1
		bmi.s	.exit

.copyloop	move.b	(a0)+,(a4)+
		dbf	d2,.copyloop	
		bra.s	.next


*** [-1..-127] : followed by byte to be repeated (-n)+1 times.

.neg		moveq	#-128,d3
		cmp	d3,d2		* NO-OP ??
		beq.s	.loop

		ext	d2
		neg	d2		* n = -n

		sub	d2,d1		* dest -= (n+1)
		subq	#1,d1
		bmi.s	.exit

		move.b	(a0)+,d3
.repeatloop	move.b	d3,(a4)+
		dbf	d2,.repeatloop

.next		tst	d1
		bne.s	.loop

		add.l	a6,a4
		move.l	a4,(a3,d7.w)
		
		bra.s	.planeloop		

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

.ok		addq	#1,a2		; ok!

.exit		move	a2,d0
		movem.l	(sp)+,d2-d7/a2-a6
		rts

		cnop	0,4


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

; a0 - BYTE *source
; a1 - BYTE **planes;
; d0 - LONG bodylen	**not used
; d4 - WORD rows
; d5 - WORD srcplanes
; d6 - WORD srcbytes
; d7 - WORD destbytes


_copybody	movem.l	d2-d7/a2/a3/a6,-(sp)

		lea	planesbuf-4(pc),a2
		move	d5,d1
		subq	#1,d1
.copyptrs	move	d1,d3
		add	d3,d3
		add	d3,d3
		move.l	(a1)+,4(a2,d3.w)
		dbf	d1,.copyptrs
		
		addq	#1,d4
		addq	#1,d5
		move	d5,a3

		move.l	a0,d2
		ext.l	d6
		ext.l	d7
		move.l	_SysBase,a6

.rowsloop	subq	#1,d4
		beq.s	.ok		;--

		move	a3,d5

.planeloop	subq	#1,d5
		beq.s	.rowsloop

		move	d5,d3
		add	d3,d3
		add	d3,d3
		
		move.l	(a2,d3.w),d0
		beq.s	.sinkit
		move.l	d0,a1
		add.l	d7,(a2,d3.w)

		move.l	d2,a0
		move.l	d6,d0
		call	CopyMem

.sinkit		add.l	d6,d2
		bra.s	.planeloop

.ok		moveq	#1,d0
		movem.l	(sp)+,d2-d7/a2/a3/a6
		rts

		cnop	0,4

planesbuf	dcb.l	9,0
