;
;	Beyond The Dark: Generic Library Startup Code
;
;	(c) Copyright 1995 Matthias Scheler
;	    All Rights Reserved
;

		CSECT text,0

		NOLIST
		INCLUDE	"exec/types.i"
		INCLUDE	"exec/libraries.i"
		INCLUDE	"exec/resident.i"
		INCLUDE	"exec/initializers.i"
		INCLUDE	"exec/semaphores.i"
		INCLUDE	"dos/dos.i"
		LIST

;	Macros

XLIB:		MACRO
		XREF _LVO\1
		ENDM

CALL:		MACRO
		jsr _LVO\1(a6)
		ENDM

;	External References

		XREF	_LinkerDB

		XREF	_MyBlankerName
		XREF	_MyBlankerID
		XREF	_MyBlankerLibInit
		XREF	_MyBlankerLibFree

		XREF	_QueryMyBlanker
		XREF	_InitMyBlanker
		XREF	_EndMyBlanker
		XREF	_AnimMyBlanker
		XREF	_PenCountMyBlanker

		XLIB	Remove
		XLIB	FreeMem
		XLIB	CloseLibrary
		XLIB	OpenLibrary
		XLIB	InitSemaphore
		XLIB	ObtainSemaphore
		XLIB	ReleaseSemaphore

;	External Definitions

		XDEF	_SysBase

;	Our Library Structure

		STRUCTURE BTDBase,LIB_SIZE
		BPTR	BB_SegList
		STRUCT	BB_Semaphore,SS_SIZE
		LABEL	BB_SIZE

;	Program Code

		moveq	#-1,d0
		rts

;	Library Resident Module Tag

LibResTag:	dc.w	RTC_MATCHWORD
		dc.l	LibResTag
		dc.l	LibResTag+RT_SIZE
		dc.b	RTF_AUTOINIT
		dc.b	VERSION
		dc.b	NT_LIBRARY
		dc.b	0
		dc.l	_MyBlankerName,_MyBlankerID
		dc.l	LibInit

;	Initialization Table for Library Structure

LibInit:	dc.l	BB_SIZE
		dc.l	FuncTab
		dc.l	DataTab
		dc.l	Init

FuncTab:	dc.l	Open
		dc.l	Close
		dc.l	Expunge
		dc.l	ReturnNull

		dc.l	QueryMyBlanker
		dc.l	InitMyBlanker
		dc.l	EndMyBlanker
		dc.l	AnimMyBlanker
		dc.l	PenCountMyBlanker

		dc.l	-1

DataTab:	INITBYTE LN_TYPE,NT_LIBRARY
                INITLONG LN_NAME,_MyBlankerName
                INITBYTE LIB_FLAGS,LIBF_SUMUSED+LIBF_CHANGED
                INITWORD LIB_VERSION,VERSION
                INITWORD LIB_REVISION,REVISION
                INITLONG LIB_IDSTRING,_MyBlankerID
                dc.l	0

;	Init Function

Init:		movem.l	a4/a5,-(sp)
		lea	_LinkerDB,a4

		move.l	d0,a5
		move.l	a0,BB_SegList(a5)
		move.l	a6,_SysBase(a4)

		lea	BB_Semaphore(a5),a0
		CALL	InitSemaphore

		move.l	a5,d0
		movem.l	(sp)+,a4/a5
		rts

;	Open Function

Open:		movem.l	d2/a4-a6,-(sp)
		lea	_LinkerDB,a4
		move.l	a6,d2
		move.l	a6,a5
		move.l	_SysBase(a4),a6

		lea	BB_Semaphore(a5),a0
		CALL	ObtainSemaphore

		addq.w	#1,LIB_OPENCNT(a5)
		bclr	#LIBB_DELEXP,LIB_FLAGS(a5)

		cmp.w	#1,LIB_OPENCNT(a5)
		bne.s	InitDone

		jsr	_MyBlankerLibInit
		tst.l	d0
		bne.s	InitDone

		subq.w	#1,LIB_OPENCNT(a5)
		moveq	#0,d2

InitDone:	lea	BB_Semaphore(a5),a0
		CALL	ReleaseSemaphore

		move.l	d2,d0
		movem.l	(sp)+,d2/a4-a6
		rts

;	Close Function

Close:		movem.l	a4-a6,-(sp)
		lea	_LinkerDB,a4
		move.l	a6,a5
		move.l	_SysBase(a4),a6

		lea	BB_Semaphore(a5),a0
		CALL	ObtainSemaphore

		subq.w	#1,LIB_OPENCNT(a5)
		bne.s	KeepLibrary

		jsr	_MyBlankerLibFree

		btst	#LIBB_DELEXP,LIB_FLAGS(a6)
		bne.s	KeepLibrary

		lea	BB_Semaphore(a5),a0
		CALL	ReleaseSemaphore
		movem.l	(sp)+,a4-a6
		bra.s	TimeToGo

KeepLibrary:	lea	BB_Semaphore(a5),a0
		CALL	ReleaseSemaphore
		movem.l	(sp)+,a4-a6

ReturnNull:	moveq	#0,d0
		rts

;	Expunge Function

Expunge:        tst.w	LIB_OPENCNT(a6)
                beq.s	TimeToGo

                bset	#LIBB_DELEXP,LIB_FLAGS(a6)
                bra.s	ReturnNull

TimeToGo:	movem.l d2/a4-a6,-(sp)
		lea	_LinkerDB,a4
		move.l	BB_SegList(a6),d2

		move.l	a6,a5
		move.l	a5,a1
		move.l	_SysBase(a4),a6
		CALL	Remove

		move.l	a5,a1
		moveq	#0,d0
		move.w	LIB_NEGSIZE(a5),d0
		sub.w	d0,a1
		add.w	LIB_POSSIZE(a5),d0
		CALL	FreeMem

		move.l	d2,d0
		movem.l	(sp)+,d2/a4-a6
		rts

;	own Library functions

;	return BlankerInfo

QueryMyBlanker:	lea	_QueryMyBlanker(pc),a1
		bra.s	Stub

;	create MyBlanker structure

InitMyBlanker:	lea	_InitMyBlanker(pc),a1
		bra.s	Stub

;	free MyBlanker structure

EndMyBlanker:	lea	_EndMyBlanker(pc),a1
		bra.s	Stub

;	count required pens

PenCountMyBlanker:
		lea	_PenCountMyBlanker(pc),a1
		bra.s	Stub

;	draw a frame with MyBlanker structure

AnimMyBlanker:	lea	_AnimMyBlanker(pc),a1

;	call C function

Stub:		move.l	a4,-(sp)
		lea	_LinkerDB,a4

		move.l	a0,-(sp)
		jsr	(a1)
		addq.w #4,sp

		move.l	(sp)+,a4
		rts

;	Data

		CSECT data,1

_SysBase:	dc.l	0

		END
