*******************************************************
**             XFD external decruncher               **
**                for EDP1 cruncher                  **
**             adapted by Wanted Team                **
*******************************************************

	INCDIR	"dh2:Include/"
	INCLUDE	"libraries/xfdmaster.i"

; xfdForeman structure MUST be first thing in all external decrunchers

ForeMan		moveq	#-1,d0		;security
		rts
		dc.l	XFDF_ID		;id
		dc.w	1		;version
		dc.w	0
		dc.l	0,0		;private
		dc.l	S_EDP1		;first slave

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

; xfdSlave structure: this one doesn't support data scanning

S_EDP1		dc.l	0		;no more slaves
		dc.w	2		;version
		dc.w	39		;master version
		dc.l	N_EDP1		;name
		dc.w	XFDPFF_DATA!XFDPFF_RECOGLEN!XFDPFF_USERTARGET
		dc.w	0
		dc.l	RB_EDP1		;recog buffer
		dc.l	DB_EDP1		;decrunch buffer
		dc.l	0		;recog segment
		dc.l	0		;decrunch segment
		dc.w	0,0
		dc.l	12+2

		dc.b	"$VER: EDP1 v2.0 (29 Aug 2000) by Wanted Team",0
N_EDP1		dc.b	"EDP1 data cruncher",0
		even

;-------------------------------------------------

; Recog buffer function: receives buffer + length in a0/d0

RB_EDP1		MOVEQ	#0,D0
		CMP.L	#"EDP1",(A0)+
		BNE.B	.Exit
		TST.B	(A0)
		BNE.B	.Exit
		MOVE.L	(A0),D0

	move.l	D0,xfdrr_FinalTargetLen(A1)
	btst	#0,D0
	beq.b	.OK
	addq.l	#1,D0
.OK
	add.l	#40204,D0			; static buffer

		MOVE.L	D0,xfdrr_MinTargetLen(A1)
		MOVEQ	#1,D0
.Exit		RTS

;-------------------------------------------------

; Decrunch buffer function: receives bufferinfo in a0
; This style requires xfdmaster.library V39
DB_EDP1		MOVEM.L	D2-D7/A2-A6,-(A7)
		MOVEA.L	A0,A5
		MOVE.L	xfdbi_UserTargetBuf(A5),A1
		MOVE.L	xfdbi_SourceBuffer(A5),A0

	move.l	4(A0),D0
	btst	#0,D0
	beq.b	.OK
	addq.l	#1,D0
.OK
	move.l	A1,A2
	add.l	D0,A2
	move.l	A2,-(SP)
	bsr.b	D_EDP1
	addq.l	#4,A7
	moveq	#1,D0

		MOVEM.L	(A7)+,D2-D7/A2-A6
		RTS

;-------------------------------------------------

; Decruncher from game "Black Viper" (c) 1996 LightShock/NEO Software

; Input
; A0 = start of packed file
; A1 = destination

D_EDP1
	MOVEM.L	D0-D7/A0-A6,-(SP)
	MOVEA.L	A0,A6
	MOVE.L	#0,D5
	CMPI.L	#$45445031,(A0)+
	BNE.S	lbC0032DC
	MOVE.L	(A0)+,lbL00ACF4
	MOVEQ	#0,D6
	MOVE.W	(A0)+,D6
	MOVE.L	D6,D0
	ASL.L	#2,D0
	ADDI.L	#10,D0
	ADDA.L	D0,A6
	SUBQ.L	#1,D6
lbC0032CA	MOVE.L	(A0)+,D7
	MOVE.L	A0,-(SP)
	BSR.S	lbC00330C
	MOVEA.L	(SP)+,A0
	DBRA	D6,lbC0032CA
;	MOVEM.L	(SP)+,D0-D7/A0-A6
;	RTS

lbC0032DC
;	MOVE.W	#$FB0,D0
;	BSR.S	lbC0032E8
	MOVEM.L	(SP)+,D0-D7/A0-A6
	RTS

;lbC0032E8	MOVE.W	#$32,D7
;lbC0032EC	CMPI.B	#$64,$DFF006
;	BNE.S	lbC0032EC
;lbC0032F6	CMPI.B	#$F4,$DFF006
;	BNE.S	lbC0032F6
;	MOVE.W	D0,$DFF180
;	DBRA	D7,lbC0032EC
;	RTS

lbC00330C
;	MOVEA.L	#lbL00ACF8,A0

	move.l	72(SP),A0

	MOVEQ	#0,D3
	MOVEQ	#0,D4
	MOVE.W	#9,(A0)
	MOVE.W	#$100,6(A0)
	MOVEA.L	A6,A2
	MOVE.L	D5,D0
	MOVE.L	D0,D1
	ASR.L	#4,D0
	ADDA.L	D0,A2
	ADDA.L	D0,A2
	ANDI.L	#15,D1
	MOVEQ	#0,D0
	MOVE.W	(A0),D0
	MOVE.L	D0,D2
	ADD.L	D0,D5
	ADD.L	D0,D1
	MOVE.L	(A2)+,D0
	ROL.L	D1,D0
	SUBI.L	#9,D2
	MOVE.L	#$FF,D1
lbC00334C	ROL.W	#1,D1
	BSET	#0,D1
	DBRA	D2,lbC00334C
	AND.L	D1,D0
	MOVE.W	D0,D3
	MOVE.W	#1,$4008(A0)
	MOVE.B	D0,8(A0)
	MOVE.W	#1,$400A(A0)
	MOVE.B	D0,$2008(A0)
	MOVE.B	D0,2(A0)
	MOVE.B	D0,(A1)+
	SUBQ.L	#1,D7
	MOVE.W	D3,D4
lbC003378	MOVEA.L	A6,A2
	MOVE.L	D5,D0
	MOVE.L	D0,D1
	ASR.L	#4,D0
	ADDA.L	D0,A2
	ADDA.L	D0,A2
	ANDI.L	#15,D1
	MOVEQ	#0,D0
	MOVE.W	(A0),D0
	MOVE.L	D0,D2
	ADD.L	D0,D5
	ADD.L	D0,D1
	MOVE.L	(A2)+,D0
	ROL.L	D1,D0
	SUBI.L	#9,D2
	MOVE.L	#$FF,D1
lbC0033A4	ROL.W	#1,D1
	BSET	#0,D1
	DBRA	D2,lbC0033A4
	AND.L	D1,D0
	MOVE.W	D0,D3
	CMP.W	6(A0),D0
	BGE.L	lbC003448
	CMPI.W	#$100,D3
	BLT.S	lbC00342A
	CLR.W	$400A(A0)
;	MOVEA.L	#lbL00CD00,A4
;	MOVEA.L	#lbL00AD00,A5

	lea	$2008(A0),A4
	lea	8(A0),A5

lbC0033D0
;	MOVEA.L	#lbL00EB04,A2
;	MOVEA.L	#lbL012A04,A3

	lea	$3E0C(A0),A2
	lea	$7D0C(A0),A3

	MOVE.B	0(A3,D0.L),(A4)+
	ADDQ.W	#1,$400A(A0)
	LSL.L	#1,D0
	MOVE.W	0(A2,D0.L),D0
	ANDI.L	#$FFFF,D0
	CMPI.W	#$FF,D0
	BGT.S	lbC0033D0
	MOVE.B	D0,(A4)+
	ADDQ.W	#1,$400A(A0)

	move.l	A3,-(SP)
	lea	$2008(A0),A3

lbC0033FC	MOVE.B	-(A4),(A5)+
;	CMPA.L	#lbL00CD00,A4

	cmp.l	A3,A4

	BGT.S	lbC0033FC

	move.l	(SP)+,A3

	MOVE.W	$400A(A0),$4008(A0)
	MOVE.B	8(A0),2(A0)
	MOVE.W	$4008(A0),D0
	SUBQ.W	#1,D0
;	MOVEA.L	#lbL00AD00,A5

	lea	8(A0),A5

lbC00341E	MOVE.B	(A5),(A4)+
	MOVE.B	(A5)+,(A1)+
	SUBQ.L	#1,D7
	DBRA	D0,lbC00341E
	BRA.S	lbC00346A

lbC00342A	MOVE.B	D0,8(A0)
	MOVE.B	D0,2(A0)
	MOVE.B	D0,$2008(A0)
	MOVE.B	D0,(A1)+
	SUBQ.L	#1,D7
	MOVE.W	#1,$4008(A0)
	MOVE.W	#1,$400A(A0)
	BRA.S	lbC00346A

lbC003448
;	MOVEA.L	#lbL00CD00,A2

	lea	$2008(A0),A2

	MOVE.W	$400A(A0),D0
	SUBQ.W	#1,D0
lbC003454	MOVE.B	(A2)+,(A1)+
	SUBQ.L	#1,D7
	DBRA	D0,lbC003454
	MOVE.B	2(A0),(A1)+
	SUBQ.L	#1,D7
	MOVE.B	2(A0),(A2)+
	ADDQ.W	#1,$400A(A0)
lbC00346A
;	MOVEA.L	#lbL00EB04,A2
;	MOVEA.L	#lbL012A04,A3

	lea	$3E0C(A0),A2
	lea	$7D0C(A0),A3

	MOVEQ	#0,D0
	MOVE.W	6(A0),D0
	MOVE.B	2(A0),0(A3,D0.L)
	LSL.W	#1,D0
	MOVE.W	D4,0(A2,D0.L)
	ADDQ.W	#1,6(A0)
	CMPI.W	#13,(A0)
	BGE.S	lbC0034D2
	MOVE.W	6(A0),D0
	CMPI.L	#$200,D0
	BGE.S	lbC0034A4
	MOVE.W	#9,(A0)
	BRA.S	lbC0034D2

lbC0034A4	CMPI.L	#$400,D0
	BGE.S	lbC0034B2
	MOVE.W	#10,(A0)
	BRA.S	lbC0034D2

lbC0034B2	CMPI.L	#$800,D0
	BGE.S	lbC0034C0
	MOVE.W	#11,(A0)
	BRA.S	lbC0034D2

lbC0034C0	CMPI.L	#$1000,D0
	BGE.S	lbC0034CE
	MOVE.W	#12,(A0)
	BRA.S	lbC0034D2

lbC0034CE	MOVE.W	#13,(A0)
lbC0034D2	MOVE.W	D3,D4
	TST.L	D7
	BGT.L	lbC003378
	RTS

lbL00ACF4	ds.l	1

;lbL00ACF8	ds.l	2
;lbL00AD00	ds.l	$800
;lbL00CD00	ds.l	$781
;lbL00EB04	ds.l	$FC0
;lbL012A04	ds.l	$800
