
; xpk inc
	include "libraries/xpk.i"
	include "libraries/xpksub.i"
; fast inc
	include	"FAST.i"


	XDEF	PackChunk
	XDEF	PackReset
	XDEF	PackFree
	XREF	compress_fast
	XREF	_compress_slow

	XDEF	UnpackChunk
	XDEF	UnpackFree
	XREF	decompress

	XDEF	PackerInfo

	XLIB	AllocMem
	XLIB	FreeMem

	CODE

PACKCHUNKREGS	reg	a0-a6/d1
PackChunk:
	movem.l	PACKCHUNKREGS,-(a7)
	move.l	a6,a5	;lib base
	move.l	a0,a4	;xparams
	move.l	xid_SysLib(a5),a6
	tst.l	xsp_Sub(a4)		;Is there some memory allocated?
	bne.s	packMemOK
	move.l	#PACKMEM,d0
	move.l	#$10001,d1
	CALLSYS	AllocMem
	move.l	d0,xsp_Sub(a4)
	bne.s	packMemOK
	move.l	#XPKERR_NOMEM,d0
	bra.s	endPackChunk

packMemOK:
	move.l	xsp_InBuf(a4),a0	;a0:=InBuf
	move.l	xsp_OutBuf(a4),a1	;a1:=OutBuf
	move.l	xsp_Sub(a4),a2		;a2:=Hash
	move.l	xsp_InLen(a4),d0	;d0:=InLen
	moveq.l	#90,d1
	cmp.l	xsp_Mode(a4),d1
	bcc.s	DoFastCompress
	bsr	_compress_slow
	bra.s	finished
DoFastCompress:	
	bsr	compress_fast
finished:	
	tst.l	d0
	bne.s	Nooverrun
	moveq.l	#XPKERR_EXPANSION,d0
	bra.s	endPackChunk
Nooverrun:
	move.l	d0,xsp_OutLen(a4)	;Fill in Final output length XpkSubParams
	moveq	#XPKERR_OK,d0
endPackChunk:
	movem.l	(sp)+,PACKCHUNKREGS
	rts

PACKFREEREGS	reg	a0-a3/d0-d1
PackFree:	movem.l	PACKFREEREGS,-(a7)
		move.l	xsp_Sub(a0),a1
		beq.s	packFreeEnd
		clr.l	xsp_Sub(a0)
		move.l	#PACKMEM,d0
		move.l	a6,a3
		move.l	xid_SysLib(a3),a6
		CALLSYS	FreeMem
		move.l	a3,a6
packFreeEnd:	movem.l	(a7)+,PACKFREEREGS
UnpackFree:
PackReset:	moveq	#XPKERR_OK,d0
		rts

UnpackChunk:	move.l	a1,-(sp)
		move.l	xsp_OutBuf(a0),a1
		move.l	xsp_InLen(a0),d0
		move.l	xsp_InBuf(a0),a0

		bsr	decompress
		move.l	(sp)+,a1
		moveq.l	#XPKERR_OK,d0
		rts


PackerInfo:	move.l	a0,d0
		lea	FastInfo(pc),a0
		exg	a0,d0
		rts

	

; --- Static Data --------
FastInfo:
 dc.w	1		;xi_XpkInfoVersion:Version number of this structure
 dc.w	Version		;xi_LibVersion   : The version of this sublibrary
 dc.w	2		;xi_MasterVersion: The required master lib version
 dc.w	0		;xi_ModesVersion : Longword align
 dc.l	FastName	;xi_Name         : Brief name of the packer
 dc.l	LongName	;xi_LongName     : Full name of the packer
 dc.l	Description	;xi_Description  : One line description of packer
 dc.b   'FAST'		;xi_ID           : ID the packer goes by (XPK format)
 			;xi_Flags        : Defined below
 dc.l	XPKIF_PK_CHUNK|XPKIF_UP_CHUNK|XPKIF_MODES
 dc.l	$7FFFFFFF	;xi_MaxPkInChunk : Max input chunk size for packing
 dc.l	0		;xi_MinPkInChunk : Min input chunk size for packing
 dc.l	$10000		;xi_DefPkInChunk : Default packing chunk size
 dc.l	PackMsg		;xi_PackMsg      : Packing message, present tense
 dc.l	UnpackMsg	;xi_UnpackMsg    : Unpacking message, present tense
 dc.l	PackedMsg	;xi_PackedMsg    : Packing message, past tense
 dc.l	UnpackedMsg	;xi_UnpackedMsg  : Unpacking message, past tense
 dc.w	50		;xi_DefMode      : Default mode number
 dc.w	0		;xi_Pad          : for future use
 dc.l	Modes		;xi_Modes        : Array of compression modes
 dc.l	0,0,0,0,0,0	;xi_Reserved,6*4 : Future expansion - set to zero
 		;LABEL	;xi_SIZEOF       : Size of the *first* part only

FastName:	dc.b	'fasTcinator',0
LongName:	dc.b	'FAST V'
		VERSIONSTR
		dc.b	' alias WOOP or LZRW++',0
Description:	dc.b	'LZ77-family, windowsize: 4095, no quotecount, 2 streams',0
PackMsg:	dc.b	'tieing',0
PackedMsg:	dc.b	'compressed',0
UnpackMsg:	dc.b	'untieing',0
UnpackedMsg:	dc.b	'decompressed',0

	EVEN

Modes:
 dc.l	Crawling	;xm_Next          : Chain to next descriptor for ModeDesc list
 dc.l	89		;xm_Upto          : Maximum efficiency handled by this mode.
 			;xm_Flags         : Defined below
 dc.l	XPKMF_A3000SPEED
 dc.l	PACKMEM		;xm_PackMemory    : Extra memory required during packing
 dc.l	UNPACKMEM	;xm_UnpackMemory  : Extra memory during unpacking
 dc.l	426		;xm_PackSpeed     : Approx packing speed in K per second
 dc.l	1048		;xm_UnpackSpeed   : Approx unpacking speed in K per second
 dc.w	327		;xm_Ratio         : CF in 0.1% for AmigaVision executable
 dc.w	0		;xm_ChunkSize     : Desired chunk size in K (!!) for this mode
 dc.b	'speedy',0,0,0,0 ;xm_Description,10:8 character mode description

Crawling:
 dc.l	0		;xm_Next          : Chain to next descriptor for ModeDesc list
 dc.l	100		;xm_Upto          : Maximum efficiency handled by this mode.
 			;xm_Flags         : Defined below
 dc.l	XPKMF_A3000SPEED
 dc.l	PACKMEM		;xm_PackMemory    : Extra memory required during packing
 dc.l	UNPACKMEM	;xm_UnpackMemory  : Extra memory during unpacking
 dc.l	52		;xm_PackSpeed     : Approx packing speed in K per second
 dc.l	1082		;xm_UnpackSpeed   : Approx unpacking speed in K per second
 dc.w	393		;xm_Ratio         : CF in 0.1% for AmigaVision executable
 dc.w	0		;xm_ChunkSize     : Desired chunk size in K (!!) for this mode
 dc.b	'crawling',0,0	;xm_Description,10:8 character mode description
		;LABEL	;xm_SIZEOF
	END
