ASMB,R,L,Z,C
      HED <DRTEQ> DRT/EQT ADDRESS ROUTINE * (C) HEWLETT-PACKARD CO. 1977 *
      IFN 
      NAM DRTEQ,7 91740-16030 REV 1740 770314 
      XIF 
      IFZ 
      NAM DRTEQ,30 91740-16030 REV 1740 770330
      XIF 
      ENT DRTEQ 
      IFN 
      EXT .ENTR 
      XIF 
      IFZ 
      EXT .ENTP,$LIBR,$LIBX 
      XIF 
*    NAME:   DRTEQ
*    SOURCE: 91740-18030
*    RELOC:  91740-16030
*    PGMR:   C.C.H. [ 01/17/76 ]
* 
******************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1977.  ALL RIGHTS     *
*  * RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,      *
*  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT*
*  * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.       *
******************************************************************
* 
*  DRTEQ ACCEPTS A USER-SUPPLIED LOGICAL UNIT NUMBER, AND RETURNS 
*    TO THE CALLER, BOTH THE CONTENTS OF THE DEVICE REFERENCE TABLE 
*    ENTRY FOR THAT LOGICAL UNIT, AND THE ADDRESS OF THE FIRST WORD 
*    OF THE EQT ENTRY WHICH IS LINKED TO THE SPECIFIED LOGICAL UNIT.
* 
*  DRTEQ CALLING SEQUENCE:
* 
*     JSB DRTEQ 
*     DEF *+2  [ OR *+2+N  WHERE N= NUMBER OF OPTIONAL PARAMETERS <=2 ] 
*     DEF LU        ADDRESS OF LOGICAL UNIT NO. IN QUESTION.
*    [DEF DRTEN]   [OPTIONAL ADDRESS FOR RETURN OF DRT ENTRY CONTENTS.] 
*    [DEF EQTAD]   [OPTIONAL ADDRESS FOR RETURN OF EQT ENTRY LOCATION.] 
*  <NORMAL RETURN>  <A> =DRT ENTRY CONTENTS; <B> =EQT ADDRESS.
* 
*  FORTRAN CALLING SEQUENCE:  CALL DRTEQ(LU,IDRT,IEQAD)  OR  REG=DRTEQ(LU)
* 
*   NOTE: IN THE SPECIAL CASE OF LOGICAL UNIT NUMBERS WHICH ARE 
*         LINKED TO EQT #0 ("BIT BUCKET"), THE DRT ENTRY RETURNED 
*         TO 'DRTEN' & <A> WILL REFLECT THE ACTUAL CONTENTS; I.E.,
*         ANY SUBCHANNEL OR LU-LOCK BITS WILL BE PASSED TO THE CALLER.
*         SINCE THERE IS NO EQT ENTRY ASSOCIATED WITH THE LU, 
*         'EQTAD' & <B> WILL BOTH BE SET =0.
* 
*  DRTEQ ERROR PROCESSING:
* 
*    INVALID LOGICAL UNIT NUMBERS WILL BE INDICATED BY SETTING -1 
*      INTO THE RETURNED PARAMETERS-IF ANY, AND INTO BOTH <A>&<B>, UPON 
*      RETURN TO THE CALLER.
* 
* 
      SUP           [SUPPRESS EXTENDED LISTING] 
* 
LU    NOP           LOGICAL UNIT ADDRESS. 
P1    DEF A         OPTIONAL DRT ENTRY RETURN ADDRESS.
P2    DEF B         OPTIONAL EQT ADDRESS RETURN LOCATION. 
      SPC 1 
DRTEQ NOP           ENTRY/EXIT. 
      IFN 
      JSB .ENTR     OBTAIN DIRECT ADDRESSES 
      XIF 
      IFZ 
      JSB $LIBR     DEFINE THIS SUBROUTINE
      NOP             TO BE PRIVILEGED. 
      JSB .ENTP     PRIVILEGED: GET DIRECT ADDRESSES. 
      XIF 
      DEF LU        DEFINE PARAMETER STORAGE AREA.
      SPC 1 
*  RE-INITIALIZE CALLING-PARAMETER ADDRESSES TO POINT TO <A> & <B>, 
*    IN ORDER TO ALLOW USER TO CALL WITHOUT RETURN-DATA PARAMETERS. 
      SPC 1 
      DLD P1        GET PARAMETER ADDRESSES-IF ANY. 
      DST DRT       SAVE FOR DATA RETURN. 
      DLD REGDF     GET INITIAL PARAMETER DEFINITION. 
      DST P1        RE-INITIALIZE FOR NO PARAMETERS.
      SPC 1 
*  VERIFY THAT CALLER HAS REQUESTED DATA FOR A VALID LOGICAL UNIT NO. 
      SPC 1 
      LDA LU,I      GET THE USER SUPPLIED LU NUMBER.
      AND B77       ISOLATE THE PERTINENT BITS. 
      ADA M1        SUBTRACT ONE, FOR VALIDITY CHECKING.
      STA B         SAVE FOR DRT INDEXING.
      CMA,CLE       IF THE SPECIFIED LU NUMBER
      ADA LUMAX       IS NOT IN THE RANGE:
      SEZ,RSS           1<=LU<=LUMAX, THEN
      JMP ERROR           THE LU IS INVALID!
      SPC 1 
*  RETRIEVE THE CONTENTS OF THE DEVICE REFERENCE TABLE ENTRY. 
      SPC 1 
      ADB DRTA      FIND THE DEVICE REFERENCE TABLE ENTRY 
      LDA B,I         FOR A VALID LOGICAL UNIT NUMBER.
      STA AREG      SAVE THE DRT ENTRY FOR THE CALLER.
      STA LU        SAVE IT FOR RETURN IN <A>.
      AND B77       ISOLATE THE EQT ORDINAL.
      CLB           PREPARE TO RETURN EQT ADDRESS =0. 
      SZA,RSS       IF THE ORDINAL IS ZERO, 
      JMP ZERO         RETURN WITH EQT ADDRESS =0.
      SPC 1 
*  CALCULATE THE ADDRESS OF THE EQUIPMENT TABLE ENTRY LINKED TO THE LU. 
      SPC 1 
      ADA M1        ORDINAL-1 =RELATIVE EQT ENTRY ORDINAL.
      MPY D15       RELATIVE ENTRY*WORDS/ENTRY =OFFSET. 
      LDB A         GET EQT-ENTRY OFFSET IN <B>.
      ADB EQTA      FORM ABSOLUTE EQT-ENTRY ADDRESS IN <B>. 
ZERO  STB BREG      SAVE THE EQT ADDRESS FOR THE CALLER.
      JMP EXIT      GO TO RETURN THE REQUESTED INFORMATION. 
* 
      SKP 
*  PROCESS INVALID LOGICAL UNIT NUMBER ERRORS.
      SPC 1 
ERROR CCA           INVALID LOGICAL UNIT NUMBER.
      STA AREG      RETURN TO USER WITH BOTH PARAMETERS 
      STA BREG        AND <A>&<B> SET TO -1.
      SPC 1 
*  PASS DATA BACK TO THE CALLER AND THEN RETURN.
      SPC 1 
EXIT  LDA AREG      <A> = DRT ENTRY OR -1, IF ERROR.
      STA DRT,I     PASS DRT ENTRY TO CALLER, IF REQUESTED. 
      LDB BREG      <B> = EQT ADDRESS OR -1, IF ERROR.
      STB EQTAD,I   PASS EQT ADDRESS TO CALLER, IF REQUESTED. 
      IFN 
      JMP DRTEQ,I   RETURN:<A>=DRT OR -1;<B>=EQT ADD. OR -1.
      XIF 
      IFZ 
      JSB $LIBX     RETURN TO CALLER
      DEF DRTEQ       VIA PRIVILEGED PROCESSOR. 
      XIF 
      SPC 1 
*  CONSTANTS, POINTERS, AND STORAGE.
      SPC 1 
A     EQU 0 
B     EQU 1 
B77   OCT 77
EQTA  EQU 1650B     ADDRESS OF 1RST WORD OF EQUIPMENT TABLE.
DRTA  EQU 1652B     ADDRESS OF DEVICE REFERENCE TABLE.
LUMAX EQU 1653B     NUMBER OF VALID DRT ENTRIES.
M1    DEC -1
D15   DEC 15
AREG  NOP           TEMPORARY STORAGE: DRT ENTRY OR ERROR.
BREG  NOP           TEMPORARY STORAGE: EQT ADDR. OR ERROR.
DRT   NOP           DRT RETURN-PARAMETER ADDRESS. 
EQTAD NOP           EQT ADDR. RETURN-PARAMETER ADDRESS. 
REGDF OCT 0,1       REGISTER ADDRESSES FOR INITIALIZATION.
      SPC 1 
      END 
                                                                                                                                                                        