cruisin-usa/MACS.EQU

677 lines
8.8 KiB
Plaintext
Executable File

*MACS.EQU
*
*COPYRIGHT (C) 1994 BY TV GAMES, INC.
*ALL RIGHTS RESERVED
*
LDLH .MACRO LONG_VALUE,REG
.DATA
VALUEI? .WORD :LONG_VALUE:
.sect "THECODE"
LDI @VALUEI?,:REG:
.ENDM
LDLFH .MACRO LONG_VALUE,REG
.DATA
VALUEI? .FLOAT :LONG_VALUE:
.sect "THECODE"
LDF @VALUEI?,:REG:
.ENDM
LONGROUT .MACRO
BR jago?
.sect "THECODE"
jago?
.ENDM
END_LONGROUT .MACRO
.text
.ENDM
COLORM .MACRO FLAG,X1,Y1,X2,Y2,PAL
LDI :FLAG:,R0
STI R0,@_ACNTL
LDI :X1:,AR2
LDI :Y1:,R2
LDI :X2:,R3
LDI :Y2:,RC
LDI :PAL:,RS
LDI 0,RE
CALL _rdma
.ENDM
DP_MACROS .set 0 ;1 = ACTIVATE
PTR .MACRO VARIABLE
.const
.globl :VARIABLE:I
:VARIABLE:I .word VARIABLE
.text
.ENDM
ADDAUD .MACRO NUMBER
LDI :NUMBER:,AR2
CALL AUDIT_ADD
.ENDM
ADDFL .MACRO CONSTANT,REG
.data ;sect "THEDATA"
LL? .float :CONSTANT:
.text
ADDF @LL?,:REG:
.ENDM
BCLR .MACRO BIT,REG
LDI 1,R0
LSH :BIT:,R0
ANDN R0,:REG:
.ENDM
BSET .MACRO BIT,REG
LDI 1,R0
LSH :BIT:,R0
OR R0,:REG:
.ENDM
LCALL .MACRO LABEL
PUSH R0
CALL JIJO?
POP R0
BU ENDIT?
l14? .word :LABEL:
JIJO?
PUSH DP
LDP @l14?
LDI @l14?,R0
POP DP
BU R0
ENDIT?
.ENDM
CEILI .MACRO VALUE,REG
CMPI :VALUE:,:REG:
LDIGT :VALUE:,:REG:
.ENDM
CLRC .MACRO
ANDN 1,ST
.ENDM
CLRF .MACRO REG
LDF 0.0,:REG:
.ENDM
CLRI .MACRO REG
SUBI :REG:,:REG:
.ENDM
CLRIM .MACRO MEM
SUBI R0,R0
STI R0,:MEM:
.ENDM
DEC .MACRO REG
SUBI 1,:REG:
.ENDM
DECF .MACRO REG
SUBF 1.0,:REG:
.ENDM
DECM .MACRO MEM
LDI :MEM:,R0
SUBI 1,R0
STI R0,:MEM:
.ENDM
DINT .MACRO
PUSH IE ;disable interrupts
LDI 0,IE ;watch for pipeline conflicts
NOP ;2 NOPS can be replaced with
NOP ;useful instructions
AND 0DFFFh,ST ;turn off GIE.
POP IE
.ENDM
DMA_WT .MACRO REG
LDP @FIFO_STATUS
WTLP? LDI @FIFO_STATUS,:REG:
AND FIFO_STATUS_DMA_ACTIVE,:REG:
BNZ WTLP?
CLRI DP
.ENDM
EINT .MACRO
CALL ENABLEGIE
.ENDM
FIFO_CLRP .MACRO REG
LDP @FIFO_STATUS
wt2? LDI @FIFO_STATUS,:REG:
AND FIFO_STATUS_FIFO_NEMPTY,:REG:
BNZ wt2?
CLRI DP
.ENDM
FIFO_INC .MACRO
LDP @FIFO_INC
LDI @FIFO_INC,R0
CLRI DP
.ENDM
FIFO_WT .MACRO REG
LDP @FIFO_STATUS
wt2? LDI @FIFO_STATUS,:REG:
AND FIFO_STATUS_MAX_FLAG,:REG:
BNZ wt2?
CLRI DP
.ENDM
FLOATP .MACRO MEM,REG
.if DP_MACROS
PUSH R0
LDI DP,R0
LDP :MEM:
CMPI R0,DP
BNE $
POP R0
LDP :MEM:
.endif
FLOAT :MEM:,:REG:
.ENDM
FLOORF .MACRO VALUE,REG
CMPF :VALUE:,:REG:
LDFLT :VALUE:,:REG:
.ENDM
FLOORI .MACRO VALUE,REG
CMPI :VALUE:,:REG:
LDILT :VALUE:,:REG:
.ENDM
FPGA_WT .MACRO REG
LDP @FSTAT
WT1? LDI @FSTAT,:REG:
BN WT1?
CLRI DP
.ENDM
HARDWTM .MACRO REG
LDP @CPU_WS
LDI HARD_WS,:REG:
STI :REG:,@CPU_WS
CLRI DP
.ENDM
HIGHBITS .MACRO BITS,REG
LSH -(32-:BITS:),:REG:
LSH 32-:BITS:,:REG:
.ENDM
INC .MACRO REG
ADDI 1,:REG:
.ENDM
INCM .MACRO MEM
LDI :MEM:,R0
ADDI 1,R0
STI R0,:MEM:
.ENDM
INCMF .MACRO MEM
LDF :MEM:,R0
ADDF 1.0,R0
STF R0,:MEM:
.ENDM
INCAUD .MACRO NUMBER
LDI :NUMBER:,AR2
CALL AUDIT_INC
.ENDM
INCF .MACRO REG
ADDF 1.0,:REG:
.ENDM
LDIL .MACRO LWORD,REG
LDI :LWORD:>>16,REG
LSH 16,REG
OR :LWORD:&0FFFFH,REG
.ENDM
LDL .MACRO LONG_VALUE,REG
.DATA
VALUEI? .WORD :LONG_VALUE:
.TEXT
LDI @VALUEI?,:REG:
.ENDM
LDLF .MACRO LONG_VALUE,REG
.DATA
VALUEI? .FLOAT :LONG_VALUE:
.TEXT
LDF @VALUEI?,:REG:
.ENDM
LDPI .MACRO MEM,REG
.if DP_MACROS
PUSH R0
LDI DP,R0
LDP :MEM:
CMPI R0,DP
BNE $
POP R0
LDP :MEM:
.endif
LDI :MEM:,:REG:
.ENDM
LDSP .MACRO STRING,REG
.data
l1? .word l4?
l4? .string ":STRING:",0
.text
LDI @l1?,:REG:
.ENDM
LOCKUP .MACRO
OR 0,ST ;MASK INTERRUPTS
B $
.ENDM
LOWBITS .MACRO BITS,REG
LSH 32-:BITS:,:REG:
LSH -(32-:BITS:),:REG:
.ENDM
LS .MACRO CNT,REG ;SHIFT (LOGICAL)
LSH :CNT:,:REG:
.ENDM
LSA .MACRO CNT,REG ;SHIFT (ARITHMETIC)
ASH :CNT:,:REG:
.ENDM
MPYFL .MACRO VAL,REG
.data
i? .float :VAL:
.text
MPYF @i?,:REG:
.ENDM
ORM .MACRO VAL,MEM
LDI :MEM:,R0
OR :VAL:,R0
STI R0,:MEM:
.ENDM
POPFL .MACRO REG
POPF :REG:
POP :REG:
.ENDM
POPFM .MACRO LIST ;POP FLOATING POINT MULTIPLE
.VAR ITEM
.LOOP
.BREAK ($ISMEMBER(ITEM, LIST) == 0)
POPF ITEM
.ENDLOOP
.ENDM
POPM .MACRO LIST ;POP MULTIPLE
.VAR ITEM
.LOOP
.BREAK ($ISMEMBER(ITEM, LIST) == 0)
POP ITEM
.ENDLOOP
.ENDM
PUSHFL .MACRO REG
PUSH :REG:
PUSHF :REG:
.ENDM
PUSHFM .MACRO LIST ;PUSH FLOATING POINT MULTIPLE
.VAR ITEM
.LOOP
.BREAK ($ISMEMBER(ITEM, LIST) == 0)
PUSHF ITEM
.ENDLOOP
.ENDM
PUSHM .MACRO LIST
.VAR ITEM
.LOOP
.BREAK ($ISMEMBER(ITEM, LIST) == 0)
PUSH ITEM
.ENDLOOP
.ENDM
RANDN .MACRO NUMBER
LDI :NUMBER:,AR2
CALL RANDU0
.ENDM
READADJ .MACRO NUMBER
LDI :NUMBER:,AR2
CALL ADJUSTMENT_READ
.ENDM
READAUD .MACRO NUMBER
LDI :NUMBER:,AR2
CALL AUDIT_READ
.ENDM
RGB .MACRO R,G,B
.word (((:R:>>3)&01Fh)<<10)|(((:G:>>3)&01Fh)<<5)|(((:B:>>3)&01Fh))
.ENDM
RS .MACRO CNT,REG
LSH -:CNT:,:REG:
.ENDM
RSA .MACRO CNT,REG
ASH -:CNT:,:REG:
.ENDM
SETADJ .MACRO NUMBER
LDI :NUMBER:,AR2
CALL ADJUSTMENT_WRITE
.ENDM
SETAUD .MACRO NUMBER
LDI :NUMBER:,AR2
CALL AUDIT_WRITE
.ENDM
SETC .MACRO
OR 1,ST
.ENDM
SOFTWTM .MACRO REG
LDP @CPU_WS
LDI SOFT_WS,:REG:
STI :REG:,@CPU_WS
CLRI DP
.ENDM
SOND1 .MACRO SOND
LDI :SOND:,AR2
CALL ONESND
.ENDM
SONDFX .MACRO SOND
LDI :SOND:,AR2
CALL ONESNDFX
.ENDM
SPTR .MACRO STRING
.sect "THEDATA"
l? .string ":STRING:",0
.text
.word l?
.ENDM
STIM .MACRO VALUE,MEM
LDI :VALUE:,R0
STI R0,:MEM:
.ENDM
STPF .MACRO REG,MEM
.if DP_MACROS
PUSH R0
LDI DP,R0
LDP :MEM:
CMPI R0,DP
BNE $
POP R0
.endif
STF :REG:,:MEM:
.ENDM
STPI .MACRO REG,MEM
.if DP_MACROS
PUSH R0
LDI DP,R0
LDP :MEM:
CMPI R0,DP
BNE $
POP R0
.endif
STI :REG:,:MEM:
.ENDM
STPIM .MACRO VALUE,MEM
.if DP_MACROS
PUSH R0
LDI DP,R0
LDP :MEM:
CMPI R0,DP
BNE $
POP R0
.endif
LDI :VALUE:,R0
STI R0,:MEM:
.ENDM
SUBPI .MACRO MEM,REG
.if DP_MACROS
PUSH R0
LDI DP,R0
LDP :MEM:
CMPI R0,DP
BNE $
POP R0
.endif
SUBI :MEM:,:REG:
.ENDM
SUBPF .MACRO MEM,REG
.if DP_MACROS
PUSH R0
LDI DP,R0
LDP :MEM:
CMPI R0,DP
BNE $
POP R0
.endif
SUBF :MEM:,:REG:
.ENDM
TEXTIT .MACRO LABEL,X,Y
.DATA
IT? .WORD :LABEL:
.TEXT
LDI :X:,R2
LDI :Y:,R3
LDI @IT?,AR2
CALL _outtextxyc
.ENDM
TEXTITT .MACRO THETEXT,X,Y
.sect "THEDATA"
ITT? .string ":THETEXT:",0
.data
IT? .word ITT?
.TEXT
LDI :X:,R2
LDI :Y:,R3
LDI @IT?,AR2
CALL _outtextxyc
.ENDM
*
*HIGH LEVEL MACROS
*
*IFI IF integer
*IFF IF float
*
*IFRI IF registers integer
*IFRF IF registers float
*
LT EQU 'LT'
GT EQU 'GT'
LE EQU 'LE'
GE EQU 'GE'
EQ EQU 'EQ'
NE EQU 'NE'
IFI .MACRO REG,OP,VALUE,LABEL
CMPI :VALUE:,:REG:
B:OP: :LABEL:
.ENDM
IFF .MACRO REG,OP,VALUE,LABEL
CMPF :VALUE:,:REG:
B:OP: :LABEL:
.ENDM
IFFL .MACRO REG,OP,LONG,LABEL
.data
iffl? .float :LONG:
.text
CMPF @iffl?,:REG:
B:OP: :LABEL:
.ENDM
IFIL .MACRO REG,OP,LONG,LABEL
.data
iffl? .word :LONG:
.text
CMPI @iffl?,:REG:
B:OP: :LABEL:
.ENDM
IFMF .MACRO REG,OP,MEM,LABEL
CMPF :MEM:,:REG:
B:OP: :LABEL:
.ENDM
IFMI .MACRO REG,OP,MEM,LABEL
CMPI :MEM:,:REG:
B:OP: :LABEL:
.ENDM
*----------------------------------------------------------------------------
FBSS .MACRO LABEL,SIZEOF
:LABEL: .usect oncram,:SIZEOF:
.ENDM
fbss .MACRO LABEL,SIZEOF
:LABEL: .usect oncram,:SIZEOF:
.ENDM
pbss .MACRO LABEL,SIZEOF
:LABEL: .usect pbss,:SIZEOF:
.ENDM
lobss .MACRO LABEL,SIZEOF
:LABEL: .usect lobss,:SIZEOF:
.ENDM
hibss .MACRO LABEL,SIZEOF
:LABEL: .usect hibss,:SIZEOF:
.ENDM
phibss .MACRO LABEL,SIZEOF
:LABEL: .usect phibss,:SIZEOF:
.ENDM
romdata .MACRO
.sect "THEDATA"
.ENDM
diagtext .MACRO
.sect "DIAGTXT"
.ENDM
SLT EQU 'LT'
SGT EQU 'GT'
SLE EQU 'LE'
SGE EQU 'GE'
SEQ EQU 'EQ'
SNE EQU 'NE'
SC EQU 'C'
SNC EQU 'NC'
SZ EQU 'Z'
SNZ EQU 'NZ'
SU EQU 'U'
LOCKON .MACRO UCASE
.if PRINTER
CALL:UCASE: PRINTER_LOG
.endif
.if DEBUG
B:UCASE: $
.endif
.ENDM
SETDP .MACRO
SUBI DP,DP
.ENDM
*
*SYMBOLIC LOCKON
*
SLOCKON .MACRO UCASE,UTEXT
.if PRINTER
.data
ii? .word i?
i? .string ":UTEXT:",13,0
.text
B:UCASE: DOIT?
BU DONTDO?
DOIT? PUSH ST
ADDI 1,SP ;need this for later...
PUSH R0
PUSH DP
LDP @ii?
LDI @ii?,R0
CALL PRINTER_LOG_SYMBOLIC
DONTDO?
.endif
.if DEBUG
B:UCASE: $
.endif
.ENDM
*
*
ERRON .MACRO UCASE,EID
.if DEBUG
B:UCASE: $
.endif
B:UCASE: DOIT?
BU DONTDO?
DOIT?
PUSH ST
PUSH R0
LDI :EID:,R0
CALL ERROR_LOG
POP R0
POP ST
DONTDO?
.ENDM