ASMB,R,Q,C,N
      IFN 
      HED "VIRTUAL TERMINAL" DRIVER FOR RTE-IV/M-III
      NAM DVV00,0 91750-16109 REV.2013 800416 (4/M3)
      XIF 
      IFZ 
      HED "VIRTUAL TERMINAL" DRIVER FOR RTE-M-II
      NAM DVV00,0 91750-16110 REV.2013 800416 (M2)
      XIF 
* 
*     USE "N" OPTION FOR DMS RTES: RTE-IV, RTE-M-III
*     USE "Z" OPTION FOR NON-DMS RTES: RTE-M-II 
* 
      SPC 2 
******************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980.  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.       *
******************************************************************
      SPC 2 
*************************************************************** 
* 
*                   "VIRTUAL TERMINAL" DRIVER FOR DS/1000 
*                   SIMULATES DVR00/DVR05 TO LOCAL SYSTEM.  ALL I/O REQUESTS
*                   SENT TO PROGRAM "LUMAP" FOR CONVERSION TO REMOTE 'EXEC' 
*                   CALLS.
* 
* 
      IFN 
*    NAME: DVV00
*  SOURCE: 91750-18109
*   RELOC: 91750-16109
*    PGMR: JOHN LAMPING 
      XIF 
      IFZ 
*    NAME: DVV00
*  SOURCE: 91750-18109
*   RELOC: 91750-18110
*    PGMR: JOHN LAMPING 
      XIF 
* 
*    WRITTEN BY LYLE WEIMAN [MARCH 1979]
*    MODIFIED BY JOHN LAMPING [OCTOBER 1979]
* 
*************************************************************** 
      SPC 3 
      ENT IV00,CV00 
      EXT .MVW,$LIST,#SPLU
      IFN 
      EXT $OPSY 
      XIF 
      SPC 2 
* 
*     IN THIS DRIVER, THE TERM "I/O MAP" IS USED TO REFER TO THE MAPPING
*     BETWEEN LUS AT THE SOURCE NODE, AND DESTINATION NODE AND LU NUMBERS.
*     IT HAS NOTHING TO DO WITH "SESSION LU MAPPING", ALTHOUGH IT CAN 
*     OPERATE WITHIN THAT CONTEXT (PROVIDING TWO LEVELS OF I/O MAPPING, 
*     WHICH CAN PERHAPS BE CONFUSING).  TO ALLAY THIS CONFUSION, THE
*     TERM WILL IS ONLY USED HERE WITHIN THE FORMER CONTEXT.
* 
*     THE "MAPPING" FROM AN LU IN THE SOURCE SYSTEM TO A DESTINATION NODE 
*     AND LU NUMBER IS PERFORMED BY THE DRIVER, BUT THE ENTIRE OPERATION
*     REQUIRES ASSISTANCE FROM PROGRAMS "LUQUE" AND "LUMAP".
      SPC 5 
*     CALLING SEQUENCES (ORDINARY I/O): 
* 
*     (NOTE: PRIOR TO ESTABLISHING A MAP FOR AN LU, DVV00 COMPLETES 
*     ALL I/O REQUESTS TO THAT LU WITHOUT TRANSFERRING ANY DATA, I.E.,
*     IT IGNORES ALL I/O REQUESTS). 
* 
      SPC 2 
*     "READ" OR "WRITE" DATA
      SPC 1 
*     JSB EXEC
*     DEF *+5,6 OR 7
*     DEF RCODE     OCT 1 OR 2
*     DEF CONWD     LU  (ANY LU EXCEPT "RESERVED" LU) 
*                   ANY SUBFUNCTION BITS EXCEPT "Z" BIT MAY BE SET
*     DEF DBUF      DATA BUFFER ADDRESS 
*     DEF DBUFL     DATA BUFFER LENGTH (+ WORDS OR - CHARS) 
*                   LIMIT: 512 WORDS, THE LENGTH OF THE BUFFER IN 'LUMAP' 
*    [DEF IPRM1]    1ST OPTIONAL PARAMETER
*    [DEF IPRM2]    2ND OPTIONAL PARAMETER
      SPC 2 
*     THE FOLLOWING ERROR CONDITIONS RESULT IN I/O REJECT:
* 
*     1) DOUBLE-BUFFER ("Z") BIT SET
*     2) ORDINARY I/O ISSUED UPON "RESERVED" LU 
*     3) BUFFER LENGTH >512 WORDS 
* 
      SPC 2 
*     CONTROL REQUESTS: 
* 
*     JSB EXEC
*     DEF *+3 OR 4
*     DEF D3
*     DEF CONWD     MAY SET ANY SUBFUNCTION BITS
*     [DEF <OPTIONAL PARAMETER>]
* 
*     I/O REJECT IF:
* 
*     1) "RESERVED" LU IS USED
* 
*     UPON RETURN, (A)-REGISTER CONTAINS STATUS INFORMATION AS
*     RETURNED BY ACTUAL DRIVER AT DESTINATION NODE.
*     (B)-REGISTER CONTAINS ACTUAL DRIVER-SUPPLIED TRANSMISSION LOG.
* 
      SKP 
*     CALLING SEQUENCES ON "RESERVED" LU: 
* 
*     NOTE: THE "RESERVED LU" IS MEANT TO BE USED ONLY FOR COMMUNICATION
*       BETWEEN DVV00 AND PROGRAMS 'LUQUE' AND 'LUMAP'. 
* 
*     THE FIRST TIME THE DRIVER IS ENTERED, IT WILL SET #SPLU TO THE
*     FIRST LU POINTING TO A EQT WITH A ZERO-LENGTH EXTENSION 
*     THIS LU BECOMES THE RESERVED LU.
* 
*     SUB-FUNCTION SUMMARY: 
*     SUB-      ACTION
*     FUNCTION
*     --------  ----------------------------- 
*  CONTROL CALLS: 
* 
*     35        OBTAIN SYSTEM ATTENTION 
*     36        RE-TRY ORIGINAL REQUEST AFTER 1 SEC 
*     37        'STOP': ERROR ON ORIGINAL REQUEST.  "COMPLETE" ORIGINAL 
*               REQUEST WITH I/O TIME-OUT INDICATION. 
* 
*     READ & WRITE CALLS: 
* 
*     36        (WRITE) SET UP I/O MAP
*     36        (READ)  RETURN I/O MAP INFORMATION ON SPECIFIED LU
*     37        (READ)  SEND REQUEST INFO TO 'LUQUE'
*     37        (WRITE) SEND REPLY TO ORIGINAL REQUESTOR
* 
*   ALL OTHER CODES IGNORED 
* 
* 
*     TO SET UP THE I/O-MAPPING FUNCTION: 
* 
*     JSB EXEC
*     DEF *+5 
*     DEF D2
*     DEF CONWD     "RESERVED" LU + 3600B 
*     DEF BUFFR     SET-UP BUFFER (SEE BELOW) 
*     DEF D4
* 
*     SET-UP BUFFER FORMAT: 
* 
*     1 SECURITY CODE (25834) 
* 
*     2 "SOURCE" LU NUMBER (IF -1 THEN DRIVER WILL FIND AN UNUSED LU
*        FROM THE SET OF LUS WHICH "POINT" TO THIS DRIVER--I.E., ONE
*        WHICH DOES NOT ALREADY HAVE AN I/O MAP CURRENTLY SET UP, AND 
*        EXCLUDING THE "RESERVED" LU--AND RETURN THAT LU IN THE B-
*        REGISTER, AND SET UP THE I/O MAP FOR IT ACCORDING TO THE 
*        SPECIFICATIONS IN THE REMAINDER OF THIS BUFFER. ZERO IS
*        RETURNED IF NO LU CAN BE FOUND). 
* 
*     3 DESTINATION LU NUMBER 
*         SET BIT 15 IF MESSAGE HEADER IS TO BE APPENDED ("WRITES" ONLY)
*         SET BIT 14 IF "PROMPT" IS TO BE APPENDED ("READS" ONLY) 
*           THE TWO FUNCTIONS MAY BE COMBINED.
* 
*     4 DESTINATION NODE NUMBER 
* 
*     THE FOLLOWING ERROR CONDITIONS RESULT IN AN I/O REJECT: 
* 
*     1) SECURITY CODE SPECIFIED DOES NOT MATCH 25834 
* 
*     2) SOURCE LU INVALID (NOT IN RANGE 1 TO $LUT#)
* 
*     3) SOURCE LU SPECIFIED IS SAME AS "RESERVED" LU, OR POINTS TO 
*        SAME EQT 
* 
*     4) SOURCE LU DOES NOT "POINT" TO DVV00
* 
*     5) EQT EXTENSION NOT LARGE ENOUGH TO HOLD MAP 
* 
      SPC 2 
*     TO RETURN I/O MAP INFORMATION ON A SPECIFIED LU:
* 
*     JSB EXEC
*     DEF *+6 
*     DEF D1        "READ"
*     DEF CONWD     "RESERVED" LU + 3600B 
*     DEF BUFFR     RETURN DATA BUFFER
*     DEF D2        RETURNS TWO DATA WORDS
*     DEF LU        LOGICAL UNIT WHOSE I/O MAP IS TO BE RETURNED. 
* 
*     UPON RETURN:
*     BUFFR(1) = DESTINATION NODE NUMBER (-1 IF LU DOES NOT 
*                "POINT" TO THIS DRIVER)
*     BUFFR(2) = DESTINATION NODE LU NUMBER, OR ZERO IF MAP ENTRY IS EMPTY. 
*                THE LU NUMBER WILL HAVE BITS 15 AND 14 SET AS SPECIFIED
*                IN THE SETUP CALL
      SKP 
*     THE NORMAL SEQUENCE OF EVENTS IS SUMMARIZED BELOW:
* 
*     1) ORDINARY PROGRAM (ONE WHICH HAS NOT BEEN SPECIFICALLY MODIFIED 
*        FOR REMOTE-EXEC I/O) CALLS EXEC FOR I/O, SPECIFYING AN LU WHICH
*        "POINTS" TO THIS DRIVER.  THE REAL-TIME I/O CONTROL
*        MODULE CALLS THIS DRIVER. THE REQUEST IS ASSIGNED A SEQUENCE 
*        NUMBER BY THE DRIVER.
* 
*     2) THE DRIVER SCHEDULES "LUQUE", PASSING IT THE ADDRESS OF THE
*        ORIGINAL REQUEST'S EQT, LENGTH, DESTINATION NODE NUMBER, AND 
*        AND SEQUENCE NUMBER. 
* 
*     3) LUQUE ISSUES A CLASS-I/O "READ" CALL, SPECIFYING A "RESERVED"
*        LU (THIS ONE IS NOT FOR USE BY "ORDINARY" PROGRAMS, AND THUS 
*        IS NOT NORMALLY "BUSY" AT THIS TIME).  THE ADDRESS OF THE
*        ORIGINAL REQUEST EQT IS PASSED BACK TO THE DRIVER IN ONE 
*        OF THE I/O PARAMETERS.  THE CLASS NUMBER USED IS THE ONE 
*        ON WHICH "LUMAP" IS SUSPENDED. 
* 
*     4) THE DRIVER LOCATES THE ORIGINAL REQUEST'S EQT VIA THE I/O PARAMETER. 
*        IT COPIES THE ORIGINAL REQUEST I/O PARAMETERS (ACTUAL DEVICE NODE
*        AND LU NUMBER, SUB-FUNCTION, ETC.), AND DATA IN THE CASE THAT THE
*        ORIGINAL REQUEST WAS A "WRITE", INTO THE BUFFER IN SYSTEM AVAILABLE
*        MEMORY PROVIDED BY THE LUQUE'S CLASS-I/O REQUEST.
*        THE DRIVER RETURNS I/O COMPLETION STATUS ON THIS REQUEST,
*        CAUSING "LUMAP" TO BE SCHEDULED.  AND CHANGES THE TIMEOUT
*        ON THE ORIGINAL REQUEST TO BE SET TO THE MASTER TIMEOUT. 
* 
*     5) LUMAP DETERMINES THAT THIS IS A NEW REQUEST, ENTERS INFORMATION
*        IN A TABLE IT KEEPS, AND BUILDS A REMOTE-EXEC CALL FROM THE
*        INFORMATION SUPPLIED.  RATHER THAN WAIT FOR THE REPLY, AS DO 
*        OTHER REMOTE-EXEC CALLS, IT RETURNS TO ITS "GET" TO AWAIT THE
*        NEXT NEW REQUEST, OR THE REPLY.  THE SAME CLASS NUMBER IS USED 
*        FOR BOTH.
* 
*     6) AT THE DESTINATION NODE, "EXECM" PERFORMS THE REQUESTED I/O
*        OPERATION AND RETURNS THE REPLY. 
* 
*     7) WHEN THE REPLY ARRIVES, GRPM RE-QUEUES IT TO LUMAP'S CLASS, AS IT
*        RE-QUEUES ALL REPLIES TO THE APPROPRIATE MASTER PROGRAM. 
*        LUMAP DETERMINES THE PROPER ORIGINAL REQUESTOR FROM INFORMATION
*        IN ITS INTERNAL TABLE, AND MAKES A CLASS-I/O "WRITE" CALL TO THIS
*        DRIVER, SPECIFYING THE "RESERVED" LU AND THE ORIGINAL REQUEST'S
*        EQT ADDRESS, AND DATA IN THE CASE WHERE THE ORIGINAL REQUEST 
*        HAD BEEN A "READ".  THE SAME CLASS NUMBER IS USED FOR THIS, ALSO.
*        IT THEN RETURNS TO ITS "GET".
* 
*     8) THE DRIVER LOCATES THE ORIGINAL REQUEST EQT.  IF THE ORIGINAL
*        REQUEST HAD BEEN A "READ", THEN DATA IS TRANSFERRED BACK TO
*        THE ORIGINAL PROGRAM'S BUFFER.  THE ACTUAL DEVICE TYPE AND 
*        STATUS (FROM EQT 5/DVT 6) RETURNED BY THE ACTUAL DRIVER
*        USED ARE STORED IN THE ORIGINAL REQUEST'S EQT WORD 6.
*        NOTE THAT THIS FEATURE IS INTENDED TO BE USED SO THAT AN "INNOCUOUS" 
*        I/O REQUEST BE MADE AFTER THE I/O MAP IS SET UP, PRIOR TO SCHEDULING 
*        ANY PROGRAMS WHICH USE THAT LU.  THE RETURNED STATUS, POSTED IN
*        THE EQT, SOLVES THE PROBLEM WHICH WOULD OTHERWISE EXIST BY THE 
*        POSSIBILITY THAT THE PROGRAM MAY ISSUE AN EXEC (13) I/O STATUS 
*        REQUEST TO A MAPPED LU, WHICH IS HANDLED ENTIRELY BY RTIOL,
*        WITHOUT ANY ASSISTANCE FROM THE DRIVER.  THUS, THE CORRECT 
*        DEVICE TYPE AND STATUS WILL BE OBTAINED. 
* 
*     9) THE DRIVER DOES A I/O COMPLETION RETURN ON BOTH THE RESERVED EQT 
*        AND THE ORIGINAL REQUEST EQT.
* 
*     10) LUMAP IS RE-SCHEDULED TO PROCESS THE I/O COMPLETION OF ITS "WRITE"
*         REQUEST.  IT SIMPLY GOES BACK TO ITS "GET". 
* 
*     AT STEPS 4 AND 9 ABOVE, WHERE THE DRIVER NEEDS TO TAKE ACTION ON TWO
*     EQT'S AT THE SAME TIME, THE MECHANISM IS AS FOLLOWS.  IT SETS THE 
*     CONTINUATION CODE IN THE ORIGINAL REQUEST'S EQT TO THE ACTION IT
*     WANTS TO PERFORM, AND SETS A ONE TICK TIMEOUT ON THAT EQT.
*     WHEN THE CLOCK TICKS, IT WILL BE RE-ENTERED ON THAT EQT AND 
*     THE APPROPRIATE ACTION. 
      SPC 2 
*     THE SEPARATE CALLS TO THE DRIVER MENTIONED ABOVE ARE DESCRIBED
*     BELOW IN MORE DETAIL. 
      SPC 2 
*     A "READ" REQUEST IS ISSUED BY 'LUQUE' (SCHEDULED BY THIS DRIVER 
*     WHENEVER AN I/O REQUEST IS MADE ON ANY LU EXCEPT THE "RESERVED" ONE). 
*     THE REQUEST LENGTH MUST BE AT LEAST 9 WORDS (PLUS USER DATA LENGTH, 
*     IN THE CASE OF A "WRITE" REQUEST).
* 
*     JSB EXEC
*     DEF *+7 
*     DEF D17       CLASS "READ"
*     DEF <"RESERVED" LU> SUB-FUNCTION = 37 (8) 
*     DEF <BUFFER>
*     DEF <BUFFER LENGTH> 
*     DEF <ORIGINAL REQUEST EQT ADDRESS>
*     DEF <TIME-OUT VALUE TO SET FOR ORIGINAL REQUEST>
* 
* 
* 
*     INFORMATION RETURNED BY DRIVER IN <BUFFER> :
* 
*   WORD  CONTENTS
*   ---- -----------------------------------
*     1 DESTINATION NODE NUMER
*     2 DESTINATION NODE LU NUMBER
*     3 ORIGINAL REQUEST CONTROL WORD (ALL 16 BITS) 
*     4 ORIGINAL REQUEST LENGTH (+ WORDS OR - CHARS)
*     5    "       "        "   OPTIONAL PARAMETER 1
*     6    "       "        "   OPTIONAL PARAMETER 2
*     7    "       "        "       "        "     3
*     8 ID SEGMENT ADDRESS OF CALLER (OR ZERO, IF SYSTEM) 
*     9 SEQUENCE NUMBER (ASSIGNED BY DRIVER)
*     10 & FOLL.: USER-SPECIFIED DATA BUFFER ("WRITE" REQUESTS ONLY)
* 
*     NOTE: WORDS 1 THRU 9 ARE CALLED THE "DRIVER REQUEST HEADER AREA"
      SPC 5 
*     A "WRITE" REQUEST IS ISSUED BY LUMAP WHEN THE REPLY COMES BACK. 
* 
*     JSB EXEC
*     DEF *+7 
*     DEF D18       CLASS "WRITE" 
*     DEF <RESERVED LU>    SUB-FUNCTION = 37(8) 
*     DEF <BUFFER>
*     DEF <BUFFER LENGTH> 
*     DEF <ORIGINAL REQUEST'S EQT ADDRESS>
*     DEF <SEQUENCE NUMBER> 
* 
*     PRIOR TO THE CALL, DATA MUST BE SET UP IN THE BUFFER IN THE FOLLOWING 
*     FORMAT: 
* 
*  1  (A)-REGISTER STATUS UPON I/O COMPLETION (ACTUAL DEVICE STATUS)
*     THIS VALUE IS PLACED IN EQT WORD 6
*  2  "ACTUAL" DEVICE TRANSMISSION LOG
*  3  EXTENDED STATUS WORD 1
*  4      "      "      "  2
* 
*        WORDS 5 & FOLLOWING ARE FILLED BY THE DRIVER ("READ" 
*        REQUESTS ONLY) 
*  5   ORIGINAL          \
*  6     DATA,             "READ" 
*  7      AS               REQUESTS 
*       ...                ONLY 
*  N+4     READ           / 
* 
*     NOTE: WORDS 1 THRU 4 ARE CALLED THE "DRIVER REPLY AREA" 
* 
*     I/O REJECT IF NOT CLASS-I/O REQUEST 
      SKP 
*     OTHER CAPABILITIES, NOT DESCRIBED ABOVE:
      SPC 2 
* ----TO OBTAIN SYSTEM OR PROGRAM ATTENTION, AS IN REMOTE USE-------------------
*       (SIMULATES OPERATOR STRIKING KEYBOARD)
* 
*     JSB EXEC
*     DEF *+4 
*     DEF D3
*     DEF LU        "RESERVED" LU + 3500
*     DEF <ATN LU>  "ATTENTION" LOGICAL UNIT, I.E., LU SYSTEM SENDS 
*                   "PROMPT" & "READ" TO. 
*     THE <ATN LU> MUST BE MAPABLE. 
*     IF THE ATN LU IS 1, SYSTEM ATTENTION IS REQUESTED 
*     OTHERWISE, IF THE INTERRUPT CELL FOR THE EQT POINTED TO BY
*     THE LU CONTAINS A NEGATIVE ID SEGMENT ADDRESS, THAT PROGRAM 
*     IS SCHEDULED AND PASSED THE EQT4 ADDRESS IN THE B REGISTER
*     (IE LIKE DVR05 DOES)
* 
* ----TO CAUSE THE DRIVER TO RETRY THE REQUEST -----------------------
* 
*     JSB EXEC
*     DEF *+7 
*     DEF RCODE     OCT 2 
*     DEF CONWD      LU + 3400
*     DEF <0> 
*     DEF <0> 
*     DEF <ORIGINAL EQT ADDRESS>
*     DEF <SEQUENCE NUMBER> 
      SPC 2 
* ----A 'STOP' REQUEST IS SENT TO THE DRIVER, VIA THE "RESERVED" LU,----- 
*     IF THE REQUEST CANNOT BE HONORED, DUE TO AN ERROR -- ANY ERROR).
      SPC 1 
*     JSB EXEC
*     DEF *+7 
*     DEF RCODE     OCT 2 
*     DEF CONWD     LU + 3500  = 'STOP' 
*     DEF <0> 
*     DEF <0> 
*     DEF <VIRTUAL EQT ADDRESS>  IDENTIFIES ORIGINAL REQUEST
*     DEF <SEQUENCE NUMBER> 
* 
*     ERROR CODES (IN EQT 5 STATUS) -- SAME AS RETURNED BY ACTUAL 
*                                      DEVICE DRIVER AT REMOTE NODE 
* 
* 
* 
*     EQT WORD USAGE BREAKDOWN
* 
*     EQT#          USE 
*     5             !AV! EQUIPMENT TYPE! STATUS!
*     6             REQUEST CONTROL WORD (CONWD)
*     7             ADDRESS OF DATA BUFFER
*     8             LENGTH OF DATA BUFFER 
*     9             1ST OPTIONAL PARAMETER
*     10            2ND OPTIONAL PARAMETER
*                   NOTE: AFTER LUMAP SENDS THE REPLY, THE TRANSMISSION 
*                   LOG IS STORED HERE FOR USE ON THE I/O TIME-OUT
*                   ENTRY SIGNALING I/O COMPLETION
*     11            POINTER TO REMOTE NODE NUMBER IN EXTENSION
*                                   FOR CURRENT REQUEST ONLY
*     12            LENGTH OF EQT EXTENSION AREA
*     13            ADDRESS OF EQT EXTENSION AREA 
*     14            TIME-OUT RE-SET VALUE 
*     15            TIME-OUT CLOCK VALUE
* 
*     EQT EXTENSION AREA
*     1  SEQUENCE NUMBER
*     2  CONTINUATION CODE
*     3  # RETRIES COUNTER, FOR ATTEMPTS TO SCHEDULE LUQUE
*     4  FIRST USER MAP PAGE NUMBER FOR BUFFER
*     5  SECOND USER MAP PAGE NUMBER FOR BUFFER 
*    WORDS 6 & FOLLOWING CONTAIN THE "I/O MAP": 
* 
*     6 REMOTE NODE NUMBER    --SUBCHANNEL 0
*     7    "    "   LU NUMBER      "
*     8  REMOTE NODE NUMBER    --SUBCHANNEL 1 
*     9     "    "   LU NUMBER      " 
* 
*           ETC.
* 
* 
*     THE "CONTINUATION CODE" IS USED TO DIRECT CONTROL TO THE
*     NEXT STAGE OF PROCESSING AFTER AN I/O TIME-OUT. 
*     THE CODE IS VALIDATED BEFORE BEING ADDED TO THE "CONTINUATION 
*     JUMP TABLE ADDRESS" TO OBTAIN THE ADDRESS OF THE CONTINUATION 
*     PROCESSOR.
      HED DRIVER INITIALIZATION SECTION 
DREQL EQU 9 
DRPRY EQU 4 
      SPC 2 
IV00  NOP 
      LDA EQT5,I    CLEAR OLD STATUS
      AND MB400 
      STA EQT5,I
      LDA EQT4,I    SET "I WILL 
      IOR IWPTO       PROCESS TIMEOUT"
      STA EQT4,I        FLAG
      LDB SPEQT     HAVE WE FOUND 
      SZB             THE RESERVED EQT YET? 
      JMP IV1       YES 
* 
*     THIS IS THE FIRST TIME THIS DRIVER HAS BEEN ENTERED.
*     WE MUST LOCATE THE RESERVED EQT AND ITS LU NUMBER.
*     THIS CODE IS ONLY EXECUTED THIS ONCE AND WILL BE
*     OVERLAYED BY TEMPORARIES LATER. 
* 
OVRLY EQU * 
* 
      LDA LUMAX     GET NUMBER OF LU'S
      CMA,INA         NEGATIVE FOR
      STA CNTR          A COUNTER 
      CLB           START AT
      STB VLU         LU 1
SPSR1 ISZ VLU       ADVANCE TO NEXT LU
      LDB VLU       IS LU 
      JSB OWNLU       ONE OF OURS?  
      JMP SPSR3     NO
      LDA B         YES     
      ADA D11         DOES IT'S EQT 
      LDA A,I           HAVE AN EXTENSION?
      SZA,RSS 
      JMP SPSR2     NO, THIS IS IT
SPSR3 ISZ CNTR      YES, MORE LU'S? 
      JMP SPSR1     YES, TRY NEXT 
      JMP REJCT     NO, REJECT THIS REQUEST 
SPSR2 STB SPEQT     SAVE POINTER TO RESERVED EQT
      LDA VLU       STORE RESERVED LU 
      STA #SPLU       WHERE OTHER PROGRAMS CAN GET IT 
* 
OVREN EQU *         END OF OVERLAY AREA 
* 
IV1   CPB EQT1      IS THIS THE RESERVED EQT? 
      JMP SPECL     YES 
      SPC 2 
*     HERE FOR ALL I/O ON NON-"RESERVED" LU 
* 
*     THE 'LUQUE' PROGRAM IS SCHEDULED TO PERFORM THE CLASS-I/O "READ").
*     DRIVER EXITS, AND PROCESSING RESUMES WHEN THE CLASS "READ" REQUEST
*     IS MADE ON THE DRIVER, BEGINNING AT LABEL "MVRED" (ASSUMING THAT
*     'LUQUE' IS SCHEDULABLE, AND NO OTHER ERRORS ARE DETECTED).
* 
*     THE CLASS-I/O REQUEST GOES TO DVV00 ON ITS "RESERVED" 
*     LU.  SINCE NO OTHER I/O REQUESTS ARE ALLOWED ON THIS LU AND 
*     IT ALWAYS COMPLETES THESE REQUESTS IMMEDIATELY, THIS EQT
*     IS NEVER BUSY.
      SPC 2 
      LDA EQT13,I   SET UP EXTENSION POINTERS 
      JSB SEXT
      LDA EQT6,I
      CPA =B100003  IS THIS A SYSTEM CLEAR REQUEST? 
      JMP IEXIT     YES 
      IOR ZBIT      IS THE "Z" BIT SET? 
      CPA EQT6,I
      JMP REJCT     YES--ERROR! 
      AND B3        CONTROL 
      CPA B3          REQUEST?
      JMP ORDI      YES 
      LDA EQT8,I
      JSB CHTW      CONVERT WORD COUNT TO CHARACTER COUNT 
      ADA =D-513     BUFFER LENGTH
      SSA,RSS         GREATER THAN 512? 
      JMP REJCT     YES, REJECT IT. 
      IFN 
      LDB $OPSY     IS THIS A MAPPED SYSTEM?
      RBR 
      SLB,RSS 
      JMP ORDI0     NO
      RSB           ARE WE IN THE USER MAP? 
      BLF,SLB 
      RSS 
      JMP ORDI0     NO
      LDA EQT7,I    RECORD THE RELEVANT MAP REGISTERS 
      LDB MAP1
      LDX M2
      JSB MVMAP 
      XIF 
      JMP ORDI1 
* 
ORDI  LDA EQT7,I    CONTROL REQUEST, MOVE PARAMETER 
      STA EQT9,I      TO A BETTER SPOT
      IFN 
ORDI0 EQU * 
      CCA           INDICATE USER MAP NOT NEEDED
      STA MAP1,I
      XIF 
* 
ORDI1 EQU * 
      LDA EQT4,I    PICK UP SUBCHANNEL NUMBER 
      ALF,ALF 
      RAL,RAL 
      AND B37 
      RAL           CONVERT TO
      ADA .EXTZ       TABLE OFFSET
      LDB A 
      ADB B2
      CMB,INB 
      ADB EQT12,I   I/O MAP BIG ENOUGH? 
      SSB 
      JMP REJCT     NO
      ADA EQT13,I   GET POINTER TO NODE NUMBER
      STA EQT11,I   SAVE IN EQT 
      INA           ADVANCE TO REMOTE NODE LU NUMBER
      LDB A,I       PICK UP LU
      SZB,RSS       EMPTY ENTRY?
      JMP LOG0      YES, IGNORE THIS REQUEST
      SPC 2 
      LDA SEQN#     ASSIGN A
      INA             SEQUENCE
      STA SEQN#         NUMBER
      STA SEQN,I
      LDA NSCDL     SET # RETRIES COUNTER 
      STA NTRY,I
      JSB LIST      CALL $LIST TO SCHEDULE LUQUE
      CLA           CONTINUATION RETURN TO
      JMP IV00,I      RTIOC 
      SPC 2 
*     HERE TO REJECT REQUEST
REJCT EQU * 
      LDA B2
      CLB 
      JMP IV00,I    RETURN TO RTIOC 
      SPC 2 
*     HERE FOR READ & WRITE REQUESTS ON "RESERVED" EQT
* 
SPECL EQU * 
      LDA EQT6,I     REQUEST CONTROL WORD 
      AND =B3703    IS THIS REQUEST TO
      CPA =B3602      SET UP I/O MAP? 
      JMP MAPEQ     YES 
      CPA =B3601    RETURN I/O MAP SET-UP INFORMATION?
      JMP RTMAP     YES 
      CPA =B3503    OBTAIN SYSTEM ATTENTION?
      JMP SYSAT     YES 
      JSB SXEQT     SET UP ALTERNATE EQT POINTERS 
      LDA EQT6,I    GET BACK
      AND =B3703      REQUEST CODE
      LDB EQT10,I   SEQUENCE NUMBER 
      CPA =B3701      MUST MATCH
      RSS               UNLESS THIS IS
      CPB SEQN,I          A READ FROM LUQUE 
      RSS 
      JMP LOG0      NO MATCH, PRETEND NOTHING HAPPENED
      CPA =B3402    RETRY LATER?
      JMP RETRY     YES 
      CPA =B3502    "STOP" REQUEST? 
      JMP SSTOP     YES 
      AND =B3700    MASK SUB-FUNCTION 
      CPA =B3700    CORRECT FOR "SPECIAL" LU? 
      RSS           YES, CONTINUE 
      JMP REJCT     NO, REJECT REQUEST
      LDA EQT6,I    LOAD REQUEST CONTROL WORD 
      AND =B140000  MASK CLASS-I/O REQUEST BITS 
      CPA =B140000  IS THIS A CLASS-I/O REQUEST?
      RSS           YES, CONTINUE 
      JMP REJCT     NO, REJECT
      LDA EQT6,I    OBTAIN REQUEST CODE AGAIN 
      SLA,RSS       IS THIS A "WRITE" REQUEST?
      JMP MVRPL     YES, MOVE REPLY 
      SKP 
* 
*     HERE TO PASS ORIGINAL REQUEST TO LUMAP. 
* 
* 
* 
*     DETERMINE ID SEGMENT ADDRESS OF CALLER
* 
      LDB XQT5,I    IS THE REQUEST
      SSB,RSS         STILL PENDING?
      JMP LOG0      NO, IGNORE THIS 
      LDB XQT1,I    GET I/O 'LINK' WORD 
      LDA XQT6,I    GET REQUEST CODE
      SSA           "SYSTEM" I/O? 
      CLB           YES, CAN'T GET ID SEGMENT ADDRESS 
      RAL           ROTATE THE 'BUFFERED RQST' BIT
      SSA           BUFFERED? 
      CLB           YES, CAN'T GET ID SEGMENT ADDRESS 
      STB IDADR      & SAVE LOCALLY FOR USE LATER 
* 
      LDB EQT7,I    LOAD CLASS I/O BUFFER ADDRESS 
      LDA XQT11,I   STORE REMOTE NODE NUMBER
      LDA A,I 
      STA B,I        IN BUFFER(1) 
      INB 
      LDA XQT11,I   STORE REMOTE NODE LU NUMBER 
      INA 
      LDA A,I 
      STA B,I         IN BUFFER(2)
      INB 
      LDA XQT6,I    STORE ORIGINAL CONTROL WORD 
      STA B,I         IN BUFFER (3) 
      INB 
      LDA XQT8,I    STORE ORIGINAL REQUEST LENGTH 
      STA B,I         IN BUFFER(4)
      INB 
      LDA XQT9,I    STORE ORIGINAL 1ST OPTIONAL PARAMETER 
      STA B,I        IN BUFFER(5) 
      INB 
      LDA XQT10,I   STORE ORIGINAL 2ND OPTIONAL PARAMETER 
      STA B,I         IN BUFFER(6)
      INB 
      CLA           3RD OPTIONAL PARAMETER ALWAYS ZERO FOR THIS RTE 
      STA B,I           IN BUFFER(7)
      INB 
      LDA IDADR     STORE CALLING PROGRAM'S ID SEGMENT
      STA B,I         ADDRESS  IN BUFFER(8) 
      INB 
      LDA SEQN,I    LOAD SEQUENCE NUMBER
      STA B,I       STORE IN BUFFER(9)
      LDA XQT6,I    LOAD ORIGINAL CONTROL WORD AGAIN
      AND B3        MASK
      CPA B2        "WRITE" REQUEST?
      INB,RSS       YES, (B) POINTS TO BUFFER ADDRESS 
      JMP MVX3      NO, SKIP DATA TRANSFER
* 
*     SET UP DATA TRANSFER
* 
      STB CV00      SAVE DESTINATION BUFFER ADDRESS 
      LDA XQT8,I    LOAD ORIGINAL REQUEST LENGTH
      JSB CHTW      CONVERT CHAR COUNT TO WORDS 
      SZA           ZERO? 
      SSA             OR NEGATIVE COUNT?
      JMP MVX3      YES, BYPASS THE TRANSFER
      STA TEMP      SAVE # WORDS TO MOVE
      CMA,INA       MAKE SURE 
      ADA EQT8,I      THE LENGTH
      CPA .REQL         WE GOT FROM LUQUE 
      RSS                 IS RIGHT? 
      JMP LOG0      NO WAY! 
* 
*     SET UP USER MAP, IF NECESSARY, BEFORE TRANSFERRING DATA.
* 
      IFN 
      JSB SETMP     SET UP USER MAP 
      XIF 
MV1   EQU * 
      LDA XQT7,I    LOAD "SOURCE" ADDRESS 
      LDB CV00      LOAD "DESTINATION" ADDRESS
      IFN 
      SEZ,RSS       USER MAP NEEDED?
      JMP MV2       NO, USE SYSTEM MAP
      LDX TEMP
      MWF           MOVE WORDS FROM USER MAP
      JSB RSTMP     RESTORE USER MAP
      JMP MVX3
MV2   EQU * 
      XIF 
      JSB .MVW      MOVE WORDS, IN SAME MAP 
      DEF TEMP      BUFFER LENGTH 
      NOP 
MVX3  EQU * 
      LDB B3        "MASTER TIME-OUT" CONTINUATION CODE 
      STB CCODE,I   STORE CONTINUATION CODE 
      LDB EQT10,I   LOAD DS TIMEOUT 
      LDA XQT11,I   GET THE 
      INA             PROMPT FLAG 
      LDA A,I           (COMPLEMENTED)
      CMA                 IN BIT 1
      ALF,RAR 
      IOR XQT6,I    IF THIS IS A READ 
      RAR,SLA         AND PROMPT IS SET 
      RSS 
      LDB BIT15           THEN USE MAXIMUM TIMEOUT
      STB XQT15,I   STORE I/O TIME-OUT
      CLB,INB       GET NON-ZERO TRANSMISSION LOG 
      JMP IEXIT     IMMEDIATE COMPLETION
      SKP 
*     HERE TO SEND THE REPLY BACK TO THE CALLING PROGRAM
      SPC 2 
*     BUFFER CONTAINS THE REPLY TO THE ORIGINAL REQUEST,
*     PLUS DATA (AS READ) IN THE CASE WHERE THE 
*     ORIGINAL REQUEST WAS A "READ".  INCLUDED IN THE DATA ARE: 
* 
*     WORD 1 SEQUENCE NUMBER--ASSIGNED BY DRIVER.  MUST BE PROVIDED WITH
*            REPLY, IN ORDER TO BE SURE OF MATCHING ORIGINAL REQUEST. 
*          2 (A)-REGISTER AT COMPLETION 
*          3 TRANSMISSON LOG
*          4    EXTENDED STATUS WORD 1 (NOT USED) 
*          5    EXTENDED STATUS WORD 2 (NOT USED) 
*          6 & FOL. :  ORIGINAL DATA ("READ" REQUEST ONLY)
* 
*     ORIGINAL REQUEST IS SPECIFIED VIA THE EQT ADDRESS 
*     (CONTAINED IN 1ST OPTIONAL PARAMETER).
MVRPL EQU * 
      LDA XQT5,I    IS THE ORIGINAL REQUESTOR 
      SSA,RSS          STILL WAITING? 
      JMP LOG0        NO, MUST HAVE TIMED OUT. COMPLETE THIS RQST 
      LDA CCODE,I   YES, IS IT
      CPA B3          WAITING FOR A 
      RSS               RESPONSE? 
      JMP LOG0      NO
      LDA EQT7,I    LOAD BUFFER ADDRESS 
      STA TEMP      SAVE IT 
      LDA TEMP,I    GET ACTUAL DEVICE STATUS
      AND =B37777   MASK OFF "AV" FIELD FROM REMOTE 
      IOR =B100000  INCLUDE "AV" FIELD FROM ORIGINAL REQUEST'S EQT
      STA XQT5,I    STORE NEW I/O STATUS & EQUIPMENT TYPE 
      ISZ TEMP      POINT TO TRANSMISSION LOG 
      LDA TEMP,I    STORE ACTUAL TRANSMISSION LOG IN EQT--
      STA XQT10,I      WE'LL PICK IT UP ON I/O COMPLETION.
      CCA           SET UP ORIGINAL REQUEST EQT FOR 
      STA XQT15,I     I/O TIME-OUT & IMMEDIATE
      LDB B2           COMPLETION ON RE-ENTRY 
      STB CCODE,I 
      LDA XQT6,I    WAS THE ORIGINAL
      AND B3          REQUEST 
      CPA B1          A "READ"? 
      RSS           YES 
      JMP LOG0      NO, RETURN I/O COMPLETION TO RTIOC
      ISZ TEMP      BUMP TO EXTENDED STATUS 
      ISZ TEMP      PASS OVER EXTENDED
      ISZ TEMP         STATUS WORDS 
* 
*     ORIGINAL REQUEST WAS A "READ".
*     DATA IS TO BE PASSED TO ORIGINAL CALLING PROGRAM'S BUFFER, AS READ
* 
      LDA XQT10,I   LOAD TRANSMISSION LOG 
      LDB XQT8,I      WAS ORIGINAL REQUEST
      SSB,RSS          SPECIFIED IN CHARACTERS? 
      JMP *+3       NO, WORDS 
      INA           CHARACTERS:  ROUND UP TRUE LNTH,
      ARS             AND CONVERT TO WORDS
      SZA,RSS          WAS LENGTH ZERO??
      JMP LOG0      YES, DON'T MOVE THEM
      STA SXEQT     SAVE + WORD COUNT 
      IFN 
      JSB SETMP     SET UP USER MAP 
      XIF 
      LDA TEMP      LOAD "SOURCE" ADDRESS 
      LDB XQT7,I    LOAD DESTINATION ADDRESS
      SPC 2 
      IFN 
      SEZ,RSS       USER MAP NEEDED?
      JMP SP2       NO
      LDX SXEQT 
      MWI           MOVE WORDS INTO USER MAP
      JSB RSTMP     RESTORE MAP 
      JMP LOG0  
SP2   EQU * 
      XIF 
*     HERE FOR I/O IN SYSTEM MAP (OR NON-DMS SYSTEM)
      JSB .MVW      MOVE DATA 
      DEF SXEQT     BUFFER LENGTH 
      NOP 
      SPC 3 
LOG0  EQU * 
      CLB           SET ZERO TRANSMISSION LOG 
      SPC 1 
IEXIT EQU *         IMMEDIATE COMPLETION RETURN TO RTIOC
      LDA B4
      JMP IV00,I    RETURN TO RTIOC 
      SKP 
*     HERE TO SET UP THE I/O MAPPING FUNCTION 
* 
MAPEQ EQU * 
      LDA EQT7,I    GET BUFFER ADDRESS
      LDB A,I       GET SECURITY CODE 
      CPB FNMBR     CORRECT?
      RSS 
      JMP LOG0      NO
      INA 
      LDB @VLU      MOVE MAP SET-UP TO LOCAL STORAGE
      JSB .MVW
      DEF B3
      NOP 
* 
      LDA VLU 
      CPA M1        ARE WE TO FIND AN LU? 
      JMP FMPEQ       YES.
      LDB VLU       LOAD THE LU NUMBER TO BE CHECKED
      JSB CKMLU     CHECK THE LU FOR "MAPPABILITY"
      JMP SETUP     EQT IS GOOD! SET IT UP! 
      JMP LOG0      EQT NOT RIGHT, OR SIZE TOO SMALL
      SPC 2 
*     HERE TO SCAN THE LUS TO FIND ONE WHICH IS "MAPPABLE" AND HAS
*     AN EMPTY MAP ENTRY. 
* 
*     NOTE: DURING SEARCH, THE FOLLOWING LABELS ARE USED: 
* 
*     SETTO  CONTAINS NUMBER OF LAST EQT CHECKED
*     TEMP   CONTAINS ADDRESS OF LAST EQT CHECKED 
* 
FMPEQ EQU * 
      LDA LUMAX     SET LOOP
      CMA,INA         COUNTER FOR MAX. # LUS
      STA CNTR
      CLB,INB       INITIALIZE LU NUMBER
      STB VLU 
FMLUP EQU * 
      LDB VLU       LOAD LU TO BE CHECKED 
      JSB CKMLU     CHECK THE LU FOR "MAPPABILITY". 
      JMP FML1      FOUND ONE!! 
      SPC 2 
FMNXT EQU *         HERE TO ADVANCE TO NEXT LU
      ISZ VLU       BUMP LU # 
      ISZ CNTR      END OF LOOP?
      JMP FMLUP     NO, CONTINUE
      JMP LOG0      RETURN TO CALLER
      SPC 2 
FML1  EQU * 
      LDA B 
      INA 
      LDA A,I       LOAD ENTRY
      SZA           EMPTY?
      JMP FMNXT     NO--ENTRY IN USE
* 
*     FOUND AN ENTRY THAT'S AVAILABLE.
SETUP EQU * 
      LDA RNODE     STORE LU IN THE 
      STA B,I         TABLE 
      INB             ADVANCE TO NEXT MAP TABLE LOCN
      LDA RLU       STORE THE 
      STA B,I         REMOTE LU NUMBER IN THE TABLE 
      LDB VLU       RETURN W/ (B) = LU # TO USE 
      JMP IEXIT 
      SPC 2 
*     SUBROUTINE TO CHECK THE EQT ASSOCIATED WITH AN LU 
*     TO VERIFY THAT IT IS "MAPPABLE".  BY THIS IS MEANS: 
*       1) THE LU POINTS TO AN EQT WHICH "POINTS" TO THIS DRIVER. 
*       2) THE LU IS NOT THE "RESERVED" LU, AND DOES NOT POINT TO 
*          THE "RESERVED" EQT.
*       3) THE EQT ASSOCIATED WITH IT HAS AN EXTENSION SIZE 
*          OF AT LEAST TWICE THE SUBCHANNEL NUMBER PLUS THE FIXED 
*          STORAGE AREA SIZE (SEE THE EQT LAYOUT IN THE COMMENTS
*          IN THE FRONT OF THIS LISTING)
* 
*     CALLING SEQUENCE: 
*     LDB <LU TO CHECK> 
*     JSB CKMLU 
*     <RETURN HERE IF "MAPPABILITY" CRITERIA HAVE BEEN MET. 
*                 <B> CONTAINS ADDRESS OF THIS LU'S CORRESPONDING 
*                     ENTRY IN THE MAP TABLE. 
*                 <CKTMP> CONTAINS ADDRESS OF EQT'S WORD 13 
* 
*     <RETURN HERE IF CRITERIA NOT MET> 
* 
      SPC 2 
*     TEMPORARY STORAGE AREA
CKTMP NOP           TEMPORARY STORAGE FOR THIS ROUTINE
      SPC 2 
CKMLU NOP           ENTRY/EXIT
      LDA B         CHECK THAT LU # IS A VALID ONE
      CMA,INA 
      ADA LUMAX 
      SSA 
      JMP CKXIT     LU > MAX # LUS IN SYSTEM
      SSB,RSS       IS LU 
      SZB,RSS         ZERO OR NEGATIVE? 
      JMP CKXIT     YES, NO GOOD
      STB CKTMP     SAVE LU 
      JSB OWNLU     IS IT ONE OF OURS?
      JMP CKXIT     NO
      LDA CKTMP     YES, GET BACK LU
      ADB D11       SAVE POINTER
      STB CKTMP       TO EQT WORD 12
      ADA M1        GET 
      ADA DRT         THE 
      LDA A,I           SUBCHANNEL
      ALF,RAL 
      AND B37       COMPUTE INDEX 
      RAL             INTO EQT
      ADA .EXTZ         EXTENSION 
      LDB A         IS THE EXTENSION
      ADA B2          BIG ENOUGH? 
      CMA,INA 
      ADA CKTMP,I 
      SSA 
CKXIT ISZ CKMLU     NO--TAKE "ERROR" EXIT 
* 
*     COMPUTE ADDRESS OF "I/O MAP" ENTRY ASSOCIATED WITH THIS 
*     LU, AND LEAVE IN <B> UPON RETURN (VALID ONLY FOR "GOOD" EXIT) 
* 
      ISZ CKTMP     POINT TO EXTENSION ADDRESS
      ADB CKTMP,I   ADD ADDRESS TO OFFSET 
      JMP CKMLU,I   NOW RETURN
      SPC 2 
* 
*     CHECK LU FOR BELONGING TO THE LU MAPPING DRIVER 
*     ON ENTRY, B=VALID LU NUMBER 
*     NO SKIP RETURN IF LU DOES NOT BELONG TO DVV00 
*     SINGLE SKIP RETURN WITH B POINTING TO THE LU'S EQT IF 
*     IT DOES BELONG TO DVV00 
* 
OWNLU NOP 
      ADB M1        GET THE 
      ADB DRT         EQT NUMBER
      LDA B,I           FROM  
      AND B77             THE DRT 
      SZA,RSS       BIT BUCKET? 
      JMP OWNLU,I   YES, CAN'T MAP THAT 
      ADA M1        GET THE 
      MPY EQTSZ       EQT'S 
      ADA EQTA          ADDRESS 
      LDB A 
      INB           COMPARE 
      LDA B,I         INITIATION
      XOR EQT2,I        ADDRESSES 
      CLE,ELA 
      SZA 
      JMP OWNLU,I   NO MATCH
      INB           COMPARE 
      LDA B,I         CONTINUE  
      XOR EQT3,I        ADDRESSES 
      CLE,ELA 
      SZA 
      JMP OWNLU,I   NO MATCH
      INB           COMPARE 
      LDA B,I         SELECT
      XOR EQT4,I        CODES 
      AND B77 
      ADB M3        RESTORE B IN CASE OF SUCCESS
      SZA,RSS       DO SELECT CODES MATCH?
      ISZ OWNLU     YES, TAKE GOOD RETURN 
      JMP OWNLU,I   RETURN
      SPC 2 
*     HERE TO RETURN I/O MAP INFORMATION FOR A SPECIFIED LU 
      SPC 1 
RTMAP EQU * 
      LDA EQT8,I    GET BUFFER LENGTH 
      CPA B2        TWO WORDS?
      RSS 
      JMP REJCT     NO! REJECT
      LDB EQT9,I    GET THE LU
      JSB CKMLU     CHECK IT FOR MAPPABILITY
      JMP RTGUD     ***GOOD LU ***
      CCA 
      LDB EQT7,I    GET DATA BUFFER 
      STA B,I       RETURN -1 
      JMP IEXIT 
      SPC 2 
RTGUD EQU *         HERE WHEN LU RETURNED IS A GOOD ONE 
      LDA EQT7,I    GET USER BUFFER ADDRESS 
      STA CKTMP     SAVE ADDRESS
      DLD B,I       GET THE MAP ENTRY WORDS 
      DST CKTMP,I   RETURN THEM TO USER 
* 
      JMP IEXIT     IMMEDIATE COMPLETION
      SKP 
*     HERE ON REQUESTS TO SEND A 'STOP' TO ORIGINATING USER PROGRAM 
* 
SSTOP EQU * 
      LDA XQT5,I    SET "I/O TIME-OUT" STATUS BIT 
      IOR =B40
      STA XQT5,I
      CLA           CLEAR 
      STA XQT10,I     TRANSMISSION LOG
      LDB XQT6,I    SET TIMEOUT FOR RE-ENTRY
      LDA MB400       ON OTHER EQT TO 2.5 SEC FOR READ
      RBR,SLB           AND 10 MS OTHERWISE 
      CCA                 (THIS PREVENTS READ LOOPS 
      STA XQT15,I           FROM HOGGING THE SYSTEM)
      LDA B2        SET CONTINUATION CODE FOR "I/O COMPLETION"
      STA CCODE,I 
      LDA B4        "IMMEDIATE COMPLETION" RETURN ON THIS 'SEND STOP' REQUEST 
      JMP IV00,I
      SPC 2 
RETRY EQU *         HERE TO SET UP ORIGINAL REQUEST RE-TRY
      LDA =D-100    SET UP 1-SEC TIME-OUT 
      STA XQT15,I 
      CLA,INA       WE WILL RE-ATTEMPT TO EXECUTE THE ENTIRE
      STA CCODE,I     REQUEST ON RE-ENTRY 
      LDA NSCDL     SET UP # SCHEDULE ATTEMPTS COUNTER
      LDB NTRY,I     ....UNLESS THE TIMER'S 
      SZB,RSS            ALREADY RUNNING
      STA NTRY,I
      JMP IEXIT     IMMEDIATE COMPLETION RETURN TO RTIOC
      SPC 2 
*     HERE TO SIMULATE A REQUEST FOR SYSTEM ATTENTION 
SYSAT EQU * 
      LDB EQT7,I    GET THE LU THE GUY WANTS
      JSB CKMLU     IS IT MAPPABLE? 
      CLA,INA,RSS   YES 
      JMP IEXIT     NO, THROW THE BUM OUT 
      CPA EQT7,I    IS IT LU 1? 
      JMP SYSA1     BINGO!
      LDB CKTMP     SAVE EQT4 ADDRESS 
      ADB M9          OF THE EQT
      STB BVAL          IN QUESTION 
      LDA EQT4,I    GET 
      AND B77         SELECT CODE 
      ADA M6        GET 
      ADA INTBA       INTERRUPT TABLE 
      LDA A,I           CONTENTS
      CMA,SSA,INA   AN ID SEGMENT ADDRESS?
      JMP IEXIT     NO, THROW THE BUM OUT 
      STA SYSID     YES, SAVE POSITIVE VALUE
      JSB $LIST     SCHEDULE OURSELVES
      OCT 601         A PROGRAM, AND
SYSID NOP               TELL HIM WHERE TO FIND
BVAL  NOP                 THE EQT IN QUESTION 
      JMP IEXIT     OUR WORK IS DONE FOR NOW
* 
SYSA1 STA OPATN     GET OPERATOR ATTENTION
      JMP IEXIT     THAT WAS EASY 
      HED CONTINUATION INTERRUPT PROCESSING SECTION 
      SKP 
CV00  NOP           CONTINUATOR ENTRY POINT 
      LDA EQT5,I    IS THIS A 
      SSA,RSS         SPURIOUS INTERRUPT? 
      JMP CEXIT     YES 
      LDA EQT4,I
      AND =B4000    TIME-OUT BIT SET? 
      SZA,RSS 
      JMP CEXIT     NO, MUST BE SPURIOUS
      LDA EQT13,I   SET UP EQT EXTENSION POINTERS 
      JSB SEXT         POINTERS 
      LDA CCODE,I   LOAD CONTINUATION CODE
      SSA,RSS       VERIFY IT 
      SZA,RSS 
      JMP CEXIT     NOT VALID, CONTINUATION RETURN TO $CIC
      ADA CTABL     TOO 
      SSA,RSS         BIG?
      JMP CEXIT     YES, INVALID
      LDA CCODE,I   LOAD CODE AGAIN 
      ADA CTBLE     CONVERT TO JUMP ADDRESS 
      JMP A,I       AND GO THERE. 
      SPC 2 
*     ROUTINE TO RE-ATTEMPT TO SCHEDULE LUQUE 
* 
      SPC 2 
LISTX EQU * 
      ISZ NTRY,I      BUMP RE-TRY COUNTER. EXHAUSTED? 
      RSS           NO, CONTINUE
      JMP MTMOT     YES--MASTER TIME-OUT
      JSB LIST      SCHEDULE LUQUE
      SPC 1 
CEXIT EQU * 
      ISZ CV00      I/O CONTINUATION RETURN 
      JMP CV00,I      TO CIC
* 
      SPC 2 
IODUN EQU *         HERE FOR I/O COMPLETION 
      LDB EQT10,I   RECOVER TRANSMISSION LOG
      CLA           I/O COMPLETION RETURN 
      JMP CV00,I      TO CIC
      SPC 2 
* 
MTMOT EQU *         HERE ON MASTER TIME-OUT 
      LDA EQT5,I
      IOR =B40      SET I/O TIME-OUT BIT
      STA EQT5,I
      CLB 
      CLA 
      JMP CV00,I    RETURN TO $CIC
      SKP 
*     SUBROUTINE TO SCHEDULE LUQUE
* 
*     CALLING SEQUENCE: 
* 
*       JSB LIST
* 
LIST  NOP 
      LDA EQT11,I   GET 
      LDA A,I         NODE
      STA TEMP          NUMBER
      LDA SEQN,I    GET SEQUENCE NUMBER 
      STA TEMP2     SAVE IT WHERE RTE CAN FIND IT 
      LDB EQT6,I    SEND
      LDA EQT8,I      DATA
      SLB               ONLY IF 
      CLA                 WRITE 
      STA CHTW
      JSB $LIST     SCHEDULE 'LUQUE'
      OCT 701       FUNCTION 1, SUBFUNCTION 7 
      DEF *+6       RETURN POINT
      DEF LUQUE     NAME
      DEF EQT1      P1: EQT ADDRESS 
      DEF TEMP      P2: REMOTE NODE  NUMBER 
      DEF CHTW      P3: BUFFER LENGTH 
      DEF TEMP2     P4: SEQUENCE NUMBER 
      LDB LUPTO     GET SCHEDULE RETRY TIMEOUT
      SZA,RSS       LUQUE SCHEDULED?
      LDB =D-100    YES, SET ONE-SECOND TIME-OUT FOR LUMAP
      STB EQT15,I 
      CLA,INA       SET CONTINUATION CODE FOR RETRY 
      STA CCODE,I   STORE CONTINUATION CODE 
      JMP LIST,I    RETURN TO CALLER
      SPC 2 
      IFN 
* 
*     SUBROUTINE TO SAVE OR RESTORE TWO USER MAP REGISTERS THAT 
*     MAP A GIVEN BUFFER (BUFFER MUST BE <= 1024 WORDS LONG)
* 
*     ON ENTRY: 
*     A  POINTS TO START OF BUFFER WHOSE MAP IS TO BE SAVED/RESOTRED
*     B  POINTS TO TWO WORD TEMP AREA FOR MAP REGISTERS 
*     X  IS -2 TO SAVE REGISTERS AND 2 TO RESTORE REGISTERS 
* 
MVMAP NOP 
      ALF           GET THE PAGE NUMBER 
      RAL,RAL 
      AND B37 
      CPA B37       IF LAST PAGE, BACK UP ONE 
      ADA M1
      ADA B40       SPECIFY USER MAP
      XMM           MOVE IT 
      JMP MVMAP,I 
      SPC 2 
* 
*     SET UP MAP TO MOVE DATA TO/FROM REQUEST 
*     E REGISTER SET IF REQUEST IS IN USER MAP
* 
SETMP NOP 
      LDA MAP1,I    IS USER MAP NEEDED? 
      CMA,CLE,SZA,RSS 
      JMP SETMP,I   NO
      LDA XQT7,I    SAVE CURRENT USER MAP REGISTERS 
      LDB MAPAD 
      LDX M2
      JSB MVMAP 
      LDA XQT7,I    SET NEW USER MAP REGISTERS
      LDB MAP1
      LDX B2
      JSB MVMAP 
      CCE           INDICATE USER MAP NEEDED
      JMP SETMP,I 
      SPC 2 
* 
*     RESTORE USER MAP
* 
RSTMP NOP 
      LDA XQT7,I    RESTORE USER MAP REGISTERS
      LDB MAPAD 
      LDX B2
      JSB MVMAP 
      JMP RSTMP,I 
* 
MAPAD DEF *+1 
      BSS 2         SAVE AREA FOR USER MAP REGISTERS
      SPC 2 
      XIF 
*     SUBROUTINE TO CONVERT CHARACTER COUNT TO WORDS
*     CALLING SEQUENCE: 
*     LDA <COUNT> + = WORDS, - = CHARS
*     JSB CHTW
*     <RETURN> (A) = + WORD COUNT, (B) = SAME AS AT CALL
* 
CHTW  NOP 
      SSA,RSS       ALREADY HAVE COUNT IN WORDS?
      JMP CHTW,I    YES, RETURN 
      CMA,INA       CONVERT 
      INA             ROUNDED 
      ARS               WORDS 
      JMP CHTW,I      RETURN TO CALLER
      SPC 2 
*     SUBROUTINE TO SET UP THE "XQT" TABLE POINTERS.
*     THIS TABLE CONTAINS POINTERS TO THE ORIGINAL REQUEST'S
*     EQT.  IT IS USED WHEN THE DRIVER IS ENTERED VIA THE 
*     "RESERVED" LU, AND PROVIDES CONVENIENT ACCESS TO THE
*     ORIGINAL REQUEST'S EQT. 
* 
SXEQT NOP           ENTRY/EXIT
      LDA SZXQT     SET UP LOOP COUNTER 
      STA CNTR
      LDA EQT9,I    GET ORIGINAL REQUEST'S EQT ADDRESS
      LDB @XQT      LOAD ADDRESS OF XQT TABLE 
L1    EQU *         LOOP
      STA B,I       SET ADDRESS 
      INA 
      INB           BUMP POINTERS 
      ISZ CNTR      DONE? 
      JMP L1        NO, CONTINUE
      LDA XQT13,I   LOAD EQT EXTENSION ADDRESS
      JSB SEXT      SET ADDRESSES OF EXTENSION AREA 
      JMP SXEQT,I   YES, RETURN TO CALLER 
      SPC 2 
*     SUBROUTINE TO SET UP THE "EXT" TABLE POINTERS 
*     ON ENTRY, (A) = ADDRESS OF EXTENSION WORD 1 
*     ON RETURN, SEQN = ADDRESS OF 1ST EXTENSION WORD 
*                   2              2ND
*                   3              3RD
*                       ETC.
SEXT  NOP 
      STA SEQN
      INA 
      STA CCODE 
      INA 
      STA NTRY
      INA 
      STA MAP1
      INA 
      STA MAP2
      JMP SEXT,I
      SPC 2 
A     EQU 0 
B     EQU 1 
OPATN EQU 1734B     OPERATOR ATTENTION FLAG 
INTBA EQU 1654B 
EQTA  EQU 1650B 
DRT   EQU 1652B 
LUMAX EQU 1653B 
EQT1  EQU 1660B 
EQT2  EQU 1661B 
EQT3  EQU 1662B 
EQT4  EQU 1663B 
EQT5  EQU 1664B 
EQT6  EQU 1665B 
EQT7  EQU 1666B 
EQT8  EQU 1667B 
EQT9  EQU 1670B 
EQT10 EQU 1671B 
EQT11 EQU 1672B 
EQT12 EQU 1771B 
EQT13 EQU 1772B 
EQT14 EQU 1773B 
EQT15 EQU 1774B 
      SPC 2 
B1    OCT 1 
B2    OCT 2 
B3    OCT 3 
B4    OCT 4 
B37   OCT 37
B40   OCT 40
B77   OCT 77
D11   DEC 11
EQTSZ DEC 15        SIZE OF EQUIPMENT TABLE ENTRY 
BIT15 OCT 100000
M1    DEC -1
M2    DEC -2
M3    DEC -3
M6    DEC -6
M9    DEC -9
MB400 OCT -400
NSCDL DEC -20       LIMIT OF ATTEMPTS TO SCHEDULE LUQUE 
LUPTO DEC -5        RE-TRY DELAY FOR ATTEMPT TO SCHEDULE LUQUE
LUQUE ASC 3,LUQUE   NAME OF 'LUQUE' 
* 
*     WARNING: DO NOT DISTURB THE ORDER OF ENTRIES IN 
*     THE "CONTINUATION JUMP" AND "ORIGINAL REQUESTOR'S 
*     EQT POINTERS" TABLES. 
* 
*     "CONTINUATION JUMP TABLE" 
* 
CTBLE DEF *,I 
      DEF LISTX     1: RE-TRY LUQUE SCHEDULE
      DEF IODUN     2: I/O COMPLETION 
      DEF MTMOT     3: MASTER TIME-OUT
CTABL ABS CTBLE-*   NEG. LENGTH OF CONTINUATION TABLE 
* 
*     END OF "CONTINUATION JUMP" TABLE
* 
*     "ORIGINAL REQUESTOR'S EQT POINTERS" TABLE 
* 
*     WARNING:  DO NOT DISTURB ORDER OF ENTRIES IN THIS TABLE.
* 
*     THIS TABLE OVERLAYS THE CODE THAT FINDS THE RESERVED EQT
* 
@XQT  DEF XQT1      ADDRESS OF INTERNAL TABLE 
XQT1  EQU OVRLY     POINTER TO ORIGINAL REQUEST'S EQT WORD 1
XQT2  EQU XQT1+1    POINTER TO ORIGINAL REQUEST'S EQT WORD 2
XQT3  EQU XQT2+1    POINTER TO ORIGINAL REQUEST'S EQT WORD 3
XQT4  EQU XQT3+1    POINTER TO ORIGINAL REQUEST'S EQT WORD 4
XQT5  EQU XQT4+1    POINTER TO ORIGINAL REQUEST'S EQT WORD 5
XQT6  EQU XQT5+1    POINTER TO ORIGINAL REQUEST'S EQT WORD 6
XQT7  EQU XQT6+1    POINTER TO ORIGINAL REQUEST'S EQT WORD 7
XQT8  EQU XQT7+1    POINTER TO ORIGINAL REQUEST'S EQT WORD 8
XQT9  EQU XQT8+1    POINTER TO ORIGINAL REQUEST'S EQT WORD 9
XQT10 EQU XQT9+1    POINTER TO ORIGINAL REQUEST'S EQT WORD 10 
XQT11 EQU XQT10+1   POINTER TO ORIGINAL REQUEST'S EQT WORD 11 
XQT12 EQU XQT11+1   POINTER TO ORIGINAL REQUEST'S EQT WORD 12 
XQT13 EQU XQT12+1   POINTER TO ORIGINAL REQUEST'S EQT WORD 13 
XQT14 EQU XQT13+1   POINTER TO ORIGINAL REQUEST'S EQT WORD 14 
XQT15 EQU XQT14+1   POINTER TO ORIGINAL REQUEST'S EQT WORD 15 
SZXQT ABS XQT1-XQT15-1 NEGATIVE OF SIZE OF XQT TABLE
SEQN  EQU XQT15+1   ADDRESS OF EQT EXTENSION WORD # 1 
CCODE EQU SEQN+1    ADDRESS OF EQT EXTENSION WORD # 2 
NTRY  EQU CCODE+1   ADDRESS OF EQT EXTENSION WORD # 3 
MAP1  EQU NTRY+1    ADDRESS OF EQT EXTENSION WORD # 4 
MAP2  EQU MAP1+1    ADDRESS OF EXT EXTENSION WORD # 5 
.EXTZ ABS MAP2+1-SEQN   NEGATIVE SIZE OF EQT EXTENSION
* 
CHECK EQU OVREN-1-MAP2 WILL GENERATE AN ERROR IF OVERLAY
*                                   AREA EXCEEDED 
* 
* 
*     END OF "ORIGINAL REQUESTOR'S EQT POINTERS" TABLE
* 
.REQL ABS DREQL 
IDADR NOP 
FNMBR DEC 25834     MAP SET UP SECURITY CODE
ZBIT  OCT 10000     "Z" BIT 
IWPTO EQU ZBIT      "I WILL PROCESS TIME-OUT" BIT 
SEQN# OCT 0         SEQUENCE NUMBER 
*                                            EQT
SPEQT NOP           HOLDS ADDRESS OF "RESERVED" EQT 
TEMP  NOP 
TEMP2 NOP 
* 
*     NOTE: DO NOT CHANGE ORDER OF "VLU", "RLU" OR "RNODE"
* 
VLU   NOP 
RLU   NOP 
RNODE NOP 
* 
CNTR  NOP 
@VLU  DEF VLU 
      END 
    