;;; $Id: xpkFAST.s,v 1.5 93/06/28 18:20:03 roques Exp $

;;; The shared library bureaucrazy(!) for xpkFAST.

;sys inc
	include	"exec/types.i"
	include	"exec/initializers.i"
	include	"exec/libraries.i"
	include	"exec/lists.i"
	include	"exec/nodes.i"
	include	"exec/resident.i"
;xpk inc
	include	"libraries/xpk.i"
	include	"libraries/xpksub.i"
;fast inc
	include "fast.i"

		; compress
		XREF	PackChunk
		XREF	PackFree
		XREF	PackReset

		; decompress
		XREF	UnpackChunk
		XREF	UnpackFree

		; FASTmisc
		XREF	PackerInfo

		XLIB	AllocMem
		XLIB	FreeMem
		XLIB	Remove

Pri		equ	0


	CODE

DummyEntry:	moveq	#-1,d0	;Tell all fools trying to execute us
		rts		;that our execution failed. ;-)


Resident:	dc.w	RTC_MATCHWORD
		dc.l	Resident
		dc.l	ResEnd
		dc.b	RTF_AUTOINIT
		dc.b	ResVersion
		dc.b	NT_LIBRARY
		dc.b	Pri
		dc.l	LibName
		dc.l	IdString
		dc.l	Init

LibName:	dc.b	'xpkFAST.library',0
IdString:	dc.b	'$VER: xpkFAST.library V'
		VERSIONSTR
		dc.b	' ('
		VERSIONDATE
		dc.b	')',13,10,0
		EVEN
ResEnd:


Init:		dc.l	XpkFast_SIZEOF
		dc.l	FuncTable
		dc.l	DataTable
		dc.l	InitRoutine


; --- sys
FuncTable:	dc.l	Open
		dc.l	Close
		dc.l	Expunge
		dc.l	Null
; --- xpksub
		dc.l	PackerInfo
		dc.l	PackChunk
		dc.l	PackFree
		dc.l	PackReset
		dc.l	UnpackChunk
		dc.l	UnpackFree
; --- omega
		dc.l	-1


DataTable:	INITBYTE	LH_TYPE,NT_LIBRARY
		INITLONG	LN_NAME,LibName
		INITBYTE	LIB_FLAGS,LIBF_SUMUSED+LIBF_CHANGED
		INITWORD	LIB_VERSION,Version
		INITWORD	LIB_REVISION,Revision
		INITLONG	LIB_IDSTRING,IdString
		dc.l	0


InitRoutine:	move.l	a5,-(a7)
		move.l	d0,a5
		move.l	a6,xid_SysLib(a5)
		move.l	a0,xid_SegList(a5)
		move.l	(a7)+,a5
		rts

;--- sys entries

Open:		addq.w	#1,LIB_OPENCNT(a6)
		bclr.b	#LIBB_DELEXP,LIB_FLAGS(a6)
		move.l	a6,d0
rts00:		rts


Close:		moveq	#0,d0
		subq.w	#1,LIB_OPENCNT(a6)
		bne.s	rts00
		btst.b	#LIBB_DELEXP,LIB_FLAGS(a6)
		beq.s	rts00

	;;; Fall through to Expunge and remove the lib from memory.

Expunge:	movem.l	d1-d2/a5-a6,-(a7)
		move.l	a6,a5
		move.l	xid_SysLib(a5),a6
		tst.w	LIB_OPENCNT(a5)
		beq.s	exp1
		bset.b	#LIBB_DELEXP,LIB_FLAGS(a5)
		moveq	#0,d0
		bra.s	expEnd

exp1:		move.l	xid_SegList(a5),d2
		move.l	a5,a1
		CALLSYS	Remove
		moveq	#0,d0
		move.l	a5,a1
		move.w	LIB_NEGSIZE(a5),d0
		sub.l	d0,a1
		add.w	LIB_POSSIZE(a5),d0
		CALLSYS	FreeMem
		move.l	d2,d0
expEnd:		movem.l	(a7)+,d1-d2/a5-a6
		rts

Null:		moveq	#0,d0
		rts

; --- End of sys stuff ---

	END
