ASMB,R,L,C,B,F
      HED ISA S61.1 ANALOG OUTPUT  A-92413-16003 REV. A 
      NAM AOF.W,7  92413-16003A 16APR75 
      ENT AOF,AOW,AO
      EXT .ENTR,EXEC,..DAC,#GET!
      SUP 
********************************************
*     AOF,AO,AOW - ANALOG OUTPUT TO 2313 AND 6940 
* 
*     SOURCE: 92413-18003 REV A 
*     RELOC:  92413-16003 REV A 
* 
*     REVISION A BY STEVE SCOVILL 
********************************************
* 
* 
* 
* 
* AOF PERFORMS ANALOG OUTPUT TO THE HP2313B DUAL DAC CARD USING 
* RTE DRIVER DVR62 OR TO 6940 VOLTAGE AND CURRENT DACS USING RTE
* DRIVER DVR61. 
* 
* CALLING SEQUENCE: 
*   CALL AOF(NUM,CHAN,VOLT,ERR) 
*    WHERE: 
*     NUM - ABS(NUM) = NUMBER OF OUTPUT VALUES
*           NUM < 0   PACED OUTPUT
*           NUM > 0   UNPACED OUTPUT
*     CHAN - INTEGER ARRAY OF ANALOG OUTPUT CHANNEL NUMBERS 
*     VOLT - FLOATING POINT ARRAY OF OUTPUT VOLTAGES OR CURRENTS
*     ERR - ERROR RETURN PARAMETER
*           1 - NO ERROR
*           2 - DEVICE TIME OUT 
*           3 - ADDRESS OUT OF RANGE OR NO CHANNELS 
*           4 - OUTPUT VOLTAGE OR CURRENT OUT OF RANGE
* 
* AOW IS IDENTICAL TO AOF EXCEPT ARRAY VOLT IS AN INTEGER ARRAY 
* CONTAINING THE ANALOG OUTPUT VALUES IN THE FORMAT SPECIFIED 
* BY THE DEVICE MANUAL
* 
* 
* IF AN OUTPUT VALUE EXCEEDS THE MAXIMUM, THE MAXIMUM VALUE OF THE
* CORRESPONDING SIGN IS OUTPUT AND THE ERROR NOTED IN IERR. 
* 
      SKP 
AOF   NOP 
      LDA AOF       FETCH RETURN ADDRESS
      CLB           CLEAR FIXED POINT FLAG
      JMP START     JOIN ROUTINE AOW
* 
AOW   NOP 
      LDA AOW       FETCH RETURN ADDRESS
      CLB,INB       SET FIXED POINT FLAG
* 
START STA ENTRY     SAVE RETURN ADDRESS 
      STB FIXPT     SAVE FIXED POINT FLAG 
      JMP ENTRY+1   GO FETCH PARAMS.
NUM   NOP 
CHAN  NOP 
VOLT  NOP 
ERR   NOP 
ENTRY NOP 
      JSB .ENTR     FETCH PARAMETER 
      DEF NUM        ADDRESSES
      CLB,INB       INITIALIZE ERROR
      STB ERR,I      FLAG TO 1
      LDA NUM,I     FETCH NUMBER OF CHNLS 
      SZA,RSS       IF ZERO 
      JMP ERR3       RETURN WITH ERROR 3
      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 
* 
AOF1  LDA CHAN,I    FETCH CHANNEL NUMBER
      CMA,SSA,INA,SZA   AND COMPLEMENT
      RSS           IF < = 0 THEN 
      JMP ERR3       GIVE ERROR #3
      STA CNTR      SAVE -( CHANNEL NUM. )
      LDB ..DAC     FETCH DAC TABLE ADDRESS 
      ADA 1,I       IF ADDRESSED
      SSA            CHANNEL IS NOT DEFINED 
      JMP DAC69       IN 2313, TRY 6940 
* 
      RSS 
FDAC  STA CNTR      SAVE -(#CHANNELS REMAINING) 
      INB           BUMP DAC TABLE ADDRESS
      LDA 1,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 
      STB ENTDC     YES, SAVE ENTRY ADDRESS 
      LDA VOLT,I
      LDB FIXPT 
      CPB .1
      JMP *+3 
      JSB FVOLT     CONVERT VOLTS TO
      ASL 4          DAC DATA WORD
      STA OUTV        AND SAVE IN OUTPUT BUFR 
      LDA ENTDC,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 1            COMMAND WORD 
      IOR PACED     OR IN PACE BIT
      IOR =B40001   OR IN COMMAND CODE
      STA CMND      SAVE COMMAND WORD 
      SKP 
* 
      JSB EXEC      ************************* 
      DEF *+5 
      DEF .2        PERFORM 
      DEF LU         ANALOG 
      DEF QBUF        OUTPUT
      DEF .1        **************************
* 
      AND =B200 
      SZA,RSS       CHECK FOR BAD STATUS BIT
      SZB,RSS        OR ZERO XMISSION LOG 
      JMP ERR2      GIVE DEVICE ERROR 
NXTV  LDA FIXPT     IF FIXED POINT FLAG 
      SZA,RSS        BUMP VOLT ADDRESS ONE WORD 
      ISZ VOLT      UPDATE
      ISZ VOLT       VOLTAGE
      ISZ CHAN       AND CHANNEL ADDRESSES
      ISZ NUM       LAST CHANNEL? 
      JMP AOF1      NO, CONTINUE
* 
      JMP ENTRY,I   RETURN
* 
ERR3  LDA QBUF      ERROR RETURN OF 3 
      RSS 
ERR2  LDA .2        ERROR RETURN OF 2 
      STA ERR,I 
      JMP ENTRY,I 
* 
QBUF  OCT 3 
.2    OCT 2 
      DEF CMND
* 
CMND  NOP 
OUTV  NOP 
PACED NOP 
CNTR  NOP 
.1    OCT 1 
.4    OCT 4 
AO    EQU AOW 
FIXPT EQU AOW 
ENTDC EQU AOF 
OVRF  NOP 
      SKP 
* 
*     LIMIT CHECKS
* 
FVOLT NOP 
      ADB DEFLM     COMPUTE LIMIT 
      STB OVRF       ADDRESS
      LDA FIXPT     IF FIXED POINT
      SZA,RSS        IS CLEAR GO TO 
      JMP FXVLT       FLOATING CONVERT
      LDA VOLT,I    FETCH DATA WORD 
      CMA,INA        AND CHECK
      JMP FXV1        LIMITS
* 
FXVLT DLD VOLT,I    LOAD VOLTAGE OR CURRENT 
      FMP =F-200.   COMPUTE: -INTEGER 
      FAD =F.0005    BUG FIXER!!
      SSA,RSS        ADD A LITTLE BIT 
      JMP *+3 
      FAD =F-.001      FOR ROUNDOFF ERRORS!!
      FIX            VALUE FOR DAC
FXV1  STA OUTV        AND SAVE
      ADA OVRF,I    IF BEYOND UPPER 
      SSA            BOUND, SET OUTPUT
      JMP OVRFL       TO UPPER BOUND
      ISZ OVRF      MOVE POINTER TO LOWER BOUND 
      LDA OUTV      IF LESS THAN
      ADA OVRF,I     LOWER BOUND, 
      CMA,INA 
      SSA             SET OUTPUT
      JMP OVRFL        TO LOWER BOUND 
      LDA OUTV      VALUE WITHIN BOUNDS SO
      CMA,INA        COMPLEMENT, MASK AND SAVE
      JMP FVOLT,I 
* 
OVRFL LDA .4        SET ERROR PARAMETER 
      STA ERR,I      TO 4 
      LDA OVRF,I    SET OUTPUT VOLTAGE TO LIMIT 
      JMP FVOLT,I 
* 
*     6940 DAC CALL 
* 
DAC69 LDA CHAN,I    GET CHAN
      JSB #GET! 
LU    NOP 
TYPE  NOP 
      NOP           PARAMETERS THAT AREN'T
      NOP            USED BUT THESE NOP'S ARE!
      SSB           ERROR?
      JMP ERR3       CHAN TOO BIG 
      ADA .M1 
      DIV .15 
      IOR CNTL
      STA CMND      SAVE CNTL WORD
      BLF           MOVE SLOT 
      BLF,BLF        TO MSB'S 
      STB SLOT        SAVE
      SKP 
* 
*     CHECK TYPE,SCALE,DO OUTPUT
* 
      LDA TYPE      GET TYPE
      CLB           SET LIMIT FOR VOLT DAC
      CPA .5        IF VOLTAGE DO CONVERSION
      JMP *+5 
      LDB .2        SET LIMIT FOR CURRENT DAC 
      CPA .6        IF CURRENT DO CONVERSION
      RSS 
      JMP ERR3      ELSE,ERROR 3
* 
      JSB FVOLT        ENTRIES
      AND B7777     ADD SLOT #
      IOR SLOT       INFORMATION
      STA OUTV       TO DATA WORD 
* 
WRITE JSB EXEC      *************************** 
      DEF *+6       PERFORM 
      DEF .2         NORMAL 
      DEF LU          WRITE 
      DEF CMND         WITH 
      DEF .2            HANDSHAKE 
      DEF .1        ************************* 
* 
      AND =B204 
      SZA,RSS       CHECK FOR BAD STATUS BITS 
      SZB,RSS        OR ZERO XMISSION LOG 
      RSS           DEVICE ERROR
      JMP NXTV      NO, FETCH NEXT VALUE
* 
      LDA .2
      STA ERR,I 
      LDA CMND
      AND =B20
      SZA,RSS 
      JMP ENTRY,I 
      XOR CMND
      STA CMND
      JMP WRITE 
* 
.M1   DEC -1
.15   DEC 15
SLOT  NOP 
.5    DEC 5 
.6    DEC 6 
CNTL  OCT 170160
DEFLM DEF LIMIT 
LIMIT OCT 3777      VOLTAGE DAC UPPER BOUND 
      OCT 174000     AND LOWER BOUND
B7777 OCT 7777      CURRENT DAC UPPER BOUND 
      OCT 0          AND LOWER BOUND
      END 
                                                                                                                                                    