.TITLE .ATAN2 / / INTERNAL GLOBALS .GLOBL ATAN2 / / EXTERNAL GLOBALS .GLOBL .MODEA,.SIGNA,.EXPA,.MOSTA,.SIGNB,.EXPB,.MOSTB .GLOBL .SPRLD,.SPADD,.SPRDV,.LDREL,.PICK1,.PICK2,.ATAN .GLOBL .FETCH,.PSHBA,.SNGL,.ERROR,.FLOTB .GLOBL .CS1,.ILMDE / DOUBLE ARGUMENT ARCTAN / ATAN2 XX JMS* .FETCH JMS* .PSHBA /FIRST ARGUMENT TO ACC A LAC* .MODEA JMS* .SNGL /CHECK MODE OF FIRST ARGUMENT JMS* .FETCH /SECOND ARGUMENT TO ACC B TAD (-1 SPA!SNA JMP BINT /SECOND ARGUMENT IS INTEGER TAD (-3 SMA JMP* .ILMDE /SECOND ARGUMENT COMPLEX,LOGICAL, OR CHARACTER BSP LAC* .SIGNA DAC SIGNIA LAC* .SIGNB DAC SIGNIB /SAVE USEFUL SIGNS IN SIGNIA AND SIGNIB LAC* .MOSTB SZA JMP BNOTZ SAD* .MOSTA JMP ATANER /ERROR, BOTH ARGUMENTS 0 LAC .CS1 /ANSWER EITHER + OR - PI/2 JMS* .SPRLD /LOAD 2*PI LAC (1 DAC* .EXPB /ACC B=PI/2 JMS* .LDREL LAC SIGNIA DAC* .SIGNA /SET SIGN JMP* ATAN2 BNOTZ JMS* .SPRDV LAC* .MODEA JMS* .ATAN /CALCULATE ARCTAN LAC SIGNIB SNA JMP* ATAN2 LAC .CS1 JMS* .SPRLD LAC (2 DAC* .EXPB /ACC B=PI LAC SIGNIA DAC* .SIGNB JMS* .SPADD JMP* ATAN2 / BINT SMA JMP BDINT /ARGUMENT DOUBLE INTEGER JMS* .PICK1 /PICK UP SINGLE INTEGER FLTB JMS* .FLOTB /AND FLOAT IT JMP BSP BDINT JMS* .PICK2 /PICK UP DOUBLE INTEGER JMP FLTB /AND GO FLOAT IT / ATANER LAW 31 /ERROR, BOTH ARGUMENTS=0 JMS* .ERROR JMP* ATAN2 / SIGNIA;SIGNIB .END