A large commit.
[pdp8.git] / sw / rescue / lab8e_goettingen / disk2_11 / rkb / paroff / haexys.ft
1 C -+-+-+-+-+ \ e H A E X Y S . F T \ e -+-+-+-+-+
2 C
3 C RETURNS A SPECIFIED WORD FROM SAMPLE BUFFER (CHANNEL 0 TO 7)
4 C RETURNS THE INDEX ID (CHANNEL 8)
5 C
6 REAL FUNCTION XYSAM (ID,CN)
7 INTEGER ID, @ INDEX TO THE WORD
8 * CN @ CHANNEL WHERE TO GET THE WORD
9 * ,TRGWRD,TRITIM
10 REAL ESAM
11 EXTERNAL ESAM,
12 * TRITIM
13 * ,TRGWRD
14 INCLUDE HAEBUF.FI
15 INCLUDE HAECTR.FI
16 INCLUDE HABRK.FI
17 \fC
18 INTEGER CH @ SAVES THE ACT. CHANNEL NUMBER
19 * ,I,B,T1,T2,N @ TEMP STORAGE
20 * ,T @ T EQUIVALENCED INTO COMMON!
21 EQUIVALENCE (TTRGW,T)
22 C STATEMENT FUNCTIONS ARE:
23 INTEGER TIMFRQ
24 TIMFRQ(IP1,IP2)=500/(IP1+12*IP2) @ 1 IST MINIMUM FUER EINZEL SPIKE
25 C
26 XYSAM=FLOAT(ID) @ IF CALLED FOR TIME BASE THEN
27 IF (CN.GT.7) RETURN @ RETURN WITH XYSAM=ID
28 IF (CN.LT.CHNLS) GOTO 10 @ TEST FOR VALID CHANNEL NUMBER
29 IF (CN.LT.CHNLS+STRIGS) GOTO 20
30 WRITE (TTO,1) CN,CHNLS
31 STOP
32 10 CONTINUE
33 CH=CHANEL @ SAVE THE CURRENT CHANNEL NUMBER
34 CHANEL=CN @ COMPUTES ESAM INDEX
35 XYSAM=ESAM(ID) @ LOAD THE WORD FROM VIRTUAL STORAGE
36 CHANEL=CH @ RESTORE CURRENT CHANNEL NUMBER
37 RETURN
38 C
39 C HERE WE HANDLE THE TRIGGER EVENTS: WE SUMM UP ALL BITS IN ONE TIME WORD!
40 C
41 20 CONTINUE
42 CH=CHANEL
43 CHANEL=CN
44 T=TRGWRD(ESAM(ID))
45 CHANEL=CH
46 IF (.NOT.BREAK(8)) XYSAM=T*40
47 IF (.NOT.BREAK(8)) RETURN
48 C
49 C
50 IF (T.EQ.0) GOTO 23 @ KEINE SPIKES
51 IF (NXTBIT.LT.0) GOTO 25 @ MEHR ALS EIN SPIKE
52 C
53 NXTBIT=-1
54 T2=TRITIM(ID,NXTBIT) @ LI --> RE SUCHE LIEFERT BITPOSITION IM AKTUELLEN WORT
55 C
56 C RUECKWAERTS SUCHE BIS ZU 300 MILLI SEC BEI 128 HZ MESSRATE
57 C
58 B=MAX0(1,ID-41) @ WE SCAN TO THE LEFT 41 STEPS OR TO THE BEGINING
59 DO 21 I=1,B @ WIR SUCHEN RUECKWAERTS 40 STELLEN, JEDOCH NICHT VOR DATENANFANG!
60 N=1 @ RE --> LI SUCHE
61 T1=TRITIM(ID-I,N) @ BERECHNE MIT DECREMENTIERENDEM ZAEHLER
62 IF(T1.NE.0) GOTO 22 @ WIR HABEN VORHERGEHENDEN SPIKE GEFUNDEN
63 21 CONTINUE
64 XYSAM=TIMFRQ(500,0) @ MINIMALER WERT BEI SPIKE OHNE VORHERGAENGER
65 IF(T.GT.1) NXTBIT=ISIGN(NXTBIT,-1) @ SETZTE DAS MULTI SPIKE FLAG
66 RETURN
67 C
68 22 XYSAM=TIMFRQ(T1+T2,I-1) @ RECHNE INDEX IN FREQUENZ UM
69 IF(T.GT.1) NXTBIT=ISIGN(NXTBIT,-1) @ SETZTE DAS MULTI SPIKE FLAG
70 RETURN
71 C
72 23 XYSAM=0.1 @ KEINE SPIKES GEFUNDEN, ALSO NULL
73 24 NXTBIT=1 @ NAECHSTES WORT VON RECHTS AN DURCHSUCHEN
74 RETURN
75 C
76 C MEHR ALS EIN SPIKE JE WORT GEFUNDEN
77 C DANN SETZTEN WIR NXTBIT NEGATIV UND SUCHEN VON LINKS NACH RECHTS.
78 C DAS PLOTTPROGRAMM RUFT SO LANGE XYSAM AUF BIS NXTBIT POSITIV WIRD!
79 C
80 25 T1=TRITIM(ID,NXTBIT) @ TRITIM IST AUF LINKS --> RECHTS SUCHE GESCHALTET
81 IF(T1.EQ.0) GOTO23 @ KEINE SPIKES MEHR GEFUNDEN, KANN WEITERGEHEN
82 XYSAM=TIMFRQ(T1,0) @ WANDELE BITINDEX IN FREQUENZ UM
83 IF(NXTBIT.GE.12) GOTO 24 @ WAR DIE LETZTE BITPOSITION IM WORT, ZUENDE
84 NXTBIT=ISIGN(NXTBIT,-1) @ SETZE DAS DOPPELSPIKE FLAG: NXTBIT < 0
85 RETURN
86 C
87 1 FORMAT (' XYSAM: KANALNUMMER',
88 * I3,' GROESSER ALS ANZAHL DER KANAELE',I3)
89 END
90 \1a