diff options
Diffstat (limited to 'macros')
-rw-r--r-- | macros/code.asm | 47 | ||||
-rw-r--r-- | macros/data.asm | 18 |
2 files changed, 56 insertions, 9 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 diff --git a/macros/data.asm b/macros/data.asm index 8adb33005..ad2d9b8ef 100644 --- a/macros/data.asm +++ b/macros/data.asm @@ -111,7 +111,15 @@ menu_coords: MACRO ENDM -sine_wave: MACRO +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 @@ -119,11 +127,3 @@ rept \1 x = x + DIV(32768, \1) ; a circle has 65536 "degrees" endr ENDM - - -bcd: MACRO -rept _NARG - dn ((\1) % 100) / 10, (\1) % 10 - shift -endr -ENDM |