* * * THIS ROUTINE FORMS THE SQUARE ROOT OF A FLOATING POINT * VALUE * FSQR EQU $ XCHG . DE TO HL SAVE RESULT ADDRESS SHLD STAKA SAFE PLACE DCX H MOV E BACK TO SIGN OF ARGUMENT MOV A,M GET IT ORA A JNZ NEG NEGATIVE VALUE INX H PUSH H SAVE ADDRESS OF ARGUMENT. MOV A,M GET EXPONENT ORA A CHECK FOR ZERO JZ ZERE0 0 ** .5 = 0 * RAR . CALCULATE RESULT EXPONENT. FIRST, EXPONENT/2 MVI B,80H SET UP FAKE EXPONENT FOR CALCULATION. JNC FSQ10 IF EXP WAS EVEN THEN B IS CORRECT. INR A FIX RESULT EXP DCR B AND FAKE EXP. * FSQ10 ADI 40H FORM NEW EXPONENT BY ADDING 1/2 OF BIAS. STA FTEMP SAVE EXPONENT MOV M,B PUT FAKE EXPONENT BACK INTO ARG. LXI D,EXPTM TRANSFER ARG TO A TEMPORARY LOCATION. CALL VCOPY * * SELECT CORRECT 1ST GUESS * LDA FTEM1 LOOK AT HIGH DIGITS OF ARG. LXI D,A1+DIGI1 1 TO 3.2 MAYBE? CPI 32H JC FSQ20 NOPE 3.2 TO 10 (OR 32 TO 100) LXI D,A2+DIGI1 3.2 TO 10 * FSQ20 MOV A,B LOOK AT FAKE EXPONENT. RAR . WAS IT 7F OR 80? JC FSQ30 7F SO RANGE IS 1 TO 10 * LXI H,2+FPSIZ*2 MOVE TO ALTERNATE GUESS. ADDING (2+FPSIZ)*2. DAD D XCHG * FSQ30 LXI H,2 I'M NOT SURE. DAD D * PUSH H * * CALCULATE GUESS * LXI H,EXPTM LXI B,FTEM2+DIGI1 PUSH B CALL FMUL A*X POP H POP D POP B PUSH B CALL FADD A*X+B CALL NEWTON PERFORM NEWTON ITERATIONS CALL NEWTON IF PX10+PX12+PX14+PX16 IF 10 DIGITS OR GREATER, ITERATE AGAIN. CALL NEWTON ENDF POP B LDAX B SEE IF CALCULATION RESULTED IN CARRY OUT OF HIGH DIGIT. RRC . SEE IF EXPONENT WENT FROM 80 TO 81 LDA FTEMP GET RESULT EXPONENT ACI 0 BUMP EXPONENT IF CARRY OUT OCCURED. STAX B PUT IN RESULT RET * * THIS ROUTINE PERFORMS A NEWTOM ITERATION TO FIND THE * SQUARE ROOT OF A VALUE * NEWTON LHLD STAKA GET ARGUMENT ADDRESS PUSH H SAVE LXI D,FTEM1+DIGI1 LXI B,FTEM2+DIGI1 PUSH B CALL FDIV X/Z POP B POP H PUSH H PUSH B MOV D,B MOV E,C CALL FADD Z+Z/X POP H POP B LXI D,HALF+DIGI1 .5 JMP FMUL .5*(Z+X/Z) * * IF PX6 IF THIS IS THE 6-DIGIT VERSION HALF DB 50H,00H,00H,00H,80H * A1 DB 36H,57H,65H,00H,81H,00H,7FH A2 DB 20H,60H,12H,00H,81H,00H,80H A3 DB 11H,80H,20H,00H,81H,00H,80H A4 DB 65H,15H,37H,00H,80H,00H,80H ENDF IF PX8 8-DIGIT PRECISION HALF DB 50H,00H,00H,00H,00H,80H .5 OR 1/2 * A1 DB 36H,57H,65H,47H,00H,81H,00H,7FH A2 DB 20H,60H,11H,66H,00H,81H,00H,80H A3 DB 11H,80H,20H,45H,00H,81H,00H,80H A4 DB 65H,15H,36H,88H,00H,80H,00H,80H ENDF * IF PX10 10-DIGIT PRECISION HALF DB 50H,00H,00H,00H,00H,00H,80H .5 OR 1/2 * A1 DB 36H,57H,65H,47H,00H,00H,81H,00H,7FH A2 DB 20H,60H,11H,66H,00H,00H,81H,00H,80H A3 DB 11H,80H,20H,45H,00H,00H,81H,00H,80H A4 DB 65H,15H,36H,88H,00H,00H,80H,00H,80H ENDF * IF PX12 12-DIGIT PRECISION HALF DB 50H,00H,00H,00H,00H,00H,00H,80H .5 OR 1/2 * A1 DB 36H,57H,65H,47H,00H,00H,00H,81H,00H,7FH A2 DB 20H,60H,11H,66H,00H,00H,00H,81H,00H,80H A3 DB 11H,80H,20H,45H,00H,00H,00H,81H,00H,80H A4 DB 65H,15H,36H,88H,00H,00H,00H,80H,00H,80H ENDF * IF PX14 14-DIGIT PRECISION HALF DB 50H,00H,00H,00H,00H,00H,00H,00H,80H .5 OR 1/2 * A1 DB 36H,57H,65H,47H,00H,00H,00H,00H,81H,00H,7FH A2 DB 20H,60H,11H,66H,00H,00H,00H,00H,81H,00H,80H A3 DB 11H,80H,20H,45H,00H,00H,00H,00H,81H,00H,80H A4 DB 65H,15H,36H,88H,00H,00H,00H,00H,80H,00H,80H ENDF * IF PX16 16-DIGIT PRECISION HALF DB 50H,00H,00H,00H,00H,00H,00H,00H,00H,80H .5 OR 1/2 * A1 DB 36H,57H,65H,47H,00H,00H,00H,00H,00H,81H,00H,7FH A2 DB 20H,60H,11H,66H,00H,00H,00H,00H,00H,81H,00H,80H A3 DB 11H,80H,20H,45H,00H,00H,00H,00H,00H,81H,00H,80H A4 DB 65H,15H,36H,88H,00H,00H,00H,00H,00H,80H,00H,80H ENDF * * IF PX40 DON'T USE SQR WITH 40-DIGIT VERSION!!!!!!!! HALF EQU $ A1 EQU $ A2 EQU $ A3 EQU $ A4 EQU $ ENDF