
; Makros zum Einklammern einer Prozedur.  PROC/ENDPROC dürfen nicht
; geschachtelt werden !  Benutzung:
;
; ProzName PROC    Registerliste
;          ...Code der Prozedur...
;          ENDPROC
;
; Zusätzlich können per LOCAL lokale Variablen auf dem Stack belegt werden.
; Diese werden durch ENDPROC wieder freigegeben.  Beispiel:
;
; ProzName PROC    Registerliste
;          LOCAL   Varname1,Vargröße1,Varname2,Vargröße2,...
;          LOCAL   VarnameN,VargrößeN
;          SETLOC                       ; stellt den Stackpointer ein
;          ...Code der Prozedur...
;          ENDPROC
;
; Es müssen immer Name und Größe angegeben werden.  Variablen sollten größer
; als ein Byte sein.  Der Stackpointer sollte im Code nicht verändert werden,
; weil die Variablen über ihn zugegriffen werden:
;          move.l  Varname1(SP),d0


PROC		MACRO
		IFC	'','\1'
PROC_reglist	set	0
		ELSE
PROC_reglist	set	1
PROC_list	setreg	\1
		movem.l	PROC_list,-(SP)
		ENDC
PROC_varcount	set	0
		ENDM


LOCAL		MACRO
		IFNC	'','\1'
\1		set	PROC_varcount
PROC_varcount	set	PROC_varcount+\2
		LOCAL	\3,\4,\5,\6,\7,\8,\9,\a,\b,\c,\d,\e,\f,\g,\h,\i,\j,\k
		ENDC
		ENDM


SETLOC		MACRO
		IFNE	PROC_varcount
PROC_varcount	set	(PROC_varcount+1)&(~1)
		sub	#PROC_varcount,SP
		ENDC
		ENDM


ENDPROC		MACRO
		IFNE	PROC_varcount
		add	#PROC_varcount,SP
		ENDC
		IFNE	PROC_reglist
		movem.l	(SP)+,PROC_list
		ENDC
		rts
		ENDM


; Der folgende ist wie ENDPROC ohne rts, ermöglicht also das direkte Springen
; auf danach auszuführenden Code.

BRKPROC		MACRO
		IFNE	PROC_varcount
		add	#PROC_varcount,SP
		ENDC
		IFNE	PROC_reglist
		movem.l	(SP)+,PROC_list
		ENDC
		ENDM





; Makros zum Aufrufen von Bibliotheksfunktionen.  Benutzung:
;       CALL    OpenLibrary
; oder
;       CALL    OpenLibrary,_SysBase


CALL		MACRO
		IFEQ	NARG-2
		move.l	\2,a6
		ENDC
		IFLE	NARG-2
		jsr	_LVO\1(a6)
		ELSE
		FAIL    CALL MACRO: PARAMETERFEHLER
		ENDC
		ENDM


CALLRTS		MACRO
		IFEQ	NARG-2
		move.l	\2,a6
		ENDC
		IFLE	NARG-2
		jmp	_LVO\1(a6)
		ELSE
		FAIL    CALLRTS MACRO: PARAMETERFEHLER
		ENDC
		ENDM

