A large commit.
[pdp8.git] / sw / rescue / lab8e_goettingen / disk2_11 / rka / paroff / adbu.ra
diff --git a/sw/rescue/lab8e_goettingen/disk2_11/rka/paroff/adbu.ra b/sw/rescue/lab8e_goettingen/disk2_11/rka/paroff/adbu.ra
new file mode 100644 (file)
index 0000000..cafd929
--- /dev/null
@@ -0,0 +1,798 @@
+/      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