/27-BIT FLOATING PT INTERPRETER *FLPT-600 / /FLOATING MULTIPLY /DOES A 27 BY 27 BIT FLOATING MULTIPLY / FFMPY, 0 SNA /WHICH MODE OF CALL? TAD I FFMPY /CALLED BY USER-GET OPERAND ADDR. JMS I MDSETK /SET UP FOR MPY-OPX IN AC ON RETN. TAD ACX /DO EXPONENT ADDITION TAD KM201 /SUBTRACT THE BIAS (+1) FROM EXP. DCA ACX /STORE FINAL EXPONENT TAD AC1 /GET HI ORDER MANTISSA DCA TM4 /STORE IN A TEMP. TAD ACH /SAME FOR REST OF FAC DCA AC0 TAD ACLO DCA TM5 DCA ACH /ZERO FAC-RESULT OF MPY WILL DCA ACLO /BE STORED THERE DCA AC1 TAD M27 /SET UP COUNTER FOR 27 BIT MPY DCA OPX CLA CLL IAC /SET UP MASK FOR EXAMINING LOOPM, DCA MSK /MULTIPLIER BITS JMS I AR1P /SHIFT RESULT SO FAR RIGHT 1 BIT TAD MSK /GET THE BIT MASK AND TM5 /MASK MULTIPLIER BIT (FROM LO TO HI) SZA CLA /IS MULTIPLIER BIT 1? JMS I OADDK /YES-ADD MULTIPLICAND AND PART. PROD. TAD MSK /SHIFT THE MASK FOR NEXT BIT CLL RAL SZL /DID WE PASS A WORD BOUNDARY? JMP LP3 /YES-CHANGE MULTIPLIER WORD LP2, ISZ OPX /ARE WE DONE YET? JMP LOOPM /NO-GO ON MDONE, CLA CLL /YES-CLR. AC JMS I FNORK /NORMALIZE RESLT AND PACK INTO 3 WORDS ISZ FFMPY /BUMP RETURN ADDRESS JMP I FFMPY /RETURN LP3, TAD AC0 /DONE A MULTIPLIER WORD-MOVE NEXT ONE DCA TM5 /INTO TM5 TAD TM4 /MOVE LAST WORD TO AC0 FOR NEXT DCA AC0 /WORD BOUNDARY CROSSING CLL IAC /SET UP MASK BIT JMP LP2 /GO BACK K177, 177 DVBY0P, FTRP2 K40, 40 OPNEGP, OPNEG KM29, -35 TM4, 0 TM5, 0 KM201, -201 M27, -33 FNORK, FFNOR MSK, 0 AR1P, AR1 OADDK, OADD MDSETK, MDSET / /SHIFT 3 WD FAC LEFT 1 BIT /WORDS=AC1,ACH,ACLO / AL1, 0 TAD ACLO CLL RAL DCA ACLO TAD ACH RAL DCA ACH TAD AC1 RAL DCA AC1 JMP I AL1 / /ROUTINE TO MOVE RESULT BITS WHEN WE HAVE FILLED A WORDSWORTH(PUN!) / HLP, TAD I OADDK /GET THE RESULT SO FAR DCA I MDSETK /STORE SAFELY TAD AC0 /GET THE RESULT BITS JUST GENERATED DCA I OADDK /AND STORE THEM DCA AC0 /CLEAR AC0 RAR /ROTATE RESULT BIT MASK TO AC JMP DGON /GO ON / /END OF FLOATING DIVIDE / DVDONE, TAD AC0 /YES-GET RESULT AND PUT IN FAC DCA ACLO TAD I OADDK DCA ACH TAD I MDSETK DVD, DCA AC1 JMS I FNORK /NORMALIZE RESULT AND PACK TO 3 WDS ISZ FFDIV /BUMP RETN. ADDR. JMP I FFDIV /RETURN *FLPT-456 / /FLOATING DIVIDE ROUTINE /DONE BY MULTIPLE SUBTRACTIONS /(NOTE: MDSET SETS AC0 TO ZERO) FFDIV, 0 /(USED AS A TEM. BY I/O ROUTINES) SNA /WHICH MODE OF CALL? TAD I FFDIV /CALLED BY USER-GET ARG. ADDR. JMS I MDSETK /GO SET UP FOR DIVIDE-OPX IN AC ON RETN. FFD1, CMA IAC /NEGATE EXP. OF OPERAND TAD ACX /ADD EXP OF FAC TAD K177 /ADD THE BIAS (-1) DCA ACX /STORE AS FINAL EXPONENT TAD AC2 /CHECK DIVISION BY ZERO SNA CLA JMP I DVBY0P /YES-GIVE ERROR TAD K40 /NO-SET UP INITIAL BIT MASK DCA MSK /STORE JMS I OPNEGP /NEGATE OPERAND FOR SUBTRACTS TAD KM29 /SET COUNTER FOR 29 RESULT BITS DCA TM4 /(SO WE CAN ROUND-FIRST BIT MAY BE 0!) DVLP, TAD MSK /SHIFT POSITION OF RESULT BIT MASK CLL RAR SZL /DID WE CROSS A WORD BOUNDARY? JMP HLP /YES-MUST FIX UP SOME STUFF DGON, DCA MSK /STORE SHIFTED RESULT BIT BACK TAD ACLO /DO THE TRIAL SUBTRACT OF OPERAND TAD OPL /FROM FAC(LO ORDER) DCA FFMPY /STORE TEMPORARILY RAL /PROPAGATE CARRY TAD ACH /DO THE MIDDLE ORDER TAD OPH DCA OPX /STORE IN A TEMP. RAL /PROPAGATE CARRY TAD AC1 /DO HIGH ORDER TAD AC2 SNL /WAS SUBTRACT SUCCESSFUL? JMP DV2 /NO-DON'T CHANGE FAC DCA AC1 /YES-STORE BACK THE ADJUSTED FAC TAD OPX DCA ACH TAD FFMPY DCA ACLO DV2, SZL CLA /WAS SUBTRACT SUCCESSFUL? TAD MSK /YES-PUT A 1 IN RESULT TAD AC0 /AND STORE BACK DCA AC0 JMS AL1 /SHIFT FAC LEFT 1 BIT ISZ TM4 /DONE ALL 29 BITS? JMP DVLP /NO-GO ON JMP DVDONE /(JMP SO DIV. ROUTINE IS ORG'ED RIGHT) *FLPT-400 / /FLOATING ADD / FFADD, 0 SNA /WHICH MODE OF CALL? TAD I FFADD /CALLED BY USER-GET ADDR. OF OPR. JMS I ARGETP /PICK UP OPERAND FAD1, JMS I SPLITP /SPLIT UP OPERAND AND FAC TAD ACX /DO EXPONENT CALCULATION CLL CMA IAC TAD OPX SZL /WHICH EXP. GREATER? JMP FACR /OPERANDS-SHIFT FAC RIGHT DCA OADD /FAC'S-STORE COUNT-SHIFT OP RIGHT TAD AC2 /DON'T SHIFT A ZERO! SNA CLA JMP DOADD /ZERO-JUST ADD JMS OPSR ISZ OADD /DONE ALL SHIFTS? JMP .-2 /NO-GO ON DOADD, TAD TM /YES-ADD THE SIGNS OF FAC AND OP TAD AC0 /AND SEE IF THEY ARE DIFFERENT SPA CLA /ARE SIGNS DIFFERENT? JMS OPNEG /YES-NEGATE OPERAND JMS OADD /DO THE ADDITION TAD AC1 /IS THE RESULT NEG? (I.E. IS OPR SMA CLA /GREATER IN MAGNITUDE THAN FAC?) JMP DONA /NO-RESULT WILL KEEP SIGN OF FAC TAD ACLO /YES-NEGATE RESULT(TO MAKE IT PLUS) CLL CMA IAC DCA ACLO CML RAL TAD ACH CMA IAC DCA ACH CML RAL TAD AC1 CMA IAC DCA AC1 TAD AC0 /AND GIVE IT THE SIGN OF OPERAND DCA TM DONA, DCA OV /CLEAR THE OVERFLOW WORD JMS I FNORP /NORMALIZE RESULT AND PACK INTO 3 WDS ISZ FFADD /BUMP RETURN JMP I FFADD /RETURN FACR, CMA /SHIFT FAC-SET UP SHIFT COUNT DCA OADD /AND STORE TAD OPX /SET FINAL EXP EQUAL TO EXP OF OP DCA ACX TAD AC1 /DON'T SHIFT A ZERO! SNA CLA JMP DOADD /ZERO-JUST ADD SKP JMS AR1 /SHIFT FAC 1 PLACE RIGHT ISZ OADD /DONE ALL? JMP .-2 /NO-GO ON JMP DOADD /YES-DO THE ADD / /ROUTINE TO SHIFT 3 WORD OPERAND IN AC2,OPH,OPL /1 BIT TO THE RIGHT / OPSR, 0 TAD AC2 CLL RAR DCA AC2 TAD OPH RAR DCA OPH TAD OPL RAR DCA OPL JMP I OPSR / /ROUTINE TO SHIFT 3 WORD FAC 1 BIT TO THE /RIGHT (FAC IS IN AC1,ACH,ACLO) /KEEP 1 BIT OF OVERFLOW IN OV FOR POSSIBLE ROUND / AR1, 0 TAD AC1 CLL RAR DCA AC1 TAD ACH RAR DCA ACH TAD ACLO RAR DCA ACLO RAR DCA OV JMP I AR1 *FLPT-261 / /FLOATING SUBTRACT / FFSUB, 0 SNA /WHICH MODE OF CALL? TAD I FFSUB /CALLED BY USER-GET ADDR. OF OP JMS I ARGETP /PICK UP THE OP. CLA CLL CML RAR /SWITCH SIGN OF OPERAND TAD OPX DCA OPX TAD FFSUB /JMP INTO FLTG. ADD SUB0, DCA FFADD /AFTER SETTING UP RETURN JMP FAD1 OV, 0 ARGETP, ARGET SPLITP, SPLIT FNORP, FFNOR / /FLOATING NEGATE /UED IF FAC HAS NOT BEEN SPLIT UP! / FFNEG, 0 /(USED AS A TEM. BY OUTPUT ROUTINE) CLA CLL CML RAR /GET A 4000 INTO AC TAD ACX /SWITCH THE SIGN BIT OF THE FAC DCA ACX /STORE BACK CLL /AC=L=0 ON RETN JMP I FFNEG / /NEGATE OPERAND / OPNEG, 0 TAD OPL /GET LOW ORDER CLL CMA IAC /NEGATE AND STORE BACK DCA OPL CML RAL /PROPAGATE CARRY TAD OPH /GET HI ORDER CMA IAC /NEGATE AND STORE BACK DCA OPH CML RAL TAD AC2 /GET VERY HI ORDER CMA IAC /NEGATE DCA AC2 /STORE BACK JMP I OPNEG / /ROUTINE TO ADD 3 WORD OPERAND (AC2,OPH,OPL) /TO 3 WORD FAC (AC1,ACH,ACLO) AND STORE RESULT /IN FAC / OADD, 0 CLL TAD OPL /ADD THE LOW ORDERS TAD ACLO DCA ACLO /STORE IN LOW ORDER FAC RAL /ROTATE CARRY TO AC TAD OPH /ADD MIDDLE ORDERS TAD ACH DCA ACH /STORE IN FAC RAL /ROTATE CARRY TAD AC2 /ADD HI ORDERS TAD AC1 DCA AC1 JMP I OADD /DONE *FLPT-200 / /ROUTINE TO CALL EXTENDED FUNCTIONS /THIS IS AN EXTENSION OF OP CODE 0 / FCALL, TAD OPH /FCALL-GET FUNCTION # (=ADDR SINCE TAD JMSI2 /PAGE ZERO)-MAKE A JMS THRU TABLE DCA DCOD1 /STORE IT JMS CDFCUR /D.F. MUST BE FIELD OF PACKAGE TAD I FPP /GET AND SAVE FLTG. P.C. DCA FT1 TAD I DFCDFP /GET AND SAVE FLTG. D.F. AND I.F. DCA FT2 TAD I FPNXT DCA FT3 DCOD1, 0 /CALL THE SUBROUTINE CLA JMS CDFCUR /CHANGE TO D.F. OF PACKAGE TAD FT3 /RESTORE FLTG. PC,IF,DF DCA I FPNXT TAD FT2 DCA I DFCDFP TAD FT1 FJUMP1, DCA I FPP JMP I FPNXT /GET NEXT INSTR. SPLITB, SPLIT K7770, 7770 AL1P, AL1 JMPIC, JMP I CDFCUR DFCDFP, DFCDF JMSI2, JMS I TABLE2-1 TABLE2, FFSQ /SQUARE=1 FROOT /SQUARE ROOT=2 FFSIN /SIN=3 FFCOS /COS=4 FFATN /ARCTANGENT=5 FFEXP /EXPONENTIAL=6 FFLOG /LOGARITHM=7 FFNEG /NEGATE=10 FFIN /INPUT=11 FFOUT /OUTPUT=12 FFIX /FIX=13 FFLOAT /FLOAT=14 DCOD1 /NOP=15 DCOD1 /NOP=16 DCOD1 /NOP=17 /CHANGE TO DATA FIELD OF FLTG. PT. PKG. /AFTER FIRST TIME THRU, ROUTINE LOOKS LIKE / CDFCUR, 0 / CDF N /N IS FLD OF PKG. / JMP I CDFCUR / (NEXT 8 LOCS. FREE FOR TEMPS) CDFCUR, 0 CCUR1, RIF /READ INST. FIELD CCUR2, TAD TM /ADD A CDF 0 INST DCA CCUR1 /STORE IT, MODIFYING SUBR. TAD JMPIC /STORE A SUBR. RETN DCA CCUR2 /ALL DONE /NECESSARY CONSTANTS 7100 FT2, 7076 FT3, 7650 FT1, 2267 5252 STICKA, STICK / /ROUTINE TO NORMALIZE THE FAC /AND THEN PACK IT INTO 3 WORDS *FLPT-113 FFNOR, 0 JMS I SPLITB /SPLIT UP FAC IN CASE NOT SPLIT YET FN0, TAD AC1 /SHOULD FAC BE SHIFTED RIGHT? TAD K7770 SPA CLA JMP FN1 /NO-SEE IF WE SHOULD ROUND UP JMS I AR1PT /YES-SHIFT RIGHT ISZ ACX /INCREMENT EXPONENT NOP JMP FN0 /GO CHECK AGAIN FN1, TAD I OVPT /GET OVERFLOW WD-SEE IF WE ROUND SNA CLA JMP FN3 /NO ROUND OFF-GO ON ISZ ACLO /YES-INCREMENT LOW ORDER JMP FN3 /NO-CARRY-DONE ROUNDING JMP FN4 /JMP AROUND GET, PUT OVPT, OV / /FLOATING GET / FFGET, 0 SNA /WHICH MODE OF CALL TAD I FFGET /CALLED BY USER-GET ADDR. OF OP JMS I ARGETK /PICK UP OPERAND TAD OPX DCA ACX /LOAD THE OPERAND INTO FAC TAD OPL DCA ACLO TAD OPH DCA ACH ISZ FFGET JMP I FFGET /RETN. TO CALL +2 / /FLOATING PUT / FFPUT, 0 SNA /WHICH MODE OF CALL? TAD I FFPUT /CALLED BY USER-GET OPR. ADDR DCA FFGET /STORE IN A TEMP TAD ACX /GET FAC AND STORE IT DCA I FFGET /AT SPECIFIED ADDRESS ISZ FFGET TAD ACH DCA I FFGET ISZ FFGET TAD ACLO DCA I FFGET ISZ FFPUT /BUMP RETN. JMP I FFPUT /RETN. TO CALL+2 / /CONTINUATION OF NORMALIZE ROUTINE / FN4, ISZ ACH /CARRY-INCREMENT MIDDLE ORDER JMP FN3 /NO FURTHER CARRY-DONE ISZ AC1 /CARRY OUT OF MIDDLE-BUMP HIGH ORDER DCA I OVPT /ZERO OVERFLOW WD JMP FN0 /GO CHECK IF NORMALIZED FN2, JMS I AL1P /SHIFT FAC LEFT 1 CLA CMA /SUBTRACT 1 FROM EXPONENT TAD ACX DCA ACX FN3, TAD AC1 /CHECK I FAC=0 SNA TAD ACH /HI ORDER SNA TAD ACLO SNA CLA /IS WHOLE FAC=0? JMP ZEXP /YES-ZERO EXPONENT CLA CLL CMA RTL /NO-INSURE THAT # IS NORMALIZED TAD AC1 /(I.E. HI ORDER DIGIT IS 4,5,6,OR 7) SPA SNA CLA /IS IT? JMP FN2 /NO-SHIFT FAC LEFT AND DECREMENT EXP NDON, JMS I STICKA /YES-CHECK FOR ERRORS AND PACK FAC JMP I FFNOR /DONE-RETURN AR1PT, AR1 ZEXP, DCA ACX DCA TM /ZERO SIGN JMP NDON /GO PACK FAC ARGETK, ARGET / /FLOATING HALT-DISPLAY FLOATING P.C. / FFHLT, JMS CDFCUR /MUST BE DATA FIELD OF PACKAGE TAD I FPP /GET THE P.C. HLT CLA /CLR IT OUT JMP I FPNXT /DONE-GET NEXT INSTR. / /BEGINNING OF INTERPRETER / *FLPT FPT, 0 L7600, 7600 /CLA RDF /READ DATA FIELD-THIS WILL BE TAD KCDF0 /INITIAL FLTG. DATA AND INSTR. FLD DCA FPNEXT /STORE CDF TO FLTG. INST. FLD FFSW0, TAD FFSB0 /INLINE IN INTERPRETER--SET FLOATING SWITCH DCA TSUB /TO 0 TAD FFDV0 DCA TDIV TAD FPNEXT SFDF, DCA DFCDF FPNEXT, 0 /BECOMES CDF TO FLTG. INST FLD. TAD I FPT /GET NEXT FLTG. PT. INSTR. DCA OPX /STORE IN A TEMPORARY TAD OPX /GET IT BACK AND PICK OFF AND P177 /THE ADDRESS DCA OPH /STORE THAT AWAY TAD OPX /PICK OFF THE PAGE BIT AND K200 /AND MAKE A 7600 IF CURRENT PAGE CMA IAC /OR 0 IF PAGE ZERO K200, AND FPT /THIS SETS UP HI ORDER 5 BITS OF ADDR. ISZ FPT /INCREMENT FLTG. P.C. TAD OPH /ADD IN LOW ORDER 7 BITS OF ADDR DCA OPH /THIS IS FINAL ADDR UNLESS INDIRECT. TAD OPX /NOW DECODE THE OP CODE CLL RTL RTL AND K7 /PICK OFF OP CODE BITS TAD JMSI /AND MAKE A JMS THRU TABLE DCA DCOD /STORE IT FOR LATER TAD OPH /GET ADDRESS INTO AC SNL /INDIRECT BIT IN LINK-IS IT ON? JMP DCOD /NO-CALL THE PROPER ROUTINE AND P7770 /YES-IS ADDR AN AUTO INDEX REG.? TAD P7770 SNA CLA TAD K3 /YES-ADD 3 TO XREG. BEFORE USING TAD I OPH /THE ADDR. DCA I OPH TAD I OPH /GET EFF. ADDR.INTO AC FOR CALL DFCDF, 0 /CHANGE TO FLTG. D.F.-INDIRECT ADDRESSING DCOD, 0 /CALL SUBRS. WITH ADDR IN AC-D.F.IS /SET TO FLTG. D.F. OR I.F.-RETN. IS /TO CALL+2 FNRM, JMS I FFNORP /NORMALIZE ROUTINE-CALL NORM SUBR. JMP FPNEXT /GO GET NEXT INSTR. / /TABLE FOR JUMPS / JMSI, JMS I TABLE TABLE, FFJMP /FLOATING JMP OP CODE 0 FFADD / " ADD " 1 TSUB, FFSUB / " SUBTRACT 2 TMPY, FFMPY / " MULTIPLY 3 TDIV, FFDIV / " DIVIDE 4 FFGET / " GET " 5 FFPUT / " PUT " 6 FFJMS / " JMS " 7 / /CONSTANTS AND POINTERS / P177, 177 FCALLP, FCALL KCDF0, CDF 0 P7770, 7770 FFNORP, FFNOR / /FLOATING JUMP-CHECK FOR FCALL OR FISZ / FFJMP, 0 SNA /IS IT FEXT? JMP EXIT /YES-LEAVE INTERPRETER DCA OPH /NO-STORE ADDR. TAD OPX /ARE INDIRECT AND PAGE BITS=0 AND L7600 /(WORKS SINCE OP`CODE=0) SZA CLA JMP FJUMP /NO-IT IS FJUMP-EFF. ADR. IN OPH TAD OPX /YES-ARE BITS 5-7=0? AND K160 /(ANY ON=FISZ) SNA CLA JMP I FCALLP /FLOATING CALL-DO IT FFISZ, ISZ I OPX /FISZ-SZ THAT ADDR (DF=FLTG. IF) JMP FPNEXT /NO-SKIP-GO GET NEXT INST. FISZ1, ISZ FPT /SKIP-INCREMENT FLTG. P.C. JMP FPNEXT /GO ON K160, 160 / /FEXT-LEAVE INTERPRETER / EXIT, CLA CLL CML RTL /MAKE A CDF CIF TO FLTG. INST FLD. TAD FPNEXT DCA .+1 /STORE IT 0 JMP I FPT /GO BACK TO USER,AC=L=0 / /FLOATING JMS-IF BITS 3-11=0 = NORMALIZE FAC (FNOR) / " 3-4 =0 = DECODE FURTHER BY BITS 9-11 / " 9-11=0 = SKIP ON CONDITION OF FAC / " =1 = FCDF (BITS 6-8=NEW FLTG. D.F.) / " =2 = FSW0 / " 3 = FSW1 / " =4 = FHLT-DISPLAY FLTG. PC / " =5-7 NOP / FFJMS, 0 SNA /IS IT NORMALIZE? JMP FNRM /YEAH-DO IT DCA OPH /NO-STORE EFF ADDR. TAD OPX /GET THE INSTR. AND K600 /INDIRECT AND PAGE BITS=0? SNA CLA JMP I JSKPP /YES-GO DECODE FURTHER TAD FPNEXT /NO-ITS JMS-GET CDF TO FLTG. I.F. DCA .+1 /STORE IT IFCDF, 0 /EXECUTE IT TAD FPT /GET THE FLTG. P.C. DCA I OPH /STORE IT AT THE EFF.ADDR. TAD OPH /GET THE EFF. ADDR. DCA FPT /STORE IN`FLTG. PC. JMP FISZ1 /GO INCREMENT FLTG. PC JSKPP, JSKP FFDV0, FFDIV FFSB0, FFSUB K3, 3 K7, 7 K600, 600 / /FLOATING SKIP-ADD 600 TO THE INSTRUCTION TO MAKE IT /A SKIP WITH CLA--THE SKIP PRODUCED IS THE REVERSE OF /WHAT IS EXPECTED (SNA NOT SZA) TO FACILITATE THE /DECODING / FFSKP, TAD K600 /ADD 600 TO MAKE A SKP WITH CLA TAD OPX /ADD IN ORIG INSTR DCA .+2 TAD ACX /GET EXP OF FAC TO AC FOR SENSING 0 /EXECUTE THE SKIP WE MADE ISZ FPT /NO SKIP=SKIP-BUMP FLTG.PC JMP FPNEXT /SKIP=NO SKIP-LEAVE PC ALONE-GO ON / /FLOATING JUMP-STORE EFF. ADDR IN FLTG.PC / FJUMP, TAD OPH /GET EFF ADDR OF JUMP DCA FPT /STORE IN FLTG. PC JMP FPNEXT /GO ON FFSQC, JMS I TMPY /CALL MULTIPLY TO MULTIPLY ACX /FAC BY ITSELF JMP I FFSQ /DONE *FPT+164 / /FSQUARE-SQUARE FAC-CALLS MULTIPLY TO MUL. FAC BY ITSELF / FFSQ, 0 JMP FFSQC /JUMP TO LEAVE ROOM 4 EXTRA TRAPS / /FLOATING TRAPS TO USER-INITIALLY SET TO NOPS / FTRP4, JMP I FTRAP4 /EXP. UNDERFLOW FTRP5, JMP I FTRAP5 /EXP. OVERFLOW FTRP1, JMP I FTRAP1 /FIX OVERFLOW FTRP2, JMP I FTRAP2 /DIV. ERR. FTRP3, JMP I FTRAP3 /ILL. FUNCT. ARG. FTRAP5, OVRFLO FTRAP1, FTRPRT FTRAP2, DBAD FTRAP3, LTRPRT FTRAP4, NDRFLO $