7 / K. ELLSON AND L. PEARSON
9 / /8 AD CONVERSION CLOCKED WITH CLOCK ROUTINE
10 / /8 /1 AD CONVERSION CLOCKED WITH CLOCK1 ROUTINE
11 / /8/4/1 AD CONVERSION CLOCKED WITH CLOCK1 AND SCHMITT TRIGGER INPUT TIMED WITH CLOCK ROUTINE
14 / TSAR SUBROUTINE - BUFFERED A/D
16 / DIGITAL EQUIPMENT CORPORATION
17 / MAYNARD, MASSACHUSETTS 01754
19 / THIS PACKAGE PROVIDES A FUNCTIONAL REPLACEMENT FOR
20 / THE FOLLOWING FORTRAN IV LIBRARY SUBROUTINES: REALTM
21 / AND ADB. REALTM AND ADB ARE REPLACED BY THE SUBROUTINE
22 / THRUPT. A THRUPT CALL IS ILLUSTRATED BY THE FOLLOWING
25 /*************************************************************
27 / EXTERNAL STAT1,STAT2
28 / INTEGER BUFF1(85),BUFF2(85),IPARMS(3),HASH(# OF CHANNELS)
29 / CALL THRUPT(BUFF1,BUFF2,IPARMS,HASH,NTRIG)
30 / CALL CLOCK(8,IRATE) @ IF NO /1 SWITCH AT ASSEMBLY TIME
31 / @ FOR A/D CONVERSION TIMED WITH FIRST DK8-EP
32 / CALL CLOCK1(8,IRATE) @ IF /1 SWITCH SET AT ASSEMBLY TIME
33 / @ THIS IS FOR A/D CONVERSION TIMED WITH 2ND DK8-EP
34 / IF YOU USE BOTH CLOCKS ON ONE SYSTEM, THEN YOU
35 / MAY SWITCH ON ONLY ONE CLOCK-TIMED A/D CONVERSION.
36 / THIS MEANS: ONLY ONE CLOCK MAY BE STARTED WITH FUNCTION=8 (BIT 9 SET)
38 / 100 IF (STAT1-0.5) 100, 110, 999
43 / 1000 FORMAT (' SAMPLING TOO FAST')
47 /************************************************************
49 / BUFF1 - ONE OF 2 BUFFERS FOR THE ANALOG DATA, 255 12 BIT
50 / WORDS ARE STORED IN EACH BUFFER
52 / STAT1 - DYNAMIC STATUS WORD OF BUFF1. THE VALUES 0.25,
53 / 0.5, AND +1. INDICATE THAT THE BUFFER IS NOT FILLED,
54 / BUFFER IS FILLED, AND BUFFER OVERFLOW.
56 / BUFF2 - THE SECOND BUFFER.
58 / STAT2 - THE DYNAMIC STATUS WORD OF BUFF2, VALUES ARE THE
61 / IPARMS - THE PARAMETER VECTOR WHICH CONTAINS IN ORDER THE
62 / STARTING CHANNEL, THE NUMBER OF CHANNELS, AND THE NUMBER
64 / HASH - OPTIONAL: A TABLE CONTAINING THE READ VALID INFORMATION FOR A/D CHANNELS AND STRIGG INPUTS
65 / NTRIG - OPTIONAL BUT HASH MUST BE SPECIFIED:
66 / THE NUMBER OF SCHMITT TRIGGER CHANNELS TO SAMPLE
67 / CONFIGURATION REQUIRED FOR A/D AND STRIGG SAMPLING:
68 / FIRST DK8-EP: FREE RUNNING TIMER (10 KHZ OR 100 KHZ) FOR TRIGGER INPUT.
69 / CALL CLOCK4 (1 TO 7,3) FOR 10 KHZ
70 / CALL CLOCK4 (1 TO 7,30) FOR 100 KHZ
71 / SECOND DK8-EP STARTS THE A/D VIA EXTERNAL EVENT: CALL CLOCK1(8,RATE)
72 / TIME WORD: THE INTERVALL BETWEEN TWO A/D CYCLES IS DIVIDED INTO
73 / 12 SLICES CALLED S0 TO S11.
74 / AN EXTERNAL EVENT BETWEEN 0 AND S0 (SAMRAT/12) SETS THE LEFTMOST BIT 0.
75 / ' '' '' '' S11 AND SAMRAT SETS THE RIGHTMOST BIT 11.
79 / WGET: THE THIRD PARAMETER (RESULT) IS OPTIONAL
81 / I=WGET(BUFF,PNTR,RESULT)
83 / CALL WGET (BUFF,PNTR,RESULT)
87 / INTERRUPT SERVICE ROUTINE FSMPLE:
88 / BEFORE THE READ ADRB WAIT FOR ADSE TO AVOID A NON VALID READ
89 / IF CLOCK DID'NT START THE AD CONVERTER.
90 / THEREFORE IN ANY CASE (ONE OR MORE CHANNELS) THE
91 / CLOCK MUST BE STARTED WITH CALL CLOCK(8,FREQU).
92 / FIRST PARAMETER OF CLOCK MUST BE 8 !
94 / 1-OCT-82 HA REV 2.0 PACKS THE SAMPLE
95 / 15-JUL-83 HA REV 2.1 REARANGES CODE FOR PDP12 LINC OPTION
96 / 18-MAR-85 HA REV 3.0 ALLOWS TWO DK8-EP MODULES
97 / FOR A/D TRIGGED WITH DEV. CODE 13 CLOCK: /8 SWITCH
98 / FOR A/D TRIGG'D WITH DEV. CODE 17 CLOCK: /1 /8 SWITCH
99 / FOR A/D ON PDP-12 : NO SWITCH
101 / 26-JUN-85 HA REV 3.1 ALLOWS SCMITT TRIGGER INPUT WITH DK8-EP DEV 13 AND CLOCKED A/D WITH DK8-EP DEV 17
102 / 12-JUL-85 HA REV 4.0 EVERYTHING CONFUSED
103 / 20-AUG-85 HA REV 4.1 REMOVES BUG IN TRIGG. TIME PICKUP ROUTINE
106 CL1DEV=13*10 / FIRST DK8-EP
107 CL2DEV=17*10 / SECOND DK8-EP
110 MQA=7501 / WE USE EAE MODE B
125 IFSW 4 < BAD SWITCH /1/4 >
132 CSTAT=157 /CLOCK ROUTINE PUTS CLSA BITS IN HERE
133 ENTRY STAT1 /ALLOW FORTRAN ACCESS TO THES
134 ENTRY STAT2 /LOCATIONS
137 PBUFF, 0 /PNTR TO CURRENT BUFFER
138 CURSTT, 0 /PNTR TO CURRENT STATUS WORD
139 NXTSTT, 0 /PNTR TO NEXT STATUS WORD
140 CURBUF, 0;0 /START OF CURRENT BUFFER PNTR
141 NXTBUF, 0;0 /START OF NEXT BUFFER PNTR
142 /STATUS WORDS, VALUES
143 STAT1, F 0.25 /0.25, 0.5, & 1.0 INDICATE
144 STAT2, F 0.25 /STATUS WORD IS NOT FILLED,
145 /FILLED, AND OVERFLOWED
146 /STATUS WORD: F 0.25 = 7777;2000;0000 NOT FILLED
147 / F 0.5 = 0000;2000;0000 FILLED
148 / F 1.0 = 0001;2000;0000 OVERFLOWED
161 CLBA=6006 / DO NOT FORGET TO INSERT THE DEVICE CODE
174 0 /INTERRUPT TIME A/D SAMPLER
175 ADDR MQAC /SAVE AC AND MQ --> MQAC
176 ORG .-2; DST; ORG .+1
177 ADDR CLKOVR / CLEAR OVERFLOW COUNTER FOR THE SCHMITT TRIGGER SERVICE ROUTINE
178 ORG .-2; DDZ; ORG .+1
179 IFSW 4 < / IF TRIGGER INPUT THEN WE CLEAR THE CLOCK COUNTER
182 IFNSW 4 < NOP > / HERE TO INSERT A WORD TO GET THE SAME WORD COUNT FOR BOTH PROGRAM VERSIONS
183 TAD NCHANL+2 /NUMBER OF CHANNELS
184 DCA NCHANL+1 /INTO COUNTER
185 JMS% ITSTVL+1 /TEST VALID FOR THE FIRST SAMPLE
186 JMS INVALID /AND DECLARE NOT VALID
189 JMS LNCSAM /INITIATE SAMPLE
190 NEXTCH, ISZ SAMINS /UPDATE SAM INST FOR NXT CHAN
195 ADSK / WAIT FOR COMPLETION OF CONVERSION
198 JMS PUTSAM / INSERT INTO THE OUTPUT BUFFER AND TEST IF WORK DONE
199 JMP MORESM / SKIP TO MORESM
202 SKIPSM,/ SKIP ONE A/D SAMPLE
203 JMS UPDCNT / INCREMENT THE TOTAL SAMPLE COUNTER (ALL CHNLS+STRIGS)*SAMRAT
204 ADRS / LOAD MUX REGISTER --> AC
205 IAC / AND INCREMENT- WE SKIPP THIS CHANNELS
206 ADLM / BUMP BACK INTO THE A/D MUX REGISTER
209 ISZ NCHANL+1 / ANY MORE CHANNELS TO SAMPLE?
210 SKP / START THE NEXT CONVERSION IF THERE IS ANY REMAINING
211 JMP NOTMOR / NOTHING MORE TO A/D SAMPLE
212 JMS% ITSTVL+1 /HERE ONLY IF SOME MORE A/D TO SAMPLE!
213 JMP SKIPSM / SKIP THE NEXT SAMPLE, RETURNS TO MORESM !!
214 ADST / AND START THE NEXT CONVERSION - AUTO INCREMENT MODE!
216 JMS INCPTR / INCREMENT BUFFER POINTER
217 JMP WAITSP / AND TAKE THE NEXT SAMPLE
219 TAD CSTART+2 /STARTING CHANNEL
221 ADLM / ELSE RESET MUX REGISTER
225 JMS LNCSAM /SET CHANNEL TO START IN CASE
229 / HERE WE INSERT THE STRIGG TIME WORDS
232 TAD IWSTRI+1 /HOLDS ADDR
233 DCA IWSTRI / HOLDS POINTER TO THE TIME WORD
234 TAD WSTRC / -(NUMBER OF TRIGG INPUTS+1) --> AC
235 DCA IWSTRC / HOLDS THE COUNTER
237 JMS INCPTR / INCREMENT BUFFER POINTER
238 ISZ IWSTRC / IF ANY MORE TRIGG INPUTS
240 JMP IWLOP2 / ELSE RESET AC AND MQ AT IWLOP2
241 JMS% ITSTVL+1 /TEST FOR VALID SAMPLE (INVALID MEANS CRAZY PROGRAMMER!)
242 JMS INVALID / SET THE INVALID FLAG
243 TAD% IWSTRI / TRIGG TIME WORD --> AC
244 JMS PUTSAM /INSERT TIME WORD INTO THE OUTPUT BUFFER, CLEARS AC
245 DCA% IWSTRI / CLEAR THE TIME WORDS
246 ISZ IWSTRI / INCREMENT POINTER TO THE TIME WORDS
247 JMP IWLOP1 / AND LOOK FOR THE NEXT TRIGG WORDS TO PROCESS
249 ADDR MQAC /RESTORE AC AND MQ
250 ORG .-2; DLD; ORG .+1
251 JMP% FSMPLE /DONE FOR THIS TIC
256 JMS INCPTR / INCREMENT BUFFER POINTER
257 CLA / CLEAR THE STATUS WORD
258 DCAZ% CURSTT /SET STATUS OF CURRENT FULL
259 SAMXIT,/ STOP THE SAMPLING, DISABLE CLOCK INTERRUPT
261 ORG .-2; DDZ; ORG .+1
264 ORG .-2; DDZ; ORG .+1 > / DISABLE CLOCK EXTENSION ROUTINE
265 ADDR MQAC /RESTORE AC AND MQ
266 ORG .-2; DLD; ORG .+1
270 / HERE WE COUNT THE WHOLE NUMBER OF SAMPLES TOKEN
273 ADDR NPOINT+1 / NPOINT IS A 3 WORD FPP BASE PAGE VARIABLE, TAKE CARE
274 ORG .-2; DLD; ORG .+1
275 DPIC / INCREMENT DOUBLE PREC. COUNTER TO TEST FOR MORE SAMPLES
276 ADDR NPOINT+1 / BUMP INTO COUNTER
277 ORG .-2; DST; ORG .+1
278 DPSZ / SKIP IF WORK DONE
280 JMP SAMDON / SET STATUS OF CURRENT BUFFER FULL: SAMPLE DONE
283 PUTSAM, 0 / INSERTS AC INTO OUTPUT BUFFER, ON RETURNS CLEARS AC!
284 ISZ AVALID / VALID INPUT?
285 SKP / AVALID IS SET TO -1 FOR INVALID SAMPLE, SO SKIP
286 JMP PUTSA1 / NON VALID, RETURN WITHOUT ACTION
287 BUFCDF, HLT /REPLACED BY CDF TO BUFFER
289 CDF 10 / USED FOR POINTER PVALID!
291 DCA PUTFLG / DON'T FORGET TO INCREMENT THE BUFFER POINTER -1 --> PUTFLG
292 DCA AVALID / CLEAR VALID FLAG FOR NEXT CALL
294 JMS UPDCNT / UPDATE THE TOTAL SAMPLE COUNT
295 CLA / CLEAR AC FOR RETURN
299 INVALID,0 / SET THE ACTUAL SAMPLE INVALID
302 JMP% INVALID / ON RETURN AC=0
303 PUTFLG, 0 / SET TO -1 IF WE HAVE TO INCREMENT THE BUFFER POINTER
305 AVALID, / / ACTUAL VALID FLAG
306 ITSTVL, ADDR TSTVLD / TEST FOR VALID READ
307 IWSTRC, 0 / NEGATIVE NUMBER OF STRIGS EVENT CHANNELS -1 (FOR COUNTER)
308 WSTRC, 0 / -(NUMBER OF STRIG INPUTS+1) PLACED HERE BY THRUPT
309 IWSTRI, ADDR TIMWRD / POINTER TO THESE TIME WORDS
318 ISZ PUTFLG / IF WE HAVE TO INCREMENT THE BUFFER POINTER,
319 JMP% INCPTR / THEN SKIP ELSE RETURN
320 ISZZ PBUFF /ELSE INCR PNTR & SKIP IF WE
321 JMP FLDOK /CROSSED A FIELD BOUNDARY
322 TAD BUFCDF /UPDATE FIELD
326 ISZ SAMCNT /INCR BUFFER CNTR & SKIP IF
327 JMP% INCPTR /FILLED. BUFFER OK
328 DCAZ% CURSTT /SET STATUS WORD TO 0.5
330 TADZ NXTSTT /SWAP STATUS WORD PNTRS
331 DCA TMP / NXTSTT<=> CURSTT
336 TADZ% CURSTT /HAS USER RELEASED THIS BUFFER
338 JMP% ITOOFST+1 /NO, SAMPLING TOO FAST!
339 JMS% ISWPBFR+1 / SWAP BUFFER
340 JMP% INCPTR / BUFFER POINTER UPDATED
349 / HERE WE SWAP THE INPUT BUFFERS POINTERS
353 / SWAP BUFFER POINTERS
355 TADZ NXTBUF / NXTBUF <=> CURBUF
356 DCA% IBUFCDF / BUFCDF, PBUFF = NXTBUF
367 TAD% IBUFSIZ /RESET BUFFER COUNTER
377 / SAMPLING RATE TOO FAST
380 CLA IAC /SET STATUS WORD TO 1.0
384 JMP% ISAMXIT+1 / DISABLES CLOCK INTERRUPTS
388 LNCSAM, 0 /LINC SAM SUBROUTINE
390 SAMINS, SAM 0 /SAMPLE AND SELECT NEXT CHANNEL
396 / INTERRUPT TIME SCHMITT TRIGGER INPUT HANDLER
398 FIREED, 0 / ON ENTRY AC IS CLEARED BY CLOCK RTN
399 CLA CLL CMA RTL / -3 --> AC
400 ADDR MQSAVE / SECOND: STRIG COUNTER, FIRST: SAVES MQ
401 ORG .-2; DST; ORG .+1
403 TADZ CSTAT / LOOK AHEAD FOR CLOCK OVERFLOW
404 RAL CLL / LINKS GOES ON HERE IF CLOCK OVERFLOWED
405 SNA CLA / AND IF THERE IS NO STRIGG THEN JUMP TO CLOCK OVERFLOW HANDLING
408 CAM / MQ HOLDS # OF STRIGG FIRED, FIRST IS #0
409 TADZ CSTAT / CLSA BITS OF FIRST CLOCK --> AC
410 TRILOP, RAR / STRIG BITS --> LINK
411 SWP / NOW AC HOLDS # OF STRIGG
412 SZL / SKIP IF STRIGG DID NOT FIRE
413 JMS TRIGGD / ELSE SET THE TRIGGER TIME WORD
414 IAC / INCREMENT FOR NEXT STRIGG
415 SWP / # OF STRIGG --> MQ, CLSA BIT MASK --> AC
416 ISZ MQSAVE+1 / SOME MORE STRIGS?
417 JMP TRILOP / YES, FETCH THE NEXT EVENT
418 CAM / STRIGS DONE, TEST FOR CLOCK OVERFLOW
419 TADZ CSTAT / CLSA BITS --> AC
420 RAL / LINK GOES ON IF CLOCK OVERFLOWED
421 SZL / IF NO CLOCK OVERFLOW THEN RETURN
422 CLKINT, ISZ CLKOVR+1 / ELSE INCREMENT THE CLOCK OVERFLOW COUNTER (EAE HIGH ORDER WORD)
424 ADDR MQSAVE / RESTORE MQ, CLEAR AC! TRICKSY!
425 ORG .-2; DLD; ORG .+1
427 JMP% FIREED / RETURN TO CLOCK ROUTINE
429 MQSAVE, 0;0 / SECOND WORD IS USED FOR STRIGG COUNTER, FIRST SAVES MQ ON ENTRY
430 CLKOVR, 0;0 / HERE IS THE CLOCK OVERFLOW COUNTER, (SINGLE PRECISION, SECOND WORD HOLDS CLOCK COUNTER)
431 / CLKOVR IS CLEARED AT EACH A/D INTERRUPT. WE ALSO CLEAR THE CLOCK COUNT REGISTER.
432 / SINCE A/D CLOCK AS HIGHER INTERRUPT FREQUENCY THAN TRIGG CLOCK
433 / THE TRIGGER CLOCK OVERFLOW SHOULD BE ZERO ALL THE TIME!
434 / BUT WHAT'S SHURE IN A COMPUTER'S WORLD NOWADAYS????
436 MQAC, 0;0 / HERE FSMPLE AND TRIGGED ROUTINE SAVE MQ&AC ON ENTRY
437 ITIMWR, ADDR TIMWRD / POINTER TO STRIGG TIME WORDS
438 TIMWRD, 0;0;0 / TIME WORDS FOR 3 SCHMITT TRIGGER CHANNELS
439 TIMBIT, 0;0 / THRUPT INSERTS CLOCKRATE/SAMRAT/12
440 M15, -15 / DEC 13: USED TO TEST TIME SLICE OVERFLOW
441 IBITWR, TAD BITWRD / POINTER TO LOAD THE CORRECT BIT MASK FOR EACH TIME SLICE
442 7777 / TOO MUCH EVENTS
455 0001 / HERE FOR SOME VERY LATE EVENTS
457 / HERE WE COMPUTE THE STRIGG TIME WORD
459 TRIGGD, 0 / ON ENTRY AC HOLDS NUMBER OF SCHMITT TRIGGER FIRED
460 ADDR MQAC / SAVE AC AND MQ
461 ORG .-2; DST; ORG .+1
462 TAD ITIMWR+1 / COMPUTE CORRECT ADDRESS OF TIME WORD
464 CLBA!CL1DEV / LOAD CLOCK BUFFER --> AC
465 MQL / AND INTO MQ, CLEAR AC
466 ADDR CLKOVR /AND ADD THE CLOCK OVERFLOW COUNTER REQUIRES MODE BITS OF CLOCK SET TO 10
467 ORG .-2; DAD; ORG .+1
468 ADDR TIMBIT / TIMBIT= RATE*12/SAMRAT HERE WE COMPUTE THE TIME SLICES
469 ORG .-2 ; DVI ; ORG .+1
470 ACL / MQ HOLDS QUOTIENT SO: TIME SLICE -> MQ -> AC
471 TAD M15 / IF THERE ARE ALLREADY 13 SLICES PASSED
472 SMA SZA CLA / THEN STOP, ELSE GOON
473 JMS OVRTRI / STRIGG INPUT OVERFLOWED
474 ACL / TIME SLICE --> AC
475 TAD IBITWR / HERE WE DO SOME COMPUTATIONS
476 DCA .+3 / IN ORDER TO FETCH THE
477 TAD% ITIMWR / CORRECT BIT AND TIMEWORD.
478 MQL / PREP FOR .OR. TIMEWORD AND SLICE BIT
479 TAD BITWRD / IS REPLACED BY CORRECT TAD BITWRD+SLICE
480 MQA / OR THE TIMEWORD AND THE BIT
481 DCA% ITIMWR / AND PUSH BACK
482 ADDR MQAC / RESET AC AND MQ
483 ORG .-2; DLD; ORG .+1
484 JMP% TRIGGD / AND RETURN!
486 OVRTRI, 0 / HANDLES STRIGG OVERFLOWES
487 / HLT / EITHER HALT OR -1 IS INDEX INTO BITWRD TABLE
492 ADSETU, 0 /SET UP ROUTINE
493 SWAB / SWITCH EAE TO MODE B (USED FOR HARD FPP12)
494 TADZ CURBUF /GET FIELD OF BUFFER
495 JMS MAKCDF /MAKE 3 BITS FLD INTO CDF
498 DCA% ABUFCDF+1 /SAVE IN SAMPLER CODE
499 TADZ CURBUF+1 /SET SAMPLER BUFFER POINTER
501 TADZ NXTBUF /GET FIELD OF ALTERNATE BUFFER
504 TAD BUFSIZ /SET INITIAL COUNT
507 DCAZ CURSTT / INSERT ADR. OF ACTUAL STATUS WORD
509 DCAZ NXTSTT / AND THE ADR. OF NEXT STATUS WORD
510 ADDR NPOINT+1 / SINCE FPP AND EAE HAVE DIFFERENT HIGH ORDER AND LOW ORDER
511 ORG .-2; DLD; ORG .+1 / WORD ORDER IN MEMORY
513 ADDR NPOINT+1 / WE HAVE TO CHANGE IT
514 ORG .-2; DST; ORG .+1
516 ORG .-2; DDZ; ORG .+1 / CLEAR THE STRIGG TIME WORDS
518 ORG .-2; DDZ; ORG .+1
519 ADDR CLKOVR / CLEAR CLOCK OVERFLOW COUNTER
520 ORG .-2; DDZ; ORG .+1
522 CLA CMA /STOP THE CLOCK
530 ADCL /CLEAR AD LOGIC JUST IN CASE
531 TAD L300 /SET AD ENABLE BITS, EXT START, AUTO INCREMENT
533 TAD% JCSTART+1 /STARTING CHANNEL NUMBER
538 TAD% JCSTART+1 /SET UP INITIAL SAM INSTRUCTION
543 TAD L100 /SET FAST SAM BIT
544 IOF /TURN OFF INTERRUPTS IN LINC MODE
545 LINC /ENTER LINC MODE
551 ORG .-2; DST; ORG .+1
553 ORG .-2; DDZ; ORG .+1
554 DCA TIMWRD+1 / CLEAR STRIGG TIME WORDS
555 ADDR CLKOVR / AND CLEAR CLOCK OVERFLOW COUNTER
556 ORG .-2; DDZ; ORG .+1
563 JCSTAR, ADDR CSTART+2
567 / MAKE THREE BITS OF AC9-11 INTO CDF
569 / COMPUTE THE NUMBER OF BITS SET IN THE TRIGGER TIME WORD
571 CMPBIT, 0 / ON ENTRY BITSCN HOLDS THE WORD TO SCAN
573 TAD M14 / 12 BITS TO SCAN, PREP THE COUNTER
575 DCA BITCNT / CLEAR BIT COUNTER
576 TAD BITSCN / TRIG TIME WORD --> AC
577 BITLOP, RAL / SHIFT BIT INTO THE LINK
582 CDF CIF 0 / HOME TO FPP
583 JMP% CMPBIT / FROM TRAP4
585 BITSCN, 0 / ON ENTRY: HOLDS THE WORD TO SCAN
586 BITCNT, 0 / ON RETURN: HOLDS NUMBER OF BUTS SET
587 BITLCN, 0 / LOOP COUNTER, ABOVE TWO LOCATIONS ARE ALSO USED AS INDEX REGS 0 AND 1
617 XVALID, F 114. / LENGTH OF READ VALID VECTOR (MUST BE MULTIPLE OF 3)
618 VALID, ORG .+162 / AND HERE IS THE BUFFER SPACE
620 / ROUTINE TO TEST FOR VALID SAMPLE ( PACKED DATA)
622 PVALID, ORG .+2 /POINTER TO ACTUAL POSITION INSIDE VALID VECTOR
623 MVALID, ORG .+2 /VALID VECTOR: LAST ADDRESS USED
624 NVALID, ADDR VALID-1 /HOLDS ADR. OF FIRST WORD OF VALID VECTOR -1
626 TSTVLD, ORG .+1 / JMS TSTVLD
627 / SAMPLE NON VALID RETURN
628 / SAMPLE VALID RETURN
630 ISZ PVALID+1 / GET THE NEXT LOC. OF VALID VECTOR
633 TAD MVALID+1 / IF WE REACHED THE END OF THE VECTOR THEN
634 SPA CLA / WE RESET TO THE START ELSE
635 JMP L1 / CONTINUE AT L1
639 L1, TAD% PVALID+1 / READ VALID FLAG --> AC
640 SNA CLA / IF THIS READ WAS VALID THEN WE INCREMENT THE BUFFER POINTER ELSE
641 JMP% TSTVLD / WE TAKE THE NEXT SAMPLE INTO THIS LOCATION
642 ISZ TSTVLD / TAKE THE NORMAL RETURN FOR VALID SAMPLE
648 FLDA 30 /GET RETURN ADDR
654 FLDA% 0 / COMPUTE THE NUMBER OF PARAMETERS
659 ALN X1 / DIVIDE BY TWO
661 ATX X2 / NEGATIVE NUMBER OF ARGUMENTS --> X2
662 FLDA 0 /GET ARG POINTER
665 FSTA TEMP /SAVE ARG POINTER
668 FSTA CLINT /STOP ANY SAMPLING NOW!
671 FSTA #CLINT > / DISABLE STRIGG EVENTS
673 FLDA% TEMP,1 /GET BUFF1 ADDRESS
679 FLDA% TEMP,1+ /GET BUFF2 ADDR
683 JXN TH1,X2+ / IF THERE ARE ONLY TWO PARAMETERS THEN
684 TRAP4 #ARGER / ARGUMENT ERROR # 2
686 FLDA% TEMP,1+ /ADDR OF PARAMETERS
687 FSTA PARAM / SAVE ADDR. OF PARAMETERS
690 FSTA PACK / CLEAR PACK & NTRIGG IF THERE ARE ONLY 3 PARAMS
691 FSTA NTRIG / DISABLE TRIGG EVENTS
694 JXN TH2,X2+ / IF THERE ARE 4 OR MORE PARAMETERS THEN FETCH THE LAST BUT ONE
695 JA TH3 / ELSE THERE ARE 3 ARGUMENTS
696 TH2, FLDA% TEMP,X1+ / ADDR OF FOURTH ARGUMENT --> PACK
698 JXN TH6,X2+ / IF THERE ARE 5 PARAMETERS GOTO TH5
699 JA TH3 / ONLY FOUR PARAMETERS
701 FSTA NTRIG / ADDR OF STRIG COUNT --> WSTRC
702 JXN TH10,X2+ / IF THERE ARE 5 PARAMETERS THEN THERE MUST BE A SIXTH ONE
703 LDX 4,X0 / FIVE PARAMETERS ARE INVALID, ARGUMENT ERR 5
706 FSTA TIMRAT / INSERT RATE/SAMRAT/12 --> TIMBIT
708 FLDA PARAM / RESTORE ADR. OF THIRD ARGUMENT
712 FLDA% TEMP,1 /STARTING CHANNEL
715 FLDA% TEMP,1+ /# CHANNELS
720 FLDA% TEMP,1+ /NUMBER OF POINTS
725 JEQ TH4 / ONLY THREE PARAMETERS, CLEAR PCKSIG
733 TBIN0, SETX VALID / PREPARE THE VALID VECTOR
737 FLDA# NVALID / TAKE CARE, THESE LOCATION ARE IN BASE PAGE!
746 LDX -1,X1 / X2 HOLDS PCKSIG !
752 TBIN1, SETX VALID / XR POINTER ONTO VALID VECTOR
753 ATX X0 / INSERT V. VALUE INTO THE VECTOR (WORD BY WORD)
754 SETX TBIN1 / NOW WE INCREMENT THE POINTER ABOVE
755 JXN .+2,X1+ / WITH THE X INCREMENT CMD AND
756 SETX XR0 / RESET TO THE INDEX REGISTER SET
757 JXN THL0,X2+ / AND NOW WE TEST IF THE WORK IS DONE
758 \fTH5, STARTF / CLEAR ALL 36 BITS OF FAC SINCE
759 FCLA / IF NTRIG.EQ.0 THEN WE DO NOT LOAD INTO THE EXPONENT
761 FLDA NTRIG / PREPARE THE STRIGG EVENT INPUT
762 JEQ TH7 / NOTHING DESIRED, SKIP TO TH7
763 LDX 10,X0 / ERROR #10
764 IFNSW 4 < / IF THERE IS NO HANDLER THEN
765 JA TH9 > / WE ERROR OFF
766 FSTA TEMP / PUT ADDR OF TRIGG COUNT --> TEMP
768 FLDA% TEMP / # OF TRIGGER INPUTS --> FAC
769 LDX 11,X0 / ERROR #11
770 JAL TH9 / IF NO FIXING POSSIBLE THE ERROR OFF!
771 JLT TH9 / IF TRIGGER NUMBER OUTSIDE RANGE 0 TO 3 THEN ERROR OFF
772 FSUB FL3 / TEST FOR UPPER LIMIT
773 LDX 12,X0 / ERROR #12
776 TH7, STARTF / IF THERE ARE NO STRIGGS INPUT THEN WE COME HERE WITH FAC CLEARED!
777 FADD FL1 / ADD 1 FOR THE COUNTER OF THE IR SERVICE ROUTINE
778 FNEG / AND HERE WE COMPUTE THE COUNTER
779 SETX WSTRC / AND BUMP INTO PDP/8 CODE
781 SETX XR0 / RESET INDEX REGIS POINTER
782 STARTD / ADDR OF TIME RATIO --> TEMP
783 FLDA TIMRAT / FETCH THE TIME RATIO
784 JEQ TH12 / NO STRIG EVENTS DISIRED, SKIP
787 FLDA% TEMP / TIMERATIO --> FAC
788 FSTA TIMRAT / AND SAVE FOR SOMEBODY ELSE
789 LDX 13,X0 / ERROR #13
790 JLT TH9 / NEGATIVE PARAMETER IS NOT NICE
791 LDX 14,X0 / ERROR #14
792 JAL TH9 / WE HAVE TO FIX THE NUMBER
794 TH9,/ X0 HOLDS ERROR NUMBER (10 TO 13)
795 TRAP4 #ARGERR / WE ERROR OFF
797 TH11, SETX TIMBIT / FIX THE NUMBER INTO 12 BITS
798 ATX 0 / FOR EAE DVI INSTRUCTION
801 / INDEX REGISTERS (PBUFF) 1&2 ARE STATUS WORD PNTRS!
804 LDX 11,1 /INITIALIZE STATUS WORD PNTRS
806 FLDA FP25 /INITIALIZE STATUS WORDS
807 FSTA STAT1 /TO INDICATE BUFFERS
808 FSTA STAT2 /NOT FILLED
809 TRAP4 ADSETU /SET UP AD STUFF
810 FLDA NTRIG / HERE WE SET UP THE STRIGGE EVENT INPUT
812 JEQ TH8 / IF NO TRIGG INPUTS THEN SKIP ELSE
814 FSTA #CLINT / QUEUE THE STRIGG INTERRUPT SERVICE ROUTINE INTO THE CLOCK TERMINATION ROUTINE
816 FLDA SAMADR /SET UP SAMPLER INTRPT HNDLR
825 TRGADR, ADDR FIREED / ADDR OF SCHMITT TRIGGER EVENT INTERRUPT SERVICE
828 XR1, 0 / HOLDS NUMBER OF ARGUMENTS
842 PACK, F 0. / HOLDS ADR. OF FOURTH ARGUMENT
843 NTRIG, F 0. / HOLDS ADDR. OF FIFTH ARGUMENT
844 TIMRAT, F 0. /HOLDS CLOCK/SAMRAT/12, CLOCK IS RATIO OF SCHMITT TRIGGER TIMER
845 \f/**** WORD SUBROUTINES ****
850 WDBASE, F 0. /PNTR TO ARGS
851 WDINDX, F 0. /INDEX TO WORD IN ARRAY
852 WDOPER, F 0. /TARGET OR SOURCE ADDR
854 STXMJA, 0;1100-1030;0 /STX - JA
855 WORDOP, TEXT +WORDOP+
858 WINDEX, F 0. /INDEX REGS 0-2
864 /**** WGET - WORD GET ****
866 / CALL WGET(BUFF1,NWORD,Y)
869 WGET, JSA WDSET /INIT REGISTERS
870 FLDA WPCNT / LOOK IF CALLED WITH TWO PARAMETERS
871 JEQ W2PAR / TWO PARAMETERS ONLY, OUPUT VIA FAC
872 XTA 0 /GET WORD FROM BUFF1
873 FSTA% WDOPER /STICK IT IN X
878 /**** WPUT - WORD PUT ****
880 / CALL WPUT(BUFF1,NWORD,Y)
883 WPUT, JSA WDSET /INIT REGISTERS
885 ATX 0 /FIX AND STORE IN BUFF1
888 / WGET & WPUT INITIALISATION
893 FLDA 30 /GET RTN ADDR
900 LDX 0,1 / COMPUTE NUMBER OF PARAMETERS
901 FLDA% WDBASE,1 / ADR. FOLLOWING THE PARAMETER LIST --> FAC
902 FSUB WDBASE / SUBTRACT THE START ADR. OF PARAMETER LIST
903 FSUB WC1 / FAC-5 --> FAC
904 FSTA WPCNT / WPCNT=0 <==> TWO PARAMETERS, =2 <==> THREE PARAMETERS
905 FLDA% WDBASE,1+ /BUFFER ADDR
906 FADD STXMJA /MAKE SETX INST
908 FLDA% WDBASE,1+ /WORD INDEX ADDR
910 FLDA WPCNT / TEST IF THERE ARE MORE THAN 2 PARAMETERS
912 FLDA% WDBASE,1+ /RESULT OR VALUE ADDR
916 FLDA% WDINDX /WORD INDEX
917 FSUB F1 /COMPUT ADDR OF WORD
921 WDSETX, SETX 0 /MODIFIED DURING EXEC
924 / SUBROUTINE TO RELEASE A BUFFER BY RESETTING
925 / THE STATUS REGISTER
929 / N DESIGNATES THE STATUS REGISTER, N SHOULD BE 1
930 / OR 2. IF N .NE. 1, 2 IS ASSUMED.
935 FLDA 30 /GET RTN ADDR
943 FLDA% WDBASE,1 /N ADDR
945 SETX STAT1 /MODIFY STATUS VIA INDEX
948 FSUB F1 /TEST FOR NOT 1
949 JNE CLR2 /ASSUME STAT2
950 LDX -1,0 /CHANGE EXPONENT
953 CLR2, LDX -1,3 /STAT2 EXP TO -1
955 \f/ COMPUTE THE NUMBER OF BITS SET IN THE TRIGGER WORD
956 / INTEGER FUNCTION TRGWRD
957 / BITCNT=TRGWRD(TIMEWORD)
961 TRGWRD, STARTD / STAY ON CALLER S BASE
963 FSTA RETS / SAVE RETURN ADR.
964 SETX BITSCN / SET UP X REGISTER TO 8-MODE CODE
965 LDX 1,1 / INDEX TO FIRST ARGUMENT
969 FLDA% 3 / FIRST ARGUMENT --> FAC
970 ATX 0 / AND INTO 8-MODE CODE
971 TRAP4 CMPBIT / THE WORK IS DONE BY PDP8
972 XTA 1 / GET THE RESULT
973 RETS, JA .-. / AND HOME