*******************************************************
**   XFD external decruncher for B6B2AFCB Cruncher   **
**        written by Mr. Larmer / Wanted Team        **
*******************************************************

;		OUTPUT	LIBS:xfd/$B6B2AFCB

		SECTION	B6B2AFCBDecrunch,CODE

		INCDIR	"dh2:Include/"	;change this as you need it
		INCLUDE	"libraries/xfdmaster.i"

; xfdForeman structure MUST be first thing in all external decrunchers

F_B6B2AFCB		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_B6B2AFCB	;first slave

		dc.b	"$VER: External Andromeda decruncher for xfdmaster.library "
		dc.b	"by Mr.Larmer/Wanted Team (20.11.99)",13,10,0
		cnop	0,4

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

; xfdSlave structure: this one doesn't support segment decrunching

S_B6B2AFCB	dc.l	0		;no more slaves
		dc.w	1		;version
		dc.w	33		;master version
		dc.l	N_B6B2AFCB	;name
		dc.w	XFDPFF_DATA	;flags
		dc.w	0
		dc.l	RB_B6B2AFCB	;recog buffer
		dc.l	DB_B6B2AFCB	;decrunch buffer
		dc.l	0		;recog segment
		dc.l	0		;decrunch segment

N_B6B2AFCB	dc.b	"Andromeda ($B6B2AFCB) Data Cruncher",0
		even

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

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

RB_B6B2AFCB	cmp.l	#12+2,d0
		ble.s	.Exit
		cmp.l	#$B6B2AFCB,(a0)
		bne.s	.Exit
		moveq	#1,d0
		rts

.Exit		moveq	#0,d0
		rts

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

;Decrunch buffer function: receives bufferinfo in a0

DB_B6B2AFCB	movem.l	d2-d7/a2-a6,-(a7)
		move.l	a0,a5
		move.l	xfdbi_SourceBuffer(a5),a2

		move.l	16(A2),D0
		lsl.l	#2,D0
		move.l	D0,D2

		move.l	d0,xfdbi_TargetBufSaveLen(a5)
		add.l	12(A2),D0
		move.l	d0,xfdbi_TargetBufLen(a5)

		move.l	xfdbi_TargetBufMemType(a5),d1
		move.l	4.w,a6
		jsr	-198(a6)
		move.w	#XFDERR_NOMEMORY,xfdbi_Error(a5)
		move.l	d0,xfdbi_TargetBuffer(a5)
		beq.s	.Exit

		movem.l	d0-a6,-(a7)

		move.l	d0,a1
		move.l	a2,a0

		move.l	A1,A2
		add.l	D2,A2
	
;		lea	Buffer(pc),a2
		bsr.s	D_B6B2AFCB

		movem.l	(a7)+,d0-a6

		moveq	#1,d0
.Exit		movem.l	(a7)+,d2-d7/a2-a6
		rts

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

D_B6B2AFCB
	addq.l	#4,A0
	movem.l	(A0)+,D0/D1/D4
	adda.l	D4,A2
	suba.w	#$30,SP
	lea	(SP),A4
	bsr.b	lbC000018
	adda.w	#$30,SP
	rts

lbC000018:
	lea	8(A4),A5
	move.l	#$60A0A12,(A5)+
	move.l	#$2030304,(A5)+
	move.l	#$4050700,(A5)+
	move.w	D0,(A4)
	clr.w	D0
	rol.l	#4,D0
	move.b	D0,-(A5)
	clr.b	D0
	rol.l	#4,D0
	move.l	D0,2(A4)
	move.l	D1,4(A4)
	lea	lbL0002B4(PC),A3
	mulu.w	#12,D0
	adda.w	D0,A3
	lea	$24(A4),A5
	lea	(A5),A6
	move.l	(A3)+,(A5)+
	move.l	(A3)+,(A5)+
	move.l	(A3),(A5)
	lea	$14(A4),A5
	moveq	#7,D1
lbC00005E:
	move.b	(A6)+,D0
	bpl.b	lbC00006A
	andi.b	#$7F,D0
	addq.b	#8,D0
lbC00006A:
	moveq	#0,D2
	bset	D0,D2
	tst.l	4(A4)
	bpl.b	lbC000078
	subq.w	#1,D2
lbC000078:
	move.w	D2,(A5)+
	dbra	D1,lbC00005E
	lea	$14(A4),A6
	lea	$1C(A4),A5
	moveq	#3,D1
lbC000088:
	move.w	(A6)+,D0
	add.w	D0,(A5)+
	dbra	D1,lbC000088
	andi.b	#$7F,4(A4)
	lea	(A1),A3
	lea	(A2),A6
lbC00009A:
	cmpa.l	A6,A2
	bne.b	lbC0000A4
	bsr.b	lbC0000F2
lbC0000A4:
	move.l	(A2)+,D0
	bpl.b	lbC0000AC
	rts

lbC0000AC:
	lea	(A3),A1
lbC0000AE:
	lea	-$20(A6),A6
	movem.l	D1-D7/A0,-(SP)
	subq.l	#8,D0
	bmi.b	lbC0000D2
lbC0000BC:
	cmpa.l	A6,A2
	bhi.b	lbC0000D2
	movem.l	(A2)+,D1-D7/A0
	movem.l	D1-D7/A0,(A1)
	lea	$20(A1),A1
	subq.l	#8,D0
	bpl.s	lbC0000BC
lbC0000D2:
	movem.l	(SP)+,D1-D7/A0
	lea	$20(A6),A6
	addq.l	#8,D0
	beq.s	lbC00009A
lbC0000DE:
	cmpa.l	A6,A2
	beq.b	lbC0000EC
	move.l	(A2)+,(A1)+
	subq.l	#1,D0
	bne.s	lbC0000DE
	bra.s	lbC00009A

lbC0000EC:
	bsr.b	lbC0000F2
	bra.s	lbC0000AE

lbC0000F2:
	suba.l	D4,A2
	movem.l	D0/A3,-(SP)
	lea	(A2),A3
	move.w	D4,D5
	move.w	(A4),D2
	move.b	2(A4),D1
	move.b	3(A4),D0
	bne.w	lbC000262
	bra.w	lbC000284

lbC00010E:
	add.b	D1,D1
	bne.b	lbC000118
	move.b	(A0)+,D1
	addx.b	D1,D1
lbC000118:
	bcc.b	lbC0001A0
	add.b	D1,D1
	bne.b	lbC000126
	move.b	(A0)+,D1
	addx.b	D1,D1
lbC000126:
	bcc.b	lbC000198
	add.b	D1,D1
	bne.b	lbC000134
	move.b	(A0)+,D1
	addx.b	D1,D1
lbC000134:
	bcc.b	lbC000190
	add.b	D1,D1
	bne.b	lbC000142
	move.b	(A0)+,D1
	addx.b	D1,D1
lbC000142:
	bcc.b	lbC000188
	add.b	D1,D1
	bne.b	lbC000150
	move.b	(A0)+,D1
	addx.b	D1,D1
lbC000150:
	bcc.b	lbC00015C
	move.b	(A0)+,D0
	moveq	#3,D7
	bra.b	lbC0001A4

lbC00015C:
	add.b	D1,D1
	bne.b	lbC000166
	move.b	(A0)+,D1
	addx.b	D1,D1
lbC000166:
	addx.b	D0,D0
	add.b	D1,D1
	bne.b	lbC000172
	move.b	(A0)+,D1
	addx.b	D1,D1
lbC000172:
	addx.b	D0,D0
	add.b	D1,D1
	bne.b	lbC00017E
	move.b	(A0)+,D1
	addx.b	D1,D1
lbC00017E:
	addx.b	D0,D0
	addq.b	#6,D0
	moveq	#3,D7
	bra.b	lbC0001A4

lbC000188:
	moveq	#5,D0
	moveq	#3,D7
	bra.b	lbC0001A4

lbC000190:
	moveq	#4,D0
	moveq	#2,D7
	bra.b	lbC0001A4

lbC000198:
	moveq	#3,D0
	moveq	#1,D7
	bra.b	lbC0001A4

lbC0001A0:
	moveq	#2,D0
	moveq	#0,D7
lbC0001A4:
	move.w	D7,D3
	add.b	D1,D1
	bne.b	lbC0001B0
	move.b	(A0)+,D1
	addx.b	D1,D1
lbC0001B0:
	bcc.b	lbC0001CE
	add.b	D1,D1
	bne.b	lbC0001BE
	move.b	(A0)+,D1
	addx.b	D1,D1
lbC0001BE:
	bcc.b	lbC0001DE
	moveq	#0,D6
	move.b	8(A4,D7.W),D6
	addq.b	#4,D7
	bra.b	lbC0001E0

lbC0001CE:
	add.b	D1,D1
	bne.b	lbC0001D8
	move.b	(A0)+,D1
	addx.b	D1,D1
lbC0001D8:
	addx.w	D2,D2
	bra.b	lbC0001F6

lbC0001DE:
	moveq	#2,D6
lbC0001E0:
	move.b	12(A4,D7.W),D7
lbC0001E4:
	add.b	D1,D1
	bne.b	lbC0001EE
	move.b	(A0)+,D1
	addx.b	D1,D1
lbC0001EE:
	addx.w	D2,D2
	subq.b	#1,D7
	bne.s	lbC0001E4
	add.w	D6,D2
lbC0001F6:
	moveq	#0,D6
	movea.w	D6,A5
	move.w	D3,D7
	add.b	D1,D1
	bne.b	lbC000206
	move.b	(A0)+,D1
	addx.b	D1,D1
lbC000206:
	bcc.b	lbC00022A
	add.w	D3,D3
	add.b	D1,D1
	bne.b	lbC000216
	move.b	(A0)+,D1
	addx.b	D1,D1
lbC000216:
	bcc.b	lbC000224
	movea.w	$1C(A4,D3.W),A5
	addq.b	#8,D7
	bra.b	lbC00022A

lbC000224:
	movea.w	$14(A4,D3.W),A5
	addq.b	#4,D7
lbC00022A:
	move.b	$24(A4,D7.W),D7
	bpl.b	lbC00023C
	move.b	(A0)+,D6
	andi.b	#$7F,D7
	beq.b	lbC00024C
lbC00023C:
	add.b	D1,D1
	bne.b	lbC000246
	move.b	(A0)+,D1
	addx.b	D1,D1
lbC000246:
	addx.w	D6,D6
	subq.b	#1,D7
	bne.s	lbC00023C
lbC00024C:
	addq.w	#1,D6
	add.w	A5,D6
	lea	(A3),A5
	suba.w	D6,A5
	cmpa.l	A2,A5
	bcc.b	lbC00025C
	adda.w	D4,A5
lbC00025C:
	cmpa.l	A5,A6
	beq.b	lbC00027A
lbC000262:
	subq.w	#1,D5
	bmi.b	lbC0002A4
lbC000268:
	move.b	(A5)+,(A3)+
	subq.b	#1,D0
	beq.b	lbC000284
	cmpa.l	A5,A6
	dbeq	D5,lbC000268
	bne.b	lbC0002A4
lbC00027A:
	lea	(A2),A5
	dbra	D5,lbC000268
	bra.b	lbC0002A4

lbC000284:
	tst.w	D2
	beq.b	lbC00029C
	subq.w	#1,D5
	bmi.b	lbC0002A4
lbC000290:
	move.b	(A0)+,(A3)+
	subq.w	#1,D2
	dbeq	D5,lbC000290
	bne.b	lbC0002A4
lbC00029C:
	subq.l	#1,4(A4)
	bne.w	lbC00010E
lbC0002A4:
	move.b	D0,3(A4)
	move.b	D1,2(A4)
	move.w	D2,(A4)
	movem.l	(SP)+,D0/A3
	rts

lbL0002B4:
	dc.l	$5050505,$5050505,$6060606,$5060707,$6060606
	dc.l	$7070606,$5060707,$7070707,$80808080,$5060780
	dc.l	$7078080,$80818181,$6070780,$7808181,$80818282
	dc.l	$6070780,$7818182,$80828383,$6070780,$7818182
	dc.l	$80828484,$6070780,$7818282,$80838485,$6070780
	dc.l	$7818283,$80838586

;Buffer	dcb.b	$5000

		END
