****************************************************
**   XFD external decruncher for recognising PPBK **
****************************************************

		opt ow2-,d-

		SECTION	FLID,CODE

		Include	Macros.I
		Include	LVO.Gs
		Include	Xfdmaster.I

		Output	Libs:xfd/PPBK

test = 0

	ifne	test
		lea	file(PC),a0
		move.l	#size,d0
		bra.b	rb_flid
	endc

; xfdForeman structure MUST be first thing in all external decrunchers

F_FLID		moveq	#-1,d0		;security
		rts

		dc.l	XFDF_ID_EQU	;id
		dc.w	1		;version
		dc.w	0
		dc.l	0,0		;private
		dc.l	S_FLID		;first slave

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

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

S_FLID		dc.l	0		;no more slaves
		dc.w	1		;version
		dc.w	33		;master version
		dc.l	N_PPBK		;name
		dc.w	XFDPFF_DATA	;flags
		dc.w	0
		dc.l	RB_PPBK		;recog buffer
		dc.l	DB_PPBK		;decrunch buffer
		dc.l	0		;recog segment
		dc.l	0		;decrunch segment

N_PPBK		dc.b	'PPbk',0
		even

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

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

RB_PPBK		Moveq.l	#0,d0			; False

		Cmp.l	#"PPbk",(a0)		; Exe header?
		Bne.b	.No

		Cmp.l	#"PP20",16(a0)		; type1
		Bne.b	.No

		Moveq.l	#1,d0			; True
.No		Rts


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

DB_PPBK		PushM	d2-d7/a2-a6
		move.l	a0,a5

		Move.l	xfdbi_SourceBufLen(a5),d0
		Sub.l	#16,d0
		move.l	d0,xfdbi_TargetBufSaveLen(a5)
		move.l	d0,xfdbi_TargetBufLen(a5)

		move.l	xfdbi_TargetBufMemType(a5),d1
		move.l	4.w,a6
		Call	AllocMem
		moveq	#XFDERR_NOMEMORY,d1
		Move.w	d1,xfdbi_Error(a5)
		move.l	d0,xfdbi_TargetBuffer(a5)
		beq.b	.NoMem


; Copy the header
		Clr.w	xfdbi_Error(a5)
		Move.l	d0,a1				; Target buffer
		Move.l	xfdbi_SourceBuffer(a5),a0
		Lea	16(a0),a0
		Move.l	xfdbi_TargetBufLen(a5),d0	; Standard header size
		Call	CopyMem

		Moveq.l	#1,d0		; True = Decrunched ok

.NoMem		PopM	d2-d7/a2-a6
		Rts
