pokecrystal/macros.asm

177 lines
1.8 KiB
NASM

; rgbds macros
; macros require rst vectors to be defined
FarCall EQU $08
Bankswitch EQU $10
JumpTable EQU $28
NONE EQU 0
dwb: MACRO
dw \1
db \2
ENDM
dbw: MACRO
db \1
dw \2
ENDM
dn: MACRO
db \1 << 4 + \2
ENDM
dt: MACRO ; three-byte (big-endian)
db (\1 >> 16) & $ff
db (\1 >> 8) & $ff
db \1 & $ff
ENDM
bigdw: MACRO ; big-endian word
dw ((\1)/$100) + (((\1)&$ff)*$100)
ENDM
callab: MACRO ; address, bank
ld hl, \1
ld a, BANK(\1)
rst FarCall
ENDM
callba: MACRO ; bank, address
ld a, BANK(\1)
ld hl, \1
rst FarCall
ENDM
lb: MACRO ; r, hi, lo
ld \1, \2 << 8 + \3
ENDM
; Constant enumeration
const_def: MACRO
const_value SET 0
ENDM
const: MACRO
\1 EQU const_value
const_value SET const_value + 1
ENDM
TX_RAM: MACRO
db 1
dw \1
ENDM
TX_FAR: MACRO
db $16
dw \1
db BANK(\1)
ENDM
RGB: MACRO
dw ((\3 << 10) | (\2 << 5) | (\1))
ENDM
note: MACRO
db \1 << 4 + (\2 - 1)
ENDM
; pitch
__ EQU 0
C_ EQU 1
C# EQU 2
D_ EQU 3
D# EQU 4
E_ EQU 5
F_ EQU 6
F# EQU 7
G_ EQU 8
G# EQU 9
A_ EQU 10
A# EQU 11
B_ EQU 12
; It's better to use *coord than FuncCoord.
FuncCoord: MACRO
Coord = $c4a0 + 20 * \2 + \1
ENDM
bccoord: MACRO
FuncCoord \1, \2
ld bc, Coord
ENDM
decoord: MACRO
FuncCoord \1, \2
ld de, Coord
ENDM
hlcoord: MACRO
FuncCoord \1, \2
ld hl, Coord
ENDM
; pic animations
frame: MACRO
db \1
db \2
ENDM
setrepeat: MACRO
db $fe
db \1
ENDM
dorepeat: MACRO
db $fd
db \1
ENDM
endanim: MACRO
db $ff
ENDM
; maps
map: MACRO
; This is a really silly hack to get around an rgbds bug.
; Ideally:
; db GROUP_\1, MAP_\1
\1\@ EQUS "GROUP_\1"
\1\@2 EQUS "MAP_\1"
db \1\@, \1\@2
ENDM
roam_map: MACRO
; A map and an arbitrary number of some more maps.
map \1
db \2
IF \2 > 0
map \3
ENDC
IF \2 > 1
map \4
ENDC
IF \2 > 2
map \5
ENDC
IF \2 > 3
map \6
ENDC
db 0
ENDM