.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