; *** MACROS.ASM

; *** SYSTEM MACRO DEFINITIONS

EVENPC MACRO		;WORD ALIGN PROGRAM COUNTER
  DS.W 0
 ENDM

ZERO MACRO		;CLEAR DATA REGISTER
  MOVEQ #0,\1		;\1 <= DATA REGISTER
 ENDM

ZERA MACRO		;CLEAR ADDRESS REGISTER
  SUBA.L \1,\1		;\1 <= ADDRESS REGISTER
 ENDM

PUSHREG MACRO		;PUSH REGISTERS TO THE STACK
  MOVEM.L \1,-(SP)	;\1 <= REGISTERS
 ENDM

PUSHALL MACRO		;PUSH ALL REGISTERS TO THE STACK
  PUSHREG D0-D7/A0-A6
 ENDM

PULLREG MACRO		;PULL REGISTERS FROM THE STACK
  MOVEM.L (SP)+,\1	;\1 <= REGISTERS
 ENDM

PULLALL MACRO		;PULL ALL REGISTERS FROM THE STACK
  PULLREG D0-D7/A0-A6
 ENDM

LIBCALL MACRO		;GENERAL LIBRARY CALL
  MOVE.L \1,A6		;\1 <= LIBRARY BASE
  JSR LVO.\2(A6)	;\2 <= FUNCTION OFFSET
 ENDM

SYSLIB MACRO		;EXEC LIBRARY
  LIBCALL SYSBASE,\1	;\1 <= FUNCTION OFFSET
 ENDM

DOSLIB MACRO		;DOS LIBRARY
  LIBCALL _DOSBASE,\1	;\1 <= FUNCTION OFFSET
 ENDM

GFXLIB MACRO		;GRAPHICS LIBRARY
 IFNC '\2',''		;\1 <= FUNCTION OFFSET
  MOVE.L \2,A1		;\2 <= [*RASTPORT]
 ENDC
  LIBCALL _GFXBASE,\1
 ENDM

INTLIB MACRO		;INTUITION LIBRARY
  LIBCALL _INTBASE,\1	;\1 <= FUNCTION OFFSET
 ENDM

MATHLIB MACRO		;MATH LIBRARY
  LIBCALL _MATHBASE,\1	;\1 <= FUNCTION OFFSET
 ENDM

TRANSLIB MACRO		;TRANSMATH LIBRARY
  LIBCALL _MATHTRANSBASE,\1	;\1 <= FUNCTION OFFSET
 ENDM

ICONLIB MACRO		;ICONS LIBRARY
  LIBCALL _ICONBASE,\1	;\1 <= FUNCTION OFFSET
 ENDM

JUST MACRO		;RUN FUNCTION OF LIBRARY
  JSR LVO.\1(A6)	;\1 <= FUNCTION OFFSET
 ENDM		;A6 <= LIBRARY ADDRESS

EMERGENCY MACRO	;PUT ERROR CODE IN D0 AND EXIT
  MOVE.L #\1,D0		;\1 <= ERROR CODE
  JMP _ERROR
 ENDM

ALLOCPUBMEM MACRO	;ALLOCATE PUBLIC MEMORY
  MOVE.L \1,D0		;\1 <= SIZE
  MOVE.L #MEMF_PUBLIC!MEMF_CLEAR,D1
  SYSLIB ALLOCMEM
 ENDM

FREEMEM MACRO		;FREE ALLOCATED MEMORY
  MOVE.L \1,A1		;\1 <= ADDRESS
  MOVE.L \2,D0		;\2 <= SIZE
  SYSLIB FREEMEM
 ENDM

; *** DOS MACRO DEFINITIONS

DOSREAD MACRO		;DOS READ
  MOVE.L \1,D1		;\1 <= *FILE HANDLE
  MOVE.L \2,D2		;\2 <= *BUFF
  MOVE.L \3,D3		;\3 <= LENGTH
  DOSLIB READ
 ENDM

DOSPRINT MACRO		;DOS PRINT
  PUSHREG D1-D3/A0-A1	;\1 <= *FILE HANDLE 
  MOVE.L \1,D1		;\2 <= *BUFF
  MOVE.L \2,D2		;\3 <= [LENGTH]
 IFC '\3',''
  BSR DOSTEXTLEN	;GET LENGTH IF UNSPECIFIED
 ENDC
 IFNC '\3',''
  MOVE.L \3,D3
 ENDC
  DOSLIB WRITE
  PULLREG D1-D3/A0-A1
 ENDM

 IFD DOS
DOSTEXTLEN		;TEXT LENGTH SUBROUTINE
  MOVE.L D2,A0		;D2 <= ADDRESS
1$
  TST.B (A0)+
  BNE.S 1$
  MOVE.L A0,D3
  SUB.L D2,D3
  SUBQ.L #1,D3
 RTS
 ENDC

; *** INTUITION MACRO DEFINITIONS

REMEMBERCHIPMEM MACRO	;CHIP MEMORY ALLOCATE REMEMBER
  LEA \1,A0		;\1 <= *REMEMBERKEY
  MOVEQ.L #0,D0		;\2 <= SIZE
  MOVE \2,D0		;\3 <= [SUBROUTINE]
  MOVE.L #MEMF_CLEAR!MEMF_CHIP,D1
  INTLIB ALLOCREMEMBER
 IFNC '\3',''
  TST.L D0
  BEQ \3
 ENDC
 ENDM

REMEMBERPUBMEM MACRO	;PUBLIC MEMORY ALLOCATE REMEMBER 
  LEA \1,A0		;\1 <= *REMEMBERKEY
  MOVEQ.L #0,D0		;\2 <= SIZE
  MOVE \2,D0		;\3 <= [SUBROUTINE]
  MOVE.L #MEMF_CLEAR!MEMF_PUBLIC,D1
  INTLIB ALLOCREMEMBER
 IFNC '\3',''
  TST.L D0
  BEQ \3
 ENDC
 ENDM

; *** GRAPHICS MACRO DEFINITIONS

GFXPOINT MACRO		;LOCATION SELECTION
 IFNC '\1',''		;\1 <= [*X COORDINATE]
  MOVE.W \1,D0		;\2 <= [*Y COORDINATE]
  MOVE.W \2,D1
 ENDC
  EXT.L D0
  EXT.L D1
 ENDM

GFXPUSH MACRO		;PUSH 4 MAIN GRAPHICS REGISTERS
  PUSHREG D0-D1/A0-A1
 ENDM

GFXPULL MACRO		;PULL 4 MAIN GRAPHICS REGISTERS
  PULLREG D0-D1/A0-A1
 ENDM

LOADRGB MACRO		;LOAD COLORMAP
  GFXPUSH		;\1 <= *VIEWPORT
  MOVEA.L \1,A0		;\2 <= COLORMAP
  LEA \2,A1		;\3 <= COUNT
  MOVEQ #\3,D0
  GFXLIB LOADRGB4
  GFXPULL
 ENDM

SETOPEN MACRO		;SET OUTLINE PEN COLOR
 IFNC '\2',''		;\1 <= *RASTPORT
  MOVE.W \2,D0		;\2 <= [*COLOR]
 ENDC
  MOVE.L \1,A1
  MOVE.B D0,RP.OPEN(A1)
 ENDM

SETAPEN MACRO		;SET BACKGROUND DRAWING PEN FOR JAM1
  GFXPUSH		;\1 <= *RASTPORT
 IFNC '\2',''		;\2 <= [*COLOR]
  MOVE.W \2,D0
 ENDC
  GFXLIB SETAPEN,\1
  GFXPULL
 ENDM

SETBPEN MACRO		;SET BACKGROUND DRAWING PEN FOR JAM2
  GFXPUSH		;\1 <= *RASTPORT
 IFNC '\2',''		;\2 <= [*COLOR]
  MOVE.W \2,D0
 ENDC
  GFXLIB SETBPEN,\1
  GFXPULL
 ENDM

SETDRMD MACRO		;SET DRAWING MODE
  GFXPUSH		;\1 <= *RASTPORT
 IFNC '\2',''		;\2 <= [MODE]
  MOVE.W \2,D0
 ENDC
  GFXLIB SETDRMD,\1
  GFXPULL
 ENDM

FILLWIN MACRO		;FILLS A WINDOW WITH A SOLID COLOR
  ZERO D0		;\1 <= WINDOW
  MOVEA.L \1,A0		;\2 <= [COLOR REGISTER]
  MOVE.L WW.RPORT(A0),RP
 IFNC '\2',''
  MOVE.W #\2,D0
 ENDC
  SETAPEN RP
  MOVE.W WW.WIDTH(A0),D2
  SUBI.W #4,D2
  MOVE.W WW.HEIGHT(A0),D3
  SUBI.W #2,D3
  MOVE.W #2,D0
  MOVE.W #10,D1
  RECTFILL RP
 ENDM

RECTFILL MACRO		;FILLS A RECTANGLE ON A WINDOW
  PUSHREG D0-D3		;\1 <= *RASTPORT
  MOVEA.L \1,A1		;\2 <= [*X1 COORDINATE]
 IFNC '\2',''		;\3 <= [*Y1 COORDINATE]
  MOVE.W \2,D0		;\4 <= [*X2 COORDINATE]
  MOVE.W \3,D1		;\5 <= [*Y2 COORDINATE]
  MOVE.W \4,D2
  MOVE.W \5,D3
 ENDC
  EXT.L D0
  EXT.L D1
  EXT.L D2
  EXT.L D3
  GFXLIB RECTFILL
  PULLREG D0-D3
 ENDM

DRAWPOINT MACRO	;DRAW POINT ON WINDOW
  GFXPUSH		;\1 <= *RASTPORT
  GFXPOINT \2,\3	;\2 <= [*X COORDINATE]
  GFXLIB WRITEPIXEL,\1	;\3 <= [*Y COORDINATE]
  GFXPULL
 ENDM

READPOINT MACRO	;READ PIXEL ON WINDOW
  PUSHREG D1		;\1 <= *RASTPORT
  GFXPOINT \2,\3	;\2 <= [*X COORDINATE]
  GFXLIB READPIXEL \1	;\3 <= [*Y COORDINATE]
  PULLREG D1
 ENDM

DRAWLINE MACRO		;DRAW LINE ON WINDOW
  PUSHREG D0-D3		;\1 <= *RASTPORT
  MOVE.L \1,A1		;\2 <= [*X1 COORDINATE]
 IFNC '\2',''		;\3 <= [*Y1 COORDINATE]
  MOVE.W \2,D0		;\4 <= [*X2 COORDINATE]
  MOVE.W \3,D1		;\5 <= [*Y2 COORDINATE]
  MOVE.W \4,D2
  MOVE.W \5,D3
 ENDC
  BSR _DRAWLINE
  PULLREG D0-D3
 ENDM

 IFD GFX
_DRAWLINE		;DRAWLINE SUBROUTINE
  PUSHREG D0-D1		;A0 <= *RASTPORT
  PUSHREG A1		;D0 <= X1 COORDINATE
  EXT.L D0		;D1 <= Y1 COORDINATE
  EXT.L D1		;D2 <= X2 COORDINATE
  GFXLIB MOVE		;D3 <= Y2 COORDINATE
  MOVE.W D2,D0
  MOVE.W D3,D1
  EXT.L D0
  EXT.L D1
  PULLREG A1
  JUST DRAW
  PULLREG D0-D1
 RTS
 ENDC

; *** FLOATING POINT MACROS

RMATH MACRO		;REGULAR MATH
  MOVE.L _MATHBASE,A6
 ENDM

TMATH MACRO		;TRANSMATH
  MOVE.L _MATHTRANSBASE,A6
 ENDM

FLOAT MACRO		;FLOATING POINT MATH
  MOVE.W \1,D0		;\1 <= ?
  EXT.L D0		;\2 <= ?
  JUST SPFlt
  MOVE.L D0,\2
 ENDM
