*******************************************************
**     XFD external decruncher for VDCO Cruncher     **
**        written by Mr. Larmer / Wanted Team        **
**	   shortened and fixed by SDI in 1999  	     **
*******************************************************

		INCLUDE	"AINCLUDE:IncDirs.i"
		INCLUDE	"libraries/xfdmaster.i"
		INCLUDE	"lvo.i"

		* head function for tests
*		INCLUDE	"xfdExeHead.a"

; 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_VDCO		;first slave

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

		dc.b	"$VER: VDCO 2.0 (26.07.1999)",0
N_VDCO		dc.b	"Virtual Dreams (VDCO) Data Cruncher",0
		EVEN

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

S_VDCO		dc.l	0		;no more slaves
		dc.w	2		;version
		dc.w	39		;master version
		dc.l	N_VDCO		;name
		dc.w	XFDPFF_DATA|XFDPFF_USERTARGET|XFDPFF_RECOGLEN
		dc.w	0
		dc.l	RB_VDCO		;recog buffer
		dc.l	DB_VDCO		;decrunch buffer
		dc.l	0		;recog segment
		dc.l	0		;decrunch segment
		dc.w	0,0
		dc.l	12

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

RB_VDCO		MOVEQ	#0,D0
		CMP.L	#"VDCO",(A0)
		BNE.B	.Exit
		TST.B	4(A0)
		BNE.B	.Exit
		TST.B	8(A0)
		BNE.B	.Exit
		MOVE.L	4(A0),D0
		MOVE.L	D0,xfdrr_MinTargetLen(A1)
		MOVE.L	D0,xfdrr_FinalTargetLen(A1)
		MOVEQ	#12,D0
		ADD.L	8(A0),D0		* most files are some bytes longer
		MOVE.L	D0,xfdrr_MinSourceLen(A1)
		MOVEQ	#1,D0
.Exit		RTS

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

DB_VDCO		MOVEM.L	D2-D7/A2-A6,-(A7)
		MOVE.L	A0,A5
		MOVE.L	xfdbi_UserTargetBuf(A5),A1
		MOVE.L	A1,A3
		ADDA.L	xfdbi_TargetBufSaveLen(A5),A3
		MOVE.L	xfdbi_SourceBuffer(A5),A0

		LEA	12(A0),A0
		MOVEQ	#15,D7
		MOVEQ	#4,D6
		TST.B	(A0)+
		BEQ.B	.vdco3
		MOVEQ	#$1F,D7
		MOVEQ	#3,D6
		BRA.B	.vdco3

.vdco2		LEA	8(A1),A4
		CMP.L	A3,A4
		BHI.B	.err
		MOVE.B	(A0)+,(A1)+
		MOVE.B	(A0)+,(A1)+
		MOVE.B	(A0)+,(A1)+
		MOVE.B	(A0)+,(A1)+
		MOVE.B	(A0)+,(A1)+
		MOVE.B	(A0)+,(A1)+
		MOVE.B	(A0)+,(A1)+
		MOVE.B	(A0)+,(A1)+
.vdco3		MOVE.B	(A0)+,D0
		BEQ.B	.vdco2
		MOVEQ	#7,D1
.vdco4		ADD.B	D0,D0
		BCS.B	.vdco5
		CMP.L	A3,A1
		BEQ.B	.err
		MOVE.B	(A0)+,(A1)+
		DBRA	D1,.vdco4
		BRA.B	.vdco3

.vdco5		MOVEQ	#0,D2
		MOVE.B	(A0)+,D2
		BEQ.B	.end
		MOVE.L	D7,D3
		AND.W	D2,D3
		LSL.W	D6,D2
		MOVE.B	(A0)+,D2
		MOVEA.L	A1,A2
		SUBA.W	D2,A2
		ADDQ.W	#1,D3
		LEA	1(A1,D3.W),A4
		CMP.L	A3,A4
		BHI.B	.err
.loop		MOVE.B	(A2)+,(A1)+
		DBRA	D3,.loop
		DBRA	D1,.vdco4
		BRA.B	.vdco3

.end		MOVEQ	#1,D0
		CMP.L	A3,A1
		BEQ.B	.ok
.err		MOVEQ	#0,D0
		MOVE.W	#XFDERR_CORRUPTEDDATA,xfdbi_Error(A5)
.ok		MOVEM.L	(A7)+,D2-D7/A2-A6
		RTS

		END
