A large commit.
[pdp8.git] / sw / rescue / lab8e_goettingen / disk2_11 / rkb / paroff / haefir.ft
diff --git a/sw/rescue/lab8e_goettingen/disk2_11/rkb/paroff/haefir.ft b/sw/rescue/lab8e_goettingen/disk2_11/rkb/paroff/haefir.ft
new file mode 100644 (file)
index 0000000..650a488
--- /dev/null
@@ -0,0 +1,236 @@
+C      -+-+-+-+-+ \ e  H A E F I R . F T  \ e -+-+-+-+-+\r
+C\r
+C      PLOT THE DATA POINTS\r
+C\r
+       SUBROUTINE FIRPLT\r
+       INCLUDE HAEPTI.FI\r
+       INCLUDE HAEBUF.FI\r
+       INCLUDE HAEGSA.FI\r
+       INCLUDE HAETTY.FI\r
+       INCLUDE HABRK.FI\r
+       INCLUDE HAECSZ.FI\r
+       INCLUDE HAPPEN.FI\r
+       REAL XYSAM,COND\r
+       INTEGER NCOND,TOASCI\r
+       EXTERNAL XYSAM,NCOND,COND,TOASCI\r
+C\r
+\fC\r
+       LOGICAL TIMABZ,TIMORD,          @ ABZISSE / ORDINATE IS TIME SCALE\r
+     *  ABISMI                         @ IF THE ABZISSA SCALE EXCEEDS 5 MINUTES THEN .TRUE. ELSE .FALSE.\r
+       INTEGER I,K,J,PENPOS,\r
+     *  STEP,                          @ INCREMENT IN SAMBUF SCAN\r
+     *  CA,CO,                         @ CHANNEL OF ABZISSE, ORDINATE\r
+     *  PLBEG,PLEND,                   @ START/END OF TIME SCALE\r
+     *  NUMCN,                         @ NUMBER OF CHANNELS TO SCAN (NO MEANING IF TIMABZ IS SET .FALSE.)\r
+     *  EXPAND                         @ IF THE TIME SCALE .LE. 5 SECONDS THEN WE MARK EACH 1/10 SECOND ELSE EACH SECOND\r
+       REAL TEMSET,                    @ DIFFERENCE PLOTTER 0,0 AND PICTURE 0,0 (NO MEANING IF TIMABZ IS SET TO .FALSE.)\r
+     *  LEFT,RIGHT,UP,DOWN,            @ PLOT SCALES ABZISSE/ ORDINATE\r
+     *  TE1,TE2,TE3                    @ TEMPS\r
+       REAL OMAX,OMIN,                 @ MAXIMUM AND MINIMUM OF ORDINATE DATA\r
+     *  THRU,THRL                      @ UPPER, LOWER THRESHOLD\r
+       INTEGER TEXT0(4)                @ DIMENSION OF THE TIME AXIS (MIN OR SEC)\r
+       DATA CA,CO,NUMCN,STEP /0,8,2,3/,\r
+     *  TEXT0 /'TIME [MIN]  TIME [SEC]'/\r
+C\r
+C      STATEMENT FUNCTIONS ARE:\r
+C\r
+       BETW(AP0,BP0,CP0)=AP0.LE.BP0.AND.BP0.LT.CP0\r
+       LOGICAL BETW\r
+       FIR(IP0)=-XYSAM(IP0-4,0)-XYSAM(IP0-3,0)+\r
+     *  XYSAM(IP0-1,0)+2*XYSAM(IP0,0)+XYSAM(IP0+1,0)-\r
+     *  XYSAM(IP0+3,0)-XYSAM(IP0+4,0) @ SAMCNT FINITE IMPULSE RESPONSE FILTER\r
+C\r
+       XF(IP1)=XYSAM(IP1,CA)-LEFT      @ RETURNS THE VALUE OF THE ABZISSA WITH CORRECT OFFSET\r
+       DFIR(IP2)=COND(BETW(THRL,FIR(IP2),THRU),0,120.)\r
+       YF(IP1)=COND(CO.EQ.0,FIR(IP1),DFIR(IP1))\r
+C\r
+       IF (SAMCNT.EQ.0) RETURN         @ NO SAMPLE, NOTHING TO DO\r
+C      \r
+C      COMPUTE THE DEFAULT VALUES FOR THE PLOT\r
+C\r
+       IF (OPTION.EQ.11) GOTO 15       @ SP- SKIPS QUESTIONS AND TAKES THE LAST VALUES USED\r
+       CO=0                            @ THE ORDINATE IS CHANNEL 0\r
+       CA=8                            @ THE ABZISSA IS THE TIME SCALE\r
+       NUMCN=CHNLS-CO                  @ ALL CHANNELS TO PLOT\r
+       STEP=3                          @ WE PLOT EACH THIRD POINT OF THE DATA\r
+       IF (OPTION.NE.12) CALL ASKHIM (2) @ SP* DOES NOT ASK SILLY QUESTIONS\r
+       WRITE (TTO,1) CA,CO,STEP        @ READ CHANNEL ##\r
+       READ (TTI,2) I,J,K              @   AND STEP INCREMENTS\r
+       IF BREAK(11) RETURN\r
+       CA=NCOND(I,I,CA)\r
+       CO=NCOND(J,J,CO)\r
+       STEP=NCOND(K,K,STEP)            @ STEP DEFAULTS TO "STEP"\r
+       TIMABZ=CA.GT.7                  @ ABZISSE IS THE TIME SCALE\r
+       TIMORD=CO.GT.7                  @ ORDINATE IS THE TIME SCALE\r
+       IF (.NOT.TIMABZ) GOTO 15        @ ABZISSA IS NO TIME SCALE: ONLY TWO CHANNELS (CO,CO+1) TO PLOT\r
+       NUMCN=MIN0(NUMCN,CHNLS-CO)      @ COMPUTE CORRECT NUMBER OF CHANNELS\r
+       WRITE (TTO,3) NUMCN             @ READ THE NUMBER OF CHANNELS TO SCAN\r
+       READ (TTI,2) I\r
+       NUMCN=MIN0(CHNLS-CO,NCOND(I,I,NUMCN)) @ NO INPUT MEANS CHNLS-CO\r
+       WRITE (TTO,5)\r
+       READ (TTI,6) THRL,THRU\r
+15     CONTINUE\r
+\fC\r
+C      COMPUTE THE SCALING LIMITS\r
+C\r
+       S0=BEGIN*SAMRAT                 @ HERE WE START THE OUTPUT PLOT\r
+       S1=ENDS*SAMRAT                  @ AND HERE WE END THE PLOT\r
+       PLBEG=BEGIN\r
+       PLEND=ENDS\r
+C\r
+       IF (S1.LE.SAMCNT) GOTO 17       @ IF THE INTERVALL TO PLOT EXCEEDS THE\r
+       TE1=SAMCNT/SAMRAT               @  DATA POINTS THEN\r
+       TE2=S1/SAMRAT\r
+       WRITE (TTO,4) TE1,TE2           @  WE PRINT THE OVERFLOW MSG AND\r
+       PLEND=TE1                       @  COMPUTE A NEW PLEND VALUE\r
+       S1=PLEND*SAMRAT-1               @ TAKE CARE FOR TRUNCATION ERRORS\r
+17     CONTINUE                        @ INTERVALL OK, COMPUTE UPPER AND LOWER MARGIN OF PLOT DATA\r
+       RIGHT=COND(TIMABZ,FLOAT(S1),512.) @ ABZISSE MARGIN EITHER TIME OR 10 BIT CONVERTER\r
+       LEFT =COND(TIMABZ,FLOAT(S0),-512.)\r
+       UP   =COND(TIMORD,FLOAT(S1),512.) @ ORDINATE MARGIN\r
+       DOWN =COND(TIMORD,FLOAT(S0),-512.)\r
+       IF BREAK(11) RETURN             @ USER GETS RID OF PRGRM\r
+       CALL STPLT                      @ START THE PLOTTER ( CALL PLOTS)\r
+       CALL XYPLOT (XOFSET,YOFSET,-PENUP) @ DRIVE PEN TO PICTURE ZERO\r
+C\r
+C      LOOP TO PLOT EACH CHANNEL WITH CORRECT OFFSET, FACTOR AND SCALE\r
+C      TEMSET HOLDS THE ORIGIN FOR EACH CHANNEL\r
+C      TEMSET=0  PLOT ONE CHANNEL/TIME OR X/Y\r
+C      TEMSET=YLEN/NUMCN FOR MORE THAN ONE CHANNEL\r
+C      THE TEMSET ORIGIN OFFSET IS RESET AT THE END OF THE LOOP ( ST. 25)\r
+C\r
+C\r
+       TEMSET=0\r
+       DO 20 K=1,NCOND(TIMABZ,NUMCN,1) @ SCAN NUMCN CHANNELS\r
+       IF (NUMCN.EQ.1 .OR. .NOT.TIMABZ) GOTO 51\r
+       TEMSET=FLOAT(NUMCN-K)*YLEN/FLOAT(NUMCN)+(NUMCN-K)*.5 @ TEMPORARY Y OFFSET\r
+       CALL XYPLOT (0,TEMSET,-PENUP)   @ SWITCH TO CORRECT PART OF PICTURE\r
+C\r
+C      COMPUTE THE FACTOR TO GET A PRETTY PLOT\r
+C\r
+       OMAX=-999.\r
+       OMIN=-OMAX\r
+       DO 50 J=S0,S1                   @ FETCH MIN & MAX OF THE DATA\r
+       IF (BREAK(11)) GOTO 25          @ IF THE USER GETS RID OF PLOT THEN WE EXIT VIA 25\r
+       TE1=YF(J)                       @ COMPUTE FILTER\r
+       OMAX=AMAX1(OMAX,TE1)            @ MAXIMUM --> OMAX\r
+50     OMIN=AMIN1(OMIN,TE1)            @ MINIMUM --> OMIN\r
+       DOWN=COND(OMIN.LT.-255.,-512.,OMIN.LT.0,-255.,OMIN.LT.256.,0,\r
+     *   255.)                         @ MAKE 255 STEPS INCREMENT\r
+       UP=COND(OMAX.GT.255.,512.,OMAX.GT.0,255.,OMAX.GT.-255.,0,\r
+     *   -255.)                                @ 255 STEPS INCREMENT\r
+C\r
+51     CONTINUE                        @ HERE WE COMPUTE THE FACTOR FOR ONE LINE\r
+       IF (TIMABZ) CALL FACTOR (XLEN/(RIGHT-LEFT),\r
+     *   (YLEN-NUMCN*.5+.5)/FLOAT(NUMCN)/(UP-DOWN))\r
+       IF (.NOT.TIMABZ) CALL FACTOR (AMIN1(XLEN,YLEN)/(RIGHT-LEFT),\r
+     *   AMIN1(XLEN,YLEN)/(UP-DOWN))\r
+       IF BREAK(11) GOTO 25            @ USER GETS RID OF PRGRM\r
+       PENPOS=PENUP\r
+       DO 10 I=S0,S1                   @ HERE WE PLOT THE \r
+               CALL XYPLOT (XF(I),YF(I)-DOWN,PENPOS) @ DATA POINTS ONE BY ONE\r
+       PENPOS=PENDWN\r
+       IF BREAK(11) GOTO 25            @ USER GETS RID OF PROGRAM\r
+10     CONTINUE\r
+       IF (.NOT. TIMABZ) GOTO 25       @ WORK DONE FOR X-Y GRAPHICS\r
+C\r
+C      MAKE A SCALE FOR THE ORDINATE ( INPUT VOLTAGE )\r
+C\r
+       CALL WHERE (TE1,TE1,TE1,TE2)\r
+       CALL FACTOR (1.,TE2)\r
+       CALL XYPLOT (-.5,0,-PENUP)\r
+       PENPOS=PENUP\r
+       DO 55 I=0,10\r
+       TE1=DOWN+I*(UP-DOWN)/10.\r
+       CALL XYPLOT (0,TE1-DOWN,PENPOS)\r
+       PENPOS=PENDWN\r
+       J=MOD(I,5)\r
+       TE3=COND(J.EQ.0,-.5,-.3)\r
+       CALL XYPLOT (TE3,TE1-DOWN,PENDWN)\r
+       CALL XYPLOT (0,TE1-DOWN,PENDWN)\r
+       IF (MOD(I,10).NE.0) GOTO 55\r
+       CALL FACTOR (1.,1.)             @ WRITE LOWER AND UPPER LIMIT ONTO THE\r
+       CALL NUMBER (-XOFSET+2.*YZ,(TE1-DOWN)*TE2-YN*.38,YN*.75,TE1,0,\r
+     *   -1) @ AXIS\r
+       CALL FACTOR (1.,TE2)\r
+       CALL XYPLOT (0,TE1-DOWN,PENUP)\r
+55     CONTINUE\r
+       CALL XYPLOT (.5,0,-PENUP)\r
+       CALL FACTOR (1.,1.)\r
+       CALL SYMBOL (-XOFSET+YZ,YLEN/NUMCN*.33,YZ,'CH ',90.,3)\r
+       CALL NUMBER (999.,999.,YZ,CO,90.,-1)\r
+C\r
+C\r
+       CO=CO+1\r
+25     CALL FACTOR (1.,1.)\r
+       CALL XYPLOT (0.,-TEMSET,-PENUP) @ RESET CORRECT ORIGIN OF DIAGRAM\r
+       IF BREAK(11) GOTO 40\r
+20     CONTINUE\r
+\fC\r
+C      IF ABZISSA IS TIME SCALE THEN DRAW A TIME SCALE\r
+C\r
+       IF (.NOT.TIMABZ) GOTO 40\r
+       ABISMI=PLEND-PLBEG.GT.300       @ ABZISSE EXCEEDS 5 MINUTES SO WE DRAW A MINUTE SCALING\r
+       CALL FACTOR (XLEN/(PLEND-PLBEG),1.)\r
+       CALL XYPLOT (0.,-.5,-PENUP)\r
+C      HERE WE PLOT THE LITTLE BAR INDICATING A SECOND OR MINUTE\r
+       EXPAND=NCOND(PLEND-PLBEG.LE.5,10,1) @ IF THE TIME SCALE IS .LE. 5 SECONDS THEN WE MARK EACH 1/10 SEC\r
+       DO 30 I=PLBEG*EXPAND,PLEND*EXPAND @ 1 SEC INCREMENTS\r
+       TE1=I-PLBEG*EXPAND\r
+       CALL XYPLOT (TE1/EXPAND,0,PENDWN)\r
+       IF (.NOT.ABISMI) TE2=COND(MOD(I,10).EQ.0,-.7, MOD(I,5).EQ.0,-.5,\r
+     *   -.3)\r
+       IF (ABISMI) TE2=COND(MOD(I,600).EQ.0,-.7,\r
+     *    MOD(I,300).EQ.0,-.5,\r
+     *     MOD(I/EXPAND,60).EQ.0,-.3)\r
+       CALL XYPLOT (TE1/EXPAND,TE2,PENDWN)\r
+C      HERE WE COMPUTE WHERE TO WRITE A NUMBER ONTO THE TIME AXIS\r
+       TE2=PLEND-PLBEG                 @  COMPUTE THE SIZE OF THE TIME AXIS\r
+       IF (.NOT.ABISMI) GOTO 31        @ IF WE PLOT A SECONDS AXIS THEN GOTO 31\r
+       IF (MOD(I,\r
+     *   NCOND(TE2.GT.5400,1800,TE2.GE.1800,600,TE2.GT.900,300,\r
+     *   TE2.GT.300,120,60)).GT.0) GOTO 30 @ COMPUTE THE MINUTE WHERE TO PLOT THE NUMBER\r
+       GOTO 32\r
+31     IF (MOD(I,NCOND(TE2.GT.180,30,TE2.GT.60,20,TE2.GT.30,10,\r
+     *   TE2.GT.10,5,TE2.GT.5,2,10)).GT.0) @ WE ASSUME: TE2.LE.5 THEN EXPAND:=10 ELSE EXPAND:=1 !!!\r
+     *   GOTO 30\r
+C\r
+C      HERE WE PLOT THE NUMBER ONTO THE AXIS\r
+C\r
+32     CONTINUE\r
+       CALL WHERE (TE2,TE2,TE2,TE3)    @ GET THE X FACTOR\r
+       CALL FACTOR (1.,1.)             @ RESET TO THE NORMAL FACTOR FOR SYMBOL\r
+       CALL NUMBER (TE1/EXPAND*TE2-INT(ALOG10(AMAX0(I/EXPAND,1))+.01)\r
+     *   *YN/2.-YN*.3,\r
+     *   -1.3,YN,COND(ABISMI,I/60.,I/EXPAND),0,-1)\r
+       CALL FACTOR (TE2,TE3)\r
+       CALL XYPLOT (TE1/EXPAND,0,PENUP)\r
+30     CALL XYPLOT (TE1/EXPAND,0,PENDWN)\r
+       CALL FACTOR (1.,1.)\r
+       CALL XYPLOT (0,.5,-PENUP)\r
+        CALL SYMBOL (XLEN/1.5,-YOFSET,YZ,TEXT0(NCOND(ABISMI,1,3)),0,10)\r
+C\r
+C\r
+40     CALL FACTOR (1.,1.)\r
+       IF (BREAK(11)) GOTO 60          @ USER SWITCHED OFF THE PLOTTER\r
+       CALL LABPLT (0,-YOFSET,PLEND)\r
+       IF (BREAK(11)) GOTO 60\r
+       CALL SYMBOL (YZ,YLEN+YZ,YZ,LABEL,0,MIN0(42,LABCNT*6)) @ PLOT 42 CHARACTERS INTO THE FIRST LINE OF LABEL\r
+       IF (LABCNT.GT.7)\r
+     *  CALL SYMBOL (YZ,YLEN,YZ,LABEL(8),0,LABCNT*6-42) @ AND THE REMAINING INTO THE NEXT LINE\r
+60     CONTINUE\r
+       CALL XYPLOT (38.,25.,PENUP)\r
+       CALL EXPLT\r
+       RETURN\r
+1      FORMAT (' KANAL ABZISSE/ORDINATE (ZEITBASIS=8), SCHRITTWEITE',\r
+     *  ' (2I1,I3) (',\r
+     *  2I1,I3,')? ',$)\r
+2      FORMAT (2I1,I3)\r
+3      FORMAT (' ANZAHL DER DARZUSTELLENDEN KANAELE (I1) (',I1,\r
+     *  ') ? ',$)\r
+4      FORMAT (' NUR FUER',F6.1,' SEK. MESSDATEN JEDOCH',F6.1,\r
+     *  ' SEC. ANGEFORDERT. ')\r
+5      FORMAT (' UNTERE, OBERE SCHWELLE? F5.0/F5.0: ')\r
+6      FORMAT (F5.0/F5.0)\r
+       END\r
+\1a\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0
\ No newline at end of file