ASMB,Q,C * * **************************************************************** * * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979. ALL RIGHTS * * * RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, * * * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT * * * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY. * * **************************************************************** * * NAME: PART OF MATH LIBRARY * SOURCE: 24998-18XXX SEE NAM FOR LAST THREE DIGITS * RELOC: PART OF 24998-12001 * PGMR: BG & JTS * HED "FRMTR" REAL TIME FORTRAN FORMATTER. NAM FRMTR,6 24998-1X231 REV.2001 790503 ENT .FRMN,.LS2F,.INPN,.DTAN EXT .FLUN,.CFER,.XPAK,$SETP EXT .ZRNT EXT IFIX,FLOAT,.LBT,.SBT A EQU 0 B EQU 1 SPC 1 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * F O R T R A N * * * * I / O * * * * P R O G R A M * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * THE FORTRAN I/O PROGRAM PROVIDES FOR ALL INPUT AND * OUTPUT SERVICES SPECIFIED BY THE -HP-2116 FORTRAN * COMPILER. THIS INCLUDES THE FOLLOWING TYPES OF * FORTRAN STATEMENTS: * * I WRITE (,) * II READ (,) * III WRITE () * IV READ () * * THE FIRST TWO STATEMENTS PROVIDE FOR FORMATTED * INPUT/OUTPUT, THE LAST TWO FOR BINARY INPUT/ * OUTPUT. A SPECIAL FORM OF THE TYPE II STATEMENT * IS FREE-FIELD INPUT. THIS IS SPECIFIED BY A STAR * IN THE FORMAT FIELD. * * IN ADDITION TO THE USUAL BASIC FORTRAN FORMAT SPE- * CIFICATIONS, THE FOLLOWING SPECIFICATIONS ARE RE- * COGNIZED: * * 1) Q-FORMAT: THIS CAN BE USED TO OUTPUT A CHARACTER * STRING WITHOUT EXPLICITLY SPECIFYING THE NUMBER * OF CHARACTERS. ITS FORM IS: * " " * * 2) FREE-FIELD INPUT: THIS ALLOWS FOR INPUT DATA * WITHOUT ANY PARTICULAR FORMAT BEING SPECIFIED. * * FOR THE REAL TIME SYSTEM, FRMTR IS USED FOR DATA CONVERSION * AND FMTIO IS USED FOR I/O. IN THIS WAY FRMTR CAN BE MADE * RE-ENTRANT. FRMTR ACCEPTS AS INPUT A FORMAT STRING AND,FOR * INPUT, A CHARACTER STRING OR, FOR OUTPUT, A SINGLE VARIABLE. * THE NECESSARY DATA CONVERSION IS PERFORMED,AND FRMTR RETURNS * TO FMTIO. ITEMS THAT MUST BE SAVED ARE STORED IN FMTIO AND * REFERENCED INDIRECTLY BY FRMTR. SKP * THE PROGRAM ITSELF CONSISTS OF THREE SETS OF * ROUTINES. THESE CAN BE CLASSIFIED AS: * * 1) THE FORMAT ANALYZER. THESE ROUTINES ARE RESPON- * SIBLE FOR SCANNING THE FORMAT STRING AND PASSING * CONTROL TO THE CORRECT CONVERSION ROUTINE. * * 2) THE CONVERSION ROUTINES. THESE ROUTINES ARE THE * ONES THAT PERFORM THE ACTUAL CONVERSION BETWEEN * INTERNAL AND EXTERNAL REPRESENTATIONS. * * 3) THE COMMUNICATION ROUTINES. THESE ARE THE ROU- * TINES THAT ARE ACTUALLY CALLED BY THE FORTRAN * PROGRAM. THEY ESSENTIALLY DRIVE THE ROUTINES * OF CLASSES 1 AND 2. * * THE CALLING SEQUENCES ARE AS FOLLOWS: * *********************************************************************** * INITIALIZATION CALL: * * BINARY INPUT/OUTPUT * * JSB .BIO. (A=UNIT, B=0 FOR OUTPUT, 1 FOR INPUT) * * DECIMAL INPUT/OUTPUT * * JSB .DIO. (A=UNIT, B=0 FOR OUTPUT, 1 FOR INPUT) * DEF BUFFER (ONLY IF UNIT=0) * DEF FORMAT (=0 FOR FREE-FIELD INPUT) * DEF ENDLIST * * WHEN UNIT=0, THE FORMATTER WILL CONVERT DIRECTLY TO OR FROM * THE USER'S BUFFER. NO ACTUAL I/O WILL TAKE PLACE. ************************************************************************ * CONTINUATION CALLS: * * Single element I/O: * * JSB .zIO. z=I,J,R,X,T * DEF JSB .IOz. z=I,J,R * * Array I/O: * * JSB .zAY. z=I,J,R,X,T LDA length * DEF
LDB address * DEC JSB .zAR. z = I,J,R,X,T * * Where the letters I,J,R,X,T are for 1 & 2-word integer and * 2, 3 & 4-word floating, in that order. *********************************************************************** * TERMINATION CALL: (USED ONLY FOR OUTPUT) * * JSB .DTA. SKP * SUBROUTINE ENTRY POINTS. * TDB NOP ABS TDBND-* THIS MANY WORDS MUST BE STACKED TO NOP SUPPORT REENTRANTCY. TRNAD NOP JMP TRNAX F2LST NOP JMP F2LSX DTA NOP JMP DTX FCHAR NOP JMP FCHAX OUTCR NOP JMP OUTCX INCHR NOP JMP INCHX DIGIT NOP JMP DIGIX FINTG NOP JMP FINTX RFCHK NOP JMP RFCHX WGET NOP JMP WGEX WSET NOP JMP WSEX WDFIX NOP JMP WDFIZ WDGET NOP JMP WDGEX OUTPT NOP JMP OUTPX OUTP1 NOP JMP OUTPZ MTPLO NOP JMP MTPLX GETDG NOP JMP GETDX NORML NOP JMP NORMX INPUT NOP JMP INPUX .XCOM NOP JMP XCOMX PTEN NOP JMP PTENX MULT NOP JMP MULTX DIVD NOP JMP DIVDX RSN NOP JMP RSNX LSONE NOP JMP LSONX INDIG NOP JMP INDIX ABLKS NOP JMP ABLKX BCKUP NOP JMP BCKUX * * INDIRECTS FROM FMTIO. * AADX DEF 0 ADDR VARIABLE. TYPE BSS 1 TYPE. LENTH BSS 1 LENGTH. SKIP BSS 1 FREE FIELD SKIP FCR BSS 1 FORMAT POINTER CCNT BSS 1 BUFFER COUNT CMAX BSS 1 MAX VALUE OF CCNT AFTER TAB LEFT. BCR BSS 1 BUFFER POINTER IO BSS 1 FLAG FOR I/O SKIPL BSS 1 FOR UNLIMITED GROUPS TSCAL BSS 1 SCALE FACTOR SCALE BSS 1 USED FOR F AND I FIELDS NEST BSS 1 NEST LEVEL FOR GROUPS. CFLAG BSS 1 COMMA CHECK FOR FREE F. BCRS BSS 1 SAVE BCR F2LSI BSS 1 ENTRANCE INTO FRMTR SWITH BSS 1 TYPE OF EXIT FOR FMTIO. * 1-5:ERR1-5. * 6:F2LST * 7:ENDLS * 8:DTA (NEW RECORD) RNEST BSS 1 NEST FOR UNLIMITED GROUPS ADRFD BSS 1 INDEX FOR RFLD RF BSS 1 REPEAT FIELD. WSAVE BSS 1 DSAVE BSS 1 GFLAG BSS 1 .OBUF BSS 1 EORD BSS 1 OFLAG BSS 1 OLD-NEW DEFINITIONS FLAG ATMP EQU EORD FLAG FOR A VS. R FORMAT. DTAI EQU EORD ENTRANCE AFTER I/O. SPC 3 * MANTISSA AND "XEQ", A ROUTINE FOR VARIABLE SHIFTING. * MANT BSS 5 MANTISSA OF NUMBER BEING CONVERTED. XEQ NOP NOP TDBND JMP XEQ,I (NEED NOT BE SAVED) SKP * TEMPS LOCAL TO NAMED ROUTINES. * MULTA EQU FCHAR MULTB EQU OUTCR MULTC EQU INCHR MULTD EQU DIGIT DIVDA EQU FCHAR DIVDB EQU OUTCR DIVDC EQU INCHR DIVDD EQU DIGIT DIVDE EQU WGET DIVDF EQU WSET PTENA EQU OUTP1 PTENB EQU MTPLO MTPL1 EQU XEQ MTPL2 EQU XEQ+1 FINTA EQU XEQ QTYPA EQU XEQ QTYPB EQU XEQ+1 ATYPA EQU WGET ATYPB EQU WSET TTYPA EQU XEQ+1 INDIA EQU OUTP1 INPUA EQU XEQ INPUB EQU XEQ+1 INPUC EQU WGET INPUD EQU WSET OUTA EQU OUTP1 GETDB EQU XEQ+1 NORMA EQU GETDG NORMB EQU DIVD * * GLOBAL TEMPS. * GETDA EQU XEQ GETDC EQU WGET ADX EQU F2LST DIRECT ADDR VARIABLE. EXP EQU WDFIX EXPONENT W EQU NORML -W D EQU .XCOM -D-1 EFLAG EQU WDGET THE E FORMAT FLAG DBLNK EQU OUTPT FLAG FOR SKIPPING BLANKS IN FMT BCNT EQU MTPLO COUNTS LEADING BLANKS FOR OUTPOT EXPON EQU DTA EXPONENT PART OF NUMBER EXPNS EQU INDIG COPY OF EXPON FOR G-FORMAT. SGDIG EQU OUTPT FOR NEG SCALE FACTORS, E-FORMAT. OCONT EQU PTEN # ZEROES FOR E SCALE FACTOR. POST EQU WDGET INPUT CONTROL INDICATOR SIGN EQU ABLKS SIGN OF NUMBER. MANTP EQU TRNAD FWA WORKING AREA IN MANTISSA MANTL EQU FINTG LWA DITTO OVTOG EQU RFCHK FLAG INDICATING OUTPUT BUFFER OVERRUN. SKP * ADDRESS CONSTANTS & SHIFT INSTRUCTIONS. * MULTZ DEF MULT DIVDZ DEF DIVD AAADX DEF AADX TO SEE IF ADDRESSES NEED BE RESET. AMANT DEF MANT FWA MANTISSA AMNT3 DEF MANT+3 LWA USED BY .XCOM MANTE DEF MANT+5 LWA+1 MANTISSA RRR16 RRR 16 RRL16 RRL 16 * * NUMERIC AND CHARACTER CONSTANTS. * NUMAD ABS OFLAG-AADX+1 NUMBER OF ADDRESSES FROM FMTIO NEG1 OCT 100000 LOGICAL TRUE. MIN72 OCT -72 -"9"-1 MIN5 DEC -5 MIN4 DEC -4 MIN3 DEC -3 MIN2 DEC -2 MIN1 DEC -1 ....2 DEC 2 ....3 DEC 3 ....6 DEC 6 ....8 DEC 8 ....9 DEC 9 .177 OCT 177 BLANK OCT 40 CHARACTER CONSTANTS. QUOTE OCT 42 " "$" OCT 44 "&" OCT 46 PLUS OCT 53 COMMA OCT 54 MINUS OCT 55 "." OCT 56 "/" OCT 57 "0" OCT 60 "1" OCT 61 "7" OCT 67 "@" OCT 100 "D" OCT 104 "E" OCT 105 "F" OCT 106 "L" OCT 114 "P" OCT 120 "R" OCT 122 "T" OCT 124 _"Y" OCT -131 -"Y" "Y_@" ABS 131B-100B "Y"-"@" "@_&" ABS 100B-046B "@"-"&" "0_." EQU ....2 "0"-"." HED ENTRY POINTS. * GENERAL ENTRY ROUTINE. * TRNAX LDA MIN4 FIND ORIGIONAL CALLER ADA TRNAD NOP ADDRESS LDB A,I GET NOP'S CONTENTS INA NOW GET THE POSSIBLE LDA A,I JSB $LIBR?? STA .LS2F+1 FIX UP P+1 OF OTHER CALLS STA .DTAN+1 SSA,RSS IS IT A JSB $LIBR? STB TDB+2 NO, SET THE TDB RETURN LDB AAADX LDA TDB+2,I CPA B,I CHECK IF ADDRESSES NEED SETTING JMP SAME NO, SKIP IT JSB $SETP SET UP INDIRECTS FROM FMTIO. DEF NUMAD SAME LDA AADX,I COPY ADDR VARIABLE. STA ADX ISZ TDB+2 SKIP PARAM JMP TRNAD,I * * FORMATTED I/O ENTRY POINT. * .FRMN NOP ENTRANCE TO FORMAT SCANNER JSB .ZRNT DEF LIBX JSB TRNAD CCA SET FLAG THAT NO LIST ITEM PROCESSED YET. STA ADX JMP FORMT * * FREE-FIELD INPUT ENTRY. * .INPN NOP ENTRANCE FOR FREE FIELD INPUT JSB .ZRNT 1ST ENTRY IF FREE FIELD INPUT DEF LIBX1 DEF ANOTHER LIBX JSB TRNAD JSB INPUT LIBX1 JMP TDB+2,I RETURN DEF TDB DEC 0 SKP * ROUTINE TO REQUEST LIST ELEMENT FROM FMTIO. * F2LSX LDA F2LST STA F2LSI,I LDA ....6 STA SWITH,I JMP LIBX .LS2F NOP ENTRANCE FROM ELEMENT LIST JMP * STALL IF CALLED BEFORE .FRMN DEF TDB JSB TRNAD TRANSFER ADDRESSES LDA F2LSI,I JMP A,I ENTER FORMATTER * * ROUTINE TO REQUEST I/O FROM FMTIO. * DTX LDA DTA STA DTAI,I LDA ....8 STA SWITH,I LIBX JMP TDB+2,I DEF TDB DEC 0 .DTAN NOP ENTRANCE AFTER AN I/O REQUEST JMP * STALL IF CALLED BEFORE .FRMN DEF TDB JSB TRNAD LDA DTAI,I JMP A,I RETURN TO THE DTA CALL * * ERROR EXITS. * ERR1 LDA ....1 JMP STERR ERR2 LDA ....2 JMP STERR ERR3 LDA ....3 JMP STERR ERR4 LDA ....4 JMP STERR ERR5 LDA ....5 STERR STA SWITH,I JMP LIBX HED SOME UTILITY ROUTINES ********************* * UTILITY ROUTINES * ********************* * * THE ROUTINES THAT HANDLE CHARACTER MANIPULATION USE * STANDARD BYTE ADDRESSES. SPC 5 * CALL: JSB FCHAR * RETURNS: A = THE NEXT VALID FORMAT STRING CHARACTER * B = MEANINGLESS * * BLANKS ARE IGNORED DEPENDING ON THE FLAG DBLNK. SPC 2 FCHAX ISZ FCR,I A _ NEXT FORMAT CHAR. LDB FCR,I LOAD CHARACTER INTO A AND TEST JSB .LBT FOR BLANK OR COMMA LDB DBLNK SKIP BLANKS IF DBLNK=1 CPA BLANK CHAR=BLANK ? SZB,RSS AND DBLNK.NE.0 ? JMP FCHAR,I NO, DONE. JMP FCHAX YES, SKIP THE BLANK. SPC 4 * CALL: LDA CHAR * JSB OUTCR * RETURN: A = OVTOG * B = NEXT BYTE ADDRESS IN THE OUTPUT BUFFER SPC 2 OUTCX ISZ CCNT,I A<7:0> PLACED IN OUTPUT. END OF BUFFER ? JMP OUTC1 CCA YES-- RESET CCNT AND RETURN STA CCNT,I JMP OUTC2 SET OVTOG TO SAY BUFFER IS BOMBED OUTC1 ISZ BCR,I ADVANCE BUFFER POINTER LDB BCR,I JSB .SBT STORE CHARACTER IN BUFFER. CLA CLEAR OVTOG AND WERE OKAY OUTC2 STA OVTOG JMP OUTCR,I RETURN. SKP * CALL: JSB INCHR * RETURN: A = THE NEXT CHARACTER IN THE INPUT STRING OR A BLANK * B MEANINGLESS SPC 3 INCHX LDA CCNT,I A_NEXT INPUT CHAR. IF CCNT=0 THEN SZA,RSS RETURN A JMP RTBNK BLANK ISZ CCNT,I IF CCNT=-1 THEN SKIP JMP GETC CCA RESET CCNT TO -1. STA CCNT,I LDA POST IF BEGINNING OF NUMBER SCAN IOR FCR,I IN FREE FIELD INPUT SZA JMP RTBNK LDA ....7 STA SWITH,I JMP LIBX GO TO END OF LIST RTBNK LDA BLANK OTHERWISE RETURN A BLANK JMP INCHR,I GETC ISZ BCR,I IF CCNT <-1 THEN LDB BCR,I JUST JSB .LBT GET THE NEXT JMP INCHR,I CHARACTER SKP * CALL: LDA CHAR * JSB DIGIT * RETURN: P+1 CHAR IN A NOT A DIGIT * A = CHAR * P+2 CHAR IN A A DIGIT * A = B = VALUE. SPC 2 DIGIX LDB A TESTS CHARACTER IN A FOR A DIGIT * * IF IT IS RETURN THE TRUE * * DIGIT IN A AND SKIP. ELSE * * RETURN THE CHARACTER AND ******************************* DON'T SKIP. ADB MIN72 CHARACTERS > '9' REMAIN POSITIVE SSB,RSS SKIP IF B NEGATIVE JMP DIGIT,I RETURN...NOT A DIGIT ADB ...10 CHARACTERS < '0' REMAIN NEGATIVE SSB JMP DIGIT,I RETURN...NOT A DIGIT ISZ DIGIT BUMP RETURN ADDRESS LDA B PLACE THE DIGIT IN A JMP DIGIT,I SPC 3 ******************************* FINTX JSB DIGIT COMPUTES THE INTEGER IN THE FOR- * * MAT STRING. THE FIRST DIGIT ******************************* IS ALREADY IN A. MAX VALUE 511. JMP FINTG,I IF NOT A DIGIT ISZ FINTG ELSE GOOD RETURN (IF ANY) FINT1 STA FINTA SAVE RESULT SO FAR JSB FCHAR GET NEXT CHARACTER JSB DIGIT CHECK FOR DIGIT JMP GOTIT END OF INTEGER CLO MULTIPLY RESULT SO FAR BY 10. LDB FINTA *1 ADB B *2 ADB B *4 ADB FINTA *5 ADB B *10 ADA B ADD THAT TO CURRENT DIGIT. LDB A LIMIT VALUE TO 16383. ADB B BY DOUBLING THE FINAL VALUE IN (B). SOS DID IT FIT ? JMP FINT1 YES. LOOP. JMP ERR1 NO. ERROR. * GOTIT CCB BACK UP FORMAT POINTER ADB FCR,I STB FCR,I LDA FINTA RETURN WITH JMP FINTG,I RESULT IN A HED FORMAT ANALYZER * * * THE FOLLOWING SECTION IS THE FORMAT ANALYZER. CONTROL IN * * HERE IS GOVERNED BY THE CONTROL LOOP, WHICH EXAMINES THE * * FORMAT AND PASSES CONTROL TO THE VARIOUS CONVERSION ROU- * * TINES. SINCE TERMINATION OF THE I/O STATEMENT IS DETER- * * MINED BY THE CALLING SEQUENCE, EACH CONVERSION ROUTINE * * MUST CHECK THE LIST BEFORE PERFORMING A CONVERSION. THIS * * IS DONE BY CALLING A ROUTINE CALLED F2LST. THE SOLE FUNC-* * TION OF THIS ROUTINE IS TO HOLD THE ADDRESS FROM WHICH * * IT WAS CALLED, AND THEN TO GET BACK TO THE CALLING * * SEQUENCE. THE CALLING SEQUENCE WILL THEN PASS CONTROL * * BACK THROUGH THE COMMUNICATION ROUTINES (SEE ABOVE). * * EACH OF THESE CALLS A ROUTINE CALLED LST2F, WHICH GETS * * BACK TO THE FORMATTER BY USING THE ADDRESS LEFT AT * * F2LST. * * * ******************************************************************** RFCHX ISZ RF,I CHECK REPEAT. IF RF GOES TO ZERO, JMP RFCHK,I CONTROL FALLS THROUGH TO FORMT. FORMT CLA,INA SET DBLNK FOR SKIPPING. STA DBLNK STA GFLAG,I LDA "E" STA EORD,I LDB TSCAL,I SCALE FACTOR CMB,INB STB SCALE,I CCA FORM1 STA RF,I SET REPEAT FIELD AT ONE. * * GET FORMAT CHARACTER AND GO TO APPROPRIATE ROUTINE. * FORM2 JSB FCHAR GET THE CHARACTER AND TEST IT ADA _"Y" -"Y" SSA,RSS >X ? JMP FORM3 YES. ADA "Y_@" +"Y"-"@" SSA <@ ? JMP FORM3 YES. ADA FMTBL IN [@,X], USE JUMP TABLE. LDA A,I A = ADDR ROUTINE TO HANDLE CHAR. JMP A,I SKP FORM3 ADA "@_&" +"@"-"&" CPA MIN4 " JMP QTYPE CPA ....1 ' JMP QTYPE CPA ....2 ( JMP LPTYP CPA ....3 ) JMP RPTYP CPA ....6 , JMP FORM2 CPA ....7 - JMP MTYPE CPA ....9 / JMP INOUT ADA "&" RESTORE ORIGINAL CHAR. JSB FINTG LAST CHANCE: NUMBER JMP ERR3 CMA,INA,SZA,RSS JMP STRNP JMP FORM1 * * JUMP TABLE FOR FORMAT CHARACTERS "@" THRU "X". * FMTBL DEF *+1 DEF OTYPE @ DEF ATYPE A DEF ERR3 B DEF ERR3 C DEF DTYPE D DEF ETYPE E DEF FTYPE F DEF GTYPE G DEF HTYPE H DEF ITYPE I DEF ERR3 J DEF OTYPE K DEF LTYPE L DEF ERR3 M DEF ERR3 N DEF OTYPE O DEF PTYPE P DEF ERR3 Q DEF RTYPE R DEF ERR3 S DEF TTYPE T DEF ERR3 U DEF ERR3 V DEF ERR3 W DEF XTYPE X HED P, X & H SPECIFICATIONS. ***************************************** * * * FOLLOWING ARE THE CONVERSION ROUTINES * * * ***************************************** SPC 3 MTYPE JSB FCHAR GET NEGATIVE SCALE FACTOR. JSB FINTG TEST FOR NUMBER JMP ERR1 NOT A DIGIT STRNP STA TSCAL,I JSB FCHAR MAKE SURE NEXT CPA "P" CHARACTER IS P. JMP FORMT JMP ERR3 TOO BAD. * PTYPE LDA RF,I STA TSCAL,I JMP FORMT SPC 3 ********************************** * HTYPE HANDLES H-CONVERSION * ********************************** HTYPE CLA SET FOR NO STA DBLNK SKIPPING HLOOP LDB IO,I WHICH WAY? SZB,RSS JMP HOUT OUT JSB INCHR IN ISZ FCR,I ADVANCE FORMAT COUNTER LDB FCR,I JSB .SBT PLACE INTO FORMAT HCHEK JSB RFCHK TEST RF JMP HLOOP HOUT JSB FCHAR GET A CHAR FROM STRING JSB OUTCR OUTPUT IT JMP HCHEK HED T SPECIFICATION. TTYPE JSB FCHAR GET DIGIT, L OR R. CPA "R" R ? JMP TR1 YES. LDB BCR,I NO. B = (ADDR CURRENT COLUMN)-1 CMB -(ADDR CUR COL) ADB .OBUF,I -(ADDR CUR COL)+(ADDR COL 1)/2 ADB .OBUF,I -(ADDR CUR COL)+(ADDR COL 1) ADB MIN1 -(CURRENT COL #) STB TTYPA CPA "L" L ? JMP TL1 YES. * * T-FORMAT. CONVERT TO RELATIVE TAB. * JSB FINTG NUMBER ? JMP ERR3 NO, ERROR. ADA TTYPA M = REL TAB = N-(CUR COL #) SSA,RSS WHICH WAY ? JMP TR2 RIGHT. M >= 0. CMA,INA LEFT. TL GETS -M > 0. JMP TL2 * * TL-FORMAT. IF NEW COL < 1, SET TO 1. * TL1 JSB FCHAR GET AMOUNT TO GO LEFT. (-M) JSB FINTG JMP ERR3 IF NO NUMBER. TL2 STA B CHECK IF COL < 1 (INCLUDES T0) ADB TTYPA -(NEW COL) CMA,INA M SSB,INB,RSS NEW COL > 0 ? ADA B NO, M = 1 - (CURRENT COL) LDB CCNT,I SEE IF OLD POSITION WAS MAX REACHED. CMB,CLE,INB -CCNT ADB CMAX,I CMAX-CCNT (E=0 IFF B<0) LDB CCNT,I TO SET NEW MAX. SEZ,RSS IS CCNT > CMAX ? STB CMAX,I YES, SET NEW MAX COLUMN. TL3 STA B UPDATE BCR & CCNT. ADB CCNT,I ADA BCR,I STA BCR,I STB CCNT,I JMP FORMT DONE. SKP * TR-FORMAT. IF NEW COL > LAST COL, SET TO LAST+1. * XTYPE LDA RF,I X FORMAT: CHANGE NX TO TRN. CMA,INA JMP TR2 TR1 JSB FCHAR GET AMOUNT TO GO RIGHT. JSB FINTG JMP ERR3 IF NOT A NUMBER. TR2 STA B M ADB CCNT,I CCNT+M. SSB SHOULD BE < 0. JMP TR3 IS, O.K. LDA CCNT,I CMA M = -CCNT-1 TR3 LDB IO,I IN OR OUT ? SZB JMP TL3 IN. STA B OUT. B=M. SEE IF OLD POS > OLD MAX. LDA CCNT,I CMA,INA -OLD POS. ADA CMAX,I CMAX-CCNT SSA CCNT > CMAX ? (NOW AT MAX ?) JMP TR4 YES. JUST OUTPUT SPACES. LDA B A=B=M. IS NEW POS > OLD MAX ? ADB CCNT,I NEW CCNT. CMB,INB -CCNT. ADB CMAX,I CMAX-CCNT SSB,RSS CCNT > CMAX ? JMP TL3 NO, JUST POSITION TO NEW POSITION. ADA B YES. A = AMNT TO ADVANCE TO GET TO CMAX. ADA BCR,I ADVANCE TO CMAX. STA BCR,I LDA CMAX,I STA CCNT,I CMB,INB OUTPUT EXCESS SPACES. TR4 LDA BLANK JSB MTPLO JMP FORMT HED SLASH & L SPECIFICATIONS. * INOUT HANDLES THE SLASH IN A FORMAT. * INOUT JSB DTA JSB RFCHK JMP INOUT SPC 4 LTYPE CLA JSB WGET LLOOP JSB F2LST GET LIST ITEM. JSB WSET SET UP W. LDB IO,I WHICH WAY? SZB,RSS JMP LOUT LIN JSB INCHR SKIP BLANKS UNTIL CPA BLANK FIND A T OR F. JMP NEXTC IF RUN OUT OF FIELD, ERROR 4. CLB,INB B<0> = NOT FOUND FLAG. CPA "T" LDB NEG1 IF TRUE, MANT = 100000B CPA "F" CLB SLB FOUND ONE ? JMP ERR5 NO, ERROR. STB ADX,I YES, STORE RESULT. JMP *+2 SKIP REST OF FIELD. JSB INCHR ISZ W JMP *-2 LTYP1 JSB RFCHK CHECK FOR REPEATS JMP LLOOP * NEXTC ISZ W JMP LIN JMP ERR5 SPC 2 LOUT LDA BLANK OUTPUT W-1 LEADING BLANKS. LDB W CMB JSB MTPLO LDB ADX,I OUTPUT "T" OR "F" LDA "T" "T" IF SIGN BIT SET. SSB,RSS LDA "F" "F" IF NOT. JSB OUTCR JMP LTYP1 HED A & R SPECIFICATIONS. ATYPE CCB A: ATMP=-1. LDA OFLAG,I OLD ? SSA SKIP IF NOT. RTYPE CLB R, OLD A: ATMP=0. STB ATMP,I CLA GET W JSB WGET ALOOP JSB F2LST GET LIST ITEM. JSB WSET SET W. LDA ADX FORM BYTE ADDR OF VARIABLE. RAL STA ATYPA LDB LENTH,I # WDS DATA. BLS # CHARS DATA. ADB W # CHARS - W STB ATYPB LDA IO,I IN OR OUT ? SZA,RSS JMP AOUT OUT. * * A&R INPUT. * AIN SSB W > # CHARS DATA. (EXCESS DATA) ? JMP AIN1 YES. LDA ATMP,I NO. EXACT OR TOO LITTLE DATA. (B=DIFF) SZA,RSS R-FORMAT ? (IF SO, A=0 FOR ABLKS) JSB ABLKS YES, SUPPLY LEADING BINARY ZEROES. JMP AIN3 (ATYPB=0 NOW FOR R-FORMAT) AIN1 STB ATYPB - # CHARS EXCESS. AIN2 JSB INCHR SKIP THEM. ISZ W (CAN'T GO TO ZERO) ISZ ATYPB JMP AIN2 (ATYPB=0 WHEN DONE) AIN3 JSB INCHR COPY W CHARS. LDB ATYPA JSB .SBT STB ATYPA ISZ W JMP AIN3 LOOP. LDA BLANK SUPPLY TRAILING BLANKS, IF ANY. LDB ATYPB JSB ABLKS ATYP1 JSB RFCHK REPEAT ? JMP ALOOP YES. SKP * A&R OUTPUT. * AOUT SSB W VS # CHARS DATA. JMP AOUT1 W > # CHARS. ADB ATYPA W <= # CHARS. SKIP CHARS IN DATA. LDA ATMP,I BUT ONLY IF R FORMAT. SSA,RSS STB ATYPA JMP AOUT2 AOUT1 CMB,INB B = AMOUNT W EXCEEDS DATA. LDA BLANK OUTPUT THAT MANY BLANKS. JSB MTPLO AOUT2 LDB ATYPA COPY W CHARS TO OUTPUT. JSB .LBT STB ATYPA JSB OUTCR ISZ W JMP AOUT2 LOOP. JMP ATYP1 GO CHECK REPEATS. SPC 3 * ROUTINE TO PUT -B- COPIES OF A<7:0> * INTO A/R VARIABLE, B >= 0. * ABLKX CMB,INB,SZB,RSS -COUNT. ZERO ? JMP ABLKS,I YES, DONE. STB ATYPB (WILL BE ZERO NEXT TIME) LDB ATYPA ABLK1 JSB .SBT ISZ ATYPB JMP ABLK1 STB ATYPA JMP ABLKS,I HED @, K & O SPECIFICATIONS. * OTYPE HANDLES @ SPECIFICATIONS * * OTYPE CLA GET JSB WGET THE W-FIELD OLOOP JSB F2LST GET A LIST ITEM. JSB WSET SET W. LDB IO,I IN/OUT SWITCH SZB,RSS JMP OCOUT * * INPUT. * CLA INITIALIZE TO STA ADX,I ZERO OCT1 JSB INCHR GET A CHARACTER STA B SAVE IN B IOR ....7 TEST FOR OCTAL DIGIT CPA "7" JMP OCT2 IT IS ONE OCT3 ISZ W END OF THIS INPUT ? JMP OCT1 NOPE OCT6 JSB RFCHK CHECK FOR REPEATS JMP OLOOP * ADD NEW DIGIT IN * OCT2 LDA B GET OCTAL DIGIT BACK IN A AND ....7 REMOVE ASCII BITS LDB ADX,I REPOSITION PREVIOUS RESULT. BLF,RBR ADA B ADD TO NEW DIGIT STA ADX,I PUT IT BACK. JMP OCT3 * * OUTPUT. * OCOUT LDA BLANK LDB W IS W GEQ -6 ? ADB ....6 SSB JMP OCT4 NO---OUTPUT A BLANK LDA ADX,I GET NUMBER CMB RAR,RAR POSITION OVER 2 FOR 16TH BIT CPB MIN1 ALR,RAR ALF,RAR ROTATE 3 INB,SZB DONE ROTATING???? JMP *-2 NOT YET, SON AND ....7 MASK OFF IOR "0" ASCII BITS OCT4 JSB OUTCR THERE IT GOES ISZ W END OF VALUE ? JMP OCOUT JMP OCT6 HED " AND ' SPECIFICATIONS. ********************************** * QTYPE HANDLES "-CONVERSION * ********************************** QTYPE ADA "&" RESTORE " OR ' STA QTYPA REMEMBER WHICH. CLA SET FOR NO STA DBLNK SKIPPING LDA FCR,I SAVE FCR FOR STA QTYPB REPEATS QLOOP JSB FCHAR GET FORMAT CHARACTER CPA QTYPA CHECK FOR SAME KIND OF QUOTE. JMP QUOT1 JMP FOR SPECIAL HANDLIG LDB IO,I WHICH WAY? SZB,RSS JMP *+3 JSB INCHR JMP QLOOP JSB OUTCR JMP QLOOP QUOT1 JSB RFCHK CHECK THE REPEAT COUNT LDA QTYPB RESTORE FCR STA FCR,I AND JMP QLOOP LOOP SPC 4 ******************************************************************** * LPTYP AND RPTYP HANDLE THE PARENTHESIS MANIPULATION * * LPRN CONTAINS ADDRESS OF LEFT PARENTHESIS. * * RFSV CONTAINS INITIAL VALUE OF REPEAT FIELD FOR THE GROUP. * * RFLD CONTAINS CURRENT VALUE OF REPEAT FIELD. * * THESE 5-WORD ARRAYS ARE INDEXED BY THE CURRENT VALUE OF NEST.* * THE ORDER OF THE ARRAYS IS : RFLD,RFSV,LPRN. * ******************************************************************** * LPTYP ISZ NEST,I ADVANCE DEPTH COUNTER JMP *+2 JMP ERR2 TOO DEEP, GAS IT. LDA NEST,I LDB A ADA ....3 IF NEST = -5 OR -4, SSA STB RNEST,I STORE FOR UNLIMITED GROUPS ADB ADRFD,I CONTAINS INDEXED ADDRESS ADB ...10 LDA FCR,I OF LPRN. STA B,I STORE FORMAT LOC. OF LEFT PAREN. ADB MIN5 NOW IN RFSV. LDA RF,I STA B,I STORE REPEAT FIELD IN RFSV STRF ADB MIN5 STA B,I AND IN RFLD. JMP FORMT HED PARENTHESIS MANIPULATION. RPTYP LDA NEST,I ADA ....5 OUTER PAREN? (NEST=-5) SZA,RSS JMP LASTP YES. SSA NO. NEST <-5 ? JMP ERR2 YES. GAS IT. LDB NEST,I NO. ADB ADRFD,I B CONTAINS INDEXED ADD. IN RFLD. ISZ B,I CHECK CURRENT VALUE OF REPEAT FD JMP STFCR STILL MORE REPEATS. LDA NEST,I REPEAT FIELD EXHAUSTED ADA MIN1 STA NEST,I DECREMENT NEST BY 1. ADB ....5 NOW B IN RFSV. LDA B,I RESTORE REPEAT JMP STRF FIELD AND EXIT. STFCR ADB ...10 MORE REPEATS. B IN LPRN. LDA B,I RESET FCR TO STA FCR,I LEFT PAREN LOC. JMP FORMT LASTP LDA ADX REMEMBER IF WE USED ANY LIST ITEMS. STA DTA JSB F2LST RETURN TO CALLING SEQ. LDA DTA LIST ITEMS BUT NO CONVERSION SPECS ? SSA JMP ERR3 JSB DTA IF WE GET BACK, UNLIMITED GROUP. CCA I/O THE RECORD AND AVOID STA SKIPL,I A SPURIOUS RETURN TO CALLER STA ADX NOTE NO CONVERSIONS SO FAR. LDB RNEST,I STB NEST,I RESET NEST ADB ADRFD,I JMP STFCR SET FCR, EXIT. HED MANIPULATION OF W & D. ******************************************************************** * * * FOLLOWING ARE SOME UTILITY ROUTINES FOR OBTAINING THE W AND D * * FIELDS, AND DOING A FEW OTHER LITTLE THINGS. * * * ******************************************************************** WGEX STA SIGN SAVE LENGTH OF EXPONENT FIELD. JSB FCHAR GET NUMBER IN FORMAT. JSB FINTG JMP ERR1 NOT A DIGIT!! CMA,INA NEGATE. ADA SIGN =4 FOR E AND G TYPE, 0 OTHERWISE SSA,RSS IF NOT NEGATIVE THEN JMP ERR1 TAKE GAS. STA WSAVE,I JMP WGET,I SPC 3 WSEX LDA WSAVE,I RESTORES W. STA W JMP WSET,I SPC 3 WDFIZ LDA DSAVE,I INIT W AND D. A=POS D. CMA A=-D-1. WDFX1 STA D SET D TO INCLUDE POINT LDB SIGN SIGN. CMB,INB -SIGN. ADB WSAVE,I -W-SIGN. STB W SET UP W. CMB,INB W+SIGN. ADA B W-D-1+SIGN. STA BCNT NUMBER OF LEADING BLANKS. SSA,RSS <0 ? JMP WDFIX,I NO, DONE. LDA W YES, SET D=W. JMP WDFX1 SPC 3 WDGEX JSB WGET GETS W AND W. FIRST W. JSB FCHAR MAKE SURE NEXT CHARACTER CPA "." IS A DECIMAL POINT. JMP *+2 IT IS...OK JMP ERR1 IT'S NOT...TOO BAD JSB FCHAR COMPUTE NEXT NUMBER IN FORMAT JSB FINTG TEST FOR DIGIT JMP ERR1 NOT A DIGIT!! STA DSAVE,I SET D. JMP WDGET,I HED SCALING AND CONVERSION ROUTINES. * NORML - MANTISSA NORMALIZATION. * THE MANTISSA AND EXPONENT ARE ADJUSTED SO THAT THEY * CONTAIN A NORMALIZED VALUE. IT IS ASSUMED THAT THE * INITIAL STATE IS NOT UNNORMLIZED BY MORE THAN 31 BITS. * NORMX LDB MANT SEE IF NORMALIZED. LDA MANT+1 ASL 1 SOC JMP NORML,I YES, DONE. ASL 15 NO, SEE IF WORD SHIFT. SOC JMP NORM1 NO. SZB,RSS YES, IS SECOND WORD ZERO TOO ? JMP NORM3 YES, IS ZERO. STB MANT NO, DO WORD SHIFT. LDB MANT+2 STB MANT+1 LDB MANT+3 STB MANT+2 LDB MANT+4 STB MANT+3 STA MANT+4 LDA EXP ADJUST EXPONENT ADA =D-16 STA EXP NORM1 LDA MANT DETERMINE BIT SHIFT. JSB FLOAT B = 30 - 2*SHIFT BRS B = 15-SHIFT ADB =D-15 B = -SHIFT LDA B SAVE SHIFT COUNT CMA,INA,SZA,RSS A = SHIFT. IS IT ZERO ? JMP NORML,I YES, DONE. ADB EXP ADJUST EXPONENT. STB EXP IOR RRL16 SET UP SHIFT. STA XEQ+1 LDA AMANT SET UP BIT NORMALIZE LOOP. STA NORMA LDA MIN4 STA NORMB NORM2 DLD NORMA,I WORD PAIR. JSB XEQ LEFT SHIFT. STA NORMA,I NEW FIRST WORD OF PAIR. ISZ NORMA BUMP ADDR. ISZ NORMB BUMP COUNT. JMP NORM2 IF MORE. JMP NORML,I EXIT. NORM3 STB EXP ZERO, SET EXPONENT ZERO TOO. JMP NORML,I SKP * PTEN - SCALE NUMBER BY A POWER OF TEN. * * PTEN MULTIPLIES THE VALUE IN (MANT...MANT2) AND (EXP) * BY 10**(A). NO CHECK IS MADE FOR OVERFLOW/UNDERFLOW. * * CALLING SEQUENCE: * LDA POWER * JSB PTEN SPC 2 PTENX LDB AMANT SET UP MANTISSA POINTERS. STB MANTP LDB TYPE,I SZB CPB ....1 ADB ....2 IF TYPE<2, USE EXTRA WORD. ADB MIN1 # WORDS PRECISION TO USE - 1 ADB MANTP LWA USED MANTISSA STB MANTL SZA,RSS IF N=0, LEAVE ALONE. JMP PTEN,I SSA,RSS N>0 ? JMP PTEN1 YES. CMA,INA NO, TAKE IABS(N) STA PTENA LDA ....2 RIGHT SHIFT MANTISSA TWO BITS. JSB RSN LDB DIVDZ SET "DIVIDE" JMP PTEN2 PTEN1 LDB MULTZ SET "MULTIPLY" STA PTENA PTENA = IABS(N) PTEN2 STB PTENB PTENB = ADDR MULT OR DIVD PTEN3 LDA PTENA A=N ADA MIN6 N-6 CLE,SSA N<6 ? (E=0 FOR MULT) JMP PTEN4 YES, GO DO LAST ONE. STA PTENA NO, MULT/DIV BY 10**6 LDA PWR1A+10 LDB PWR1A+11 JSB PTENB,I JMP PTEN3 TRY AGAIN. PTEN4 ADA ....5 A = N-1 RAL,CLE,SLA N=0 ? JMP PTEN5 YES, GO NORMALIZE. ADA PWR10 GET POWER OF TEN. (E=0 FOR MULT.) DLD A,I JSB PTENB,I GO MPY DIV USING IT. PTEN5 LDB MANT NORMALIZE. ASL 1 SOC THERE ? JMP PTEN,I YES. JSB LSONE NO, LEFT SHIFT. JMP PTEN5 AND TRY AGAIN. SKP * POWER OF TEN TABLE. FIRST PART IS (10**I)/2, I=1,2,3. SECOND * PART IS IDENTICAL TO 2-WORD FLOATING EXCEPT THE SECOND WORD HAS * BEEN RIGHT SHIFTED ONE BIT. VALUES ARE 1O**I FOR I=1,6. SPC 1 .5000 DEC 5000 PWR10 DEF PWR1A BASE ADDRESS. ....5 DEC 5 DEC 50 DEC 500 PWR1A DEC 20480 10**1 ....4 DEC 4 DEC 25600 10**2 ....7 DEC 7 DEC 32000,10 10**3 DEC 20000,14 10**4 DEC 25000,17 10**5 DEC 31250,20 10**6 SPC 3 * INDIG - ADD INPUT DIGIT TO NUMBER. * * INDIG TAKES AN INPUT DIGIT AND COMBINES IT WITH THE * RUNNING MANTISSA. THE RUNNING MANTISSA IS NOT IN A * USABLE FORM UNIL A TERMINAION CALL IS MADE. THE * MANTISSA IS THEN USABLE BUT MAY NOT BE NORMALIZED. * * CALLING SEQUENCE: * * LDA * JSB INDIG * * A TERMINATION CALL IS SIGNALLED BY NEGATIVE. * ANY TRAILING ZEROES OR DIGITS AFTER THE LIMIT (20) * AFFECT ONLY THE TRAILING ZERO COUNT IN "INPUD". SPC 1 * CHECK FOR ZERO, EXTRA DIGIT OR TERMINATION. * INDIX STA INDIA SAVE DIGIT. SSA TERMINATION CALL ? JMP INDI7 YES. INDI1 LDB MANTL NO. AT LIMIT ? SZA OR ZERO DIGIT ? CPB MANTE JMP INDI6 YES, JUST COUNT IT. * * GOOD DIGIT. ADD IT OR A SKIPPED ZERO. * LDA INPUA NO. GOOD DIGIT. MULTIPLY OTHERS BY 10. ALS,ALS ADA INPUA ALS LDB INPUD ANY UNUSED ZEROES ? SZB,RSS IF SO, ADD THEM FIRST. ADA INDIA IF NOT, ADD THIS DIGIT. STA INPUA ISZ INPUB COUNT DIGITS. FULL GROUP OF 4 ? JMP INDI5 NO. LDA .5000 YES, ADD THEM. INDI2 LDB =D-16 MAKE ROOM. CMB,CCE,INB B=16, E=1. JSB MULT LDB MANTL ADD DIGIT(S) ISZ MANTL LDA B,I CLE ADA INPUA STA B,I CCA,SEZ,RSS CARRY ? JMP INDI4 NO. INDI3 ADB A PROPOGATE IT. ISZ B,I JMP INDI4 JMP INDI3 INDI4 LDA MIN4 RESET COUNT. STA INPUB CLA RESET DIGITS. STA INPUA LDB INPUD RELOAD TRAILING ZERO COUNT. * * IF JUST PROCESSED A SKIPPED ZERO, DO ANOTHER DIGIT. * INDI5 LDA INDIA WAS IT A TERMINATION CALL ? SSA,RSS SZB,RSS OR NO TRAILING ZEROES ? JMP INDIG,I YES, DONE WITH THIS DIGIT. ADB MIN1 IT WAS A SKIPPED ZERO. DECREMENT COUNT. STB INPUD JMP INDI1 TRY AGAIN. * * ZERO, EXTRA DIGIT & TERMINATION PROCESSING. * INDI6 LDA INPUA ZERO OR EXTRA DIGIT. LEADING ZERO ? ADA EXP (IF SO, EXP=-1 AND INPUA=0) SSA,RSS ISZ INPUD NO, TRAILING DIGIT, COUNT IT. JMP INDIG,I DONE WITH THIS ONE. INDI7 LDA INPUB ANY UNUSED DIGITS ? CPA MIN4 JMP INDIG,I NO, DONE. ADA PWR10 YES. ADD THEM. LDA A,I JMP INDI2 SKP * GETDG - EXTRACT DIGITS FOR OUTPUT. * * GETDG EXTRACTS DIGITS FROM THE MANTISSA AND RETURNS THEM * FOR OUTPUT PURPOSES. ONLY (SGCNT) DIGITS WILL BE RETURNED, * ANY AFTER THAT ARE 0 OR 9 AS REQUIRED TO PRODUCE THE CORRECT * ROUNDING. LESS PRECISION IS USED AS DIGITS ARE GENERATED. SPC 2 GETDX LDA GETDA TOO MANY DIGITS ? CLE,SSA,RSS JMP NOSIG YES, SEND ROUNDING DIGIT. ISZ GETDC ANY DIGITS LEFT ? JMP GETD1 YES, GET ONE. LDA .5000 NO, GENERATE 4 MORE. JSB MULT ISZ MANTP THEY'RE IN THE NEXT WORD. LDA MIN4 STA GETDC GETD1 LDA GETDC A = - # DIGITS IN WORD. ADA GETDZ GET POWER OF TEN FOR EXTRACTING DIGIT. STA GETDB LDA MANTP,I DIGITS. CLB DIV GETDB,I A = NEW DIGIT, B = REST. STB MANTP,I ISZ GETDA IS THIS FIRST AFTER LAST VALID DIGIT ? JMP GETDG,I NO. LDB ....9 YES. IF .GE. 5, RETURN NINES NOW. ADA MIN5 SSA CLB ELSE RETURN ZEROES. STB GETDC NOSIG LDA GETDC RETURN ROUNDING DIGIT (0 OR 9) JMP GETDG,I SPC 2 .1000 DEC 1000 DEC 100 ...10 DEC 10 ....1 DEC 1 GETDZ DEF * SKP * RSN - LOGICAL RIGHT SHIFT MANTISSA BY N BITS, N IN [1,15]. * RSNX LDB A ADJUST EXPONENT. ADB EXP STB EXP IOR RRR16 SET UP SHIFT INSTRUCTION. STA XEQ+1 LDA MANT+2 SHIFT. LDB MANT+3 JSB XEQ STB MANT+3 LDA MANT+1 LDB MANT+2 JSB XEQ STB MANT+2 LDA MANT LDB MANT+1 JSB XEQ STB MANT+1 CLA LDB MANT JSB XEQ STB MANT JMP RSN,I EXIT SPC 4 * LSONE - LOGICAL LEFT SHIFT MANTISSA ONE BIT. * LSONX LDA MANT+3 SHIFT. CLE,ELA STA MANT+3 LDA MANT+2 ELA STA MANT+2 LDA MANT+1 ELA STA MANT+1 LDA MANT ELA STA MANT CCA ADJUST EXP ADA EXP STA EXP JMP LSONE,I SKP * .XCOM - NEGATE MANTISSA / ROUND RESULT. * * IF B=-1 THE MANTISSA IS NEGATED ELSE IT IS ROUNDED USING * B+1 AS THE ROUND CONSTANT. WHEN ROUNDING, THE LOCATION * INPUA IS SET TO THE ADDRESS OF THE LAST WORD. SPC 2 XCOMX INB,SZB NEGATE OR ROUND ? JMP XCOM1 ROUND, DON'T COMPLEMENT. LDA MANT COMPLEMENT MANTISSA. CMA STA MANT LDA MANT+1 CMA STA MANT+1 LDA MANT+2 CMA STA MANT+2 LDA MANT+3 CMA STA MANT+3 LDA AMNT3 ADDR WORD TO START INCR. JMP XCOM2 XCOM1 CCA FORM ADDR LAST WORD. ADA LENTH,I ADA AMANT STA INPUA SPECIAL: SET UP FOR INPUT. XCOM2 CLE,INB ADB A,I ADD ROUND CONSTANT. XCOM3 STB A,I SEZ,RSS CARRY ? JMP .XCOM,I NO, DONE. ADA MIN1 YES, PROPOGATE IT. LDB A,I CLE,INB CPA AMANT AT FIRST WORD ? JMP *+2 JMP XCOM3 NO, KEEP GOING. STB MANT STORE FIRST WORD. CLA,INA A=1. CPB NEG1 OVERFLOW ? JMP XCOM4 YES. ASL 1 NEG UNNORM ? SOC JMP .XCOM,I NO, DONE. CCA,RSS YES. B = NEW FIRST WD. DECR EXP. XCOM4 RBR OFL. R.S. & INCR EXP. (A=1) STB MANT ADA EXP STA EXP JMP .XCOM,I SKP * MULT - MULTIPLY THE MANTISSA BY A SCALAR. * * MULT MULTIPLIES THE MANTISSA BY A 15-BIT SCALAR AND ADJUSTS THE * EXPONENT. THE RESULT IS AS IF AN INTEGER MULTIPLY OF THE MANTISSA * AND SCALAR WERE DONE FOLLOWED BY A RIGHT SHIFT 15. THE RESULT * WILL NOT OVERFLOW BUT IT MAY BECOME UNNORMALIZED. * * CALLING SEQUENCE: * * CLE/CCE LAST WORD FLAG. * LDA SCALAR MULTIPLIER. * LDB N EXPONENT ADJUSTMENT. * JSB MULT * * WHERE E=1 INDICATES THAT THE LAST WORD OF THE CURRENT * MANTISSA IS ZERO. (INPUT CONVERSION). FOR THIS * CASE, THE EXPONENT ADJUSTMENT MUST NOT CARRY OUT. SPC 2 MULTX STA MULTA SAVE MULTIPLIER. RAL AND 2*MULTIPLIER. STA MULTD CME E=0 IFF INPUT ADB EXP ADJUST EXPONENT STB EXP LDB MANTL CURRENT WORD ADDR SEZ,RSS INPUT ? JMP MULT3 YES, SKIP FIRST MPY STB MULTB RAR RESTORE MULTIPLIER. MPY B,I ASL 1 JMP MULT2 MULT1 LDA MULTA MULTIPLIER. MPY B,I * CURRENT WORD. CLE,ELA ALIGN. ELB,CLE ADA MULTC,I ADD LOWER TO CURRENT + 1 STA MULTC,I SEZ PROPOGATE CARRY. INB MULT2 LDA MULTB,I CORRECT FOR BIT 15. SSA ADB MULTD STB MULTB,I LDB MULTB SEE IF DONE. MULT3 CPB MANTP I.E., IS CURRENT WORD THE START ? JMP MULT,I YES, DONE. STB MULTC NO, UPDATE POINTERS. ADB MIN1 STB MULTB JMP MULT1 AND LOOP. SKP * DIVD - DIVIDE MANTISSA BY A SCALAR. * * DIVD DIVIDES THE MANTISSA BY A SCALAR AND ADJUSTS THE * EXPONENT ACCORDINGLY. THE EFFECT IS AS IF THE TWO WERE * INTEGERS AND THE DIVIDE WERE DONE, KEEPING 15 FRACTION * BITS, FOLLOWED BY A LEFT SHIFT 15. * OVERFLOW CAN OCCUR ONLY IF THE MANTISSA IS NORMALIZED * OR THE DIVISOR IS LESS THAN 2**14. * * CALLING SEQUENCE: * * LDA SCALAR 15-BIT DIVISOR. * LDB N EXPONENT ADJUSTMENT. * JSB DIVD SPC 4 DIVDX STA DIVDA SAVE DIVISOR. ARS SAVE DIVISOR/2. STA DIVDD CMB,INB CORRECT EXPONENT. ADB EXP STB EXP LDA MANTP SET UP POINTERS. STA DIVDB STA DIVDC LDB A,I B = FIRST WORD. CMA,INA -MANTP ADA MANTL MANTL-MANTP = # WDS - 1 CMA - # WDS STA DIVDE CLA BITS 15,14 FIRST WORD = 0 JMP DIVD2 DIVD1 ISZ DIVDB CLA SAVE BIT 15 (IN E). ELA,ELA CMB FORM REM - DIVISOR/2 ADB DIVDD CMB,CLE,SSB POS ? ADB DIVDD NO, RESTORE REM & SET E. CME SAVE BIT 14 (IN E). ERA,RAR DIVD2 STA DIVDF SAVE BITS 15,14. ISZ DIVDC LDA DIVDC,I A = NEXT WORD (LOW) DIV DIVDA DIVIDE. CLE,ERA SHIFT RIGHT, SAVE BIT 0 AS BIT 15. IOR DIVDF ADD PREV BITS 15,14. STA DIVDB,I ISZ DIVDE DONE ? JMP DIVD1 NO, LOOP. JMP DIVD,I YES, EXIT. SKP * OUTPT - SCALE NUMBER FOR OUTPUT. * * OUTPT COPIES A VARIABLE TO BE NUMERICALLY OUTPUT, PUTTING * IT IN A STANDARD FORMAT (4 WORD MANTISSA, SEPARATE EXPONENT). * THEN IT MULTIPLIES OR DIVIDES THE NUMBER BY A POWER OF TEN * TO THAT IT IS IN [1000,10000). THE BINARY POINT IS PLACED * AFTER THE FIRST WORD SO THE FIRST 4 DIGITS ARE IN THAT WORD. * THE VALUE OF N S.T. (ORIGINAL #) * (10**(-N)) IS IN [.1,1) * IS STORED IN EXPON, I.E. NUMBER * 10**EXPON = ORIG NUMBER. * THE FOLLOWING APPROXIMATION IS USED: * * LOG10(X*(2**N)) = [((N*19729)/128)+((X*(2**15))*617)/(2**16)-290]/512 * * WHERE X IS IN [0.5,1). THE ERROR IS ALWAYS POSITIVE. SPC 2 * COPY NUMBER AND CONVERT IT. * OUTPX LDA AMANT COPY THE DATA. STA OUTA (MUST COPY ONLY EXACT AMOUNT TO AVOID DM) LDA LENTH,I # WORDS. CMA,INA OUTPE LDB ADX,I COPY A WORD. STB OUTA,I ISZ ADX BUMP SOURCE. ISZ OUTA BUMP DEST. INA,SZA COUNT & LOOP. JMP OUTPE * LDA TYPE,I WHAT TYPE IS IT ? ADA MIN2 SSA,INA,RSS JMP OUTPB FLOATING. * * INTEGER. * SZA,RSS INTEGER. 1 OR 2-WORD. JMP OUTPC 2-WORD. LDA MANT 1-WORD. FLOAT IT. JSB FLOAT STA MANT SET UP AS IF 2-WORD FLOATING. STB MANT+1 CLA,INA JMP OUTPB OUTPC STA MANT+2 2-WORD. FLOAT TO 3-WD FLOATING. LDA =D31 JSB .XPAK DEF MANT LDA ....2 SET UP AS IF 3-WORD FLOATING. SKP * FLOATING. * OUTPB ADA AMANT FORM ADDR LAST WORD STA OUTA LDB A,I UNPACK THAT WORD. JSB .FLUN STB OUTA,I STA EXP ISZ OUTA ZERO OUT NEXT WORD. CLA STA OUTA,I * * REMEMBER SIGN, TAKE ABS VALUE, CHECK FOR ZERO. * JSB NORML NORMALIZE. LDB MANT SET SIGN. ASR 16 STB SIGN STB EXPON IN CASE ZERO. SZA,RSS ZERO ? JMP OUTPD YES, DON'T SCALE. SSA NEGATIVE ? JSB .XCOM YES, TAKE ABS VALUE. (B=-1) * * SCALE TO [1000,10000). * FIRST, ESTIMATE LOG BASE 10. * LDA EXP FORM N*19729 MPY =D19729 ASR 7 (N*19729)/128 STA OUTA LDA MANT X*(2**15) MPY =D617 B = ((X*(2**15))*617)/(2**16) ADB OUTA + (N*19729)/128 ADB =D222 -290+512 ASR 9 B = FLOOR(LOG10(NUMBER))+1 STB EXPON = N. * * NOW PERFORM THE SCALING. * CMB,INB DIVIDE NUMBER BY 10**(N-4) ADB ....4 LDA B JSB PTEN SKP * IF < 1000, MULTIPLY BY 10. * (CAN HAPPEN DUE TO ERROR IN COMPUTING LOG.) * LDA MANT GET INTEGER PART. LDB EXP RBL JSB IFIX ADA =D-1000 IS IT < 1000 ? CLE,SSA,RSS JMP OUTPA NO, O.K. LDA PWR1A YES, MULTIPLY BY TEN. LDB PWR1A+1 JSB MULT (E=0: NON-INPUT MODE) CCA DECREMENT EXPONENT. ADA EXPON STA EXPON * * MOVE BINARY POINT TO AFTER FIRST WORD. * OUTPA LDA EXP ADJUST EXP TO +15 ADA =D-15 CMA,INA JSB RSN * * SET UP MANTP, MANTL, W AND D. EXIT. * OUTPD LDA AMANT RESET TO HIGHER ACCURACY. STA MANTP (FOR ZERO CASE) ADA LENTH,I FOR DIGIT PRODUCTION. STA MANTL JSB WDFIX SET W AND ADJUST AND SET D. JMP OUTPT,I EXIT. HED D, E, F, G & I SPECIFICATIONS. GTYPE LDB IO,I I/O SWITCH SZB OUTPUT JMP FTYPE INPUT SAME AS F-TYPE LDA ....4 JSB WDGET PICK OFF W AND D FIELDS CLA STA SCALE,I NO SCALE FACTOR IF F-TYPE USED GCONV JSB F2LST JSB OUTPT SCALE, SET W & D. CCA SET FLAG SO FTYPE & ETYPE WILL RETURN. STA GFLAG,I LDA EXPON CHECK RANGE. A = SCALE FROM [.1,1) STA EXPNS SAVE FOR RECHECKING LATER. SSA < 0.1 ? JMP GTOE YES, USE -E-. ADA D FLOOR(LOG10(X))+1-D-1 LDB D CHECK D TOO. CMB,SZB,RSS IF D=-1 AND EXPON=0, FORCE -E-. INA SSA,RSS FLOOR(LOG10(X))= -1 ? JMP FOUT2 NO, AT LEAST ONE DIGIT AFTER POINT. STB EFLAG YES, FORCE A LEADING ZERO. FOUT1 CMB,INB NO, REMOVE LEADING BLANKS. LDA GFLAG,I IF G-FORMAT, TREAT BCNT AS ZERO. SSA JMP FOUT3 ADB BCNT ADJUST BCNT. STB BCNT FOUT3 CMB,SSB -BCNT-1. BCNT<0 ? JMP FOUT2 NO, O.K. ADB D YES. D-BCNT-1. SSB,INB,RSS SKIP IF BCNT>=D. D-BCNT. STB W DOESN'T FIT. OUTPUT DOLLARS. STB D FITS. ADJUST D ACCORDINGLY. CLB AND BCNT=0. SSA,RSS IF G-FORMAT, LEAVE BCNT ALONE. STB BCNT FOUT2 JSB OUTP1 PRINT NUMBER. LDA GFLAG,I GFIELD ? SSA JMP BACKF YES. GO BACK TO GTYPE. JSB RFCHK AGAIN ? JMP FOUT YES. SKP DTYPE LDA "D" STA EORD,I PUT ASCII D FOR EXPONENT FIELD. ETYPE LDB IO,I I/O SWITCH SZB JMP FTYPE INPUT IS THE SAME AS F-TYPE. LDA ....4 4 CHARS EXPONENT. JSB WDGET ELOOP JSB F2LST CHECK THE LIST JSB OUTPT SCALE, SET W & D. GTOE CCA SET EFLAG:=TRUE. STA EFLAG LDA EXPON SUBTRACT SCALE FACTOR FROM EXPONENT. ADA TSCAL,I STA EXPON LDA TSCAL,I ADD IT TO D. CMA,INA + SCALE FACTOR. STA SGDIG (IF + SCALE, NO SPECIAL ROUNDING) ADA D STA D A = D. LDB TSCAL,I - SCALE FACTOR. SSB,RSS SCALE FACTOR <= 0 ? JMP ETYP2 YES. * * SCALE FACTOR > 0. DECREMENT D. IF BCNT > 0, DECR * BCNT. THEN IF TOO FEW PLACES, ADJUST D & EXPON. * CCB TRY TO DECREMENT BCNT. ADB BCNT SSB STILL + ? JMP ETYP1 NO, LEAVE BCNT & D. STB BCNT YES. DO IT. ADA MIN1 D TOO. STA D ETYP1 LDB MANT NUMBER ZERO ? SZB,RSS JMP ETYP5 YES, DELETE EXTRA LEADING ZEROES. SSA NO. DIGITS BEFORE POINT LOST ? JMP ETYP4 NO. LDB D YES, ADJUST EXPON TO REFLECT THIS. JMP ETYP3 ETYP5 CMA,SSA,INA -D. WAS D >= 0 ? CLA YES, USE D=0. ADA W W-D CMA D-W-1 = # OF EXTRA ZEROES + BCNT. STA BCNT JUST DELETE THEM. JMP ETYP4 SKP * SCALE FACTOR <= 0, MAKE SURE AT LEAST ONE DIGIT. * ETYP2 ADA B RESTORE ORIGINAL D. ADA B ACCOUNT FOR LEADING ZEROES. STA SGDIG REMEMBER FOR ROUNDING. INA (OLD D)+(# LDNG ZEROES)+1 = - # SIG DIG. CMA,SSA,RSS # SIG DIG - 1. AT LEAST ONE ? JMP ETYP4 YES, IS O.K. STA B NO. FIX D & EXPON. CMA,INA 1 - # SIG DIG ADA D START DIGITS THAT MUCH SOONER. STA D LDA MIN2 LIMIT ROUNDING. STA SGDIG ETYP3 ADB EXPON CORRECT EXPONENT. STB EXPON * * OUTPUT NUMBER AND EXPONENT. * ETYP4 LDA MANT SZA,RSS IF NUMBER ZERO, SET EXPONENT = 0 STA EXPON JSB OUTP1 LDA EORD,I OUTPUT EXPONENT. FIRST, JSB OUTCR DESCRIPTIVE E (OR D) LDA MINUS LDB EXPON SSB SKIP IF POSITIVE CMB,INB,RSS IF NEGATIVE, 2'S COMPLEMENT&SKIP LDA PLUS IF POSITIVE,CHANGE A TO '+' STB EXPON JSB OUTCR OUTPUT THE SIGN LDA EXPON NOW THE MAGNITUDE. CLB DIV ...10 A=FIRST, B=SECOND. ADA "0" ADB "0" STB EXPON JSB OUTCR LDA EXPON JSB OUTCR SECOND DIGIT LDA GFLAG,I SSA JMP BACKE JSB RFCHK CHECK FOR REPEATS JMP ELOOP HED GENERAL DIGIT OUTPUT. ********************************************************************** * OUTP1 IS THE ROUTINE WHICH PERFORMS THE ACTUAL OUTPUT CONVERSION. * * IT ASSUMES THAT WSAVE, DSAVE, AND BCNT HAVE BEEN PROPERLY INI- * * TIALIZED, AND THAT THE NUMBER HAS BEEN PROPERLY SCALED BY OUTPT. * * IT USES GETDG TO PRODUCE SIGNIFICANT DIGITS FROM LEFT TO RIGHT * * AND PRODUCES LEADING BLANKS, LEADING ZEROES AND THE DECIMAL POINT * * ACCORDING TO WSAVE, DSAVE AND BCNT. SPECIAL CARE IS TAKEN TO * * OUTPUT THE SIGN AND THE DECIMAL POINT PROPERLY, AND TO ROUND THE * * RESULT CORRECTLY. * ********************************************************************** * * * THIS ROUTINE HAS BEEN MODIFIED TO OUTPUT 0'S AFTER THE NUMBER OF * SIGNIFICANT DIGITS GIVEN BY THE TABLE "SDTBL". * THIS WAS DONE TO SUPPRESS THE RETURN OF INSIGNIFICANT DIGITS IN * LARGE FORMAT FIELDS. SPC 3 * INITIALIZE, OUTPUT LEADING BLANKS & SIGN. * OUTPZ LDA W MAY ALREADY BE TOO LATE. SSA,RSS JMP BCKS3 YUP. DOLLARS. LDB BCNT OUTPUT LEADING BLANKS LDA BLANK JSB MTPLO LDB SIGN OUTPUT A MINUS ? LDA MINUS SZB IF NOT. JSB OUTCR YES. LDA "0" SPECIAL CASE FROM F-FORMAT. LDB EFLAG IF EFLAG=+1, OUTPUT "0" CPB ....1 JSB MTPLO (UPDATE W TOO) LDA SDTBL ADA TYPE,I LDA A,I STA GETDA SET COUNTER FOR # OF SIGNIFICANT DIGITS LDA MIN5 SET UP CONVERSION FOR GETDG. STA GETDC SKP * OUTPUT DIGITS. * LDA D D CMA,INA -D ADA W W-D STA OCONT LDB W IF W=0, DONE. SSB,RSS JMP ALDON SSA ANY DIGITS BEFORE POINT (W * * ALL OF THESE ARE OPTIONAL, AND THE APPEARANCE OF THE FIRST * SIGN, DIGIT, OR DECIMAL PT. DEFINES A NUMBER. ANY COMBINATION * OF THE ABOVE IS LEGAL, WITH THE FOLLOWING EXEPTIONS: * * * (1) AN INITIAL E IS IGNORED IN FREE-FIELD, AND IS ILLEGAL IN * FIXED FIELD; * (2) IF NO INTEGER PART OR FRACTION APPEARS (AND A SIGN OR * DEC.PT. DOES), THE RESULT IS ZERO * * IN FIXED-FIELD INPUT, IF NO DECIMAL PT. APPEARS, THE RESULT IS * * MULTIPLIED BY 10**(-D). * * THE FOLLOWING SPECIAL FEATURES ARE INCLUDED FOR FREE-FIELD INPUT: * * (1) WHEN 2 CONSECUTIVE COMMAS APPEAR WITH NO DATA BETWEEN, * THAT LIST ELEMENT IS SKIPPED. * * (2) WHEN A SLASH OCCURS IN AN INPUT RECORD, THE REMAINDER * OF THE RECORD IS TREATED AS COMMENTS. * * (3) IF A LINE TERMINATES WITHOUT A SLASH, THE INPUT OPERATION * TERMINATES AND THE REMAINDER OF THE LIST REMAINS * UNCHANGED. * * (4) WHEN A QUOTE APPEARS, THE FOLLOWING * * CHARACTERS IN THAT LINE ARE TREATED AS COMMENTS * * UNTIL ANOTHER QUOTE APPEARS. * * * (5) ALL UNRECOGNIZED CHARACTERS ARE TREATED AS BLANKS * * (6) WHEN AN INTEGER IS PRECEDED BY THE CHARACTER "@", THE IN- * TEGER IS INTERPRETED AS OCTAL. * * CONTROL WITHIN INPUT IS GOVERNED BY THE VARIABLE POST, * WHOSE VALUE INDICATES HOW FAR THE NUMBER HAS BEEN * SCANNED, AS FOLLOWS: * * POST = 0 : NUMBER NOT STARTED YET * 1 : NUMBER STARTED, BUT NO DECIMAL PT. REACHED YET * 3 : LAST CHARACTER WAS THE 'E' * 4 : EXPONENT BEING PROCESSED * ******************************************************************* * * INITIALIZATION. SKP INPUX LDA AMANT SET UP MANTISSA ADDRESSES. STA MANTP STA MANTL LDA MIN4 FOR INDIG. STA INPUB # DIGITS THIS GROUP - 4. CCA STA EXP CLA STA INPUA ACCUMULATED DIGITS THIS GROUP. (UP TO 4) STA INPUC SIGN OF EXPONENT. STA INPUD # TRAILING ZEROES. STA SIGN SIGN OF MANTISSA. STA MANT STA MANT+1 STA MANT+2 STA MANT+3 STA MANT+4 STA EXPON STA SKIP,I STA POST CPA FCR,I FREE FIELD ? JMP *+2 JMP INLUP STA W STA D STA DSAVE,I * * MAIN LOOP. READ A CHAR AND DECIDE WHAT TO DO. * FLIP ISZ W CHECK FOR END OF FIELD JMP INLUP NO, KEEP GOING. JMP FINAL YES, GO PACK IT UP. INLUP JSB INCHR LDB POST CPA "/" JMP INSLS CPA COMMA JMP INCOM CPA PLUS JMP INPLS CPA MINUS JMP INMIN CPA "." JMP INPNT CPA "E" JMP INE CPA "D" JMP INE CPA QUOTE JMP INQUO CPA "@" JMP INOCT JSB DIGIT JMP INBLN SKP ***** THE CHARACTER IS A DIGIT. WE FIRST SET POST AS FOLLOWS: **** * POST=0 : POST_1 * POST=2 : DF_DF+1 * POST=3 : POST_6 * ******************************************************************* BNKNM LDB POST SZB,RSS ISZ POST IF POST=0, SET IT TO 1 CPB ....3 JMP INEX3 PROCESSING EXPONENT CPB ....4 JMP INEX4 PROCESSING EXPONENT * * ADD THIS DIGIT TO MANTISSA. * LDB POST IF PAST DEC POINT, COUNT DIGITS. CPB ....2 ISZ D NOP COULD SKIP ! JSB INDIG ADD DIGIT. JMP FLIP * * EXPONENT PROCESSING. * INEX3 ISZ POST INEX4 LDB EXPON MULTIPLY EXPON BY 10 BLS,BLS ADB EXPON BLS ADB A ASL 4 GUARANTEE LARGE EXPONENTS STAY LARGE. SOC IF TOO BIG, LDB =B77777 SET TO MAX POS. (BECOMES 3777) ASR 4 STB EXPON JMP FLIP * * COMMA. * INCOM LDA FCR,I TREAT A COMMA ON INPUT SZA TEST FOR FREE FIELD INPUT JMP ERR4 CCA SZB IS POST=0? JMP FINL1 CPA CFLAG,I JMP *+3 DOUBLE COMMA STA CFLAG,I JMP FLIP STA SKIP,I STA SWITH,I JMP INPUT,I SKP * "+" AND "-": SET THE APPROPRIATE SIGN. * INMIN CCA FOR MINUS SZB WHICH ? JMP INPL2 DEC EXPONENT. STA SIGN MANTISSA. JMP FLIP INPL2 STA INPUC INPLS CPB ....4 IF POST=4 THIS IS ILLEGAL JMP ERR5 LDA ....4 SZB IF POST>0 THEN SET IT TO 4 STORP STA POST JMP FLIP * * "." : DECIMAL POINT. * INPNT BRS HANDLES DECIMAL POINT SZB JMP ERR5 MEANS POST WAS 2 OR MORE LDA DSAVE,I SUBTRACT DSAVE FROM D. CMA,INA ADA D STA D LDA ....2 JMP STORP * * "E" : NOTE END OF MANTISSA. * INE ADB MIN3 SSB,RSS JMP ERR5 POST WAS 3 OR 4 LDA ....3 SET IT TO 3 JMP STORP * * "/" : FORMATTED, ERROR. FREE-FIELD, IS END-OF-LINE. * INSLS LDA FCR,I SZA JMP ERR4 STA CCNT,I SET CCNT=0 TO READ NEXT LINE JMP FINAL BEAT IT * * FREE-FIELD COMMENT PROCESSING. * INQUO LDA FCR,I ERROR IF NOT FREE-FIELD. SZA JMP ERR4 FIXED, ERROR 4. INQU1 JSB INCHR READ CHARACTERS UNTIL ANOTHER CPA QUOTE QUOTE IS READ. JMP INBLN INBLN CCA *** CHECK IF END OF BUFFER? CPA CCNT,I *** THIS CODE ADDED TO FIX '123"' JMP INSLS *** YES FREE FIELD INPUT BUG JMP INQU1 SKP * BLANK. * INBLN LDB FCR,I SEE IF FREE-FIELD. SZB,RSS JMP INBL1 YES. CPA BLANK NO. MUST BE A TRUE BLANK. RSS JMP ERR4 NO, UNRECOGNIZED CHAR. LDA OFLAG,I YES. IGNORE OR TREAT AS A ZERO ? LDB POST SZB IF POST=0, ALWAYS IGNORE. SZA JMP FLIP OLDIO. IGNORE. JMP BNKNM NEWIO. TREAT AS ZERO. (A=0) INBL1 LDB POST FREE-FIELD. POST=0 ? SZB,RSS JMP FLIP YES. IGNORE IT. (ELSE FALL INTO "FINAL") * * END OF NUMBER. PUT IT ALL TOGETHER. * FINAL CLA FINL1 STA CFLAG,I CCA ADD ANY REMAINING DIGITS. JSB INDIG JSB NORML NORMALIZE. LDA MANT IF ZERO, DONE. SZA,RSS JMP FNL11 LDA EXPON FINAL COMPUTATION OF NUMBER ISZ INPUC COMPUTE EXTERNAL CMA,INA EXPONENT AS NEGATIVE LDB POST IF NO E-FIELD ADB MIN3 ADD SSB SCALE FACTOR ADA SCALE,I ADA D ADJUST FOR DECIMAL POINT OR EXCESS DIGITS. CMA,INA ADA INPUD ACCOUNT FOR TRAILING ZEROES, EXTRA DIGITS. LDB A CHECK FOR LARGE VALUE. ASL 9 OFL IF OUTSIDE [-64,+64) SOC SHOULD NEVER BE OUTSIDE [-60,+39] JMP FNL13 (MANTISSA IN [1,10**20], RRR 9 RESULT IN [10**-39,10**39] ) JSB PTEN MULTIPLY BY POWER OF TEN. LDB SIGN TEST THE SIGN SSB NEGATIVE ? JSB .XCOM YES, COMPLEMENT MANTISSA. (B=-1) SKP * ALL SET EXCEPT COMBINING MANTISSA & EXPONENT. * INPCK LDA TYPE,I WHAT TYPE ? ADA MIN2 CLE,SSA,INA,RSS JMP FINL6 FLOATING. LDA EXP INTEGER. CHECK EXPONENT. CMA,SSA,INA,RSS IN [-.5,+.5) ? JMP FNL14 YES, RESULT = 0 ADA =D15 NO. A = SHIFT-16 TO INTEGERIZE. SSA SHIFT<16 ? JMP FINL3 YES. MIGHT BE <0 (OFL) STA EXP NO. REMEMBER REST OF SHIFT. LDA MANT+2 DO WORD SHIFT. IOR MANT+1 STA MANT+2 LDB MANT STB MANT+1 ASR16 ASR 16 STB MANT LDA EXP REST OF SHIFT JMP FINL4 GO DO IT. FINL3 ADA =D16 SHIFT. CLE,SSA <0 ? (OVERFLOW) JMP FNL15 YES. FINL4 SZA,RSS NO. SHIFT>0 ? JMP FNL4A NO, DONE SHIFTING. IOR ASR16 FORM ASR SHIFT STA XEQ+1 LDB MANT+1 CATCH BITS SHIFTED PAST POINT. CLA JSB XEQ IOR MANT+2 JUST OR THEM IN STA MANT+2 LDB MANT NOW DO THE SHIFT. LDA MANT+1 JSB XEQ STB MANT STA MANT+1 FNL4A LDB MANT NUMBER<0 ? SSB,RSS JMP FINL5 NO. LDA MANT+2 YES. CHECK FOR BITS PAST POINT. IOR MANT+3 SZA,RSS JMP FINL5 IF NONE. ISZ MANT+1 SOME. INCREMENT RESULT. JMP *+2 NO CARRY. INB PROPOGATE CARRY. FINL5 LDA TYPE,I SINGLE OR DOUBLE INTEGER ? CLE,SZA JMP FNL5A DOUBLE, DONE. LDA MANT+1 SINGLE, SHORTEN IT. ASL 16 SOC OVERFLOW ? JMP FNL15 YES. (E=0) FNL5A STB MANT NO. UPDATE FIRST WORD. JMP FNL11 * * ROUND FLOATING. CHECK FOR OFL UFL, PACK EXPONENT. * FINL6 LDB .177 ADD 200B TO ROUND. JSB .XCOM ROUND. ALSO SET INPUA TO LWA. LDB EXP CHECK EXP CLA FOR USE IN FORMATTING EXP ASL 8 MUST FIT IN 8 BITS WITH SIGN. SOC JMP FNL13 NO, OFL/UFL. CLE,ELB E=EXP SIGN, B<15:9>=EXP MANT. BLF,BLF B<7:1>=EXP MANT. RBR,ELB B<7:0>=FORMATTED EXPONENT. LDA INPUA,I LAST WORD MANTISSA. AND =B177400 MAKE ROOM FOR EXP. IOR B PUT TOGETHER. STA INPUA,I FNL11 LDA AMANT COPY RESULT. LDB ADX STB INPUB LDB LENTH,I SET UP COUNT. CMB,INB STB INPUA FNL12 LDB A,I CAN'T USE .MVW: IS TYPE 7. STB INPUB,I INA INCR ADDRESSES & LOOP. ISZ INPUB ISZ INPUA DO "LENTH" TIMES. JMP FNL12 STA SWITH,I INDICATE PRESENCE OF NUMBER. JMP INPUT,I EXIT. * * OVERFLOW & UNDERFLOW HANDLING. * FNL13 CCE,SSB OFL OR UFL ? (IF OFL, E=1) FNL14 CLA,CLE,RSS UFL. (E=0) FNL15 LDA =B77777 OFL. E=1 IF FLOATING. STA MANT RAL,ARS UFL:0 OFL:-1 STA MANT+1 STA MANT+2 STA MANT+3 CCB,SEZ,RSS INTEGER OR UFL ? (B=-1) JMP FNL11 YES, DONE. ADB LENTH,I NO, COMPUTE ADDR LAST WORD. ADB AMANT LDA B,I FLOATING & OFL, CLEAR LAST BIT. ALS STA B,I JMP FNL11 GO COPY IT. SKP * FREE-FIELD OCTAL PROCESSING. * INOCT STA POST SZB IF POST WAS NON ZERO, TREAT AS A JMP INBLN BLANK. STB CFLAG,I RESET CFLAG TO SAY NO COMMA LDA FCR,I SZA TEST FOR FREE FIELD INPUT JMP ERR4 INOC2 JSB INCHR GET NEXT CHARACTER. JSB DIGIT CHECK FOR DIGIT. JMP INOC1 NO. LDB MANT GET PREVIOUS OCTAL RESULT BLF,RBR SHIFT LEFT 3. IOR B MERGE WITH NEW DIGIT. STA MANT JMP INOC2 INOC1 LDA MANT FLOAT IT. JSB FLOAT STA MANT BRS STB EXP STA SWITH,I INDICATES NUMBER PROCESSED (A.NE.7) CPA BLANK IF TERMINATING CHARACTER IS JMP INPCK OTHER THAN A BLANK, CCB UNREAD IT. ADB BCR,I STB BCR,I CCB ADB CCNT,I STB CCNT,I JMP INPCK END