.TITLE .SQRT / / / INTERNAL GLOBALS .GLOBL SQRT,.SQRT / EXTERNAL GLOBLS .GLOBL .SIGNA,.EXPA,.MOSTA,.LESTA .GLOBL .GRAB,.SNGL,.ERROR / / / / THE SQUARE ROOT ROUTINES TAKE A VALUE FROM ACC A AND / PLACE THE ROOT IN ACC A SQRT XX JMS* .GRAB JMS .SQRT JMP* SQRT / .SQRT XX JMS* .SNGL /CHECK MODE LAW -1 SAD* .EXPA /DOES EXPA=-0? DZM* .EXPA /YES - SET EXPA=+0 LAC* .SIGNA SMA JMP .+3 ERRNS LAW 6 / ERROR - NEGATIVE SQUARE ROOT ARGUMENT JMS* .ERROR LAC* .EXPA SPA!RAR SZL!CLL SZL /EXPA IS POS AND ODD JMP ODD /EXPA IS NEG AND ODD LAC* .MOSTA /EXPA IS POS OR NEG AND EVEN SNA JMP* .SQRT RAL SMA!CLL!CMA JMP ONES /110001...>MOSTA>100100... SIGNB=320000 TAD (420000 SMA!CLL JMP ONES1 LAC (360000 /MOSTA>110001... SIGNB=360000 GO5 DAC SIGNB LAC* .LESTA LMQ LAC* .MOSTA LRS 2 /SHIFT MOSTA.LEASTA 2 RIGHT DAC* .MOSTA LAC* .EXPA SPA!STL /IS EXPA POSITIVE? JMP SQRNEG /NO RCR /YES - DIV BY 2 AND STORE DAC* .EXPA SNL!CLL /WAS LINK SET? JMP NOSHFT /NO ADD (1 /YES : INCREMENT EXPA DAC* .EXPA XCX LAC* .MOSTA /AND ROTATE MOSTA.LEASTA ONCE MORE LRS 1 DAC* .MOSTA NOSHFT LACQ DAC* .LESTA LAW -3 DAC EXPB GO LAC* .LESTA LMQ CLL LAC SIGNB DAC .+3 LAC* .MOSTA DIV /PERFORM (MOSTA.LEASTA)/SIGNB 0 DAC MOSTB /SAVE REMAINDER LACQ TAD SIGNB RAR /DIVIDED BY 2 DAC SIGNB / = C FOR NEXT ITERATION ISZ EXPB /EXPB = 0? JMP GO /NO - GO AGAIN RAL DAC* .MOSTA LAC SIGNB DAC .+3 LAC MOSTB FRDIV 0 LACQ DAC* .LESTA DZM* .SIGNA JMP* .SQRT SQRNEG RAR /DIVIDE BY 2 DAC* .EXPA SZL!CLL JMP NOSHFT JMP XCX ODD LAC* .MOSTA RAL SPA!CLL!CMA JMP .+3 /100100...>MOSTA>011010... SIGNB=260000 LAC (220000 /011010...>MOSTA>010000... SIGNB=220000 JMP GO5 TAD (440000 SMA!CLL JMP .-4 LAC (260000 JMP GO5 ONES TAD (100000 SMA!CLL JMP .-4 ONES1 LAC (320000 JMP GO5 / / WORK AREAS SIGNB;EXPB;MOSTB;LEASTB / .END