PROGRAM SEEIPF C C THIS WAS CONVERTED TO LSI FORTRAN '66 FROM P-E FORTRAN '77. C C C Program to interpret intermediate plot file. C C Record 1 is the global record as follows: C 1- 8 DATE (ASCII) C 13-20 TIME (ASCII) C 21-24 NPLOTS (BINARY) C 49-50 RECORD POINTER, 1ST PLOT (BINARY) C 51-52 " " 2ND " " C ETC C C The first record of each plot has the following layout: C C 1- 8 Plot minimum x value (ASCII, F8.2) C 9-16 " maximum " " " C 16-24 " minimum Y " " C 25-32 " maximum " " " C 51-80 Plot instructions C C All other plot records contain plot instructions in bytes 1-248. C C Each plot command is made up of 9 bytes as follows: C C Byte 1, command (ASCII): C A = Plot Start C B = Plot Stop C C = Move Pen Up C D = Move Pen Down C E = Message to operator C F = SYMBOL start C G = SYMBOL stop C H = NUMBER start C I = NUMBER stop C J = AXIS start C K = AXIS stop C L = DSHLIN start C M = DSHLIN stop C N = LINE start C O = LINE stop C P = COLOR selection C C Bytes 2-5, X value (REAL*4) C Bytes 6-9, Y value " C C For Message to Operator (command=E), bytes 2-5 will be C the number of characters in the message (INTEGER*4). The C message will then occupy the next contiguous bytes. C C LU 1 = Intermediate Plot File C LU 6 = Output (print) device. (May be NULL:) C C INTEGER*4 IPNO INTEGER*4 LABEL(2) INTEGER*4 LF(2), LH(2), LJ(2), LL(2), LN(2) LOGICAL EQBYT,SCREEN INTEGER*4 RNAME(5) BYTE A,B,C,D,E,F,G,H,II,JJ,KK,L,M,N,O,P INTEGER*4 DATE(2), TIME(2), XMIN(2), XMAX(2), YMIN(2), YMAX(2) INTEGER*4 INREC(20), NCHAR INTEGER*2 PTR(15), POINTR(15), BYTPTR C BYTE INBUFF(80) BYTE FUNC,IANS BYTE MBUF(64) C EQUIVALENCE (INBUFF,INREC), (DATE,INBUFF(1)), (TIME,INBUFF(13)) EQUIVALENCE (NPLTS,INBUFF(21)), (POINTR(1),INBUFF(49)) EQUIVALENCE (XMIN,INBUFF(1)), (XMAX,INBUFF(9)) EQUIVALENCE (YMIN,INBUFF(17)), (YMAX,INBUFF(25)) EQUIVALENCE (MSGBUF,MBUF) C DATA LF/'SYMB','OL '/, LH/'NUMB','ER '/, LJ/'AXIS',' '/ DATA LL/'DSHL','IN '/, LN/'LINE',' '/ DATA A/'A'/, B/'B'/, C/'C'/, D/'D'/, E/'E'/, F/'F'/, G/'G'/ DATA H/'H'/, II/'I'/, JJ/'J'/, KK/'K'/, L/'L'/, M/'M'/, N/'N'/ DATA O/'O'/, P/'P'/ C DATA LABEL /' ',' '/ C LTHPLT =80 C C GET THE IPF NAME C TYPE 2 2 FORMAT (' ENTER NAME OF IPF.') ACCEPT 3, RNAME 3 FORMAT (20A4) C C C C OPEN THE INPUT FILE C OPEN (UNIT=1,FORM='UNFORMATTED', RECORDSIZE=20, 1 NAME=RNAME, ACCESS='DIRECT', TYPE='OLD') C C OPEN (UNIT=8,FORM='FORMATTED',RECORDSIZE=132,NAME='SEEIPF.LU6', C 1 ACCESS='SEQUENTIAL',TYPE='NEW') C SCREEN=.FALSE. 4 TYPE 11 11 FORMAT('$Output for printer or screen (P/S) ?') ACCEPT 6,IANS 6 FORMAT(A1) IF(IANS.EQ.'P'.OR.IANS.EQ.'p')GOTO 8 IF(IANS.NE.'S'.AND.IANS.NE.'s')GOTO 4 OPEN(UNIT=7,NAME='TI:') SCREEN=.TRUE. GOTO 9 8 OPEN (UNIT=7,FORM='FORMATTED', RECORDSIZE=80, 1 NAME='SEEIPF.LU7', ACCESS='SEQUENTIAL', TYPE='NEW') C C READ THE GLOBAL HEADER RECORD C D WRITE (7,9992) D9992 FORMAT (' PROGRAM SEEIPF STARTING.') 9 READ (1'1) INBUFF C C MAXIMUM OF 15 PLOTS ALLOWED. C IF (NPLTS.GT.15) NPLTS=15 C C SAVE THE FILE START POINTERS. C DO 5 I=1,NPLTS 5 PTR(I) =POINTR(I) C C SAVE THE NUMBER OF PLOTS C NPLOTS =NPLTS C C DISPLAY THE GLOBAL HEADER INFORMATION C WRITE (7,10) 10 FORMAT ('1MURDOCH UNIVERSITY PLOT FILE INFORMATION'/1H ,40(1H-)) WRITE (7,15) DATE,TIME,NPLOTS,(PTR(I),I=1,NPLOTS) 15 FORMAT ('0DATE: ',2A4,5X,'TIME: ',2A4/ 1 ' NUMBER OF PLOTS: ',I4/ 2 ' PLOT START RECORD POINTERS:',10I5/9(28X,10I5/)) C TYPE 10 TYPE 15,DATE,TIME,NPLOTS,(PTR(I),I=1,NPLOTS) C NPLT =NPLOTS C C WHICH PLOT IS REQUIRED? C 20 TYPE 22 22 FORMAT (' WHICH PLOT DO YOU WANT TO SEE? (I2)'/ 1 ' ENTER 00 IF FINISHED.') C ACCEPT 23,NPLT 23 FORMAT (I2) IF (NPLT.NE.0) GO TO 24 IF(SCREEN)STOP CLOSE (UNIT=7,DISP='PRINT') C STOP C C RANGE CHECK THE PLOT WANTED C 24 IF (NPLT.LT.1.OR.NPLT.GT.NPLOTS) GO TO 20 C NERR =0 !ERROR COUNT C C READ THE GLOBAL HEADER RECORD C 25 READ (1'1) INBUFF C C READ THE PLOT'S EXTREMA INFORMATION. C NREC =PTR(NPLT) !1ST PLOT RECORD D WRITE (7,9990) NREC D9990 FORMAT (' NREC=',I5) C READ (1'NREC) INBUFF C C DISPLAY THE EXTREMA C WRITE (7,30) NPLT,XMIN,XMAX,YMIN,YMAX 30 FORMAT (' EXTREMA FOR PLOT',I3,1H:/ 1 5X,' X MIN= ',2A4,5X,' X MAX= ',2A4/ 2 5X,' Y MIN= ',2A4,5X,' Y MAX= ',2A4) C C SET THE BUFFER POINTER TO START OF PLOT COMMANDS. C BYTPTR =50 C C IS THE NEXT BYTE A RECOGNIZED FUNCTION? C 40 FUNC =INBUFF(BYTPTR) BYTPTR =BYTPTR+1 IF (FUNC.GE.A.AND.FUNC.LE.P) GO TO 45 C C ERROR: FUNCTION OUT OF RANGE. C D WRITE (7,9990) BYTPTR,FUNC D9991 FORMAT (' FUNC ERR, BYTPTR,FUNC=',I5,2X,A1) IBYTE =BYTPTR-1 WRITE (7,42) IBYTE,NREC 42 FORMAT (' ERROR: BYTE',I4,' OF REC',I5,' NOT A DEFINED FUNCTION.') NERR =NERR+1 !ERROR COUNTER GO TO 200 C C IS IT A START/STOP FUNCTION? C 45 IF (FUNC.GE.F.AND.FUNC.LE.O) GO TO 130 C C IS IT AN OPERATOR MESSAGE? C IF (FUNC.NE.E) GO TO 80 C C IT IS AN OPERATOR MESSAGE. C HOW MANY CHARACTERS IN THE MESSAGE? C CALL CPYBYT (INREC,BYTPTR-1,NCHAR,0,4) BYTPTR =BYTPTR+4 C C RANGE CHECK THE NUMBER OF CHARACTERS. C IF (NCHAR.GE.1.AND.NCHAR.LE.64) GO TO 50 C C ERROR. C WRITE (7,48) 48 FORMAT (' ERROR: OPERATOR MESSAGE NOT 1-64. ', 1 'REC=',I5,' BYTE=',I4,' VALUE=',I5) STOP C C BLANK OUT THE MESSAGE BUFFER. C 50 CALL FILBYT (' ',0,MBUF(1),0,64) C C ASSEMBLE THE PLOT LINE C DO 60 I=1,NCHAR IF (BYTPTR.LE.LTHPLT) GO TO 58 C C WE MUST READ IN THE NEXT RECORD. C NREC =NREC+1 C C IS THIS THE LAST PLOT? C IF (NPLT.EQ.NPLOTS) GO TO 55 C C SEE IF WE ARE BEYOND THIS PLOT. C IF (NREC.LE.PTR(NPLT+1)) GO TO 55 C C ERROR: END OF PLOT C WRITE (7,53) NPLT 53 FORMAT (' END OF PLOT',I3) GO TO 20 C C READ THE NEXT RECORD C 55 READ (1'NREC) INBUFF BYTPTR =1 C C PASS THE CHARACTER ACROSS. C 58 MBUF(I) =INBUFF(BYTPTR) BYTPTR =BYTPTR+1 C 60 CONTINUE C C NOW OUTPUT THE LINE. C WRITE (7,65) (MBUF(I),I=1,NCHAR) 65 FORMAT (' OPERATOR MESG: ',64A1) C GO TO 200 C C IS IT 'PLOT START'? C 80 IF (FUNC.NE.A) GO TO 90 C WRITE (7,85) NPLT 85 FORMAT (' PLOT',I3,' START') BYTPTR =BYTPTR+8 !BYPASS X,Y FIELDS GO TO 200 C C IS IT 'PLOT STOP'? C 90 IF (FUNC.NE.B) GO TO 100 C WRITE (7,95) NPLT 95 FORMAT (' PLOT',I3,' STOP') WRITE (7,98) NERR 98 FORMAT (1H ,I5,' ERRORS WERE DETECTED IN THIS PLOT.') GO TO 20 C C IS IT A PEN COLOR SELECTION? C 100 IF (FUNC.EQ.P) GO TO 120 C C IT MUST BE A PEN MOVE. C GET THE X,Y COORDINATES. C CALL CPYBYT (INREC,BYTPTR-1,X,0,4) BYTPTR =BYTPTR+4 CALL CPYBYT (INREC,BYTPTR-1,Y,0,4) BYTPTR =BYTPTR+4 C C OUTPUT THE APPROPRIATE PEN UP/DOWN MESSAGE. C IF (FUNC.EQ.D) GO TO 110 C C HERE FOR 'PEN UP'. C WRITE (7,105) X,Y,LABEL 105 FORMAT (' MOVE, PEN UP ',F8.2,2H, ,F8.2,4X,2A4) GO TO 200 C C IT MUST BE A MOVE WITH PEN DOWN. C 110 WRITE (7,115) X,Y,LABEL 115 FORMAT (' MOVE, PEN DOWN ',F8.2,2H, ,F8.2,4X,2A4) GO TO 200 C C IT IS A PEN COLOR SELECTION. C 120 BYTPTR =BYTPTR+4 CALL CPYBYT (INREC,BYTPTR-1,IPNO,0,4) BYTPTR =BYTPTR+4 C WRITE (7,125) IPNO 125 FORMAT (' PEN COLOR SELECTION:',I4) GO TO 200 C C HERE IF IT IS A START/STOP FUNCTION. C MOVE APPROPRIATE DESCRIPTION INTO "LABEL". C 130 CALL FILBYT (' ',0,LABEL,0,8) IF (FUNC.EQ.F) CALL CPYBYT (LF,0,LABEL,0,8) IF (FUNC.EQ.H) CALL CPYBYT (LH,0,LABEL,0,8) IF (FUNC.EQ.JJ) CALL CPYBYT (LJ,0,LABEL,0,8) IF (FUNC.EQ.L) CALL CPYBYT (LL,0,LABEL,0,8) IF (FUNC.EQ.N) CALL CPYBYT (LN,0,LABEL,0,8) C C IS THERE ROOM IN THIS RECORD FOR ANOTHER 9-BYTE SET? C 200 IF (BYTPTR+8.LE.LTHPLT) GO TO 40 C C WE MUST READ ANOTHER RECORD. C NREC =NREC+1 C C IS THIS THE LAST PLOT? C IF (NPLT.EQ.NPLOTS) GO TO 140 C C SEE IF WE ARE BEYOND THIS PLOT. C IF (NREC.LE.PTR(NPLT+1)) GO TO 140 C C END OF PLOT C WRITE (7,53) NPLT WRITE (7,98) NERR GO TO 20 C C READ THE NEXT RECORD. C 140 READ (1'NREC) INBUFF BYTPTR =1 GO TO 40 C END