diff options
Diffstat (limited to 'macros/code.asm')
-rw-r--r-- | macros/code.asm | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/macros/code.asm b/macros/code.asm index 0b36f6c11..a02a33380 100644 --- a/macros/code.asm +++ b/macros/code.asm @@ -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 |