Aqui dejo un programa basado en el metodo CORDIC escrito en ensamblador que calcula senos y cosenos en 160 intrucciones a partir de una tabla de 16 arco tangentes.
;************SIN_FRAC
w0 equ in
w1 equ out_cos
w2 equ out_sin
w3 equ Temp1
w4 equ Temp2
w5 equ i
w6 equ &arctan_Tbl ; Apunta a la direccion base de la tabla
;**************
Tabla de constantes en ROM
arctan_Tbl[16]
[00] 0x4DB9
[01] 0x1DAC
[02] 0x0FAD
[03] 0x07F5
[04] 0x03FE
[05] 0x01FF
[06] 0x00FF
[07] 0x007F
[08] 0x003F
[09] 0x001F
[10] 0x000F
[11] 0x0007
[12] 0x0004
[13] 0x0002
[14] 0x0001
[15] 0x0000
;***************
mov #0x3243, in ; in = 0x4000 * pi / 6
mov #0x4DB9, out_cos ; out_cos = 1 * valor de ajuste (0.6072)
mov #0x0000, out_sin ; out_sin = 0
mov #0x0000, i ; i = 0
mov #0x0AB6, &arctan_Tbl ; &arctan_TBL[0]
bclr SR, #3 ; forzar >= 0
do #15, SIN16_2 ; Loop 16
bra N, SIN16_1
; if ( in >= 0 )
asr out_sin, i, Temp1 ; Temp1 = out_sin >> i
sub out_cos, Temp1, Temp2 ; Temp2 = out_cos - Temp1
asr out_cos, i, Temp1 ; Temp1 = out_cos >> i
add out_sin, Temp1, out_sin ; out_sin += Temp1
inc i, i ; i++
sub in, [&arctan_Tbl++], in ; in -= arctan_TBL[ i ]
bra SIN16_2
SIN16_1: ; else if ( in < 0 )
asr out_sin, i, Temp1 ; Temp1 = out_sin >> i
add out_cos, Temp1, Temp2 ; Temp2 = out_cos + Temp1
asr out_cos, i, Temp1 ; Temp1 = out_cos >> i
sub out_sin, Temp1, out_sin ; out_sin -= Temp1
inc i, i ; i++
add in, [&arctan_Tbl++], in ; in += arctan_TBL[ i ]
SIN16_2:
mov Temp2, w1 ; out_cos = Temp2
;FIN sin( in ) = out_sin, cos( in ) = out_cos