mirror of
https://github.com/pret/pokegold.git
synced 2026-03-21 17:34:16 -05:00
147 lines
2.7 KiB
NASM
147 lines
2.7 KiB
NASM
; Value macros
|
|
|
|
; Many arbitrary percentages are simple base-10 or base-16 values:
|
|
; - 10 = 4 percent
|
|
; - 15 = 6 percent
|
|
; - $10 = 6 percent + 1 = 7 percent - 1
|
|
; - 20 = 8 percent
|
|
; - 25 = 10 percent
|
|
; - 30 = 12 percent
|
|
; - 40 = 16 percent
|
|
; - 50 = 20 percent - 1
|
|
; - 60 = 24 percent - 1
|
|
; - 70 = 28 percent - 1
|
|
; - 80 = 31 percent + 1 = 32 percent - 1
|
|
; - 85 = 33 percent + 1 = 34 percent - 1
|
|
; - 100 = 39 percent + 1 = 40 percent - 2
|
|
; - 120 = 47 percent + 1
|
|
; - 123 = 49 percent - 1
|
|
; - 160 = 63 percent
|
|
; - 180 = 71 percent - 1 = 70 percent + 2
|
|
; - 200 = 79 percent - 1
|
|
; - 230 = 90 percent + 1
|
|
DEF percent EQUS "* $ff / 100"
|
|
|
|
; e.g. 1 out_of 2 == 50 percent + 1 == $80
|
|
DEF out_of EQUS "* $100 /"
|
|
|
|
MACRO? assert_power_of_2
|
|
assert (\1) & ((\1) - 1) == 0, "\1 must be a power of 2"
|
|
ENDM
|
|
|
|
; Constant data (db, dw, dl) macros
|
|
|
|
MACRO? dwb
|
|
dw \1
|
|
db \2
|
|
ENDM
|
|
|
|
MACRO? dbw
|
|
db \1
|
|
dw \2
|
|
ENDM
|
|
|
|
MACRO? dn ; nybbles
|
|
rept? _NARG / 2
|
|
db ((\1) << 4) | (\2)
|
|
shift 2
|
|
endr
|
|
ENDM
|
|
|
|
MACRO? dc ; "crumbs"
|
|
rept? _NARG / 4
|
|
db ((\1) << 6) | ((\2) << 4) | ((\3) << 2) | (\4)
|
|
shift 4
|
|
endr
|
|
ENDM
|
|
|
|
MACRO? bigdw ; big-endian word
|
|
rept? _NARG
|
|
db HIGH(\1), LOW(\1)
|
|
shift
|
|
endr
|
|
ENDM
|
|
|
|
MACRO? bigdt ; big-endian "tribyte"
|
|
rept? _NARG
|
|
db LOW((\1) >> 16), HIGH(\1), LOW(\1)
|
|
shift
|
|
endr
|
|
ENDM
|
|
|
|
MACRO? bigdd ; big-endian "double word"
|
|
rept? _NARG
|
|
db HIGH((\1) >> 16), LOW((\1) >> 16), HIGH(\1), LOW(\1)
|
|
shift
|
|
endr
|
|
ENDM
|
|
|
|
MACRO? dba ; dbw bank, address
|
|
rept? _NARG
|
|
dbw BANK(\1), \1
|
|
shift
|
|
endr
|
|
ENDM
|
|
|
|
MACRO? dab ; dwb address, bank
|
|
rept? _NARG
|
|
dwb \1, BANK(\1)
|
|
shift
|
|
endr
|
|
ENDM
|
|
|
|
; Reverses FixPicBank in engine/gfx/load_pics.asm
|
|
;
|
|
; Takes the actual bank of the pic in the ROM and returns the "defined" bank:
|
|
; BANK("Pics 12") -> $13
|
|
; BANK("Pics 13") -> $14
|
|
; BANK("Pics 14") -> $1f
|
|
;
|
|
; Otherwise, the ROM bank will match the defined bank.
|
|
MACRO? dba_pic ; dbw bank, address
|
|
db (BANK(\1) == BANK("Pics 12")) * ($13 - BANK("Pics 12")) \
|
|
+ (BANK(\1) == BANK("Pics 13")) * ($14 - BANK("Pics 13")) \
|
|
+ (BANK(\1) == BANK("Pics 14")) * ($1f - BANK("Pics 14")) \
|
|
+ (BANK(\1))
|
|
dw \1
|
|
ENDM
|
|
|
|
MACRO? dba_pics ; front, back
|
|
if _NARG == 2
|
|
dba_pic \1 ; front
|
|
dba_pic \2 ; back
|
|
elif _NARG == 1
|
|
dba_pic \1 ; front
|
|
dbw -1, -1 ; unused
|
|
else
|
|
dbw -1, -1 ; unused
|
|
dbw -1, -1 ; unused
|
|
endc
|
|
ENDM
|
|
|
|
MACRO? dname
|
|
if _NARG == 2
|
|
def n = \2
|
|
else
|
|
def n = NAME_LENGTH - 1
|
|
endc
|
|
assert STRFIND(\1, "@") == -1, "String terminator \"@\" in name: \1"
|
|
assert CHARLEN(\1) <= n, "Name longer than {d:n} characters: \1"
|
|
db \1
|
|
ds n - CHARLEN(\1), '@'
|
|
ENDM
|
|
|
|
MACRO? bcd
|
|
rept? _NARG
|
|
dn ((\1) % 100) / 10, (\1) % 10
|
|
shift
|
|
endr
|
|
ENDM
|
|
|
|
MACRO? sine_table
|
|
; \1 samples of sin(x) from x=0 to x<0.5 turns (pi radians)
|
|
for? x, \1
|
|
dw sin(x * 0.5 / (\1))
|
|
endr
|
|
ENDM
|