	incdir	asm:
	include	exec/types.i
	include	exec/libraries.i
	include	exec/resident.i
	include	exec/initializers.i
	include	exec/semaphores.i
	include	dos/dos.i

callsys	macro
	jsr	_LVO\1(a6)
	endm

	xref	_SysBase
	xref	_UserOpenLibs
	xref	_UserCloseLibs

	EXTERN_LIB	Remove
	EXTERN_LIB	FreeMem
	EXTERN_LIB	CloseLibrary
	EXTERN_LIB	OpenLibrary
	EXTERN_LIB	InitSemaphore
	EXTERN_LIB	ObtainSemaphore
	EXTERN_LIB	ReleaseSemaphore

	STRUCTURE	ClassBase,LIB_SIZE
	BPTR	cb_SegList
	APTR	cb_Class
	STRUCT	cb_Lock,SS_SIZE
	LABEL	cb_SIZE

	moveq	#-1,d0
	rts

VERSION	EQU	43
REVISION	EQU	0

LibRomTag
	dc.w	RTC_MATCHWORD
	dc.l	LibRomTag
	dc.l	LibRomTag+RT_SIZE
	dc.b	RTF_AUTOINIT
	dc.b	VERSION
	dc.b	NT_LIBRARY
	dc.b	0
	dc.l	LibName,LibID
	dc.l	InitTab

LibName
	dc.b	"pcd.datatype",0
LibID
	dc.b	"$VER:pcd.datatype 43.0 (c) 1997 by Achim Stegemann",0
	even

InitTab
	dc.l	cb_SIZE
	dc.l	FuncTab
	dc.l	DataTab
	dc.l	LibInit

FuncTab
	dc.l	LibOpen
	dc.l	LibClose
	dc.l	LibExpunge
	dc.l	ReturnNull
	dc.l	ObtainEngine
	dc.l	-1

DataTab:
	INITBYTE	LN_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,LibID
	dc.l	0

LibInit
	move.l	a2,-(sp)
	move.l	d0,a2
	move.l	a0,cb_SegList(a2)
	move.l	a6,_SysBase
	lea	cb_Lock(a2),a0
	callsys	InitSemaphore
	move.l	a2,d0
	move.l	(sp)+,a2
	rts

LibOpen
	movem.l	d2/a2/a6,-(sp)
	move.l	a6,d2
	move.l	a6,a2
	move.l	4,a6
	bclr	#LIBB_DELEXP,LIB_FLAGS(a2)
	add.w	#1,LIB_OPENCNT(a2)
	lea	cb_Lock(a2),a0
	callsys	ObtainSemaphore
	tst.l	cb_Class(a2)
	bne	.GotClass
	move.l	d2,-(sp)
	jsr	_UserOpenLibs
	add.w	#4,sp
	move.l	d0,d2
	bne	.GotClass
	sub.w	#1,LIB_OPENCNT(a2)

.GotClass
	lea	cb_Lock(a2),a0
	callsys	ReleaseSemaphore
	move.l	d2,d0
	movem.l	(sp)+,d2/a2/a6
	rts

LibClose
	sub.w	#1,LIB_OPENCNT(a6)
	bne	ReturnNull
	btst	#LIBB_DELEXP,LIB_FLAGS(a6)
	bne	TimeToGo

ReturnNull
	moveq	#0,d0
	rts

LibExpunge
	tst.w	LIB_OPENCNT(a6)
	beq	TimeToGo
	bset	#LIBB_DELEXP,LIB_FLAGS(a6)
	bra	ReturnNull

TimeToGo
	movem.l	d2/a2/a6,-(sp)
	tst.l	cb_Class(a6)
	beq	.ClassNotBusy
	move.l	a6,-(sp)
	jsr	_UserCloseLibs
	add.w	#4,sp
	tst.l	d0
	bne	.ClassNotBusy
	movem.l	(sp)+,d2/a2/a6
	rts

.ClassNotBusy
	move.l	a6,a2
	move.l	cb_SegList(a2),d2
	move.l	4,a6
	move.l	a2,a1
	callsys	Remove
	move.l	a2,a1
	moveq	#0,d0
	move.w	LIB_NEGSIZE(a2),d0
	sub.w	d0,a1
	add.w	LIB_POSSIZE(a2),d0
	callsys	FreeMem
	move.l	d2,d0
	movem.l	(sp)+,d2/a2/a6
	rts

ObtainEngine
	move.l	cb_Class(a6),d0
	rts

