diff options
Diffstat (limited to 'macros/code.asm')
-rw-r--r-- | macros/code.asm | 51 |
1 files changed, 49 insertions, 2 deletions
diff --git a/macros/code.asm b/macros/code.asm index 799c27d45..a02a33380 100644 --- a/macros/code.asm +++ b/macros/code.asm @@ -41,8 +41,8 @@ maskbits: MACRO ; example usage in rejection sampling: ; .loop ; call Random -; maskbits 30 -; cp 30 +; maskbits 26 +; cp 26 ; jr nc, .loop x = 1 rept 8 @@ -52,3 +52,50 @@ 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 |