summaryrefslogtreecommitdiff
path: root/macros/code.asm
diff options
context:
space:
mode:
authorISSOtm <eldredhabert0@gmail.com>2018-05-27 11:18:14 +0200
committerISSOtm <eldredhabert0@gmail.com>2018-05-27 11:18:14 +0200
commit6bd6e25eef4a57d1898d7aae0b3b09e6dc5f2695 (patch)
tree214d4e433770231e3067e069426beb449af74dd1 /macros/code.asm
parent83afa8a12dfe450c378ca11743a2291501ec19a8 (diff)
Import more macros from pokecrystal
Diffstat (limited to 'macros/code.asm')
-rw-r--r--macros/code.asm101
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