ASMB,R,B,L NAM FF.C END ASMB,R,B,L,X HED REAL TIME FORTRAN FORMATTER NAM FRMTR,7,0,0,0,0,0,0,0 * N O V E M B E R 6 , 1 9 6 8 ENT .DIO.,.BIO.,.IOI.,.IOR. ENT .IAR.,.RAR.,.DTA. ENT OLDIO EXT EXEC,.FLUN,.PACK,FLOAT,IFIX EXT .OPSY * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 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. * * * * * * * * * * * * * * * * * * * * * * 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: * JSB .IOR. WILL CONVERT A FLOATING POINT NUMBER. * JSB .IOI. WILL CONVERT A FIXED POINT NUMBER. * JSB .RAR. OR .IAR. WILL CONVERT AN ENTIRE ARRAY, IN FLOATING * POINT OR FIXED POINT. (A=#OF ELEMENTS, B=ADDRESS OF FIRST * ELEMENT * * TERMINATION CALL: (USED ONLY FOR OUTPUT) * * JSB .DTA. * * * * * * * * * * * * * * * * * * * * *************************** * * * CONSTANTS AND VARIABLES * * * *************************** A EQU 0 B EQU 1 .177 OCT 177 USED TO MASK CHARACTERS BLANK OCT 40 ALPHABETIC COMMA OCT 54 E OCT 105 CONSTANTS ASCIA OCT 101 ASCII "A" F OCT 106 H OCT 110 I OCT 111 OCTAL OCT 100 @B PRECEDING A NUMBER IN FREE- * FIELD INPUT INDICATES OCTAL. .36 OCT 36 QUOTE OCT 42 " SLASH OCT 57 ..7 OCT 7 ..67 OCT 67 ....6 OCT 6 X OCT 130 K OCT 113 ASCII K LPREN OCT 50 .4000 OCT 4000 RPREN OCT 51 PLUS OCT 53 MINUS OCT 55 POINT OCT 56 MONEY OCT 44 DOLLAR SIGN ($) CNTRL BSS 1 D13 DEC 13 D15 DEC -15 MIN2 DEC -2 MIN72 OCT -72 .12 OCT 12 BCR BSS 1 PAPER OCT 34000 TEST FOR PAPER TAPE. PBIT OCT 200 SET BIT FOR IOC. TENTH OCT 63146 FIRST 15 BITS OF THE NUMBER 0.1 ...60 OCT 60 SAME AS ASC ZERO MIN16 DEC -16 MIN1 DEC -1 BASIC OCT 400 ASC2B OCT 500 MIN5 DEC -5 NINE DEC 9 ...61 OCT 61 HIMSK OCT 174000 MIN4 OCT 177774 MIN3 OCT -3 TEMP1 BSS 1 TEMPORARY TEMP2 BSS 1 STORAGE FCR BSS 1 POINTS TO CHARACTER IN FORMAT DBLNK BSS 1 FLAG FOR SKIPPING BLANKS IN FMT DCOMA BSS 1 FLAG FOR SKIPPING COMMAS IN FMT BCRS BSS 1 USED FOR REMEMBERING BCR CCNT BSS 1 COUNTS WORDS/CHARS IN BUFFER RF BSS 1 FORMAT REPEAT FIELD COUNTER IO BSS 1 FLAG...=0 FOR OUTPUT, 1 FOR IN NEST BSS 1 COUNTS PAREN. LEVEL IN FORMATS. * INITIALLY -3, =-2 WITHIN FMT, * -1 IN INNER PARENS. RF1 BSS 1 REPEAT COUNTER FOR INNER PARENS RF2 BSS 1 USED TO RECALL REPEAT COUNT SKIPL BSS 1 FLAG SET TO AVOID A SPURIOUS RE- * TURN TO THE LIST OVTOG BSS 1 FLAG TO SAY WHETHER OUTBUFFER IS BOMBED PREN1 BSS 1 USED AS POINTERS TO PARENS IN PREN2 BSS 1 FORMATS. SIGN BSS 1 USUALLY INDICATES SIGN OF NUMBER W BSS 1 COUNTER OF W-FIELD WSAVE BSS 1 HOLDS INITIAL W FOR REPEATS D BSS 1 COUNTER OF D-FIELD DSAVE BSS 1 HOLDS INITIAL D FOR REPEATS BCNT BSS 1 COUNTS LEADING BLANKS FOR OUTPUT DT BSS 1 TEMP D FOR OUTPUT OVERFLOW MANTS BSS 2 EXPS BSS 1 EXPON BSS 1 EXPONENT PART OF NUMBER UNIT OCT 1 INPUT/OUTPUT UNIT BCTEM EQU TEMP2 TEMPORARY FOR OUTPUT MULT1 BSS 1 TEMPORARIES FOR MULT2 EQU TEMP2 MULTO ESIGN BSS 1 HOLDS EXPONENT SIGN SKIP BSS 1 FLAG FOR INPUT SKIPPING POST BSS 1 INPUT CONTROL INDICATOR CFLAG EQU MULT1 COMMA CHECK FOR FREE-FIELD INPUT ENDLS BSS 1 POINTS TO ENDOF CALLING SEQUENCE ARRAY BSS 1 USED BY .RAR. ALNTH BSS 1 AND .IAR. BFLAG BSS 1 =1 FOR BINARY I/O, 0 FOR DECIMAL STATT BSS 1 MANT BSS 2 MIN10 DEC -10 ...72 OCT 72 STXXX NOP BUFBN EQU 60 BUFLN EQU 67 BUFI BSS BUFLN BUFO EQU BUFI BINRY ABS -BUFBN-BUFBN BINRY RECORD LINGTH ASCRY ABS -BUFLN-BUFLN ASCII RECORD LENGTH ********************* * UTILITY ROUTINES * ********************* * * THE ROUTINES THAT HANDLE CHARACTER MANIPULATION USE * THE FOLLOWING ADDRESSING SCHEME: * THE ADDRESS OF THE WORD IS CONTAINED IN BITS [15:1] * AND BIT 0 IS EITHER 0 FOR THE CHARACTER CONTAINED * IN BITS [14:8], OR 1 FOR THE CHARACTER CONTAINED IN * BITS [6:0]. THUS, A STRING OF CHARACTERS HAVE AD- * DRESSES WHICH ARE SEQUENTIAL. FOR EXAMPLE, IF LOCA- * TION 1000 CONTAINS THE TWO CHARACTERS A AND B, THE * CHARACTER ADDRESS OF THE A IS 2000, AND THAT OF THE * B IS 2001. THE SINGLE BIT IS REFERRED TO BELOW AS * THE C-BIT. ******************************* BUF2A NOP * THE CHAR WHOSE LOCN IS IN B IS ******************************* PUT INTO A CLE,ERB POSITION ADDRESS AND SET E=C-BIT LDA B,I WORD CONTAINING CHARACTER TO A. SEZ,RSS IF E=0, ROTATE TO GET THE CHAR- ALF,ALF ACTER IN A[6:0]. AND .177 MASK OUT EXTRANEOUS BITS. JMP BUF2A,I RETURN WITH CHAR IN A. ******************************* A2BUF NOP * THE CHAR IN A IS PUT IN THE ******************************* LOCATION GIVEN BY B. STA TEMP1 SAVE THE CHARACTER SLB,INB COMPLEMENT THE LOW ORDER BIT ADB MIN2 OF B. JSB BUF2A GET THE OTHER CHARACTER IN THE ALF,ALF MEMORY WORD AND ROTATE TO HI END IOR TEMP1 MERGE THE OTHER CHARACTER. SEZ ROTATE IF ALF,ALF NECESSARY. STA B,I STORE THE NEW WORD. JMP A2BUF,I RETURN ******************************* FCHAR NOP * THE NEXT CHAR IN THE FORMAT IS ******************************* MOVED TO A NCHAR ISZ FCR ADVANCE FORMAT STRING POINTER. LDB FCR LOAD CHARACTER INTO A AND TEST JSB BUF2A FOR BLANK OR COMMA LDB DBLNK SKIP BLANKS IF DBLNK=1 SZB,RSS JMP *+3 DON'T SKIP BLANKS. CPA BLANK IF DBLNK=1 AND A=BLANK, GO GET JMP NCHAR ANOTHER CHARACTER. LDB DCOMA SKIP COMMAS IF DCOMA=1 SZB,RSS JMP FCHAR,I RETURN CPA COMMA IF DCOMA=1 AND A=COMMA, GO GET JMP NCHAR ANOTHER CHARACTER JMP FCHAR,I RETURN ******************************* OUTCR NOP * THE CHAR IN A IS PLACED IN THE ******************************* OUTPUT STRING. ISZ CCNT END OF THE BUFFER ? JMP OUTC1 CCA YES-- RESET CCNT AND RETURN STA CCNT JMP OUTC2 SET OVTOG TO SAY BUFFER IS BOMBED OUTC1 ISZ BCR ADVANCE BUFFER POINTER LDB BCR JSB A2BUF STORE CHARACTER IN BUFFER. CLA CLEAR OVTOG AND WERE OKAY OUTC2 STA OVTOG JMP OUTCR,I RETURN. ******************************* INCHR NOP GETS NEXT CHAR FROM BUFFER LDA CCNT IF CCNT=0 THEN SZA,RSS GET THE NEXT JSB DTA LINE. ISZ CCNT IF CCNT=-1 THEN SKIP JMP GETC CCA RESET CCNT TO -1. STA CCNT LDA POST IF BEGINNING OF NUMBER SCAN IOR FCR IN FREE FIELD INPUT, SZA,RSS RETURN TO END OF JMP ENDLS,I LIST. LDA BLANK OTHERWISE RETURN A BLANK. JMP INCHR,I GETC ISZ BCR IF CCNT<-1 THEN LDB BCR JUST JSB BUF2A GET THE NEXT JMP INCHR,I CHARACTER DIGIT NOP * 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. LDB A PLACE THE CHARACTER IN B. ADB MIN72 CHARACTERS > '9' REMAIN POSITIVE SSB,RSS SKIP IF B NEGATIVE JMP DIGIT,I RETURN...NOT A DIGIT ADB .12 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 ******************************* FINTG NOP * COMPUTES THE INTEGER IN THE FOR- * * MAT STRING. THE FIRST DIGIT ******************************* IS ALREADY IN A. CLB STB DCOMA DON'T SKIP COMMAS NOW FINT1 STA TEMP1 SAVE RESULT SO FAR JSB FCHAR GET NEXT CHARACTER JSB DIGIT CHECK FOR DIGIT JMP GOTIT END OF INTEGER LDB TEMP1 MULTIPLY RESULT SO BLS,BLS FAR BY TEN. ADB TEMP1 BLS ADA B ADD TO NEW DIGIT JMP FINT1 LOOP GOTIT CCB BACK UP FORMAT POINTER ADB FCR STB FCR LDA TEMP1 RETURN WITH JMP FINTG,I RESULT IN A ******************************* INT NOP * COMPUTES THE NEXT NUMBER IN THE ******************************* FORMAT STRING, FROM SCRATCH. JSB FCHAR GET ONE CHARACTER JSB DIGIT TEST FOR DIGIT JMP ERR1 NO DIGIT JSB FINTG GET THE REST OF THE INTEGER JMP INT,I RETURN ******************************************************************** 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. * * * ******************************************************************** RFCHK NOP CHECKS REPEAT FIELD FOR EXHAUS- ISZ RF TION. IF RF GOES TO ZERO, CON- JMP RFCHK,I TROL FALLS THROUGH TO FORMT. FORMT CLA,INA SET DBLNK AND DCOMA FOR SKIPPING. STA DBLNK STA DCOMA CCA FORM1 STA RF SET REPEAT FIELD AT ONE. JSB FCHAR GET THE CHARACTER AND TEST IT CPA E FOR TYPES JMP ETYPE CPA F JMP FTYPE CPA OCTAL TEST FOR OCTAL TYPE JMP OTYPE CPA K ALTERNATIVE OCTAL TYPE JMP OTYPE CPA ASCIA TEST FOR A TYPE JMP ATYPE CPA H JMP HTYPE CPA I JMP ITYPE CPA QUOTE JMP QTYPE CPA SLASH JMP INOUT CPA X JMP XTYPE CPA LPREN JMP LPTYP CPA RPREN JMP RPTYP JSB DIGIT LAST CHANCE JMP ERR3 UNKNOWN CHARACTER JSB FINTG GET THE REST OF THE NUMBER. CMA,INA,SZA,RSS JMP ERR3 JMP FORM1 ***************************************** * * * FOLLOWING ARE THE CONVERSION ROUTINES * * * ***************************************** IOCHK NOP A SWITCH ON THE VALUE OF IO. RE- LDB IO TURN TO P+1 FOR OUTPUT, P+2 FOR SZB INPUT. ISZ IOCHK JMP IOCHK,I HED X AND H SPECIFICATIONS ********************************** * XTYPE HANDLES X-CONVERSION * ********************************** XTYPE LDA BLANK IN CASE OF OUTPUT JSB IOCHK WHICH WAY? JMP XOUT OUT JSB INCHR IN RSS SKIP XOUT JSB OUTCR OUT JSB RFCHK TEST RF JMP XTYPE LOOP ********************************** * HTYPE HANDLES H-CONVERSION * ********************************** HTYPE CLA SET FOR NO STA DBLNK SKIPPING STA DCOMA HLOOP JSB IOCHK WHICH WAY? JMP HOUT OUT JSB INCHR IN ISZ FCR ADVANCE FORMAT POINTER LDB FCR JSB A2BUF 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 A SPECIFICATIONS * ATYPE HANDLES A-SPECIFICATIONS ATYPE CLA GET STA SIGN THE JSB WGET W-FIELD ALOOP JSB AOSET JSB IOCHK IN/OUT SWITCH JMP AOUT * A-INPUT AIN CLA INITIALIZE MANT TO ZERO STA MANT AIN1 JSB INCHR READ A CHARACTER LDB W FIGURE OUT WHAT TO DO WITH IT INB,SZB IF W NOT -1, ALF,ALF ROTATE IT IOR MANT PUT IN PREVIOUS RESULT INB STORE ONLY IF SSB,RSS W IS -2 OR -1 STA MANT ISZ W TEST FOR FINISHED JMP AIN1 NOT YET ATYP1 JSB $ASET JMP ALOOP * AOUT LDA MANT GET SYMBOL TO GO OUT LDB W GET W INB,SZB IF NOT -1 WE WANT THE ALF,ALF HIGH PART AND .177 ONE CHARACTER ONLY INB SSB IF NOT -1 OF -2 WE WANT LDA BLANK BLANK JSB OUTCR THERE IT GOES ISZ W ALL DONE YET JMP AOUT NOPE JMP ATYP1 END OF ASPECIFICATIONS * HED K SPECIFICATION *OTYPE HANDLES @ SPECIFICATIONS * OTYPE CLA GET STA SIGN THE JSB WGET W- FIELD OLOOP JSB AOSET JSB IOCHK IN/OUT SWITCH JMP OCOUT * OCTAL INPUT * CLA INITIALIZE TO STA MANT ZERO OCT1 JSB INCHR GET A CHARACTER STA B SAVE IN B IOR ..7 TEST FOR OCTAL DIGIT CPA ..67 JMP OCT2 IT IS ONE OCT3 ISZ W END OF THIS INPUT ??? JMP OCT1 NOPE OCT6 JSB $ASET YES--TEST FOR END OF SPEC JMP OLOOP * ADD NEW DIGIT IN * OCT2 LDA 1 GET OCTAL DIGIT BACK IN A AND ..7 REMOVE ASCII BITS LDB MANT REPOSITION PREVIOUS RESULT BLF,RBR ADA 1 ADD TO NEW DIGIT STA MANT PUT IT BACK JMP OCT3 * OCTAL OUTPUT * OCOUT LDA BLANK LDB W IS W GEQ -6? ADB ....6 SSB JMP OCT4 NO---OUTPUT A BLANK LDA MANT 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 ...60 ASCII BITS OCT4 JSB OUTCR THERE IT GOES ISZ W END OF VALUE? JMP OCOUT JMP OCT6 * END OF OCTAL SPECIFICATIONS AOSET NOP JSB WDSET JSB F2LST JSB IOCHK RSS JMP AOSET,I LDA MANT FOR OUTPUT WE HAVE LDB EXP TO REUNNORMALIZE ADB MIN16 THE INTEGER AOST1 STA MANT INB,SZB,RSS JMP AOSET,I ARS JMP AOST1 $ASET NOP LDA .36 FOR INPUT, FOOL .IOR. STA MANT+1 BY SETTING EXPONENT TO 15 JSB RFCHK JMP $ASET,I