/FLOATING POINT INPUT/OUTPUT ROUTINES: PAGE 14 /FILL A HOLE FLINTP, 0 /CONVERT ASCII TO BINARY - 'READN' JMS FIGO2 /IGNORE LEADING SPACES JMS FIGO3 /READ FIRST DIGIT GROUP SNL /ENDED BY A PERIOD? JMS FIGO8 /SKIP IT & READ 2ND GROUP JMS FIGO4 /AND/OR RESET DIGIT COUNT TAD P43 DCA EXP /FIX UP EXPONENT NORMALIZE JMS I RESOL /ATTACH THE SIGN TAD FIGO2 CMA TAD FIGO9 /COMPUTE DECIMAL PT SNA FIGO1, JMP I FLINTP /INTEGERS ARE EASY! DCA T3 FENT FPUT I FLARGP /SAVE 'MANTISSA' FEXT TAD FIGO1 SZA CLA JMP .+5 /IF NO EXPONENT JMS FIGO8 JMS FIGO3 /GET SIGNED EXPONENT JMS I RESOL TAD OVER TAD T3 JMS FIGO9 /CONVERT TO FL. PT. FENT FPUT FLOP FGET FL10 /COMPUTE 10^N FPWR FLOP FMUL I FLARGP /TIMES WHAT WE HAD FEXT JMP I FLINTP /***RETURN*** ///// M314, -314 FL10, +4;2400;0;0 /LOCATED AT 'DCA EXP'! FIGO2, 0 /IGNORE LEADING SPACES SMA SZA CLA /-40, ONLY 'SZA' OCCURS JMS FIGO8 /GET FIRST OR NEXT TAD CHAR TAD .-3 /IS IT A SPACE? SNA CLA JMP .-4 /YES: IGNORE IT JMP I FIGO2 ///// FIGO3, 0 /INITIALIZE FOR A NEW NUMBER JMS FIGO9 DCA FIGO9 /CLEAR OVERRUN COUNTER TAD CHAR TAD (200-"- /TEST FOR '-' SNA JMP TCP IAC CLL IAC /TEST FOR '+' SKP CLA TCP, STA STL RTR /POINTS TO 'TERM' DCA SIGN RAL JMS FIGO2 /SKIP SIGN, SPACES JMS FIGO4 /READ DIGIT STRING JMP I FIGO3 ///// FIGO4, 0 /CONVERT ASCII STRING TO BINARY DCA FIGO2 ISZ FIGO9 /COUNT OVERRUN DIGITS ISZ FIGO2 /COUNT DECIMAL PLACES TESTN JMP FIGO7 /PERIOD, L=0 JMP FIGO6 /OTHER, L=0 FIGO5, JMS FIGO8 /GET NEXT DIGIT TAD HORD TAD M314 /.GT. 0314;6314;6314 ? SMA CLA JMP FIGO4+2 TAD SORTCN /ADD IN CURRENT DIGIT MULT10 JMP FIGO4+3 /PROCESS THE NEXT ONE ///// FIGO6, TAD CHAR /NON-NUMERIC CHARACTERS AND F4537 TAD (200-"E SNA JMP FIGO7+1 /'E' IS SPECIAL (L=1) TAD ("E-"Z-1 STL IAC TAD ("Z-"A+1 DCA SORTCN /LETTERS [@:Z] =:= [0:26] SNL JMP FIGO5 FIGO7, TAD M314-1 /SKIP EXPONENTIAL ROUTINE DCA FIGO1 JMP I FIGO4 /L=1 ///// /READ A CHARACTER FROM TEXT OR THE INPUT DEVICE: FIGO8, 0 TAD I FLINTP /CHECK THE NEXT INSTRUCTION SMA CLA JMP ACCEPT F4537, GETC /READ FROM THE TEXT BUFFER JMP I FIGO8 ///// ASKFF, TAD INDEV /ONLY ECHO FF FROM KEYBOARD SMA CLA PRINTC ACCEPT, READC /READ FROM THE INPUT DEVICE TAD CHAR DCA I TCP /SAVE CHARACTER FOR 'FTRM' SORTJ /TEST FOR SPECIAL ACTION SPECIAL-1 ACTION-SPECIAL JMP I FIGO8 ///// ACTION, ASKEQ /EQ = RETAIN OLD VALUE ACCEPT /LF = IGNORE ASKFF /FF = CLEAR SCREEN ASKOVR /RO = PRINT '?', REPEAT ///// FTRM, TAD I TCP /RETURN LAST INPUT TERMINATOR FLOAT DCA I TCP /THEN CLEAR IT! RETURN ///// FIGO9, 0 /FLOAT A 12-BIT NUMBER - 'FLOAT' DCA HORD DCA LORD DCA OVER / TAD HORD /EXPONENT OF ZERO SHOULD BE ZERO / SZA CLA TAD P13 DCA EXP JMP I FIGO9 ///// PAGE /THIS ROUTINE EXTENDS THE FORMAT SPECIFICATIONS (%W.DD) TO /ALLOW THE NUMBER OF DIGITS PRINTED IN SCIENTIFIC NOTATION /TO BE CONTROLLED. A FORMAT OF '0' MEANS 'ALL SIGNIFICANT /DIGITS' WHILE '.05' MEANS 'JUST PRINT 5' WITH APPROPRIATE /ROUNDING. THIS FORMAT PRINTS A LEADING DIGIT FOLLOWED BY /A DECIMAL POINT, MORE DIGITS AND THEN THE EXPONENT. /ANOTHER IMPROVEMENT IS THAT THE MINUS SIGN IS ALWAYS OUT- /PUT JUST AHEAD OF THE FIRST SIGNIFICANT DIGIT AND A NEGA- /TIVE FORMAT SUPPRESSES ALL LEADING SPACES. *JMP I .&7600 /A RATHER SPECIAL LOCATION! TGO, 0 /CALLED BY 'PRINTN' DCA XRT2 /SAVE BUFFER ADDRESS TAD LASTC /GET FORMAT SAVED BY % TRAP SNA TAD . /USE DEFAULT (%5) IF ZERO AND P7600 /ISOLATE THE FIELD LENGTH RTL6 STL CIA /NEGATE AND TEST FOR ZERO DCA EXP /SAVE MINUS FIELD LENGTH TAD LASTC /GET NO. OF DECIMAL PLACES / SNA / TAD PD /USE DEFAULT IF NONE SPEC. AND P177 /A REASONABLE LIMIT! SNL /SCIENTIFIC? JMP SPM0+1 /YES, ROUND TO D PLACES TAD EXP /COMPARE FIELD SIZE SMA / D-F < 0 ? CLA CMA /NO, TAKE D = F-1 TAD T3 /COMPARE DECIMAL EXPONENT SMA / E > F-D ? SPM0, SNL SMA SZA CLA /ROUND OFF TO F PLACES STL CIA /ENTER HERE FOR SCI. NOT. DCA T1 /SAVE F-D-E (OR 0 OR -D) TAD T1 /THIS IS TRICKY BUSINESS! TAD EXP / -(E+D), -F OR -D (-D-F) SZA /LEAVE L=0 IF AC=0 STL /EXTEND THE SIGN TAD PD /COMPARE WITH LIMIT SZL /SKIPS FOR 0 < AC < PD+1 CLA /LIMIT ROUNDOFF TO DIGITS+1 TAD EX1 /ADD -PD-1 (MDM1) TO RESTORE DCA XRT /SAVE THE BUFFER POSITION CLL IAC /CLEAR LINK FOR FIRST CYCLE DCA I START /ANTICIPATE CARRY FROM 999... RNDLP, TAD XRT /GET -(BUFFER POSITION) CIA TAD XRT2 /ADD BUFFER ORIGIN DCA GETD ISZ I GETD /INCREMENT THIS DIGIT TAD I GETD SZL /NOW COMPARE IT WITH TAD M4 /5 (FIRST TIME) OR 9 TAD M5 /(L=1? THIS SETS L=0) SPA SNA CLA /CARRY REQUIRED? JMP DOSTUF /NO: GO TO OUTPUT LOOP DCA I GETD /YES: MAKE CURRENT DIGIT ZERO ISZ XRT /BEGINNING OF BUFFER REACHED? JMP RNDLP /NO: TEST THE NEXT DIGIT (L=1) ISZ T3 /YES: INCR. DECIMAL EXPONENT PD, DIGITS /MAX FIELD SIZE (PROTECTS ISZ) /THE BUFFER IS NOW SET TO (1)00000..., SO WE DECREMENT /THE POINTER TO GET THE '1' AND RE-COMPUTE THE DEC. PT. SM1 /THIS IS V-E-R-Y COMPLEX CODE!! TAD START JMP TGO+1 /(SURE HATE TO DISASSEMBLE IT!) DOSTUF, SM1 /SET SIGN FLAG DCA LASTOP /'LASTOP' KILLS SIGN IN 'PRNTLN' TAD SPM0 JMS OUTDG /'CLA' TO OMIT TAD EXP /GET FIELD SIZE SNA /FLOATING OUTPUT ? JMP FLOUT /YES TAD T3 /COMPARE WITH EXPONENT SMA SZA CLA / E > F ? JMP FLOUT+2 /YES: USE FLOATING FORMAT TAD T1 / F-D-E (OR 0 IF E > F-D) TAD T3 / F-D OR E CIA /CALCULATE -NO. OF POSITIONS DCA T1 /TO PRINT BEFORE DECIMAL PT. BACK, TAD T1 /PRINT DD.DDD TAD T3 SNA CLA / P = E ? JMP DIG /YES: PRINT DIGIT IAC /NO ('376' TO SUPPRESS 1ST ZERO) TAD T1 SPA CLA / P < 1 ? TAD SPM0 /YES: PRINT SPACE AGAIN, JMS OUTA /PRINT CHARACTER ISZ T1 /P CHARACTERS PRINTED? JMP BACK /NO SM2 /YES ('TAD 376') JMS OUTDG /PRINT DECIMAL POINT JMP BACK FLOUT, TAD T1 /SET FIELD SIZE DCA EXP / -D SM1 /SET FLAG DCA OUTA ISZ TGO /SET SECOND RETURN DIG, CMA TAD T3 /REDUCE E BY 1 DCA T3 JMS GETD /GET NEXT DIGIT ISZ OUTA /TEST FLAG JMP AGAIN /NORMAL RETURN JMS OUTDG /PRINT FIRST FLOATING DIGIT SM2 /CREATE A PERIOD (256-260) SKP /DON'T FETCH & DON'T COUNT JMS GETD /FETCH NEXT DIGIT JMS OUTA /PRINT IT JMP .-2 /AND REPEAT OUTA, 0 JMS OUTDG /PRINT CHARACTER ISZ EXP /F CHARACTERS PRINTED? JMP I OUTA /NO: RETURN JMP I TGO /YES: NUMBER FINISHED ///// GETD, 0 /ROUTINE TO UNLOAD BUFFER ISZ EX1 TAD EX1 /TEST FOR END OF SIGNIFICANT FIG. SPA CLA TAD I XRT2 /AUTO-INDEX REG. SETUP UPON ENTRY JMP I GETD ///// OUTDG, 0 /PRINT C(AC) AS A SINGLE DIGIT SMA /IGNORE SPACES AND THE LIKE OR ISZ LASTOP /DIGITS OTHER THAN THE FIRST ! JMP DGOUT DCA LASTOP /SAVE THE FIRST DIGIT TAD I GET10X&177 JMS OUTSUB /PRINT THE SIGN TAD LASTOP DGOUT, TAD P17 /FORM (ASCII-SPACE) JMS OUTSUB JMP I OUTDG ///// OUTSUB, 0 /ROUTINE TO SUPPRESS SPACES TAD T2 /SUM 'NO SPACE SW' AND CHAR SNA JMP I OUTSUB /NEG. FORMAT: IGNORE SPACES TAD DIG AND P177 /REMOVE GARBAGE PRINTC JMP I OUTSUB ///// FTAB, TAD I TABCNT /GET CURRENT PRINT POSITION FL0ATR PAGE /FLOATING POINT OUTPUT CONVERSION: 'PRINTN' /REWRITTEN TO PROVIDE TWO NEW FEATURES: (1) A 'FLOATING' /MINUS SIGN WHICH APPEARS BEFORE THE FIRST DIGIT; (2) A /PROVISION FOR NON-PRINTING CALLS, WHICH SET UP THE OUT- /PUT BUFFER, BUT DO NOT DO ANY PRINTING. /THANKS TO JIM CRAPUCHETTES FOR SOME SPACE-SAVING IDEAS! FLOUTP, 0 /CONVERT BINARY TO ASCII DCA T2 /SET THE NON-PRINT FLAG FX10P, STL IAC DCA T3 /INITIALIZE THE EXPONENT JMS I ABSOL /TAKE THE ABSOLUTE VALUE CMA RAR /NEGATIVE VALUES SET L=0 SMA AND P14 DCA NXT10X /SAVE SIGN CHARACTER(-1) TAD HORD SNA CLA /ZERO? JMP FGO3 FGO1, FENT /NUMBER TOO LARGE FMUL FLP1 /MULTIPLY BY .1 FEXT ISZ T3 /INCREASE DECIMAL EXPONENT TAD EXP SMA SZA CLA /CHECK THE BINARY EXPONENT JMP FGO1 FGO2, JMS I FX10P /TOO SMALL - MULTIPLY BY 10. CMA TAD T3 /DECREASE DECIMAL EXPONENT DCA T3 TAD EXP /CHECK THE BINARY EXPONENT SPA SNA JMP FGO2 FGO3, CMA /NEGATE THE BIT COUNT DCA EXP TAD MDM1 /INITIALIZE DIGIT COUNT DCA SIGN TAD START /INITIALIZE BUFFER POINTER DCA XRT2 FGO4, DCA EX1 /SHIFT OUT THE FIRST DIGIT SHIFTL TAD EX1 RAL ISZ EXP JMP FGO4 SKP FGO5, MULT10 /IE. 0.672 X 10 = 6 + 0.72.. ETC. DCA I XRT2 ISZ SIGN /ALL DIGITS OUTPUT? JMP FGO5 /NO: CONTINUE TAD MDM1 DCA EX1 /SAVE NO. OF DIGITS TAD START /GET BUFFER POINTER ISZ T2 /TEST PRINT FLAG JMS I .+1 /OUTPUT MANTISSA JMP I FLOUTP /FIXED POINT DONE TAD P25 /PRINT 'E' JMS I (OUTDG FGO6, TAD T3 /GET EXPONENT SPA CLA /TEST SIGN SP2 /+2 -> -3 TAD M5 JMS I (OUTDG /PRINT SIGN SMQ TAD T3 SPA CIA MQL DVI /DIVIDE BY ONE HUNDRED P144 DCA T3 /SAVE TENS AND UNITS RMQ /PRINT QUOTIENT SMA SZA /UNLESS IT'S ZERO JMS I (OUTDG TAD T3 /NOW PRINT REMAINDER JMS PRNT JMP I FLOUTP /FLOATING POINT DONE ///// PRNT, 0 /PRINT TWO DECIMAL DIGITS AND P177 SMQ DVI /DIVIDE BY TEN P12 DCA T3 IAC DCA T2 RMQ /GET QUOTIENT JMS I (OUTDG TAD T3 /GET REMAINDER JMS I (OUTDG JMP I PRNT ///// MDM1, -DIGITS-1 FLP1, -3;3146;3146;3147 XPRNT, 0 /PRINT A LINE NO. - 'PRNTLN' TAD FGO3 DCA CHAR /SET UP A SPACE TAD LINENO SNA JMP I XPRNT /NO NUMBER FOR HEADER LINE RTL6 AND P77 JMS PRNT /TWO-DIGIT GROUP NUMBER SM2 JMS I (OUTDG /DECIMAL POINT TAD LINENO JMS PRNT /TWO-DIGIT STEP NUMBER, PRINTC /AND A SEPARATING SPACE JMP I XPRNT /ENTRY POINT IS 'QSWTCH' ///// NXT10X, 0 /GET 10X NEXT ARG - 'GET10X' PUSHJ EVAL JMS I FX10P FIXIT JMP I NXT10X /USED BY 'HESITATE', 'FQUE' /THIS IS A VERY HANDY ROUTINE FOR CONVERTING BCD DATA TO /BINARY FLOATING POINT FORM. JUST SET EXP=43 AT THE END. XTEN, 0 /MULTIPLY FLAC BY TEN - 'MULT10' SMQ /AND ADD IN C(AC) TAD OVER SWP MUY /THANKS TO REV. GEOFFREY CHASE P12 /FOR SUGGESTING AN EAE VERSION SWP DCA OVER TAD LORD SWP MUY P12 SWP DCA LORD TAD HORD SWP MUY P12 SWP DCA HORD RMQ /AC=OVERFLOW JMP I XTEN /EXECUTION TIME = 50 MICROSECONDS ///// PAGE /LINEFEED DURING INPUT: RETYPE THE LINE LNFEED, TAD I TABCNT /WHERE ARE WE? SNA CLA JMP LFEXIT /IGNORE THE LF AFTER A CR TAD LASTC DCAIAXIN /SAVE THE LAST CHARACTER TAD BUFR DCA AXOUT /SET 'TEXTP' DCA XCT TAD CCR /START WITH A CR PRINTC TAD CSTAR /THEN PRINT A STAR ISZ I QSWTCH /DISABLE '?' TRAP LFCONT, PRINTC /RETYPE THE INPUT LINE GETC TAD AXIN CIA /THROUGH THE CURRENT POSITION TAD AXOUT SZA CLA JMP LFCONT TAD T3 /CHECK FOR AN EXTRA CHARACTER SPA CLA PRINTC CMA LFEXIT, TAD AXIN JMP I LFEND /RESET PACKING POINTERS ///// MULT2, 0 /MULTIPLY FLAC BY 2 - 'SHIFTL' TAD OVER CLL RAL DCA OVER TAD LORD RAL DCA LORD TAD HORD RAL DCA HORD JMP I MULT2 /DOES NOT CHANGE 'EXP' ///// *RMF+1 TRPLAD, 0 /TRIPLE PRECISION ADDITION CLL TAD OVR1 TAD OVER DCA OVER RAL TAD AC1L TAD LORD DCA LORD RAL TAD AC1H TAD HORD DCA HORD JMP I TRPLAD /CHARACTER INPUT/OUTPUT ROUTINES: 'READC' AND 'PRINTC' /THE INPUT ROUTINE MAY ALSO BE USED TO ECHO A CHARACTER. CHIN, 0 /READ (OR ECHO) A CHARACTER SNA JMS I INDEV /'READC' IF AC=0 DCA CHAR /'ECHOC' IF AC#0 SORTJ ECHOLST-1 /WATCH FOR: LF, FF, RO CSP, ECHOGO-ECHOLST JMP IECHO TAD INDEV /ONLY FILES ECHO FF,RO SPA CLA IECHO, PRINTC /'ZERO' IF NOT ECHOING JMP I CHIN ///// CHOUT, 0 /OUTPUT A CHARACTER - 'PRINTC' CDF P SNA /USE AC IF NON-ZERO TAD CHAR /OTHERWISE USE CHAR TAD M15 SZA /TEST FOR 'CR' JMP NOTCR DCA I TABCNT /CLEAR TAB COUNTER TAD CCR JMS I OUTDEV /OUTPUT CR, LF SM3 NOTCR, TAD (CR-SP /CONTROL CODE? SMA ISZ I TABCNT /NO: BUMP COUNTER I0N TAD CSP /REPLACE TEST BIT JMS I OUTDEV JMP I CHOUT ///// /FILE INPUT/OUTPUT ROUTINES: OCHAR, 0 /FILE OUTPUT VIA (OUTDEV) CDI L JMP OCHAR0 JMS I OECHO /ECHO JMP I OCHAR ICHAR, 0 /FILE INPUT VIA (INDEV) CDI L JMP ICHAR4 /CALL LOWER FIELD JMP I ICHAR ///// OECHO, XOUTL /ECHO DEVICE /CALLS TO AND FROM THE TAB ROUTINES IN FIELD 0: TABX, GETC /EVALUATE THE COLUMN NO. GETNXT CIF L JMP ZER+1 /SAME PAGE, FIELD 0 SKPX, JMS CHIN /NEGATIVE COL. NO. CIF L JMP NEG+2 /RETURN TO LOWER FIELD CPRNT, 0 /'PRINTC' FOR DOWN BELOW JMS CHOUT CDI L JMP I CPRNT ///// FNEW=. / 17(10) LOCATIONS FOR USER ADDITIONS! ///// *.!177-10 /MAGIC LOC (SEE BELOW) FLEN, TAD HORD /CHECK THE FILE LENGTH CDI L SZA CLA /ARG 0=OUTPUT, 1=INPUT JMP I . LFEND, LFRTN /NOP JMP I . FBLK, TAD RMF /GET LOC OF INPUT FILE FL0ATR *RMF /BLOCK # SAVED BY 'O I' 0 PAGE