ref: 5037adc55f12805533943cc0170968c95da0b8db
dir: /macros/data.asm/
; 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 percent EQUS "* $ff / 100" ; e.g. 1 out_of 2 == 50 percent + 1 == $80 out_of EQUS "* $100 /" assert_power_of_2: MACRO assert (\1) & ((\1) - 1) == 0, "\1 must be a power of 2" ENDM ; Constant data (db, dw, dl) macros dwb: MACRO dw \1 db \2 ENDM dbw: MACRO db \1 dw \2 ENDM dbbw: MACRO db \1, \2 dw \3 ENDM dbww: MACRO db \1 dw \2, \3 ENDM dbwww: MACRO db \1 dw \2, \3, \4 ENDM dn: MACRO ; nybbles rept _NARG / 2 db ((\1) << 4) | (\2) shift 2 endr ENDM dc: MACRO ; "crumbs" rept _NARG / 4 db ((\1) << 6) | ((\2) << 4) | ((\3) << 2) | (\4) shift 4 endr ENDM dx: MACRO x = 8 * ((\1) - 1) rept \1 db ((\2) >> x) & $ff x = x - 8 endr ENDM dt: MACRO ; three-byte (big-endian) dx 3, \1 ENDM dd: MACRO ; four-byte (big-endian) dx 4, \1 ENDM bigdw: MACRO ; big-endian word dx 2, \1 ; db HIGH(\1), LOW(\1) ENDM dba: MACRO ; dbw bank, address rept _NARG dbw BANK(\1), \1 shift endr ENDM dab: MACRO ; dwb address, bank rept _NARG dwb \1, BANK(\1) shift endr ENDM dba_pic: MACRO ; dbw bank, address db BANK(\1) - PICS_FIX dw \1 ENDM bcd: MACRO rept _NARG dn ((\1) % 100) / 10, (\1) % 10 shift endr ENDM sine_table: MACRO ; \1 samples of sin(x) from x=0 to x<32768 (pi radians) x = 0 rept \1 dw (sin(x) + (sin(x) & $ff)) >> 8 ; round up x = x + DIV(32768, \1) ; a circle has 65536 "degrees" endr ENDM