7 / K. ELLSON AND L. PEARSON
10 / TSAR SUBROUTINE - BUFFERED A/D
12 / DIGITAL EQUIPMENT CORPORATION
13 / MAYNARD, MASSACHUSETTS 01754
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
21 /*************************************************************
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)
34 / 100 IF (STAT1-0.5) 100, 110, 999
39 / 1000 FORMAT (' SAMPLING TOO FAST')
43 /************************************************************
45 / BUFF1 - ONE OF 2 BUFFERS FOR THE ANALOG DATA, 255 12 BIT
46 / WORDS ARE STORED IN EACH BUFFER
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.
52 / BUFF2 - THE SECOND BUFFER.
54 / STAT2 - THE DYNAMIC STATUS WORD OF BUFF2, VALUES ARE THE
57 / IPARMS - THE PARAMETER VECTOR WHICH CONTAINS IN ORDER THE
58 / STARTING CHANNEL, THE NUMBER OF CHANNELS, AND THE NUMBER
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.
75 / WGET: THE THIRD PARAMETER (RESULT) IS OPTIONAL
77 / I=WGET(BUFF,PNTR,RESULT)
79 / CALL WGET (BUFF,PNTR,RESULT)
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 !
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
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
100 CL1DEV=13&10 / FIRST DK8-EP
101 CL2DEV=17&10 / SECOND DK8-EP
104 MQA=7501 / WE USE EAE MODE B
116 IFSW 4 < EXTERN #CLIN1 >
121 IFSW 4 < BAD SWITCH /1 /4; END >
123 CSTAT=157 /CLOCK ROUTINE PUTS CLSA BITS IN HERE
124 ENTRY STAT1 /ALLOW FORTRAN ACCESS TO THES
125 ENTRY STAT2 /LOCATIONS
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
152 CLBA=6006 / DO NOT FORGET TO INSERT THE DEVICE CODE
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
171 JMS LNCSAM /INITIATE SAMPLE
172 NEXTCH, ISZ SAMINS /UPDATE SAM INST FOR NXT CHAN
177 ADSK / WAIT FOR COMPLETION OF CONVERSION
180 JMS PUTSAM / INSERT INTO THE OUTPUT BUFFER AND TEST IF WORK DONE
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!
189 JMS% IINCPT+1 / INCREMENT BUFFER POINTER
190 JMP WAITSP / AND TAKE THE NEXT SAMPLE
192 TAD CSTART+2 /STARTING CHANNEL
194 ADLM / ELSE RESET MUX REGISTER
198 JMS LNCSAM /SET CHANNEL TO START IN CASE
201 TAD NCHANL+2 /NUMBER OF CHANNELS
202 DCA NCHANL+1 /INTO COUNTER
204 / HERE WE INSERT THE STRIGG TIME WORDS
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
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
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
234 DCA% YCLINT > / STOP STRIGG INPUT
235 DLD; ACMQ /RESTORE AC AND MQ
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
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
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
261 INVALID,0 / SET THE ACTUAL SAMPLE INVALID
264 JMP% INVALID / ON RETURN AC=0
266 IINCPT, ADDR INCPTR / ADDRESS OF ROUTINE TO INCREMENT BUFFER POINTER
267 AVALID, / / ACTUAL VALID FLAG
268 ITSTVL, ADDR TSTVLD / TEST FOR VALID READ
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
274 YCLINT, ADDR #CLINT / /4 ENABLES STRIGG INPUT FROM FIRST DK8-EP
279 IPUTFL, ADDR PUTFLG / SET TO -1 IF BUFFER POINTER INCREMENTED, RESET BY PUTSAM
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
291 ISZ SAMCNT /INCR BUFFER CNTR & SKIP IF
292 JMP% INCPTR /FILLED. BUFFER OK
293 DCAZ% CURSTT /SET STATUS WORD TO 0.5
295 TADZ NXTSTT /SWAP STATUS WORD PNTRS
296 DCA TMP / NXTSTT<=> CURSTT
301 TADZ% CURSTT /HAS USER RELEASED THIS BUFFER
303 JMP% ITOOFST+1 /NO, SAMPLING TOO FAST!
304 JMS% ISWPBFR+1 / SWAP BUFFER
305 JMP% INCPTR / BUFFER POINTER UPDATED
311 TAD CSTART+2 /STARTING CHANNEL
313 ADLM / ELSE RESET MUX REGISTER
317 JMS LNCSAM /SET CHANNEL TO START IN CASE
320 TAD NCHANL+2 /NUMBER OF CHANNELS
321 DCA NCHANL+1 /INTO COUNTER
324 / HERE WE SWAP THE INPUT BUFFERS POINTERS
328 / SWAP BUFFER POINTERS
330 TADZ NXTBUF / NXTBUF <=> CURBUF
331 DCA BUFCDF / BUFCDF, PBUFF = NXTBUF
342 TAD% IBUFSIZ /RESET BUFFER COUNTER
352 / SAMPLING RATE TOO FAST
355 CLA IAC /SET STATUS WORD TO 1.0
363 LNCSAM, 0 /LINC SAM SUBROUTINE
365 SAMINS, SAM 0 /SAMPLE AND SELECT NEXT CHANNEL
370 -2LT
\f ORG FSMPLE+400
372 / INTERRUPT TIME SCHMITT TRIGGER INPUT HANDLER
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
398 JMP% FIREED / AND RETURN TO CLOCK IR SERVICE ROUTINE
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)
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
422 / HERE WE COMPUTE THE STRIGG TIME WORD
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
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
434 MQA / SLICE --> AC AND MQ
435 TAD M13 / IF THERE ARE ALLREADY 12 SLICES PASSED
436 SMA SZA CLA / THEN STOP, ELSE GOON
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!
449 \fADSETU, 0 /SET UP ROUTINE
450 TADZ CURBUF /GET FIELD OF BUFFER
451 JMS MAKCDF /MAKE 3 BITS FLD INTO CDF
454 DCA% IBUFCDF+1 /SAVE IN SAMPLER CODE
455 TADZ CURBUF+1 /SET SAMPLER BUFFER POINTER
457 TADZ NXTBUF /GET FIELD OF ALTERNATE BUFFER
460 TAD BUFSIZ /SET INITIAL COUNT
462 TAD% JNCHANL+1 /SET CHANNEL COUNT
465 CLA CMA /STOP THE CLOCK
468 ADCL /CLEAR AD LOGIC JUST IN CASE
469 TAD L300 /SET AD ENABLE BITS, EXT START, AUTO INCREMENT
471 TAD% JCSTART+1 /STARTING CHANNEL NUMBER
476 TAD% JCSTART+1 /SET UP INITIAL SAM INSTRUCTION
481 TAD L100 /SET FAST SAM BIT
482 IOF /TURN OFF INTERRUPTS IN LINC MODE
483 LINC /ENTER LINC MODE
490 DCA TIMWRD+1 / CLEAR STRIGG TIME WORDS
491 DDZ; CLKOVR / AND CLEAR CLOCK OVERFLOW COUNTER
496 JNCHAN, ADDR NCHANL+2
497 INCHAN, ADDR NCHANL+1
498 JCSTAR, ADDR CSTART+2
502 / MAKE THREE BITS OF AC9-11 INTO CDF
529 XVALID, F 56. / LENGTH OF READ VALID VECTOR
530 VALID, ORG .+70 / AND HERE IS THE BUFFER SPACE
532 / ROUTINE TO TEST FOR VALID SAMPLE ( PACKED DATA)
538 TSTVLD, ORG .+1 / JMS TSTVLD
539 / SAMPLE NON VALID RETURN
540 / SAMPLE VALID RETURN
542 ISZ PVALID+1 / GET THE NEXT LOC. OF VALID VECTOR
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
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
560 FLDA 30 /GET RETURN ADDR
566 FLDA% 0 / COMPUTE THE NUMBER OF PARAMETERS
571 ALN X1 / DIVIDE BY TWO
573 ATX X2 / NEGATIVE NUMBER OF ARGUMENTS --> X2
574 FLDA 0 /GET ARG POINTER
577 FSTA TEMP /SAVE ARG POINTER
579 FSTA CLINT /STOP ANY SAMPLING NOW!
580 FLDA% TEMP,1 /GET BUFF1 ADDRESS
586 FLDA% TEMP,1+ /GET BUFF2 ADDR
592 FLDA% TEMP,1+ /ADDR OF PARAMETERS
593 FSTA PARAM / SAVE ADDR. OF PARAMETERS
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
599 FLDA PARAM / RESTORE ADR. OF THIRD ARGUMENT
603 FLDA% TEMP,1 /STARTING CHANNEL
606 FLDA% TEMP,1+ /# CHANNELS
611 FLDA% TEMP,1+ /NUMBER OF POINTS
616 JEQ TH4 / ONLY THREE PARAMETERS
637 LDX -1,X1 / X2 HOLDS PCKSIG !
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
652 / INDEX REGISTERS (PBUFF) 1&2 ARE STATUS WORD PNTRS!
655 LDX 11,1 /INITIALIZE STATUS WORD PNTRS
657 FLDA FP25 /INITIALIZE STATUS WORDS
658 FSTA STAT1 /TO INDICATE BUFFERS
659 FSTA STAT2 /NOT FILLED
660 TRAP4 ADSETU /SET UP AD STUFF
662 FLDA SAMADR /SET UP SAMPLER INTRPT HNDLR
673 XR1, 0 / HOLDS NUMBER OF ARGUMENTS
686 PACK, F 0. / HOLDS ADR. OF FOURTH ARGUMENT
687 NTRIG, F 0. / HOLDS ADDR. OF FIFTH ARGUMENT
688 \f/**** WORD SUBROUTINES ****
693 WDBASE, F 0. /PNTR TO ARGS
694 WDINDX, F 0. /INDEX TO WORD IN ARRAY
695 WDOPER, F 0. /TARGET OR SOURCE ADDR
697 STXMJA, 0;1100-1030;0 /STX - JA
698 WORDOP, TEXT +WORDOP+
701 WINDEX, F 0. /INDEX REGS 0-2
707 /**** WGET - WORD GET ****
709 / CALL WGET(BUFF1,NWORD,Y)
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
721 /**** WPUT - WORD PUT ****
723 / CALL WPUT(BUFF1,NWORD,Y)
726 WPUT, JSA WDSET /INIT REGISTERS
728 ATX 0 /FIX AND STORE IN BUFF1
731 / WGET & WPUT INITIALISATION
736 FLDA 30 /GET RTN ADDR
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
751 FLDA% WDBASE,1+ /WORD INDEX ADDR
753 FLDA WPCNT / TEST IF THERE ARE MORE THAN 2 PARAMETERS
755 FLDA% WDBASE,1+ /RESULT OR VALUE ADDR
759 FLDA% WDINDX /WORD INDEX
760 FSUB F1 /COMPUT ADDR OF WORD
764 WDSETX, SETX 0 /MODIFIED DURING EXEC
767 / SUBROUTINE TO RELEASE A BUFFER BY RESETTING
768 / THE STATUS REGISTER
772 / N DESIGNATES THE STATUS REGISTER, N SHOULD BE 1
773 / OR 2. IF N .NE. 1, 2 IS ASSUMED.
778 FLDA 30 /GET RTN ADDR
786 FLDA% WDBASE,1 /N ADDR
788 SETX STAT1 /MODIFY STATUS VIA INDEX
791 FSUB F1 /TEST FOR NOT 1
792 JNE CLR2 /ASSUME STAT2
793 LDX -1,0 /CHANGE EXPONENT
796 CLR2, LDX -1,3 /STAT2 EXP TO -1