# SIN and COS calculator

SIN and COS Calculator

These routines calculate the signed 16-bit sine and cosine of an 8-bit angle. The returned value is a fixed point value with the point effectively being after the sign bit.
The code

```;----------------------------------------------------------------
;
; SIN(A) COS(A) routines. A full circle is represented by \$00 to
; \$00 in 256 1.40625 degree steps. returned value is signed 16
; bit with X being the high byte and ranges over +/-0.99997

; The routine never returns +1.0 as it is out of the range of the
; returned value. The routine also never returns -1.0 as, although
; it is in range, the calculation is symetrical for both positive
; and negative results.

;----------------------------------------------------------------
;
; get COS(A) in AX

cos_A
CLC                     ; clear carry for add

;----------------------------------------------------------------
;
; get SIN(A) in AX. enter with the Z flag reflecting the contents
; of A

sin_A
BPL   sin_cos           ; just get SIN/COS and return if +ve

AND   #\$7F              ; else make +ve
JSR   sin_cos           ; get SIN/COS
; now do twos complement
EOR   #\$FF              ; toggle the low byte
CLC                     ; clear carry for add
PHA                     ; save the low byte
TXA                     ; copy the high byte
EOR   #\$FF              ; toggle the high byte
TAX                     ; copy back to X
PLA                     ; restore the low byte
RTS

;----------------------------------------------------------------
;
; get AX from SIN/COS table

sin_cos
CMP   #\$41              ; compare with max+1
BCC   quadrant          ; branch if less

EOR   #\$7F              ; wrap \$41 to \$7F ..
ADC   #\$00              ; .. to \$3F to \$00
ASL                     ; * 2 bytes per value
TAX                     ; copy to index
LDA   sintab,X          ; get SIN/COS table value low byte
PHA                     ; save it
LDA   sintab+1,X        ; get SIN/COS table value high byte
TAX                     ; copy to X
PLA                     ; restore the low byte
RTS

;----------------------------------------------------------------
;
; SIN/COS table. returns values between \$0000 and \$7FFF

sintab
.word \$0000,\$0324,\$0647,\$096A,\$0C8B,\$0FAB,\$12C8,\$15E2
.word \$18F8,\$1C0B,\$1F19,\$2223,\$2528,\$2826,\$2B1F,\$2E11
.word \$30FB,\$33DE,\$36BE,\$398C,\$3C56,\$3F17,\$41CE,\$447A
.word \$471C,\$49B4,\$4C3F,\$4EBF,\$5133,\$539B,\$55F5,\$5842
.word \$5A82,\$5CB4,\$5ED7,\$60EC,\$62F2,\$64EB,\$66CF,\$68A6
.word \$6A6D,\$6C24,\$6DC4,\$6F5F,\$70E2,\$7255,\$73B5,\$7504
.word \$7641,\$776C,\$7884,\$798A,\$7A7D,\$7B5D,\$7C2A,\$7CE3
.word \$7D8A,\$7E1D,\$7E9D,\$7F09,\$7F62,\$7FA7,\$7FD8,\$7FF6
.word \$7FFF

;----------------------------------------------------------------
```