--- /dev/null
+/ OS/8 TSAR/TSARINA\r
+/\r
+/ ADBUFF.RA\r
+/\r
+/ DEC-S8-STSAA-A-LA25\r
+/\r
+/ K. ELLSON AND L. PEARSON\r
+/\r
+/\r
+/ TSAR SUBROUTINE - BUFFERED A/D\r
+/ COPYRIGHT 1973\r
+/ DIGITAL EQUIPMENT CORPORATION\r
+/ MAYNARD, MASSACHUSETTS 01754\r
+/\r
+/ THIS PACKAGE PROVIDES A FUNCTIONAL REPLACEMENT FOR\r
+/ THE FOLLOWING FORTRAN IV LIBRARY SUBROUTINES: REALTM\r
+/ AND ADB. REALTM AND ADB ARE REPLACED BY THE SUBROUTINE\r
+/ THRUPT. A THRUPT CALL IS ILLUSTRATED BY THE FOLLOWING\r
+/ FORTRAN PROGRAM.\r
+/\r
+/*************************************************************\r
+/\r
+/ EXTERNAL STAT1,STAT2\r
+/ INTEGER BUFF1(85),BUFF2(85),IPARMS(3),HASH(# OF CHANNELS)\r
+/ CALL THRUPT(BUFF1,BUFF2,IPARMS,HASH,NTRIG)\r
+/ CALL CLOCK(8,IRATE) @ IF NO /1 SWITCH AT ASSEMBLY TIME \r
+/ @ FOR A/D CONVERSION TIMED WITH FIRST DK8-EP\r
+/ CALL CLOCK1(8,IRATE) @ IF /1 SWITCH SET AT ASSEMBLY TIME\r
+/ @ THIS IS FOR A/D CONVERSION TIMED WITH 2ND DK8-EP\r
+/ IF YOU USE BOTH CLOCKS ON ONE SYSTEM, THEN YOU\r
+/ MAY SWITCH ON ONLY ONE CLOCK-TIMED A/D CONVERSION.\r
+/ THIS MEANS: ONLY ONE CLOCK MAY BE STARTED WITH FUNCTION=8 (BIT 9 SET)\r
+/ ...\r
+/ 100 IF (STAT1-0.5) 100, 110, 999\r
+/ 110 WRITE (5) BUFF1\r
+/ CALL RELEAS (1)\r
+/ ...\r
+/ 999 WRITE (4,1000)\r
+/ 1000 FORMAT (' SAMPLING TOO FAST')\r
+/ CALL CLOCK (0,0)\r
+/ ...\r
+/\r
+/************************************************************\r
+/\r
+/ BUFF1 - ONE OF 2 BUFFERS FOR THE ANALOG DATA, 255 12 BIT\r
+/ WORDS ARE STORED IN EACH BUFFER\r
+/\r
+/ STAT1 - DYNAMIC STATUS WORD OF BUFF1. THE VALUES 0.25,\r
+/ 0.5, AND +1. INDICATE THAT THE BUFFER IS NOT FILLED,\r
+/ BUFFER IS FILLED, AND BUFFER OVERFLOW.\r
+/\r
+/ BUFF2 - THE SECOND BUFFER.\r
+/\r
+/ STAT2 - THE DYNAMIC STATUS WORD OF BUFF2, VALUES ARE THE\r
+/ SAME AS FOR STAT1.\r
+\f/\r
+/ IPARMS - THE PARAMETER VECTOR WHICH CONTAINS IN ORDER THE\r
+/ STARTING CHANNEL, THE NUMBER OF CHANNELS, AND THE NUMBER\r
+/ OF SAMPLES. \r
+/ HASH - OPTIONAL: A TABLE CONTAINING THE READ VALID INFORMATION FOR A/D CHANNELS AND STRIGG INPUTS\r
+/ NTRIG - OPTIONAL BUT HASH MUST BE SPECIFIED:\r
+/ THE NUMBER OF SCHMITT TRIGGER CHANNELS TO SAMPLE\r
+/ CONFIGURATION REQUIRED FOR A/D AND STRIGG SAMPLING:\r
+/ FIRST DK8-EP: FREE RUNNING TIMER (10 KHZ OR 100 KHZ) FOR TRIGGER INPUT.\r
+/ CALL CLOCK4 (1 TO 7,3) FOR 10 KHZ\r
+/ CALL CLOCK4 (1 TO 7,30) FOR 100 KHZ \r
+/ SECOND DK8-EP STARTS THE A/D VIA EXTERNAL EVENT: CALL CLOCK1(8,RATE)\r
+/ TIME WORD: THE INTERVALL BETWEEN TWO A/D CYCLES IS DIVIDED INTO\r
+/ 12 SLICES CALLED S0 TO S11.\r
+/ AN EXTERNAL EVENT BETWEEN 0 AND S0 (SAMRAT/12) SETS THE LEFTMOST BIT 0.\r
+/ ' '' '' '' S11 AND SAMRAT SETS THE RIGHTMOST BIT 11.\r
+/\r
+/ UPDATES:\r
+/\r
+/ WGET: THE THIRD PARAMETER (RESULT) IS OPTIONAL\r
+/ VALID CALLS:\r
+/ I=WGET(BUFF,PNTR,RESULT)\r
+/ I=WGET(BUFF,PNTR)\r
+/ CALL WGET (BUFF,PNTR,RESULT)\r
+/\r
+/ 11-SEP-80 HA\r
+/\r
+/ INTERRUPT SERVICE ROUTINE FSMPLE:\r
+/ BEFORE THE READ ADRB WAIT FOR ADSE TO AVOID A NON VALID READ\r
+/ IF CLOCK DID'NT START THE AD CONVERTER.\r
+/ THEREFORE IN ANY CASE (ONE OR MORE CHANNELS) THE \r
+/ CLOCK MUST BE STARTED WITH CALL CLOCK(8,FREQU).\r
+/ FIRST PARAMETER OF CLOCK MUST BE 8 !\r
+/ 29-SEP-80 HA\r
+/ 1-OCT-82 HA REV 2.0 PACKS THE SAMPLE\r
+/ 15-JUL-83 HA REV 2.1 REARANGES CODE FOR PDP12 LINC OPTION\r
+/ 18-MAR-85 HA REV 3.0 ALLOWS TWO DK8-EP MODULES\r
+/ FOR A/D TRIGGED WITH DEV. CODE 13 CLOCK: /8 SWITCH\r
+/ FOR A/D TRIGG'D WITH DEV. CODE 17 CLOCK: /1 /8 SWITCH\r
+/ FOR A/D ON PDP-12 : NO SWITCH\r
+/\r
+/ 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
+/\r
+\f/\r
+ CL1DEV=13&10 / FIRST DK8-EP\r
+ CL2DEV=17&10 / SECOND DK8-EP\r
+/\r
+ MQL=7421\r
+ MQA=7501 / WE USE EAE MODE B\r
+ CAM=7621\r
+ DAD=7443\r
+ DST=7445\r
+ DLD=DAD!CAM\r
+ DDZ=DST!CAM\r
+ DVI=7407\r
+ DPIC=7573\r
+ DPSZ=7451\r
+ IFNSW 1 <\r
+ EXTERN #CLINT\r
+CLINT= #CLINT\r
+ IFSW 4 < EXTERN #CLIN1 >\r
+ >\r
+ IFSW 1 <\r
+ EXTERN #CLIN1\r
+CLINT= #CLIN1\r
+ IFSW 4 < BAD SWITCH /1 /4; END >\r
+ >\r
+ CSTAT=157 /CLOCK ROUTINE PUTS CLSA BITS IN HERE\r
+ ENTRY STAT1 /ALLOW FORTRAN ACCESS TO THES\r
+ ENTRY STAT2 /LOCATIONS\r
+ COMMZ #PAGE0\r
+ ORG 2\r
+PBUFF, 0 /PNTR TO CURRENT BUFFER\r
+CURSTT, 0 /PNTR TO CURRENT STATUS WORD\r
+NXTSTT, 0 /PNTR TO NEXT STATUS WORD\r
+CURBUF, 0;0 /START OF CURRENT BUFFER PNTR\r
+NXTBUF, 0;0 /START OF NEXT BUFFER PNTR\r
+ /STATUS WORDS, VALUES\r
+STAT1, F 0.25 /0.25, 0.5, & 1.0 INDICATE\r
+STAT2, F 0.25 /STATUS WORD IS NOT FILLED,\r
+ /FILLED, AND OVERFLOWED\r
+\r
+\r
+\r
+ IFSW 8 <\r
+ ADSK=6534\r
+ ADRB=6533\r
+ ADST=6532\r
+ ADLM=6531\r
+ ADLE=6536\r
+ ADCL=6530\r
+ ADRS=6537\r
+ ADSE=6535\r
+ CLED=6134\r
+ MQL=7421\r
+ ACL=7701\r
+ CLBA=6006 / DO NOT FORGET TO INSERT THE DEVICE CODE\r
+ CLZE=6000\r
+ >\r
+ IFNSW 8 <\r
+ ESF=4\r
+ LINC=6141\r
+ PDP=2\r
+ SAM=100\r
+ CLEN=6134\r
+ >\r
+\r
+\r
+\f FIELD1 FSMPLE\r
+ 0 /INTERRUPT TIME A/D SAMPLER\r
+ DST; ACMQ /SAVE AC AND MQ --> ACMQ\r
+ JMS% ITSTVL+1 /TEST VALID FOR THE FIRST SAMPLE\r
+ JMS INVALID /AND DECLARE NOT VALID\r
+WAITSP,\r
+ IFNSW 8<\r
+ JMS LNCSAM /INITIATE SAMPLE\r
+NEXTCH, ISZ SAMINS /UPDATE SAM INST FOR NXT CHAN\r
+ JMS LNCSAM\r
+ TAD SAMTMP\r
+ >\r
+ IFSW 8 <\r
+ ADSK / WAIT FOR COMPLETION OF CONVERSION\r
+ JMP .-1\r
+ ADRB /READ SAMPLE\r
+ JMS PUTSAM / INSERT INTO THE OUTPUT BUFFER AND TEST IF WORK DONE\r
+MORESM,/\r
+ ISZ NCHANL+1 / ANY MORE CHANNELS TO SAMPLE?\r
+ SKP / START THE NEXT CONVERSION IF THERE IS ANY REMAINING\r
+ JMP NOTMOR / NOTHING MORE TO A/D SAMPLE\r
+ JMS% ITSTVL+1 /HERE ONLY IF SOME MORE A/D TO SAMPLE!\r
+ JMP SKIPSM / SKIP THE NEXT SAMPLE, RETURNS TO MORESM !!\r
+ ADST / AND START THE NEXT CONVERSION - AUTO INCREMENT MODE!\r
+ >\r
+ JMS% IINCPT+1 / INCREMENT BUFFER POINTER\r
+ JMP WAITSP / AND TAKE THE NEXT SAMPLE\r
+NOTMOR,/\r
+ TAD CSTART+2 /STARTING CHANNEL\r
+ IFSW 8 <\r
+ ADLM / ELSE RESET MUX REGISTER\r
+ >\r
+ IFNSW 8 <\r
+ DCA SAMINS\r
+ JMS LNCSAM /SET CHANNEL TO START IN CASE\r
+ /CLOCK INITIATED\r
+ >\r
+ TAD NCHANL+2 /NUMBER OF CHANNELS\r
+ DCA NCHANL+1 /INTO COUNTER\r
+/\r
+/ HERE WE INSERT THE STRIGG TIME WORDS\r
+/\r
+IWLOP1,\r
+ ISZ IWSTRC / IF ANY MORE TRIGG INPUTS\r
+ JMP .+2 / THEN SKIP TO INCPTR\r
+ JMP IWLOP2 / ELSE RESET ALL POINTERS AT IWLOP2\r
+ TAD% IWSTRI / TRIGG TIME WORD --> AC\r
+ JMS PUTSAM /INSERT TIME WORD INTO THE OUTPUT BUFFER\r
+ JMS% ITSTVL+1 /TEST FOR VALID SAMPLE (SKIP MEANS CRAZY PROGRAMMER!)\r
+ JMP .+2 / SKIP HERE MEANS BAD STRIGG TIME WORDS!\r
+ JMS INCPTR / INCREMENT OUTPUT BUFFER POINTER\r
+ ISZ IWSTRI / INCREMENT POINTER TO THE TIME WORDS\r
+ JMP IWLOP1 / AND LOOK FOR THE NEXT TRIGG WORDS TO PROCESS\r
+IWLOP2, CLA\r
+ TAD% IWSTRI+1 /HOLDS ADDR \r
+ DCA IWSTRI / HOLDS POINTER TO THE TIME WORD\r
+ TAD% IWSTRC+1 /HOLDS NEGATIVE NUMBER OF TRIGG INPUTS\r
+ DCA IWSTRC / HOLDS THE COUNTER\r
+ DLD; ACMQ /RESTORE AC AND MQ\r
+ JMP% FSMPLE /DONE FOR THIS TIC\r
+/\r
+/ SAMPLING FINISHED\r
+/\r
+SAMDON,/\r
+ ISZ PUTFLG / IF WE FOREGET TO INCREMNT BUFFER POINTER \r
+ JMS% IINCPT+1 / THEN WE DO IT NOW\r
+ / $$$$$$ STATUS WORT LADEN!\r
+ DCAZ% CURSTT /SET STATUS OF CURRENT FULL\r
+SAMXIT, DCA% XCLINT+1 /STOP SAMPLING\r
+ IFSW 4 <\r
+ DCA% YCLINT > / STOP STRIGG INPUT\r
+ DLD; ACMQ /RESTORE AC AND MQ\r
+ JMP% FSMPLE\r
+/\r
+SKIPSM,/ SKIP ONE A/D SAMPLE\r
+ ISZ NCHANL+1 / NEVER SKIPS - SINCE ALREADY BEEING TESTED\r
+ DLD; NPOINT / THIS CODE HERE SAVES SOME INDIRECT REFS\r
+ DPIC / INCREMENT DOUBLE PREC. COUNTER TO TEST FOR MORE SAMPLES\r
+ DST; NPOINT / BUMP INTO COUNTER\r
+ DPSZ / SKIP IF WORK DONE\r
+ JMP MORESM /GO FETCH THE NEXT SAMPLE\r
+ JMP SAMDON / SET STATUS OF CURRENT BUFFER FULL: SAMPLE DONE\r
+/\r
+/\r
+PUTSAM, 0 / INSERTS AC INTO OUTPUT BUFFER\r
+ ISZ AVALID / VALID INPUT?\r
+ JMP PUTSA1 / NON VALID, RETURN WITHOUT ACTION\r
+BUFCDF, HLT /REPLACED BY CDF TO BUFFER\r
+ DCAZ% PBUFF\r
+ CDF 10 / USED FOR POINTER PVALID!\r
+ DCA AVALID / CLEAR VALID FLAG FOR NEXT CALL\r
+ DCA PUTFLG / DON'T FORGET TO INCREMENT THE BUFFER POINTER 0 --> PUTFLG\r
+ JMP% PUTSAM / ON RETURN AC = 0\r
+PUTSA1, CLA / CLEAR AC FOR RETURN\r
+ JMP% PUTSAM\r
+/\r
+/\r
+INVALID,0 / SET THE ACTUAL SAMPLE INVALID\r
+ CLA CMA / -1 --> AC\r
+ DCA AVALID\r
+ JMP% INVALID / ON RETURN AC=0\r
+PUTFLG,\r
+IINCPT, ADDR INCPTR / ADDRESS OF ROUTINE TO INCREMENT BUFFER POINTER\r
+AVALID, / / ACTUAL VALID FLAG\r
+ITSTVL, ADDR TSTVLD / TEST FOR VALID READ \r
+TMP,\r
+IWSTRC, ADDR WSTRC / POINTER TO THE NUMBER OF STRIGS CHANNELS TO SAMPLE\r
+IWSTRI, ADDR TIMWRD / POINTER TO THESE TIME WORDS\r
+XCLINT, ADDR CLINT / POINTER TO ENTRY OF CLOCK I/R SERVICE ROUTINE\r
+ IFSW 4 <\r
+YCLINT, ADDR #CLINT / /4 ENABLES STRIGG INPUT FROM FIRST DK8-EP\r
+NCHANL, 0;0;0\r
+SAMCNT,\r
+CSTART, 0;0;0\r
+\f/\r
+IPUTFL, ADDR PUTFLG / SET TO -1 IF BUFFER POINTER INCREMENTED, RESET BY PUTSAM\r
+L10, 10\r
+/\r
+INCPTR, 0\r
+ CLA CMA / -1 --> AC\r
+ DCA% IPUTFL / -1 --> PUTFLG\r
+ ISZZ PBUFF /ELSE INCR PNTR & SKIP IF WE\r
+ JMP FLDOK /CROSSED A FIELD BOUNDARY\r
+ TAD BUFCDF /UPDATE FIELD\r
+ TAD L10\r
+ DCA BUFCDF\r
+FLDOK,\r
+ ISZ SAMCNT /INCR BUFFER CNTR & SKIP IF\r
+ JMP% INCPTR /FILLED. BUFFER OK\r
+ DCAZ% CURSTT /SET STATUS WORD TO 0.5\r
+ /FOR BUFFER FILLED\r
+ TADZ NXTSTT /SWAP STATUS WORD PNTRS\r
+ DCA TMP / NXTSTT<=> CURSTT\r
+ TADZ CURSTT\r
+ DCAZ NXTSTT\r
+ TAD TMP\r
+ DCAZ CURSTT\r
+ TADZ% CURSTT /HAS USER RELEASED THIS BUFFER\r
+ SMA CLA\r
+ JMP% ITOOFST+1 /NO, SAMPLING TOO FAST!\r
+ JMS% ISWPBFR+1 / SWAP BUFFER\r
+ JMP% INCPTR / BUFFER POINTER UPDATED\r
+ISWPBF, ADDR SWPBFR\r
+/\r
+/\r
+ITOOFS, ADDR TOOFST\r
+/\r
+ TAD CSTART+2 /STARTING CHANNEL\r
+ IFSW 8 <\r
+ ADLM / ELSE RESET MUX REGISTER\r
+ >\r
+ IFNSW 8 <\r
+ DCA SAMINS\r
+ JMS LNCSAM /SET CHANNEL TO START IN CASE\r
+ /CLOCK INITIATED\r
+ >\r
+ TAD NCHANL+2 /NUMBER OF CHANNELS\r
+ DCA NCHANL+1 /INTO COUNTER\r
+\f ORG FSMPLE+200\r
+/\r
+/ HERE WE SWAP THE INPUT BUFFERS POINTERS\r
+/\r
+SWPBFR, 0\r
+/\r
+/ SWAP BUFFER POINTERS\r
+/\r
+ TADZ NXTBUF / NXTBUF <=> CURBUF\r
+ DCA BUFCDF / BUFCDF, PBUFF = NXTBUF\r
+ TADZ NXTBUF+1\r
+ DCAZ PBUFF\r
+ TADZ CURBUF\r
+ DCAZ NXTBUF\r
+ TADZ CURBUF+1\r
+ DCAZ NXTBUF+1\r
+ TAD% IBUFCDF\r
+ DCAZ CURBUF\r
+ TADZ PBUFF\r
+ DCAZ CURBUF+1\r
+ TAD% IBUFSIZ /RESET BUFFER COUNTER\r
+ DCA% ISAMCNT\r
+ JMP% SWPBFR\r
+IBUFCDF=.+1\r
+ ADDR BUFCDF\r
+IBUFSIZ=.+1\r
+ ADDR BUFSIZ\r
+ISAMCNT=.+1\r
+ ADDR SAMCNT\r
+/\r
+/ SAMPLING RATE TOO FAST\r
+/\r
+TOOFST,/\r
+ CLA IAC /SET STATUS WORD TO 1.0\r
+ DCAZ% CURSTT\r
+ IAC\r
+ DCAZ% NXTSTT\r
+ JMP% ISAMXIT\r
+ISAMXIT=.+1\r
+ ADDR SAMXIT\r
+ IFNSW 8 <\r
+LNCSAM, 0 /LINC SAM SUBROUTINE\r
+ LINC\r
+SAMINS, SAM 0 /SAMPLE AND SELECT NEXT CHANNEL\r
+ PDP\r
+ DCA SAMTMP /SAVE IT\r
+ JMP% LNCSAM\r
+ >\r
+-2LT\f ORG FSMPLE+400\r
+/\r
+/ INTERRUPT TIME SCHMITT TRIGGER INPUT HANDLER\r
+/\r
+ IFSW 4 <\r
+ ENRTY FIREED\r
+ >\r
+FIREED, 0 / ON ENTRY AC IS CLEARED BY CLOCK RTN\r
+ CLA CLL CMA RTL / -3 --> AC\r
+ DST; MQSAVE / FIRST: STRIG COUNTER, SECOND SAVES MQ\r
+ CAM / MQ HOLDS # OF STRIGG FIRED, FIRST IS #0\r
+ TAD CSTAT / CLSA BITS OF FIRST CLOCK --> AC\r
+TRILOP, RAL / STRIG BITS --> LINK\r
+ SWP / NOW AC HOLDS # OF STRIGG \r
+ SZL / SKIP IF STRIGG DID NOT FIRE\r
+ JMS TRIGGED / ELSE SET THE TRIGGER TIME WORD\r
+ IAC / INCREMENT FOR NEXT STRIGG\r
+ SWP / # OF STRIGG --> MQ, CLSA BIT MASK --> AC\r
+ ISZ MQSAVE / SOME MORE STRIGS?\r
+ JMP TRILOP / YES, FETCH THE NEXT EVENT\r
+ CAM / STRIGS DONE, TEST FOR CLOCK OVERFLOW\r
+ TAD CTSTAT / CLSA BITS --> AC\r
+ RAR / LINK GOES ON IF CLOCK OVERFLOWED\r
+ DLD; MQSAVE / RESTORE MQ, CLEAR AC! TRICKSY!\r
+ SNL / IF NO CLOCK OVERFLOW THEN\r
+ JMP% FIREED / RETURN TO CLOCK ROUTINE\r
+ ISZ CLKOVR / ELSE INCREMENT CLOCK OVERFLOW COUNTER\r
+ NOP / PROTECT ISZ\r
+ JMP% FIREED / AND RETURN TO CLOCK IR SERVICE ROUTINE\r
+/\r
+MQSAVE, 0;0 / FIRST WORD IS USED FOR STRIGG COUNTER, SECOND SAVES MQ ON ENTRY\r
+CLKOVR, 0;0 / HERE IS THE CLOCK OVERFLOW COUNTER, (SINGLE PRECISION, SECOND WORD HOLDS CLOCK COUNTER)\r
+/\r
+ACMQ, 0;0 / HERE FSMPLE AND TRIGGED ROUTINE SAVE AC&MQ ON ENTRY\r
+ITIMWR, ADDR TIMWR / POINTER TO STRIGG TIME WORDS\r
+TIMWRD, 0;0;0 / TIME WORDS FOR 3 SCHMITT TRIGGER CHANNELS\r
+TIMBIT, 0;0 / THRUPT INSERTS RATE*12/SAMRAT\r
+M13, -13 / CONSTANT USED TO TEST TIME SLICE OVERFLOW\r
+IBITWR, TAD BITWRD / POINTER TO LOAD THE CORRECT BIT MASK FOR EACH TIME SLICE\r
+BITWRD, 4000\r
+ 2000\r
+ 1000\r
+ 0400\r
+ 0200\r
+ 0100\r
+ 0040\r
+ 0020\r
+ 0010\r
+ 0004\r
+ 0002\r
+ 0001\r
+/\r
+/ HERE WE COMPUTE THE STRIGG TIME WORD\r
+/\r
+TRIGGD, 0 / ON ENTRY AC HOLDS NUMBER OF SCHMITT TRIGGER FIRED\r
+ DST; ACMQ / SAVE AC AND MQ\r
+ TAD ITIMWR+1 / COMPUTE CORRECT ADDRESS OF TIME WORD\r
+ DCA ITIMWR\r
+ CLBA!CL1DEV / LOAD CLOCK BUFFER --> AC\r
+ MQL / AND INTO MQ, CLEAR AC\r
+ DAD; CLKOVR /AND ADD THE CLOCK OVERFLOW COUNTER\r
+ DST; CLKOVR / AND SAVE THE ACTUAL TIME OF THE EVENT\r
+ DVI; TIMBIT / TIMBIT= RATE*12/SAMRAT HERE WE COMPUTE THE TIME SLICES\r
+ MQL\r
+ MQA / SLICE --> AC AND MQ\r
+ TAD M13 / IF THERE ARE ALLREADY 12 SLICES PASSED \r
+ SMA SZA CLA / THEN STOP, ELSE GOON\r
+ HLT\r
+ MQA / TIME SLICE --> AC\r
+ TAD IBITWR / HERE WE DO SOME COMPUTATIONS \r
+ DCA .+3 / IN ORDER TO FETCH THE \r
+ TAD% ITIMWR / CORRECT BIT AND TIMEWORD.\r
+ MQL / PREP FOR .OR. TIMEWORD AND SLICE BIT\r
+ TAD BITWRD / IS REPLACED BY CORRECT TAD BITWRD+SLICE\r
+ MQA / OR THE TIMEWORD AND THE BIT\r
+ DCA% ITIMWR / AND PUSH BACK\r
+ DLD; ACMQ / RESET AC AND MQ\r
+ JMP% TRIGGD / AND RETURN!\r
+\r
+\fADSETU, 0 /SET UP ROUTINE\r
+ TADZ CURBUF /GET FIELD OF BUFFER\r
+ JMS MAKCDF /MAKE 3 BITS FLD INTO CDF\r
+ DCAZ CURBUF\r
+ TADZ CURBUF\r
+ DCA% IBUFCDF+1 /SAVE IN SAMPLER CODE\r
+ TADZ CURBUF+1 /SET SAMPLER BUFFER POINTER\r
+ DCAZ PBUFF\r
+ TADZ NXTBUF /GET FIELD OF ALTERNATE BUFFER\r
+ JMS MAKCDF\r
+ DCAZ NXTBUF\r
+ TAD BUFSIZ /SET INITIAL COUNT\r
+ DCA% ISAMCNT+1\r
+ TAD% JNCHANL+1 /SET CHANNEL COUNT\r
+ DCA% INCHANL+1\r
+ IFSW 8 <\r
+ CLA CMA /STOP THE CLOCK\r
+ CLZE\r
+ CLA\r
+ ADCL /CLEAR AD LOGIC JUST IN CASE\r
+ TAD L300 /SET AD ENABLE BITS, EXT START, AUTO INCREMENT\r
+ ADLE\r
+ TAD% JCSTART+1 /STARTING CHANNEL NUMBER\r
+ ADLM\r
+ >\r
+ IFNSW 8 <\r
+ CLEN /STOP THE CLOCK\r
+ TAD% JCSTART+1 /SET UP INITIAL SAM INSTRUCTION\r
+ TAD L100\r
+ DCA% JCSTART+1\r
+ TAD% JCSTART+1\r
+ DCA SAMINS\r
+ TAD L100 /SET FAST SAM BIT\r
+ IOF /TURN OFF INTERRUPTS IN LINC MODE\r
+ LINC /ENTER LINC MODE\r
+ ESF\r
+ PDP\r
+ JMS LNCSAM\r
+ ION\r
+ DST; ACMQ / SAVE MQ\r
+ DDZ; TIMWRD\r
+ DCA TIMWRD+1 / CLEAR STRIGG TIME WORDS\r
+ DDZ; CLKOVR / AND CLEAR CLOCK OVERFLOW COUNTER\r
+ >\r
+ CIF CDF\r
+ JMP% ADSETU\r
+/\r
+JNCHAN, ADDR NCHANL+2\r
+INCHAN, ADDR NCHANL+1\r
+JCSTAR, ADDR CSTART+2\r
+ISAMCN, ADDR SAMCNT\r
+IBUFCD, ADDR BUFCDF\r
+\f/\r
+/ MAKE THREE BITS OF AC9-11 INTO CDF\r
+/\r
+MAKCDF, 0\r
+ AND L7\r
+ CLL RTL\r
+BASEX, RAL\r
+ TAD CDF0\r
+ JMP% MAKCDF\r
+/\r
+NPOINT, 0;0;0\r
+CDF0, CDF\r
+ 0;0\r
+L7, 7\r
+BUFSIZ, -377\r
+ IFSW 8 <\r
+L300, 300\r
+ >\r
+ IFNSW 8 <\r
+L100, 100\r
+ >\r
+TEMP, 0;0;0\r
+ ORG 10*3+BASEX\r
+ 0\r
+ JA NAME+3\r
+ 0\r
+SAMRTN, JA .\r
+FP25, F 0.25\r
+XVALID, F 56. / LENGTH OF READ VALID VECTOR\r
+VALID, ORG .+70 / AND HERE IS THE BUFFER SPACE\r
+/\r
+/ ROUTINE TO TEST FOR VALID SAMPLE ( PACKED DATA)\r
+/\r
+PVALID, ORG .+2\r
+MVALID, ORG .+2\r
+NVALID, ADDR VALID-1\r
+/\r
+TSTVLD, ORG .+1 / JMS TSTVLD\r
+ / SAMPLE NON VALID RETURN\r
+ / SAMPLE VALID RETURN\r
+/ ON RETURN AC=0\r
+ ISZ PVALID+1 / GET THE NEXT LOC. OF VALID VECTOR\r
+ CLA\r
+ TAD PVALID+1\r
+ TAD MVALID+1 / IF WE REACHED THE END OF THE VECTOR THEN\r
+ SPA CLA / WE RESET TO THE START ELSE\r
+ JMP L1 / CONTINUE AT L1\r
+ TAD NVALID+1\r
+ IAC\r
+ DCA PVALID+1\r
+L1, TAD% PVALID+1 / READ VALID FLAG --> AC\r
+ SNA CLA / IF THIS READ WAS VALID THEN WE INCREMENT THE BUFFER POINTER ELSE\r
+ JMP% TSTVLD / WE TAKE THE NEXT SAMPLE INTO THIS LOCATION\r
+ ISZ TSTVLD / TAKE THE NORMAL RETURN FOR VALID SAMPLE \r
+ JMP% TSTVLD\r
+\f EXTERN #ARGER\r
+ SECT THRUPT\r
+ BASE 0\r
+ STARTD\r
+ FLDA 30 /GET RETURN ADDR\r
+ FSTA SAMRTN\r
+ STARTF\r
+ FLDA 0\r
+ FSTA# TRETU\r
+ STARTD\r
+ FLDA% 0 / COMPUTE THE NUMBER OF PARAMETERS\r
+ FSUB 0\r
+ FSUB# TWO\r
+ SETX XR0\r
+ LDX 1,X1\r
+ ALN X1 / DIVIDE BY TWO\r
+ FNEG\r
+ ATX X2 / NEGATIVE NUMBER OF ARGUMENTS --> X2\r
+ FLDA 0 /GET ARG POINTER\r
+ BASE BASEX\r
+ SETB BASEX\r
+ FSTA TEMP /SAVE ARG POINTER\r
+ FCLA\r
+ FSTA CLINT /STOP ANY SAMPLING NOW!\r
+ FLDA% TEMP,1 /GET BUFF1 ADDRESS\r
+ FSTA CURBUF\r
+ LDX 1,X0\r
+ JXN TH0,X2+\r
+ TRAP4 #ARGER\r
+TH0,\r
+ FLDA% TEMP,1+ /GET BUFF2 ADDR\r
+ FSTA NXTBUF\r
+ LDX 2,X0\r
+ JXN TH1,X2+\r
+ TRAP4 #ARGER\r
+TH1,\r
+ FLDA% TEMP,1+ /ADDR OF PARAMETERS\r
+ FSTA PARAM / SAVE ADDR. OF PARAMETERS\r
+ FCLA\r
+ JXN TH2,X2+ / IF THERE ARE 4 OR MORE PARAMETERS THEN FETCH THE LAST BUT ONE\r
+ JA TH3 / ELSE THERE ARE 3 ARGUMENTS \r
+TH2, FLDA% TEMP,X1+\r
+TH3, FSTA PACK\r
+ FLDA PARAM / RESTORE ADR. OF THIRD ARGUMENT\r
+ FSTA TEMP\r
+ STARTF\r
+ LDX 0,1\r
+ FLDA% TEMP,1 /STARTING CHANNEL\r
+ ALN 0\r
+ FSTA CSTART\r
+ FLDA% TEMP,1+ /# CHANNELS\r
+ FSTA CHNLS\r
+ FNEG\r
+ ALN 0\r
+ FSTA NCHANL\r
+ FLDA% TEMP,1+ /NUMBER OF POINTS\r
+ FNEG\r
+ ALN 0\r
+ FSTA NPOINT\r
+ FLDA PACK\r
+ JEQ TH4 / ONLY THREE PARAMETERS\r
+ FLDA% TEMP,1+\r
+ FNEG\r
+ FSUB FL1\r
+ ALN 0\r
+TH4, FSTA PCKSIG\r
+ ATX X2\r
+/\r
+TBIN0, SETX VALID\r
+ LDX 1,X0\r
+ SETX XR0\r
+ STARTD\r
+ FLDA NVALID\r
+ FSTA PVALID\r
+ FNEG\r
+ FADD PCKSIG+1\r
+ FSTA MVALID\r
+/\r
+ FLDA PACK\r
+ JEQ TH5\r
+ FSTA TEMP\r
+ LDX -1,X1 / X2 HOLDS PCKSIG !\r
+\r
+ FLDA TBIN0\r
+ FSTA TBIN1\r
+ STARTF\r
+THL0, FLDA% TEMP,1+\r
+TBIN1, SETX VALID / XR POINTER ONTO VALID VECTOR\r
+ ATX X0 / INSERT V. VALUE INTO THE VECTOR (WORD BY WORD)\r
+ SETX TBIN1 / NOW WE INCREMENT THE POINTER ABOVE\r
+ JXN .+2,X1+ / WITH THE X INCREMENT CMD AND\r
+ SETX XR0 / RESET TO THE INDEX REGISTER SET\r
+ JXN THL0,X2+ / AND NOW WE TEST IF THE WORK IS DONE\r
+\r
+TH5, STARTF\r
+/\r
+/ INDEX REGISTERS (PBUFF) 1&2 ARE STATUS WORD PNTRS!\r
+/\r
+ SETX PBUFF\r
+ LDX 11,1 /INITIALIZE STATUS WORD PNTRS\r
+ LDX 14,2\r
+ FLDA FP25 /INITIALIZE STATUS WORDS\r
+ FSTA STAT1 /TO INDICATE BUFFERS\r
+ FSTA STAT2 /NOT FILLED\r
+ TRAP4 ADSETU /SET UP AD STUFF\r
+ STARTD\r
+ FLDA SAMADR /SET UP SAMPLER INTRPT HNDLR\r
+ FSTA CLINT\r
+ STARTF\r
+ JA SAMRTN /RETURN\r
+NAME, TEXT +THRUPT+\r
+ SETX XR0\r
+ SETB BASEX\r
+TRETU, F 0.\r
+SAMADR, ADDR FSMPLE\r
+/\r
+XR0, 0\r
+XR1, 0 / HOLDS NUMBER OF ARGUMENTS\r
+XR2, 0\r
+XR3, 0\r
+X0= 0\r
+X1= X0+1\r
+X2= X1+1\r
+X3= X2+1\r
+ONE, 0;1;0\r
+TWO, 0;2;0\r
+FL1, F 1.\r
+PARAM,\r
+CHNLS, F 0.\r
+PCKSIG, F 0.\r
+PACK, F 0. / HOLDS ADR. OF FOURTH ARGUMENT\r
+NTRIG, F 0. / HOLDS ADDR. OF FIFTH ARGUMENT\r
+\f/**** WORD SUBROUTINES ****\r
+/\r
+WPCNT, 0;0\r
+WC1, 0;6\r
+ BASE WDBASE\r
+WDBASE, F 0. /PNTR TO ARGS\r
+WDINDX, F 0. /INDEX TO WORD IN ARRAY\r
+WDOPER, F 0. /TARGET OR SOURCE ADDR\r
+F1, F 1.\r
+STXMJA, 0;1100-1030;0 /STX - JA\r
+WORDOP, TEXT +WORDOP+\r
+ 0\r
+WDRTN, JA .\r
+WINDEX, F 0. /INDEX REGS 0-2\r
+/\r
+ ORG 10*3+WDBASE\r
+ 0\r
+ JA WORDOP+3\r
+/\r
+/**** WGET - WORD GET ****\r
+/\r
+/ CALL WGET(BUFF1,NWORD,Y)\r
+/\r
+ ENTRY WGET\r
+WGET, JSA WDSET /INIT REGISTERS\r
+ FLDA WPCNT / LOOK IF CALLED WITH TWO PARAMETERS\r
+ JEQ W2PAR / TWO PARAMETERS ONLY, OUPUT VIA FAC\r
+ XTA 0 /GET WORD FROM BUFF1\r
+ FSTA% WDOPER /STICK IT IN X\r
+ JA WDRTN\r
+W2PAR, XTA 0\r
+ JA WDRTN\r
+/\r
+/**** WPUT - WORD PUT ****\r
+/\r
+/ CALL WPUT(BUFF1,NWORD,Y)\r
+/\r
+ ENTRY WPUT\r
+WPUT, JSA WDSET /INIT REGISTERS\r
+ FLDA% WDOPER /GET Y\r
+ ATX 0 /FIX AND STORE IN BUFF1\r
+ JA WDRTN\r
+/\r
+/ WGET & WPUT INITIALISATION\r
+/\r
+ BASE 0\r
+WDSET, 0;0\r
+ STARTD\r
+ FLDA 30 /GET RTN ADDR\r
+ FSTA WDRTN\r
+ FLDA 0 /PNTR TO ARGS\r
+ SETB WDBASE\r
+ BASE WDBASE\r
+ SETX WINDEX\r
+ FSTA WDBASE\r
+ LDX 0,1 / COMPUTE NUMBER OF PARAMETERS\r
+ FLDA% WDBASE,1 / ADR. FOLLOWING THE PARAMETER LIST --> FAC\r
+ FSUB WDBASE / SUBTRACT THE START ADR. OF PARAMETER LIST\r
+ FSUB WC1 / FAC-5 --> FAC\r
+ FSTA WPCNT / WPCNT=0 <==> TWO PARAMETERS, =2 <==> THREE PARAMETERS\r
+ FLDA% WDBASE,1+ /BUFFER ADDR\r
+ FADD STXMJA /MAKE SETX INST\r
+ FSTA WDSETX\r
+ FLDA% WDBASE,1+ /WORD INDEX ADDR\r
+ FSTA WDINDX\r
+ FLDA WPCNT / TEST IF THERE ARE MORE THAN 2 PARAMETERS\r
+ JEQ WCONT / \r
+ FLDA% WDBASE,1+ /RESULT OR VALUE ADDR\r
+ FSTA WDOPER\r
+WCONT,\r
+ STARTF\r
+ FLDA% WDINDX /WORD INDEX\r
+ FSUB F1 /COMPUT ADDR OF WORD\r
+ ALN 0\r
+ STARTD\r
+ FADDM WDSETX\r
+WDSETX, SETX 0 /MODIFIED DURING EXEC\r
+ STARTF\r
+ JA WDSET\r
+/ SUBROUTINE TO RELEASE A BUFFER BY RESETTING\r
+/ THE STATUS REGISTER\r
+/\r
+/ CALL RELEAS(N)\r
+/\r
+/ N DESIGNATES THE STATUS REGISTER, N SHOULD BE 1\r
+/ OR 2. IF N .NE. 1, 2 IS ASSUMED.\r
+/\r
+ ENTRY RELEAS\r
+ BASE 0\r
+RELEAS, STARTD\r
+ FLDA 30 /GET RTN ADDR\r
+ FSTA WDRTN\r
+ FLDA 0 /GET ARG PNTR\r
+ BASE WDBASE\r
+ SETB WDBASE\r
+ SETX WINDEX\r
+ FSTA WDBASE\r
+ LDX 1,1\r
+ FLDA% WDBASE,1 /N ADDR\r
+ FSTA WDBASE\r
+ SETX STAT1 /MODIFY STATUS VIA INDEX\r
+ STARTF\r
+ FLDA% WDBASE /N\r
+ FSUB F1 /TEST FOR NOT 1\r
+ JNE CLR2 /ASSUME STAT2\r
+ LDX -1,0 /CHANGE EXPONENT\r
+ /TO -7 TO MAKE 0.25\r
+ JA WDRTN\r
+CLR2, LDX -1,3 /STAT2 EXP TO -1\r
+ JA WDRTN\r
+\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
\ No newline at end of file