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