IFND EXEC_MACROS_I EXEC_MACROS_I SET 1 ** ** $Filename: exec/macros.i $ ** $Release: 2.04 Includes, V37.4 $ ** $Revision: 36.8 $ ** $Date: 90/11/01 $ ** ** Handy macros for assembly language programmers. ** ** (C) Copyright 1985-1991 Commodore-Amiga, Inc. ** All Rights Reserved ** IFND DEBUG_DETAIL DEBUG_DETAIL SET 0 ;Detail level of debugging. Zero for none. ENDC CALL MACRO jsr _LVO\1(a6) ENDM JSRLIB MACRO ;FunctionName XREF _LVO\1 jsr _LVO\1(a6) ENDM JMPLIB MACRO ;FunctionName XREF _LVO\1 jmp _LVO\1(a6) ENDM BSRSELF MACRO XREF \1 bsr \1 ENDM BRASELF MACRO XREF \1 bra \1 ENDM BLINK MACRO IFNE DEBUG_DETAIL bchg.b #1,$bfe001 ;Toggle the power LED ENDC ENDM WAITCLICK MACRO .waitmc\@ btst #6,$bfe001 bne.s .waitmc\@ .waitmr\@ btst #6,$bfe001 beq.s .waitmr\@ ENDM WAITIFCLICK MACRO .waitmr\@ btst #6,$bfe001 beq.s .waitmr\@ ENDM TRIGGER MACRO ; Trigger a hardware state analyzer IFGE DEBUG_DETAIL-\1 move.w #$5555,$2fe ENDC ENDM CLEAR MACRO moveq.l #0,\1 ENDM CLEARA MACRO suba.l \1,\1 ;Quick way to put zero in an address register ENDM ************************************************************************* IFND PRINTF PRINTF MACRO ; level,,... IFGE DEBUG_DETAIL-\1 XREF kprint_macro PUSHCOUNT SET 0 IFNC '\9','' move.l \9,-(sp) PUSHCOUNT SET PUSHCOUNT+4 ENDC IFNC '\8','' move.l \8,-(sp) PUSHCOUNT SET PUSHCOUNT+4 ENDC IFNC '\7','' move.l \7,-(sp) PUSHCOUNT SET PUSHCOUNT+4 ENDC IFNC '\6','' move.l \6,-(sp) PUSHCOUNT SET PUSHCOUNT+4 ENDC IFNC '\5','' move.l \5,-(sp) PUSHCOUNT SET PUSHCOUNT+4 ENDC IFNC '\4','' move.l \4,-(sp) PUSHCOUNT SET PUSHCOUNT+4 ENDC IFNC '\3','' move.l \3,-(sp) PUSHCOUNT SET PUSHCOUNT+4 ENDC movem.l a0/a1,-(sp) lea.l PSS\@(pc),A0 lea.l 4*2(SP),A1 BSR kprint_macro movem.l (sp)+,a0/a1 bra.s PSE\@ PSS\@ dc.b \2 IFEQ (\1&1) ;If even, add CR/LF par... dc.b 13,10 ENDC dc.b 0 ds.w 0 PSE\@ lea.l PUSHCOUNT(sp),sp ENDC ;IFGE DEBUG_DETAIL-\1 ENDM ;PRINTF MACRO ENDC ;IFND PRINTF PUTMSG MACRO IFGE DEBUG_DETAIL-\1 IFNC '\3','' move.l \3,$BFFF00 ENDC IFNC '\4','' move.l \4,$BFFF00 ENDC IFNC '\5','' move.l \5,$BFFF00 ENDC IFNC '\6','' move.l \6,$BFFF00 ENDC IFNC '\7','' move.l \7,$BFFF00 ENDC IFNC '\8','' move.l \8,$BFFF00 ENDC IFNC '\9','' move.l \9,$BFFF00 ENDC IFNC '\a','' move.l \a,$BFFF00 ENDC IFNC '\b','' move.l \b,$BFFF00 ENDC IFNC '\c','' move.l \c,$BFFF00 ENDC pea .PSS\@(pc) move.l (sp)+,$BFFF04 bra.s .PSE\@ .PSS\@ dc.b \2 IFEQ (\1&1) ;If even, add CR/LF par... dc.b 10 ENDC dc.b 0 even .PSE\@ ENDC ;IFGE DEBUG_DETAIL-\1 ENDM ;PRINTF MACRO IFNE 0 ;---------------------------------------------------------------------------- ;Push a set of registers onto the stack - undo with POPM. This prevents ;the need to update or synchronize two MOVEM instructions. These macros ;assume an optimizing assembler that will convert single register MOVEM ;to MOVE. Because the REG assignment can't be reset, these macros do ;not nest. ; ; PUSHM d2/a2/a5 ; ...code... ; POPM ; RTS ; PUSHM MACRO IFGT NARG-1 FAIL !!!! TOO MANY ARGUMENTS TO PUSHM !!!! ENDC PUSHM_\@ REG \1 movem.l PUSHM_\@!,-(sp) ENDM ; ;Undo most recent PUSHM. 'POPM NOBUMP' allows multiple exit points. ; POPM MACRO movem.l (sp)+,PUSHM_\@@ ENDM ELSE PMC SET 0 PMV SET 0 PUSHM MACRO IFGT NARG-1 FAIL ENDC IFNE PMV FAIL ENDC PMV SET 1 PMC SET PMC+1 PM_\ REG \1 movem.l PM_\,-(sp) ENDM POPM MACRO IFEQ PMV FAIL ENDC movem.l (sp)+,PM_\ IFNC '\1','NOBUMP' PMC SET PMC+1 PMV SET 0 ENDC ENDM ENDC ;---------------------------------------------------------------------------- ENDC ; EXEC_MACROS_I