	IFND	EXEC_LIBRARIES_I
EXEC_LIBRARIES_I	EQU	1
**
**	$Filename: exec/libraries.i $
**	$Release: 2.04 Includes, V37.4 $
**	$Revision: 36.12 $
**	$Date: 91/03/15 $
**
**	Definitions for use when creating or using Exec libraries
**
**	(C) Copyright 1985-1991 Commodore-Amiga, Inc.
**	    All Rights Reserved
**

	IFND	EXEC_NODES_I
	INCLUDE	"exec/nodes.i"
	ENDC	; EXEC_NODES_I


*------ Special Constants ---------------------------------------
LIB_VECTSIZE	EQU	6		;Each library entry takes 6 bytes
LIB_RESERVED	EQU	4		;Exec reserves the first 4 vectors
LIB_BASE	EQU	-LIB_VECTSIZE
LIB_USERDEF	EQU	LIB_BASE-(LIB_RESERVED*LIB_VECTSIZE) ;First user func
LIB_NONSTD	EQU	LIB_USERDEF


*----------------------------------------------------------------
*
*   Library Definition Macros (for creating libraries)
*
*----------------------------------------------------------------

*------ LIBINIT initializes the base offset for using the "LIBDEF" macro:
LIBINIT	MACRO	; [baseOffset]
	IFC	'\1',''
COUNT_LIB	SET	LIB_USERDEF
	ENDC
	IFNC	'\1',''
COUNT_LIB	SET	\1
	ENDC
	ENDM

*------ LIBDEF is used to define each library function entry:
LIBDEF	MACRO	;libraryFunctionSymbol
\1	EQU	COUNT_LIB
COUNT_LIB	SET	COUNT_LIB-LIB_VECTSIZE
	ENDM

*------ FUNCDEF is used to parse library offset tables.  Many applications
*------ need a special version of FUNCDEF - you provide your own macro
*------ to match your needs.  Here is an example:
*
*	FUNCDEF		 MACRO
*	_LVO\1		 EQU	FUNC_CNT
*	FUNC_CNT	 SET	FUNC_CNT-6	* Standard offset-6 bytes each
*	FUNC_CNT	 EQU	LIB_USERDEF	* Skip 4 standard vectors
*			 ENDM

*----------------------------------------------------------------
*
*   Standard Library Functions
*
*----------------------------------------------------------------

	LIBINIT	LIB_BASE

	LIBDEF	LIB_OPEN
	LIBDEF	LIB_CLOSE
	LIBDEF	LIB_EXPUNGE ; must exist in all libraries
	LIBDEF	LIB_EXTFUNC	; for future expansion - must return zero.


*----------------------------------------------------------------
*
*   Library Base Structure Definition
*   Also used for Devices and some Resources
*
*----------------------------------------------------------------

	STRUCTURE	LIB,LN_SIZE
	UBYTE	LIB_FLAGS			; see below
	UBYTE	LIB_pad			; must be zero
	UWORD	LIB_NEGSIZE		; number of bytes before LIB
	UWORD	LIB_POSSIZE		; number of bytes after LIB
	UWORD	LIB_VERSION		; major
	UWORD	LIB_REVISION		; minor
	APTR	LIB_IDSTRING		; ASCII identification
	ULONG	LIB_SUM			; the system-calculated checksum
	UWORD	LIB_OPENCNT		; number of current opens
	LABEL	LIB_SIZE	;Warning: Size is not a longword multiple!

*------ LIB_FLAGS bit definitions (all others are system reserved)
	BITDEF	LIB,SUMMING,0  ; system is currently checksumming
	BITDEF	LIB,CHANGED,1  ; something has changed the library since last sum
	BITDEF	LIB,SUMUSED,2  ; indicates if the library allows checksumming
	BITDEF	LIB,DELEXP,3   ; delayed expunge flag (for use by library)
	BITDEF	LIB,EXP0CNT,4  ; special system expunge flag.


*---------------------------------------------------------------------------
*
*	Function Invocation Macros (for calling existing, opened, libraries)
*	Also see exec/macros.i
*
*---------------------------------------------------------------------------

*------ CALLLIB for calling functions where A6 is already correct:


	ifnd	__m68

CALLLIB	MACRO	; functionOffset
	IFGT	NARG-1
	FAIL	!!! CALLLIB MACRO - too many arguments !!!
	ENDC
	JSR	\1(A6)
	ENDM


*------ LINKLIB for calling functions where A6 is incorrect:

LINKLIB	MACRO	; functionOffset,libraryBase
	IFGT	NARG-2
	FAIL	!!! LINKLIB MACRO - too many arguments !!!
	ENDC
	MOVE.L	A6,-(SP)
	MOVE.L	\2,A6
	JSR	\1(A6)
	MOVE.L	(SP)+,A6
	ENDM

	else	;is Macro68

CALLLIB	MACRO	1,1
	jsr	(\1,a6)
	ENDM

LINKLIB	MACRO	2,2
	move.l	a6,-(sp)
	movea.l	\2,a6
	jsr	(\1,a6)
	movea.l	(sp)+,a6
	ENDM

	endc	;__m68


	ENDC	; EXEC_LIBRARIES_I
