		multipass
		mc68000

		xdef	_unpackbytedelta
		xdef	_unpackbytedeltanodirty
		xdef	_unpackanim7long
		xdef	_unpackanim7longnodirty
		xdef	_unpackanim7word
		xdef	_unpackanim7wordnodirty
		xdef	_unpackanim8long
		xdef	_unpackanim8longnodirty
		xdef	_unpackanim8word
		xdef	_unpackanim8wordnodirty

;***********************************************************************

;void __asm unpackbytedelta (register __a0 BYTE *bdata,
;                            register __a1 PLANEPTR plane,
;                            register __d0 WORD bytesperrow,
;                            register __a2 WORD *dirty);

; d1 = x
; d2 = tmp
; d3 = count
; d4 = w
; d5 = first
; d6 = last
; d7 = ub, temporary

; a3 = bp
; a4 = y

_unpackbytedelta
		movem.l	d2-d7/a2-a4,-(sp)
		ext.l	d0		; bytesperrow
		moveq	#0,d1		; x = 0
.xloop		moveq	#-1,d5		; first = -1
		moveq	#-1,d6		; last = -1
		movea.l	a1,a3		; bp = plane
		addq.l	#1,a1		; plane++
		suba.l	a4,a4		; y = 0
		moveq	#0,d3
		move.b	(a0)+,d3	; count = *bdata++
		bra	.endloop2
.loop2		moveq	#0,d4
		move.b	(a0)+,d4	; w = *bdata++
		ble	1$		; branch if w <= 0
		adda.l	d4,a4		; y += w
		mulu.w	d0,d4
		adda.l	d4,a3		; bp += w * bytesperrow
.endloop2	dbra	d3,.loop2
		bra	.endxloop

1$		beq	3$		; branch if w == 0
		tst.w	d5
		bge	2$		; branch if first >= 0
		move.w	a4,d5		; first = y
2$		and.w	#$7f,d4		; w &= 0x7f
		adda.l	d4,a4		; y += w
		move.w	a4,d6		; last = y
		move.w	d4,d7
		lsr.w	#3,d4
		and.w	#7,d7
		add.w	d7,d7
		add.w	d7,d7
		neg.w	d7
		jmp	(.endwloop,pc,d7.w)
.wloop		move.b	(a0)+,(a3)	; *bp = *data++
		adda.l	d0,a3		; bp += bytesperrow
		move.b	(a0)+,(a3)	; *bp = *data++
		adda.l	d0,a3		; bp += bytesperrow
		move.b	(a0)+,(a3)	; *bp = *data++
		adda.l	d0,a3		; bp += bytesperrow
		move.b	(a0)+,(a3)	; *bp = *data++
		adda.l	d0,a3		; bp += bytesperrow
		move.b	(a0)+,(a3)	; *bp = *data++
		adda.l	d0,a3		; bp += bytesperrow
		move.b	(a0)+,(a3)	; *bp = *data++
		adda.l	d0,a3		; bp += bytesperrow
		move.b	(a0)+,(a3)	; *bp = *data++
		adda.l	d0,a3		; bp += bytesperrow
		move.b	(a0)+,(a3)	; *bp = *data++
		adda.l	d0,a3		; bp += bytesperrow
.endwloop	dbra	d4,.wloop
		dbra	d3,.loop2
		bra	.endxloop

3$		tst.w	d5
		bge	4$		; branch if first >= 0
		move.w	a4,d5		; first = y
4$		moveq	#0,d7
		move.b	(a0)+,d7	; ub = *bdata++
		adda.l	d7,a4		; y += ub
		move.w	a4,d6		; last = y
		move.b	(a0)+,d4	; w = *bdata++
		move.w	d7,d2
		lsr.w	#3,d7
		and.w	#7,d2
		add.w	d2,d2
		add.w	d2,d2
		neg.w	d2
		jmp	(.endubloop,pc,d2.w)
.ubloop		move.b	d4,(a3)		; *bp = w
		adda.l	d0,a3		; bp += bytesperrow
		move.b	d4,(a3)		; *bp = w
		adda.l	d0,a3		; bp += bytesperrow
		move.b	d4,(a3)		; *bp = w
		adda.l	d0,a3		; bp += bytesperrow
		move.b	d4,(a3)		; *bp = w
		adda.l	d0,a3		; bp += bytesperrow
		move.b	d4,(a3)		; *bp = w
		adda.l	d0,a3		; bp += bytesperrow
		move.b	d4,(a3)		; *bp = w
		adda.l	d0,a3		; bp += bytesperrow
		move.b	d4,(a3)		; *bp = w
		adda.l	d0,a3		; bp += bytesperrow
		move.b	d4,(a3)		; *bp = w
		adda.l	d0,a3		; bp += bytesperrow
.endubloop	dbra	d7,.ubloop

		dbra	d3,.loop2

.endxloop	tst.w	d5
		blt	8$		; branch if first < 0
		move.w	(a2),d7
		blt	5$		; branch if dirty[0] < 0
		cmp.w	d5,d7
		ble	6$		; branch if dirty[0] <= first
5$		move.w	d5,(a2)		; dirty[0] = first
6$		move.w	(2,a2),d7
		blt	7$		; branch if dirty[1] < 0
		cmp.w	d6,d7
		bge	8$		; branch if dirty[1] >= last
7$		move.w	d6,(2,a2)	; dirty[1] = last
8$		move.w	d1,d7
		and.w	#3,d7
		cmp.w	#3,d7
		bne	9$
		addq.l	#4,a2		; dirty += 2
9$		addq.w	#1,d1		; x++
		cmp.w	d0,d1
		blt	.xloop		; branch if x < bytesperrow
		movem.l	(sp)+,d2-d7/a2-a4
		rts

;{
;  WORD x, y, count, w, first, last;
;  BYTE *bp;
;  UBYTE ub;
;
;  for (x = 0; x < bytesperrow; x++) {
;    first = -1;
;    last = -1;
;    bp = &plane[x];
;    y = 0;
;    for (count = *bdata++; count > 0; count--) {
;      if ((w = *bdata++) > 0) {
;        y += w;
;        bp += w * bytesperrow;
;      } else if (w < 0) {
;        if (first < 0)
;          first = y;
;        last = (y += (w &= 0x7f));
;        for ( ; w > 0; w--) {
;          *bp = *bdata++;
;          bp += bytesperrow;
;        }
;      } else /* w == 0 */ {
;        if (first < 0)
;          first = y;
;        last = (y += (ub = (UBYTE)*bdata++));
;        w = *bdata++;
;        for ( ; ub > 0; ub--) {
;          *bp = w;
;          bp += bytesperrow;
;        }
;      }
;    }
;    if (first >= 0 && (dirty[0] < 0 || first < dirty[0]))
;      dirty[0] = first;
;    if (last >= 0 && (dirty[1] < 0 || last > dirty[1]))
;      dirty[1] = last;
;    if ((x & 3) == 3)
;      dirty += 2;
;  }
;}

;***********************************************************************

;void __asm unpackbytedeltanodirty (register __a0 BYTE *bdata,
;                                   register __a1 PLANEPTR plane,
;                                   register __d0 WORD bytesperrow);

; d1 = bytesperrrow - x
; d3 = count
; d4 = w
; d7 = ub, temporary

; a3 = bp

_unpackbytedeltanodirty
		movem.l	d2-d7/a2-a3,-(sp)
		ext.l	d0		; bytesperrow
		move.l	d0,d1		; x
		bra	.endxloop
.xloop		movea.l	a1,a3		; bp = plane
		addq.l	#1,a1		; plane++
		moveq	#0,d3
		move.b	(a0)+,d3	; count = *bdata++
		bra	.endloop2

.loop2		moveq	#0,d4
		move.b	(a0)+,d4	; w = *bdata++
		ble	1$		; branch if w <= 0
		mulu.w	d0,d4
		adda.l	d4,a3		; bp += w * bytesperrow

.endloop2	dbra	d3,.loop2
		bra	.endxloop

1$		beq	3$		; branch if w == 0
		and.w	#$7f,d4		; w &= 0x7f
		move.w	d4,d6
		lsr.w	#3,d4
		and.w	#7,d6
		add.w	d6,d6
		add.w	d6,d6
		neg.w	d6
		jmp	(.endwloop,pc,d6.w)
.wloop		move.b	(a0)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.b	(a0)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.b	(a0)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.b	(a0)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.b	(a0)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.b	(a0)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.b	(a0)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.b	(a0)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
.endwloop	dbra	d4,.wloop

		dbra	d3,.loop2
		bra	.endxloop

3$		moveq	#0,d7
		move.b	(a0)+,d7	; ub = *bdata++
		move.b	(a0)+,d4	; w = *bdata++
		move.w	d7,d6
		lsr.w	#3,d7
		and.w	#7,d6
		add.w	d6,d6
		add.w	d6,d6
		neg.w	d6
		jmp	(.endubloop,pc,d6.w)
.ubloop		move.b	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.b	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.b	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.b	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.b	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.b	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.b	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.b	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
.endubloop	dbra	d7,.ubloop

		dbra	d3,.loop2

.endxloop	dbra	d1,.xloop
		movem.l	(sp)+,d2-d7/a2-a3
		rts

;***********************************************************************

;void __asm unpackanim7long (register __a0 BYTE *bdata,
;                            register __a4 LONG *data,
;                            register __a1 PLANEPTR plane,
;                            register __d0 WORD bytesperrow,
;                            register __a2 WORD *dirty);

; d1 = x
; d2 = temporary
; d3 = count
; d4 = w
; d5 = first
; d6 = last
; d7 = ub, temporary

; a3 = lp
; a5 = y

_unpackanim7long
		movem.l	d2-d7/a2-a5,-(sp)
		ext.l	d0		; bytesperrow
		moveq	#0,d1		; x = 0
.xloop		moveq	#-1,d5		; first = -1
		moveq	#-1,d6		; last = -1
		movea.l	a1,a3		; lp = plane
		addq.l	#4,a1		; plane++
		suba.l	a5,a5		; y = 0
		moveq	#0,d3
		move.b	(a0)+,d3	; count = *bdata++
		bra	.endloop2
.loop2		moveq	#0,d4
		move.b	(a0)+,d4	; w = *bdata++
		ble	1$		; branch if w <= 0
		adda.l	d4,a5		; y += w
		mulu.w	d0,d4
		adda.l	d4,a3		; lp += w * bytesperrow
		dbra	d3,.loop2
		bra	.endxloop

1$		beq	3$		; branch if w == 0
		tst.w	d5
		bge	2$		; branch if first >= 0
		move.w	a5,d5		; first = y
2$		and.w	#$7f,d4		; w &= 0x7f
		adda.l	d4,a5		; y += w
		move.w	a5,d6		; last = y
		move.w	d4,d2
		lsr.w	#3,d4
		and.w	#7,d2
		add.w	d2,d2
		add.w	d2,d2
		neg.w	d2
		jmp	(.endwloop,pc,d2.w)
.wloop		move.l	(a4)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.l	(a4)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.l	(a4)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.l	(a4)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.l	(a4)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.l	(a4)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.l	(a4)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.l	(a4)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
.endwloop	dbra	d4,.wloop
		dbra	d3,.loop2
		bra	.endxloop

3$		tst.w	d5
		bge	4$		; branch if first >= 0
		move.w	a5,d5		; first = y
4$		moveq	#0,d7
		move.b	(a0)+,d7	; ub = *bdata++
		adda.l	d7,a5		; y += ub
		move.w	a5,d6		; last = y
		move.l	(a4)+,d4	; w = *data++
		move.w	d7,d2
		lsr.w	#3,d7
		and.w	#7,d2
		add.w	d2,d2
		add.w	d2,d2
		neg.w	d2
		jmp	(.endubloop,pc,d2.w)
.ubloop		move.l	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.l	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.l	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.l	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.l	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.l	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.l	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.l	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
.endubloop	dbra	d7,.ubloop
.endloop2	dbra	d3,.loop2

.endxloop	tst.w	d5
		blt	8$		; branch if first < 0
		move.w	(a2),d7
		blt	5$		; branch if dirty[0] < 0
		cmp.w	d5,d7
		ble	6$		; branch if dirty[0] <= first
5$		move.w	d5,(a2)		; dirty[0] = first
6$		move.w	(2,a2),d7
		blt	7$		; branch if dirty[1] < 0
		cmp.w	d6,d7
		bge	8$		; branch if dirty[1] >= last
7$		move.w	d6,(2,a2)	; dirty[1] = last
8$		addq.l	#4,a2		; dirty += 2
		addq.w	#4,d1		; x += 4
		cmp.w	d0,d1
		blt	.xloop		; branch if x < bytesperrow
		movem.l	(sp)+,d2-d7/a2-a5
		rts

;***********************************************************************

;void __asm unpackanim7longnodirty (register __a0 BYTE *bdata,
;                                   register __a4 LONG *data,
;                                   register __a1 PLANEPTR plane,
;                                   register __d0 WORD bytesperrow);

; d1 = (bytesperrow - x) >> 2
; d3 = count
; d4 = w
; d6 = temporary
; d7 = ub, temporary

; a3 = lp

_unpackanim7longnodirty
		movem.l	d2-d7/a2-a4,-(sp)
		ext.l	d0		; bytesperrow
		move.w	d0,d1
		lsr.w	#2,d1
		bra	.endxloop
.xloop		movea.l	a1,a3		; lp = plane
		addq.l	#4,a1		; plane++
		moveq	#0,d3
		move.b	(a0)+,d3	; count = *bdata++
		bra	.endloop2

.loop2		moveq	#0,d4
		move.b	(a0)+,d4	; w = *bdata++
		ble	1$		; branch if w <= 0
		mulu.w	d0,d4
		adda.l	d4,a3		; lp += w * bytesperrow

.endloop2	dbra	d3,.loop2
		bra	.endxloop

1$		beq	3$		; branch if w == 0
2$		and.w	#$7f,d4		; w &= 0x7f
		move.w	d4,d6
		lsr.w	#3,d4
		and.w	#7,d6
		add.w	d6,d6
		add.w	d6,d6
		neg.w	d6
		jmp	(.endwloop,pc,d6.w)
.wloop		move.l	(a4)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.l	(a4)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.l	(a4)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.l	(a4)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.l	(a4)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.l	(a4)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.l	(a4)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.l	(a4)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
.endwloop	dbra	d4,.wloop

		dbra	d3,.loop2
		bra	.endxloop

3$		moveq	#0,d7
		move.b	(a0)+,d7	; ub = *bdata++
		move.l	(a4)+,d4	; w = *data++
		move.w	d7,d6
		lsr.w	#3,d7
		and.w	#7,d6
		add.w	d6,d6
		add.w	d6,d6
		neg.w	d6
		jmp	(.endubloop,pc,d6.w)
.ubloop		move.l	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.l	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.l	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.l	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.l	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.l	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.l	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.l	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
.endubloop	dbra	d7,.ubloop

		dbra	d3,.loop2

.endxloop	dbra	d1,.xloop
		movem.l	(sp)+,d2-d7/a2-a4
		rts

;***********************************************************************

;void __asm unpackanim7word (register __a0 BYTE *bdata,
;                            register __a4 WORD *data,
;                            register __a1 PLANEPTR plane,
;                            register __d0 WORD bytesperrow,
;                            register __a2 WORD *dirty);

; d1 = x
; d2 = temporary
; d3 = count
; d4 = w
; d5 = first
; d6 = last
; d7 = ub, temporary

; a3 = lp
; a5 = y

_unpackanim7word
		movem.l	d2-d7/a2-a5,-(sp)
		ext.l	d0		; bytesperrow
		moveq	#0,d1		; x = 0
.xloop		moveq	#-1,d5		; first = -1
		moveq	#-1,d6		; last = -1
		movea.l	a1,a3		; lp = plane
		addq.l	#2,a1		; plane++
		suba.l	a5,a5		; y = 0
		moveq	#0,d3
		move.b	(a0)+,d3	; count = *bdata++
		bra	.endloop2
.loop2		moveq	#0,d4
		move.b	(a0)+,d4	; w = *bdata++
		ble	1$		; branch if w <= 0
		adda.l	d4,a5		; y += w
		mulu.w	d0,d4
		adda.l	d4,a3		; lp += w * bytesperrow
		dbra	d3,.loop2
		bra	.endxloop

1$		beq	3$		; branch if w == 0
		tst.w	d5
		bge	2$		; branch if first >= 0
		move.w	a5,d5		; first = y
2$		and.w	#$7f,d4		; w &= 0x7f
		adda.l	d4,a5		; y += w
		move.w	a5,d6		; last = y
		move.w	d4,d2
		lsr.w	#3,d4
		and.w	#7,d2
		add.w	d2,d2
		add.w	d2,d2
		neg.w	d2
		jmp	(.endwloop,pc,d2.w)
.wloop		move.w	(a4)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.w	(a4)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.w	(a4)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.w	(a4)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.w	(a4)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.w	(a4)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.w	(a4)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.w	(a4)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
.endwloop	dbra	d4,.wloop
		dbra	d3,.loop2
		bra	.endxloop

3$		tst.w	d5
		bge	4$		; branch if first >= 0
		move.w	a5,d5		; first = y
4$		moveq	#0,d7
		move.b	(a0)+,d7	; ub = *bdata++
		adda.l	d7,a5		; y += ub
		move.w	a5,d6		; last = y
		move.w	(a4)+,d4	; w = *data++
		move.w	d7,d2
		lsr.w	#3,d7
		and.w	#7,d2
		add.w	d2,d2
		add.w	d2,d2
		neg.w	d2
		jmp	(.endubloop,pc,d2.w)
.ubloop		move.w	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.w	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.w	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.w	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.w	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.w	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.w	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.w	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
.endubloop	dbra	d7,.ubloop
.endloop2	dbra	d3,.loop2

.endxloop	tst.w	d5
		blt	8$		; branch if first < 0
		move.w	(a2),d7
		blt	5$		; branch if dirty[0] < 0
		cmp.w	d5,d7
		ble	6$		; branch if dirty[0] <= first
5$		move.w	d5,(a2)		; dirty[0] = first
6$		move.w	(2,a2),d7
		blt	7$		; branch if dirty[1] < 0
		cmp.w	d6,d7
		bge	8$		; branch if dirty[1] >= last
7$		move.w	d6,(2,a2)	; dirty[1] = last
8$		btst	#1,d1
		beq	9$
		addq.l	#4,a2		; dirty += 2
9$		addq.w	#2,d1		; x += 2
		cmp.w	d0,d1
		blt	.xloop		; branch if x < bytesperrow
		movem.l	(sp)+,d2-d7/a2-a5
		rts

;***********************************************************************

;void __asm unpackanim7wordnodirty (register __a0 BYTE *bdata,
;                                   register __a4 WORD *data,
;                                   register __a1 PLANEPTR plane,
;                                   register __d0 WORD bytesperrow);

; d1 = (bytesperrow - x) >> 2
; d3 = count
; d4 = w
; d6 = temporary
; d7 = ub, temporary

; a3 = lp

_unpackanim7wordnodirty
		movem.l	d2-d7/a2-a4,-(sp)
		ext.l	d0		; bytesperrow
		move.w	d0,d1
		lsr.w	#1,d1
		bra	.endxloop
.xloop		movea.l	a1,a3		; lp = plane
		addq.l	#2,a1		; plane++
		moveq	#0,d3
		move.b	(a0)+,d3	; count = *bdata++
		bra	.endloop2

.loop2		moveq	#0,d4
		move.b	(a0)+,d4	; w = *bdata++
		ble	1$		; branch if w <= 0
		mulu.w	d0,d4
		adda.l	d4,a3		; lp += w * bytesperrow

.endloop2	dbra	d3,.loop2
		bra	.endxloop

1$		beq	3$		; branch if w == 0
2$		and.w	#$7f,d4		; w &= 0x7f
		move.w	d4,d6
		lsr.w	#3,d4
		and.w	#7,d6
		add.w	d6,d6
		add.w	d6,d6
		neg.w	d6
		jmp	(.endwloop,pc,d6.w)
.wloop		move.w	(a4)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.w	(a4)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.w	(a4)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.w	(a4)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.w	(a4)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.w	(a4)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.w	(a4)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.w	(a4)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
.endwloop	dbra	d4,.wloop

		dbra	d3,.loop2
		bra	.endxloop

3$		moveq	#0,d7
		move.b	(a0)+,d7	; ub = *bdata++
		move.w	(a4)+,d4	; w = *data++
		move.w	d7,d6
		lsr.w	#3,d7
		and.w	#7,d6
		add.w	d6,d6
		add.w	d6,d6
		neg.w	d6
		jmp	(.endubloop,pc,d6.w)
.ubloop		move.w	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.w	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.w	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.w	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.w	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.w	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.w	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.w	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
.endubloop	dbra	d7,.ubloop

		dbra	d3,.loop2

.endxloop	dbra	d1,.xloop
		movem.l	(sp)+,d2-d7/a2-a4
		rts

;***********************************************************************

;void __asm unpackanim8long (register __a0 LONG *data,
;                            register __a1 PLANEPTR plane,
;                            register __d0 WORD bytesperrow,
;                            register __a2 WORD *dirty);

; d1 = x
; d2 = temporary
; d3 = count
; d4 = w
; d5 = first
; d6 = last
; d7 = ub, temporary

; a3 = lp
; a4 = y

_unpackanim8long
		movem.l	d2-d7/a2-a4,-(sp)
		ext.l	d0		; bytesperrow
		moveq	#0,d1		; x = 0
.xloop		moveq	#-1,d5		; first = -1
		moveq	#-1,d6		; last = -1
		movea.l	a1,a3		; lp = plane
		addq.l	#4,a1		; plane++
		suba.l	a4,a4		; y = 0
		move.l	(a0)+,d3	; count = *data++
		bra	.endloop2
.loop2		move.l	(a0)+,d4	; w = *data++
		ble	1$		; branch if w <= 0
		adda.l	d4,a4		; y += w
		mulu.w	d0,d4
		adda.l	d4,a3		; lp += w * bytesperrow
		dbra	d3,.loop2
		bra	.endxloop

1$		beq	3$		; branch if w == 0
		tst.w	d5
		bge	2$		; branch if first >= 0
		move.w	a4,d5		; first = y
2$		and.l	#$7fffffff,d4	; w &= 0x7fffffff
		adda.l	d4,a4		; y += w
		move.w	a4,d6		; last = y
		move.w	d4,d2
		lsr.w	#3,d4
		and.w	#7,d2
		add.w	d2,d2
		add.w	d2,d2
		neg.w	d2
		jmp	(.endwloop,pc,d2.w)
.wloop		move.l	(a0)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.l	(a0)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.l	(a0)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.l	(a0)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.l	(a0)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.l	(a0)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.l	(a0)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.l	(a0)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
.endwloop	dbra	d4,.wloop
		dbra	d3,.loop2
		bra	.endxloop

3$		tst.w	d5
		bge	4$		; branch if first >= 0
		move.w	a4,d5		; first = y
4$		move.l	(a0)+,d7	; ub = *data++
		adda.l	d7,a4		; y += ub
		move.w	a4,d6		; last = y
		move.l	(a0)+,d4	; w = *data++
		move.w	d7,d2
		lsr.w	#3,d7
		and.w	#7,d2
		add.w	d2,d2
		add.w	d2,d2
		neg.w	d2
		jmp	(.endubloop,pc,d2.w)
.ubloop		move.l	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.l	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.l	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.l	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.l	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.l	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.l	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.l	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
.endubloop	dbra	d7,.ubloop
.endloop2	dbra	d3,.loop2

.endxloop	tst.w	d5
		blt	8$		; branch if first < 0
		move.w	(a2),d7
		blt	5$		; branch if dirty[0] < 0
		cmp.w	d5,d7
		ble	6$		; branch if dirty[0] <= first
5$		move.w	d5,(a2)		; dirty[0] = first
6$		move.w	(2,a2),d7
		blt	7$		; branch if dirty[1] < 0
		cmp.w	d6,d7
		bge	8$		; branch if dirty[1] >= last
7$		move.w	d6,(2,a2)	; dirty[1] = last
8$		addq.l	#4,a2		; dirty += 2
		addq.w	#4,d1		; x += 4
		cmp.w	d0,d1
		blt	.xloop		; branch if x < bytesperrow
		movem.l	(sp)+,d2-d7/a2-a4
		rts

;***********************************************************************

;void __asm unpackanim8longnodirty (register __a0 LONG *data,
;                                   register __a1 PLANEPTR plane,
;                                   register __d0 WORD bytesperrow);

; d1 = (bytesperrow - x) >> 2
; d3 = count
; d4 = w
; d7 = ub, temporary

; a3 = lp

_unpackanim8longnodirty
		movem.l	d2-d7/a2-a3,-(sp)
		ext.l	d0		; bytesperrow
		move.w	d0,d1
		lsr.w	#2,d1
		bra	.endxloop
.xloop		movea.l	a1,a3		; lp = plane
		addq.l	#4,a1		; plane++
		move.l	(a0)+,d3	; count = *data++
		bra	.endloop2

.loop2		move.l	(a0)+,d4	; w = *data++
		ble	1$		; branch if w <= 0
		mulu.w	d0,d4
		adda.l	d4,a3		; lp += w * bytesperrow

.endloop2	dbra	d3,.loop2
		bra	.endxloop

1$		beq	3$		; branch if w == 0
2$		and.l	#$7fffffff,d4	; w &= 0x7fffffff
		move.w	d4,d6
		lsr.w	#3,d4
		and.w	#7,d6
		add.w	d6,d6
		add.w	d6,d6
		neg.w	d6
		jmp	(.endwloop,pc,d6.w)
.wloop		move.l	(a0)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.l	(a0)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.l	(a0)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.l	(a0)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.l	(a0)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.l	(a0)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.l	(a0)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.l	(a0)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
.endwloop	dbra	d4,.wloop

		dbra	d3,.loop2
		bra	.endxloop

3$		move.l	(a0)+,d7	; ub = *data++
		move.l	(a0)+,d4	; w = *data++
		move.w	d7,d6
		lsr.w	#3,d7
		and.w	#7,d6
		add.w	d6,d6
		add.w	d6,d6
		neg.w	d6
		jmp	(.endubloop,pc,d6.w)
.ubloop		move.l	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.l	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.l	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.l	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.l	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.l	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.l	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.l	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
.endubloop	dbra	d7,.ubloop

		dbra	d3,.loop2
.endxloop	dbra	d1,.xloop
		movem.l	(sp)+,d2-d7/a2-a3
		rts

;***********************************************************************

;void __asm unpackanim8word (register __a0 WORD *data,
;                            register __a1 PLANEPTR plane,
;                            register __d0 WORD bytesperrow,
;                            register __a2 WORD *dirty);

; d1 = x
; d2 = temporary
; d3 = count
; d4 = w
; d5 = first
; d6 = last
; d7 = ub, temporary

; a3 = lp
; a4 = y

_unpackanim8word
		movem.l	d2-d7/a2-a4,-(sp)
		ext.l	d0		; bytesperrow
		moveq	#0,d1		; x = 0
.xloop		moveq	#-1,d5		; first = -1
		moveq	#-1,d6		; last = -1
		movea.l	a1,a3		; lp = plane
		addq.l	#2,a1		; plane++
		suba.l	a4,a4		; y = 0
		move.w	(a0)+,d3	; count = *data++
		bra	.endloop2
.loop2		move.w	(a0)+,d4	; w = *data++
		ble	1$		; branch if w <= 0
		adda.w	d4,a4		; y += w
		mulu.w	d0,d4
		adda.l	d4,a3		; lp += w * bytesperrow
		dbra	d3,.loop2
		bra	.endxloop

1$		beq	3$		; branch if w == 0
		tst.w	d5
		bge	2$		; branch if first >= 0
		move.w	a4,d5		; first = y
2$		and.w	#$7fff,d4	; w &= 0x7fff
		adda.w	d4,a4		; y += w
		move.w	a4,d6		; last = y
		move.w	d4,d2
		lsr.w	#3,d4
		and.w	#7,d2
		add.w	d2,d2
		add.w	d2,d2
		neg.w	d2
		jmp	(.endwloop,pc,d2.w)
.wloop		move.w	(a0)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.w	(a0)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.w	(a0)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.w	(a0)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.w	(a0)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.w	(a0)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.w	(a0)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.w	(a0)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
.endwloop	dbra	d4,.wloop
		dbra	d3,.loop2
		bra	.endxloop

3$		tst.w	d5
		bge	4$		; branch if first >= 0
		move.w	a4,d5		; first = y
4$		move.w	(a0)+,d7	; ub = *data++
		adda.w	d7,a4		; y += ub
		move.w	a4,d6		; last = y
		move.w	(a0)+,d4	; w = *data++
		move.w	d7,d2
		lsr.w	#3,d7
		and.w	#7,d2
		add.w	d2,d2
		add.w	d2,d2
		neg.w	d2
		jmp	(.endubloop,pc,d2.w)
.ubloop		move.w	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.w	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.w	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.w	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.w	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.w	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.w	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.w	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
.endubloop	dbra	d7,.ubloop
.endloop2	dbra	d3,.loop2

.endxloop	tst.w	d5
		blt	8$		; branch if first < 0
		move.w	(a2),d7
		blt	5$		; branch if dirty[0] < 0
		cmp.w	d5,d7
		ble	6$		; branch if dirty[0] <= first
5$		move.w	d5,(a2)		; dirty[0] = first
6$		move.w	(2,a2),d7
		blt	7$		; branch if dirty[1] < 0
		cmp.w	d6,d7
		bge	8$		; branch if dirty[1] >= last
7$		move.w	d6,(2,a2)	; dirty[1] = last
8$		btst	#1,d1
		beq	9$
		addq.l	#4,a2		; dirty += 2
9$		addq.w	#2,d1		; x += 2
		cmp.w	d0,d1
		blt	.xloop		; branch if x < bytesperrow
		movem.l	(sp)+,d2-d7/a2-a4
		rts

;***********************************************************************

;void __asm unpackanim8wordnodirty (register __a0 WORD *data,
;                                   register __a1 PLANEPTR plane,
;                                   register __d0 WORD bytesperrow);

; d1 = (bytesperrow - x) >> 2
; d3 = count
; d4 = w
; d7 = ub, temporary

; a3 = lp

_unpackanim8wordnodirty
		movem.l	d2-d7/a2-a3,-(sp)
		ext.l	d0		; bytesperrow
		move.w	d0,d1
		lsr.w	#1,d1
		bra	.endxloop
.xloop		movea.l	a1,a3		; lp = plane
		addq.l	#2,a1		; plane++
		move.w	(a0)+,d3	; count = *data++
		bra	.endloop2

.loop2		move.w	(a0)+,d4	; w = *data++
		ble	1$		; branch if w <= 0
		mulu.w	d0,d4
		adda.l	d4,a3		; lp += w * bytesperrow

.endloop2	dbra	d3,.loop2
		bra	.endxloop

1$		beq	3$		; branch if w == 0
2$		and.w	#$7fff,d4	; w &= 0x7fff
		move.w	d4,d6
		lsr.w	#3,d4
		and.w	#7,d6
		add.w	d6,d6
		add.w	d6,d6
		neg.w	d6
		jmp	(.endwloop,pc,d6.w)
.wloop		move.w	(a0)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.w	(a0)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.w	(a0)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.w	(a0)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.w	(a0)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.w	(a0)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.w	(a0)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
		move.w	(a0)+,(a3)	; *lp = *data++
		adda.l	d0,a3		; lp += bytesperrow
.endwloop	dbra	d4,.wloop

		dbra	d3,.loop2
		bra	.endxloop

3$		move.w	(a0)+,d7	; ub = *data++
		move.w	(a0)+,d4	; w = *data++
		move.w	d7,d6
		lsr.w	#3,d7
		and.w	#7,d6
		add.w	d6,d6
		add.w	d6,d6
		neg.w	d6
		jmp	(.endubloop,pc,d6.w)
.ubloop		move.w	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.w	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.w	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.w	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.w	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.w	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.w	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
		move.w	d4,(a3)		; *lp = w
		adda.l	d0,a3		; lp += bytesperrow
.endubloop	dbra	d7,.ubloop

		dbra	d3,.loop2

.endxloop	dbra	d1,.xloop
		movem.l	(sp)+,d2-d7/a2-a3
		rts

;***********************************************************************

		end
