ASMB,R,Q,C
      NAM LUMAP,18,30 91750-16133 REV.2013 800317 ALL 
      EXT DSTIO,EXEC,CNUMD,KCVT,.MVW,XLUEX,D$OVR
      EXT #MSTC,#RSAX,#LOGR 
*#    EXT IO3K,#LU3K
      EXT #NODE,#LMPE,#SPLU,#LUMP,PGMAD 
      SPC 1 
******************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979.  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.       *
******************************************************************
* 
* 
*    NAME: LUMAP
*  SOURCE: 91750-18133
*   RELOC: 91750-16133
*    PGMR: JOHN LAMPING 
* 
*    WRITTEN BY LYLE WEIMAN [MARCH 1979]
*    MODIFIED BY JOHN LAMPING [NOVEMBER 1979] 
* 
* 
* 
*     LUMAP IS THE DS/1000 PROGRAM WHICH PERFORMS THE REMOTE I/O. 
*     IT IS PART OF THE DVV00/LUQUE/LUMAP TRIUMVIRATE.
* 
*     REMOTE "EXEC" CALLS ARE ISSUED VIA CALLS TO SUBROUTINE
*     "DSTIO", WITHOUT WAITING FOR THE REPLY. 
* 
*     THESE ARE "NO-WAIT" CALLS, THEREFORE LUMAP IS NOT A BOTTLENECK
*     TO SYSTEM "MAPPED-I/O" TRAFFIC. 
* 
*NOTE: PROVISION HAS BEEN MADE FOR "VIRTUAL TERMINAL" 
*     I/O TO/FROM HP 3000 NODES.  TO ALLOW THIS CAPABILITY, REMOVE
*     THE TWO CHARACTERS *# IN COLUMNS 1 & 2 FROM ALL LINES 
*     WHICH HAVE THEM, RE-ASSEMBLE, AND CODE A MODULE ANSWERING 
*     A CALL TO IO3K WHICH HAS A "DSTIO-LIKE" CALLING SEQUENCE
*     (SEE INTERNAL CODE).  PROVISION MUST ALSO BE MADE FOR SETTING UP
*     A MAP ENTRY WHEN A REMOTE HP 3000 SESSION "SIGNS ON", AND FOR 
*     CLEARING IT UPON TERMINATION OF THE SESSION.
      SKP 
* GLBLK-START 
* 
******************************************************************
*                                                                *
*     G L O B A L   B L O C K               REV 2001 790531      *
*                                                                *
*     GLOBAL OFFSETS INTO DS/1000 MESSAGE BUFFERS, USED BY:      *
*                                                                *
*         REMAT, RFMST, DEXEC, DMESS, FLOAD, POPEN, #MAST        *
*         GET,   #SLAV, RQCNV, RPCNV, GRPM,  DINIT, PTOPM        *
*         EXECM, EXECW, OPERM, RFAM1, RFAM2, DLIST, DLIS3        *
*         DSTIO, LUMAP, #CMGT                                    *
******************************************************************
* 
***!!!!! THE ORDER OF THE FIRST 7 WORDS (#STR THRU #ENO) IS      *
***!!!!!     FIXED BY THE REQUIREMENT THAT THE STREAM, ADDRESSES *
***!!!!!     AND ERROR CODES ALWAYS BE IN THE SAME PLACE,        *
***!!!!!     REGARDLESS OF MESSAGE FORMAT.  THIS MAKES STORE-AND-*
***!!!!!     FORWARD CODE MUCH SIMPLER.                          *
#STR  EQU 0         STREAM WORD.
#SEQ  EQU #STR+1    SEQUENCE NUMBER.
#SRC  EQU #SEQ+1    SOURCE NODE #.
#DST  EQU #SRC+1    DEST. NODE #. 
#EC1  EQU #DST+1    REPLY ECOD1.
#EC2  EQU #EC1+1    REPLY ECOD2.
#ENO  EQU #EC2+1    NUMBER OF NODE REPORTING ERROR. 
* 
#ECQ  EQU #ENO+1    ERROR CODE QUALIFIER (BITS 4 TO 7)
#LVL  EQU #ECQ      MESSAGE FORMAT LEVEL (BITS 0 TO 3)
#MAS  EQU #LVL+1    MA "SEND" SEQ. #
#MAR  EQU #MAS+1    MA "RECV" SEQ. #
#MAC  EQU #MAR+1    MA "CANCEL" FLAGS 
#HCT  EQU #MAC+1    HOP COUNT 
#SID  EQU #HCT+1    SESSION ID WORD 
* 
#EHD  EQU #SID      LAST ITEM OF HEADER 
#MHD  EQU #EHD+1    MINIMUM HEADER SIZE 
#REQ  EQU #MHD      START OF REQUEST SPECIFIC AREA
#REP  EQU #MHD      START OF REPLY SPECIFIC AREA
* 
#MXR  EQU #MHD+24   <<< MAXIMUM DS REQ/REPLY BUFFER SIZE >>>
#LSZ  EQU 2         <<< SIZE OF LOCAL APPENDAGE AREA >>>
* 
******************************************************************
* 
* GLBLK-END 
      SKP 
* DXBLK-START 
* 
******************************************************************
*                                                                *
*      D E X E C   B L O C K                REV 2001 790716      *
*                                                                *
*      OFFSETS INTO DS/1000 DEXEC MESSAGE BUFFERS, USED BY:      *
*                                                                *
*       DEXEC, EXECM, EXECW, RQCNV, RPCNV, FLOAD, REMAT          *
*       DSTIO, LUMAP                                             *
******************************************************************
* 
* OFFSETS INTO DEXEC REQUEST BUFFERS. 
* 
#ICD  EQU #REQ      ICODE FOR DEXEC(ALL)
#CNW  EQU #ICD+1    CONWD FOR DEXEC(1,2,3,13) 
#CWX  EQU #CNW+1    DLUEX EXTENSION FOR DEXEC(1,2,3,13) 
#BFL  EQU #CWX+1    IBUFL FOR DEXEC(1,2)
#PM1  EQU #BFL+1    IPRM1 FOR DEXEC(1,2)
#PM2  EQU #PM1+1    IPRM2 FOR DEXEC(1,2)
#PRM  EQU #CWX+1    IPRAM FOR DEXEC(3)
#PGN  EQU #ICD+1    PRGNM FOR DEXEC(6,9,10,12,23,24,99) 
#INU  EQU #PGN+3    INUMB FOR DEXEC(6)
#DPM  EQU #INU+1    PARMS FOR DEXEC(6)          (5-WORD AREA) 
#PMS  EQU #PGN+3    PARMS FOR DEXEC(9,10,23,24) (5-WORD AREA) 
#IBF  EQU #PMS+5    IBUFR FOR DEXEC(9,10,23,24) 
#IBL  EQU #IBF+1    IBUFL FOR DEXEC(9,10,23,24) 
#FNO  EQU #IBL+1    FNOD  FOR DEXEC(9)          (APLDR) 
#RSL  EQU #PGN+3    IRESL FOR DEXEC(12) 
#MPL  EQU #RSL+1    MTPLE FOR DEXEC(12) 
#HRS  EQU #MPL+1    IHRS  FOR DEXEC(12) 
#MIN  EQU #HRS+1    IMIN  FOR DEXEC(12) 
#SEC  EQU #MIN+1    ISECS FOR DEXEC(12) 
#MSC  EQU #SEC+1    MSECS FOR DEXEC(12) 
#PAR  EQU #ICD+1    PARTI FOR DEXEC(25)         (PARTITION #) 
#IST  EQU #PGN+3    ISTAT FOR DEXEC(99) 
* 
* OFFSETS INTO DEXEC REPLY BUFFERS. 
* 
#EQ5  EQU #EC1      EQT 5 FOR DEXEC(1,2,3)
#XML  EQU #EC2      TRANSMISSION LOG (DEXEC 1,2)
#RPM  EQU #REP      PRAMS FOR DEXEC(9,23)       (5-WORD AREA) 
#TMS  EQU #REP      MSEC  FOR DEXEC(11) 
#TSC  EQU #TMS+1    SEC   FOR DEXEC(11) 
#TMN  EQU #TSC+1    MIN   FOR DEXEC(11) 
#THR  EQU #TMN+1    HRS   FOR DEXEC(11) 
#TDA  EQU #THR+1    DAY   FOR DEXEC(11) 
#TYR  EQU #TDA+1    YEAR  FOR DEXEC(11) 
#ST1  EQU #REP      ISTA1 FOR DEXEC(13) 
#ST2  EQU #ST1+1    ISTA2 FOR DEXEC(13) 
#ST3  EQU #ST2+1    ISTA3 FOR DEXEC(13) 
#PAG  EQU #REP      IPAGE FOR DEXEC(25) 
#IPN  EQU #PAG+1    IPNUM FOR DEXEC(25) 
#PST  EQU #IPN+1    ISTAT FOR DEXEC(25) 
#KST  EQU #REP      ISTAT FOR DEXEC(99) 
* 
* MAXIMUM SIZE OF DEXEC REQUEST/REPLY BUFFER. 
* 
#DLW  EQU #MHD+11+#LSZ    M A X I M U M   S I Z E   ! ! ! 
* 
* MAXIMUM SIZE OF DEXEC/EXECM DATA BUFFER.
* 
#DBS  EQU 512          M A X I M U M   S I Z E  ! ! ! 
* 
* DXBLK-END 
      SKP 
LUMAP EQU * 
      CLA,INA       TURN ON 
      STA D$OVR       SESSION OVERRIDE
      LDA #LUMP     SAVE CLASS NUMBER 
      STA #MSTC      IN "#CMGT" (WITH "NO-DEALLOCATE" BIT)
      IOR =B40000   ADD "SAVE BUFFER" BIT 
      STA CLASS       AND SAVE WITH THAT
      LDA #SPLU     CONFIGURE CONTROL WORD
      IOR BIT15     WITH "TRUE LU" BIT
      STA RTRLU     RETRY 
      STA STPLU     STOP
      STA SPCLU     REPLY 
      JSB CNUMD     CONVERT LOCAL 
      DEF *+3         NODE NUMBER 
      DEF #NODE         TO ASCII
      DEF .NOD. 
* 
*     SET UP TRANSACTION TABLE (TT) 
* 
* 
      LDA NTTEN     NEGATIVE # TT ENTRIES 
      STA CNTR
      LDA @TT       ADDRESS OF TT 
      CLB 
SLUP  EQU *         LOOP
      STB A,I         (0 IN 1ST WORD OF ENTRY DENOTES EMPTY)
      ADA  TTSIZ   INCREMENT TO NEXT ENTRY
      ISZ CNTR      END OF SET-UP?
      JMP SLUP      NO, CONTINUE
* 
*     HERE TO AWAIT NEXT TRANSACTION (CLASS BUFFER).
*     MAY BE ONE OF THREE KINDS:
* 
*     1) NEW REQUEST.  SCAN TRANSACTION TABLE (TT). 
*        IF AN EMPTY "TRANSACTION TABLE" (TT) ENTRY 
*        CANNOT BE FOUND, THEN DRIVER IS CALLED TO RE-TRY THE REQUEST 
*        AFTER ONE SECOND.  IF AN ENTRY CAN BE FOUND, THEN A SET-UP 
*        IS MADE TO SEND THE REQUEST TO THE REMOTE NODE.  SUBROUTINE
*        "DSTIO" IS CALLED, AND RETURN IS REQUESTED WITHOUT WAITING 
*        FOR THE REPLY.  THE TRANSACTION SEQUENCE NUMBER (ASSIGNED BY 
*        #RSAX) IS USED TO UNIQUELY IDENTIFY THIS REQUEST.  ALL INFORMATION 
*        REQUIRED TO SEND THE REPLY BACK TO THE ORIGINAL REQUESTOR IS 
*        SAVED IN THE "TT" UNDER THIS KEY.  LUMAP AWAITS THE NEXT 
*        CLASS BUFFER.
* 
*     2) A REPLY TO THE "DSTIO" CALL.  THE SEQUENCE NUMBER IN THE 
*        "DS HEADER" IS USED TO SCAN THE TRANSACTION TABLE, LOOKING FOR 
*        THE ORIGINAL REQUEST.  IF NO MATCH IS FOUND, THE CLASS BUFFER
*        IS DISCARDED.  OTHERWISE, THE REPLY INFORMATION, AND DATA, 
*        IF ANY, ARE SENT BACK TO THE ORIGINAL REQUESTING PROGRAM 
*        VIA THE DRIVER, USING A CLASS-I/O CALL (COMPLETIONS OF THESE 
*        REQUESTS ARE DESCRIBED IN # 3, BELOW).  THE TT ENTRY IS
*        CLEARED, AND LUMAP GOES BACK TO AWAIT THE NEXT REQUEST.
* 
*     3) COMPLETION OF THE CLASS-I/O "WRITE" (THESE ARE DISCARDED). 
* 
GET   EQU * 
      JSB EXEC      OBTAIN NEXT REQUEST 
      DEF *+8 
      DEF D21I
      DEF CLASS 
@DVDT DEF DVDTA     DRIVER "HEADER" AREA & DATA 
      DEF DVSIZ     SIZE OF AREA
      DEF VEQT      "VIRTUAL EQT"/SEQ.#(ON REPLIES) 
      DEF TOVAL     I/O TIME-OUT TO SET/LNTH DS HEADER(REPLIES) 
      DEF IPRM3     RETURN READ/WRITE CODE
      JMP BADCL     OUR CLASS # IS BAD--CLEAR IT & QUIT 
      DST ABREG     SAVE REGISTERS
      SPC 2 
      LDA IPRM3     IF REQUEST WAS A "WRITE", THEN IT'S 
      CPA D2          ONE OF MY OWN REPLIES TO DRIVER.
      JMP DUMP        (IGNORE IT) 
      LDA TOVAL     IS THIS A REPLY?
      SSA,RSS 
      JMP SRPLY     YES.
      SZB,RSS       IS THIS A GOOD REQUEST? 
      JMP DUMP      NO, IGNORE IT 
      JSB DSCRD     YES, FIRST CHUCK OLD BUFFER 
      HED NEW REQUEST INITIATION SECTION
*     THIS IS A NEW REQUEST TO BE INITIATED.
* 
      LDA @DVDT     MOVE DRIVER HEADER
      LDB @NODE        OUT OF 
      JSB .MVW           I/O BUFFER 
      DEF DVHDL     DRIVER HEADER LENGTH
      NOP 
* 
* 
*     SCAN TT FOR AN AVAILABLE ENTRY. 
* 
      LDA NTTEN     NEGATIVE # TT ENTRIES 
      STA CNTR
      LDA @TT 
NULUP EQU *         SEARCH LOOP LOOKING FOR AVAILABLE ENTRY 
      LDB A,I       IS
      SZB,RSS       THIS ONE EMPTY? 
      JMP NURQ      YES, START NEW REQUEST
* 
*     IF THIS ENTRY HAS THE SAME "ORIGINAL REQUESTOR EQT/DVT" ADDRESS,
*     THEN THE ORIGINAL REQUEST FOR IT MUST HAVE TIMED OUT, AND IT IS 
*     OBSOLETE (BECAUSE THE ORIGINAL REQUEST'S EQT/DVT REMAINS "BUSY" THROUGHOUT
*     THE EXECUTION OF THE REQUEST).
* 
      STA TEMP
      ADA @.C1       ADVANCE TO ORIGINAL EQT/DVT ADDRESS OF ENTRY 
      LDB A,I       LOAD THE EQT/DVT ADDRESS FOR THE ENTRY
      CPB VEQT          DOES IT MATCH THIS ONE? 
      JMP NX1       YES, WE'LL JUST USE THIS ENTRY. 
      LDA TEMP      NO, RECOVER TABLE ADDRESS, AND
      ADA  TTSIZ   ADVANCE TO NEXT ENTRY
      ISZ CNTR      END OF TABLE? 
      JMP NULUP     NO, CONTINUE
      JMP RETRY     NO TABLE SPACE NOW.  TRY AGAIN LATER. 
* 
NX1   EQU *         HERE TO RE-USE TABLE ENTRY
      LDA TEMP
* 
*     HERE WE HAVE AN AVAILABLE TT ENTRY. 
NURQ  EQU * 
      JSB SETPT     SET UP POINTERS 
      LDA @BUFR     SET ADDRESS OF ACTUAL DATA
      STA @@@@          INTO "DSTIO" CALL 
      LDA @PRM1     SET PARAMETER POINTER 
      STA @@@1        INTO DSTIO CALL 
* 
      LDA CONWD     SET REQUEST CODE
      STA @RC,I     SAVE IN TT
      AND D3
      IOR =B100000  SET "NO-ABORT"  INDICATION
      STA RCODE 
      LDA DSEQN     SAVE DRIVER-ASSIGNED SEQUENCE 
      STA @DSEQ,I     NUMBER IN TT
      LDA VEQT
      STA @EQT,I    SAVE ORIGINAL EQT/DVT ADDRESS IN TT 
      LDA REQLN     SET REQUEST LENGTH
      STA @ORLN,I   SAVE IN TT
      STA DLEN
      LDA REQLN     VERIFY DATA WILL FIT
      JSB CKLEN       IN OUR BUFFER 
      LDB CONWD     MUST ALSO CHECK 
      LDA IPRM2       SECOND BUFFER 
      BLF,SLB           IF THIS IS
      JSB CKLEN           A WRITE/READ
* 
*#    LDA RLU       LOAD "REMOTE LU" WORD 
*#    SSA,RSS       NEGATIVE? 
*#    JMP X1        NO, DON'T CHECK FOR I/O TO HP 3000
*#    CMA,INA 
*#    CPA #LU3K     SAME AS LU TO HP 3000?
*#    JMP STDLS     YES, I/O TO HP 3000 
      LDA RLU       STRIP OFF "OPTION" BITS 
      AND =B377 
      LDB CONWD     IS THE
      BLF,BLF         TRANSPARENT BIT 
      RBL,RBL           SET?
      SLB 
      STA RLU       YES, SUPPRES SPECIAL FEATURES 
      IOR SIGNB     SIGNAL USE OF "TRUE" LU 
      STA XLU 
      LDA CONWD 
      AND =B3700    MASK ONLY SUB-FUNCTION BITS 
      STA XLU+1 
      LDA RCODE     GET THE  REQUEST CODE AGAIN 
      AND D3        MASK ONLY REQUEST CODE PART 
      CPA D3        IS THIS A "CONTROL" REQUEST?
      JMP CNTRL     YES.
      SPC 2 
      LDB CONWD 
      SLB,RSS       ASCII "WRITE" REQUEST?
      JMP ASCWR     YES 
* 
* 
*     ASCII "READ" REQUEST. 
* 
      LDA RLU       GET THE 
      RAL             PROMPT INDICATION 
      BLF,SLB       Z BIT SET?
      JMP WREAD     YES, MUST DO WRITE/READ 
      SSA,RSS       SHOULD WE PROMPT? 
      JMP XQUT      NO. 
* 
*     CHANGE ORDINARY "READ" INTO "PROMPT READ" 
* 
      CLB           SET SECOND BUFFER LENGTH
      STB IPRM2       TO ZERO 
* 
*     MAKE PROMPT READ
* 
WREAD LDB XLU+1     SET "INTERACTIVE WRITE/READ" BIT
      ADB =B4000
      STB XLU+1 
      LDB @BUFR     MAKE SECOND BUFFER
      STB @@@1        POINT TO OUR AREA 
      SSA,RSS       SHOULD WE PROMPT? 
      JMP XQUT      NO
      LDB IPRM2     POINT TO
      CLE,SSB,RSS     WORD CONTAINING 
      JMP WREA1         FIRST CHARACTER 
      CMB,INB             PAST USERS
      CLE,ERB               WRITE BUFFER
WREA1 ADB @@@1  
      SEZ,RSS       LOWER BYTE? 
      JMP WREA2     NO
      LDA B,I       YES, PUT
      AND =B177400    A SPACE 
      ADA =B40          THERE 
      INB           ADVANCE TO FIRST FREE WORD
WREA2 LDA .NOD.     STORE FIRST DIGIT OF
      ADA =B4000      NODE NUMBER WITH
      STA B,I           "(" IN FRONT
      LDA .NOD.+1   STORE 
      INB             REST OF 
      STA B,I           NODE
      LDA .NOD.+2         NUMBER
      INB 
      STA B,I 
      LDA =A)_      STORE CLOSING 
      INB             ") "
      STA B,I 
      CMB           COMPUTE 
      ADB @@@1        NEW 
      CMB,INB           LENGTH
      STB IPRM2 
      JMP XQUT      DO REQUEST
      SKP 
*     "ASCII" WRITE REQUEST.
*     IF SPECIFICALLY DIRECTED TO DO SO,
*     THE USER-SPECIFIED MESSAGE WILL BE PRECEDED BY A
*     MESSAGE (GENERATED BY THIS PROGRAM) INDICATING ITS SOURCE & TIME
* 
ASCWR EQU * 
      LDA RLU       SHOULD WE INHIBIT 
      SSA,RSS          THE MESSAGE HEADER?
      JMP XQUT      YES.
      JSB EXEC      GET TIME-OF-DAY 
      DEF *+3 
      DEF D11 
      DEF PARAM 
* 
      JSB CNUMD     CONVERT DAY NUMBER
      DEF *+3 
      DEF PARAM+4   DAY 
      DEF .DAY. 
      JSB KCVT      CONVERT SECONDS 
      DEF *+2 
      DEF PARAM+1 
      STA .SEC. 
      JSB KCVT      CONVERT MINUTES 
      DEF *+2 
      DEF PARAM+2 
      STA .MIN. 
      JSB KCVT      CONVERT HOURS 
      DEF *+2 
      DEF PARAM+3 
      STA .HR.
* 
*     FILL IN PROGRAM'S NAME, OR (SYS)
* 
      LDA IDADR     IS THE ID SEGMENT ADDRESS OF
      SZA,RSS         CALLING PROGRAM KNOWN?
      JMP NOPRG     NO, FILL IN (SYS) 
      CMA,INA       YES, 'PGMAD' WILL FILL IN NAME
      STA IDADR 
      JSB PGMAD 
      DEF *+3 
      DEF .PRG.     FILL IN PROGRAM NAME
      DEF IDADR       FROM ID SEGMENT ADDRESS 
      LDA @PRGM     LOAD ADDRESS OF "PRGM <PRGM NAME>"
      RSS 
NOPRG LDA @SYS      LOAD ADDRESS OF "(SYS I/O)" 
      LDB @SRCP     MOVE SOURCE PROCESS NAME INTO AREA
      JSB .MVW
      DEF D6
      NOP 
      LDA @MHED     MOVE MSG HDR INTO AREA IMMEDIATELY
      LDB @MXX       PRECEDING DATA BUFFER
      STB @@@@      SET DATA ADDRESS FOR "DSTIO" CALL 
      JSB .MVW
      DEF MHEDL 
      NOP 
      LDA DLEN      WAS ORIGINAL REQUEST
      LDB MHEDL       LENGTH SPECIFIED IN 
      SSA,RSS          CHARACTERS?
      JMP *+3       NO, WORDS 
      RBL           CHARACTERS.  CONVERT HEADER LENGTH TO 
      CMB,INB          NEGATIVE # CHARACTERS
      ADA B         ADD HEADER LENGTH 
      STA DLEN      STORE COMBINED LENGTH 
      SKP 
*     ***** MAKE "DSTIO" CALL 
XQUT  EQU * 
      SPC 2 
      JSB DSTIO     EXECUTE REMOTE I/O REQUEST
      DEF *+8 
      DEF RNODE     REMOTE NODE NUMBER
      DEF RCODE     REQUEST CODE
      DEF XLU        DOUBLE-WD LU/SUBFUNCTION 
@@@@  NOP           ADDRESS OF BUFFER STORED HERE 
      DEF DLEN      DATA LENGTH 
@@@1  NOP            OPTIONAL PARAM/"PROMPT" BUFFER STORED HERE 
      DEF IPRM2      2ND OPTIONAL PARAM/"PROMPT" BUFFER LEN 
      JMP DSERR     ERROR RETURN
XQ5   EQU * 
      STA @SEQ#,I   SAVE TRANSACTION SEQUENCE NUMBER
      JMP GET       AWAIT NEXT CLASS BUFFER 
      SPC 2 
*     RETRY ENTRY FOR CASE WHERE PARAMETERS ARE IN TT ENTRY 
* 
RETR1 LDA @EQT,I    GET PARAMETERS
      STA VEQT        FROM
      LDA @DSEQ,I       TT ENTRY
      STA DSEQN 
      CLA           CLEAR 
      STA @RC,I       TT ENTRY
* 
*     HERE TO FORCE DRIVER TO RE-TRY REQUEST LATER
* 
RETRY EQU * 
      JSB XLUEX 
      DEF *+7 
      DEF K2N       NO-ABORT
      DEF RTRLU 
      DEF D0        BUFFER
      DEF D0          IS A DUMMY
      DEF VEQT      ORIGINAL EQT/DVT ADDRESS
      DEF DSEQN     SEQUENCE NUMBER 
      NOP           IGNORE ERRORS 
      JMP GET       AWAIT NEXT CLASS BUFFER 
      SPC 2 
*     HERE TO SEND REQUEST TO HP 3000 
* 
STDLS EQU * 
*#    JSB IO3K
*#    DEF *+5 
*#    DEF RCODE     1,2 OR 3
*#    DEF RLU       SESSION # 
*#    DEF @@@@,I    BUFFER ADDRESS
*#    DEF DLEN      BUFFER LENGTH 
*#    JMP DSERR     --ERROR RETURN--
*#    JMP XQ5         AWAIT REPLY 
      SPC 2 
      SPC 2 
CNTRL EQU *         HERE TO EXECUTE "CONTROL" REQUEST 
      JSB DSTIO     SEND REQUEST CODE 
      DEF *+5 
      DEF RNODE 
      DEF RCODE 
      DEF XLU 
@PRM1 DEF IPRM1 
      JMP DSERR     -ERROR- RETURN
      JMP XQ5       NORMAL RETURN 
      HED "SEND REPLY TO ORIGINAL REQUESTOR" SECTION
*     HERE WHEN WE HAVE THE REPLY TO A "MAPPED I/O" REQUEST 
* 
SRPLY EQU * 
* 
*     !! WE NEED TO GET EXTENDED STATUS WORDS TO PASS TO DRIVER. !! 
* 
*     OBTAIN TRANSACTION SEQUENCE NUMBER, AND SET UP POINTERS TO
*     VARIOUS PARTS OF DS HEADER. 
      SPC 1 
*     NOTE: OUR "DVDTA" BUFFER CONTAINS THE USER DATA (IF ANY), 
*     FOLLOWED BY THE "DEXEC/DSTIO" REPLY INFO.  WE REQUIRE THE 
*     TRANSACTION SEQUENCE NUMBER FROM THIS, IN ORDER TO FIND THE 
*     ORIGINAL REQUESTOR FROM OUR TT TABLE. 
      SPC 2 
      LDB #MSTC     GET CLASS NUMBER
      JSB #LOGR     LOG THIS REPLY
      JSB DSCRD     BLEW IT, DISCARD BUFFER 
      LDA @DVDT     COMPUTE ADDRESS OF DS HEADER
      ADA ABREG+1 
      STA @STR
      ADA =L#SEQ-#STR ADVANCE TO SEQUENCE # 
      STA @HSEQ     SAVE ADDRESS OF SEQUENCE #
      LDB A,I       OBTAIN ITS TRANSACTION SEQUENCE NUMBER
      STB TSEQ#     SAVE LOCALLY SO WE HAVE DIRECT ADDRESS
      ADA =L#EC1-#SEQ  IN SEARCH.  ADVANCE TO ERROR CODE
      STA @HERR     SAVE ADDRESS OF ERROR CODE
      ADA =L#EC2-#EC1 ADVANCE TO 2ND ERROR CODE WORD
      STA @HER2 
      ADA =L#ENO-#EC2 ADVANCE TO REPORTING NODE # 
      STA @HENO     SAVE ADDRESS OF REPORTING NODE #
      ADA CONS1       ADVANCE TO A-REGISTER RETURN AREA 
      STA @HEQ5 
      ADA =L#XML-#EQ5 ADVANCE TO B-REGISTER RETURN AREA 
      STA @HXML 
      LDA TOVAL 
      LDB DVDTA 
      CPA D1        MA RETRANSMISSION REQUEST?
      JMP SRP1      YES, SEQUENCE NUMBER IS FIRST WORD
      SZA           WAS THERE A TRANSACTION TIME-OUT? 
      JMP SRP2      NO. 
      LDB VEQT      YES, SET THE SEQUENCE NUMBER FOR THE
SRP1  STB TSEQ#       T.T. SEARCH.
SRP2  JSB #RSAX     RELEASE TCB 
      DEF *+3 
      DEF D6
      DEF TSEQ# 
* 
*     SEARCH TRANSACTION TABLE FOR AN ENTRY WHICH 
*     MATCHES THIS ONE'S TRANSACTION SEQUENCE NUMBER
* 
      LDA NTTEN     SET # ENTRIES COUNTER 
      STA CNTR
      LDA @TT 
SRLUP LDB A,I       IS ENTRY
      SZB,RSS         EMPTY?
      JMP SRLP1     YES 
      LDB A         NO, GET 
      INB             TRANSACTION 
      LDB B,I           SEQUENCE NUMBER 
      CPB TSEQ#     IS THIS THE ONE WE WANT?
      JMP SRP5      YES 
*     NO MATCH.  CONTINUE THE SEARCH
SRLP1 ADA  TTSIZ   ADVANCE TO NEXT ENTRY
      ISZ CNTR      END OF LOOP?
      JMP SRLUP     NO, CONTINUE
* 
*     NO ENTRY FOUND. IF 'LUMAP' WAS ABORTED & SUBSEQUENTLY RE-SCHEDULED, 
*     ITS TABLES WOULD BE EMPTY, BUT REPLIES MAY STILL BE COMING IN.
*     WE CAN DO NOTHING BUT IGNORE THIS BUFFER.  THE USER PROGRAM WILL
*     EVENTUALLY TIME-OUT.
* 
      JMP GET       IGNORE THIS BUFFER
* 
*     HAVE FOUND THE ENTRY.  SET UP POINTERS
* 
SRP5  EQU * 
      JSB SETPT     SET UP THE POINTERS 
* 
      LDA TOVAL     MA RETRANSMISSION 
      CPA D1          REQUEST?
      JMP RETR1     YES, TELL DRIVER TO RETRY 
      SZA           NO, TRANSACTION TIME-OUT? 
      JMP SRP6      NO. 
      LDA "DS       SET ERROR "DSO5"
      LDB "05 
      DST @HERR,I 
      LDA #NODE     STORE LOCAL NODE #
      IOR SIGNB 
      STA @HENO,I     IN AREA 
SRP6  EQU * 
*     SET UP "DRIVER REPLY" HEADER (DRIVER SEQUENCE #,
*     (A) - REGISTER RETURN STATUS, TRANSMISSION LOG, ETC.) 
      LDA @HENO,I   WAS THERE 
      SSA,RSS          AN ERROR RETURNED? 
      JMP XQ1       NO. 
      DLD @HERR,I   YES, LOAD ERROR CODE
      JMP DSERR     HANDLE IT 
XQ1   LDA @DVDT     COMPUTE THE ADDRESS OF THE REPLY DATA,
      ADA MRPLY          BACK UP TO ALLOW ROOM FOR DVR HDR
      STA @RPLY     SET ADDRESS FOR SENDING REPLY TO DRIVER 
      LDB @HEQ5,I   PASS I/O STATUS 
      STB A,I         TO DRIVER 
      INA 
      LDB @HXML,I   PASS TRANSMISSION LOG 
      STB A,I         TO DRIVER 
      LDB PRPLY 
      LDA @RC,I     WAS ORIGINAL
      AND D3         REQUEST
      CPA D1           A "READ" ? 
      RSS 
      JMP XQ3           NO, DON'T ADJUST THE LENGTH 
      LDB @ORLN,I   YES.  WAS ORIGINAL REQUEST LENGTH 
      SSB,RSS         SPECIFIED IN CHARACTERS?
      JMP XQ2       NO
      LDB PRPLY     YES,
      RBL             CONVERT REPLY LENGTH TO CHARACTERS
      ADB @HXML,I     INCLUDING # CHARS IN USER DATA
      CMB,INB           RETURN A NEGATIVE NUMBER OF CHARS 
      JMP XQ3 
XQ2   EQU *         ORIGINAL RQST LNTH SPECIFIED IN WORDS 
      LDB @HXML,I    USE USER DATA LENGTH 
      ADB PRPLY 
XQ3   EQU * 
      STB DLEN      STORE LENGTH
* 
      JSB XLUEX     SEND THIS INFO TO DRIVER
      DEF *+8 
      DEF D18I
      DEF SPCLU 
@RPLY NOP           SET TO ADDRESS OF DRIVER REPLY DATA 
      DEF DLEN
      DEF @EQT,I     ORIGINAL REQUEST EQT/DVT ADDRESS 
      DEF @DSEQ,I   DRIVER SEQUENCE NUMBER
      DEF #MSTC 
      NOP           IGNORE ERRORS 
* 
CLEAR EQU *         HERE TO CLEAR TT ENTRY
      CLA 
      STA @RC,I 
      JMP GET 
      SPC 2 
BADCL EQU *         HERE IF CLASS # IS BAD
      CLA           CLEAR CLASS NUMBER STORED IN 'RES'
      STA #LUMP 
      JSB EXEC        & TERMINATE.  IF A NEW RQST COMES IN, LUQUE WILL
      DEF *+2         NOTIFY US.
      DEF D6
      SPC 2 
      SKP 
*     ERRORS SECTION
DS03  EQU *         HERE FOR ILLEGAL LENGTH 
      DLD "DS03 
* 
*     HERE ON "DS" ERRORS.
*     "DS08" ERRORS ARE TRAPPED, AND RETRIED BY SENDING THEM
*     BACK TO THE "LU MAPPING" DRIVER, WHICH RE-TRIES A FIXED 
*     NUMBER OF TIMES.
* 
DSERR EQU * 
      CPA "DS       IS THIS A "DS08" ERROR? 
      RSS 
      JMP DSER1 
      CPB "08 
      RSS 
      JMP DSER1    NO, PRINT ERROR
      JMP RETR1 
* 
DSER1 EQU * 
      DST #LMPE     STORE ERROR 
      LDA @HENO,I   LOAD REPORTING NODE NUMBER
      ELA,CLE,ERA   CLEAR SIGN BIT
      STA #LMPE+2 
      JSB XLUEX     SEND "STOP" 
      DEF *+7 
      DEF K2N         NO-ABORT
      DEF STPLU     "SPECIAL" LU + 'STOP' CODE
      DEF D0        DUMMY 
      DEF D0          BUFFER
      DEF @EQT,I    ORIGINAL EQT/DVT ADDRESS
      DEF @DSEQ,I   DRIVER SEQUENCE NUMBER
      NOP           IGNORE ERRORS 
      JMP CLEAR     CLEAR TT ENTRY
      SPC 2 
*     SUBROUTINE TO SET UP THE TT POINTERS
* 
SETPT NOP 
      STA @RC 
      INA 
      STA @SEQ# 
      INA 
      STA @ORLN 
      INA 
      STA @EQT
      INA 
      STA @DSEQ 
      JMP SETPT,I   RETURN TO CALLER
      SPC 2 
* 
*     CHECK REQUEST LENGTH IN A, JUMP TO DS03 IF ILLEGAL
* 
CKLEN NOP 
      SSA,RSS       WAS LENGTH IN CHARACTERS? 
      JMP *+4       NO
      CMA,INA       YES, CONVERT
      INA             TO WORDS
      ARS 
      ADA MAXBL     BIGGER THAN THE LIMIT?
      SSA,RSS 
      JMP DS03      YES, ERROR
      JMP CKLEN,I   NO, OKAY
      SPC 2 
* 
*     SUBROUTINE TO DISCARD BUFFER FROM CLASS 
* 
DSCRD NOP 
      JSB EXEC      DO CLASS GET WITH DISCARD 
      DEF *+5 
      DEF D21I
      DEF #MSTC 
      DEF DVDTA 
      DEF D0
      NOP           IGNORE ERRORS 
      JMP DSCRD,I 
* 
* 
DUMP  JSB DSCRD 
      JMP GET 
      SKP 
*     DATA SECTION
* 
      SUP 
*     EQUATES 
.RQST EQU 9         SIZE OF DRIVER REQUEST HEADER 
.RPLY EQU 4         SIZE OF DRIVER REPLY HEADER 
.MXBL EQU 512       MAXIMUM ALLOWABLE USER DATA SIZE
* 
CONS1 ABS #EQ5-#ENO 
MAXBL ABS -.MXBL-1
MRPLY ABS -.RPLY    NEGATIVE OF DRIVER REPLY HEADER LENGTH
PRPLY ABS .RPLY     POSITIVE OF DRIVER REPLY HEADER LENGTH
M1    DEC -1
D0    DEC 1 
D1    DEC 1 
D2    DEC 2 
D3    DEC 3 
SIGNB DEF 0,I       SIGN BIT
K2N   OCT 100002    I/O WRITE REQUEST, NO-ABORT 
D6    DEC 6 
D11   DEC 11
"DS03 ASC 2,DS03
"DS   EQU "DS03 
"05   ASC 1,05
"08   ASC 1,08
PARAM BSS 5 
D21I  DEF 21,I
XLU   OCT 0,0       DOUBLE-WORD LU/SUBFUNCTION
* 
*     WARNING:  DO NOT DISTURB THE ORDER OF THE FOLLOWING 
*     TABLES!!! 
* 
* 
*     "DRIVER HEADER" AREA. 
* 
* 
* 
RNODE NOP           REMOTE NODE NUMBER
RLU   NOP           REMOTE LU 
CONWD NOP           ORIGINAL REQUEST 'CONWD'
REQLN NOP           ORIGINAL REQUEST LENGTH 
IPRM1 NOP           1ST OPTIONAL PARAMETER
IPRM2 NOP           2ND OPTIONAL PARAMETER
IPRM3 NOP           RETURNED AS READ/WRITE CODE FOR LAST CLASS-I/O
IDADR NOP           CALLING PROGRAM'S ID SEGMENT ADDRESS, OR ZERO 
DSEQN NOP           DRIVER-ASSIGNED SEQUENCE NUMBER 
.DVHL EQU *-RNODE    # WORDS IN DRIVER HEADER 
DVHDL ABS .DVHL     SIZE OF HEADER
* 
*    "MESSAGE HEADER" AREA: 
* "MESSAGE FROM NODE # NNNNNN PRGM AAAAA AT DAY DDDDD, HH :MM :SS 
* 
MHEDR ASC 9,MESSAGE FROM NODE # 
.NOD. BSS 3 
SRCP  BSS 6         SOURCE PROCESS
      ASC 4, AT DAY 
.DAY. BSS 3 
      ASC 1,
.HR.  NOP 
      ASC 1, :
.MIN. NOP 
      ASC 1, :
.SEC. NOP 
      OCT 6412      CARRIAGE RETURN/LINE FEED 
.HEDL EQU *-MHEDR   MESSAGE HEADER LENGTH 
DVSIZ ABS .MXBL 
MHEDL ABS .HEDL     LENGTH OF MESSAGE HEADER
@BUFR DEF BUFFR+.DVHL  ADDR OF DATA PORTION OF NEW RQST 
* 
* 
*     END OF FIXED-ORDER TABLES.
* 
@MXX  DEF MXX 
@SYS  DEF SYS 
SYS   ASC 6, (SYS I/O)
@PRGM DEF PRGM
PRGM  ASC 3, PRGM 
.PRG. BSS 3         STORAGE FOR PROGRAM NAME
@SRCP DEF SRCP      ADDRESS WHERE TO STORE PROGRAM NAME OR (SYS I/O)
@NODE DEF RNODE 
@MHED DEF MHEDR 
VEQT  NOP 
ABREG BSS 2 
TEMP  NOP 
CNTR  NOP 
TSEQ# NOP           THIS TRANSACTION'S SEQUENCE NUMBER
CLASS NOP           CLASS NUMBER WITH NO-DEALLOCATE 
RTRLU NOP 
      OCT 3400      RETRY FUNCTION CODE 
STPLU NOP 
      OCT 3500      STOP FUNCTION CODE
SPCLU NOP 
      OCT 3700      REPLY FUNCTION CODE 
DLEN  NOP 
D18I  OCT 100022    CLASS WRITE, NO-ABORT 
BIT15 OCT 100000
RCODE NOP 
TOVAL NOP           STORAGE FOR TIME-OUT VALUE
@STR  NOP           ADDRESS OF STREAM 
@HSEQ NOP           ADDRESS IN BUFFER OF TRANSACTION SEQ. # 
@HERR NOP 
@HER2 NOP 
@HENO NOP 
@HEQ5 NOP 
@HXML NOP 
      SKP 
*     TRANSACTION TABLE DEFINITIONS 
* 
*     FOLLOWING POINTERS DESCRIBE THE FORMAT & SIZE OF EACH 
*     TT ENTRY. 
*     (DO NOT DISTURB ORDER!) 
* 
@RC   NOP           PNTR TO ORIGINAL REQUEST CODE 
*                   NOTE: IF 1ST WORD IS ZERO, ENTRY IS EMPTY 
@SEQ# NOP           PNTR TO TRANSACTION SEQUENCE NUMBER ENTRY 
@ORLN NOP           PNTR TO ORIGINAL REQUEST LENGTH WORD
@EQT  NOP           PNTR TO ORIGINAL REQUESTOR'S EQT/DVT ADDRESS
@DSEQ NOP           PNTR TO DRIVER-ASSIGNED SEQUENCE NUMBER 
.TSIZ EQU *-@RC     # WORDS IN EACH ENTRY 
@TT   DEF TTABL 
      SPC 2 
*     DEFINE SIZE & # ENTRIES IN TRANSACTION TABLE
      SPC 2 
.NENT EQU 64        # TABLE ENTRIES 
NTTEN ABS -.NENT    NEGATIVE # ENTRIES IN TABLE 
TTSIZ ABS .TSIZ     # WORDS PER ENTRY 
*     DEFINE OFFSET FROM REQUEST CODE TO EQT/DVT ADDRESS ENTRIES
@.C1  ABS @EQT-@RC
* 
MXX   BSS .HEDL-.RQST     SPACE FOR MESSAGE HEADER
BUFFR BSS .MXBL 
      BSS 4         EXTRA SPACE FOR APPENDED PROMPT 
DVDTA EQU BUFFR 
      SUP 
TTABL EQU *         TRANSACTION TABLE 
      REP .NENT 
      BSS .TSIZ 
A     EQU 0 
B     EQU 1 
      END LUMAP 
                                                                              