A large commit.
[pdp8.git] / sw / os8 / v3d / sources / extensions / dectapes / dectape2 / uf.pa
diff --git a/sw/os8/v3d/sources/extensions/dectapes/dectape2/uf.pa b/sw/os8/v3d/sources/extensions/dectapes/dectape2/uf.pa
new file mode 100644 (file)
index 0000000..a56ed47
--- /dev/null
@@ -0,0 +1,900 @@
+/OS8 BASIC USER FUNCTIONS, V5
+/
+/
+/
+/
+/
+/
+/
+/
+/
+/COPYRIGHT  (C)  1974 BY DIGITAL EQUIPMENT CORPORATION
+/
+/
+/
+/
+/
+/
+/
+/
+/
+/
+/THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE
+/AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT
+/CORPORATION.  DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY
+/FOR ANY ERRORS THAT MAY APPEAR IN THIS MANUAL.
+/
+/THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER
+/UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED
+/(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH
+/SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL.
+/
+/DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE
+/OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY
+/DIGITAL.
+/
+/
+/
+/
+/
+/
+/
+/
+/
+/
+\f/JR   6-JUN-77        MODIFIED FOR V5
+
+       VERSON= 5       /VERSION OF BRTS
+       SUBVUF= 01      /SUBVERSION OF BASIC.UF
+                       /FIRST WORD OF THIS OVERLAY CONTAINS
+                       /BRTS VERSION IN LEFT HALF AND SUBVERSION IN RIGHT HALF
+
+       FPP=    4000
+       FADD=   FPP+2000
+       FSUB=   FPP+2117
+       FMPY=   FPP+1600
+       FDIV=   FPP+1722
+       FFNEG=  FPP+2135
+       FFPUT=  FPP+2256
+       FFGET=  FPP+2241
+       FFNOR=  FPP+2215
+       FACCLR= 0365
+       UNSFIX= 1615
+       PSWAP=  1230
+       ARGPRE= 307
+
+       /VC8E POINT PLOTTING DISPLAY CONTROL IOT'S
+
+       DISD=   6052    /SKIP ON DONE FLAG
+       DILX=   6053    /LOAD AC2-11 INTO X-REGISTER (DOESN'T CLEAR AC)
+       DILY=   6054    /LOAD AC2-11 INTO Y-REGISTER (DOESN'T CLEAR AC)
+       DIXY=   6055    /INTENSIFY
+
+       /DK8EP PROGRAMMABLE REAL TIME CLOCK IOT'S
+
+       CLZE=   6130    /CLEAR CLOCK ENABLE BITS PER AC
+       CLSK=   6131    /SKIP ON CLOCK FLAG
+       CLOE=   6132    /SET CLOCK ENABLE BITS PER AC
+       CLAB=   6133    /AC TO CLOCK BUFFER
+       CLSA=   6135    /READ CLOCK STATUS TO AC
+                       /BIT 0 SET ON OVERFLOW
+                       /BITS 9-11 SET ON RESPECTIVE SCHMITT TRIGGER FIRING
+
+       /CLOCK ENABLE REGISTER BITS
+       /BIT    FUNCTION
+       /0      INTERRUPT ENABLE BIT
+       /1-2    MODE BITS:
+       /       00      RUN COUNTER, INTERRUPTING EACH 4096 TICKS
+       /       01      RUN COUNTER AND RESET WITH CLOCK BUFFER ON OVERFLOW
+       /       10      RUN COUNTER AND READ COUNTER WHEN EVENT OCCURS
+       /       11      RUN COUNTER AND READ AND CLEAR IT ON EVENT
+       /3-5    RATE SELECTION:
+       /       000     STOPPED
+       /       001     EXTERNAL TIME BASE
+       /       010     100 HZ
+       /       011     1 KHZ
+       /       100     10 KHZ
+       /       101     100 KHZ
+       /       110     1 MHZ
+       /       111     STOPPED
+       /6      OVERFLOW STARTS A-D
+       /7      SET TO INHIBIT CLOCK
+       /8      EVENT ON CHAN 1, 2, OR 3 CAUSE INTERRUPT AND OVERFLOW
+       /9-11   ENABLE EVENTS 1 THRU 3
+
+       /AD8EA A-D CONVERTER IOT'S
+
+       ADCL=   6530    /CLEAR A-D
+       ADLM=   6531    /LOAD MULTIPLEXOR FROM AC8-11 AND CLEAR AC
+       ADST=   6532    /START A-D CONVERTER
+       ADRB=   6533    /READ A-D BUFFER INTO AC0-11 AND CLEAR FLAG
+       ADSK=   6534    /SKIP ON A-D DONE FLAG (DOESN'T CLEAR FLAG)
+       ADLE=   6536    /SKIP ON TIMING ERROR
+       ADRS=   6537    /READ STATUS REGISTER
+
+       /STATUS REGISTER FORMAT:
+       /0      A-D DONE FLAG
+       /1      TIMING ERROR FLAG
+       /2      ENABLE INTERRUPT ON DONE FLAG
+       /3      ENABLE INTERRUPT ON TIMING ERROR
+       /4      ENABLE EXTERNAL START (EG CLOCK)
+       /5      AUTO INCREMENT MODE
+       /6-7    UNUSED
+       /8-11   4 BIT CHANNEL NUMBER
+
+       /DR8E-A DIGITAL BUFFERED I/O BASE IOT'S
+
+       DBDI=   6500    /DISABLE INTERRUPTS
+       DBEI=   6501    /ENABLE INTERRUPTS
+       DBSK=   6502    /SKIP IF THE IN FLAG IS SET
+       DBCI=   6503    /SET SELECTED BITS IN INPUT REGISTER
+       DBRI=   6504    /READ INPUT REGISTER TO AC
+       DBCO=   6505    /CLEAR SELECTED BITS IN OUTPUT REGISTER
+       DBSO=   6506    /SET SELECTED BITS IN OUTPUT REGISTER
+       DBRO=   6507    /READ OUTPUT REGISTER TO AC
+
+       ACX=    44
+       ACH=    45
+       ACL=    46
+
+       MAXPTS= XR0
+       REFRFL= XR1
+       BUFXR=  XR2
+       DX=     XR3             /XR3,XR4,XR5=   TEMP FL PT LOC
+
+       SPF=    6040    /SET TTY PRINTER FLAG
+       CAF=    6007    /RESET PROCESSOR
+
+       IA=     1465    /ENTRY POINT FOR USER FUNCTION ERROR MESSAGE
+\f      NOPUNCH         /DUMMY SECTION FOR MISC PAGE 0 REFERENCES
+
+       *1
+       JMP I   .+1
+       SERVC
+       *6
+USECON,        0       /ENTRY #OF USER BUF IN DIM TBL
+       *10
+XR0,   0
+XR1,   0
+XR2,   0
+XR3,   0
+XR4,   0
+XR5,   0
+       *20
+CDFIO, CDF 10  /FLD OF PSEUDO DIM TBL
+       0
+ARSTRT,        0       /ADR-1 OF PSEUDO DIM TBL
+       *64
+INSAV, 0
+       *73
+K0010, 10
+K0017, 17
+       *77
+K0200, 200
+       *107
+M14,   -14
+       *114
+FIXP,  UNSFIX
+       *134
+FGETL, FFGET
+FPUTL, FFPUT
+FNORL, FFNOR
+FCLR,  FACCLR
+FNEGL, FFNEG
+       *156
+P1SWAP,        PSWAP
+
+       ENPUNCH
+\f      *3400
+
+/INI(N)-INITIALIZE ROUTN;CALLED BY USER BEFORE 'PLY
+/      OR ADC';INITIALIZE CTRS,FLGS,ETC
+/      N IS A DUMMY ARG
+/
+INI,   VERSON^100+SUBVUF /VERSION NUMBER OF USER FUNCTIONS
+       JMS     BUFCDF
+       TAD     BUFBAK  /PICK UP ADDR OF DISPLAY BUFFER
+       DCA     BUFXR   /STORE IN BUFFER XR FOR PUTBUF ROUTINE
+       DCA     TOTPTS  /BUF IS NOW EMPTY
+       IAC
+       DCA I   (STPT   /ACCES BUF AT 1ST PT
+       IAC
+       DCA I   (NTHY   /ACCES EVERY PT
+       IAC
+       DCA I   (XFLG   /BUF MAYBE DISPLAYED
+       JMP I   INI
+
+       /ROUTINE TO GET FIELD AND ADDRESS OF USER BUFFER
+       /FROM 'USECON' LOCATION
+
+BUFCDF,        0
+       TAD     USECON  /ENTRY PT OF BUF IN DIM TBL
+       CLL RTL         /MULT BY 4
+       TAD     ARSTRT  /ADR-1 OF STRT F DIM TBL
+       DCA     XR5     /ADR-1 OF ENTRY IN DIM TBL
+       TAD     CDFIO   /COPY CDF TO BRTS TABLES INLINE
+       DCA     .+1
+       0
+       CMA
+       TAD I   XR5     /ADR-1 OF BUF
+       DCA     BUFBAK  /NEED FOR DISPLY ROUTN
+       TAD I   XR5     /GET CDF OF BUF
+       DCA     PUTCDF
+       TAD     PUTCDF
+       DCA     CDFBAK  /NEED FOR DISPLY ROUTN
+       CDF             /RESTORE DF
+       JMP I   BUFCDF
+CDFBAK,        0
+BUFBAK,        0
+TOTPTS,        0
+
+/PUTBUF-ENTER WITH A 12BIT VALUE IN AC;PUT VAL IN
+/      USER BUFFER;CHK TO SEE IF NXT VAL WILL CROSS FLDS
+/
+PUTBUF,        0
+PUTCDF,        0
+       DCA I   BUFXR
+       IAC
+       TAD     BUFXR
+       SZA CLA         /ABOUT TO CROSS FLDS?
+       JMP     .+4     /NO
+       TAD     K0010   /YES
+       TAD     PUTCDF
+       DCA     PUTCDF  /DF=DF+1
+       CDF             /RESTORE DF
+       JMP I   PUTBUF
+\f
+/PLY(Y)-ENTER WITH YVAL IN FAC;CHK 0<=VAL<1.;
+/      PUT LEGIT VAL IN USER BUF
+/
+PLY,   0
+       TAD     ACH
+       SPA CLA         /YVAL>=0?
+       JMP I   (IA     /NO,ERR
+       TAD     ACX
+       SMA SZA CLA     /YVAL<1?
+       JMP I   (IA     /NO, ERR
+/CONV # IN FAC TO A 10BIT DISPLAYABLE VAL
+/      FAC=FAC*1776+1001
+/
+       JMS  I  (FMPY   /YES
+       FL1022          /1776(8)
+       JMS  I  (FADD
+       FL513           /1001(8)
+       JMS I   FIXP
+       JMS     PUTBUF
+       ISZ     TOTPTS  /KEEP CNT OF PTS IN BUF
+       JMP I   PLY
+\f/DLY(N)-N IS MAX # OF PTS TO BE EVENTUALLY DISPLAYED
+/      CHK IF 1<=N<=1024; SET 'REFRFL' =0 FOR
+/      A ONE SHOT DISPLAY.
+/
+DLY,   0
+       JMS I   FIXP
+       SPA SNA         /1<=N?
+       JMP I   (IA     /NO,ERR
+/CHK IF N IS SAME AS LAST TIME &
+/IF SO, NO NEED TO GO THE "SETDX" ROUT
+       DCA     INI     /YES,TEMPORARY SAVE
+       DCA     XR1
+       TAD     INI
+       CIA
+       TAD     MAXPTS
+       SZA CLA         /N IS STILL THE SAME?
+       JMP     .+3     /NO
+       JMS I   (DISPLY /YES, DISPLY ONCE &
+       JMP I   DLY     /RETURN
+       TAD     INI     /GET N BACK
+       DCA     MAXPTS  /ASSUME N IS VALID FOR MOMENT
+       TAD     MAXPTS
+       CIA
+       TAD     (2000
+       SPA CLA         /N<=1024?
+       JMP I   (IA     /NO
+       DCA     REFRFL  /ONE SHOT DISPLY
+       JMS I   (SETDX  /SET DX FOR DISPLY
+       JMP I   DLY
+\f/ADC(N)-SAMPLE ADC NTH CHANNEL; RETN FL PT VAL IN FAC
+/
+
+ADC,   0
+       JMS I   FIXP    /GET ARG N
+       CIA
+       TAD     K0017
+       SPA             /N<=17(8)?
+       JMP I   (IA     /NO,ERR
+       CIA             /YES
+       TAD     K0017
+       ADLM            /LOAD MUX
+       ADST            /START CONV
+       ADSK
+       JMP     .-1
+       ADRB            /GET VAL
+       DCA     ACH
+       JMS I   (FFLOT
+       JMP I   ADC
+\f/CLW(N)-N IS A DUMMY ARG; WAIT UNTIL CLOCK O.F. OR
+/      UNTIL A SCHMITT TRIG FIRES(DEPENDING WHICH WAS
+/      SPECIFIED IN 'CLK') BEFORE RETURNING TO BASIC
+/
+CLW,   0
+       CLSK            /STATUS REG IS ALREADY SET?
+       SKP             /NO
+       JMP     EARLY   /YES
+       CLSK
+       JMP     .-1
+       CLSA            /READ STATUS
+CLW1,  CLL RAL         /CHK ON O.F.
+       SZL             /O.F. BIT SET IN SATUS WD?
+       CIA             /YES,NEG REST OF STATUS REG
+/RTN 0 IF O.F. ONLY; 1,2,...,7 IF SCHMITT ONLY;
+/-1,-2,...,-7 IF BOTH
+       RAR             /NO
+       DCA     ACH
+       JMS I   (FFLOT
+       JMP I   CLW
+/IF CLOCK INTERRUPTED TOO SOON TELL USER;
+/-8 IF O.F. ONLY; 9 THRU 15 IF SCHMITT ONLY;
+/-9 THRU -15 IF BOTH
+EARLY, CLSA
+       TAD     K0010
+       JMP     CLW1
+
+       PAGE
+\f/DIS(S,E,N,X)-DISPLY EVERY NTH PT BEGIN WITH S
+/      & NOT EXCEEDING N; X=1 DISPLY NOW,
+/      X=0 SETUP TO DISPLY FOR A SAM
+/
+DIS,   0
+       JMS I   (BUFCDF /SETUP CDF & USER BUF
+       JMS I   (ARG123
+       STPT-1
+/FLOAT N
+       TAD     NTHY
+       DCA     ACH
+       JMS I   (FFLOT
+       JMS I   FPUTL   /IT BETTER NOT =0
+       DX              /HOLD TEMPORARY
+/CHK 1<=S,0<=E-S
+       TAD     STPT
+       SPA SNA
+       JMP I   (IA     /ERROR
+       CIA
+       TAD     ENDPT
+       SPA
+       JMP I   (IA     /ERROR
+/FLOAT (E-S) & GET (E-S)/N
+       DCA     ACH
+       JMS I   (FFLOT
+       JMS I   (FDIV
+       DX
+/CHK (E-S)/N+1<=1024; MAXPTS=(E-S)/N+1
+       JMS I   FIXP
+       IAC
+       DCA     MAXPTS  /ASSUME OK FOR NOW
+       TAD     MAXPTS
+       CIA
+       TAD     (2000   /1024(10)
+       SPA CLA
+       JMP I   (IA     /ERROR
+/GET X ARG; DISPLY BUF(X=1); ONLY A SETUP FOR SAM (X=0)
+       CLL IAC RAL     /4TH ARG DESIGNATED BY AC=2
+       JMS I   (GETARG
+       JMS I   FIXP
+       DCA     XFLG
+       TAD     XFLG
+       SZA CLA         /USER WANTS TO DISPLY?
+       TAD     MAXPTS  /YES,TOTPTS=MAXPTS
+DPY1,  DCA I   (TOTPTS /NO,JUST SET UP,TOTPTS=0
+       IAC             /REFRESH TILL ^N(NON INTERRUPT)
+       DCA     REFRFL  /OR TILL CLK INTERRPT(INT MODE)
+       JMS I   (SETDX
+       JMP I   DIS
+STPT,  0               /THESE 3 LOCATIONS
+ENDPT, 0               /GO TOGETHER & MUST
+NTHY,  0               /BE IN THIS ORDER
+XFLG,  0
+\f/DISPLY-SETUP CDF & PTR TO STARTING PT OF USER BUF;
+/      SETUP 'DISCTR' FOR # OF PTS TO DISPLY THIS TIME;
+/      INITIALIZE FL PT 'DXSUM'=-'DX'
+/
+DISPLY,0
+/IF TOTPTS<=MAXPTS,DISPLY TOTPTS;OTHERWSE MAXPTS
+D4,    TAD I   (TOTPTS
+       SNA             /SIMPLE WAIT LOOP FOR THAT'1ST'
+       JMP     .-1     /ADC TO BE SAMPLED
+       CIA
+       DCA     DISCTR
+       TAD     DISCTR
+       TAD     MAXPTS
+       SMA CLA         /TOTPTS<=MAXPTS?
+       JMP     .+4     /YES
+       TAD     MAXPTS  /NO
+       CIA
+       DCA     DISCTR
+/SETUP CDF & PTR TO START PT OF USER BUFFER
+       TAD I   (CDFBAK /RE-INIT CDF FOR LAST TIME YOU DISPLY
+       DCA     DISCDF  /YOU MAY HAVE CROSSED FLDS
+       TAD I   (BUFBAK /ADR-1 OF BUF
+       TAD     STPT
+       DCA     BUFPTR
+       TAD     XCRD    /INITIALIZE XCOORD
+       DCA     XCOORD
+D3,    TAD     XCOORD
+       DILX
+       TAD     DELTAX
+       DCA     XCOORD  /UPDATE XCOORD BY DELTAX
+DISCDF,        0
+       TAD I   BUFPTR
+       CDF
+       DILY
+       CLA CLL
+       TAD     NTHY    /MOVE PTR TO NXT LOC TO BE
+       TAD     BUFPTR  /ACCESSED IN BUF
+       DCA     BUFPTR
+       SNL             /JUST CROSSED FLDS?
+       JMP     .+4     /NO
+       TAD     K0010   /YES
+       TAD     DISCDF
+       DCA     DISCDF
+       DISD
+       JMP     .-1
+       DIXY    /INTENSIFY
+/DISPLYED ALL PTS YET?
+       ISZ     DISCTR
+       JMP     D3      /NO
+       TAD     REFRFL  /YES,KEEP REFRESHING?
+       SNA CLA
+       JMP I   DISPLY  /NO
+/KEYBOARD IS CHK HERE FOR ^N WHEN DSPL & NOT SAMPLING
+/KEYBOARD INTERRUPTS TO THE INT ROUTN
+/
+       KSF             /YES
+       JMP     D4
+       KRB
+       TLS
+       TAD     (-216
+       SNA CLA         /USER HIT ^N?
+       JMP I   DISPLY  /YES
+       JMP     D4      /NO, KEEP REFRESHING
+DISCTR,        0
+BUFPTR,        0
+XCRD,  0
+XCOORD,        0
+DELTAX,        0
+\f/FFLOT-FLOAT ANY INTEGER IN ACH(LOC 45) INTO FAC
+
+FFLOT, 0
+       DCA     ACL     /CLEAR LOW MANTISSA
+       TAD     (13     /11(10) INTO EXPONENT
+       DCA     ACX
+       JMS I   FNORL   /NORMALIZE
+       JMP I   FFLOT   /RETURN
+FL513, 12;2002;0
+FL1022,        12;3774;0
+
+       PAGE
+\f/SAM(C,N,P,T)-SETUP PARAMETERS FOR SUBSEQUENT SAMPLING
+/      OF ADC'S OR OR DOING DIGITAL IO
+/
+       CONST=CLK
+       TSAM=NCTR
+SAM,   0
+       JMS I   (ARG123
+       CSAM-1
+       TAD     PSAM
+       SPA SNA         /P=0?
+       JMP I   (IA     /YES,ERR
+       CIA             /NO
+       DCA     PCTR    /PCTR=-P(DONE CTR)
+       CLL IAC RAL     /4TH ARG IS DESIGN BY AC=2
+       JMS     GETARG  /GET T
+       JMS I   FIXP
+       DCA     TSAM
+       TAD     TSAM
+       SZA CLA         /SET UP TO SAMPLE ADC'S?
+       JMP     DIG     /NO, DO DIGAL IO
+       IAC             /YES
+       DCA     SAMFLG  /SET FLG=1 FOR 'CLK'
+       TAD     K0017   /15(10)
+       JMP     SAM1
+DIG,   CMA
+       DCA     SAMFLG  /SET FLG=-1 FOR 'CLK'
+       CLA CLL IAC RAL /2
+SAM1,  DCA     CONST
+/CHK IF 0<=C, 1<=N, N+C-1<=2(DIG IO)OR <=17(8)(ADC'S)
+/
+       CMA
+       TAD     NSAM
+       SPA             /1<=N?
+       JMP I   (IA     /NO,ERR
+       TAD     CSAM
+       CIA
+       TAD     CONST
+       SPA CLA         /N+C-1<=2 OR 17?
+       JMP I   (IA     /NO,ERR
+       TAD     TSAM
+       SNA CLA
+       JMP     SAM3
+/CLEAR ALL DIGIAL INPT REGS
+       JMS I   (BUFCDF /SET UP USER BUF
+       TAD     NSAM
+       CIA
+       DCA     NCTR    /-#OF BOARDS TO CLAR
+       TAD     CSAM    /START BOARD#(0,1,2)
+       CLL RTL
+       RAL             /START BOARD# * 10(8)
+       TAD     (DBCI
+A1,    DCA     .+2
+       CLA CMA
+       0               /DBCI IS ISSUED
+       CLA
+       TAD     .-2
+       TAD     K0010
+       ISZ     NCTR    /MORE BOARDS TO CLEAR?
+       JMP     A1      /YES
+       CLA
+       JMP I   SAM
+/DO A CLEAR ALL; AD DONE FLG, ERR FLG, CLR MUX & EN REG.
+/SET NON-AUTO INCR MODE
+/
+SAM3,  CAF             /CL ALL FLGS-I MAY USE ION'S
+       ADCL
+       TAD     K0200
+       ADLE            /ENABLE EXT START OF ADC'S
+       JMP I   SAM
+CSAM,  0               /THESE 3 LOCATIONS MUST
+NSAM,  0               /BE TOGETHER & IN THIS
+PSAM,  0               /ORDER
+PCTR,  0
+NCTR,  0
+\f/CLK(R,O,S)-A COMPLEX CLK ROUTN WHICH SETS UP CLOCK
+/      FOR ADC SAMPLING; DIGIAL IO SMPLING;
+/      & SETS UP A SIMPLE CLOCK-WAIT ROUTN
+/
+CLK,   0
+       JMS I   (ARG123
+       R-1
+       CLSA            /CLEAR CLK STATUS REG 
+       CLA
+       TAD     R
+       SPA SNA         /R>0?
+       JMP     IAA     /NO,ERR
+       TAD     (-6     /YES
+       SMA SZA CLA     /R<=6?
+       JMP     IAA     /NO
+       TAD     R       /R GIVES CORRECT VAL FOR
+       CLL RTL         /EXT START, .1,1,10,100,1000 KHZ RATE
+       RTL
+       RTL             /RATE GOES INTO BITS 3-5 OF EN REG
+       TAD     (5050   /BITS 0,2,6,8 OF EN REG ALWAYS SET
+       DCA     SAM     /SAVE TEMP
+       TAD     O       /OVERFLOW CNT
+       CIA
+       CLAB            /SET BUF PRESET REG
+       CLA
+       TAD     S
+       SZA CLA         /ANY SCHMITT TRIGS ASKED FOR?
+       TAD     (27     /YES,SET BITS 7,9-11 OF EN REG
+       TAD     SAM     /FINAL ENABLE VAL
+       CMA
+       CLZE            /CLEAR BAD BITS FROM EN REG
+       CMA             /ENABLE VAL IS BACK AGAIN
+       CLOE            /START CLOCK
+       CLA
+       TAD     SAMFLG
+       SNA             /JUST SETTING UP FOR A SIMPLE TIMING DEV?
+       JMP     DONE    /YES,RTN TO BASIC
+       SPA CLA         /SAMPLE ADC'S?
+       JMP I   (DRESET /NO,DO DIGITAL IO
+       JMP I   (SRESET /YES
+DONE,  DCA     SAMFLG  /CLR FLG
+       SPF             /RESET TTY FLG FOR BASIC
+       JMP I   CLK     /RTN TO BASIC
+IAA,   SPF
+       JMP I   (IA
+R,     0               /THESE 3 LOCATIONS
+O,     0               /MUST BE TOGETHER IN
+S,     0               /THIS ORDER
+SAMFLG,        0
+FL4096,        15;2000;0
+\f/GETARG-ENTER WITH SCALER(0=ARG2,1=ARG3,2=ARG4) IN AC;
+/      CALL 'ARGPRE' & ON RTN THE D.F. OF ARG IS SET
+/      & ADR OF ARG IS IN FAC
+/      PUT FL PT ARG IN FAC( 44-46)
+
+GETARG,        0
+       DCA     INSAV   /ARGPRE USES THIS SCALER LOC 64
+       JMS I   KARG    /GET ADR OF ARG
+       JMS I   FGETL   /PUT ARG IN FAC
+KARG,  ARGPRE          /USED TO ADVANTAGE
+       CDF             /RESET D.F.
+       JMP I   GETARG
+
+       PAGE
+\f/SETDX-SETUP DELTAX; CHK IF DISPL IS TO BE
+/      ACTIVATED; DX IS A FL PT NO
+/      SETUP DELTAX SUCH THAT IT =1,2,3,...,1023;
+/      & XCOORD SO THAT DISPLY IS CENTERED
+/
+SETDX, 0
+       CMA
+       TAD     MAXPTS  /MAXPTS-1
+       SNA             /IF # OF MAXPTS=1 THEN DISPLY
+       IAC             /IS POSITIONED AT X=0 COORD
+       DCA     ACH
+       JMS  I  (FFLOT
+       JMS I   FPUTL
+       DX              /SAVE FL PT(MAXPTS-1) TEMP
+       TAD     (1777   /1023
+       DCA     ACH
+       JMS I   (FFLOT
+       JMS I   (FDIV
+       DX              /FL PT (1023/MAXPTS-1) =DX
+       JMS I   FIXP    /FIXED 'DX'
+       DCA I   (DELTAX
+       TAD I   (DELTAX
+       DCA     ACH
+       JMS I   (FFLOT
+       JMS I   (FMPY
+       DX              /(MAXPTS-1)*(FIX'DX')=FLOT PROD
+       JMS I   FIXP    /FIX 'PROD'
+       CIA
+       TAD     (1777
+       CLL RAR         /(1023-FIX'PROD')/2
+       TAD     (1001
+       DCA I   (XCRD   /XCOORD=[1001+(1023-FIX'DX')/2]
+/CHK  SHOULD DISPLY NOW(XFLG=1)
+/OR RTN TO BASIC DUE TO SAM SETUP(XFLG=0
+
+       TAD I   (XFLG
+       SZA CLA
+       JMS I   (DISPLY
+       JMP I   SETDX
+\f/ADSAM-A CLOCK INTERRUPT FOR SAMPLING ADC'S COMES HERE
+/
+ADSAM1,        ADRS            /RD STATUS(GET MUX)
+       IAC
+       ADLM            /BMP MUX BY 1
+       JMP     CLUGE
+ADSAM, CLSA            /READ STATUS REG & CLEAR IT
+       SMA CLA         /CLK O.F.?
+       JMP     TION    /NO, SCHMITT TRIG SYNC
+       ADSK            /CONV IS DONE?
+       JMP     .-1     /NO
+       ADRB            /GET VAL FR CONV BUF
+       JMS I   (PUTBUF /YES
+       ISZ I   (NCTR   /SAMPLED ALL CHANS FOR THIS INTERRUPT?
+       JMP     ADSAM1  /NO
+       ISZ I   (PCTR   /YES,JOB IS ALL DONE?
+       JMP     SRESET-1        /NO
+       JMP I   (DONE   /YES,'DONE' IS IN 'CLK' ROUTN
+
+/SRESET-USED TO RESET STCHAN & CTR FR ADC SAMPLING
+/      ROUTN SETS MUX TO SAMPLE 1ST OF A SERIES OF CHANS.
+/      A CTR IS SET TO -# OF CONSEC CHANS TO SAMPLE
+/
+
+       ISZ I   (TOTPTS /#PTS /CHANNEL
+SRESET,        TAD I   (NSAM
+       CIA
+       DCA I   (NCTR
+       TAD I   (CSAM
+       ADLM            /LOAD MUX WITH 1ST CHAN
+TION,  ION
+       JMS I   (DISPLY /DISPLY UNTIL CLK INTERRUPT
+\f/DRI(N) -SAMPLE DIGITAL IO BOARD N; & RTN RESULT
+/      AS FL PT IN FAC
+
+DRI,   0
+       JMS     ARGN
+       JMS I   (DIGIO  /GET DIGITAL VAL
+       JMS     NEGCHK
+       JMP I   DRI
+
+/ARGN - GET N AND MAKE A 'DBSK' INSTRUCTION
+
+ARGN,  0
+       JMS I   FIXP    /BOARD #
+/CHK 0<=N<=2
+       DCA     SETDX   /SAV N TEMP
+       TAD     SETDX
+       CIA
+       TAD     (2
+       SPA CLA
+       JMP I   (IA     /ERR
+       TAD     SETDX   /GET N BAK
+       CLL RTL
+       RAL             /BOARD # = BITS 6-8
+       TAD     (DBCI
+       JMP I   ARGN
+
+/DRO(M,N)- M=FL PT VAL TO OUTPUT, N=BOARD #
+/      IF M=0 CLR OUTPUT REG; OTHERWISE LEAVE
+/      THE BITS OF DBSO SET
+
+       MASK=DIGIO
+DRO,   0
+       JMS I   FIXP
+       DCA I   (MASK   /DIGITAL OUTPUT VAL
+       JMS I   (GETARG
+       JMS     ARGN
+       TAD     (2      /65N5='DBCI+2'
+       DCA     KDBCO
+       IAC
+       TAD     KDBCO
+       DCA     KDBSO
+       TAD I   (MASK   /GET FL PT VAL
+       SZA             /CLR OUTPUT REG/
+       JMP     KDBSO   /NO
+       CMA             /YES,SET ALL BITS OF AC
+KDBCO, 0       /CLR OUTPUT REG
+       SKP
+KDBSO, 0               /OUTPUT DIG VAL
+       CLA
+       JMP I   DRO
+\f      FLGNEG=DRO
+/NEGCHK- THIS ROUTINE CHKS TO SEE IF A VALUE FROM
+/      'DRI' OR 'GET' IS NEGATIVE.  IF IT IS
+/      THE VALUE IS CHANGED TO 4096+NEG VAL.
+
+NEGCHK,        0
+       DCA     FLGNEG  /VAL IS EITHER + R -
+       TAD     FLGNEG
+       DCA     ACH
+       JMS I   (FFLOT
+       TAD     FLGNEG
+       SMA CLA         /VAL WAS NEG?
+       JMP I   NEGCHK  /NO
+       JMS I   (FADD   /YES
+       FL4096
+       JMP I   NEGCHK
+CLUGE, ADST            /START CONV
+       JMP     ADSAM+3
+
+       PAGE
+\f/GET(M,L)- M=0, GET VAL FROM USER BUF & NO MASKING
+/      M>0, GET VAL FROM USER BUF & MASK WHERE
+/      M IS THE MASKING VALUE.
+/      L IS THE LOCATION OF USER BUF TO ACCESS
+
+       LHOLD=ARG123
+GET,   0
+       IAC
+       DCA     MSKCTR
+       JMS I   FIXP    /GET M
+       SNA             /M=0
+       CMA             /YES,SET M=7777
+       CLL RAR
+       SZL
+       JMP     .+3
+       ISZ     MSKCTR
+       JMP     .-4
+       RAL
+       JMS COMMON      /SAME CODE FOR 'GET' & 'PUT'
+       TAD     MSKCTR
+       CIA
+       DCA     MSKCTR
+       TAD I   LHOLD
+       CDF             /RESET D.F.
+       CLL RAR
+       ISZ     MSKCTR
+       JMP     .-2
+       RAL
+       AND     MASK
+       JMS I   (NEGCHK
+       JMP I   GET
+MSKCTR,        0
+
+/PUT(M,L)- M IS THE FL PT VALU TO BE FIXED & PUT
+/      IN THE USER BUF;  L IS THE LOC OF THE USER
+/      BUF WHERE TO STORE THE FIXED NUMBER.
+
+PUT,   0
+       JMS I   FIXP    /GET & FIX THE FL PT VAL
+       JMS COMMON
+       TAD     MASK
+       DCA I   LHOLD
+       CDF
+       JMP I   PUT
+
+/COMMON- THIS ROUTINE IS USED BY BOTH 'GET' & 'PUT'
+
+COMMON,        0
+       DCA     MASK    /SAVE M TEMPORARILY
+       JMS I   (GETARG
+       JMS I   FIXP    /GET L
+       CLL
+       TAD I   (BUFBAK
+       DCA     LHOLD
+       SZL             /CROSSED FIELDS?
+       TAD     K0010   /YES
+       TAD I   (CDFBAK /NO
+       DCA     .+1
+       0
+       JMP I   COMMON
+\f/WHEN INTERRUPT OCCURS COME HERE
+/
+
+SERVC, CLA
+       CLSK            /CLOCK INTERRUPT?
+       SKP             /NO
+       JMP I   (ADSAM  /YES
+       KSF             /TTY INTERRUPT?
+       SKP             /NO
+       JMP     KKBRD   /YES
+       TSF             /DUE TO LAST ECHO?
+       HLT             /SPURIOUS INTERRUPT
+       TCF             /YES
+       JMP I   (TION
+KKBRD, KRB
+       TLS             /ECHO CHAR
+       TAD     (-203
+       SZA CLA         /^C TYPED?
+       JMP I   (TION   /NO,IGNORE CHAR
+       JMS I   P1SWAP  /YES
+       JMP I   (7605   /RTN TO MONITOR
+\f/ARG123-THIS ROUTINE GETS 3 ARGUMENTS OF A FUNCTION
+/      AND STORES THEIR FL PT VALUES IN
+/      'ARG1,ARG2,ARG3' & STORES THEIR FIXED VALUES
+/      AT 'ADR,ADR+1,ADR+2'
+/              CALL: JMS ARG123
+/                    ADR-1
+
+ARG123,        0
+       TAD I   ARG123  /GET(ADR-1)FOR THE THREE
+       DCA     XR1     /1WD ARGS
+       ISZ     ARG123
+       JMS I   FIXP
+       DCA I   XR1     /SINGLE PREC ARG1
+       JMS I   (GETARG /ARG2 DESIGN BY AC=0
+       JMS I   FIXP
+       DCA I   XR1     /SINGLE PREC ARG2
+       IAC
+       JMS I   (GETARG /ARG3 DESIGN BY AC-3
+       JMS I   FIXP
+       DCA I   XR1     /SINGLE PREC ARG3
+       JMP I   ARG123
+\f/DRESET-USED TO RESET STARTING DIGITAL IO BOARD & CTR;
+/      WAIT FOR CLK TO O.F.; SAMPLE EACH BOARD ASKED FOR.
+/
+
+DRESET,        TAD I   (NSAM
+       CIA
+       DCA I   (NCTR
+       TAD I   (CSAM   /STARTING BOARD #
+       CLL RTL
+       RAL             /ST BOARD #*10(8)
+       TAD     (DBCI-10
+       DCA     KDBCI   /[DBCI-10(8)] FOR 1ST BOARD
+/WAIT LOOP
+       CLSK
+       JMP     .-1
+       CLSA            /READ STATUS & CLR
+       CLA
+/SAMPLE ALL BOARDS ASKED FOR
+
+DIGSAM,        TAD     K0010
+       TAD     KDBCI
+       JMS     DIGIO   /SAMPLE BOARD
+       JMS I   (PUTBUF /PUT DIG VAL IN BUF
+       ISZ I   (NCTR   /MORE BOARDS?
+       JMP     DIGSAM  /YES
+       ISZ I   (PCTR   /NO, JOB IS ALL DONE?
+       JMP     DRESET  /NO
+       JMP I   (DONE   /YES,'DONE' IS IN 'CLK' ROUTN
+/DIGIO-ENTER WITH 'DBCI' SETUP FOR CORRECT BOARD; THIS RTN
+/      SETS UP THE 'DBRI & DBCI' AND SAMPLES CORRECT BOARD;
+/      EXIT WITH DIGITAL VAL IN AC
+/
+
+DIGIO, 0
+       DCA     KDBCI
+       TAD     KDBCI
+       IAC
+       DCA     KDBRI
+KDBRI, 0
+KDBCI, 0
+       JMP I   DIGIO
+$
+\f