FTN4,L,C
      SUBROUTINE DGNLD(IUNIT,MODE,IWORD,IBUFR,IBUFL), 
     +09580-16450 REV.2001 790803 
C 
C-------------------------------------------------------
C 
C  HP 8018A OPTION 001 PROGRAMMABLE DATA GENERATOR
C 
C  RELOCATABLE 09580-16450
C  SOURCE      09580-18450
C 
C  PROGRAMMER: ALAN SANDERSON 790803
C 
C-------------------------------------------------------
C 
C  !=================================================!
C  !                                                 !
C  ! (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979      !
C  !                ALL RIGHTS RESERVED              !
C  !                                                 !
C  ! NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,     !
C  ! REPRODUCED OR TRANSLATED INTO ANOTHER PROGRAM   !
C  ! LANGUAGE WITHOUT THE PRIOR WRITTEN CONSENT OF   !
C  ! THE HEWLETT-PACKARD COMPANY.                    !
C  !                                                 !
C  !-------------------------------------------------!
C  !                                                 !
C  ! TEST SYSTEM SOURCE SOFTWARE IS THE PROPRIETARY  !
C  ! MATERIAL OF THE HEWLETT-PACKARD COMPANY.        !
C  !                                                 !
C  ! THIS SOURCE DATA SHALL BE USED SOLELY IN        !
C  ! CONJUCTION WITH ELECTRONIC COMPUTER SYSTEMS     !
C  ! SUPPLIED TO THE USER BY HEWLETT-PACKARD.        !
C  !                                                 !
C  ! THIS PROPRIETARY DATA SHALL NOT BE COPIED OR    !
C  ! OTHERWISE REPRODUCED WITHOUT THE PRIOR WRITTEN  !
C  ! CONSENT OF HEWLETT-PACKARD, EXCEPT THAT ONE     !
C  ! COPY MAY BE MADE AND RETAINED BY THE USER FOR   !
C  ! ARCHIVE PURPOSES.                               !
C  !                                                 !
C  ! THE USER SHALL NOT DISCLOSE THIS DATA TO ANY    !
C  ! THIRD PARTIES WITHOUT THE PRIOR WRITTEN CONSENT !
C  ! OF HEWLETT-PACKARD. IN ADDITION, THE USER SHALL !
C  ! USE AT LEAST THE SAME CARE AND SAFEGUARDS TO    !
C  ! PROTECT THIS DATA FROM UNAUTHORIZED USE OR      !
C  ! DISCLOSURE AS THE USER USES TO PROTECT ITS OWN  !
C  ! PROPRIETARY DATA.                               !
C  !                                                 !
C  !=================================================!
C 
C  GENERAL: 
C  -------- 
C 
C    THE FOLLOWING DEVICE SUBROUTINES ARE USED
C    TO PROGRAM THE HP 8018A DATA GENERATOR.
C 
C  HARDWARE REQUIRED: 
C  ------------------ 
C    A. HP 8018A WITH OPTION 001. 
C    B. HP59310B HPIB INTERFACE KIT.
C 
C         JUMPER POSITIONS: 
C          SW1-1 - 1
C          SW1-2 TO SW1-8 - 0 
C          SW2-1 - 0
C          SW2-2 - 0
C          SW2-3 - 0
C          SW2-4 - 0
C          SW2-5 - 1
C          SW2-6 - REN
C          SW2-7 - ICF
C          SW2-8 - CNX
C 
C    C. HP 21XX SERIES COMPUTER 
C 
C  BRANCH AND MNEMONIC TABLE ENTRIES: 
C  ---------------------------------- 
C 
C    DGNLD(I,I,I,IA,I),    OV=XX,   ENT=DGNLD,   FIL=%DGNLD 
C    DGNOP(I,I,I,I),       OV=XX,   ENT=DGNOP,   FIL=%DGNLD 
C     XX=OVERLAY NUMBER 
C  CONFIGURATION TABLE ENTRIES: 
C  ---------------------------- 
C 
C    R 69,1,1 
C    U1 
C       -1     DATA NOT LOADED FLAG 
C 
C 
C 
C------------------------------------------------------ 
C    CALLING SEQUENCE:
C      CALL DGNLD(IUNIT,MODE,IWORD,IBUFR,IBUFL) 
C 
C    WHERE: 
C 
C       IUNIT = UNIT #
C 
C       MODE  = MODE OF OPERATION FOR DATA LOADING: 
C           1 = LOAD STARTING AT A ADDRESS
C           2 = LOAD STARTING AT B ADDRESS
C 
C       IWORD = STARTING WORD ADDRESS (STARTS WITH 1).
C 
C       IBUFR = INTEGER DATA ARRAY LOADED WITH 16-BIT 
C               DATA WORDS FOR SERIAL OUTPUT. 
C 
C       IBUFL = COUNT OF INTEGER DATA WORDS.
C 
C------------------------------------------------------ 
      DIMENSION IERMS(5)
      DATA IDTN / 69 /
      DATA IERMS / 10,5,2HDG,2HNL,2HD  /
C 
      IERMS=10
C 
C  FIND STATION AND LU #'S
C   ISTN = STATION #
C   LU1 = HP 8018A LU 
C   LUIB = HPIB LU
C 
      ISTN=ISN(DUMMY) 
      LU1=LUDV(ISTN,IDTN,IUNIT) 
      LUIB=IBLU0(LU1) 
      IF(LU1 .LE. 0 .OR. LUIB .LE. 0)GOTO 800 
C 
C  CALL X SUB 
C 
      CALL XDGSU(LU1,LUIB,IERMS,IUNIT,MODE,IWORD,IBUFR,IBUFL,0) 
      IF(IERMS)800,20,800 
C 
C 
C  ERROR EXIT 
C 
800   CALL ERROR(IERMS,IERMS(2))
20    END 
      SUBROUTINE DGNOP(IUNIT,MODE,IWPF,IBPW)
     1,09580-16450 REV.2001 790803
C 
C------------------------------------------------------ 
C    CALLING SEQUENCE:
C     CALL DGNOP(IUNIT,MODE,IWPF,IBPW)
C   WHERE:
C     IUNIT =  THE UNIT NUMBER OF THE DEVICE. 
C     MODE  =  THE OPERATIONAL MODE OF THE DEVICE.
C        0  =  TURN OFF THE DATA OUTPUT.
C        1  =  TURN ON THE DATA OUTPUT. 
C     IWPF  =  THE NUMBER OF WORDS PER FRAME, RANGE 1 TO 99, OR 
C              THE NUMBER OF BITS PER FRAME, RANGE -3 TO -2047. 
C     IBPW  =  THE NUMBER OF BITS PER WORD, OR ZERO IF BITS PER FRAME 
C              IS SPECIFIED.
C 
C 
C------------------------------------------------------ 
C 
      DIMENSION IERMS(5)
      DATA IDTN / 69 /
      DATA IERMS / 10,5,2HDG,2HNO,2HP  /
C 
      IERMS=10
C 
C  FIND STATION AND LU #'S
C   ISTN = STATION #
C   LU1 = HP 8018A LU 
C   LUIB = HPIB LU
C 
      ISTN=ISN(DUMMY) 
      LU1=LUDV(ISTN,IDTN,IUNIT) 
      LUIB=IBLU0(LU1) 
      IF(LU1 .LE. 0 .OR. LUIB .LE. 0)GOTO 800 
C 
C  CALL X SUB 
C 
      CALL XDGSU(LU1,LUIB,IERMS,IUNIT,MODE,IWPF,IBPW,1,1) 
      IF(IERMS)800,20,800 
C 
C 
C  ERROR EXIT 
C 
800   CALL ERROR(IERMS,IERMS(2))
20    END 
C 
C-------------------------------------------------------------------
C 
      SUBROUTINE XDGSU(LU1,LUIB,IERMS,IUNIT,MODE,IWORD,IBUFR,IBUFL,IFUN)
     +,09580-16450 REV.2001 790803
      DIMENSION IERMS(5),IBUFR(1),IREG(2),IBUF(1) 
      DIMENSION JBUF(66)
      EQUIVALENCE (REG,IREG,IA),(IREG(2),IB)
C 
      DATA IDTN/69/,ISDC/2000B/,IGET/4000B/ 
      DATA LETRA/2H A/,LETRB/2H B/,LETRM/2H M/,LETRN/2H N/,IUNL /37400B/
      DATA IGET /4000B /,IZERO/2H00/
C 
C-------------------------------------------------------------------
C 
C 
C  THE PARAMETERS IN THE CALLING SEQUENCE HAVE THE FOLLOWING
C  MEANINGS:
C 
C     LU1  = LU # OF THE HP 8018A DATA GENERATOR. 
C     LUIB = LU # OF THE HPIB BUS INTERFACE.
C 
C     IERMS IS A FIVE WORD ARRAY WITH IERR(1) CONTAINING
C     THE ERROR CODE. 
C 
C        0 = NO ERROR 
C        1 = PARAMETER ERROR
C        3 = ATTEMPT WAS MADE TO TURN ON OUTPUT BEFORE BUFFER WAS LOADED. 
C 
C     ERROR MESSAGES THAT PERTAIN TO THE HPIB.
C 
C        9 = I/O CALL REJECTED
C       10 = LUIB OR LU1 = 0
C       12 = I/O DEVICE TIME OUT
C       13 = IFC DETECTED DURING I/O REQUEST
C       14 = SRQ ABORTED
C       15 = NON-EXISTENT ALARM PROGRAM 
C       16 = ILLEGAL CONTROL REQUEST
C       17 = EQT EXTENSION AREA FULL
C 
C     IERMS(2) = ERROR MNEMONIC CHARACTER COUNT 
C     IERMS(3) TO IERMS(5) = ERROR MNEMONIC 
C 
C     IUNIT = THE UNIT NUMBER OF THE 8018A. 
C 
C     MODE  = THE OPERATIONAL MODE FOR THE FUNCTION BEING PERFORMED:
C             SEE DESCRIPTION UNDER IFUN. 
C 
C     IWORD = THE WORD NUMBER INTO WHICH THE FIRST DATA WORD WILL BE
C             LOADED (RANGE: 1 TO 64) [IFUN = 0], 
C             OR, FOR [IFUN=1], 
C             THE NUMBER OF WORDS PER FRAME OF DATA (1 TO 99), OR 
C             THE NUMBER OF BITS PER FRAME OF DATA (-3 TO -2048). 
C 
C     IBUFR = THE OUTPUT DATA BUFFER (16 BIT BINARY WORDS IN AN ARRAY - 
C             BIT 15 OF WORD 1 GOES OUT FIRST) [IFUN = 0], OR 
C             THE NUMBER OF BITS PER WORD OF DATA (IGNORED IF IWORD IS
C             NEGATIVE) [IFUN = 1]. 
C 
C     IBUFL = THE NUMBER OF WORDS IN IBUFR [IGNORED IF IFUN = 1]. 
C 
C     IFUN  = THE FUNCTION OF THIS CALL:
C             0 = LOAD DATA INTO THE MEMORY.
C                 MODE = 1  START LOADING THE A MEMORY. 
C                 MODE = 2  START LOADING THE B MEMORY. 
C             1 = PROGRAM THE OUTPUT. 
C                 MODE = 0  TURN OFF OUTPUT.
C                           (ADDITIONAL PARAMETERS NOT USED.) 
C                 MODE = 1  TURN ON OUTPUT. 
C                           (REQUIRES FRAMING PARAMETERS.)
C 
C-------------------------------------------------------------------
C 
C 
C  RETRIEVE CONFIGURATION DATA
C 
      CALL TIM(IDTN,IUNIT,1,IBUF,1,IER) 
      IF(IER .NE. 0)RETURN
      IERMS = 1 
C 
C  CHECK THE INPUT PARAMETERS 
C 
C  CHECK THE FUNCTION 
C 
      IF(IFUN.EQ.0)GO TO 1000 
      IF(IFUN.EQ.1)GO TO 2000 
      GO TO 8000
C 
C  PROCESS SETUP CALL 
C 
1000  LETTR=0 
      IF(MODE.EQ.1)LETTR=LETRA
      IF(MODE.EQ.2)LETTR=LETRB
      IF(LETTR.EQ.0)GO TO 8000
      JBUF(1)=LETTR 
C 
C  CHECK FOR PROPER ADDRESS RANGE OF 1 TO 64
C  AND PROPER BUFFER LENGTH CONSISTENT WITH THE STARTING ADDRESS. 
C 
      IF(IWORD.LT.1)GO TO 8000
      IF(IBUFL.LT.1)GO TO 8000
C 
C  MAX LENGTH = STARTING ADDR. + BUFFER LENGTH + 1
C 
      IF((IWORD+IBUFL).GT.65)GO TO 8000 
C 
C  SINCE WE HAVE TO STUFF COMMANDS INTO THE DATA BUFFER, WE MUST USE
C  A PACKING BUFFER INSIDE THE SUBROUTINE.  THIS JBUF IS 66 WORDS LONG. 
C  THE BINARY DATA IS PUT INTO JBUF FOR TRANSMISSION. 
C 
C  GENERATE THE STARTING ADDRESS
C 
      JWORD=IWORD 
      NWRDS=IBUFL 
C 
C 
      JBLEN=IBUFL+2 
C 
C  CONVERT STARTING ADDRESS TO ASCII WITH LEADING ZERO. 
C 
      JBUF(2)=IOR(IZERO,KCVT(JWORD))
C 
C  REVERSE THE BYTE ORDER BECAUSE THE 8018 HANDLES THE
C  BYTES IN THE OPPOSITE ORDER, I.E., IT EXPECTS THE
C  LOW BYTE FIRST, AND THE COMPUTER SENDS THE HIGH BYTE 
C  FIRST. 
C 
      DO 1004 I=3,JBLEN 
      ILBYT=IBUFR(I-2)
      ISIGN=0 
      IF(ILBYT.GE.0)GO TO 1001
C 
C  PROCESS NEGATIVE SIGN
C 
      ISIGN=200B
      ILBYT=IAND(77777B,ILBYT)
1001  IHBYT=IAND(377B,ILBYT)*256
      ILBYT=ILBYT/256+ISIGN 
1004  JBUF(I)=IOR(ILBYT,IHBYT)
C 
C  SEND A REMOTE ENABLE 
C 
      CALL EXEC(100003B,1600B+LUIB) 
      GO TO 9000
70    CALL ABREG(IA,IB) 
      IF(IB.LT.0)GO TO 8500 
C 
C  SEND SDC 
C 
      CALL EXEC(100003B,LU1)
      GO TO 9000
75    CALL ABREG(IA,IB) 
      IF(IB.LT.0)GO TO 8500 
C 
C  SEND OUTPUT BUFFER 
C 
      CALL REIO(100002B,100B+LU1,JBUF,JBLEN)
      GO TO 9000
71    CALL ABREG(IA,IB) 
      IF(IB.LT.0)GO TO 8500 
C 
C  SEND UNLISTEN
C 
      CALL EXEC(100002B,10000B+LUIB,IDUMY,0,IUNL,-1)
      GO TO 9000
76    CALL ABREG(IA,IB) 
      IF(IB.LT.0)GO TO 8500 
C 
C 
C  CHECK TO SEE IF TIM FLAG HAS BEEN SET. 
C 
      IF(IBUF.EQ.1)GO TO 7000 
C 
C  IF THE DEVICE WAS LOADED, SET THE FLAG.
C 
      IBUF=1
      CALL TIM(IDTN,IUNIT,2,IBUF,1,IER) 
      IF(IER.NE.0)RETURN
      GO TO 7000
C 
C  PROGRAM THE OUTPUT 
C 
C  RETRIEVE THE CONFIGURATION DATA
C 
2000  CALL TIM(IDTN,IUNIT,1,IBUF,1,IER) 
      IF(IER.NE.0)RETURN
C 
C  IF DATA HAS NOT BEEN LOADED, REJECT THE OUTPUT CALL. 
C 
      IERMS=3 
      IF(IBUF.NE.1)GO TO 8000 
      IERMS=1 
C 
C  CHECK MODE FOR 0 OR 1
C 
      IF(MODE.EQ.0)GO TO 2015 
      IF(MODE.NE.1)GO TO 8000 
C 
C  CHECK INPUT PARAMETERS 
C 
      IF(IWORD.GT.0)GO TO 2005
      IF(IWORD.GT.-3.OR.IWORD.LT.-2048)GO TO 8000 
      JWORD=-IWORD/100
      LWORD=-IWORD-JWORD*100
      GO TO 2010
2005  IF(IWORD.GT.99)GO TO 8000 
      IF(IBUFR.LT.3.OR.IBUFR.GT.99)GO TO 8000 
      JWORD=IWORD 
      LWORD=IBUFR 
2010  JBUF(1)=LETRN 
      JBUF(2)=IOR(IZERO,KCVT(JWORD))
      JBUF(3)=LETRM 
      JBUF(4)=IOR(IZERO,KCVT(LWORD))
C 
C  REMOTE ENABLE
C 
2015  CALL EXEC(100003B,1600B+LUIB) 
      GOTO 9000 
72    CALL ABREG(IA,IB) 
      IF(IB .LT. 0) GOTO 8500 
C 
C  CHECK THE MODE AGAIN 
C 
      IF(MODE.EQ.0)GO TO 2020 
C 
C  SEND OUTPUT BUFFER 
C 
      CALL REIO(100002B,100B+LU1,JBUF,4)
      GOTO 9000 
73    CALL ABREG(IA,IB) 
      IF(IB .LT. 0) GOTO 8500 
C 
C  SEND A "GET" CONTROL FUNCTION
C 
      CALL EXEC(100002B,10000B+LU1,IDUMY,0,IGET,-1) 
      GO TO 9000
74    CALL ABREG(IA,IB) 
      IF(IB.LT.0)GO TO 8500 
      GO TO 7000
C 
C  SEND SDC FOR TURN OFF OUTPUT 
C 
2020  CALL EXEC(100003B,LU1)
      GO TO 9000
77    CALL ABREG(IA,IB) 
      IF(IB.LT.0)GO TO 8500 
C 
C 
C  GOOD EXIT
C 
7000  IERMS=0 
      GO TO 8000
C 
C  ERROR EXIT 
C 
8500  IERMS=IAND(IA,377B)+11
      GOTO 8000 
9000  IERMS=9 
8000  RETURN
      END 
      END$
                                                                                    