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