; Value macros12DEF percent EQUS "* $ff / 100"34MACRO bcd25dn ((\1) / 1000) % 10, ((\1) / 100) % 106dn ((\1) / 10) % 10, (\1) % 107ENDM89MACRO bcd310dn ((\1) / 100000) % 10, ((\1) / 10000) % 1011dn ((\1) / 1000) % 10, ((\1) / 100) % 1012dn ((\1) / 10) % 10, (\1) % 1013ENDM1415; used in data/pokemon/base_stats/*.asm16MACRO tmhm17; initialize bytes to 018FOR n, (NUM_TM_HM + 7) / 819DEF _tm{d:n} = 020ENDR21; set bits of bytes22REPT _NARG23ASSERT FATAL, STRFIND("\1", " ") == -1, "Invalid move: \1"24IF DEF(\1_TMNUM)25DEF n = (\1_TMNUM - 1) / 826DEF i = (\1_TMNUM - 1) % 827DEF _tm{d:n} |= 1 << i28ELSE29FAIL "\1 is not a TM or HM move"30ENDC31SHIFT32ENDR33; output bytes34FOR n, (NUM_TM_HM + 7) / 835db _tm{d:n}36ENDR37ENDM383940; Constant data (db, dw, dl) macros4142MACRO dbw43db \144dw \245ENDM4647MACRO dwb48dw \149db \250ENDM5152MACRO dn ; nybbles53REPT _NARG / 254db ((\1) << 4) | (\2)55SHIFT 256ENDR57ENDM5859MACRO dc ; "crumbs"60REPT _NARG / 461db ((\1) << 6) | ((\2) << 4) | ((\3) << 2) | (\4)62SHIFT 463ENDR64ENDM6566MACRO bigdw ; big-endian word67db HIGH(\1), LOW(\1)68ENDM6970MACRO dba ; dbw bank, address71REPT _NARG72dbw BANK(\1), \173SHIFT74ENDR75ENDM7677MACRO dab ; dwb address, bank78REPT _NARG79dwb \1, BANK(\1)80SHIFT81ENDR82ENDM8384MACRO dname85IF _NARG == 286DEF n = \287ELSE88DEF n = NAME_LENGTH - 189ENDC90ASSERT STRFIND(\1, "@") == -1, "String terminator \"@\" in name: \1"91ASSERT CHARLEN(\1) <= n, "Name longer than {d:n} characters: \1"92db \193ds n - CHARLEN(\1), "@"94ENDM959697