ASMB,R,B,L,T,C
* 
      NAM DVR47 
      ENT I.47,C.47 
* 
*  THIS DRIVER IS DESIGNED TO OPERATE THE DIGITAL MULTI-
*  FUNCTION METER / SCANNER SUBSYSTEM.
* 
*  THE STANDARD EQUIPMENT CONSISTS OF:
* 
*    1. HP 3480-OPT 004 DVM 
*    2. HP 3484-OPT HO4,041,042,043 
*    3. HP 2911A CROSSBAR SCANNER 
*    4. HP 2911B-OPT. 033 SCANNER CONTROL 
*    5. HP 02116-6123 CROSSBAR SCANNER I/O CARD 
*    6. HP 28037-60003 CONTROLLER MICROCIRCUIT CARD 
*    7. HP 28037-60004 DATA SOURCE INTERFACE CARD 
* 
*  THE FORTRAN CALL TO DVR47 IS:
* 
*     CALL EXEC (1,IDRT,DATA,NUMB,IPROG,ISCAN)
* 
*      WHERE:   IDRT = SUBSYSTEM LOGICAL UNIT NUMBER
*               DATA = USERS DATA BUFFER ADDRESS
*               NUMB = NUMBER OF READINGS (1 IF NOT DIGITIZE) 
*                      NOTE: THIS IS NOT THE # OF CPU WORDS!
*               IPROG= MULTIFUNCTION UNIT PROGRAM WORD
*               ISCAN= SCANNER PROGRAM WORD 
* 
*      PROGRAM WORD:   BITS     MEANING 
*           (IPROG)    ----     ------- 
* 
*                       15      DMA (OPTIONAL W/SAMPLE&HOLD)
* 
*                     14-12     NOT USED
* 
*                     11-9      EXTERNAL PACER:  0= NO
*                                                1= YES 
* 
*                      8-6      FILTER:  0= NO FILTER 
*                                        1= FILTER A
*                                        2= FILTER B
* 
*                      5-3      FUNCTION:  0= DC
*                                          1= AC(AC)
*                                          2= OHMS
*                                          3= AC(DC)
*                                          4= SAMP/HOLD (NO DELAY)
*                                          5= SAMP/HOLD (W/DELAY) 
* 
*                      2-0      RANGE:  0=  --- ,  10 MOHM
*                                       1= 1000V,   1 MOHM
*                                       2=  100V, 100 KOHM
*                                       3=   10V,  10 KOHM
*                                       4=    1V,   1 KOHM
*                                       5= 100MV, 100  OHM
* 
* 
* 
*      SCANNER PROGRAM:   BITS     MEANING
*              (ISCAN)    ----     -------
* 
*                          15      BLOCK SCAN ENABLE= 1 
* 
*                        14-12     DELAY:  0=  27MS 
*                                          1=  27MS 
*                                          2=  27MS 
*                                          3=  27MS 
*                                          4=  42MS 
*                                          5=  62MS 
*                                          6= 145MS 
*                                          7= 500MS 
* 
*                        11-9      NOT USED 
* 
*                         8-0      CHANNEL NUMBER (INTEGER) 
* 
* 
*  THE FORTRAN CALL TO CLEAR ALL DVM PROGRAM LINES IS:
* 
*     CALL EXEC (1,IDRT,0)
* 
*      WHERE:   IDRT = SUBSYSTEM LOGICAL UNIT NUMBER
* 
* 
      SKP 
* 
*   INITITION SECTION 
* 
I.47  NOP 
      LDB EQT6,I    CHECK FOR 
      CPB D1         READ REQUEST 
      JMP SETIO     OK- CONFIGURE I/O 
ERROR CLA,INA,RSS   REJECT ERROR
      LDA D5        DMA NEEDED! 
      CLB 
      JMP I.47,I    RETURN
* 
SETIO INA 
      IOR OTA       FORM "OTA PGM"
      STA OTA1      STORE OUTPUT INSTRUCTION
      STA OTA6
      XOR B1100     FORM "STC PGM,C"
      STA STCC1     STORE 
      XOR B1200     FORM "LIA PGM"
      STA LIA1      STORE 
      XOR B1400     FORM "CLF PGM"
      STA CLF1      STORE 
      INA 
      XOR B1000     FORM "STF SCAN" 
      STA STF1      STORE 
      XOR B700      FORM "OTA SCAN" 
      STA OTA5      STORE 
      XOR B5000     FORM "OTB SCAN,C" 
      STA OTB1      STORE 
      XOR B5000     FORM "STC SCAN" 
      IOR B100
      STA STC2      STORE 
* 
      LDB EQT7,I    CLEAR DVM 
      SZB            PROGRAM LINES ?
      JMP BUFR      NO, CHECK BUFFER LENGTH 
      CLA 
OTA6  OTA 0         CLEAR LINES 
      LDA D4        SET IMMEDIATE COMPLETION
      CCB           SET B REG. TO -1
      JMP I.47,I    RETURN
* 
BUFR  LDA EQT8,I    GET NUMBER OF READINGS
      ADA DM1        SUBTRACT 1 
      SSA           IS COUNT 1 OR GREATER ? 
      JMP ERR02     NO, REJECT
* 
      LDA EQT10,I   GET SCANNER PROGRAM 
      ALF 
      AND B7        ISOLATE DELAY 
      STA B         SAVE
      ADA DM3 
      SSA           CODE <3 ? 
      LDB B3        YES, SET DELAY= 27 MS 
      ADA DM5 
      SSA,RSS       CODE >7 ? 
      JMP ERR02     YES, REJECT 
OTB1  OTB 0,C       OUTPUT DELAY CODE 
* 
      LDA EQT10,I   GET SCANNER PROGRAM 
      AND B7777     ISOLATE CHANNEL # 
      CLB 
      DIV D10       CONVERT 
      STB WORD
      CLB            TO 
      DIV D10 
      ALF             BCD 
      ADA B 
      ALF 
      ADA WORD
STF1  STF 0         ENABLE CHANNEL BITS 
OTA5  OTA 0         OUTPUT CHANNEL
STC2  STC 0         ENCODE SCANNER
* 
      LDA EQT9,I    GET PROGRAM WORD
      LDB DM6 
      JSB DECOD     DECODE RANGE
      STB WORD      SAVE
      LDA EQT9,I    GET PROGRAM WORD
      ASR 3 
      LDB DM6 
      JSB DECOD     DECODE FUNCTION 
      BLF,BLS 
      LDA WORD      COMBINE:
      IOR B          RANGE & FUNCTION 
      CPB B1000     SAMPLE & HOLD DELAY ? 
      IOR B400      YES, ADD DELAY BIT
      STA WORD      SAVE
      AND B100      ISOLATE OHMS
      SZA           OHMS ?
      JMP *+5 
      LDA EQT9,I    NO,IS 
      AND B7         RANGE 0 ?
      SZA,RSS 
      JMP ERR02     YES, REJECT 
      LDA EQT9,I    GET PROGRAM WORD
      ASR 6 
      LDB DM3 
      JSB DECOD     DECODE FILTER 
      SZB,RSS       FILTER PROGRAMMED ? 
      JMP *+5 
      LDA WORD
      AND B240      YES, IS AC
      SZA 
      JMP ERR02     YES, REJECT 
      LDA B 
      ASL 10
      IOR WORD      COMBINE: RANGE, FUNCTION, FILTER
      STA WORD      SAVE
      SZB,RSS       IF
      JMP *+6        SAMPLE & HOLD
      AND B400        PROGRAMMED
      SZA,RSS          WITH 
      JMP *+3           FILTER, 
ERR02 LDA D2             REJECT 
      JMP ERROR+2 
* 
      CLA 
      STA DMAFL     CLEAR DMA FLAG
      LDA EQT9,I    GET PROGRAM WORD
      ASR 9 
      LDB DM2 
      JSB DECOD     DECODE PACER
      LDA WORD
      SZB,RSS       PACER ? 
      JMP *+6 
      AND B400      YES, IS SAMPLE/HOLD 
      SZA,RSS        PROGRAMMED ? 
      JMP ERR02     NO, REJECT
      LDA B100K 
      STA DMAFL     SAVE ENCODE CONTROL 
      CLB 
      LDA EQT9,I    GET DVM PROGRAM WORD
      AND B20 
      SZA,RSS       OHMS? 
      JMP COMB      NO! 
      LDA EQT9,I
      AND B300
      SZA           FILTER ?
      JMP COMB
      LDA EQT9,I
      AND B7
      ADA DM2 
      SSA           1 OR 10 MOHM RANGE ?
      LDB B2000     YES, FORCE FILTER 
COMB  LDA WORD
      IOR B         FORCE FILTER BIT ?
      IOR DMAFL     EXTERNAL ENCODE ? 
      IOR B20K      ADD HOLD BIT
      STA WORD      SAVE PROGRAM WORD 
      IOR B10K
CLF1  CLF 0         PROG. ENCODE RESET
OTA1  OTA 0         OUTPUT PROGRAM WORD 
      LDA EQT8,I    GET # OF READINGS 
      CMA,INA 
      STA EQT11,I   NEG. READING COUNT
      INA,SZA,RSS   WAS COUNT 1 ? 
      JMP RTDMA     YES, RETURN DMA CHAN. 
      LDA WORD      GET PROGRAM WORD
      AND B6340     DC, NO FILTER ? 
      SZA 
      JMP RTDMA     NO, RETURN DMA CHAN.
      LDA EQT10,I   GET SCANNER PROGRAM 
      SSA           BLOCK SCAN ?
      JMP RTDMA     YES, RETURN DMA CHAN. 
      LDA EQT9,I    GET DVM PROGRAM WORD
      AND B40 
      SZA           SAMPLE AND HOLD ? 
      JMP *+4       NO! 
      LDA EQT9,I    YES, DMA REQUESTED ?
      SSA,RSS 
      JMP RTDMA     NO, RETURN DMA CHAN.
      JSB DMAA      DMA ASSIGNED YET ?
      JMP ERROR+1   NO! 
* 
      IOR OTA       FORM "OTA DMA"
      STA OTA2      STORE 
      ADA DM4       FORM "OTA DMA-4"
      STA OTA3      STORE 
      STA OTA4
      XOR B100      FORM "STC DMA-4"
      STA STC1      STORE 
      XOR B4000     FORM "CLC DMA-4"
      STA CLC1      STORE 
* 
      LDA EQT4,I    INITIALIZE DMA
      AND B77       ISOLATE DSI CHAN. # 
      IOR CW1 
OTA2  OTA DMA       OUTPUT CONTROL WORD 1 
CLC1  CLC DMA-4 
      LDA EQT7,I    GET FWA OF USER BUFFER
      IOR B100K 
OTA3  OTA DMA-4     OUTPUT CONTROL WORD 2 
STC1  STC DMA-4 
      LDA EQT8,I    GET NUMBER OF READINGS
      ADA A         DOUBLE IT AND 
      CMA,INA        MAKE NEGITIVE
OTA4  OTA DMA-4     OUTPUT CONTROL WORD 3 
      CLA,INA       SET 
      STA DMAFL      DMA FLAG 
* 
BYDMA LDB DM1       SET B REG = -1
      LDA EQT9,I    GET PROGRAM WORD
      AND B30       ISOLATE AC(DC) CODE 
      CPA B30       AC(DC) ?
      LDB DM5       YES, SET B REG = -5 
      LDA EQT9,I    GET PROGRAM WORD
      AND B327      ISOLATE OHMS CODE 
      CPA B120      10 MOHM, FIL A ?
      LDB DM10      YES, SET B REG = -10
      CPA B220      10 MOHM, FIL B ?
      LDB DM20      YES, SET B REG = -20
      STB EQT13,I   ESTABLISH DELAY COUNTER 
* 
      LDA DMAFL     SAVE DMA
      RAR            FLAG IN BIT 15 
      IOR EQT7,I    GET BUFFER ADDRESS
      STA EQT12,I   ESTABLISH WORKING POINTER 
      LDA WORD
      STA EQT7,I    SAVE PROGRAM WORD 
      LDB CNTR1     SET TIME OUT COUNTER IN B REG.
LIA1  LIA 0         TEST FOR
      SLA,RSS        PROGRAM
      JMP LEAVE       ACKNOWLEDGE FLAG
      ISZ B         INCREMENT TIME
      JMP LIA1       OUT COUNTER
      LDA B3        SET A REG. = 3
      JMP I.47,I    ERROR RETURN
* 
RTDMA JSB DMAA      WAS A DMA CHAN ASSIGNED?
      JMP BYDMA     NO! 
      LDB INTBA     YES! B=FWA INT TABLE
      SLA           CH7 ? 
      INB           YES! B=FWA INT TABLE+1
      CLA           CLEAR 
      STA B,I        TABLE ENTRY
      STA DMAFL       AND DMA FLAG
      JMP BYDMA 
* 
LEAVE CCA 
      STA EQT9,I    SET FIRST READING FLAG
STCC1 STC 0,C       ENABLE SCANNER FLAG 
      CLA 
      JMP I.47,I    RETURN
* 
DECOD NOP           CONVERT CODE TO SINGLE LINE 
      AND B7        ISOLATE CODE
      ADB A         IS IT VALID ? 
      SSB,RSS 
      JMP ERR02     NO ,REJECT
      CLB 
      SZA,RSS       CODE = 0 ?
      JMP DECOD,I   YES,RETURN
      CLB,INB       SET B REG = 1 
      ADA DM1       SUBTRACT 1 FROM CODE
      SZA,RSS       DONE ?
      JMP DECOD,I   YES, B REG = SINGLE LINE CODE 
      BLS 
      JMP *-4 
* 
DMAA  NOP           TO DETERMINE DMA STATUS 
      DLD INTBA,I   GET FWA'S OF EQT HOLDING DMA
      CPA EQT1      CH6 ASSIGNED ?
      LDA D6        YES!
      CPB EQT1      CH7 ASSIGNED ?
      LDA B7        YES!
      CPA D6        ADJUST
      RSS            THE
      CPA B7          RETURN
      ISZ DMAA         ADDRESS
      JMP DMAA,I        & RETURN
* 
* 
      SKP 
* 
*   COMPLETION SECTION
* 
C.47  NOP 
      CPA D6        EXIT
      JMP P.1+1      IF 
      CPA B7          DMA 
      JMP P.1+1        INTERRUPT
      IOR CLC 
      STA *+1       CLEAR CONTROL 
      CLC 0          ON INT SOURCE
* 
      LDB EQT1,I    IS THIS A 
      SZB            SPURIOUS INTERRUPT ? 
      JMP *+3        NO 
      STB EQT15,I    YES, PREVENT TIMEOUT 
      JMP P.2         AND CONTINUE
* 
      LDA EQT4,I
      AND B77       ISOLATE DSI CHANNEL 
      IOR CLC 
      XOR B200       FORM "LIB DSI" 
      STA LIB1       STORE
      XOR B4000      FORM "LIA DSI" 
      STA LIA2       STORE
      XOR B1200      FORM "STC DSI,C" 
      STA STCC4      STORE
      INA           FORM "STC PGM,C"
      STA STCC5     STORE 
      XOR B1100     FORM "OTA PROG" 
      STA OTA7      STORE 
      XOR B300      FORM "LIA PROG" 
      STA LIA3      STORE 
      INA 
      XOR B200      FORM "STC SCAN" 
      STA STC3      STORE 
* 
      LDA EQT6,I    GET INTERRUPT SOURCE FLAG 
      SZA,RSS       SCANNER INTERRUPT 
      JMP *+4       NO! 
      CLA 
      STA EQT6,I    CLEAR SCANNER INTERRUPT 
      JMP STCC4 
      LDA EQT9,I
      SZA,RSS       FIRST READING ? 
      JMP *+3        NO!
      ISZ EQT13,I   INCREMENT DELAY COUNTER 
      JMP STCC4     MORE DELAY NEEDED!
      LDA EQT8,I    GET # OF READINGS 
      CPA D1        ONE ? 
      JMP DATA      YES!
      LDA EQT7,I    GET PROGRAM WORD
      ASR 10
      AND B3
      SZA           FILTER PROGRAMMED ? 
      JMP DMACK     YES!
      LDA EQT7,I    GET PROGRAM WORD
OTA7  OTA 0         REMOVE EXT. TRIG. DELAY 
      LDB CNTR1     SET TIME OUT COUNTER
LIA3  LIA 0         TEST FOR
      SLA,RSS        PROGRAM
      JMP DMACK       ACKNOWLEDGE 
      ISZ B            FLAG 
      JMP LIA3
      CLA,INA 
      JMP C.47,I    NO FLAG, REJECT 
* 
DMACK LDA EQT12,I 
      SSA           DMA FLAG SET ?
      JMP DMAON     YES!
      CLA 
      STA EQT9,I    CLEAR FIRST READING FLAG
DATA  LDA EQT12,I   GET CURRENT 
      ELA,CLE,ERA 
      STA POINT       USER BUFFER ADDRESS 
LIA2  LIA 0         LOAD FIRST DATA WORD
LIB1  LIB 0         LOAD SECOND DATA WORD 
      DST POINT,I    STORE READING
      ISZ EQT11,I    ADVANCE READING COUNTER
      RSS 
      JMP P.1       ALL DONE!!! 
* 
      ISZ EQT12,I    INCREMENT
      ISZ EQT12,I     BUFFER ADDRESS
      LDA EQT10,I   GET SCANNER PROGRAM WORD
      SSA,RSS       BLOCK SCAN
      JMP STCC4     NO, START NEXT READING
STC3  STC 0         YES ,ADVANCE CHANNEL
STCC5 STC 0,C       ENABLE SCANNER FLAG 
      CLA,INA       SET SCANNER 
      STA EQT6,I     INTERRUPT FLAG 
      JMP P.2       WAIT
* 
DMAON JSB DMAA      CHECK DMA STATUS
      JMP ERROR+1 
      IOR CLC       FORM "CLC DMA"
      STA CLC2      STORE 
      XOR B5000     FORM "STC DMA,C"
      STA STCC2     STORE 
STCC2 STC DMA,C     INITIATE DMA
      CLA           SPECIAL 
      CPA DUMMY      PROCESSING REQUIRED ?
      JMP STCC4     NO, START MEASUREMENT 
CLC2  CLC DMA       CLEAR DMA CONTROL 
      LDB INTBA     GET 
      LDA CHAN       INTERRUPT TABLE
      CPA B7          CONTENTS
      INB              FOR THE
      LDA B,I           DMA CHANNEL 
      IOR B100K     SET 
      STA B,I        BIT 15= 1
      CLA 
STCC4 STC 0,C       ENCODE DVM
* 
P.2   CLA 
      ISZ C.47      SET UP AND PERFORM
      JMP C.47,I     CONTINUATION RETURN
* 
P.1   CLA,RSS 
      LDA B100K     SET BIT 15= 1 
      LDB EQT8,I     GET # OF READINGS
      ADB B          DOUBLE IT
      JMP C.47,I    COMPLETION RETURN 
      SKP 
* 
*   SYSTEM BASE PAGE COMMUNICATION AREA 
* 
.     EQU 1650B 
EQT1  EQU .+8 
EQT4  EQU .+11
EQT6  EQU .+13
EQT7  EQU .+14
EQT8  EQU .+15
EQT9  EQU .+16
EQT10 EQU .+17
EQT11 EQU .+18
..    EQU 1771B 
EQT12 EQU ..
EQT13 EQU ..+1
EQT15 EQU ..+3
* 
CHAN  EQU 1673B 
INTBA EQU 1654B 
DUMMY EQU 1737B 
* 
* 
      SKP 
* 
*   CONSTANTS, COUNTERS, AND STORAGE
* 
A     EQU 0 
B     EQU 1 
B3    OCT 3 
B7    OCT 7 
B20   OCT 20
B30   OCT 30
B40   OCT 40
B77   OCT 77
B100  OCT 100 
B120  OCT 120 
B200  OCT 200 
B220  OCT 220 
B240  OCT 240 
B300  OCT 300 
B327  OCT 327 
B400  OCT 400 
B700  OCT 700 
B1000 OCT 1000
B1100 OCT 1100
B1200 OCT 1200
B2000 OCT 2000
B1400 OCT 1400
B4000 OCT 4000
B5000 OCT 5000
B6340 OCT 6340
B7777 OCT 7777
B10K  OCT 10000 
B20K  OCT 20000 
B100K OCT 100000
CNTR1 DEC -250
CW1   OCT 120000
D1    DEC 1 
D2    DEC 2 
D4    DEC 4 
D5    DEC 5 
D6    DEC 6 
D10   DEC 10
DM1   DEC -1
DM2   DEC -2
DM3   DEC -3
DM4   DEC -4
DM5   DEC -5
DM6   DEC -6
DM10  DEC -10 
DM20  DEC -20 
DMAFL NOP 
POINT NOP 
WORD  NOP 
CLC   CLC 0 
OTA   OTA 0 
DMA   EQU 6B
* 
      END 
                                                                              