first stab at trig

This commit is contained in:
~d6 2022-03-14 00:00:01 -04:00
parent 37de7c030a
commit 124f22e034
1 changed files with 59 additions and 0 deletions

View File

@ -144,3 +144,62 @@
@x16-div-mod ( x* y* -> x/y* x%y* )
;x16-mod-div JSR2 SWP2 JMP2r
( trigonometry )
( )
( this uses there different angle representations: )
( )
( 1. angle representation (#0080 = pi, #0100 = 2pi) )
( 2. fix16 representation (#0324 = pi, #0648 = 2pi) )
( 3. degrees (#00b4 = pi, #0168 = 2pi) )
( )
( angles are the most precise, but may require some )
( conversion. )
( calculate the sin of the given angle. )
( )
( the input should be an angle and the )
( result will be 16-bit fixed point. )
( )
( cos(x) = sin(x + pi/2) )
@cos-angle ( x* -> cos(x)* )
#0080 ADD2 ;sin-angle JMP2
( calculate the sin of the given angle. )
( )
( the input should be an angle and the )
( result will be 16-bit fixed point. )
( )
( sin table offset math: )
( 0 <= x < 64 -> table[x] )
( 64 <= x < 128 -> table[127 - x] )
( 128 <= x < 192 -> -table[x - 128] )
( 192 <= x < 256 -> -table[255 - x] )
@sin-angle ( x* -> sin(x)* )
NIP DUP #7f GTH ,&d180+ JCN
#0001 STH2
DUP #3f GTH ,&d90 ,&load JMP
&d90 #7f SWP SUB ,&load JMP
&d180+
#ffff STH2
DUP #bf GTH ,&d270 #80 SUB ,&load JMP
&d270 #ff SWP SUB ,&load JMP
&load ,sin-table ADD LDR2 STH2r MUL2 JMP2r
( sin table with 64 entries for 1/4 of a unit circle. )
( )
( there is no need for interpolation when using )
( angle values, since 256 distinct values can be )
( produced using reflection. )
( )
( these table values go from 0 until pi/2 (i.e. from )
( angles #00 until #80). )
@sin-table ( 0 - pi/2: 64 steps )
0000 0006 000d 0013 0019 001f 0026 002c
0032 0038 003e 0044 004a 0050 0056 005c
0062 0068 006d 0073 0079 007e 0084 0089
008e 0093 0098 009d 00a2 00a7 00ac 00b1
00b5 00b9 00be 00c2 00c6 00ca 00ce 00d1
00d5 00d8 00dc 00df 00e2 00e5 00e7 00ea
00ed 00ef 00f1 00f3 00f5 00f7 00f8 00fa
00fb 00fc 00fd 00fe 00ff 00ff 0100 0100