*5600 /***** FLOAT -- FOR FOCAL 5/69 ***** /DECIMAL TO BINARY CONVERSION 2/10/69 DBCONV, 0 FLOAT /FLOAT A ZERO DCA DECEXP /INITIALIZE CMA DCA PSWIT TAD C43 /35(10) DCA FLAC0 JMS I SGNTST /SIGN OF MANTISSA DCA INSIGN JMP NEWDIG+1 PERIOD, ISZ PSWIT /. FOUND, SEE IF FIRST ERROR /DOUBLE PERIODS NEWDIG, GETC /LOOK FOR A DIGIT TESTN JMP PERIOD /. FOUND JMP NOTDIG /NOT FOUND TAD PSWIT /DECREMENT DECIMAL EXPONENT SMA CLA /IF AFTER . CMA TAD DECEXP DCA DECEXP JMS MULT10 /MULTIPLY FLAC BY 10 TAD SORTCN /ADD NEW DIGIT DCA FLOP3 DCA FLOP2 DCA FLOP1 JMS TRPLAD OVCHEK, TAD REMAIN /CHECK FOR OVERFLOW SZA CLA JMP .+4 TAD FLAC1 SMA CLA JMP NEWDIG /NO OVERFLOW TAD IOVRL /OVERFLOW, ROTATE RIGHT DCA I IRARAC /SET UP RETURN TO OVCHEK TAD REMAIN /ROTATE REMAIN CLL RAR DCA REMAIN TAD FLAC1 JMP I ROTRAC /ROTATE REST OF FLAC NOTDIG, SORTC /TEST FOR LETTER E C305-1 JMP EINPUT /FOUND E DBTERM, ISZ INSIGN /END OF INPUT, AFFIX SIGN NEGATE TAD CFNR /SET UP TO NORMALIZE DBLOOP, DCA .+2 FENT PSWIT, FNR /OR FMY BY 10 OR .10 FPT I PT1 /SAVE RESULT FEXT TAD DECEXP /CHECK DECIMAL EXPONENT SNA JMP I DBCONV /DONE SMA JMP .+4 IAC /NEGATIVE, SET UP TO FMY BY .10 DCA DECEXP JMP .+5 CLA CMA /POSITIVE, SET UP TO FMY BY 10 TAD DECEXP DCA DECEXP TAD M3 TAD FLINST /INSTRUCTION FMY FLTEN OR FLPTEN JMP DBLOOP EINPUT, GETC /FOUND "E" JMS I SGNTST /TEST FOR SIGN DCA FLOP0 JMS I DECIN1 /INPUT A DECIMAL INTEGER TAD DECNUM ISZ FLOP0 /CHECK SIGN CIA TAD DECEXP DCA DECEXP JMP DBTERM /ADD FLOP TO FLAC TRIPLE PRECISION WITH OVERFLOW TRPLAD, 0 CLA CLL TAD FLOP3 TAD FLAC3 DCA FLAC3 RAL TAD FLOP2 TAD FLAC2 DCA FLAC2 RAL TAD FLOP1 TAD FLAC1 DCA FLAC1 RAL TAD REMAIN DCA REMAIN JMP I TRPLAD /MULTIPLY FLAC BY 2 MULT2, 0 JMS I MULT2I TAD REMAIN RAL DCA REMAIN JMP I MULT2 /MULTIPLY FLAC BY 10 MULT10, 0 PUSHF /FLAC=>FLOP FLAC1 POPF FLOP1 DCA REMAIN /CLEAR OVERFLOW JMS MULT2 /FLAC*10 = (FLAC*2*2+FLAC)*2 JMS MULT2 JMS TRPLAD JMS MULT2 JMP I MULT10 SGNTST, TSTSGN MULT2I, RALAC DECIN1, DECINT IRARAC, RARAC IOVRL, OVCHEK ROTRAC, RARAC+5 C43, 43 DECEXP, 0 /IMPLICIT DECIMAL EXPONENT INSIGN, 0 /SIGN OF MANTISSA CFNR, FNR FLINST, FMY .+4 FLTEN, 0004 /10(10) FLOATING 2400 0000 FLPTEN, 7775 /.10(10) FLOATING 3146 3147 REMAIN=TEMP1 /CHARACTER LIST FOR "ASK" ASKLST, 215 /CR 214 /FF 337 /BA 254 /COMMA USERT, 0 /USER-SELECTED CHARACTER 212 /LF /POWER OF 10 TABLE INTABL, -1750 /1000 -144 /100 -12 /10 -1 /1 /INPUT A DECIMAL INTEGER <2048 DECINT, 0 DCA DECNUM TESTN /GET A DIGIT NOP JMP I DECINT /NONE FOUND GETC TAD DECNUM /MULTIPLY PREV. # BY 10 CLL RTL SPA SZL JMP .+5 /OVERFLOW (>2047) TAD DECNUM RAL TAD SORTCN /ADD NEW DIGIT SPA SZL ERROR JMP DECINT+1 DECNUM=TEMP3 /TEST FOR A SIGN TSTSGN, 0 SPNOR DCA SORTCN SORTC /LOOK FOR + OR - SNLIST-1 GETC /SIGN FOUND SPNOR /NOT FOUND CLA CMA TAD SORTCN /SORTCN: 0=+, 1=- JMP I TSTSGN /AC: 7777=+, 0=- DIGIT=TEMP2 /PRINT A 2-4 DIGIT UNSIGNED DECIMAL INTEGER /FIRST 2 LEADING ZEROES NOT PRINTED INTOUT, 0 DCA DECNUM TAD INTPTR /POWER OF 10 POINTER DCA INTSUB DCA DECINT /DECINT=0 MEANS SKIP 0 OUTPUT JMS INTDO /1ST DIGIT (1000S) JMS INTDO /2ND DIGIT (100S) ISZ DECINT /DECINT>0 MEANS PRINT 0S JMS INTDO /3RD DIGIT (10S) JMS INTDO /4TH DIGIT (UNITS) JMP I INTOUT INTDO, 0 DCA DIGIT /INITIALIZE TAD DECNUM INTSUB, TAD INTABL /SUBTRACT A POWER OF 10 SPA JMP INTNEG DCA DECNUM /POSITIVE RESULT ISZ DIGIT /NONZERO DIGIT, SO IGNORE NO ISZ DECINT /FURTHER ZEROES JMP INTSUB-1 INTNEG, CLA CLL /NEGATIVE RESULT ISZ INTSUB /SET UP NEXT POWER OF 10 TAD DECINT /IS IT A LEADING 0? SNA CLA JMP I INTDO /YES, SKIP IT TAD DIGIT /NO, PRINT DIGIT TAD C260 PRINTC JMP I INTDO /OUTPUT A SIGNED INTEGER IN AC SIGOUT, 0 DCA DECNUM /SAVE NUMBER TAD DECNUM SPA CLA TAD P2 /MAKE A - TAD C253 /MAKE A + PRINTC TAD DECNUM /OUTPUT ABSOLUTE VALUE SPA CIA JMS INTOUT /OUTPUT THE NUMBER JMP I SIGOUT INTPTR, TAD INTABL SNLIST=. /FOR SIGN TESTING C253, 253 /+ 255 /- /E FORMAT OUTPUT ROUTINE XXX, CLA /CONVERT TO E FORMAT ON OVERFLOW TAD TOTDIG SKP FLOUT, TAD DECP /E FORMAT (%0) FLOATING OUTPUT CIA SNA TAD MDIG /6 DIGITS IF 0 GIVEN DCA DECNUM /DIGIT COUNTER TAD PER /PERIOD PRINTC FLDIG, TAD I XRT2 /NEXT DIGIT ISZ T2 /OUT OF SIG DIGITS? JMP .+3 /NO, PRINT DIGIT CLA CMA /YES, RESET POINTER AND PRINT 0 DCA T2 JMS I OUTP SKP /FIELD NOW FILLED, PRINT EXPONENT JMP FLDIG /B-D CONV EXPONENT OUTPUT TAD C305 /PRINT LETTER E PRINTC TAD T1 /OUTPUT THE EXPONENT JMS SIGOUT BDEND, JMP I BDCONV /DONE C305, 305 /E MDIG, -DIGITS OUTP, OUTA /PRINT A LINE NUMBER - "PRNTLN" XPRNTL, 0 TAD LINENO RTL6 AND P77 JMS INTOUT /2-DIGIT PART NUMBER TAD PER PRINTC /DECIMAL POINT TAD LINENO AND P177 /2-DIGIT STEP NUMBER JMS INTOUT TAD C240 /SPACE DCA CHAR PRINTC JMP I XPRNTL NEGSGN, 255-240 /BINARY TO DECIMAL CONVERSION AND OUTPUT BDCONV, 0 TAD FLAC1 /CHECK SIGN SMA CLA JMP .+3 NEGATE /NEGATIVE, TAKE ABSOLUTE VALUE TAD NEGSGN /MAKE A - TAD C240 /MAKE A SPACE PRINTC CLA CMA /DECREMENT BINARY EXPONENT TAD FLAC0 DCA FLAC0 BDSCAL, DCA T1 /INITIALIZE DECIMAL EXPONENT TAD FLAC0 /START SCALING: -4= EXPONENT TAD TOTDIG SPA JMP FPRNT-2 /NO ROUNDING NEEDED TAD MDIGIT /ROUND TO DECP+EXP PLACES SMA CLA R6, TAD RND2 /START ROUNDING DCA FNEGSW /PLACES TO ROUND TO TAD BUFST /ROUNDING START ADDRESS TAD FNEGSW /SET UP ROUND COUNT DCA FLOP0 TAD FNEGSW CIA DCA FNEGSW /START ROUNDING PROCESS BY TAD I TENPT /ADDING 4 TO FIRST DIGIT RET, ISZ I FLOP0 /INCREMENT CURRENT DIGIT TAD I FLOP0 TAD M12 SPA CLA /DIGIT>9? JMP FPRNT /NO, END ROUNDING DCA I FLOP0 /YES, SET DIGIT TO 0 AND CARRY ISZ FNEGSW /BEGINNING OF BUFFER? JMP DECR /NO DECREMENT BUFFER ADDRESS ISZ I FLOP0 /YES, FAKE CARRY FROM FIRST DIGIT ISZ T1 CLA FPRNT, TAD TOTDIG /SET UP FIELD SIZES SNA JMP I FLOUTP /E FORMAT OUTPUT CIA DCA DECNUM /NUMBER OF PLACES TO PRINT TAD DECNUM TAD T1 SMA SZA JMP I XXXP /TOO BIG, PRINT E FORMAT TAD DECP /OK, TEST DECIMAL PLACES SMA CLA /ADJUST DECIMAL POINT CIA TAD T1 CLL CIA DCA FNEGSW /NUMBER OF INTEGER PLACES SZL JMP IN+4 /NO INTEGER PLACES /START PRINTING BACK, TAD T1 TAD FNEGSW SNA CLA JMP DIG /PRINT A DIGIT TAD FNEGSW IAC SPA CLA /PRINT 0 IF ONE INTEGER PLACE LEFT TAD M20 /OTHERWISE A SPACE IN, JMS OUTA /PRINT A CHARACTER JMP I BDENDP /FIELD FILLED, EXIT ISZ FNEGSW JMP BACK /CONTINUE TAD PER /DECIMAL POINT PRINTC JMP BACK DIG, CMA TAD T1 /DECREMENT DECIMAL EXPONENT DCA T1 ISZ T2 /CHECK SIG DIGIT COUNT JMP .+4 /SOME LEFT CMA /ALL USED UP DCA T2 JMP IN /PRINT A 0 TAD I XRT2 /PRINT A SIG DIGIT JMP IN /DIGIT PRINT ROUTINE FOR BDCONV OUTA, 0 TAD C260 /CONVERT TO ASCII PRINTC ISZ DECNUM /FIELD FILLED? ISZ OUTA /NO, GO TO SECOND RETURN JMP I OUTA BDENDP, BDEND / "OPTION" PROCESSOR OPTION, SPNOR /GET OPTION LETTER SORTJ OPTLST-1 OPTTBL-OPTLST ERROR /ILLEGAL OPTION NAME ///// OPTR, CLA CMA /SWAP INPUT TO HIGH SPEED READER DCA HINBUF RFC /START READER TAD RESTR /POINT TO "HREAD" OPTK, TAD PTCH /SWAP TO KEYBOARD IF CALLED HERE DCA 113 ///// OPTRET, TSTERM /MOVE TO ,;CR JMP .-1 JMP I .+2 /END OF OPTIONS JMP OPTION /CONTINUE PROCESSING OPTIONS PROC ///// /HIGH SPEED INPUT ROUTINE HREAD, 0 TAD M5 DCA T1 DCA T2 HREAD2, ION /(SWAP) - FOR 2-USER TAD HINBUF /WAIT FOR INPUT SMA CLA JMP HSGO+1 ISZ T2 JMP HREAD2 ISZ T1 JMP HREAD2 TAD PTCH /ALL DONE READING TAPE DCA 113 /SWAP TO KEYBOARD INPUT TAD P337 /RETURN A B.A. TO KILL UNENDED LINE OR GARBAGE /CHARACTER HSGO, JMP RESTR-2 CMA DCA HINBUF /SET TO READ NEXT RRB RFC AND P177 /IGNORE PARITY AND BLANK SNA JMP HREAD+1 TAD C200 DCA CHAR JMP I HREAD ///// RESTR, HREAD-CHIN PAGE /FLOATING POINT PACKAGE /ARITHMETIC INTERPRETER FPNT, 0 CLA CLL TAD I FPNT /FLOATING INSTRUCTION SNA JMP I FPNT /FEXT AND C200 /GET PAGE BIT SZA CLA TAD FPNT /CURRENT PAGE AND P7600 DCA FLADDR /START ADDRESS OF ADDRESSED PAGE TAD I FPNT /GET ADDRESS BITS AND P177 TAD FLADDR DCA FLADDR /FULL 12-BIT ADDRESS TAD I FPNT ISZ FPNT CLL RTL /OP BITS =>AC9-11 RTL /INDIRECT BIT =>LINK AND P17 TAD DRECTR /SET UP OP POINTER DCA DIRECT TAD I FLADDR /INDIRECT? SZL DCA FLADDR /YES PUSHF /NO, GET OPERAND FLADDR, 0 POPF FLOP DCA FLOP3 /CLEAR LOW ORDER OPERAND DIRECT, JMP I .+2 /OP DIRECT INSTRUCTION DRECTR, JMP I .+1 /OP TABLE FLPOW FLADD FLSUB FLMUL FLDIV FLGET FLPUT FLNOR FLGET, PUSHF /OP 5: GET FLAC FROM STORAGE FLOP TAD .+3 /SET UP POINTER TO FLAC JMP .+4 FLPUT, PUSHF /OP 6: PUT FLAC IN STORAGE FLAC TAD FLADDR /SET UP POINTER TO STORAGE DCA .+2 POPF 0 /ADDRESS OF STORAGE LOCATION JMP FPNT+1 NEGOP, 0 /ROUTINE TO NEGATE FLOP TAD FLOP2 CLL CIA DCA FLOP2 CML RAL TAD FLOP1 CIA DCA FLOP1 TAD FNEGSW /FNEGSW IS COMPLEMENTED WHEN CLL CMA /FLOP OR FLAC IS NEGATED DCA FNEGSW JMP I NEGOP NEGAC, 0 /ROUTINE TO NEGATE FLAC - "NEGATE" CLA CLL /TRIPLE PRECISION TAD FLAC3 CIA DCA FLAC3 CML RAL TAD FLAC2 CIA DCA FLAC2 CML RAL TAD FLAC1 CIA DCA FLAC1 TAD FNEGSW CLL CMA DCA FNEGSW JMP I NEGAC /ARITHMETIC OPERATIONS /BOTH FLAC AND FLOP MUST BE NORMALIZED FOR /+-*/^ (FAD,FSU,FMY,FDV,FXP) FLSUB, JMS NEGOP /OP 2: SUBTRACT OP (NEGATE AND ADD) FLADD, TAD FLAC1 /OP 1: ADD OP SNA CLA JMP FLGET /RESULT=OPERAND IF FLAC=0 TAD FLOP1 SNA CLA JMP FPNT+1 /RESULT=FLAC IF FLOP=0 TAD FLOP0 /COMPARE EXPONENTS CIA TAD FLAC0 SNA JMP CMBINE /EQUAL, GO ADD TOGETHER SMA /NOT EQUAL, NEED SHIFTING JMP SHFLOP /FLAC>FLOP, SHIFT FLOP TAD P27 /FLAC