* Macros & equates

	NOLIST

AbsExecBase	equ	4

REFLIB	MACRO	<Function_Name>
	xref	_LVO\1
	ENDM

CALL	MACRO	<Function_Name>
	jsr	_LVO\1(A6)
	ENDM

M2Type.INTEGER		EQU	2
M2Type.LONGINT		EQU	4
M2Type.CARDINAL		EQU	2
M2Type.LONGCARD		EQU	4
M2Type.REAL		EQU	4
M2Type.CHAR		EQU	1
M2Type.BOOLEAN		EQU	1
M2Type.ENUMERATION	EQU	1
M2Type.BITSET		EQU	2
M2Type.BYTE_SET		EQU	1
M2Type.WORD_SET		EQU	2
M2Type.LONG_SET		EQU	4
M2Type.ADDRESS		EQU	4
M2Type.POINTER		EQU	4
M2Type.PROCEDURE	EQU	4
M2Type.BYTE		EQU	1
M2Type.WORD		EQU	2
M2Type.LONGWORD		EQU	4
M2Type.ARRAY_OF		EQU	6

VAR_MODE.PARAMETERS	EQU	1
VAR_MODE.VARIABLES	EQU	2
VAR_MODE		SET	0

VAR	MACRO	<Identifier>,<Type_Size>,<Count>
TCOUNT	SET	\3-0
TSIZE	SET	M2Type.\2

	IFEQ	(VAR_MODE-VAR_MODE.PARAMETERS)!(TSIZE-1)!TCOUNT
VAR_OFFSET	SET	VAR_OFFSET-1
	ENDC

	IFEQ	TCOUNT
	 IFGT	TSIZE-1
VAR_OFFSET	SET	(VAR_OFFSET&$FFFFFFFE)
	 ENDC
VAR_OFFSET	SET	VAR_OFFSET-(TSIZE)
	ENDC

	IFNE	TCOUNT
VAR_OFFSET	SET	(VAR_OFFSET&$FFFFFFFE)
VAR_OFFSET	SET	VAR_OFFSET-(TSIZE*TCOUNT)
VAR_OFFSET	SET	(VAR_OFFSET&$FFFFFFFE)
	ENDC

\1	EQU	VAR_OFFSET
	ENDM

NEXT_MODULE_STATE	MACRO	<New State>
MODULE_STATE	SET	MODULE_STATE+1
;	IFNE	MODULE_STATE-\1
;	FAIL	Error: INCORECT MODULE DESCRIPTION SEQUENCE!
;	ENDC
	ENDM

DEFINITION_PROCEDURES	MACRO	<Procedures>
MODULE_STATE	SET	0
	NEXT_MODULE_STATE	1

DEF_NEXT_PROC		SET	0
DEF_PROCEDURE_COUNT	EQU	\1+1
	ENDM

DEF_PROC	MACRO	<Procedure_Name>
PROC_\1		EQU	DEF_NEXT_PROC
DEF_NEXT_PROC	SET	DEF_NEXT_PROC+1
	ENDM

DEFINITION_MODULES	MACRO	<Modules>
	NEXT_MODULE_STATE	2
DEF_NEXT_MODULE		SET	1
DEF_MODULE_COUNT	EQU	\1+1
	ENDM

IMPORT	MACRO	<Module_Name>
MODULE_\1	EQU	DEF_NEXT_MODULE
DEF_NEXT_MODULE	SET	DEF_NEXT_MODULE+1
	ENDM

DEFINITION_VARIABLES	MACRO
	NEXT_MODULE_STATE	3
VAR_OFFSET	SET	0
VAR_MODE	SET	VAR_MODE.VARIABLES
	ENDM

IMPLEMENTATION_VARIABLES	MACRO
	NEXT_MODULE_STATE	4
DEF_VAR_SIZE	EQU	-VAR_OFFSET
	ENDM

START_CODE	MACRO
	NEXT_MODULE_STATE	5
IMP_VAR_SIZE	EQU	(-VAR_OFFSET)-DEF_VAR_SIZE

;	SECTION	CODE_BLOCK,CODE

MODULE_BASE		EQU	*
CODE_BLOCK_START 	EQU	*
	nop
	nop
	ENDM

PROCEDURE_CODE	MACRO	<Procedure Name>
_\1
ALLOC_LOCAL_VAR	SET	(VAR_OFFSET&$FFFFFFFE)
	ENDM

PARAMETER_LIST	MACRO	<Base_Offset>,<Parameter_Size>
VAR_OFFSET		SET	\1+\2
VAR_MODE		SET	VAR_MODE.PARAMETERS
PARAMETER_BASE_OFFSET	SET	\1
POP_PARAMETER_SIZE	SET	\2
RETURN_ADR_OFFSET	SET	VAR_OFFSET-4
	ENDM

END_PARAMETER_LIST	MACRO
;	IFLT	PARAMETER_BASE_OFFSET-VAR_OFFSET
;	FAIL	Error: Parameter_Size Specified is Too Large!
;	ENDC

;	IFGT	PARAMETER_BASE_OFFSET-VAR_OFFSET
;	FAIL	Error: Parameter_Size Specified is Too Small!
;	ENDC
	ENDM

LOCAL_VARIABLES	MACRO	
VAR_OFFSET	SET	0
VAR_MODE	SET	VAR_MODE.VARIABLES
	ENDM

JUMP	MACRO	<Function_Name>
	IFGT	POP_PARAMETER_SIZE
	IFLE	POP_PARAMETER_SIZE-8
	move.L	(SP),RETURN_ADR_OFFSET(SP)
	addq.L	#POP_PARAMETER_SIZE,SP
	ENDC

	IFGT	POP_PARAMETER_SIZE-8
	move.L	(SP),RETURN_ADR_OFFSET(SP)
	lea	POP_PARAMETER_SIZE(SP),SP
	ENDC
	ENDC

	jmp	_LVO\1(A6)
	ENDM

RETURN	MACRO
	IFEQ	POP_PARAMETER_SIZE
	rts
	MEXIT
	ENDC

	IFLE	POP_PARAMETER_SIZE-8
	move.L	(SP)+,A0
	addq.L	#POP_PARAMETER_SIZE,SP
	jmp	(A0)
	MEXIT
	ENDC

	move.L	(SP)+,A0
	lea	POP_PARAMETER_SIZE(SP),SP
	jmp	(A0)

	ENDM

END_CODE	MACRO
	NEXT_MODULE_STATE	6
	CNOP	0,2
CODE_BLOCK_END		EQU	*
	ENDM

EMPTY_MODULE_BODY	MACRO
	rts
	ENDM

MODULE_BODY_LINK_LIBRARY_BASE	MACRO
	lea	MODULE_BASE(PC),A0
	move.L	Sys_\1(A4),\1(A0)
	rts
	ENDM

     IFND .A68K
.A68K SET 1
.a68k SET 1
.A68k SET 1
.a68K SET 1
     ENDC

	LIST
