A large commit.
[pdp8.git] / sw / rescue / lab8e_goettingen / disk2_11 / rkb / paroff / haeadc.ft
diff --git a/sw/rescue/lab8e_goettingen/disk2_11/rkb/paroff/haeadc.ft b/sw/rescue/lab8e_goettingen/disk2_11/rkb/paroff/haeadc.ft
new file mode 100644 (file)
index 0000000..6cd19eb
--- /dev/null
@@ -0,0 +1,245 @@
+C      -+-+-+-+-+ \ e  H A E A D C . F T  \ e -+-+-+-+-+\r
+C\r
+C      * UP  6-OCT-82\r
+C      * UP 25-OCT-82\r
+C      * UP 11-MAY-83\r
+C      * UP 15-JUL-83 IMPROVED FILE OVERFLOW PROTECTION\r
+C      * UP 22-NOV-83 IMPROVED FILE OVERFLOW MESSAGE\r
+C      * UP  1-JUL-85  SCHMITT TRIGGER INPUT\r
+C\r
+C      ANALOG --> DIGITAL CONVERSION AND DATA ACQUISITION\r
+       SUBROUTINE ADCON\r
+       INCLUDE HAEBUF.FI\r
+       INCLUDE HAEHAS.FI\r
+       INCLUDE HAEPTI.FI\r
+       INCLUDE HABRK.FI\r
+       INCLUDE HAETTY.FI\r
+       INTEGER TOASCI,NCOND,LOG2\r
+       LOGICAL BETW\r
+       EXTERNAL TOASCI,NCOND,LOG2,BETW\r
+C\r
+\fC\r
+        INTEGER PARMS(4),CSTART                @ THRUPT PARAMETER VECTOR, STARTCHANNEL\r
+       EQUIVALENCE (PARMS(1),CSTART)\r
+       INTEGER BUFF1(85),BUFF2(85),    @ THRUPT BUFFERS\r
+     *  I,TEMP1,TEMP2,TEMP3,C,CH,SS, @ TEMPORARY STORAGE\r
+     *  STARTR                         @ BLOCK NUMBER OF THE HEADER FOR THE ACTUAL DATA SET (UNIT 6)\r
+     *   ,CLKPRM(4)            @ FIRST PARAMETER TO CLOCK4 (STRIGG CHANNEL BIT PATTERN),\r
+        REAL STAT1,STAT2               @ THRUPT STATUS WORDS\r
+       EXTERNAL STAT1,STAT2            @ SET BY ADBUFF SAMPLING PROCEDURE\r
+       DATA CSTART /0/, CLKPRM /0,1,3,7/\r
+C\r
+C      PREPARE THE DEFAULT VALUES FOR SAMRAT,SAMCNT,CSTART\r
+C       AND READ THE NEW VALUES\r
+C\r
+       IF (XSAML.EQ.0) RETURN          @ NO OUTPUT FILE SPACE, SKIP ADCON\r
+       PARMS(2)=CHNLS                  @ INSERT THE NUMBER OF INPUT CHANNELS INTO THRUPT PARAMETER VECTOR\r
+       TEMP2=0                         @ WE USE IF WE DO A JUMP TO 40\r
+       TEMP3=2H00                      @ ""    ""    ""    ""    ""\r
+       LABCNT=0                        @ FORCE IDENTIFICATION TO SPACES\r
+       SAMCNT=NCOND(SAMCNT,SAMCNT,32*SAMRAT) @ 32 SEC IS THE DEFAULT SAMPLING TIME\r
+C\r
+       IF (OPTION.EQ.12) GOTO 22       @ IF 'AD*' THEN WE ASSUME THE DEFAULT PARAMETERS\r
+       IF (.NOT.(OPTION.GE.2 .AND. OPTION.LE.10)) GOTO 10\r
+       SAMCNT=(OPTION-1)*60*SAMRAT     @ AD1 ... AD9  FROM 1 TO 9 MINUTES TIME\r
+       GOTO 20                         @ READ THE DATA SET IDENTIFICATION ONLY\r
+C\r
+10     CONTINUE                        @ COMPUTE THE DEFAULT SAMPLE TIME\r
+       I=SAMCNT/SAMRAT                 @ SAMPLE TIME IN SECONDS --> I\r
+       CH=NCOND(I.GE.3600,1HH,1HM)     @ COMPUTE THE CORRECT SUFFIX: HOURS OR MINUTES\r
+       I=I/NCOND(I.GE.3600,60,1)       @ IF THE SAMPLING TIME EXCEEDS ONE HOUR THEN WE CONVERT INTO MINUTES\r
+       MM=TOASCI(I/60)                 @ AND CONVERT INTO ASCII CHARACTERS\r
+       SS=TOASCI(MOD(I,60))            @  FOR MINUTES AND SECONDS OR HOURS AND MINUTES\r
+       WRITE (TTO,101) MM,CH,SS\r
+       READ (TTI,102) MM,C,SS          @ GET THE SAMPLING TIME\r
+       IF (BREAK(11)) RETURN           @ USER GET'S RID OF PROGRAM\r
+       SS=NCOND(MM+SS,MM*60+SS,I)*\r
+     *  NCOND(C.EQ.1HH,60,C.EQ.1HM,1,CH.EQ.1HH,60,1)\r
+       WRITE (TTO,103) SAMRAT          @ AND ASK FOR THE SAMPLING FREQUENCY\r
+       READ (TTI,104) TEMP1\r
+       SAMRAT=NCOND(TEMP1,TEMP1,SAMRAT)\r
+       WRITE (TTO,107) SPEED           @  AND ASK FOR THE TAPE SPEED FACTOR\r
+       READ (TTI,1) TEMP1\r
+       SPEED=NCOND(TEMP1,TEMP1,SPEED.GT.0,SPEED,1)\r
+       CSTART=0\r
+CX     WRITE (TTO,105)                 @ ASK FOR START CHANNEL WHERE TO SAMPLE\r
+CX     READ (TTI,104) CSTART\r
+       WRITE (TTO,106) CHNLS\r
+       READ (TTI,1) I\r
+       CHNLS=NCOND(I,I,CHNLS)\r
+       PARMS(2)=CHNLS                  @ THE NUMBER OF CHANNELS TO SAMPLE\r
+C\r
+       DO 35 I=1,CHNLS\r
+       TEMP1=SAMRAT/PACK(I)            @ HERE WE ASK FOR THE SAMPLE RATE OF EACH CHANNEL\r
+36     WRITE (TTO,108) I,TEMP1         @ TYPE CHANNEL NUMBER AND DEFAULT SAMPLE RATE\r
+       READ (TTI,104) TEMP2            @ READ THE SAMPLE FREQUENCY\r
+       TEMP1=NCOND(TEMP2,TEMP2,TEMP1)  @ IF NO INPUT, THEN WE INSERT THE DEFAULT VALUE\r
+       PACK(I)=SAMRAT/TEMP1            @ RATIO (MAX SAMPLE RATE)/(CHANNEL SAMPLE RATE) --> PACK\r
+       IF (PACK(I).LT.1) GOTO 36\r
+       IF (LOG2(PACK(I)).GE.0) GOTO 35 @ THE RATIO MUST BE A POWER OF TWO, IF SO ASK FOR NEXT CHANNEL \r
+       WRITE (TTO,109)                 @  ELSE WE PRINT A MESSAGE AND \r
+       TEMP1=SAMRAT                    @  MAKE A NEW DEFAULT VALUE END THEN\r
+       GOTO 36                         @  WE ASK AGAIN\r
+35     CONTINUE\r
+C\r
+42     WRITE (TTO,2) STRIGS            @ ASK FOR NUMBER OF SCHMITT TRIGGER INPUTS\r
+       READ (TTI,202) I\r
+       I=NCOND(I.EQ.1H0,0,I.EQ.1H1,1,I.EQ.1H2,2,I.EQ.1H3,3,STRIGS)\r
+       IF (BREAK(11)) RETURN           @ SWITCH 11: RETURN\r
+       IF (BETW(0,I,4).AND.CHNLS+I.LE.7) @ WE ALLOW 0 TO 3 BUT NOT MORE THAN 7 CHANNELS AT ALL!\r
+     *    GOTO 41\r
+       I=MIN0(7-CHNLS,3)               @ COMPUTE CHANNELS LEFT FOR S"TRIGG\r
+       WRITE (TTO,201) I\r
+       GOTO 42                         @ AND ASK AGAIN\r
+41     STRIGS=I                        @ NUMBER OF STRIG INPUTS --> STRIGS\r
+       CALL MOVE (-STRIGS,1,PACK(CHNLS+1))  @ HIGHEST SAMPLE RATE FOR TRIGGERED EVENTS!\r
+       SAMCNT=SAMRAT*SS                @ NUMBER OF SAMPLES TO TAKE FOR THE 'SAMRAT' FREQUENCY CHANNEL\r
+\fC\r
+22     CONTINUE                        @ HERE WE COME IF AD* SWITCHED ON\r
+       PCKMAX=0\r
+       DO 38 C=1,CHNLS+STRIGS          @ FETCH DIVIDER FOR SLOWEST FREQUENCY\r
+38     PCKMAX=MAX0(PCKMAX,PACK(C))\r
+C\r
+       HSHDON=.FALSE.                  @ DESTROY HASH CODE TABLE (USED BY ESAM)\r
+       CALL MKHASH                     @ MAKE A HASH TABLE TO SEE IF POSSIBLE\r
+       IF (.NOT.HSHDON) GOTO 10        @ HASH TABLE TOO LONG, SO WE ASK AGAIN FOR NEW PARAMETERS\r
+       HSHDON=.FALSE.                  @ AND NOW WE DESTROY THE HASH CODE TABLE SINCE WE\r
+       J=0                             @  WE BUILD THE "SAMPLE VALID" TABLE FOR ADBUFF ROUTINE\r
+       DO 39 I=1,PCKMAX                @  INTO THE HASH CODE TABLE IN ORDER TO SAVE CORE\r
+       DO 39 C=1,CHNLS+STRIGS\r
+       J=J+1\r
+39     HASHV(J)=NCOND(MOD(I,PACK(C)),0,1)\r
+C\r
+       TOTSAM=SAMCNT*HSHSIG/PCKMAX     @ TOTAL NUMBER OF SAMPLES (PACKED AND FOR ALL CHANNELS) --> TOTSAM\r
+       IF (XSAML.GT.TOTSAM) GOTO 20    @ TEST: SAMCNT MAY NOT EXCEED THE REMAINING FILE SPACE ON UNIT 6\r
+25     CONTINUE                        @ THE BUFFER IS TOO SMALL FOR THIS SAMPLE COUNT, ASK FOR A NEW ONE\r
+       TEMP1=XSAML/(HSHSIG*SAMRAT/PCKMAX)/60 @ MINUTES STILL FITTING INTO THE BUFFER --> TEMP1\r
+       WRITE (TTO,3) XSAML,TOTSAM,TEMP1,REC6,LASREC @ NUMBER TOO LARGE, BUFFER WILL OVERFLOW\r
+       SAMCNT=XSAML/HSHSIG*PCKMAX      @ INSERT THE MAXIMUM SAMPLE COUNT --> SAMCNT\r
+       IF (BREAK(11)) RETURN           @ USER GET'S RID OF PROGRAM\r
+       GOTO 10                         @ AND ASK AGAIN \r
+C\r
+20     CONTINUE\r
+C      READ THE DATA SET IDENTIFICATION \r
+C\r
+17     CONTINUE\r
+       IF (BREAK(11)) RETURN           @ USER GET'S RID OF PROGRAM\r
+       WRITE (TTO,5) SIXCNT            @ DATASET IDENTIFICATION?               \r
+       READ (TTI,6) LABEL\r
+       IF (BREAK(11)) RETURN           @ USER GET'S RID OF PROGRAM\r
+       DO 15 I=1,10                    @ STRIP OFF THE TRAILING SPACES\r
+       IF (LABEL(11-I).NE. 1H ) GOTO 16\r
+15     CONTINUE\r
+       GOTO 17                         @ SPACES ARE NO VALID INPUT AT ALL\r
+16     LABCNT=11-I\r
+C\r
+C      PREPARE THE SAMPLING\r
+C\r
+50     CONTINUE\r
+       COMP=.FALSE.                    @ WE GET A NEW DATA SET SO THERE ARE NO COMPUTATIONS DONE SO FAR\r
+       IF (SAMCNT.EQ.0) GOTO 40        @ NOTHING TO DO, SKIP THE SAMPLING\r
+       WRITE (TTO,9)                   @ SKIP A LINE (USED BY ETIME OUTPUT)\r
+       COMP=.FALSE.                    @ RESET COMPUT FLAG\r
+       PARMS(3)=SAMCNT*(CHNLS+STRIGS)  @ TOTAL NUMBER OF SAMPLES INCLUDING INVALID ONES\r
+       PARMS(4)=PCKMAX*(CHNLS+STRIGS) @ LENGTH OF VALID VECTOR\r
+       CALL THRUPT (BUFF1,BUFF2,PARMS,HASH,STRIGS\r
+     *   ,1.E5/FLOAT(SAMRAT)/FLOAT(SPEED)/12.) @ SET UP BUFFERED A/D CONVERSION AND TRIGGERED EVENTS\r
+C      LAST PARAMTER:\r
+C      TRIGGER FREQUENCY/(AD FREQUENCY)/(# OF SLOTS)\r
+C         1.E5   REQUIRES CLOCK4 WITH RATE OF 30 HZ\r
+C      THIS IS THE RATIO BETWEEN TRIGGER CLOCK AND A/D CLOCK.\r
+C      AT CLOCK1 INTERRUPT FOR A/D SAMPLING WE CLEAR THE CLOCK4 COUNTER.\r
+C      THE TIME OF THE TRIGGER INPUT - TOKEN WITH CLOCK4 - IS DIVIDED BY THE \r
+C      LAST PARAMETER TO THRUPT. THE RESULT IS BETWEEN 0 AND THE # OF SLOTS-1.\r
+C      WITH 12 SLOTS (ONE 8-WORD) WE GET AN ACCURACY OF 1/SAMRAT/12 HZ FOR\r
+C      THE TIME OF THE EVENT. (FOR 64 HZ APPROX 1.3 MILLI SEC \r
+C                              FOR 256 HZ       0.3 MILLI SEC.\r
+C      MAX SAMRAT IS 512 HZ I THINK.\r
+C\r
+C\r
+C      OPEN THE OUTPUT FILE, WRITE THE DATA SET HEADER BLOCK\r
+C\r
+       STARTR=REC6                     @ ADR. OF HEADER BLOCK --> STARTR\r
+       REDVAL=6HDLWPD2                 @ SET THE READ VALID FLAG\r
+       LASREC=(SAMCNT*HSHSIG/PCKMAX+254)/255+REC6+1 @ COMPUTE THE NUMBER OF BLOCKS FOR THIS SAMPLE\r
+       WRITE (6'REC6) (RCRD0(I),I=1,85)@ WRITE THE NEW HEADER BLOCK\r
+       REDVAL=0                        @ RESET THE READ VALID FLAG\r
+       OFFSET=REC6                     @ START ADR. OF THE DATA BUFFER SPACE --> OFFSET\r
+\fC\r
+C      START THE SAMPLING \r
+C\r
+       CALL CLOCK1 (8,SAMRAT*SPEED)    @ A/D CONVERSION ENABLED FROM SECOND DK8-EP CLOCK!\r
+       CALL CLOCK4 (CLKPRM(STRIGS+1),30.) @ ENABLE TRIGGERED INPUT VIA FIRST CLOCK-100K HZ FREQUENCY\r
+       IF BREAK(11) GOTO 60            @ USER DOES NOT KNOW WHAT HE WANTS\r
+100    CALL MARK (SPEED)               @ TYPE OUT THE TIME ELAPSED \r
+111    IF(STAT1-0.5) 100,110,120\r
+110    WRITE (6'REC6) BUFF1            @ TRANSFER 255 SAMPLES ONTO MASS STORAGE\r
+       CALL RELEAS (1)\r
+       IF (REC6 .EQ. LASREC) GOTO 30   @ LOOK IF THE WORK IS DONE\r
+CX     IF (REC6.LT.LASREC-1 .AND.BREAK(11)) GOTO 60 @ USER ABORT ONLY IF THERE ARE AT LEAST 256 SAMPLES LEFT\r
+       GOTO 211\r
+200    CALL MARK (SPEED)               @ TYPE OUT THE TIME ELAPSED \r
+211    IF (STAT2-0.5) 200,210,220\r
+210    WRITE (6'REC6) BUFF2            @ TRANSFER 255 SAMPLES ONTO MASS STORAGE\r
+       CALL RELEAS (2)\r
+       IF (REC6 .EQ. LASREC) GOTO 30   @ LOOK IF THE WORK IS DONE\r
+       IF (REC6.LT.LASREC-1 .AND.BREAK(11)) GOTO 60 @ USER ABORT ONLY IF THERE ARE AT LEAST 256 SAMPLES LEFT\r
+       GOTO 111                        @ GO AND WAIT FOR BUFFER # 1\r
+120    TEMP1=1                         @ BUFFER 1 OVERFLOW\r
+       GOTO 125\r
+220    TEMP1=2                         @ BUFFER TWO OVERFLOW\r
+125    WRITE (TTO,7) I,TEMP1           @ SAMPLING TOO FAST\r
+       GOTO 10                         @ TRY ONCE MORE\r
+C\r
+C      SAMPLING FINISHED\r
+C\r
+60     CONTINUE                        @ USER SWITCHED SW 11\r
+       TEMP2=MAX1(0,TIME(TEMP2)+0.5)*SPEED @ GET SAMPLING TIME PRIOR TO ANY OUTPUT\r
+       SAMCNT=(REC6-STARTR-1)*255*PCKMAX/HSHSIG @ COMPUTE NUMBER OF SAMPLES TOKEN\r
+       LASREC=REC6-1                   @ INSERT THE NEW SAMCNT AND LASREC INTO THE HEADER BLOCK\r
+       REC6=STARTR                     @ ADR. OF HEADER BLOCK --> REC6\r
+       REDVAL=6HDLWPD2                 @ SET THE READ VALID FLAG\r
+       WRITE (6'REC6) (RCRD0(I),I=1,85) @ AND WRITE THE NEW HEADER BLOCK\r
+       REDVAL=0                        @ RESET THE READ VALID FLAG\r
+       WRITE (TTO,8)                   @ PRINT A MESSAGE\r
+61     IF (STAT1.LE.0.6 .AND. STAT2.LE.0.6) GOTO 61 @ BUFF1 & BUFF2 MAY BE OVERLAYS, SO WE HAVE TO WAIT UNTIL THRUPT ABORTS\r
+       GOTO 62                         @ SAMPLING TIME ALREADY TOKEN\r
+30     CONTINUE                        @ WE COME HERE IF ALL SAMPLES TOKEN, SO THE WORK IS DONE\r
+       TEMP2=INT(MAX0(0,TIME(TEMP2))+0.5)*SPEED @ COMPUTE THE TIME ELAPSED\r
+62     CONTINUE                        @ ABORT COMES HERE\r
+       TEMP3=TOASCI(MOD(TEMP2,60))     @ ASCII SECONDS\r
+       TEMP2=TEMP2/60                  @ MINUTES\r
+40     CONTINUE\r
+       TEMP1=PARMS(2)+CSTART-1         @ TO FORM A PRETTY LIST: LAST CHANNEL WE SAMPLED --> TEMP1\r
+       C=2H &  \r
+       WRITE (TTO,4) SAMCNT,TEMP2,TEMP3,(I,C,I=CSTART,TEMP1)\r
+       IF (STRIGS.EQ.0) RETURN         @ NO SCHMITT TRIGGER INPUT - NO MSG\r
+       WRITE (TTO,203) (I,C,I=1,STRIGS) @ MAKE A PRETTY LIST\r
+       RETURN\r
+101    FORMAT (' MESSDAUER         (',A2,A1,A2,')? ',$)\r
+102    FORMAT (I2,A1,I2)\r
+103    FORMAT (' MESSRATE-MAXIMAL (',I3,' HZ)? ',$)\r
+104    FORMAT (I3)\r
+105    FORMAT (' STARTKANAL         (0)   ? ',$)\r
+106    FORMAT (' ANZAHL KANAELE     (',I1,')   ? ',$)\r
+107    FORMAT (' VERVIELFACHER      (',I1,')   ? ',$)\r
+108    FORMAT (' MESSRATE KANAL',I2,' (',I3,' HZ)?',$)\r
+109    FORMAT (' (MESSRATE MAXIMAL)/(KANALMESS RATE) MUSS EINE ZWEIER'\r
+201    FORMAT (' FALSCHE EINGABE - NUR 0 BIS',I2,', ZULAESSIG.')\r
+     *   ,'-POTENZ SEIN!')\r
+202    FORMAT (A1)\r
+203    FORMAT (3X,'UND VON DEN SCHMITT TRIGGER EINGAENGEN :',3(I2,A2))\r
+1      FORMAT (I1)\r
+2      FORMAT (' ANZAHL SCHMITT TRIGGER EINGAENGE? (',I1,') ',$)\r
+3      FORMAT (' MEHR ALS',2P,E9.1,' MESSWERTE:',E9.1,\r
+     *  ' NUR NOCH FUER',I4,' MINUTEN PLATZ.'/1X,E10.2,'/',E10.2)\r
+4      FORMAT (I8,' PUNKTE IN',I4,':',A2,' MINUTEN VON KANAL',\r
+     *   7(I2,A2))\r
+5      FORMAT (' DATENSATZ',I3,' BEZEICHNUNG ? ',$)\r
+6      FORMAT (10A6)\r
+7      FORMAT (' WORT',I5,' PUFFER',I2,' MESSFREQUENZ ZU HOCH:',\r
+     *  /' MESSRATE VERKLEINERN.')\r
+8      FORMAT (' MESSUNG ABGEBROCHEN.')\r
+9      FORMAT (1X)\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
\ No newline at end of file