	.TITLE	.SIN
/
/ INTERNAL GLOBALS
	.GLOBL	SIN,COS,.SIN,.COS
/
/
/ EXTERNAL GLOBALS
	.GLOBL	.GRAB,.ERROR,.SNGL
	.GLOBL	.SPADD,.SPRLD,.SPRDV,.SPRML,.SPSER
	.GLOBL	.FIX,.FLOTB,.CMPLB,.CMPLA,.LDPT5
	.GLOBL	.SIGNA,.EXPA,.MOSTA,.LESTA,.EXPB
	.GLOBL	.CS1,.CS13
/
/ SINGLE PRECISION SINE AND COSINE ROUTINES
/ EXIT WITH SIN X OR COS X IN ACC A
/
COS     XX              /COSINE ROUTINE
        JMS*     .GRAB   / GET ARGUMENT
        JMS     .COS
        JMP*    COS
/
.COS    XX
        JMS*     .SNGL   /CHECK MODE
        LAC     .CS1    /LOAD 2*PI
        JMS*     .SPRLD
        LAC     (1
        DAC*    .EXPB    /DIVIDE BY 4
        JMS*    .SPADD   /X=X+PI/2
        JMS     .SIN    /COS X=SIN (X+PI/2)
        JMP*    .COS
/
SIN     XX              /SINE ROUTINE
        JMS*     .GRAB
        JMS     .SIN
        JMP*    SIN
/
.SIN    XX
        JMS*    .SNGL   /CHECK MODE
        LAC     .CS1
        JMS*    .SPRLD
        JMS*    .SPRDV  /DIVIDE X BY 2*PI
        JMS*    .FIX     /FIX IT
        JMS*    .FLOTB  /FLOAT IT INTO ACC B
        JMS*    .CMPLB
        JMS*    .SPADD   /GET FRACTION
        LAC*    .SIGNA
        JMS*    .LDPT5
CHECK   LAC     (2
        TAD*    .EXPA
        SPA             /FRACTION NOT YET SET
        JMP     SET
        SZA             /CHECK IF FRACTION IS EXACTLY 1/4
        JMP     NOSET
        LAC*    .MOSTA
        XOR     (400000
        SZA
        JMP     NOSET
        SAD*    .LESTA
        JMP     SET     /FRACTION IS 1/4
NOSET   JMS*    .CMPLA
        JMS*    .SPADD   /REDEFINE FRACTION
        LAC*    .SIGNA
        JMS*    .LDPT5
        JMP     CHECK   /AND CHECK AGAIN
SET     LAC*    .EXPA    /FRACTION PROPERLY DEFINED
        TAD     (21     /CHECK FOR SMALL FRACTION
        SPA             /NOT SMALL ENOUGH
        JMP     SINOFF  /SMALL ENOUGH:SIN X=X
        LAC     .CS13
        JMS*    .SPSER   /CALCULATE SERIES
        JMP*    .SIN    /EXIT
/
SINOFF  LAC     .CS1    /MULTIPLY BY 2*PI
        JMS*    .SPRLD
        JMS*    .SPRML
        JMP*    .SIN
/
	.END
