cafd9290e849d0fedc46bebe778389d277a0ae64
[pdp8.git] / sw / rescue / lab8e_goettingen / disk2_11 / rka / paroff / adbu.ra
1 / OS/8 TSAR/TSARINA
2 /
3 / ADBUFF.RA
4 /
5 / DEC-S8-STSAA-A-LA25
6 /
7 / K. ELLSON AND L. PEARSON
8 /
9 /
10 / TSAR SUBROUTINE - BUFFERED A/D
11 / COPYRIGHT 1973
12 / DIGITAL EQUIPMENT CORPORATION
13 / MAYNARD, MASSACHUSETTS 01754
14 /
15 / THIS PACKAGE PROVIDES A FUNCTIONAL REPLACEMENT FOR
16 / THE FOLLOWING FORTRAN IV LIBRARY SUBROUTINES: REALTM
17 / AND ADB. REALTM AND ADB ARE REPLACED BY THE SUBROUTINE
18 / THRUPT. A THRUPT CALL IS ILLUSTRATED BY THE FOLLOWING
19 / FORTRAN PROGRAM.
20 /
21 /*************************************************************
22 /
23 / EXTERNAL STAT1,STAT2
24 / INTEGER BUFF1(85),BUFF2(85),IPARMS(3),HASH(# OF CHANNELS)
25 / CALL THRUPT(BUFF1,BUFF2,IPARMS,HASH,NTRIG)
26 / CALL CLOCK(8,IRATE) @ IF NO /1 SWITCH AT ASSEMBLY TIME
27 / @ FOR A/D CONVERSION TIMED WITH FIRST DK8-EP
28 / CALL CLOCK1(8,IRATE) @ IF /1 SWITCH SET AT ASSEMBLY TIME
29 / @ THIS IS FOR A/D CONVERSION TIMED WITH 2ND DK8-EP
30 / IF YOU USE BOTH CLOCKS ON ONE SYSTEM, THEN YOU
31 / MAY SWITCH ON ONLY ONE CLOCK-TIMED A/D CONVERSION.
32 / THIS MEANS: ONLY ONE CLOCK MAY BE STARTED WITH FUNCTION=8 (BIT 9 SET)
33 / ...
34 / 100 IF (STAT1-0.5) 100, 110, 999
35 / 110 WRITE (5) BUFF1
36 / CALL RELEAS (1)
37 / ...
38 / 999 WRITE (4,1000)
39 / 1000 FORMAT (' SAMPLING TOO FAST')
40 / CALL CLOCK (0,0)
41 / ...
42 /
43 /************************************************************
44 /
45 / BUFF1 - ONE OF 2 BUFFERS FOR THE ANALOG DATA, 255 12 BIT
46 / WORDS ARE STORED IN EACH BUFFER
47 /
48 / STAT1 - DYNAMIC STATUS WORD OF BUFF1. THE VALUES 0.25,
49 / 0.5, AND +1. INDICATE THAT THE BUFFER IS NOT FILLED,
50 / BUFFER IS FILLED, AND BUFFER OVERFLOW.
51 /
52 / BUFF2 - THE SECOND BUFFER.
53 /
54 / STAT2 - THE DYNAMIC STATUS WORD OF BUFF2, VALUES ARE THE
55 / SAME AS FOR STAT1.
56 \f/
57 / IPARMS - THE PARAMETER VECTOR WHICH CONTAINS IN ORDER THE
58 / STARTING CHANNEL, THE NUMBER OF CHANNELS, AND THE NUMBER
59 / OF SAMPLES.
60 / HASH - OPTIONAL: A TABLE CONTAINING THE READ VALID INFORMATION FOR A/D CHANNELS AND STRIGG INPUTS
61 / NTRIG - OPTIONAL BUT HASH MUST BE SPECIFIED:
62 / THE NUMBER OF SCHMITT TRIGGER CHANNELS TO SAMPLE
63 / CONFIGURATION REQUIRED FOR A/D AND STRIGG SAMPLING:
64 / FIRST DK8-EP: FREE RUNNING TIMER (10 KHZ OR 100 KHZ) FOR TRIGGER INPUT.
65 / CALL CLOCK4 (1 TO 7,3) FOR 10 KHZ
66 / CALL CLOCK4 (1 TO 7,30) FOR 100 KHZ
67 / SECOND DK8-EP STARTS THE A/D VIA EXTERNAL EVENT: CALL CLOCK1(8,RATE)
68 / TIME WORD: THE INTERVALL BETWEEN TWO A/D CYCLES IS DIVIDED INTO
69 / 12 SLICES CALLED S0 TO S11.
70 / AN EXTERNAL EVENT BETWEEN 0 AND S0 (SAMRAT/12) SETS THE LEFTMOST BIT 0.
71 / ' '' '' '' S11 AND SAMRAT SETS THE RIGHTMOST BIT 11.
72 /
73 / UPDATES:
74 /
75 / WGET: THE THIRD PARAMETER (RESULT) IS OPTIONAL
76 / VALID CALLS:
77 / I=WGET(BUFF,PNTR,RESULT)
78 / I=WGET(BUFF,PNTR)
79 / CALL WGET (BUFF,PNTR,RESULT)
80 /
81 / 11-SEP-80 HA
82 /
83 / INTERRUPT SERVICE ROUTINE FSMPLE:
84 / BEFORE THE READ ADRB WAIT FOR ADSE TO AVOID A NON VALID READ
85 / IF CLOCK DID'NT START THE AD CONVERTER.
86 / THEREFORE IN ANY CASE (ONE OR MORE CHANNELS) THE
87 / CLOCK MUST BE STARTED WITH CALL CLOCK(8,FREQU).
88 / FIRST PARAMETER OF CLOCK MUST BE 8 !
89 / 29-SEP-80 HA
90 / 1-OCT-82 HA REV 2.0 PACKS THE SAMPLE
91 / 15-JUL-83 HA REV 2.1 REARANGES CODE FOR PDP12 LINC OPTION
92 / 18-MAR-85 HA REV 3.0 ALLOWS TWO DK8-EP MODULES
93 / FOR A/D TRIGGED WITH DEV. CODE 13 CLOCK: /8 SWITCH
94 / FOR A/D TRIGG'D WITH DEV. CODE 17 CLOCK: /1 /8 SWITCH
95 / FOR A/D ON PDP-12 : NO SWITCH
96 /
97 / 26-JUL-85 HA REV 3.1 ALLOWS SCMITT TRIGGER INPUT WITH DK8-EP DEV 13 AND CLOCKED A/D WITH DK8-EP DEV 17
98 /
99 \f/
100 CL1DEV=13&10 / FIRST DK8-EP
101 CL2DEV=17&10 / SECOND DK8-EP
102 /
103 MQL=7421
104 MQA=7501 / WE USE EAE MODE B
105 CAM=7621
106 DAD=7443
107 DST=7445
108 DLD=DAD!CAM
109 DDZ=DST!CAM
110 DVI=7407
111 DPIC=7573
112 DPSZ=7451
113 IFNSW 1 <
114 EXTERN #CLINT
115 CLINT= #CLINT
116 IFSW 4 < EXTERN #CLIN1 >
117 >
118 IFSW 1 <
119 EXTERN #CLIN1
120 CLINT= #CLIN1
121 IFSW 4 < BAD SWITCH /1 /4; END >
122 >
123 CSTAT=157 /CLOCK ROUTINE PUTS CLSA BITS IN HERE
124 ENTRY STAT1 /ALLOW FORTRAN ACCESS TO THES
125 ENTRY STAT2 /LOCATIONS
126 COMMZ #PAGE0
127 ORG 2
128 PBUFF, 0 /PNTR TO CURRENT BUFFER
129 CURSTT, 0 /PNTR TO CURRENT STATUS WORD
130 NXTSTT, 0 /PNTR TO NEXT STATUS WORD
131 CURBUF, 0;0 /START OF CURRENT BUFFER PNTR
132 NXTBUF, 0;0 /START OF NEXT BUFFER PNTR
133 /STATUS WORDS, VALUES
134 STAT1, F 0.25 /0.25, 0.5, & 1.0 INDICATE
135 STAT2, F 0.25 /STATUS WORD IS NOT FILLED,
136 /FILLED, AND OVERFLOWED
137
138
139
140 IFSW 8 <
141 ADSK=6534
142 ADRB=6533
143 ADST=6532
144 ADLM=6531
145 ADLE=6536
146 ADCL=6530
147 ADRS=6537
148 ADSE=6535
149 CLED=6134
150 MQL=7421
151 ACL=7701
152 CLBA=6006 / DO NOT FORGET TO INSERT THE DEVICE CODE
153 CLZE=6000
154 >
155 IFNSW 8 <
156 ESF=4
157 LINC=6141
158 PDP=2
159 SAM=100
160 CLEN=6134
161 >
162
163
164 \f FIELD1 FSMPLE
165 0 /INTERRUPT TIME A/D SAMPLER
166 DST; ACMQ /SAVE AC AND MQ --> ACMQ
167 JMS% ITSTVL+1 /TEST VALID FOR THE FIRST SAMPLE
168 JMS INVALID /AND DECLARE NOT VALID
169 WAITSP,
170 IFNSW 8<
171 JMS LNCSAM /INITIATE SAMPLE
172 NEXTCH, ISZ SAMINS /UPDATE SAM INST FOR NXT CHAN
173 JMS LNCSAM
174 TAD SAMTMP
175 >
176 IFSW 8 <
177 ADSK / WAIT FOR COMPLETION OF CONVERSION
178 JMP .-1
179 ADRB /READ SAMPLE
180 JMS PUTSAM / INSERT INTO THE OUTPUT BUFFER AND TEST IF WORK DONE
181 MORESM,/
182 ISZ NCHANL+1 / ANY MORE CHANNELS TO SAMPLE?
183 SKP / START THE NEXT CONVERSION IF THERE IS ANY REMAINING
184 JMP NOTMOR / NOTHING MORE TO A/D SAMPLE
185 JMS% ITSTVL+1 /HERE ONLY IF SOME MORE A/D TO SAMPLE!
186 JMP SKIPSM / SKIP THE NEXT SAMPLE, RETURNS TO MORESM !!
187 ADST / AND START THE NEXT CONVERSION - AUTO INCREMENT MODE!
188 >
189 JMS% IINCPT+1 / INCREMENT BUFFER POINTER
190 JMP WAITSP / AND TAKE THE NEXT SAMPLE
191 NOTMOR,/
192 TAD CSTART+2 /STARTING CHANNEL
193 IFSW 8 <
194 ADLM / ELSE RESET MUX REGISTER
195 >
196 IFNSW 8 <
197 DCA SAMINS
198 JMS LNCSAM /SET CHANNEL TO START IN CASE
199 /CLOCK INITIATED
200 >
201 TAD NCHANL+2 /NUMBER OF CHANNELS
202 DCA NCHANL+1 /INTO COUNTER
203 /
204 / HERE WE INSERT THE STRIGG TIME WORDS
205 /
206 IWLOP1,
207 ISZ IWSTRC / IF ANY MORE TRIGG INPUTS
208 JMP .+2 / THEN SKIP TO INCPTR
209 JMP IWLOP2 / ELSE RESET ALL POINTERS AT IWLOP2
210 TAD% IWSTRI / TRIGG TIME WORD --> AC
211 JMS PUTSAM /INSERT TIME WORD INTO THE OUTPUT BUFFER
212 JMS% ITSTVL+1 /TEST FOR VALID SAMPLE (SKIP MEANS CRAZY PROGRAMMER!)
213 JMP .+2 / SKIP HERE MEANS BAD STRIGG TIME WORDS!
214 JMS INCPTR / INCREMENT OUTPUT BUFFER POINTER
215 ISZ IWSTRI / INCREMENT POINTER TO THE TIME WORDS
216 JMP IWLOP1 / AND LOOK FOR THE NEXT TRIGG WORDS TO PROCESS
217 IWLOP2, CLA
218 TAD% IWSTRI+1 /HOLDS ADDR
219 DCA IWSTRI / HOLDS POINTER TO THE TIME WORD
220 TAD% IWSTRC+1 /HOLDS NEGATIVE NUMBER OF TRIGG INPUTS
221 DCA IWSTRC / HOLDS THE COUNTER
222 DLD; ACMQ /RESTORE AC AND MQ
223 JMP% FSMPLE /DONE FOR THIS TIC
224 /
225 / SAMPLING FINISHED
226 /
227 SAMDON,/
228 ISZ PUTFLG / IF WE FOREGET TO INCREMNT BUFFER POINTER
229 JMS% IINCPT+1 / THEN WE DO IT NOW
230 / $$$$$$ STATUS WORT LADEN!
231 DCAZ% CURSTT /SET STATUS OF CURRENT FULL
232 SAMXIT, DCA% XCLINT+1 /STOP SAMPLING
233 IFSW 4 <
234 DCA% YCLINT > / STOP STRIGG INPUT
235 DLD; ACMQ /RESTORE AC AND MQ
236 JMP% FSMPLE
237 /
238 SKIPSM,/ SKIP ONE A/D SAMPLE
239 ISZ NCHANL+1 / NEVER SKIPS - SINCE ALREADY BEEING TESTED
240 DLD; NPOINT / THIS CODE HERE SAVES SOME INDIRECT REFS
241 DPIC / INCREMENT DOUBLE PREC. COUNTER TO TEST FOR MORE SAMPLES
242 DST; NPOINT / BUMP INTO COUNTER
243 DPSZ / SKIP IF WORK DONE
244 JMP MORESM /GO FETCH THE NEXT SAMPLE
245 JMP SAMDON / SET STATUS OF CURRENT BUFFER FULL: SAMPLE DONE
246 /
247 /
248 PUTSAM, 0 / INSERTS AC INTO OUTPUT BUFFER
249 ISZ AVALID / VALID INPUT?
250 JMP PUTSA1 / NON VALID, RETURN WITHOUT ACTION
251 BUFCDF, HLT /REPLACED BY CDF TO BUFFER
252 DCAZ% PBUFF
253 CDF 10 / USED FOR POINTER PVALID!
254 DCA AVALID / CLEAR VALID FLAG FOR NEXT CALL
255 DCA PUTFLG / DON'T FORGET TO INCREMENT THE BUFFER POINTER 0 --> PUTFLG
256 JMP% PUTSAM / ON RETURN AC = 0
257 PUTSA1, CLA / CLEAR AC FOR RETURN
258 JMP% PUTSAM
259 /
260 /
261 INVALID,0 / SET THE ACTUAL SAMPLE INVALID
262 CLA CMA / -1 --> AC
263 DCA AVALID
264 JMP% INVALID / ON RETURN AC=0
265 PUTFLG,
266 IINCPT, ADDR INCPTR / ADDRESS OF ROUTINE TO INCREMENT BUFFER POINTER
267 AVALID, / / ACTUAL VALID FLAG
268 ITSTVL, ADDR TSTVLD / TEST FOR VALID READ
269 TMP,
270 IWSTRC, ADDR WSTRC / POINTER TO THE NUMBER OF STRIGS CHANNELS TO SAMPLE
271 IWSTRI, ADDR TIMWRD / POINTER TO THESE TIME WORDS
272 XCLINT, ADDR CLINT / POINTER TO ENTRY OF CLOCK I/R SERVICE ROUTINE
273 IFSW 4 <
274 YCLINT, ADDR #CLINT / /4 ENABLES STRIGG INPUT FROM FIRST DK8-EP
275 NCHANL, 0;0;0
276 SAMCNT,
277 CSTART, 0;0;0
278 \f/
279 IPUTFL, ADDR PUTFLG / SET TO -1 IF BUFFER POINTER INCREMENTED, RESET BY PUTSAM
280 L10, 10
281 /
282 INCPTR, 0
283 CLA CMA / -1 --> AC
284 DCA% IPUTFL / -1 --> PUTFLG
285 ISZZ PBUFF /ELSE INCR PNTR & SKIP IF WE
286 JMP FLDOK /CROSSED A FIELD BOUNDARY
287 TAD BUFCDF /UPDATE FIELD
288 TAD L10
289 DCA BUFCDF
290 FLDOK,
291 ISZ SAMCNT /INCR BUFFER CNTR & SKIP IF
292 JMP% INCPTR /FILLED. BUFFER OK
293 DCAZ% CURSTT /SET STATUS WORD TO 0.5
294 /FOR BUFFER FILLED
295 TADZ NXTSTT /SWAP STATUS WORD PNTRS
296 DCA TMP / NXTSTT<=> CURSTT
297 TADZ CURSTT
298 DCAZ NXTSTT
299 TAD TMP
300 DCAZ CURSTT
301 TADZ% CURSTT /HAS USER RELEASED THIS BUFFER
302 SMA CLA
303 JMP% ITOOFST+1 /NO, SAMPLING TOO FAST!
304 JMS% ISWPBFR+1 / SWAP BUFFER
305 JMP% INCPTR / BUFFER POINTER UPDATED
306 ISWPBF, ADDR SWPBFR
307 /
308 /
309 ITOOFS, ADDR TOOFST
310 /
311 TAD CSTART+2 /STARTING CHANNEL
312 IFSW 8 <
313 ADLM / ELSE RESET MUX REGISTER
314 >
315 IFNSW 8 <
316 DCA SAMINS
317 JMS LNCSAM /SET CHANNEL TO START IN CASE
318 /CLOCK INITIATED
319 >
320 TAD NCHANL+2 /NUMBER OF CHANNELS
321 DCA NCHANL+1 /INTO COUNTER
322 \f ORG FSMPLE+200
323 /
324 / HERE WE SWAP THE INPUT BUFFERS POINTERS
325 /
326 SWPBFR, 0
327 /
328 / SWAP BUFFER POINTERS
329 /
330 TADZ NXTBUF / NXTBUF <=> CURBUF
331 DCA BUFCDF / BUFCDF, PBUFF = NXTBUF
332 TADZ NXTBUF+1
333 DCAZ PBUFF
334 TADZ CURBUF
335 DCAZ NXTBUF
336 TADZ CURBUF+1
337 DCAZ NXTBUF+1
338 TAD% IBUFCDF
339 DCAZ CURBUF
340 TADZ PBUFF
341 DCAZ CURBUF+1
342 TAD% IBUFSIZ /RESET BUFFER COUNTER
343 DCA% ISAMCNT
344 JMP% SWPBFR
345 IBUFCDF=.+1
346 ADDR BUFCDF
347 IBUFSIZ=.+1
348 ADDR BUFSIZ
349 ISAMCNT=.+1
350 ADDR SAMCNT
351 /
352 / SAMPLING RATE TOO FAST
353 /
354 TOOFST,/
355 CLA IAC /SET STATUS WORD TO 1.0
356 DCAZ% CURSTT
357 IAC
358 DCAZ% NXTSTT
359 JMP% ISAMXIT
360 ISAMXIT=.+1
361 ADDR SAMXIT
362 IFNSW 8 <
363 LNCSAM, 0 /LINC SAM SUBROUTINE
364 LINC
365 SAMINS, SAM 0 /SAMPLE AND SELECT NEXT CHANNEL
366 PDP
367 DCA SAMTMP /SAVE IT
368 JMP% LNCSAM
369 >
370 -2LT\f ORG FSMPLE+400
371 /
372 / INTERRUPT TIME SCHMITT TRIGGER INPUT HANDLER
373 /
374 IFSW 4 <
375 ENRTY FIREED
376 >
377 FIREED, 0 / ON ENTRY AC IS CLEARED BY CLOCK RTN
378 CLA CLL CMA RTL / -3 --> AC
379 DST; MQSAVE / FIRST: STRIG COUNTER, SECOND SAVES MQ
380 CAM / MQ HOLDS # OF STRIGG FIRED, FIRST IS #0
381 TAD CSTAT / CLSA BITS OF FIRST CLOCK --> AC
382 TRILOP, RAL / STRIG BITS --> LINK
383 SWP / NOW AC HOLDS # OF STRIGG
384 SZL / SKIP IF STRIGG DID NOT FIRE
385 JMS TRIGGED / ELSE SET THE TRIGGER TIME WORD
386 IAC / INCREMENT FOR NEXT STRIGG
387 SWP / # OF STRIGG --> MQ, CLSA BIT MASK --> AC
388 ISZ MQSAVE / SOME MORE STRIGS?
389 JMP TRILOP / YES, FETCH THE NEXT EVENT
390 CAM / STRIGS DONE, TEST FOR CLOCK OVERFLOW
391 TAD CTSTAT / CLSA BITS --> AC
392 RAR / LINK GOES ON IF CLOCK OVERFLOWED
393 DLD; MQSAVE / RESTORE MQ, CLEAR AC! TRICKSY!
394 SNL / IF NO CLOCK OVERFLOW THEN
395 JMP% FIREED / RETURN TO CLOCK ROUTINE
396 ISZ CLKOVR / ELSE INCREMENT CLOCK OVERFLOW COUNTER
397 NOP / PROTECT ISZ
398 JMP% FIREED / AND RETURN TO CLOCK IR SERVICE ROUTINE
399 /
400 MQSAVE, 0;0 / FIRST WORD IS USED FOR STRIGG COUNTER, SECOND SAVES MQ ON ENTRY
401 CLKOVR, 0;0 / HERE IS THE CLOCK OVERFLOW COUNTER, (SINGLE PRECISION, SECOND WORD HOLDS CLOCK COUNTER)
402 /
403 ACMQ, 0;0 / HERE FSMPLE AND TRIGGED ROUTINE SAVE AC&MQ ON ENTRY
404 ITIMWR, ADDR TIMWR / POINTER TO STRIGG TIME WORDS
405 TIMWRD, 0;0;0 / TIME WORDS FOR 3 SCHMITT TRIGGER CHANNELS
406 TIMBIT, 0;0 / THRUPT INSERTS RATE*12/SAMRAT
407 M13, -13 / CONSTANT USED TO TEST TIME SLICE OVERFLOW
408 IBITWR, TAD BITWRD / POINTER TO LOAD THE CORRECT BIT MASK FOR EACH TIME SLICE
409 BITWRD, 4000
410 2000
411 1000
412 0400
413 0200
414 0100
415 0040
416 0020
417 0010
418 0004
419 0002
420 0001
421 /
422 / HERE WE COMPUTE THE STRIGG TIME WORD
423 /
424 TRIGGD, 0 / ON ENTRY AC HOLDS NUMBER OF SCHMITT TRIGGER FIRED
425 DST; ACMQ / SAVE AC AND MQ
426 TAD ITIMWR+1 / COMPUTE CORRECT ADDRESS OF TIME WORD
427 DCA ITIMWR
428 CLBA!CL1DEV / LOAD CLOCK BUFFER --> AC
429 MQL / AND INTO MQ, CLEAR AC
430 DAD; CLKOVR /AND ADD THE CLOCK OVERFLOW COUNTER
431 DST; CLKOVR / AND SAVE THE ACTUAL TIME OF THE EVENT
432 DVI; TIMBIT / TIMBIT= RATE*12/SAMRAT HERE WE COMPUTE THE TIME SLICES
433 MQL
434 MQA / SLICE --> AC AND MQ
435 TAD M13 / IF THERE ARE ALLREADY 12 SLICES PASSED
436 SMA SZA CLA / THEN STOP, ELSE GOON
437 HLT
438 MQA / TIME SLICE --> AC
439 TAD IBITWR / HERE WE DO SOME COMPUTATIONS
440 DCA .+3 / IN ORDER TO FETCH THE
441 TAD% ITIMWR / CORRECT BIT AND TIMEWORD.
442 MQL / PREP FOR .OR. TIMEWORD AND SLICE BIT
443 TAD BITWRD / IS REPLACED BY CORRECT TAD BITWRD+SLICE
444 MQA / OR THE TIMEWORD AND THE BIT
445 DCA% ITIMWR / AND PUSH BACK
446 DLD; ACMQ / RESET AC AND MQ
447 JMP% TRIGGD / AND RETURN!
448
449 \fADSETU, 0 /SET UP ROUTINE
450 TADZ CURBUF /GET FIELD OF BUFFER
451 JMS MAKCDF /MAKE 3 BITS FLD INTO CDF
452 DCAZ CURBUF
453 TADZ CURBUF
454 DCA% IBUFCDF+1 /SAVE IN SAMPLER CODE
455 TADZ CURBUF+1 /SET SAMPLER BUFFER POINTER
456 DCAZ PBUFF
457 TADZ NXTBUF /GET FIELD OF ALTERNATE BUFFER
458 JMS MAKCDF
459 DCAZ NXTBUF
460 TAD BUFSIZ /SET INITIAL COUNT
461 DCA% ISAMCNT+1
462 TAD% JNCHANL+1 /SET CHANNEL COUNT
463 DCA% INCHANL+1
464 IFSW 8 <
465 CLA CMA /STOP THE CLOCK
466 CLZE
467 CLA
468 ADCL /CLEAR AD LOGIC JUST IN CASE
469 TAD L300 /SET AD ENABLE BITS, EXT START, AUTO INCREMENT
470 ADLE
471 TAD% JCSTART+1 /STARTING CHANNEL NUMBER
472 ADLM
473 >
474 IFNSW 8 <
475 CLEN /STOP THE CLOCK
476 TAD% JCSTART+1 /SET UP INITIAL SAM INSTRUCTION
477 TAD L100
478 DCA% JCSTART+1
479 TAD% JCSTART+1
480 DCA SAMINS
481 TAD L100 /SET FAST SAM BIT
482 IOF /TURN OFF INTERRUPTS IN LINC MODE
483 LINC /ENTER LINC MODE
484 ESF
485 PDP
486 JMS LNCSAM
487 ION
488 DST; ACMQ / SAVE MQ
489 DDZ; TIMWRD
490 DCA TIMWRD+1 / CLEAR STRIGG TIME WORDS
491 DDZ; CLKOVR / AND CLEAR CLOCK OVERFLOW COUNTER
492 >
493 CIF CDF
494 JMP% ADSETU
495 /
496 JNCHAN, ADDR NCHANL+2
497 INCHAN, ADDR NCHANL+1
498 JCSTAR, ADDR CSTART+2
499 ISAMCN, ADDR SAMCNT
500 IBUFCD, ADDR BUFCDF
501 \f/
502 / MAKE THREE BITS OF AC9-11 INTO CDF
503 /
504 MAKCDF, 0
505 AND L7
506 CLL RTL
507 BASEX, RAL
508 TAD CDF0
509 JMP% MAKCDF
510 /
511 NPOINT, 0;0;0
512 CDF0, CDF
513 0;0
514 L7, 7
515 BUFSIZ, -377
516 IFSW 8 <
517 L300, 300
518 >
519 IFNSW 8 <
520 L100, 100
521 >
522 TEMP, 0;0;0
523 ORG 10*3+BASEX
524 0
525 JA NAME+3
526 0
527 SAMRTN, JA .
528 FP25, F 0.25
529 XVALID, F 56. / LENGTH OF READ VALID VECTOR
530 VALID, ORG .+70 / AND HERE IS THE BUFFER SPACE
531 /
532 / ROUTINE TO TEST FOR VALID SAMPLE ( PACKED DATA)
533 /
534 PVALID, ORG .+2
535 MVALID, ORG .+2
536 NVALID, ADDR VALID-1
537 /
538 TSTVLD, ORG .+1 / JMS TSTVLD
539 / SAMPLE NON VALID RETURN
540 / SAMPLE VALID RETURN
541 / ON RETURN AC=0
542 ISZ PVALID+1 / GET THE NEXT LOC. OF VALID VECTOR
543 CLA
544 TAD PVALID+1
545 TAD MVALID+1 / IF WE REACHED THE END OF THE VECTOR THEN
546 SPA CLA / WE RESET TO THE START ELSE
547 JMP L1 / CONTINUE AT L1
548 TAD NVALID+1
549 IAC
550 DCA PVALID+1
551 L1, TAD% PVALID+1 / READ VALID FLAG --> AC
552 SNA CLA / IF THIS READ WAS VALID THEN WE INCREMENT THE BUFFER POINTER ELSE
553 JMP% TSTVLD / WE TAKE THE NEXT SAMPLE INTO THIS LOCATION
554 ISZ TSTVLD / TAKE THE NORMAL RETURN FOR VALID SAMPLE
555 JMP% TSTVLD
556 \f EXTERN #ARGER
557 SECT THRUPT
558 BASE 0
559 STARTD
560 FLDA 30 /GET RETURN ADDR
561 FSTA SAMRTN
562 STARTF
563 FLDA 0
564 FSTA# TRETU
565 STARTD
566 FLDA% 0 / COMPUTE THE NUMBER OF PARAMETERS
567 FSUB 0
568 FSUB# TWO
569 SETX XR0
570 LDX 1,X1
571 ALN X1 / DIVIDE BY TWO
572 FNEG
573 ATX X2 / NEGATIVE NUMBER OF ARGUMENTS --> X2
574 FLDA 0 /GET ARG POINTER
575 BASE BASEX
576 SETB BASEX
577 FSTA TEMP /SAVE ARG POINTER
578 FCLA
579 FSTA CLINT /STOP ANY SAMPLING NOW!
580 FLDA% TEMP,1 /GET BUFF1 ADDRESS
581 FSTA CURBUF
582 LDX 1,X0
583 JXN TH0,X2+
584 TRAP4 #ARGER
585 TH0,
586 FLDA% TEMP,1+ /GET BUFF2 ADDR
587 FSTA NXTBUF
588 LDX 2,X0
589 JXN TH1,X2+
590 TRAP4 #ARGER
591 TH1,
592 FLDA% TEMP,1+ /ADDR OF PARAMETERS
593 FSTA PARAM / SAVE ADDR. OF PARAMETERS
594 FCLA
595 JXN TH2,X2+ / IF THERE ARE 4 OR MORE PARAMETERS THEN FETCH THE LAST BUT ONE
596 JA TH3 / ELSE THERE ARE 3 ARGUMENTS
597 TH2, FLDA% TEMP,X1+
598 TH3, FSTA PACK
599 FLDA PARAM / RESTORE ADR. OF THIRD ARGUMENT
600 FSTA TEMP
601 STARTF
602 LDX 0,1
603 FLDA% TEMP,1 /STARTING CHANNEL
604 ALN 0
605 FSTA CSTART
606 FLDA% TEMP,1+ /# CHANNELS
607 FSTA CHNLS
608 FNEG
609 ALN 0
610 FSTA NCHANL
611 FLDA% TEMP,1+ /NUMBER OF POINTS
612 FNEG
613 ALN 0
614 FSTA NPOINT
615 FLDA PACK
616 JEQ TH4 / ONLY THREE PARAMETERS
617 FLDA% TEMP,1+
618 FNEG
619 FSUB FL1
620 ALN 0
621 TH4, FSTA PCKSIG
622 ATX X2
623 /
624 TBIN0, SETX VALID
625 LDX 1,X0
626 SETX XR0
627 STARTD
628 FLDA NVALID
629 FSTA PVALID
630 FNEG
631 FADD PCKSIG+1
632 FSTA MVALID
633 /
634 FLDA PACK
635 JEQ TH5
636 FSTA TEMP
637 LDX -1,X1 / X2 HOLDS PCKSIG !
638
639 FLDA TBIN0
640 FSTA TBIN1
641 STARTF
642 THL0, FLDA% TEMP,1+
643 TBIN1, SETX VALID / XR POINTER ONTO VALID VECTOR
644 ATX X0 / INSERT V. VALUE INTO THE VECTOR (WORD BY WORD)
645 SETX TBIN1 / NOW WE INCREMENT THE POINTER ABOVE
646 JXN .+2,X1+ / WITH THE X INCREMENT CMD AND
647 SETX XR0 / RESET TO THE INDEX REGISTER SET
648 JXN THL0,X2+ / AND NOW WE TEST IF THE WORK IS DONE
649
650 TH5, STARTF
651 /
652 / INDEX REGISTERS (PBUFF) 1&2 ARE STATUS WORD PNTRS!
653 /
654 SETX PBUFF
655 LDX 11,1 /INITIALIZE STATUS WORD PNTRS
656 LDX 14,2
657 FLDA FP25 /INITIALIZE STATUS WORDS
658 FSTA STAT1 /TO INDICATE BUFFERS
659 FSTA STAT2 /NOT FILLED
660 TRAP4 ADSETU /SET UP AD STUFF
661 STARTD
662 FLDA SAMADR /SET UP SAMPLER INTRPT HNDLR
663 FSTA CLINT
664 STARTF
665 JA SAMRTN /RETURN
666 NAME, TEXT +THRUPT+
667 SETX XR0
668 SETB BASEX
669 TRETU, F 0.
670 SAMADR, ADDR FSMPLE
671 /
672 XR0, 0
673 XR1, 0 / HOLDS NUMBER OF ARGUMENTS
674 XR2, 0
675 XR3, 0
676 X0= 0
677 X1= X0+1
678 X2= X1+1
679 X3= X2+1
680 ONE, 0;1;0
681 TWO, 0;2;0
682 FL1, F 1.
683 PARAM,
684 CHNLS, F 0.
685 PCKSIG, F 0.
686 PACK, F 0. / HOLDS ADR. OF FOURTH ARGUMENT
687 NTRIG, F 0. / HOLDS ADDR. OF FIFTH ARGUMENT
688 \f/**** WORD SUBROUTINES ****
689 /
690 WPCNT, 0;0
691 WC1, 0;6
692 BASE WDBASE
693 WDBASE, F 0. /PNTR TO ARGS
694 WDINDX, F 0. /INDEX TO WORD IN ARRAY
695 WDOPER, F 0. /TARGET OR SOURCE ADDR
696 F1, F 1.
697 STXMJA, 0;1100-1030;0 /STX - JA
698 WORDOP, TEXT +WORDOP+
699 0
700 WDRTN, JA .
701 WINDEX, F 0. /INDEX REGS 0-2
702 /
703 ORG 10*3+WDBASE
704 0
705 JA WORDOP+3
706 /
707 /**** WGET - WORD GET ****
708 /
709 / CALL WGET(BUFF1,NWORD,Y)
710 /
711 ENTRY WGET
712 WGET, JSA WDSET /INIT REGISTERS
713 FLDA WPCNT / LOOK IF CALLED WITH TWO PARAMETERS
714 JEQ W2PAR / TWO PARAMETERS ONLY, OUPUT VIA FAC
715 XTA 0 /GET WORD FROM BUFF1
716 FSTA% WDOPER /STICK IT IN X
717 JA WDRTN
718 W2PAR, XTA 0
719 JA WDRTN
720 /
721 /**** WPUT - WORD PUT ****
722 /
723 / CALL WPUT(BUFF1,NWORD,Y)
724 /
725 ENTRY WPUT
726 WPUT, JSA WDSET /INIT REGISTERS
727 FLDA% WDOPER /GET Y
728 ATX 0 /FIX AND STORE IN BUFF1
729 JA WDRTN
730 /
731 / WGET & WPUT INITIALISATION
732 /
733 BASE 0
734 WDSET, 0;0
735 STARTD
736 FLDA 30 /GET RTN ADDR
737 FSTA WDRTN
738 FLDA 0 /PNTR TO ARGS
739 SETB WDBASE
740 BASE WDBASE
741 SETX WINDEX
742 FSTA WDBASE
743 LDX 0,1 / COMPUTE NUMBER OF PARAMETERS
744 FLDA% WDBASE,1 / ADR. FOLLOWING THE PARAMETER LIST --> FAC
745 FSUB WDBASE / SUBTRACT THE START ADR. OF PARAMETER LIST
746 FSUB WC1 / FAC-5 --> FAC
747 FSTA WPCNT / WPCNT=0 <==> TWO PARAMETERS, =2 <==> THREE PARAMETERS
748 FLDA% WDBASE,1+ /BUFFER ADDR
749 FADD STXMJA /MAKE SETX INST
750 FSTA WDSETX
751 FLDA% WDBASE,1+ /WORD INDEX ADDR
752 FSTA WDINDX
753 FLDA WPCNT / TEST IF THERE ARE MORE THAN 2 PARAMETERS
754 JEQ WCONT /
755 FLDA% WDBASE,1+ /RESULT OR VALUE ADDR
756 FSTA WDOPER
757 WCONT,
758 STARTF
759 FLDA% WDINDX /WORD INDEX
760 FSUB F1 /COMPUT ADDR OF WORD
761 ALN 0
762 STARTD
763 FADDM WDSETX
764 WDSETX, SETX 0 /MODIFIED DURING EXEC
765 STARTF
766 JA WDSET
767 / SUBROUTINE TO RELEASE A BUFFER BY RESETTING
768 / THE STATUS REGISTER
769 /
770 / CALL RELEAS(N)
771 /
772 / N DESIGNATES THE STATUS REGISTER, N SHOULD BE 1
773 / OR 2. IF N .NE. 1, 2 IS ASSUMED.
774 /
775 ENTRY RELEAS
776 BASE 0
777 RELEAS, STARTD
778 FLDA 30 /GET RTN ADDR
779 FSTA WDRTN
780 FLDA 0 /GET ARG PNTR
781 BASE WDBASE
782 SETB WDBASE
783 SETX WINDEX
784 FSTA WDBASE
785 LDX 1,1
786 FLDA% WDBASE,1 /N ADDR
787 FSTA WDBASE
788 SETX STAT1 /MODIFY STATUS VIA INDEX
789 STARTF
790 FLDA% WDBASE /N
791 FSUB F1 /TEST FOR NOT 1
792 JNE CLR2 /ASSUME STAT2
793 LDX -1,0 /CHANGE EXPONENT
794 /TO -7 TO MAKE 0.25
795 JA WDRTN
796 CLR2, LDX -1,3 /STAT2 EXP TO -1
797 JA WDRTN
798 \f\1a