summaryrefslogtreecommitdiff
path: root/engine/sine.asm
diff options
context:
space:
mode:
Diffstat (limited to 'engine/sine.asm')
-rwxr-xr-xengine/sine.asm50
1 files changed, 50 insertions, 0 deletions
diff --git a/engine/sine.asm b/engine/sine.asm
new file mode 100755
index 000000000..b5da8059c
--- /dev/null
+++ b/engine/sine.asm
@@ -0,0 +1,50 @@
+_Sine:: ; 84d9
+; A simple sine function.
+; Return d * sin(e) in hl.
+
+; e is a signed 6-bit value.
+ ld a, e
+ and %111111
+ cp %100000
+ jr nc, .negative
+
+ call .ApplySineWave
+ ld a, h
+ ret
+
+.negative
+ and %011111
+ call .ApplySineWave
+ ld a, h
+ xor -1
+ inc a
+ ret
+
+.ApplySineWave: ; 84ef
+ ld e, a
+ ld a, d
+ ld d, 0
+ ld hl, .sinewave
+ add hl, de
+ add hl, de
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld hl, 0
+
+; Factor amplitude
+.multiply
+ srl a
+ jr nc, .even
+ add hl, de
+.even
+ sla e
+ rl d
+ and a
+ jr nz, .multiply
+ ret
+
+.sinewave: ; 850b
+; A $20-word table representing a sine wave.
+; 90 degrees is index $10 at a base amplitude of $100.
+ sine_wave $100