* Programmheader
*
*	Name:		Pseudo
*	Author:		SDI
*	Distribution:	PD
*	Description:	XFD external decruncher for Pseudo Packer 1.0
*	Compileropts:	-
*	Linkeropts:	-
*
* 1.0   05.06.99 : first version
* 1.1   25.07.99 : added direct support for plain address files

		INCLUDE	"AINCLUDE:IncDirs.i"
		INCLUDE	"lvo.i"

		INCLUDE	"libraries/xfdmaster.i"
		INCLUDE "exec/memory.i"

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

ForeMan		MOVEQ	#-1,D0
		RTS

		DC.L	XFDF_ID
		DC.W	1,0
		DC.L	0,0,S_PseudoP

		DC.B	"$VER: Pseudo 1.1 (25.07.1999) by SDI",0
N_PseudoP	DC.B	'Pseudo Packer 1.0',0
		EVEN

S_PseudoP	DC.L	0		;no more slaves
		DC.W	2		;version
		DC.W	39		;master version
		DC.L	N_PseudoP	;name
		DC.W	XFDPFF_ADDR	;flags
		DC.W	0
		DC.L	RB_PseudoP	;recog buffer
		DC.L	DB_PseudoP	;decrunch buffer
		DC.L	0		;recog segment
		DC.L	0		;decrunch segment
		DC.W	0,0
		DC.L	$CC+26		;MinBufSize

*************************************************************************
*	Recog buffer function: receives buffer + length in A0/D0	*
*************************************************************************

RB_PseudoP	MOVEQ	#80,D0
		CMP.W	#$FFFE,8-80(A0,D0)	* short header, no exe
		BEQ.B	.Check
		MOVEQ.L	#80+26,D0
		CMP.W	#$FFFE,8-80(A0,D0)	* long header no exe
		BEQ.B	.Check
		ADDQ.L	#6,D0
		CMP.W	#$FFFE,8-80(A0,D0)	* short header, exe
		BEQ.B	.Check
		ADDI.L	#26,D0
		CMP.W	#$FFFE,8-80(A0,D0)	* long header, exe
		BNE.B	.No
.Check		CMP.L	#$FFFE41FA,8-80(A0,D0)
		BNE.B	.No
		CMP.L	#$4CDF7FFF,$48-80(A0,D0)
		BNE.B	.No
		CMP.L	#$B24667F6,$94-80(A0,D0)
		BNE.B	.No
		CMP.L	#$7007611A,$98-80(A0,D0)
		BNE.B	.No
		CMP.L	#$E28D6702,$A8-80(A0,D0)
		BNE.B	.No
		RTS

.No		MOVEQ	#0,D0
		RTS

*************************************************************************
*	Decrunch buffer function: receives xfdbiBufferInfo in A0	*
*************************************************************************

DB_PseudoP	MOVEM.L	D2-D6/A2-A6,-(A7)
		MOVE.L	A0,A5
		MOVE.W	#XFDERR_NOMEMORY,xfdbi_Error(A5)

		MOVEA.L	xfdbi_SourceBuffer(A5),A4

		MOVE.L	A4,A0
		BSR.B	RB_PseudoP
		LEA	-80(A4,D0),A4

		MOVE.L	$28(A4),D0
		SUB.L	$14(A4),D0
		MOVE.L	D0,xfdbi_TargetBufLen(A5)
		MOVE.L	D0,xfdbi_TargetBufSaveLen(A5)
		MOVE.L	xfdbi_TargetBufMemType(A5),D1
		BSET	#MEMB_CLEAR,D1
		MOVEA.L	xfdm_ExecBase(A6),A6
		JSR	_LVOAllocMem(A6)
		MOVE.L	D0,xfdbi_TargetBuffer(A5)
		BEQ.B	.NoMem

		MOVE.L	$14(A4),xfdbi_DecrAddress(A5)
		MOVE.L	$2(A4),xfdbi_JmpAddress(A5)

		MOVE.L	D0,A3			* start of buffer
		LEA	$110(A4),A0		* source buffer
		ADD.L	$1A(A4),A0
		LEA	PseudoData(PC),A4
		CLR.W	xfdbi_Error(A5)
		BSR.B	D_PseudoP
.NoMem		MOVEM.L	(A7)+,D2-D6/A2-A6
		RTS

PseudoData	DC.L	$090A0C0D

*************************************************************************
*	decrunch routine - copied from file (a bit modified)		*
*************************************************************************

D_PseudoP	MOVEQ	#3,D6
		MOVEQ	#7,D7
		MOVEQ	#1,D5
		MOVEA.L	A3,A2
		MOVE.L	-(A0),D1
		TST.B	D1
		BEQ.B	.Decr1
		BSR.B	.Decr5
		SUBQ.B	#1,D1
		LSR.L	D1,D5
.Decr1		LSR.L	#8,D1
		ADDA.L	D1,A3
.Decr2		BSR.B	.Decr5
		BCS.B	.Decr12
		MOVEQ	#0,D2
.Decr3		MOVEQ	#1,D0
		BSR.B	.Decr8
		ADD.W	D1,D2
		CMP.W	D6,D1
		BEQ.B	.Decr3
.Decr4		MOVEQ	#7,D0
		BSR.B	.Decr8
		MOVE.B	D1,-(A3)
		DBRA	D2,.Decr4
		CMPA.L	A3,A2
		BCS.B	.Decr12
		RTS	
.Decr5		LSR.L	#1,D5
		BEQ.B	.Decr6
		RTS	
.Decr6		MOVE.L	-(A0),D5
		ROXR.L	#1,D5
		RTS	
.Decr7		SUBQ.W	#1,D0
.Decr8		MOVEQ	#0,D1
.Decr9		LSR.L	#1,D5
		BEQ.B	.Decr11
.Decr10		ROXL.L	#1,D1
		DBRA	D0,.Decr9
		RTS	
.Decr11		MOVE.L	-(A0),D5
		ROXR.L	#1,D5
		BRA.B	.Decr10
.Decr12		MOVEQ	#1,D0
		BSR.B	.Decr8
		MOVEQ	#0,D0
		MOVE.B	(A4,D1.W),D0
		MOVE.W	D1,D2
		CMP.W	D6,D2
		BNE.B	.Decr15
		BSR.B	.Decr5
		BCS.B	.Decr13
		MOVEQ	#7,D0
.Decr13		BSR.B	.Decr7
		MOVE.W	D1,D3
.Decr14		MOVEQ	#2,D0
		BSR.B	.Decr8
		ADD.W	D1,D2
		CMP.W	D7,D1
		BEQ.B	.Decr14
		BRA.B	.Decr16
.Decr15		BSR.B	.Decr7
		MOVE.W	D1,D3
.Decr16		ADDQ.W	#1,D2
.Decr17		MOVE.B	(A3,D3.W),-(A3)
		DBRA	D2,.Decr17
		CMPA.L	A3,A2
		BCS.B	.Decr2
		RTS	
		END
