ASMB,R,L,C,F,B
      HED BASIC DEVICE SUBROUTINES FOR HP2313B
* 
* A2313 - BASIC DEVICE SUBROUTINES FOR HP2313B
* 
* SOURCE TAPE 29102-80016 REV. B
* RELOC. TAPE 29102-60016 REV. B
* 
* AUTHOR - T.A. SAPONAS REV A 
*          STEVE SCOVILL REV B
* 
* VERSION JANUARY 1974
* 
* MODULE A2313 IS PART OF THE RTE-B LIBRARY TAPE (29102-60001).  IT 
* CONSISTS OF TWO SEPARATE ASSEMBLY LANGUAGE PROGRAMS (A2313 & AOV).
* A2313 CONTAINS THE FOLLOWING BASIC CALLABLE SUBROUTINES:
*     AIRDV - ANALOG INPUT IN RANDOM ORDER
*     AISQV - ANALOG INPUT IN SEQUENTIAL ORDER
*     NORM - SYSTEM NORMALIZE 
*     PACER - SETS UP SYSTEM PACER
*     RGAIN - READS GAIN ON A CHANNEL 
*     SGAIN - SETS GAIN ON A CHANNEL
* 
* AOV CONTAINS ONLY THE SUBROUTINE AOV FOR ANALOG OUTPUT. 
* 
* 
* 
      NAM A2313,7  29102-80016B 05JUN75 
      EXT ..ADC,EXEC,$LIBR,$LIBX,..FCM,.ENTR
      ENT NORM,AIRDV,AISQV,SGAIN,RGAIN,PACER
      EXT .DST,ERROR
      SUP 
      SPC 3 
* "RGAIN" READS THE GAIN OF A GIVEN CHANNEL OR GROUP OF CHANNELS
*   CALLING SEQUENCE: 
*      CALL RGAIN(CHN1,GN1) 
* 
*     WHERE: CHN1 - DESIRED CHANNEL NUMBER
*            GN1  - FLOATING POINT GAIN OF CHANNEL "CHN1" 
* 
CHN1  NOP 
GN1   NOP 
RGAIN NOP 
      JSB .ENTR     FETCH PARAMETER 
      DEF CHN1       ADDRESSES
      LDA RGAIN     SAVE RETURN 
      STA ENTRY       ADDRESS 
      LDA CHN1,I    FIND CHANNEL ENTRY
      JSB FCHN       IN CONFIGURATION TABLE 
      BLS           COMPUTE ADDRESS OF GAIN 
      ADB DFCTR      CONVERSION FACTOR
      STB GAIN         AND SAVE 
      DLD FACTR      GAIN = 
      FDV GAIN,I     .005 / CONVERSION FACTOR 
      DST GN1,I     STORE GAIN
      JMP ENTRY,I    AND RETURN 
      SKP 
* "SGAIN" READS THE GAIN OF A GIVEN CHANNEL OR GROUP OF CHANNELS
*   CALLING SEQUENCE: 
*      CALL SGAIN(CHN2,GN2) 
* 
*     WHERE: CHN2 - DESIRED CHANNEL NUMBER
*            GN2  - FLOATING POINT GAIN OF CHANNEL "CHN2" 
* 
CHN2  NOP 
GN2   NOP 
SGAIN NOP 
      JSB .ENTR     FETCH PARAMETER 
      DEF CHN2       ADDRESSES
      LDA SGAIN     SAVE RETURN 
      STA ENTRY      ADDRESS
      LDA CHN2,I    FIND CHANNEL ENTRY
      JSB FCHN       IN CONFIGURATION TABLE 
      LDA .3        IF NOT LOW LEVEL
      SSB             THEN GIVE 
      JMP ERRC         ERROR # 3
      DLD FACTR     COMPUTE TEMP =
      ADA M1   (ADJUSTMENT FOR ROUND OFF ERROR) 
      FDV GN2,I       .005 / GN2
      SSA           IF GAIN WAS NEGATIVE
      JSB ..FCM      MAKE POSITIVE
      DST TEMP        AND SAVE
      LDB M7        INITIALIZE
      STB CNTR       LOOP COUNTER 
      LDA DFCTR     INITIALIZE GAIN 
      STA AFCTR      TABLE POINTER
      SPC 1 
SGN1  DLD TEMP      IF DESIRED GAIN 
      FSB AFCTR,I    IS > OR = TABLE
      SSA             VALUE, THEN 
      JMP SGN2         SET UP GAIN
      ISZ AFCTR     INCREMENT GAIN
      ISZ AFCTR      TABLE POINTER
      ISZ CNTR      LAST ENTRY? 
      JMP SGN1      NO, CONTINUE LOOKING
      SPC 1 
SGN2  LDA ADRS,I    FETCH GAIN ENTRY AND
      ASL 3          SHIFT GAIN BITS INTO "B" 
      LDB CNTR      PUT NEW 
      ADB .7         GAIN IN "B"
      ASR 3         SHIFT GAIN BITS BACK INTO "A" 
      SPC 2 
      JSB $LIBR     TURN OFF INTERRUPT SYSTEM 
      NOP            AND UPDATE 
      STA ADRS,I      CONFIGURATION TABLE ENTRY 
      JSB $LIBX     TURN INTERRUPT SYSTEM BACK
      DEF ENTRY      ON AND RETURN
      SKP 
*  "NORM" PERFORMS A SYSTEM NORMALIZE ON THE SPECIFIED UNIT 
*  IF NO UNIT NUMBER IS SPECIFIED OR ZERO THE FIRST SUBSYSTEM 
*  IN THE CONFIGURATION TABLE IS ASSUMED
* 
UNIT  NOP 
NORM  NOP 
      JSB .ENTR     FETCH PARAMETER 
      DEF UNIT       ADDRESS
      LDA NORM      SAVE RETURN 
      STA ENTRY       ADDRESS 
      LDB UNIT      FIND SUBSYSTEM
      JSB FNDLU      LOGICAL UNIT NUMBER
      SPC 1 
      JSB EXEC      ************************************* 
      DEF *+5       SYSTEM
      DEF .2         NORMALIZE
      DEF LU          REQUEST 
      DEF .1
      DEF .1        **************************************
* 
      AND =B200 
      SZA,RSS 
      SZB,RSS       IF TRANSMISSION LOG 
      JMP ERR1       EQUALS ZERO GIVE ERROR 1 
      JMP ENTRY,I   ELSE, RETURN
      SPC 3 
*  "FNDLU" FINDS THE LOGICAL UNIT NUMBER CORRESPONDING TO THE 
*  SUBSYSTEM NUMBER SPECIFIED IN THE CALL.  IF THE NUMBER IS ZERO 
*  OR NEGATIVE AN ERROR IS GIVEN, OR IF THE UNIT NUMBER IS NOT DEFINED
*  AN ERROR IS ALSO GIVEN 
* 
FNDLU NOP 
      CLA,INA       ASSUME UNIT 1 
      SZB           IF UNIT SPECIFIED 
      LDA B,I        FETCH IT 
      SSA,RSS      COMPLEMENT AND 
      CMA,INA,SZA,RSS 
      JMP ERR2       IF <=0 THEN GIVE ERROR 2 
      STA CNTR      SAVE COMP. FOR LOOP COUNTER 
      LDB ..ADC     FETCH ADDRESS OF CONFIG. TABLE
      ADA B,I       LEGITIMATE UNIT 
      SSA            ADDRESS? 
      JMP ERR2       NO - GIVE ERROR # 2
      INB,RSS       BUMP TBL PNTR TO 1ST SUBSYS. ENTRY
      SPC 1 
NXTSS ADB B,I       FETCH NEXT SUBSYSTEM ENTRY
      ISZ CNTR      UNIT FOUND? 
      JMP NXTSS     NO, CONTINUE SEARCH 
      SPC 1 
      INB           FETCH SUBSYSTEM 
      LDB B,I        LOGICAL UNIT NUMBER
      STB LU          AND SAVE
      JMP FNDLU,I   RETURN
      SKP 
* "AIRDV" PEFORMS ANALOG INPUT FROM THE CHANNELS SPECIFIED IN 
*  A REAL ARRAY.  THE RESULTS ARE CONVERTED TO FLOATING POINT VOLTS 
*  AND RETURNED IN ANOTHER REAL ARRAY.
* 
*  CALLING SEQUENCE:
*    CALL AIRDV(NUM1,RCHN,VOLT,ERR) 
*  WHERE:  NUM1 - NUMBER OF CHANNELS TO BE READ ( IF N<0 THEN 
*                 PERFORM PACED CONVERSION) 
*          RCHN - REAL ARRAY CONTAINING CHANNEL NUMBERS 
*          VOLT - REAL ARRAY FOR CONVERTED DATA 
*          ERR - ERROR RETURN PARAMETER 
*                  BIT 0 = OVERFLOW ON AT LEAST ONE READING 
*                  BIT 1 = PACE ERROR ON AT LEAST ONE READING 
* 
NUM1  NOP 
RCHN  NOP 
VOLT  NOP 
ERR  NOP
AIRDV NOP 
      JSB .ENTR     FETCH PARAMETER 
      DEF NUM1       ADDRESSES
      LDA AIRDV     SAVE RETURN 
      STA ENTRY       ADDRESS 
      LDA NUM1,I    FETCH NUMBER OF CHANNELS
      JSB SETUP     GO TO PARAMETER CHECK 
      SPC 2 
AIRD1 DLD RCHN,I    LOAD NEXT CHANNEL NUMBER
      FIX           CHANGE TO INTEGER 
      JSB FCHN      FIND HARDWARE ADDRESS 
      IOR =B100000   SET TO RANDOM MODE 
      IOR PACED       OR IN PACE BIT
      STA CHANL        AND SAVE 
      SSB           IF GAIN IS NEGATIVE 
      JMP RDHL        GO TO HIGH LEVEL READ 
      XOR =B140000   SET UP GAIN
      STA GCHN       CHANNEL ENTRY
      SPC 1 
      JSB EXEC      ***************************** 
      DEF *+5       LOW 
      DEF .2         LEVEL
      DEF LU          RANDOM
      DEF RBUF1        READ 
      DEF .2        ***************************** 
      JMP AIRD2      GO TO VOLTAGE CONVERSION 
      SPC 2 
RDHL  JSB EXEC      ************************* 
      DEF *+5       HIGH
      DEF .2         LEVEL
      DEF LU          RANDOM
      DEF RBUF2        READ 
      DEF .1        ***************************** 
      SPC 1 
AIRD2 SZB,RSS       IF TRANSMISSION LOG EQUALS
      JMP ERR1       ZERO, GIVE ERROR 1 
      SPC 1 
      LDB RDNG      FETCH READING 
      JSB CONV      PERFORM CONVERSION
      ISZ RCHN      BUMP CHANNEL
      ISZ RCHN       ADDRESS
      ISZ CNTR      LAST CHANNEL
      JMP AIRD1     NO, CONTINUE
      JMP ENTRY,I   YES, RETURN 
      SPC 4 
SETUP NOP 
      CLB           INITIALIZE ERROR
      STB ERR,I      TO ZERO
      SSA           IF NEGATIVE 
      LDB =B10000    SET
      STB PACED       PACE BIT
      SSA           IF NEGATIVE 
      CMA,INA        MAKE POSITIVE
      STA NUM         AND SAVE
      CMA,INA,SZA,RSS  COMPLEMENT # OF CHANNELS 
      JMP ERR2      IF ZERO GIVE ERROR
      STA CNTR      SAVE FOR LOOP COUNTER 
      CMA           COMPUTE ADDRESS OF
      ALS            LAST ELEMENT IN
      ADA VOLT        ARRAY VOLT
      STA TEMP         AND SAVE 
      JSB .DST      USE BASIC'S DOUBLE STORE
      DEF TEMP,I     TO CHECK ARRAY BOUNDS
      JMP SETUP,I 
      SKP 
* "FCHN" IS A SUBROUTINE WHICH FINDS THE ENTRY IN THE 2313
* CONFIGURATION TABLE WHICH CORRESPONDS TO A GIVEN CHANNEL NUMBER 
* 
*  CALLING SEQUENCE : 
*       "A" CONTAINS THE SOFTWARE ANALOG CHANNEL NUMBER 
*  RETURNED : 
*       "A" CONTAINS THE HARDWARE ADDRESS OF THE DESIRED MPX CHANNEL
*       "LU" _ LOGICAL UNIT NUMBER OF THE SUBSYSTEM CONTAINING "A"
*       "ADRS" _ ADDRESS OF THE CONF. TABLE ENTRY FOR "A" 
*       "GAIN" _ GAIN FOR THE CHANNEL (-1 IF HIGH LEVEL)
*       "REMCH" _ # OF CHANNELS REMAINING IN ENTRY
* 
* IF THE CHANNEL IS OUTSIDE THE BOUNDS OF THE TABLE "FCHN"
*  BRANCHES TO "ERR2" 
* 
FCHN  NOP 
      CMA,SSA,INA,SZA  COMPLEMENT CHANNEL NUM.
      RSS           IF LESS THAN OR 
      JMP ERR2       EQUAL TO ZERO GIVE ERROR #2
      STA MCHN       SAVE -(CHANNEL NUM.) 
      STA NMCHN 
      CCA           ASSUME
      STA GAIN       HIGH LEVEL 
      LDA ..ADC     FETCH ADDRESS OF FIRST
      STA .ADC
      INA            SUBSYSTEM ENTRY IN CONF. TABLE 
      CLB           "B"_ CURRENT SUBSYSTEM #
      JMP STFCH     SEARCH FOR SUBSYS. CONTAINING CHAN. 
      SPC 1 
NXSUB STA NMCHN     SAVE # OF CHNLS PAST LAST SUBSYS. 
      INB           INCREMENT NUMBER OF SUBSYSTEMS
      CPB .ADC,I    LAST SUBSYSTEM? 
      JMP ERR2      YES - GO TO CHANNEL NOT FOUND 
      LDA ADRS      FETCH ADDRESS OF
      ADA ADRS,I     NEXT SUBSYSTEM 
STFCH STA ADRS        AND SAVE
      ADA .2        IS LAST CHANNEL IN
      LDA A,I        CURRENT SUBSYSTEM BEYOND 
      ADA MCHN        THE DESIRED 
      SSA              CHANNEL? 
      JMP NXSUB     NO - GO TO NEXT SUBSYSTEM 
      SPC 1 
*  SUBSYSTEM CONTAINING CHANNEL FOUND.  THE FOLLOWING CODE
*  SEARCHES THE SUBSYSTEM ENTRY FOR ACTUAL CHANNEL ENTRY
* 
      LDA ADRS      FETCH THE 
      INA           LOGICAL UNIT NUMBER 
      LDB A,I         OF THE SUBSYSTEM
      STB LU            AND SAVE
      ADB =B100     SET UP DMA LU 
      STB DMALU      AND SAVE 
      ADA .2        COMPUTE ADDRESS OF HIGH LEVEL 
      STA ADRS1      SINGLE ENDED CHANNEL COUNT 
      STA ADRS       AND SAVE 
      LDB NMCHN     FETCH -(CHANNEL IN THIS SUBSYSTEM)
      RSS 
NXTEN ISZ ADRS      BUMP ENTRY ADDRESS
      LDA ADRS,I    FETCH AND MASK
      AND =B3777     NEXT ENTRY 
      ADB A         CHANNEL IN
      SSB            THIS ENTRY?
      JMP NXTEN     NO, CONTINUE SEARCH 
      SPC 1 
      INB           ENTRY FOUND,
      STB REMCH      SAVE CHANNELS REMAINING
      ISZ NMCHN     COMPUTE -(CHNLS-1)
      NOP 
      CLA 
      LDB ADRS1     FETCH HL-SE ADDRESS 
      CPB ADRS      IF ENTRY IS HIGH LEVEL - SE 
      JMP HLSE1      GO TO COMPUTE LOCATION 
      INB           IF ENTRY IS 
      CPB ADRS       HIGH LEVEL DIF.
      JMP HLDIF       GO TO COMPUTE DIF. LOCATION 
* CHANNEL MUST BE LOW LEVEL THEN, SO COMPUTE GAIN 
      LDB ADRS,I    FETCH 
      RRL 3          GAIN 
      STA GAIN       AND SAVE 
      SPC 2 
*  TO CONVERT CHANNEL NUMBER TO 2313 HARDWARE ADDRESS THE 
*  FOLLOWING ALGORITHM IS APPLIED:
* 
* BOX = (N-1)/384     (384= 12 SLOTS * 32 CHANNELS/SLOT)
* 
* SLOT.CHANNEL = REMAINDER FROM THE ABOVE QUOTIENT
* 
* WHERE "N" IS THE SUBSYSTEM RELATIVE CHANNEL ADDRESS. SINCE
* MULTIPLEXERS CANNOT OCCUPY SLOTS 0-2 IN BOX 0,
* 96 MUST BE ADDED TO CHANNEL NUMBERS.
* ALSO DIFFERENTIAL INPUT CHANNELS MUST BE COUNTED TWICE. 
* 
HLDIF LDA ADRS1,I   COMPUTE 
      ADA NMCHN      NUMBER 
HLSE1 ADA NMCHN       OF
      CMA,INA          CHANNELS 
      ADA .96       START SLOT =3 
      CLB           COMPUTE 
      DIV .384       HP 2313
      ALF,ALF         BOX, SLOT 
      ALS              AND CHANNEL
      IOR B             ADDRESS 
      LDB GAIN      RETURN WITH ADDRESS IN
      JMP FCHN,I     "A" AND GAIN IN "B"
      SPC 1 
.32   DEC 32
.96   DEC 96
.384  DEC 384 
      SKP 
*  "CONV" IS A SUBROUTINE WHICH CONVERTS 2313 READINGS TO 
*   FLOATING POINT VOLTS. 
* 
*  CALLING SEQUENCE:
*      "B" - 2313 READING 
* 
*  RETURNED:
*       THE COMPUTED VOLTAGE IS PUT IN THE ADDRESS SPECIFIED BY 
*       "VOLT" AND THEN "VOLT" IS INCREMENTED TO POINT AT THE NEXT
*       FLOATING POINT LOCATION.
* 
*       ERR HAS BIT 0 SET IF OVERFLOW AND BIT 1 SET IF PACE ERROR.
*       ALSO ON OVERFLOW, + OR - 1E37 IS RETURNED FOR VOLTAGE.
* 
CONV  NOP 
      LDA ERR,I     LOAD CURRENT ERROR VALUE
      BRS,SLB,BRS   SHIFT READING AND TEST FOR PACE ERROR 
      IOR .2        SET PACE ERROR BIT
      STA ERR,I     SAVE CURRENT VALUE OF ERR 
      BRS,CLE,BRS   TOTAL SHIFT 4 PLACES
      CPB =B3777    IF POS. OVERFLOW, E_1 
      CCE,RSS        AND GO TO OVERFLOW 
      CPB =B174000  IF NEG. OVERFLOW, E_0 
      JMP OVRFL      AND GO TO OVERFLOW 
      LDA B         MOVE READING TO A REG.
      LDB GAIN      COMPUTE 
      BLS            ADDRESS OF 
      ADB DFCTR       CONVERSION FACTOR 
      STB TEMP         AND SAVE 
      FLT           FLOAT THE 2313 READING
      FMP TEMP,I    MULTIPLY BY CONVERSION FACTOR 
STVLT DST VOLT,I    STORE VOLTAGE IN ARRAY
      ISZ VOLT      COMPUTE NEXT
      ISZ VOLT       FLOATING POINT ADDRESS 
      JMP CONV,I    RETURN
      SPC 1 
OVRFL SZA,RSS       SET OVERFLOW BIT
      IOR .1
      STA ERR,I      IN "ERR" 
      DLD =F1E37    RETURN POSITIVE 
      SEZ,RSS        OR NEGATIVE
      JSB ..FCM       INFINITY FOR
      JMP STVLT        READING
      SKP 
      SKP 
*************************** 
DFCTR DEF FACTR+2 
FACTR DEC .005,5E-6,1E-5,2E-5,4E-5
      DEC 5E-5,1E-4,2E-4,4E-4 
RBUF1 OCT 3         ----------------------------------
      OCT 2                  Q BUFFER 
      DEF GCHN                FOR LOW LEVEL 
RBUF2 OCT 5         --------- 
      OCT 1         Q BUFFER
      DEF CHANL      FOR HIGH LEVEL 
      DEF RDNG      ----------------------------------
RDNG  NOP 
      SPC 1 
M7    DEC -7
.7    OCT 7 
      SPC 1 
GCHN  NOP           GAIN
GAIN  NOP            BUFFER 
      SPC 1 
      SKP 
* "AISQV" PERFORMS ANALOG INPUT IN SEQUENTIAL ORDER.  THE RESULTS 
* ARE CONVERTED TO FLOATING POINT VOLTS AND RETURNED IN A REAL ARRAY. 
* 
* CALLING SEQUENCE: 
*   CALL AISQV(NUM2,SCHAN,VOLT2,ERR1) 
*  WHERE:  NUM2 - NUMBER OF CHANNELS TO BE READ ( IF N<0 THEN 
*                 PERFORM PACED CONVERSION) 
*          SCHAN - STARTING CHANNEL OF SCAN (IF SCHAN<0 THEN
*                  PERFORMS NUM2 READINGS FROM CHANNEL -SCHAN)
*          VOLT2 - REAL ARRAY FOR CONVERTED DATA
*          ERR - ERROR RETURN PARAMETER 
*                  BIT 0 = OVERFLOW ON AT LEAST ONE READING 
*                  BIT 1 = PACE ERROR ON AT LEAST ONE READING 
* 
NUM2  NOP 
SCHAN NOP 
VOLT2 NOP 
ERRA  NOP 
AISQV NOP 
      JSB .ENTR     FETCH PARAMETER 
      DEF NUM2       ADDRESSES
      LDA VOLT2     MOVE VOLT ARRAY ADDRESS 
      LDB ERRA       ERROR ADDRESS TO 
      STA VOLT        LOCATIONS USED BY UTILITIES 
      STB ERR          SHARED BY AIRDV AND AISQV
      LDA NUM2,I    FETCH NUMBER OF CHANNELS
      JSB SETUP     GO TO PARAMETER CHECK 
      LDA VOLT2     SET UP INPUT BUFFER 
      ADA NUM        ADDRESS TO LAST HALF OF
      STA VOLT1       FLOATING PNT. ARRAY "VOLT2" 
      SPC 2 
      LDA SCHAN,I   SAVE START CHANNEL AS 
NXTSC STA SINGL      SINGLE CHAN. FLAG
      SSA           IF NEGATIVE 
      CMA,INA        MAKE POSITIVE
      JSB FCHN      FETCH CHANNEL HARDWARE ADDRESS
      IOR DIGTZ    FORM DIGITIZE COMMAND
      STA CHANL      WORD AND SAVE
      IOR PACED     OR IN PACE BIT
      SSB,RSS       IF LOW LEVEL
      JMP LLSQ       GO PROCESS 
      LDB SINGL     IF SINGLE CHANNEL 
      SSB            SCAN GO TO 
      JMP HLSQR       HIGH LEVEL EXEC CALL
      IOR =B160000  GENERATE SEQUENTIAL 
      LDB ADRS       COMMAND, SETTING 
      CPB ADRS1       BIT 0 IF
      IOR .1           SINGLE ENDED SCAN
      SPC 1 
      LDB REMCH     LENGTH OF SCAN
      ADB CNTR       IS THE SMALLER 
      CMB,SSB,INB,RSS  OF -CNTR 
      CLB            OR THE REMAINDER 
      ADB REMCH        OF THE CHANNELS
      STB NUM           IN THIS ENTRY 
      SPC 1 
HLSQR STA SEQ       SAVE MODE 
      SPC 1 
      JSB EXEC      ****************************
      DEF *+5       PERFORM 
      DEF .2         HIGH 
      DEF DMALU       LEVEL 
      DEF SBUF2        SCAN 
      DEF .3        *********************** 
      AND =B200 
      SZA,RSS 
      SPC 1 
SQCON SZB,RSS       IF TRANSMISSION LOG EQUALS
      JMP ERR1       ZERO, GIVE ERROR 1 
* THE FOLLOWING INSTRUCTIONS CONVERT THE DATA JUST READ IN
* TO FLOATING POINT AND UPDATE POINTERS "VOLT", AND "VOLT1" 
* TO POINT AT REMAINING STORAGE.
      LDA NUM       COMPLEMENT
      CMA,INA        NUMBER OF CHANNELS 
      STA LOOPC       READ FOR LOOP COUNTER 
      SPC 1 
SQC1  LDB VOLT1,I   FETCH NEXT READING
      JSB CONV      CONVERT TO FLOATING POINT 
      ISZ VOLT1     BUMP DATA ADDRESS 
      ISZ LOOPC     LAST CHANNEL
"     JMP SQC1      NO - CONTINUE 
      SPC 1 
      LDB NUM       UPDATE -(NUMBER OF CHNLS) 
      ADB CNTR       REMAINING
      SSB,RSS       IF CNTR=0 , END OF
      JMP ENTRY,I    SCAN SO RETURN 
      STB CNTR      OTHERWISE SAVE
      LDA NUM       COMPUTE NEW 
      ADA SINGL      START CHANNEL
      CMB,INB       SAVE POSITIVE NUMBER OF 
      STB NUM        CHANNELS REMAINING 
      JMP NXTSC     GO TO NEXT SCAN 
      SPC 4 
LLSQ  XOR =B160000  SET UP
      STA GCHN       GAIN ENTRY 
      XOR =B160000  RESTORE "A" TO DIGITIZE 
      LDB SINGL     IF NOT SINGLE 
      SSB,RSS        CHANNEL SCAN,
      IOR =B160000    CHANGE TO SEQUENTIAL
      STA SEQ          AND SAVE 
      SSB           IF SINGLE CHANNEL SCAN
      JMP LLSQR     GO PERFORM SCAN 
      AND =B37      COMPUTE THE NUMBER
      CMA,INA        OF CHANNELS REMAINING
      ADA .32         ON THE ADDRESSED
      ARS              LOW LEVEL CARD 
      ADA CNTR      SCAN LENGTH 
      CMA,SSA,INA    IS EQUAL 
      CLA             TO THE SMALLEST OF
      ADA CNTR         THE FOLLOWING: 
      ADA REMCH     1. # CHNLS LEFT ON CARD 
      CMA,SSA,INA,RSS 
      CLA           2. # CHNLS LEFT IN SCAN 
      ADA REMCH 
      STA NUM       3. # CHNLS LEFT IN TABLE ENTRY
      SPC 1 
LLSQR JSB EXEC      *********************** 
      DEF *+5       PERFORM 
      DEF .2         LOW
      DEF DMALU       LEVEL 
      DEF SBUF1        SCAN 
      DEF .5        ************************
      SPC 1 
      JMP SQCON     CONVERT DATA TO FLOATING VOLTS
      SPC 4 
SBUF1 OCT 3         ----------------------------- 
      OCT 2 
      DEF GCHN
SBUF2 OCT 3 
      OCT 1 
      DEF CHANL 
      OCT 3 
      OCT 0 
      DEF SEQ 
      OCT 4 
NUM   NOP           NUMBER OF READINGS
VOLT1 NOP           DATA STORAGE
      OCT 3         CLEAN 
      OCT 1          UP OPERATION 
      DEF DIGTZ       TO RELEASE LL MPX 
      SPC 4 
DIGTZ OCT 120000
M1    DEC -1
      SKP 
* "PACER" SETS UP THE SYSTEM PACER, OR IF THE PACE RATE IS ZERO 
* TURNS OFF THE SYSTEM PACER. 
* 
* CALLING SEQUENCE: 
* 
*    CALL PACER(RATE,MULT,MODE [,UNIT]) 
* WHERE:
*    RATE - BASIC PACER RATE (0 <= RATE <= 256) 
*    MULT - DECADE MULTIPLIER TIMES THE BASIC 1 MICROSECOND 
*           RATE ( 0 <= MULT <= 7 ) 
*    MODE - EXTERNAL/START STOP MODE (BITS 11 AND 12 OF PACER 
*           COMMAND WORD - SEE 12755A MANUAL) 
*    UNIT - SUBSYSTEM NUMBER (OPTIONAL - ASSUMED 1) 
* 
RATE  NOP 
MULT  NOP 
MODE  NOP 
UNIT1 NOP 
PACER NOP 
      JSB .ENTR     FETCH PARAMETER 
      DEF RATE       ADDRESSES
      LDA PACER     SAVE RETURN 
      STA ENTRY       ADDRESS 
      LDB UNIT1     FETCH LOGICAL 
      JSB FNDLU      UNIT NUMBER
      SPC 1 
      CLB           CHECK ALL 
      LDA RATE,I     PARAMETERS 
      ASR 5           FOR THE FOLLOWING 
      IOR MULT,I       LIMITS:
      ARS            RATE  0 - 255
      IOR MODE,I     MODE  0 - 3
      ARS,ARS        MULT  0 - 7
      SZA           IF ANY PARAMETER OUT OF 
      JMP ERR2       RANGE GIVE ERROR 2 
      SPC 1 
      CLA,INA       ASSUME ONE
      STA ENTNM      WORD ENTRY 
      LDB DCMD2     FETCH OUTPUT BUFFER ADDRESS 
      LDA MODE,I    IF MODE = 0 
      SZA,RSS        AND RATE IS NOT 0
      CPA RATE        THEN GO TO GENERATE 
      JMP NZMOD        PACER COMMAND WORD 
      ADB M1        ELSE, GENERATE A 10 MS DELAY
      INA            BEFORE PROGRAMMED
      ISZ ENTNM       RATE STARTS 
      SPC 1 
NZMOD STB DEFBF     STORE QUEUE BUFFER ADDRESS
      LSL 3         GENERATE
      IOR MULT,I     PACER
      LSL 8           COMMAND 
      IOR RATE,I       WORD 
      IOR =B60000       AND 
      STA CMD2           SAVE 
      SPC 1 
      JSB EXEC      ************************
      DEF *+5       SET 
      DEF .2         UP 
      DEF LU          PACER 
      DEF QBUF
      DEF .1        ******************************* 
* 
      AND =B200 
      SZA 
      JMP ERR1
      SPC 1 
      SZB           IF ZERO TRANS. LOG GIVE ERROR 1 
      JMP ENTRY,I 
      SPC 4 
*  ERROR ROUTINES FOR 2313 INTERFACE
*    ERR1 - ERROR NUMBER 1
*   ERR2 - ERROR NUMBER 2 
*   ERRC - ERROR NUMBER (A REGISTER)
* 
ERR1   CLA,INA,RSS   SET ERROR TO 1 
ERR2  LDA .2        SET ERROR TO 2
ERRC  STA ERRNM     SAVE ERROR NUMBER 
      JSB ERROR     CALL
      DEF *+3        BASIC
      DEF ERRNM       ERROR 
      DEF ERRMS        ROUTINE
      SPC 1 
      JMP ENTRY,I   RETURN
      SKP 
ERRMS DEC 3         ERROR MESSAGE IN ASCII
      ASC 2,ADC      STRING NOTATION
      SPC 1 
QBUF  OCT 3 
ENTNM NOP 
DEFBF NOP 
DCMD2 DEF CMD2
      OCT 61412     10 MS START IMMEDIATE 
CMD2  NOP 
      SKP 
A     EQU 0 
B     EQU 1 
NMCHN EQU NUM1
CNTR  EQU NUM2
ERRNM EQU FCHN
LU    EQU ERRA
SINGL EQU AIRDV 
SEQ   EQU GN1 
CHANL EQU CHN2
REMCH EQU SGAIN 
.ADC  EQU RATE
ADRS  EQU NORM
ADRS1 EQU SETUP 
MCHN  EQU SCHAN 
TEMP  EQU GCHN
AFCTR EQU RGAIN 
ENTRY EQU AISQV 
.1    EQU RBUF2+1 
.2    EQU RBUF1+1 
.3    EQU RBUF1 
.5    EQU RBUF2 
PACED EQU CHN1
LOOPC EQU FCHN
DMALU EQU PACER 
      END 
ASMB,R,L,C,F,B
      HED BASIC DEVICE SUBROUTINES FOR HP2313B
      NAM AOV,7 
      ENT AOV 
      EXT .ENTR,EXEC,ERROR,..DAC
      SUP 
A     EQU 0 
B     EQU 1 
* 
* AOV PERFORMS ANALOG OUTPUT TO THE HP2313B DUAL DAC CARD USING 
* RTE DRIVER DVR62. 
* 
* CALLING SEQUENCE: 
*   CALL AOV(NUM,CHAN,VOLT,ERR) 
*    WHERE: 
*     NUM - ABS(NUM) = NUMBER OF OUTPUT VALUES
*           NUM < 0   PACED OUTPUT
*           NUM > 0   UNPACED OUTPUT
*     CHAN - FLOATING POINT ARRAY OF ANALOG OUTPUT CHANNEL NUMBERS
*     VOLT - FLOATING POINT ARRAY OF OUTPUT VOLTAGES
*     ERR - NUMBER OF OUTPUT VALUES EXCEEDING MAXIMUM 
* 
* IF AN OUTPUT VALUE EXCEEDS THE MAXIMUM, THE MAXIMUM VALUE OF THE
* CORRESPONDING SIGN IS OUTPUT AND THE ERROR NOTED IN IERR. 
* 
NUM   NOP 
CHAN  NOP 
VOLT  NOP 
ERR   NOP 
AOV   NOP 
      JSB .ENTR     FETCH PARAMETER 
      DEF NUM        ADDRESSES
      CLB           INITIALIZE ERROR
      STB ERR,I      FLAG TO ZERO 
      LDA NUM,I     FETCH NUMBER OF CHNLS 
      SZA,RSS       IF ZERO 
      JMP ERR2       RETURN 
      SSA           IF NEGATIVE 
      LDB =B10000    SET PACE BIT 
      STB PACED       AND SAVE
      SSA,RSS       IF POSITIVE 
      CMA,INA        COMPLEMENT AND 
      STA NUM         SAVE FOR LOOP COUNTER 
      SKP 
*  ANALOG OUTPUT LOOP STARTS HERE 
AOV1  DLD VOLT,I    FETCH OUTPUT
      FMP =F3200.    VOLTAGE AND CONVERT
      FIX             TO INTEGER
      SOS           IF OVERFLOW IS CLEAR
      JMP STVLT      STORE VOLTAGE
      LDB VOLT,I    ELSE, SET DAC TO
      SSB            MAXIMUM POSITIVE 
      CMA             OR NEGATIVE VOLTAGE 
      ISZ ERR,I     BUMP ERROR COUNTER
      SPC 1 
STVLT AND =B177760  MASK UPPER 12 BITS
      STA OUTV       AND SAVE IN OUTPUT BUFR
      SPC 1 
      DLD CHAN,I    FETCH CHANNEL NUMBER
      FIX            CONVERT TO INTEGER 
      CMA,SSA,INA,SZA   AND COMPLEMENT
      RSS           IF < = 0 THEN 
      JMP ERR2       GIVE ERROR #2
      STA CNTR      SAVE -( CHANNEL NUM. )
      LDB ..DAC     FETCH DAC TABLE ADDRESS 
      ADA B,I       IF ADDRESSED
      SSA            CHANNEL IS NOT DEFINED 
      JMP ERR2       GIVE ERROR 
      SPC 1 
      RSS 
FDAC  STA CNTR      SAVE -(#CHANNELS REMAINING) 
      INB           BUMP DAC TABLE ADDRESS
      LDA B,I       FETCH NEXT TABLE ENTRY
      AND =B7        AND MASK OF #CHNLS-1 
      ADA CNTR      ADDRESSED CHANNEL 
      SSA,INA,SZA    IN THIS ENTRY? 
      JMP FDAC      NO, CONTINUE SEARCH 
      SPC 1 
      LDA B,I       FETCH CHANNEL ENTRY 
      CLB           EXTRACT LU
      ASL 6          FROM ENTRY 
      STB LU          AND SAVE
      ASR 4         SHIFT AND 
      AND =B7740     MASK BOX AND SLOT NUMBER 
      LDB CNTR      FETCH CHANNEL 
      CMB            NUMBER AND 
      BLF             "OR" INTO 
      IOR B            COMMAND WORD 
      IOR PACED     OR IN PACE BIT
      IOR =B40001   OR IN COMMAND CODE
      STA CMND      SAVE COMMAND WORD 
      SPC 1 
      JSB EXEC      ************************* 
      DEF *+5 
      DEF .2        PERFORM 
      DEF LU         ANALOG 
      DEF QBUF        OUTPUT
      DEF .1        **************************
* 
      AND =B200 
      SZA,RSS 
      SPC 1 
      SZB,RSS       IF TRANSMISSION LOG EQUALS
      JMP ERR1       ZERO, GO TO ERROR 1
      SPC 1 
      ISZ VOLT      UPDATE
      ISZ VOLT       VOLTAGE
      ISZ CHAN        AND 
      ISZ CHAN         CHANNEL ARRAY POINTERS 
      ISZ NUM       LAST CHANNEL? 
      JMP AOV1      NO, CONTINUE
      JMP AOV,I     YES, RETURN 
      SPC 2 
ERR1  CLA,INA,RSS   ERROR #1 HERE 
ERR2  LDA .2        ERROR #2 HERE 
      STA ERRNM     SAVE ERROR NUMBER 
      JSB ERROR     CALL
      DEF *+3        BASIC'S
      DEF ERRNM       ERROR 
      DEF ERRMS        ROUTINE
      JMP AOV,I     AND RETURN
      SPC 2 
ERRMS OCT 3 
      ASC 2,AOV 
QBUF  OCT 3 
.2    OCT 2 
      DEF CMND
      SPC 1 
CMND  NOP 
OUTV  NOP 
PACED NOP 
ERRNM EQU PACED 
CNTR  NOP 
LU    NOP 
.1    OCT 1 
      END 
  