diff options
author | ISSOtm <eldredhabert0@gmail.com> | 2018-05-27 11:18:14 +0200 |
---|---|---|
committer | ISSOtm <eldredhabert0@gmail.com> | 2018-05-27 11:18:14 +0200 |
commit | 6bd6e25eef4a57d1898d7aae0b3b09e6dc5f2695 (patch) | |
tree | 214d4e433770231e3067e069426beb449af74dd1 /macros/code.asm | |
parent | 83afa8a12dfe450c378ca11743a2291501ec19a8 (diff) |
Import more macros from pokecrystal
Diffstat (limited to 'macros/code.asm')
-rw-r--r-- | macros/code.asm | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/macros/code.asm b/macros/code.asm new file mode 100644 index 0000000..1fb651f --- /dev/null +++ b/macros/code.asm @@ -0,0 +1,101 @@ +; Syntactic sugar macros + +lb: MACRO ; r, hi, lo + ld \1, (((\2) & $ff) << 8) | (((\3) & $ff)) +ENDM + +ln: MACRO ; r, hi, lo + ld \1, (((\2) & $f) << 4) | (((\3) & $f)) +ENDM + +ldpixel: MACRO +if _NARG >= 5 + lb \1, \2 * 8 + \4, \3 * 8 + \5 +else + lb \1, \2 * 8, \3 * 8 +endc +ENDM + +depixel EQUS "ldpixel de," +bcpixel EQUS "ldpixel bc," + + +; Design patterns + +jumptable: MACRO + ld a, [\2] + ld e, a + ld d, 0 + ld hl, \1 + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl +ENDM + +maskbits: MACRO +; masks just enough bits to cover the argument +; e.g. "maskbits 26" becomes "and %00011111" (since 26 - 1 = %00011001) +; example usage in rejection sampling: +; .loop +; call Random +; maskbits 26 +; cp 26 +; jr nc, .loop +x = 1 +rept 8 +if x + 1 < (\1) +x = x << 1 | 1 +endc +endr + and x +ENDM + +calc_sine_wave: MACRO +; input: a = a signed 6-bit value +; output: a = d * sin(a * pi/32) + and %111111 + cp %100000 + jr nc, .negative\@ + call .apply\@ + ld a, h + ret +.negative\@ + and %011111 + call .apply\@ + ld a, h + xor $ff + inc a + ret +.apply\@ + ld e, a + ld a, d + ld d, 0 +if _NARG == 1 + ld hl, \1 +else + ld hl, .sinetable\@ +endc + add hl, de + add hl, de + ld e, [hl] + inc hl + ld d, [hl] + ld hl, 0 +.multiply\@ ; factor amplitude + srl a + jr nc, .even\@ + add hl, de +.even\@ + sla e + rl d + and a + jr nz, .multiply\@ + ret +if _NARG == 0 +.sinetable\@ + sine_table 32 +endc +ENDM |