Skip to content

Instantly share code, notes, and snippets.

@lhz
Created May 17, 2019 14:41
Show Gist options
  • Save lhz/9d6e01536a7a281fb58de2d9add6b827 to your computer and use it in GitHub Desktop.
Save lhz/9d6e01536a7a281fb58de2d9add6b827 to your computer and use it in GitHub Desktop.
SINE_GEN_LENGTH = 256
SineGenerate:
lea SineGenTable + 8, a0
move.l #$7FFF6216, d6 ; 2*cos(π/512) >> 2
move.l #SINE_GEN_LENGTH - 3, d7
.Loop: move.l -4(a0), d0 ; A = sin(i)
move.l d6, d1 ; B = 2*cos(π/512) >> 2
move.l d0, d2
move.l d1, d3
swap d2 ; d2.w = Ah
swap d3 ; d3.w = Bh
mulu.w d2, d1
lsr.l #7, d1
lsr.l #7, d1 ; d1.l = Ah*Bl >> 14
mulu.w d3, d0
lsr.l #7, d0
lsr.l #7, d0 ; d0.l = Al*Bh >> 14
mulu.w d2, d3
lsl.l #2, d3 ; d3.l = Ah*Bh << 2
add.l d0, d1
add.l d3, d1
sub.l -8(a0), d1 ; sin(i)*2*cos(π/512) - sin(i-1)
tst.l (a0)+ ; Skip precalculated value
bne.s .Skip
move.l d1, -4(a0)
.Skip: dbf d7, .Loop
rts
SineScale:
lea SineGenTable(PC), a0
lea Sine(PC), a1
lea Sine + 1024(PC), a2
lea Sine + 1024(PC), a3
lea Sine + 2048(PC), a4
lea Sine + 2048(PC), a5
moveq #0, d0
move.l #SINE_GEN_LENGTH - 1, d7
.Mirr: move.l (a0)+, d1
lsr.l #1, d1 ; Scale to signed word
move.l d1, d2
neg.l d2
subq.l #1, d2
swap d1
swap d2
move.w d1, (a1)+
move.w d1, -(a2)
move.w d2, (a3)+
move.w d2, -(a4)
move.w d1, (a5)+
dbf d7, .Mirr
rts
SineGenTable:
dc.l $00C90FC5, $025B2D61 ; sin(0.5*t), sin(1.5*t) [t = π/512]
dcb.l SINE_GEN_LENGTH / 2 - 2, 0
dc.l $B592E769, $B6AD7F7A ; sin(0.5*t + π/4), sin(1.5*t + π/4)
dcb.l SINE_GEN_LENGTH / 2 - 2, 0
Sine:
dcb.w SINE_GEN_LENGTH * 5, 0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment