; mit "genam omega.library.s" assemblieren

	SECTION	code

	INCDIR "include:"
	INCLUDE "exec/types.i"
	INCLUDE "exec/initializers.i"
	INCLUDE "exec/libraries.i"
	INCLUDE "exec/lists.i"
	INCLUDE "exec/alerts.i"
	INCLUDE "exec/resident.i"
	INCLUDE "libraries/dos.i"

	STRUCTURE	OmegaBase,LIB_SIZE
	UBYTE		ob_Flags
	UBYTE		ob_pad
	ULONG		ob_SysLib
	ULONG		ob_DosLib
	ULONG		ob_SegList
	LABEL		OmegaBase_SIZEOF

Start:
; Fehlercode 42 an CLI zurückgeben, falls die Library
; versehentlich gestartet wurde
	moveq.l	#42,d0
	rts

VERSION			EQU	1
REVISION		EQU	0
PRIORITY		EQU	0

_LVOOpenLibrary		EQU	-552
_LVOAlert		EQU	-108
_LVORemove		EQU	-252
_LVOCloseLibrary	EQU	-414
_LVOFreeMem		EQU	-210

Resident:
	DC.W	RTC_MATCHWORD	; UWORD RT_MATCHWORD
	DC.L	Resident	; APTR RT_MATCHTAG
	DC.L	EndCode		; APTR RT_ENDSKIP
	DC.B	RTF_AUTOINIT	; UBYTE RT_FLAGS
	DC.B	VERSION		; UBYTE RT_VERSION
	DC.B	NT_LIBRARY	; UBYTE RT_TYPE
	DC.B	PRIORITY	; BYTE RT_PRI
	DC.L	LibName		; APTR RT_NAME
	DC.L	IDString	; APTR RT_IDSTRING
	DC.L	InitTable	; APTR RT_INIT

LibName:
	DC.B	'omega.library',0
	even
IDString:
	DC.B	'omega 1.0 (8.1.93)',13,10,0
	even
dosName:
	DC.B	'dos.library',0
	even
InitTable:
	DC.L	OmegaBase_SIZEOF
	DC.L	funcTable
	DC.L	dataTable
	DC.L	initRoutine

funcTable:
; Systemfunktionen
	dc.l	Open
	dc.l	Close
	dc.l	Expunge
	dc.l	ExtFunc
; Eigene Funktionen
	dc.l	Func1
	dc.l	Func2
;	dc.l	...
; Endmarkierung
	dc.l -1
dataTable:
	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,IDString
	DC.L		0
; die INITxxxx Macros sind etwas einfacher zu schreiben:
;
; INITBYTE W1,W2
;    entspricht
; dc.b $e0,0
; dc.w W1
; dc.b W2,0
;
; INITWORD W1,W2
;    entspricht
; dc.b $d0,0
; dc.w W1,W2
;
; INITLONG W1,W2
;    entspricht
; dc.b $c0,0
; dc.w W1
; dc.l W2

initRoutine:
	move.l	a5,-(sp)
	move.l	d0,a5
	move.l	a6,ob_SysLib(a5)
	move.l	a0,ob_SegList(a5)
	lea	dosName(pc),a1
	moveq.l	#0,d0
	jsr	_LVOOpenLibrary(a6)
	move.l	d0,ob_DosLib(a5)
	bne.s	1$
	ALERT	AG_OpenLib!AO_DOSLib
1$:
	move.l	a5,d0
	move.l	(sp)+,a5
	rts

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

Close:
	moveq.l	#0,d0
	subq.w	#1,LIB_OPENCNT(a6)
	bne.s	1$
	btst	#LIBB_DELEXP,ob_Flags(a6)
	beq.s	1$
	bsr	Expunge
1$:
	rts

Expunge:
	movem.l	d2/a5/a6,-(sp)
	move.l	a6,a5
	move.l	ob_SysLib(a5),a6
	tst.w	LIB_OPENCNT(a5)
	beq	1$
	bset	#LIBB_DELEXP,ob_Flags(a5)
	moveq.l	#0,d0
	bra.s	ExpEnd
1$:
	move.l	ob_SegList(a5),d2
	move.l	a5,a1
	jsr	_LVORemove(a6)
	move.l	ob_DosLib(a5),a1
	jsr	_LVOCloseLibrary(a6)
	moveq.l	#0,d0
	move.l	a5,a1
	move.w	LIB_NEGSIZE(a5),d0
	sub.l	d0,a1
	add.w	LIB_POSSIZE(a5),d0
	jsr	_LVOFreeMem(a6)
	move.l	d2,d0
ExpEnd:
	movem.l	(sp)+,d2/a5/a6
	rts

ExtFunc:
	moveq.l	#0,d0
	rts

; ***********************************************

Func1:
	movem.l	d0-d7/a0-a6,-(sp)
	move.l	#$20000,d0
1$:
	move.w	d0,$dff180
	subq.l	#1,d0
	bne	1$
	movem.l	(sp)+,d0-d7/a0-a6
	rts

Func2:
	movem.l	d0-d7/a0-a6,-(sp)
	move.l	#$20000,d0
1$:
	move.w	d0,$dff182
	subq.l	#1,d0
	bne	1$
	movem.l	(sp)+,d0-d7/a0-a6
	rts

; ***********************************************

EndCode:
