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