* Programmheader
*
*	Name:		AddrHeads
*	Author:		SDI
*	Distribution:	PD
*	Description:	XFD external for removing address crunch headers
*	Compileropts:	-
*	Linkeropts:	-
*
* 1.0   01.06.98 : first version
* 1.1   04.06.98 : added ObjectMaster 1.0 data

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

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

		* head function for tests
*		INCLUDE	"PrA:Projekte/xfd/xfdExeHead.a"

ForeMan		MOVEQ	#-1,D0
		RTS

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

		DC.B	"$VER: AddrHeads 1.1 (04.06.1998) by SDI",0
N_AddrHead	DC.B	'AddressHead',0
		EVEN

Slave1		DC.L	0		;no more slaves
		DC.W	2		;version
		DC.W	36		;master version
		DC.L	N_AddrHead	;name
		DC.W	XFDPFF_ADDR	;flags
		DC.W	0
		DC.L	RB_Type1	;recog buffer
		DC.L	DB_Addr		;decrunch buffer
		DC.L	0		;recog segment
		DC.L	0		;decrunch segment
		DC.W	0,0
		DC.L	184		;MinBufSize

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

RB_Type1	MOVEQ	#0,D0

		CMP.L	#$000003F3,(A0)
		BNE.B	.No
		CMP.L	#$48E780C0,32(A0)
		BNE.B	RB_Type2
		CMP.L	#$41FA002C,42(A0)
		BNE.B	.No
		CMP.L	#$538066FA,60(A0)
		BNE.B	.No
		CMP.L	#$D3C02320,68(A0)
		BNE.B	.No
		CMP.L	#$4CDF0301,76(A0)
		BNE.B	.No
		MOVEQ	#1,D0			; True
.No		RTS

****
* xfdDecrunch simple header (V1.08)
****
* 00, 00, 03, F3, 00, 00, 00, 00, 00, 00, 00, 01,
* 00, 00, 00, 00, 00, 00, 00, 00, HUNKSIZE______,
* 00, 00, 03, E9, HUNKSIZE______, 48, E7, 80, C0,
* 43, F9, DECRADDR______, 41, FA, 00, 2C, 20, 3C, 
* BCPLSIZE______, B1, C9, 67, 14, 65, 08, 22, D8,
* 53, 80, 66, FA, 60, 0A, D1, C0, D3, C0, 23, 20, 
* 53, 80, 66, FA, 4C, DF, 03, 01, 4E, F9, JUMPADDR
* ______, 00, 00

RB_Type2	CMP.L	#$FFEC224F,108(A0)
		BNE.B	RB_Type3
		CMP.L	#$76FF2C7A,132(A0)
		BNE.B	.No
		CMP.L	#$600E4CDF,168(A0)
		BNE.B	.No
		CMP.L	#$430F4EB9,172(A0)
		BNE.B	.No
		CMP.L	#$9EFC001C,180(A0)
		BNE.B	.No
		MOVEQ	#2,D0			; True
.No		RTS

****
* xfdDecrunch professional header (V1.03)
****
* 00, 00, 03, F3, 00, 00, 00, 00, 00, 00, 00, 02,
* 00, 00, 00, 00, 00, 00, 00, 01, 00, 00, 00, 43, 
* 00, 00, 00, 00, 00, 00, 03, E9, 00, 00, 00, 43,
* 60, 16, 00, 00, 00, 00, AB, CD, 00, 00, 00, 00, 
* 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00,
* 48, E7, F0, C2, 43, FA, 00, AC, 70, 25, 2C, 78, 
* 00, 04, 4E, AE, FD, D8, 41, FA, FF, D4, 20, 80,
* 67, 7A, 43, F9, DECRADDR______, 20, 3C, DECRSIZE
* ______, 4E, AE, FF, 34, 4A, 80, 66, 10, 2F, 3A,
* FF, EC, 22, 4F, 41, FA, 00, 88, 61, 62, 58, 4F, 
* 60, 4E, 22, 3A, FF, B0, 24, 3C, 00, 00, 01, 40,
* 76, FF, 2C, 7A, FF, 9C, 4E, AE, FF, BE, 22, 3A,
* FF, 9C, 24, 3A, FF, C4, 26, 3A, FF, C6, 4E, AE,
* FF, D6, B6, 80, 67, 08, 41, FA, 00, 76, 61, 30, 
* 60, 0E, 4C, DF, 43, 0F, 4E, B9, JUMPADDR______,
* 9E, FC, 00, 1C, 22, 7A, FF, 9E, 20, 3A, FF, A0, 
* 2C, 78, 00, 04, 4E, AE, FF, 2E, 22, 7A, FF, 5A,
* 4E, AE, FE, 62, DE, FC, 00, 1C, 70, 00, 4E, 75, 
* 48, E7, 20, 02, 22, 08, 24, 09, 2C, 7A, FF, 42,
* 4E, AE, FC, 46, 4C, DF, 40, 04, 4E, 75, 64, 6F, 
* 73, 2E, 6C, 69, 62, 72, 61, 72, 79, 00, 4E, 6F,
* 20, 6D, 65, 6D, 6F, 72, 79, 20, 61, 76, 61, 69, 
* 6C, 61, 62, 6C, 65, 20, 61, 74, 20, 24, 25, 30,
* 38, 6C, 78, 2E, 0A, 00, 45, 72, 72, 6F, 72, 20, 
* 6C, 6F, 61, 64, 69, 6E, 67, 20, 64, 61, 74, 61,
* 2E, 0A, 00, 00, 00, 00, 03, F2, 00, 00, 03, F5, 
* 00, 00, 00, 00, 00, 00, 03, F6, 

RB_Type3	CMP.L	#$00886164,108(A0)
		BNE.B	RB_Type4
		CMP.L	#$FFBE223A,132(A0)
		BNE.B	.No
		CMP.L	#$9EFC001C,172(A0)
		BNE.B	.No
		CMP.L	#$227AFFA6,176(A0)
		BNE.B	.No
		CMP.L	#$203AFFA8,180(A0)
		BNE.B	.No
		MOVEQ	#3,D0			; True
.No		RTS

****
* xfdDecrunch professional header (V1.08)
****
* 00, 00, 03, F3, 00, 00, 00, 00, 00, 00, 00, 02,
* 00, 00, 00, 00, 00, 00, 00, 01, 00, 00, 00, 3F,
* 00, 00, 00, 00, 00, 00, 03, E9, 00, 00, 00, 3F,
* 60, 16, 00, 00, 00, 00, AB, CD, 00, 00, 00, 00,
* 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00,
* 48, E7, F0, C2, 43, FA, 00, A6, 70, 21, 2C, 78,
* 00, 04, 4E, AE, FD, D8, 41, FA, FF, D4, 20, 80,
* 67, 76, 43, F9, DECRADDR______, 20, 3C, DECRSIZE 
* ______, 4E, AE, FF, 34, 4A, 80, 66, 08, 41, FA,
* 00, 88, 61, 64, 60, 4E, 22, 3A, FF, B8, 24, 3C, 
* 00, 00, 01, 30, 76, FF, 2C, 7A, FF, A4, 4E, AE,
* FF, BE, 22, 3A, FF, A4, 24, 3A, FF, CC, 26, 3A, 
* FF, CE, 4E, AE, FF, D6, B6, 80, 67, 08, 41, FA,
* 00, 6E, 61, 34, 60, 0E, 4C, DF, 43, 0F, 4E, B9,
* JUMPADDR______, 9E, FC, 00, 1C, 22, 7A, FF, A6,
* 20, 3A, FF, A8, 2C, 78, 00, 04, 4E, AE, FF, 2E,
* 22, 7A, FF, 62, 2C, 78, 00, 04, 4E, AE, FE, 62,
* DE, FC, 00, 1C, 70, 00, 4E, 75, 76, 00, 16, 18,
* 24, 08, 2C, 7A, FF, 48, 4E, AE, FF, C4, 22, 00,
* 4E, EE, FF, D0, 64, 6F, 73, 2E, 6C, 69, 62, 72,
* 61, 72, 79, 00, 15, 4E, 6F, 20, 6D, 65, 6D, 6F,
* 72, 79, 20, 61, 76, 61, 69, 6C, 61, 62, 6C, 65,
* 2E, 0A, 14, 45, 72, 72, 6F, 72, 20, 6C, 6F, 61,
* 64, 69, 6E, 67, 20, 64, 61, 74, 61, 2E, 0A, 00,
* 00, 00, 03, F2, 00, 00, 03, F5, 00, 00, 00, 00,
* 00, 00, 03, F6, 

RB_Type4	CMP.L	#$43FA001E,48(A0)
		BNE.B	.No
		CMP.L	#$0100203C,60(A0)
		BNE.B	.No
		CMP.L	#$FFFC4EF9,72(A0)
		BNE.B	.No
		CMP.L	#$207C0000,84(A0)
		BNE.B	.No
		CMP.L	#$13D100DF,132(A0)
		BNE.B	.No
		MOVEQ	#4,D0			; True
.No		RTS

****
* ObjectMaster header (V1.0)
****
* 00, 00, 03, F3, 00, 00, 00, 00, 00, 00, 00, 02,
* 00, 00, 00, 00, 00, 00, 00, 01, HUNKSIZE______,
* 00, 00, 00, 01, 00, 00, 03, E9, HUNKSIZE______,
* 41, FA, 00, 2A, 20, 08, 06, 80, 00, 00, 00, 58,
* 43, FA, 00, 1E, 23, 40, 00, 06, 43, F9, 00, 00,
* 01, 00, 20, 3C, 00, 00, 00, 20, 22, D8, 51, C8,
* FF, FC, 4E, F9, 00, 00, 01, 00, 45, FA, 00, 48,
* 20, 7C, 00, 00, 00, 00, D1, D2, 43, F9, 00, 07,
* FF, FC, 20, 12, 13, 20, 13, D1, 00, DF, F1, 80,
* 04, 80, 00, 00, 00, 01, 66, 00, FF, F0, D3, FC,
* 00, 00, 00, 00, 20, 6A, 00, 04, 20, 12, 10, D9,
* 13, D1, 00, DF, F1, 80, 04, 80, 00, 00, 00, 01,
* 66, 00, FF, F0, 20, 6A, 00, 08, 4E, D0, DECRSIZE
* ______, DECRADDR______, JUMPADDR______, 4E, 71,

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

* D2 - destination size
* A2 - destination start pointer
* A3 - decrunch address
* A4 - jump address

DB_Addr		MOVEM.L	D2/A2-A6,-(A7)
		MOVE.L	A0,A5

		MOVEA.L	xfdbi_SourceBuffer(A5),A0
		MOVEA.L	A0,A2
		MOVE.L	xfdbi_SourceBufLen(A5),D2
		BSR.W	RB_Type1
		SUBQ.L	#1,D0
		BNE.B	.type2
		MOVEA.L	38(A2),A3	* decrunch address
		MOVEA.L	82(A2),A4	* jump address
		LEA	88(A2),A2
		SUB.L	#(88+4),D2
		BRA.B	.goon
.type2		SUBQ.L	#1,D0
		BNE.B	.type3
		MOVEA.L	88(A2),A3	* decrunch address
		MOVEA.L	176(A2),A4	* jump address
		LEA	320(A2),A2
		SUB.L	#(320),D2
		BRA.B	.goon
.type3		SUBQ.L	#1,D0
		BNE.B	.type4
		MOVEA.L	88(A2),A3	* decrunch address
		MOVEA.L	168(A2),A4	* jump address
		LEA	304(A2),A2
		SUB.L	#(304),D2
		BRA.B	.goon
.type4		MOVEA.L	158(A2),A3	* decrunch address
		MOVEA.L	162(A2),A4	* jump address
		MOVE.L	154(A2),D2	* size
		LEA	168(A2),A2
.goon		MOVE.L	4.W,A6
		MOVE.L	D2,D0
		MOVE.L	xfdbi_TargetBufMemType(A5),D1
		JSR	_LVOAllocMem(A6)
		MOVE.W	#XFDERR_NOMEMORY,xfdbi_Error(A5)
		MOVE.L	D0,xfdbi_TargetBuffer(A5)
		BEQ.B	.NoMem

		CLR.W	xfdbi_Error(A5)
		MOVE.L	D2,xfdbi_TargetBufLen(A5)
		MOVE.L	D2,xfdbi_TargetBufSaveLen(A5)
		MOVE.L	A3,xfdbi_DecrAddress(A5)
		MOVE.L	A4,xfdbi_JmpAddress(A5)

		MOVEA.L	A2,A0
		MOVEA.L	D0,A1
		MOVE.L	D2,D0
		JSR	_LVOCopyMem(A6)

		MOVEQ	#1,D0
.NoMem		MOVEM.L	(A7)+,D2/A2-A6
		RTS
		END
