
*******************************************************************************
*									      *
*	- SubUnPacker v1.0 By Hannes 'Heinz' Eklund of Suburban in 1994 -     *
*									      *
*	This is the unpacker in source-code..				      *
*									      *
*	Note: This packer may destroy samples like cymbals and hihats.	      *
*									      *
*	(PPFIBMOD-UNPACKER V1.0)					      *
*									      *
*	A0 = START OF CRUNCHED DATA					      *
*	A1 = START OF UNCRUNCHED DATA                                         *
*	D0 = LENGTH OF CRUNCHED DATA					      *
*******************************************************************************

PPEFFECT	= 	1		;Effect Enable
SubPackedLength	=	10000
OriginalLength	=	20000

;		lea.l	SUbPackedFile,a0
;		lea.l	Mt_Data,a1
;		move.l	#SubPacked_Length,d0
;		bsr	SubUnPacker
;		rts


SubUnPacker:	MOVEM.L	D1-D7/A0-A6,-(A7)
		MOVE.L	D0,D2

		CMP.L	#"PPFI",(A0)+
		BNE.W	PPFM_ERROR
		CMP.L	#"BMOD",(A0)+
		BNE.W	PPFM_ERROR

		MOVE.L	(A0)+,D3
		MOVE.L	(A0)+,D4	;CRUNCHLENGTH
		MOVE.L	D4,D0

		LEA.L	8(A0,D0.L),A2
		MOVE.L	A2,A0
		MOVEQ.L	#0,D0

		MOVE.L	A2,-(A7)
		BSR.W	PPUNPACK
		MOVE.L	(A7)+,A2

		SUB.L	D4,D2
		SUB.L	#24,D2
		LSL.L	#1,D2

		ADD.L	D3,A1
		SUB.L	D2,A1		;START

		LEA.L	FIBO(PC),A0

		LSR.L	#1,D2
		SUBQ.L	#1,D2
		MOVEQ.L	#0,D0
		MOVEQ.L	#0,D3
PPFM_LOOP:	MOVE.B	(A2)+,D0
		MOVE.B	D0,D1
		LSR.W	#3,D0
		AND.B	#%11111110,D0
		ADD.W	(A0,D0.W),D3

		CMP.W	#127,D3
		BLE.B	PPFM_OK1
		MOVE.B	#127,(A1)+
		BRA.B	PPFM_OK3
PPFM_OK1:	CMP.W	#-128,D3
		BGE.B	PPFM_OK2
		MOVE.B	#-128,(A1)+
		BRA.B	PPFM_OK3
PPFM_OK2:	MOVE.B	D3,(A1)+
PPFM_OK3:
		AND.B	#%00001111,D1
		LSL.W	#1,D1
		ADD.W	(A0,D1.W),D3

		CMP.W	#127,D3
		BLE.B	PPFM_OK4
		MOVE.B	#127,(A1)+
		BRA.B	PPFM_OK6
PPFM_OK4:	CMP.W	#-128,D3
		BGE.B	PPFM_OK5
		MOVE.B	#-128,(A1)+
		BRA.B	PPFM_OK6
PPFM_OK5:	MOVE.B	D3,(A1)+
PPFM_OK6:
		SUBQ.L	#1,D2
		BGE.B	PPFM_LOOP

		MOVEM.L	(A7)+,D1-D7/A0-A6
		MOVEQ.L	#0,D0
		RTS

PPFM_ERROR:	MOVEM.L	(A7)+,D1-D7/A0-A6
		MOVEQ.L	#-1,D0
		RTS

FIBO:	DC.W	-65,-45,-26,-15,-8,-4,-2,-1,1,2,4,8,15,26,45,65

*************************************************************************
*									*
*	POWERPACKER UNPACK ROUTINE 	v35.344				*
*									*
*	a0 = end of crunched data					*
*	a1 = start of destination buffer				*
*	d0 = effect							*
*************************************************************************


PPDUMMYEFF:	DC.L	$090a0c0d	;efficiency

lbL000000	dc.l	$DFF180	;effect=0
		dc.l	$DFF182	;effect=4
		dc.l	$DFF1A2	;effect=8
		dc.l	$DFF102	;effect=12
		dc.l	lbC000014

lbC000014	MOVEQ	#-$48,D6
PPUNPACK:	LEA.L	PPDUMMYEFF,A2
		MOVEM.L	D2-D7/A2-A6,-(SP)
		LEA	lbW00026C(PC),A5
		MOVEQ	#$18,D6
		MOVEQ	#0,D4
		MOVE.W	#$FF,D7
		LSL.W	#2,D0
		MOVE.L	lbL000000(PC,D0.W),A3
		MOVEQ	#1,D5
		MOVE.L	A1,A4
		MOVE.L	-(A0),D1
		TST.B	D1
		BEQ.S	lbC00003E
		LSR.L	#1,D5
		BEQ.S	lbC00007A
lbC00003A	SUBQ.B	#1,D1
		LSR.L	D1,D5
lbC00003E	LSR.L	#8,D1
		ADD.L	D1,A1
lbC000042	LSR.L	#1,D5
		BEQ.S	lbC000080
lbC000046	BCS	lbC0000E8
		MOVEQ	#0,D2
lbC00004C	MOVEQ	#0,D1
		LSR.L	#1,D5
		BEQ.S	lbC000086
lbC000052	ROXL.W	#1,D1
		LSR.L	#1,D5
		BEQ.S	lbC00008C
lbC000058	ROXL.W	#1,D1
		ADD.W	D1,D2
		SUBQ.W	#3,D1
		BEQ.S	lbC00004C
		MOVEQ	#0,D0
lbC000062	MOVE.B	D5,D4
		LSR.L	#8,D5
		BEQ.S	lbC00009E
lbC000068	MOVE.B	-$80(A5,D4.W),D0
		MOVE.B	D0,-(A1)
		DBRA	D2,lbC000062
		CMP.L	A1,A4
		BCS.S	lbC0000E8
		BRA	lbC0001C8

lbC00007A	MOVE.L	-(A0),D5
		ROXR.L	#1,D5
		BRA.S	lbC00003A

lbC000080	MOVE.L	-(A0),D5
		ROXR.L	#1,D5
		BRA.S	lbC000046

lbC000086	MOVE.L	-(A0),D5
		ROXR.L	#1,D5
		BRA.S	lbC000052

lbC00008C	MOVE.L	-(A0),D5
		ROXR.L	#1,D5
		BRA.S	lbC000058

lbC000092	MOVE.L	-(A0),D5
		ROXR.L	#1,D5
		BRA.S	lbC0000EE

lbC000098	MOVE.L	-(A0),D5
		ROXR.L	#1,D5
		BRA.S	lbC0000F4

lbC00009E	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	D7,D4
		MOVEQ	#8,D1
		SUB.W	D0,D1
		LSR.L	D1,D5
		ADD.W	D6,D0
		BSET	D0,D5
		BRA.S	lbC000068

lbC0000BA	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	D7,D4
		MOVEQ	#8,D1
		SUB.W	D0,D1
		LSR.L	D1,D5
		ADD.W	D6,D0
		BSET	D0,D5
		BRA.S	lbC0000FC
	
lbC0000D6	MOVE.L	-(A0),D5
		ROXR.L	#1,D5
		BRA.S	lbC000136
	
lbC0000DC	MOVE.L	-(A0),D5
		ROXR.L	#1,D5
		BRA.S	lbC00013C

lbC0000E2	MOVE.L	-(A0),D5
		ROXR.L	#1,D5
		BRA.S	lbC000142

lbC0000E8	MOVEQ	#0,D2
		LSR.L	#1,D5
		BEQ.S	lbC000092
lbC0000EE	ROXL.W	#1,D2
		LSR.L	#1,D5
		BEQ.S	lbC000098
lbC0000F4	ROXL.W	#1,D2
		MOVE.B	D5,D4
		LSR.L	#8,D5
		BEQ.S	lbC0000BA
lbC0000FC	MOVEQ	#0,D3
		MOVE.B	-$80(A5,D4.W),D3
		CMP.W	#3,D2
		BNE.S	lbC000184
		BCLR	#7,D3
		BEQ.S	lbC000156
		MOVEQ	#13,D0
		SUB.B	0(A2,D2.W),D0
		MOVE.W	D0,D1
		ADD.W	D0,D0
		ADD.W	D1,D0
		ADD.W	D0,D0
		JMP	lbC000132(PC,D0.W)
	
lbC000120	MOVE.L	-(A0),D5
		ROXR.L	#1,D5
		BRA.S	lbC000148

lbC000126	MOVE.L	-(A0),D5
		ROXR.L	#1,D5
		BRA.S	lbC00014E

lbC00012C	MOVE.L	-(A0),D5
		ROXR.L	#1,D5
		BRA.S	lbC000154

lbC000132	LSR.L	#1,D5
		BEQ.S	lbC0000D6
lbC000136	ROXL.W	#1,D3
		LSR.L	#1,D5
		BEQ.S	lbC0000DC
lbC00013C	ROXL.W	#1,D3
		LSR.L	#1,D5
		BEQ.S	lbC0000E2
lbC000142	ROXL.W	#1,D3
		LSR.L	#1,D5
		BEQ.S	lbC000120
lbC000148	ROXL.W	#1,D3
		LSR.L	#1,D5
		BEQ.S	lbC000126
lbC00014E	ROXL.W	#1,D3
		LSR.L	#1,D5
		BEQ.S	lbC00012C
lbC000154	ROXL.W	#1,D3
lbC000156	MOVEQ	#0,D1
		LSR.L	#1,D5
		BEQ.S	lbC000172
lbC00015C	ROXL.W	#1,D1
		LSR.L	#1,D5
		BEQ.S	lbC000178
lbC000162	ROXL.W	#1,D1
		LSR.L	#1,D5
		BEQ.S	lbC00017E
lbC000168	ROXL.W	#1,D1
		ADD.W	D1,D2
		SUBQ.W	#7,D1
		BEQ.S	lbC000156
		BRA.S	lbC0001B4

lbC000172	MOVE.L	-(A0),D5
		ROXR.L	#1,D5
		BRA.S	lbC00015C

lbC000178	MOVE.L	-(A0),D5
		ROXR.L	#1,D5
		BRA.S	lbC000162

lbC00017E	MOVE.L	-(A0),D5
		ROXR.L	#1,D5
		BRA.S	lbC000168
	
lbC000184	MOVEQ	#13,D0
		SUB.B	0(A2,D2.W),D0
		MOVE.W	D0,D1
		ADD.W	D0,D0
		ADD.W	D1,D0
		ADD.W	D0,D0
		JMP	lbC000196(PC,D0.W)

lbC000196	LSR.L	#1,D5
		BEQ.S	lbC0001CE
lbC00019A	ROXL.W	#1,D3
		LSR.L	#1,D5
		BEQ.S	lbC0001D4
lbC0001A0	ROXL.W	#1,D3
		LSR.L	#1,D5
		BEQ.S	lbC0001DA
lbC0001A6	ROXL.W	#1,D3
		LSR.L	#1,D5
		BEQ.S	lbC0001E0
lbC0001AC	ROXL.W	#1,D3
		LSR.L	#1,D5
		BEQ.S	lbC0001E6
lbC0001B2	ROXL.W	#1,D3
lbC0001B4	MOVE.B	0(A1,D3.W),-(A1)
lbC0001B8	MOVE.B	0(A1,D3.W),-(A1)
		DBRA	D2,lbC0001B8

		IF PPEFFECT
		MOVE.W	A1,(A3)
		ENDC

		CMP.L	A1,A4
		BCS	lbC000042
lbC0001C8	MOVEM.L	(SP)+,D2-D7/A2-A6
		RTS

lbC0001CE	MOVE.L	-(A0),D5
		ROXR.L	#1,D5
		BRA.S	lbC00019A

lbC0001D4	MOVE.L	-(A0),D5
		ROXR.L	#1,D5
		BRA.S	lbC0001A0

lbC0001DA	MOVE.L	-(A0),D5
		ROXR.L	#1,D5
		BRA.S	lbC0001A6

lbC0001E0	MOVE.L	-(A0),D5
		ROXR.L	#1,D5
		BRA.S	lbC0001AC

lbC0001E6	MOVE.L	-(A0),D5
		ROXR.L	#1,D5
		BRA.S	lbC0001B2

lbC0001EC	OR.L	#$40C020A0,D0
		BRA.S	lbC0001D4

		DC.L	$109050D0,$30B070F0,$088848C8,$28A868E8
		DC.L	$189858D8,$38B878F8,$048444C4,$24A464E4
		DC.L	$149454D4,$34B474F4,$0C8C4CCC,$2CAC6CEC
		DC.L	$1C9C5CDC,$3CBC7CFC,$028242C2,$22A262E2
		DC.L	$129252D2,$32B272F2,$0A8A4ACA,$2AAA6AEA
		DC.L	$1A9A5ADA,$3ABA7AFA,$068646C6,$26A666E6
		DC.L	$169656D6,$36B676F6,$0E8E4ECE,$2EAE6EEE
		DC.L	$1E9E5EDE,$3EBE7EFE
lbW00026C
		DC.L	$018141C1,$21A161E1,$119151D1,$31B171F1
		DC.L	$098949C9,$29A969E9,$199959D9,$39B979F9
		DC.L	$058545C5,$25A565E5,$159555D5,$35B575F5
		DC.L	$0D8D4DCD,$2DAD6DED,$1D9D5DDD,$3DBD7DFD
		DC.L	$038343C3,$23A363E3,$139353D3,$33B373F3
		DC.L	$0B8B4BCB,$2BAB6BEB,$1B9B5BDB,$3BBB7BFB
		DC.L	$078747C7,$27A767E7,$179757D7,$37B777F7
		DC.L	$0F8F4FCF,$2FAF6FEF,$1F9F5FDF,$3FBF7FFF
		DC.L	$00010102,$02020203,$03030303,$03030304
		DC.L	$04040404,$04040404,$04040404,$04040405
		DC.L	$05050505,$05050505,$05050505,$05050505
		DC.L	$05050505,$05050505,$05050505,$05050506
		DC.L	$06060606,$06060606,$06060606,$06060606
		DC.L	$06060606,$06060606,$06060606,$06060606
		DC.L	$06060606,$06060606,$06060606,$06060606
		DC.L	$06060606,$06060606,$06060606,$06060607
		DC.L	$07070707,$07070707,$07070707,$07070707
		DC.L	$07070707,$07070707,$07070707,$07070707
		DC.L	$07070707,$07070707,$07070707,$07070707
		DC.L	$07070707,$07070707,$07070707,$07070707
		DC.L	$07070707,$07070707,$07070707,$07070707
		DC.L	$07070707,$07070707,$07070707,$07070707
		DC.L	$07070707,$07070707,$07070707,$07070707
		DC.L	$07070707,$07070707,$07070707,$07070700

		section	SubPacked_File,DATA
SubPackedFile:	incbin	Module.Sub

		section	UnPacked_Module,BSS_C
Mt_Data:	ds.b	OriginalLength
