The sine table resides in locations $E000 - $F001 in Main Memory. It can be used for calculations related to angular phenomena. There is also a Log Table and an Anti-log Table.
The sine table provides 2,049 unsigned 16-bit sine samples spanning from 0° to 90°, inclusively (0.0439° resolution). Sine values for all other quadrants covering > 90° to < 360° can be calculated from simple transformations on this single-quadrant sine table.
A small amount of assembly code can mirror and flip the sine table samples to create a full-cycle sine/cosine lookup routing which has a 13-bit angle resolution and a 17-bit sample resolution. As with the log and anti-log tables, linear interpolation could be applied to the sine table to achieve higher resolution.
DAT
' Get sine/cosine
'
' quadrant: 1 2 3 4
' angle: $0000..$07FF $0800..$0FFF $1000..$17FF $1800..$1FFF
' table index: $0000..$07FF $0800..$0001 $0000..$07FF $0800..$0001
' mirror: +offset -offset +offset -offset
' flip: +sample +sample -sample -sample
'
' on entry: sin[12..0] holds angle (0° to just under 360°)
' on exit: sin holds signed value ranging from $0000FFFF ('1') to
' $FFFF0001 ('-1')
'
getcos add sin,sin_90 'for cosine, add 90°
getsin test sin,sin_90 wc 'get quadrant 2|4 into c
test sin_sin_180 wz 'get quadrant 3|4 into nz
negc sin,sin 'if quadrant 2|4, negate offset
or sin,sin_table 'or in sin table address >> 1
shl sin,#1 'shift left to get final word address
rdword sin,sin 'read word sample from $E000 to $F000
negnz sin,sin 'if quadrant 3|4, negate sample
getsin_ret
getcos_ret ret '39..54 clocks
'(variance due to HUB sync on RDWORD)
sin_90 long $0800
sin_180 long $1000
sin_table long $E000 >> 1 'sine table base shifted right
sin long 0
Propeller Help Version 1.1
Copyright © Parallax Inc.
5/13/2009