ASMB,R,L,C
      HED <D65CL> COMM. LINE INTERFACE * (C) HEWLETT-PACKARD CO. 1976 * 
      NAM D65CL,7 91700-16150 REV.A 760111
      ENT D65CL 
      EXT .ENTR,EXEC,DRTEQ,RNRQ,#RTRY 
*    NAME:   D65CL
*    SOURCE: 91700-18150
*    RELOC:  91700-16150
*    PGMR:   C.C.H. [01/11/76 ] 
* 
******************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1976.  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.       *
******************************************************************
* 
*  D65CL CONTROLS ACCESS TO THE COMMUNICATIONS LINE VIA THE RESOURCE
*   NUMBERING (RN) SCHEME OF RTE-II & RTE-III. TWO RN'S ARE CHECKED FOR 
*   AVAILABILITY, PRIOR TO ALLOWING ACCESS TO THE COMM. LINE. THE RN'S
*   ARE IDENTIFIED AS: PRN (<PROGL> RN) AND LRN (LINE RN).
* 
*  D65CL OPERATION: 
* 
*   1. GET PARAMETERS AND CHECK FOR VALID LOGICAL UNIT NUMBER.
*   2. ATTEMPT TO LOCK/CLEAR PRN WITH WAIT. 
*     A. IF PRN IS LOCKED, SLAVE ACCESS IS REJECTED: "DS02" ERROR.
*     B. IF PRN IS LOCKED, MASTER ACCESS AWAITS <PROGL> COMPLETION. 
*     C. IF AVAILABLE, PROCEED WITH PRN CLEARED.
*   3. IF CONTROL REQ. OR MODE =DATA REQUEST, GO TO 4; ELSE, GO TO 6.C. 
*   4. ATTEMPT TO LOCK LRN; DON'T WAIT 'TIL AVAILABLE.
*   5. CALL DVR65 FOR I/O TRANSFER VIA SUPPLIED LU. 
*     A. IF GOOD TRANSFER, RETURN TO USER; ELSE,
*   6. CHECK REJECT REASON: 
*     A. IF REMOTE BUSY, WAIT 1-SECOND AND RETRY--GO TO 5.
*     B. IF RETRIES EXHAUSTED: "DS08" ERROR.
*     C. IF DRIVER BUSY, DO LRN LOCK W/WAIT. WHEN LRN IS AVAILABLE, 
*        RE-CALL DRIVER (GO TO 4.). 
*     D. IF ERROR REJECT, RETURN WITH ASCII ERROR CODE IN <A>&<B>.
* 
*   D65CL CALLING SEQUENCE: 
* 
*     JSB D65CL 
*     DEF *+7  [ OR *+8 ] 
*     DEF RCODE     READ/WRITE/CONTROL (1/2/3) REQUEST CODE 
*     DEF CONWD     CONTROL WORD: Z/MODE/LU OF COMM. LINE.
*     DEF RQBUF     REQUEST OR DATA BUFFER ADDRESS. 
*     DEF RQLEN     REQUEST OR DATA BUFFER LENGTH.
*     DEF DABUF     DATA BUFFER ADDRESS OR DUMMY PARAMETER. 
*     DEF DALEN     DATA BUFFER LENGTH OR DUMMY PARAMETER.
*   [ DEF EXTAD ]   [ OPTIONAL ADDRESS OF EQT EXTENSION ] 
*  <ERROR RETURN>   RETURN HERE UPON DETECTION OF ERROR.
*  <NORMAL RETURN>  NORMAL COMPLETION RETURN HERE.
* 
*    NOTE: LRN & PRN ARE OBTAINED FROM THE FIRST TWO WORDS OF THE EXTENSION 
*          TO THE EQT ENTRY LINKED TO THE USER-SPECIFIED LOGICAL UNIT NO. 
* 
      SKP 
* 
*    D65CL ERROR MESSAGES:
*      ( RETURNED TO CALLER IN <A>&<B> AT <ERROR RETURN> LOCATION ) 
* 
*      "DS01" - DVR65 DETECTED AN ERROR CONDITION (PARITY ERROR, ETC.)
* 
*      "DS02" - <PROGL> HAS PREEMPTED COMPLETION OF THE CALLER'S REQUEST. 
* 
*      "DS04" - LOGICAL UNIT INVALID, OR NOT ENTERED IN CLCT TABLE. 
* 
*      "DS08" - BUSY-REJECT FROM REMOTE--RETRIES EXHAUSTED. 
* 
*      "IOXX" \ 
*              - SYSTEM LEVEL ERRORS, DETECTED BY RTE.
*      "RNXX" / 
* 
      SKP 
RCODE NOP           REQUEST CODE ADDRESS. 
CONWD NOP           CONTROL WORD ADDRESS. 
RQBUF NOP           ADDRESS OF REQUEST OR DATA BUFFER.
RQLEN NOP           ADDRESS OF REQUEST OR DATA BUFFER SIZE. 
DABUF NOP           ADDRESS OF REQUEST OR DATA BUFFER.
DALEN NOP           ADDRESS OF REQUEST OR DATA BUFFER SIZE. 
EXTAD NOP           OPTIONAL ADDRESS OF EQT EXTENSION.
      SUP           [SUPPRESS EXTENDED LISTING] 
D65CL NOP           ENTRY/EXIT
      JSB .ENTR     OBTAIN DIRECT ADDRESSES 
      DEF RCODE       FOR PARAMETERS & RETURN POINT.
      SPC 1 
      LDA RCODE,I   GET REQUEST CODE AND ABORT FLAG (BIT#15). 
      CCE,SSA,RSS   TEST SIGN & PREPARE TO SET IT.
      RAL,ERA       SET SIGN FOR ERROR RETURN.
      STA RCODE     SAVE REQUEST CODE, LOCALLY. 
* 
      CLA 
      LDB EXTAD     GET EQT EXTENSION PARAMETER--IF ANY.
      STA EXTAD     CLEAR PARAMETER FOR NEXT ACCESS.
      SZB           WAS THE EXTENSION PARAMETER SUPPLIED? 
      JMP GETX        YES. GO TO GET THE EXTENSION ADDRESS. 
      SPC 1 
*  CHECK FOR VALID LU AND CALCULATE EQT EXTENSION ADDRESS.
      SPC 1 
      JSB DRTEQ     GO TO FIND EQT ADDRESS. 
      DEF *+2 
      DEF CONWD,I   RETURN INFO FOR THIS LOGICAL UNIT.
      CPA M1        IF INVALID LU DETECTED, 
      JMP ABOR4     * ERROR: "DS04" - INFORM THE CALLER.
* 
      ADB D4        FORM EQT5 ADDRESS FROM EQT FWA IN <B>.
      LDA B,I       GET THE CONTENTS OF EQT5. 
      AND EQMSK     ISOLATE THE EQUIPMENT TYPE CODE.
      CPA TYP65     IS THIS LU LINKED TO DVR65? 
      RSS             YES, CONTINUE PROCESSING. 
      JMP ABOR4       NO. * ERROR: "DS04" - INVALID LU! 
* 
      ADB D8        COMPUTE ADDRESS OF EQT13. 
GETX  LDB B,I       GET A DIRECT
      RBL,CLE,SLB,ERB   ADDRESS FOR THE 
      JMP *-2               EQT EXTENSION.
      SPC 1 
*  LOCATE RESOURCE NUMBERS FOR THE SPECIFIED LOGICAL UNIT.
      SPC 1 
      LDA B,I       GET THE LINE-CONTROL RESOURCE NUMBER, 
      STA LRN         AND SAVE IT.
      INB           INDEX TO THE PRN ENTRY. 
      LDA B,I       GET THE <PROGL> RESOURCE NUMBER,
      STA PRN         AND SAVE IT.
      LDA LCGW      INITIALIZE 'PRNCW' TO ACCOMMODATE 
      STA PRNCW       CORE-RESIDENT COPIES OF <D65CL>.
* 
      LDA #RTRY     GET NEGATIVE NUMBER OF RETRIES. 
      STA RTCNT     SAVE FOR BUSY-RETRY PROCESSING. 
* 
      SKP 
*  DETERMINE WHETHER <PROGL> IS USING THE LINE BY DOING A LOCK CLEAR ON THE 
*   <PROGL> RESOURCE NUMBER. IF <PROGL> HAS THE LINE, SLAVE ACCESS IS 
*    REJECTED: "DS02"; MASTER ACCESS MUST WAIT FOR <PROGL> TO COMPLETE. 
      SPC 1 
PWAIT LDA PRNCW     GET THE 'PRN' CONTROL WORD. 
      XOR SIGN      ADD OR DELETE THE NO-WAIT BIT(#15). 
      STA PRNCW     RESTORE THE CONTROL WORD. 
* 
      JSB RNRQ      GO TO CHECK PRN AVAILABILITY. 
      DEF *+4 
      DEF PRNCW     SPECIFY GLOBAL LOCK/CLEAR/NO-ABORT. 
      DEF PRN       ADDRESS OF <PROGL> RN.
      DEF TEMP      RETURN STATUS.
      JMP ABORX     GO PROCESS RN ERROR, IF ANY.
* 
      LDA TEMP      GET THE STATUS OF 'PRN'.
      CPA D1        IF IT IS CLEAR, 
      JMP REQCK       THEN CONTINUE THE PROCESSING. 
      CPA D2        IF IT WAS LOCALLY LOCKED TO THE CALLER, 
      JMP ABOR2       THIS IS <PROGL>--ACCESS DENIED! 
* 
      LDA CONWD,I   GET THE CONTROL WORD. 
      AND B1000     ISOLATE THE MASTER-REQUEST BIT(#9). 
      SZA           IF THIS IS A MASTER-REQUEST,
      JMP PWAIT       GO TO AWAIT <PROGL> COMPLETION; 
      JMP ABOR2         ELSE, ABORT SLAVE REQUESTS: "DS02"! 
      SPC 1 
*  EXAMINE SPECIFIED DRIVER MODE. ONLY DATA & CONTROL REQUESTS WILL BE
*   ALLOWED TO PROCEED TO THE DRIVER WITHOUT WAITING FOR LRN AVAILABILITY.
      SPC 1 
REQCK LDA RCODE     GET THE REQUEST CODE WORD 
      AND B77       ISOLATE THE REQUEST CODE. 
      CPA D3        IF IT IS A CONTROL REQUEST, 
      JMP LRNLK       DO NOT WAIT FOR LRN AVAILABILITY. 
      LDA CONWD,I   GET THE CONTROL WORD. 
      AND B700      ISOLATE THE DRIVER MODE OF OPERATION. 
      CPA B300      IF THIS IS A DATA-ONLY REQUEST, 
      RSS             PROCEED TO MAKE THE DRIVER CALL; ELSE,
      JMP LOCKW         GO TO CHECK AVAILABILITY OF LRN.
      SPC 1 
*  ATTEMPT TO LOCK THE LINE RN, BUT DO NOT WAIT, IF ALREADY LOCKED. 
*   THE DRIVER WILL DETERMINE VALIDITY OF ACCESS FOR THIS REQUEST.
*   WE'LL BE FORCED TO WAIT AT A LATER TIME, IF DVR65 IS BUSY.
      SPC 1 
LRNLK JSB RNRQ      ATEMPT TO LOCK LRN--DON'T WAIT. 
      DEF *+4 
      DEF LGNW      SPECIFY GLOBAL LOCK/NO WAIT/NO ABORT. 
      DEF LRN       ADDRESS OF LINE RN. 
      DEF TEMP      RETURN STATUS (NOT USED). 
      JMP ABORX     PROCESS RN ERROR, IF ANY. 
* 
      SKP 
      SPC 1 
*  CALL THE DRIVER TO PERFORM THE REQUEST.
      SPC 1 
CALLD JSB EXEC      CALL RTE TO DO THE I/O. 
      DEF *+7       RETURN ADDRESS:ERROR; ELSE, *+8:NORMAL. 
      DEF RCODE     REQUEST CODE ADDRESS. 
      DEF CONWD,I   CONTROL WORD. 
      DEF RQBUF,I   REQUEST OR DATA BUFFER ADDRESS. 
      DEF RQLEN,I   REQUEST OR DATA BUFFER LENGTH.
      DEF DABUF,I   DATA BUFFER ADDRESS OR DUMMY PARAMETER. 
      DEF DALEN,I   DATA BUFFER LENGTH OR DUMMY PARAMETER.
      JMP ABORX     GO TO PROCESS OP-SYSTEM ERROR.
      STA TEMP      SAVE <A>: EQT5  STATUS FOR CALLER.
      STB TEMP+1    SAVE <B>: EQT12 STATUS FOR CALLER.
      SPC 1 
*  EXAMINE THE RETURN-STATUS FROM THE DRIVER. 
      SPC 1 
      SLA,RAR       WAS THE TRANSFER SUCCESSFUL?
      JMP NEXIT       YES, GO PREPARE FOR NORMAL EXIT.
      SWP           EXCHANGE <A>&<B> FOR BOOLEAN OPERATIONS.
      AND B40       ISOLATE EQT12 BIT#5 (REMOTE BUSY).
      CLE,ERB       MOVE BUSY-REJECT BIT(EQT5 #1) TO <E>. 
      SEZ,SZA,RSS   BUSY-REJECT/REMOTE-BUSY OR BOTH?
      JMP ABOR1       NEITHER--DRIVER ERROR!
      SEZ,RSS       WAS THE REMOTE SYSTEM BUSY? 
      JMP DELAY       YES. GO TO WAIT AWHILE & RETRY. 
      SZA             NO. SIMULTANEOUS REQUESTS DETECTED? 
      JMP CALLD         YES. LET DVR65 SOLVE THE PROBLEM. 
      SPC 1 
*  BUSY-REJECT: THE DRIVER DETERMINED THAT A NEW REQUEST COULD NOT BE 
*   PROCESSED AT THIS TIME. THE USER MUST WAIT FOR AVAILABILITY OF THE LRN. 
      SPC 1 
LOCKW JSB RNRQ      LOCK THE LRN--WAIT FOR AVAILABILITY.
      DEF *+4 
      DEF LGW       SPECIFY GLOBAL LOCK/WITH WAIT/NO ABORT. 
      DEF LRN       ADDRESS OF LRN. 
      DEF TEMP      RETURN STATUS (NOT USED). 
      JMP ABORX     PROCESS RN ERROR CONDITION. 
      JMP CALLD     RN LOCKED. GO CALL THE DRIVER.
      SPC 1 
*  PREPARE FOR NORMAL RETURN TO THE USER
      SPC 1 
NEXIT ISZ D65CL     SET EXIT-POINTER FOR <NORMAL RETURN>. 
      DLD TEMP      RETURN WITH <A>&<B> FROM DVR65. 
      JMP D65CL,I   RETURN TO THE USER. 
      SPC 1 
*  ERROR PROCESSING SECTION.
      SPC 1 
ABOR8 LDB "08"      REMOTE-BUSY/RETRIES EXHAUSTED: "DS08".
      JMP GETDS     GO TO GET "DS" PORTION OF ERROR CODE. 
ABOR4 LDB "04"      INVALID LOGICAL UNIT ERROR: "DS04". 
      JMP GETDS     GO TO GET FIRST HALF OF MESSAGE.
ABOR2 LDB "02"      SLAVE-TRANSACTION INTERRUPTED: "DS02".
      RSS           GO TO GET FIRST HALF OF MESSAGE.
ABOR1 LDB "01"      ABORTIVE DRIVER ERROR: "DS01".
GETDS LDA "DS"      GET FIRST HALF OF ERROR MESSAGE.
ABORX JMP D65CL,I   RETURN TO THE USER. 
      SKP 
*  WAIT--IN ORDER TO ALLOW TIME FOR THE REMOTE TO CLEAR TABLE SPACE.
      SPC 1 
DELAY JSB EXEC      GO TO THE RTE 'EXEC'
      DEF *+6        IN ORDER TO
      DEF D12         PLACE THIS PROGRAM
      DEF ZERO         IN THE TIME LIST 
      DEF D1            FOR A 1-SECOND DELAY, 
      DEF ZERO           WHILE WAITING FOR
      DEF DM100           TABLE SPACE AT REMOTE SYSTEM. 
* 
      ISZ RTCNT     MAXIMUM NO. OF RETRIES BEEN EXECUTED? 
      JMP CALLD       NO. GO TO TRY AGAIN.
      JMP ABOR8       YES. INFORM CALLER OF THE PROBLEM.
      SPC 2 
*  POINTER AND CONSTANT STORAGE AREA. 
      SPC 1 
B     EQU 1 
B40   OCT 40
B77   OCT 77
B300  OCT 300 
B700  OCT 700 
B1000 OCT 1000
D1    DEC 1 
D2    DEC 2 
D3    DEC 3 
D4    DEC 4 
D8    DEC 8 
D12   DEC 12
DM100 DEC -100
EQMSK OCT 37400     EQT5 EQUIPMENT TYPE CODE MASK.
LCGW  OCT 40006     GLOBAL RN LOCK/CLEAR/WAIT/NO ABORT. 
LGNW  OCT 140002    GLOBAL RN LOCK/NO WAIT/NO ABORT.
LGW   OCT 40002     GLOBAL RN LOCK/WAIT/NO ABORT. 
LRN   NOP           LINE CONTROL RESOURCE NUMBER. 
M1    OCT -1
PRN   NOP           <PROGL> RESOURCE NUMBER.
PRNCW NOP           <PROGL> RN-CHECK CONTROL WORD.
RTCNT NOP           BUSY-REJECT RETRY COUNTER.
SIGN  OCT 100000
TEMP  OCT 0,0       TEMPORARY STORAGE.
TYP65 OCT 32400     EQUIPMENT TYPE CODE 65 FOR DVR65. 
ZERO  OCT 0 
"01"  ASC 1,01
"02"  ASC 1,02
"04"  ASC 1,04
"08"  ASC 1,08
"DS"  ASC 1,DS
      SPC 1 
      END 
        