*******************************************************************************
* PowerPacker Data Decompression
* ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ
* INPUTS :	a1	=	Destination
*		a2	=	Source
*		d0	=	Length of source
*******************************************************************************

PPData:		lea	PPB_24E(pc),a5
		move.l	a2,a0			;make copy in a0
		add.l	d0,a0			;PTR END (of PPacked data)

		addq.l	#4,a2			;skip past ID header
		moveq	#$18,d6
		moveq	#0,d4
		moveq	#1,d5
		move.l	d5,d7

		move.l	a1,a4
		move.l	-(a0),d1
		move.l	d1,-(sp)		;save unpacked length

		tst.b	d1
		beq.s	PP_22
		lsr.l	d7,d5
		beq.s	PP_5E
PP_1E:		sub.b	d7,d1
		lsr.l	d1,d5
PP_22:		lsr.l	#8,d1
		add.l	d1,a1
PP_26:		lsr.l	d7,d5
		beq.s	PP_64
PP_2A:		bcs	PP_CC
		moveq	#0,d2
PP_30:		moveq	#0,d1
		lsr.l	d7,d5
		beq.s	PP_6A
PP_36:		roxl.w	d7,d1
		lsr.l	d7,d5
		beq.s	PP_70
PP_3C:		roxl.w	d7,d1
		add.w	d1,d2
		subq.w	#3,d1
		beq.s	PP_30
		moveq	#0,d0
PP_46:		move.b	d5,d4
		lsr.l	#8,d5
		beq.s	PP_82
PP_4C:		move.b	-$80(a5,d4.w),d0
		move.b	d0,-(a1)
		dbra	d2,PP_46
		cmp.l	a1,a4
		bcs.s	PP_CC
		bra	PP_1AA

PP_5E:		move.l	-(a0),d5
		roxr.l	d7,d5
		bra.s	PP_1E

PP_64:		move.l	-(a0),d5
		roxr.l	d7,d5
		bra.s	PP_2A

PP_6A:		move.l	-(a0),d5
		roxr.l	d7,d5
		bra.s	PP_36

PP_70:		move.l	-(a0),d5
		roxr.l	d7,d5
		bra.s	PP_3C

PP_76:		move.l	-(a0),d5
		roxr.l	d7,d5
		bra.s	PP_D2

PP_7C:		move.l	-(a0),d5
		roxr.l	d7,d5
		bra.s	PP_D8

PP_82:		move.b	$7F(a5,d4.w),d0
		move.l	-(a0),d5
		move.w	d5,d3
		lsl.w	d0,d3
		bchg	d0,d3
		eor.w	d3,d4
		and.w	#$ff,d4
		moveq	#8,d1
		sub.w	d0,d1
		lsr.l	d1,d5
		add.w	d6,d0
		bset	d0,d5
		bra.s	PP_4C

PP_9E:		move.b	$7F(a5,d4.w),d0
		move.l	-(a0),d5
		move.w	d5,d3
		lsl.w	d0,d3
		bchg	d0,d3
		eor.w	d3,d4
		and.w	#$ff,d4
		moveq	#8,d1
		sub.w	d0,d1
		lsr.l	d1,d5
		add.w	d6,d0
		bset	d0,d5
		bra.s	PP_E0

PP_BA:		move.l	-(a0),d5
		roxr.l	d7,d5
		bra.s	PP_11A

PP_C0:		move.l	-(a0),d5
		roxr.l	d7,d5
		bra.s	PP_120

PP_C6:		move.l	-(a0),d5
		roxr.l	d7,d5
		bra.s	PP_126

PP_CC:		moveq	#0,d2
		lsr.l	d7,d5
		beq.s	PP_76
PP_D2:		roxl.w	d7,d2
		lsr.l	d7,d5
		beq.s	PP_7C
PP_D8:		roxl.w	d7,d2
		move.b	d5,d4
		lsr.l	#8,d5
		beq.s	PP_9E
PP_E0:		moveq	#0,d3
		move.b	-$80(a5,d4.w),d3
		cmp.w	#3,d2
		bne.s	PP_168
		bclr	#7,d3
		beq.s	PP_13A
		moveq	#13,d0
		sub.b	(a2,d2.w),d0
		move.w	d0,d1
		add.w	d0,d0
		add.w	d1,d0
		add.w	d0,d0
		jmp	PP_116(pc,d0.w)

PP_104:		move.l	-(a0),d5
		roxr.l	d7,d5
		bra.s	PP_12C

PP_10A:		move.l	-(a0),d5
		roxr.l	d7,d5
		bra.s	PP_132

PP_110:		move.l	-(a0),d5
		roxr.l	d7,d5
		bra.s	PP_138

PP_116:		lsr.l	d7,d5
		beq.s	PP_BA
PP_11A:		roxl.w	d7,d3
		lsr.l	d7,d5
		beq.s	PP_C0
PP_120:		roxl.w	d7,d3
		lsr.l	d7,d5
		beq.s	PP_C6
PP_126:		roxl.w	d7,d3
		lsr.l	d7,d5
		beq.s	PP_104
PP_12C:		roxl.w	d7,d3
		lsr.l	d7,d5
		beq.s	PP_10A
PP_132:		roxl.w	d7,d3
		lsr.l	d7,d5
		beq.s	PP_110
PP_138:		roxl.w	d7,d3
PP_13A:		moveq	#0,d1
		lsr.l	d7,d5
		beq.s	PP_156
PP_140:		roxl.w	d7,d1
		lsr.l	d7,d5
		beq.s	PP_15C
PP_146:		roxl.w	d7,d1
		lsr.l	d7,d5
		beq.s	PP_162
PP_14C:		roxl.w	d7,d1
		add.w	d1,d2
		subq.w	#7,d1
		beq.s	PP_13A
		bra.s	PP_198

PP_156:		move.l	-(a0),d5
		roxr.l	d7,d5
		bra.s	PP_140

PP_15C:		move.l	-(a0),d5
		roxr.l	d7,d5
		bra.s	PP_146

PP_162:		move.l	-(a0),d5
		roxr.l	d7,d5
		bra.s	PP_14C

PP_168:		moveq	#13,d0
		sub.b	(a2,d2.w),d0
		move.w	d0,d1
		add.w	d0,d0
		add.w	d1,d0
		add.w	d0,d0
		jmp	PP_17A(pc,d0.w)

PP_17A:		lsr.l	d7,d5
		beq.s	PP_1B0
PP_17E:		roxl.w	d7,d3
		lsr.l	d7,d5
		beq.s	PP_1B6
PP_184:		roxl.w	d7,d3
		lsr.l	d7,d5
		beq.s	PP_1BC
PP_18A:		roxl.w	d7,d3
		lsr.l	d7,d5
		beq.s	PP_1C2
PP_190:		roxl.w	d7,d3
		lsr.l	d7,d5
		beq.s	PP_1C8
PP_196:		roxl.w	d7,d3
PP_198:		move.b	(a1,d3.w),-(a1)
PP_19C:		move.b	(a1,d3.w),-(a1)
		dbra	d2,PP_19C
		cmp.l	a1,a4
		bcs	PP_26
PP_1AA:		move.l	(sp)+,d0		;d0=unpacked length
		lsr.l	#8,d0			;correct length
		moveq	#0,d1			;d1=result code = all ok!
		rts

PP_1B0:		move.l	-(a0),d5
		roxr.l	d7,d5
		bra.s	PP_17E

PP_1B6:		move.l	-(a0),d5
		roxr.l	d7,d5
		bra.s	PP_184

PP_1BC:		move.l	-(a0),d5
		roxr.l	d7,d5
		bra.s	PP_18A

PP_1C2:		move.l	-(a0),d5
		roxr.l	d7,d5
		bra.s	PP_190

PP_1C8:		move.l	-(a0),d5
		roxr.l	d7,d5
		bra.s	PP_196

		or.l	#$40C020A0,d0
		bra.s	PP_1B6

	dc.b	$10
	dc.b	$90
	dc.b	'P'
	dc.b	$D0
	dc.b	'0'
	dc.b	$B0
	dc.b	'p'
	dc.b	$F0
	dc.b	8
	dc.b	$88
	dc.b	'H'
	dc.b	$C8
	dc.b	'('
	dc.b	$A8
	dc.b	'h'
	dc.b	$E8
	dc.b	$18
	dc.b	$98
	dc.b	'X'
	dc.b	$D8
	dc.b	'8'
	dc.b	$B8
	dc.b	'x'
	dc.b	$F8
	dc.b	4
	dc.b	$84
	dc.b	'D'
	dc.b	$C4
	dc.b	'$'
	dc.b	$A4
	dc.b	'd'
	dc.b	$E4
	dc.b	$14
	dc.b	$94
	dc.b	'T'
	dc.b	$D4
	dc.b	'4'
	dc.b	$B4
	dc.b	't'
	dc.b	$F4
	dc.b	12
	dc.b	$8C
	dc.b	'L'
	dc.b	$CC
	dc.b	','
	dc.b	$AC
	dc.b	'l'
	dc.b	$EC
	dc.b	$1C
	dc.b	$9C
	dc.b	'\'
	dc.b	$DC
	dc.b	'<'
	dc.b	$BC
	dc.b	'|'
	dc.b	$FC
	dc.b	2
	dc.b	$82
	dc.b	'B'
	dc.b	$C2
	dc.b	'"'
	dc.b	$A2
	dc.b	'b'
	dc.b	$E2
	dc.b	$12
	dc.b	$92
	dc.b	'R'
	dc.b	$D2
	dc.b	'2'
	dc.b	$B2
	dc.b	'r'
	dc.b	$F2
	dc.b	10
	dc.b	$8A
	dc.b	'J'
	dc.b	$CA
	dc.b	'*'
	dc.b	$AA
	dc.b	'j'
	dc.b	$EA
	dc.b	$1A
	dc.b	$9A
	dc.b	'Z'
	dc.b	$DA
	dc.b	':'
	dc.b	$BA
	dc.b	'z'
	dc.b	$FA
	dc.b	6
	dc.b	$86
	dc.b	'F'
	dc.b	$C6
	dc.b	'&'
	dc.b	$A6
	dc.b	'f'
	dc.b	$E6
	dc.b	$16
	dc.b	$96
	dc.b	'V'
	dc.b	$D6
	dc.b	'6'
	dc.b	$B6
	dc.b	'v'
	dc.b	$F6
	dc.b	14
	dc.b	$8E
	dc.b	'N'
	dc.b	$CE
	dc.b	'.'
	dc.b	$AE
	dc.b	'n'
	dc.b	$EE
	dc.b	$1E
	dc.b	$9E
	dc.b	'^'
	dc.b	$DE
	dc.b	'>'
	dc.b	$BE
	dc.b	'~'
	dc.b	$FE
PPB_24E: dc.l	$18141C1
	dc.l	$21A161E1
	dc.l	$119151D1
	dc.l	$31B171F1
	dc.l	$98949C9
	dc.l	$29A969E9
	dc.l	$199959D9
	dc.l	$39B979F9
	dc.l	$58545C5
	dc.l	$25A565E5
	dc.l	$159555D5
	dc.l	$35B575F5
	dc.l	$D8D4DCD
	dc.l	$2DAD6DED
	dc.l	$1D9D5DDD
	dc.l	$3DBD7DFD
	dc.l	$38343C3
	dc.l	$23A363E3
	dc.l	$139353D3
	dc.l	$33B373F3
	dc.l	$B8B4BCB
	dc.l	$2BAB6BEB
	dc.l	$1B9B5BDB
	dc.l	$3BBB7BFB
	dc.l	$78747C7
	dc.l	$27A767E7
	dc.l	$179757D7
	dc.l	$37B777F7
	dc.l	$F8F4FCF
	dc.l	$2FAF6FEF
	dc.l	$1F9F5FDF
	dc.l	$3FBF7FFF
	dc.l	$10102
	dc.l	$2020203
	dc.l	$3030303
	dc.l	$3030304
	dc.l	$4040404
	dc.l	$4040404
	dc.l	$4040404
	dc.l	$4040405
	dc.l	$5050505
	dc.l	$5050505
	dc.l	$5050505
	dc.l	$5050505
	dc.l	$5050505
	dc.l	$5050505
	dc.l	$5050505
	dc.l	$5050506
	dc.l	$6060606
	dc.l	$6060606
	dc.l	$6060606
	dc.l	$6060606
	dc.l	$6060606
	dc.l	$6060606
	dc.l	$6060606
	dc.l	$6060606
	dc.l	$6060606
	dc.l	$6060606
	dc.l	$6060606
	dc.l	$6060606
	dc.l	$6060606
	dc.l	$6060606
	dc.l	$6060606
	dc.l	$6060607
	dc.l	$7070707
	dc.l	$7070707
	dc.l	$7070707
	dc.l	$7070707
	dc.l	$7070707
	dc.l	$7070707
	dc.l	$7070707
	dc.l	$7070707
	dc.l	$7070707
	dc.l	$7070707
	dc.l	$7070707
	dc.l	$7070707
	dc.l	$7070707
	dc.l	$7070707
	dc.l	$7070707
	dc.l	$7070707
	dc.l	$7070707
	dc.l	$7070707
	dc.l	$7070707
	dc.l	$7070707
	dc.l	$7070707
	dc.l	$7070707
	dc.l	$7070707
	dc.l	$7070707
	dc.l	$7070707
	dc.l	$7070707
	dc.l	$7070707
	dc.l	$7070707
	dc.l	$7070707
	dc.l	$7070707
	dc.l	$7070707
	dc.l	$7070700
	dc.b	$27
	dc.b	$A7

