*******************************************************
**             XFD external decruncher               **
**                for DSC3 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_DSC3		;first slave

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

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

S_DSC3		dc.l	0		;no more slaves
		dc.w	2		;version
		dc.w	39		;master version
		dc.l	N_DSC3		;name
		dc.w	XFDPFF_DATA!XFDPFF_RECOGLEN!XFDPFF_USERTARGET
		dc.w	0
		dc.l	RB_DSC3		;recog buffer
		dc.l	DB_DSC3		;decrunch buffer
		dc.l	0		;recog segment
		dc.l	0		;decrunch segment
		dc.w	0,0
		dc.l	12+2

		dc.b	"$VER: DSC3 v2.0 (28 Aug 2000) by Wanted Team",0
N_DSC3		dc.b	"DSC3 data cruncher",0
		even

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

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

RB_DSC3		MOVEQ	#0,D0
		CMP.L	#"DSC3",(A0)+
		BNE.B	.Exit
		TST.B	(A0)
		BNE.B	.Exit
		MOVE.L	(A0),xfdrr_FinalTargetLen(A1)
		MOVE.L	(A0),xfdrr_MinTargetLen(A1)
		MOVEQ	#1,D0
.Exit		RTS

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

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

	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 pointer

D_DSC3
;	MOVEA.L	lbL000582(PC),A1
;	ADDA.L	#$400,A1
;	LEA	DSC3.MSG,A0
	MOVEQ	#0,D7
	MOVEQ	#$20,D0
	BSR.S	lbC0003DC
	CMPI.L	#$44534333,D1
	BNE.S	lbC0003DA
	MOVEQ	#$20,D0
	BSR.S	lbC0003DC
	MOVE.L	D1,D5
	MOVEQ	#8,D0
	BSR.L	lbC0003DC
	MOVE.B	D1,(A1)+
	MOVE.B	D1,D3
	SUBQ.L	#1,D5
	BNE.S	lbC00038E
	RTS

lbC00038E	MOVEQ	#1,D0
	BSR.S	lbC0003DC
	TST.B	D1
	BEQ.S	lbC0003AC
	MOVEQ	#1,D0
	BSR.S	lbC0003DC
	TST.B	D1
	BEQ.S	lbC0003BC
	MOVEQ	#8,D0
	BSR.S	lbC0003DC
	MOVE.B	D1,(A1)+
	MOVE.B	D1,D3
	SUBQ.L	#1,D5
	BNE.S	lbC00038E
	RTS

lbC0003AC	MOVEQ	#4,D0
	BSR.S	lbC0003DC
	BTST	#3,D1
	BEQ.S	lbC0003D0
	ORI.B	#$F0,D1
	BRA.S	lbC0003D0

lbC0003BC	MOVEQ	#5,D0
	BSR.S	lbC0003DC
	BTST	#4,D1
	BNE.S	lbC0003CA
	ADDQ.B	#8,D1
	BRA.S	lbC0003D0

lbC0003CA	ORI.B	#$E0,D1
	SUBQ.B	#8,D1
lbC0003D0	ADD.B	D1,D3
	MOVE.B	D3,(A1)+
	SUBQ.L	#1,D5
	BNE.S	lbC00038E
	RTS

lbC0003DA	BRA.S	lbC0003DA

lbC0003DC	MOVEQ	#0,D1
	TST.B	D7
	BEQ.S	lbC0003F2
	CMP.B	D7,D0
	BLT.S	lbC000408
	MOVE.B	D6,D1
	ROL.B	D7,D1
	SUB.B	D7,D0
	MOVEQ	#0,D7
	TST.L	D0
	BEQ.S	lbC00041C
lbC0003F2	CMPI.B	#8,D0
	BLT.S	lbC000402
	LSL.L	#8,D1
	MOVE.B	(A0)+,D1
	SUBQ.B	#8,D0
	BNE.S	lbC0003F2
	BRA.S	lbC00041C

lbC000402	MOVE.B	(A0)+,D6
	MOVEQ	#8,D7
	LSL.L	D0,D1
lbC000408	ROL.B	D0,D6
	MOVE.B	D6,D2
	MOVEQ	#0,D4
	BSET	D0,D4
	SUBQ.B	#1,D4
	AND.B	D4,D2
	OR.B	D2,D1
	NOT.B	D4
	AND.B	D4,D6
	SUB.B	D0,D7
lbC00041C	RTS

