ASMB,R,Q,C
      HED DSTIO: DS/1000 REMOTE EXEC ROUTINE *(C) HEWLETT-PACKARD CO.1980*
      NAM DSTIO,7 91750-1X101 REV 2013 800506 ALL 
      SPC 1 
*  ***************************************************************
*  * (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 THE HEWLETT-PACKARD COMPANY.   *
*  ***************************************************************
      SPC 1 
*    NAME:   DSTIO
*    SOURCE: 91750-18101
*    RELOC:  91750-1X101
*    PGMR:   LYLE WEIMAN [3-26-79]
*            (CODE IS A MODIFIED FORM OF 'DEXEC' FOR I/O CALLS ONLY)
      SPC 1 
*  <DSTIO> (DISTRIBUTED EXECUTIVE) IS THE DS/1000 USER INTERFACE FOR
*   'TRANSPORTABLE' CALLS TO EITHER THE LOCAL, OR REMOTE-NODE RTE SYSTEM
*   'EXEC' I-O CALLS ONLY.  ITS PURPOSE IS TO BE A SMALL ROUTINE WHICH
*     CAN BE CALLED FOR DISTRIBUTED-I/O, SO MUCH OF 'DEXEC' HAS BEEN
*     LEFT OUT,  IN PARTICULAR, THE SPECIAL CODE TO HANDLE
*     LOCAL CALLS LOCALLY.  ALL REQUESTS ARE BUILT
*     AS 'DEXEC' I/O REQUESTS, AND SENT TO 'EXECM', VIA THE USUAL 
*     COMMUNICATIONS MANAGEMENT PATHS, IN THE DESTINATION NODE. 
*     THEREFORE, THE FOLLOWING REQUIREMENTS EXIST FOR I/O TO THE
*     LOCAL NODE WHEN 'DSTIO' IS USED, WHICH ARE NOT TRUE OF 'DEXEC' :
* 
*     1) NODE MUST BE INITIALIZED 
*     2) 'EXECM' MUST EXIST AND IT MUST BE AN ACTIVE (SCHEDULED) MONITOR
*     3) I/O BUFFER SIZE LIMITED TO 512 WORDS 
*     4) NO 'Z' BUFFER ALLOWED
* 
* 
*  <DSTIO> WILL ACCEPT ONLY REQUEST CODES 1, 2, 3 OR 13.
* 
*  ** UNACCEPTABLE REQUESTS WILL BE REJECTED WITH A "DS06" ERROR! 
* 
*  ** "IO01" IS RETURNED UPON DETECTION OF INCORRECT, MISSING, OR 
*      TOO MANY (>7) PARAMETERS. THIS INCLUDES LUS > 63 TO OLD NODES. 
* 
*  ** "IO04" WILL BE RETURNED FOR BUFFER-ERROR SPECIFICATIONS:
*      'Z-BIT(#12)' SET IN CONWD, REMOTE READ/WRITE BUFFER LENGTH 
*      GREATER THAN 512 WORDS, INTERACTIVE WRITE LENGTH > READ LENGTH.
* 
*    ALL ACCEPTABLE REQUEST CODES WILL BE TRANSMITTED TO THE REMOTE 
*   NODE, VIA STREAM #5, TO BE PROCESSED BY <EXECM>. MASTER (THIS NODE),
*   AND SLAVE (REMOTE NODE) TIMEOUTS, ESTABLISHED WITH <LSTEN>, WILL BE 
*   USED TO PROCESS THESE REQUESTS. 
* 
*  CALLING SEQUENCE:
*   REQUEST CODES 1 & 2:
*     CALL DSTIO(NODE,RCODE,CONWD,BUFR,BUFL[,IPRM1[,IPRM2]])
* 
*   REQUEST CODE 3: 
*     CALL DSTIO(NODE,3,CONWD[,OPTIONAL PARAMETER]) 
      SKP 
*     REQUEST CODE 13:
* 
*     CALL DSTIO(NODE,13,LU,IEQT5[,IEQT4[,LUSTAT]]) 
* 
*     NOTE: "CONWD" IS A DOUBLE-WORD INTEGER, DEFINED AS FOLLOWS: 
* 
*             15                  8 7                      0
*            +----------------------------------------------+ 
*     WORD 1 !S! RESERVED          !  LOGICAL UNIT NUMBER   ! 
*            +---------------------+------------------------+ 
*          2 !   RESERVED !I!SUB-FUNCTION! RESERVED         ! 
*            +------------+------------+--------------------+ 
*             15          11 10         6 5                0
* 
*             S = 0 IF SESSION MAPPING IS TO BE PERFORMED,
*                 1 IF NO SESSION MAPPING IS TO BE PERFORMED (I.E., "TRUE"
*                      LU IS PROVIDED)
*             I = 1 IF INTERACTIVE WRITE-READ IS TO BE PERFORMED, ELSE 0
* 
*  RETURN  : <P+1> - NORMAL COMPLETION, IF REQUEST CODE SIGN =0 
*                                <A&B> CONTAIN 'EXEC' RETURN INFORMATION
* 
*                      : ERROR DETECTED: ABORT & PRINT MESSAGE, IF RC#15 =0 
* 
*                      : <P+1> - FOR DETECTED ERRORS, IF RC#15 =1 
*                                <A&B> CONTAIN ASCII ERROR CODES
* 
*                      : <P+2> - FOR NORMAL COMPLETION, IF RC#15 =1 
*                                <A&B> CONTAIN 'EXEC' RETURN INFORMATION
* 
*    NODE - SPECIFIES CALL-EXECUTION LOCATION: LOCAL=-1, REMOTE= 0 TO 32767 
* 
* 
*    <DSTIO> WILL ALLOW THE USER TO PERFORM A COMBINED, INTERACTIVE,
*     WRITE-READ OPERATION IN A SINGLE CALLING SEQUENCE. SUCH A REQUEST 
*     WILL BE MOST USEFUL FOR EFFICIENTLY COMMUNICATING WITH A REMOTE 
*     OPERATOR. TO SPECIFY AN INTERACTIVE WRITE-READ: REQUEST CODE =1,
*     CONWORD BIT#11 =1, P8 = WRITE BUFFER ADDRESS, AND P9 = WRITE
*     BUFFER LENGTH (<=READ BUFFER LENGTH). 
* 
*     IF THE LOGICAL UNIT NUMBER FIELD IS < 64, THEN THE "DEXEC" REQUEST
*     CAN BE MADE TO EITHER OLD OR NEW NODES. LUS > 63 ARE ACCEPTABLE 
*     FOR NEW NODES ONLY. <DSTIO> AUTOMATICALLY ADJUSTS THE REQUEST 
*     LENGTH FOR 2-WORD LUS TO NEW NODES AND 1-WORD LUS TO OLD NODES. 
*     FOR INCREASED EFFICIENCY, LUS < 64 GOING TO NEW NODES ARE 
*     IN A 'SPECIAL 1-WORD FORMAT' MEANING THAT ALL INFORMATION IS
*     ACTUALLY IN THE FIRST OF THE TWO WORDS AND BIT 12 OF THE ICODE
*     WORD IS RESET AS AN INDICATOR.  THIS BIT IS SET FOR STANDARD
*     2-WORD LUS > 63.
* 
* 
      SKP 
* GLBLK-START 
* 
******************************************************************
*                                                                *
*     G L O B A L   B L O C K               REV 2013 791213      *
*                                                                *
*     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, INCNV, OTCNV, RMTIO               *
*         RSM,   DLGON, #DISM, #DSSM, #MSSM, #SCSM, #UPSM        *
******************************************************************
* 
***!!!!! THE ORDER OF THE FIRST 8 WORDS (#STR THRU #LVL) IS      *
***!!!!!     FIXED BY THE REQUIREMENT THAT THE STREAM, ADDRESSES *
***!!!!!     ERROR CODES & LEVEL # ALWAYS BE IN THE SAME PLACE,  *
***!!!!!     REGARDLESS OF MESSAGE FORMAT.  THIS ALSO 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 2013 800221      *
*                                                                *
*      OFFSETS INTO DS/1000 DEXEC MESSAGE BUFFERS, USED BY:      *
*                                                                *
*       DEXEC, EXECM, EXECW, RQCNV, RPCNV, FLOAD, REMAT          *
*                                                                *
******************************************************************
* 
* 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)
#ZOF  EQU #PM1      Z-BUFFER OFFSET FOR DEXEC(1,2,3,13) 
#ZLN  EQU #PM2      Z-BUFFER LENGTH FOR DEXEC(1,2,3,13) 
#PR2  EQU #PM2+1    2ND OPT. PARAMETER FOR DEXEC(3) [RTE-L].
#KEY  EQU #PR2+1    KEYWORD(RN) FOR DEXEC(1,2,3) [RTE-L]. 
#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) 
#ST4  EQU #ST3+1    ISTA4 FOR DEXEC(13) [RTE-L].
#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 
* 
* LENGTH DEFINITIONS FOR REQUEST BUFFERS. 
* 
L#I/O ABS #KEY+1    REQ LEN FOR DSTIO(1),(2),(3),(13) 
      SPC 2 
* 
*  > > > > >      C  A  U  T  I  O  N      < < < < < < < < < <
* 
      SPC 2 
* USE CAUTION IF THE PARAMETER PORTION CHANGES FOR THE VARIOUS
* REQUESTS.  THE LENGTH IS COMPUTED ON-THE-FLY AS PARAMETERS
* ARE MOVED TO THE REQUEST BUFFER.
* 
* ADJUSTMENTS ARE AUTOMATIC IF ONLY THE REQUEST HEADER CHANGES. 
* 
      ENT DSTIO 
* 
      EXT #TILT,#NODE,#MAST,.ENTR,#MSTC,#RQB
      EXT .LDX,.SAX,.DSX,.MVW 
      SKP 
* 
      SUP 
DSTIO NOP 
      LDA DSTIO     GET THE RETURN POINTER. 
      STA EXIT      SAVE FOR '.ENTR' PROCESSING.
      JSB .LDX
      DEF N#PRM     # PARAMETERS
      CLA 
      JSB .SAX      INITIALIZE PARAMETER AREA 
      DEF PRAMS-1 
      JSB .DSX
      JMP *-3 
* 
      JMP GETPR     GO TO OBTAIN PARAMETER ADDRESSES. 
      SPC 1 
      JSB RQLEN,I   LOCAL-EXECUTION CALL TO 'EXEC'/'REIO' 
PRAMS EQU *         PARAMETER ADDRESSES AREA
NODE  NOP           NODE NUMBER 
RCODE NOP           REQUEST CODE
IOCNW NOP           I/O CONTROL WORD
IOBUF NOP           USER BUFFER ADDRESS 
IOBFL NOP           USER BUFFER LENGTH
IPRM1 NOP           USER'S 1ST OPTIONAL PARAMETER 
IPRM2 NOP           USER'S 2ND OPTIONAL PARAMETER 
      SPC 1 
EXIT  NOP 
      SPC 2 
.NPRM EQU EXIT-PRAMS NUMBER OF PARAMETERS ALLOWED 
GETPR JSB .ENTR     GET DIRECT ADDRESSES
      DEF PRAMS       FOR THE USER-SPECIFIED PARAMETERS.
* 
      LDA RCODE     GET THE ADDRESS OF THE REQUEST CODE.
      SZA,RSS       WAS THE PARAMETER PROVIDED? 
      JMP ERR        NOT PROVIDED, ERROR! 
* 
* 
      JSB .LDX
      DEF C#DLW 
      CLA,CCE       <A>=0: BUFFER INIT; <E>=1: CONWORD PREP.
      JSB .SAX      INITIALIZE REQUEST BUFFER 
      DEF #RQB-1
      JSB .DSX
      JMP *-3 
* 
      STA WRLEN     SET THE 'NO DATA' 
      STA RDLEN      DEFAULT CONDITIONS.
* 
      ERA           SET THE 'ERROR-RETURN' FLAG FOR 
*                                   THE <#MAST> CALLING SEQUENCE
      STA CONWD 
* 
      LDA #NODE     SET LOCAL NODE ADDRESS, IN CASE WE
      STA #RQB+#ENO     REJECT BECAUSE OF AN ERROR. 
      LDA B20       SET ERROR CODE QUALIFIER = 1
      STA #RQB+#ECQ 
      LDA NODE,I    GET THE DESTINATION 
      STA #RQB+#DST   SAVE IT IN THE REQUEST
* 
      LDA STDEX     GET THE STREAM TYPE 
      STA #RQB+#STR   SET IT IN THE REQUEST 
* 
      DLD IOCNW,I    GET LOGICAL UNIT # 
      STA #RQB+#CNW     SAVE THE DOUBLE-
      STB #RQB+#CWX       WORD LU 
      LDA PRAMS+2   WAS A THIRD 
      SZA,RSS         PARAMETER SPECIFIED?
      JMP ERIO1     NO, ERROR!
      LDA RCODE,I   GET THE REQUEST CODE. 
      RAL,CLE,ERA   REMOVE THE NO-ABORT BIT, AND SAVE IN <A>
      STA #RQB+#ICD    SAVE IN REQUEST BUFFER 
      AND B77       MASK REQUEST CODE ONLY
      STA ICODE     & ICODE FOR MAPPING & POST-PROCESSING 
      CPA D13       REQUEST CODE 13?
      JMP ICD13     JUMP TO PRE-PROCESSOR 
      SZA           REQUEST CODE =0?
      ADA UPLIM      NO. SEE IF IT'S WITHIN 
      SSA,RSS             THE RANGE: 0 < RC < 4 ? 
      JMP ERR       ERROR, OUT OF RANGE: RC=0, OR RC>3! 
* 
*  SELECT THE PRE-PROCESSOR ROUTINE, VIA MAPPED REQUEST CODE. 
* 
      LDB ICODE 
      ADB SUBAD     MAP ICODE IN PRE-PROCESS MENU 
      JMP B,I       GO DO IT
* 
      SKP 
*  PRE-PROCESSOR JUMP TABLE 
* 
SUBAD DEF SUBS-1,I
SUBS  DEF IC1/2     READ                               RC=01
      DEF IC1/2     WRITE                              RC=02
      DEF ICOD3     CONTROL                            RC=03
* 
UPLIM ABS SUBAD-*   REQUEST CODE LIMIT-VALUE:-(MAX.RCODE +1)
      HED DSTIO: PRE-PROCESSORS * (C) HEWLETT-PACKARD CO. 1979 *
IC1/2 EQU *                           REQUEST CODES 1 & 2 
      DLD IOCNW,I   LOAD (DOUBLE) CONTROL/LU WORD 
      BLF,SLB       DOUBLE-BUFFER REQUEST (BIT#12 =1)?
      JMP ERIO4      YES--ERROR FOR REMOTE REQUESTS!
* 
      LDA IOBUF     GET BUFFER ADDRESS
      SZA,RSS       WAS IT SUPPLIED?
      JMP ERIO1      NO BUFFER, ERROR!
      STA BUFA      SET IT IN CALL TO #MAST 
* 
      LDB IOBFL     GET THE BUFFER-LENGTH ADDRESS.
      SZB,RSS       WAS IT SUPPLIED?
      JMP ERIO1      NO BUFFER LENGTH PROVIDED, ERROR!
      JSB LENCK     GO VERIFY & GET BUFFER WORD COUNT.
      LDB ICODE     GET THE REQUEST CODE. 
      SLB           IF THIS IS A READ(1) REQUEST, 
      STA RDLEN      THEN CONFIGURE READ LENGTH FOR <#MAST>;
      SLB,RSS         ELSE, IF THIS IS A WRITE(2) REQUEST,
      STA WRLEN        THEN CONFIGURE 'WRLEN' FOR <#MAST>.
* 
      LDA IOBFL,I   GET LENGTH AGAIN
      STA #RQB+#BFL   SAVE IN REQUEST 
* 
      LDB IPRM1     GET ADDR OF 1ST OPT. PARAM
      SZB,RSS       SPECIFIED ? 
      JMP SRQLN      NO, SHORT REQUEST
* 
      LDA IPRM1,I   GET FIRST OPTIONAL PARAMETER
      STA #RQB+#PM1 
      CLA           PREPARE FOR MISSING PARAMETER.
      LDA IPRM2,I   GET SECOND OPTIONAL PARAMETER 
      STA #RQB+#PM2 
* 
      LDB #RQB+#CWX   GET THE USER'S CONTROL WORD.
      BLF           POSITION WRITE-READ BIT(#11) TO SIGN. 
      SSB,RSS       IF THIS IS A WRITE-READ REQUEST: SKIP;
      JMP SRQLN 
* 
      LDA RDLEN     FORCE ADEQUATE S.A.M TO BE             #
      STA WRLEN      ALLOCATED AT RECEIVING NODE.          #
* 
      LDB IPRM2     GET ADDRESS FOR WRITE-BUFFER LENGTH.
      JSB LENCK     GO VERIFY & GET 'WRITE' WORD COUNT. 
      STA LENCK     SAVE THE WORD-MOVE LENGTH, TEMPORARILY. 
      CMA,INA,SZA,RSS  NEGATE THE COUNT, & IF =0, 
      JMP LONGT         NO NEED TO MOVE THE 'WRITE' BUFFER. 
* 
      ADA RDLEN     IF THE WRITE LENGTH 
      SSA            IS GREATER THAN THE 'READ' LENGTH, 
      JMP ERIO4       THEN THE REQUEST IS INVALID!
* 
      LDA IPRM1     GET THE 'WRITE' BUFFER ADDRESS
      LDB IOBUF      AND THE 'READ' BUFFER ADDRESS. 
      CPA B         IF THEY ARE THE SAME, THEN THE
      JMP LONGT      'WRITE' DATA NEED NOT BE MOVED; ELSE,
      JSB .MVW        MOVE 'WRITE' DATA TO 'READ' BUFFER. 
      DEF LENCK 
      NOP 
* 
LONGT EQU * 
      LDA CONWD     GET THE <#MAST> CONTROL WORD. 
      ARS           SET THE LONG TIMEOUT BIT(#14).
      STA CONWD     RESTORE CONWD [140000B].
      JMP SRQLN 
      SPC 3 
ICOD3 EQU *                                            RC=03
      CLA 
      LDA IOBUF,I   GET OPTIONAL PARAMETER
      STA #RQB+#PRM   SET IT IN THE REQUEST 
      JMP SRQLN     GO TO ESTABLISH REQUEST LENGTH. 
      SPC 2 
ICD13 EQU *                                          RC = 13
      LDA IEQT5    DID CALLER SPECIFY AT LEAST ONE
      SZA,RSS         RETURN PARAMETER? 
      JMP ERIO1     NO, GET OUT!
SRQLN LDA L#I/O    SET THE LENGTH OF THE REQUEST/REPLY
      JMP SETLN 
      SKP 
*  COMMON PRE-PROCESSING SUBROUTINES
* 
LENCK NOP           BUFFER LENGTH PROCESSING. 
      LDB B,I       GET THE BUFFER LENGTH.
      SSB,RSS       WORDS OR -BYTES?
      JMP WORDS      POSITIVE WORDS.
      BRS            NEGATIVE BYTES--CONVERT TO -WORDS. 
      CMB,INB       MAKE THAT +WORDS
WORDS LDA B         SAVE +WORDS IN <A> FOR RETURN.
      ADB DM513     CHECK FOR VALIDITY OF LENGTH
      SSB,RSS 
      JMP ERIO4     >512, TOO MUCH
* 
      JMP LENCK,I   RETURN. 
      SKP 
*  SEND THE REMOTE EXEC REQUEST VIA "#MAST" AND AWAIT REPLY 
* 
SETLN STA RQLEN     ESTABLISH REQUEST LENGTH FOR <#MAST>. 
      LDA #RQB+#CNW  GET LU 
      AND B300      CHECK FOR LU > 63 
      SZA,RSS 
      JMP LU1WD     USE ONE-WORD LU FORMAT
* 
*                   USE DOUBLE-WORD LU FORMAT.  THIS IS FLAGGED BY SETTING
*                   BIT 12 IN THE CONTROL WORD OF THE REQUEST.
* 
      LDA #RQB+#ICD 
      IOR BIT12 
      STA #RQB+#ICD 
      JMP SETX
* 
*     USE SINGLE-WORD LU FORMAT.  MERGE THE SUB-FUNCTION WITH THE 
*     LU WORD.
* 
LU1WD EQU * 
      LDA #RQB+#CNW 
      ELA,CLE,ERA   CLEAR "SIGN" BIT, IF SET
      STA B 
      LDA #RQB+#CWX  LOAD SUB-FUNCTION
      AND B7700     MASK
      IOR B         INCLUDE LU
      CLB            AND DUMMY PARAMETER
      STA #RQB+#CNW   AND CONFIGURE 
      STB #RQB+#CWX    THE REQUEST. 
* 
SETX  EQU *         RESUME MAIN FLOW
* 
      JSB #MAST     CALL MASTER REQUEST INTERFACE ROUTINE 
      DEF *+7 
      DEF CONWD     CONTROL WORD
      DEF RQLEN     REQUEST LENGTH
BUFA  DEF *         CONFIGURED DATA BUFFER ADDRESS--IF ANY. 
      DEF WRLEN     WRITE DATA LENGTH -- IF ANY 
      DEF RDLEN     READ  DATA LENGTH -- IF ANY 
      DEF C#DLW     MAXIMUM REPLY LENGTH EXPECTED =15 WORDS.
      JMP ERROR     * ERROR DETECTED BY "#MAST"--REPORT IT
      STA LENCK       SAVE TRANSACTION SEQ. # 
      LDA #MSTC      DID <#MAST> WAIT 
      SZA                  AROUND FOR THE REPLY?
      JMP RTSQ      NO---RETURN TO CALLER 
* 
      LDB ICODE     IF THE REQUEST CODE WAS FOR A:
      CPB D13       - DEVICE-STATUS REQUEST, THEN THE DEVICE
      JMP IPD13        PARAMETERS NEED POST-PROCESSING
* 
*  DSTIO  POST-PROCESSING: MOVE DATA TO REPLY BUFFER & CHECK FOR ERRORS.
* 
IPOST LDA #RQB+#ENO 
      SSA           ANY ERROR ? 
      JMP ERROR     YES 
* 
XIT   EQU * 
      LDA RCODE,I   GET ICODE 
      SSA           WAS THE NO ABORT BIT SET ?
      ISZ EXIT      YES PUSH RETURN ADDRESS 
* 
ATEND LDB #RQB+#EC2   GET <B> FROM THE REPLY BUFFER.
      LDA #RQB+#EC1   GET <A> FROM THE REPLY BUFFER.
      JMP EXIT,I    RETURN TO <DSTIO'S> CALLER
* 
RTSQ  EQU *         HERE ON NO-WAIT CALLS 
      LDA LENCK     RETURN THE TRANSACTION SEQUENCE 
      STA #RQB+#EC1      NUMBER TO CALLER 
      JMP XIT 
      SKP 
      SPC 1 
IPD13 LDA #RQB+#ST1   GET THE FIRST RETURN-PARAMETER. 
      STA IEQT5,I   PASS: EQT5
* 
      LDB #RQB+#ST2      GET THE NEXT RETURN-PARAMETER. 
      STB IEQT4,I    OPTIONAL EQT4
      LDB #RQB+#ST3   RC=13: OPTIONAL LU STATUS & SUB. CHAN;
      STB LUST,I
      JMP IPOST     GO FINISH 
      SPC 2 
*  DSTIO ERROR ROUTINES.
* 
ERIO1 LDB "01"      INCORRECT,MISSING,OR TOO MANY PARAMETERS
      JMP GETIO 
ERIO4 LDB "04"      IMPROPER BUFFER SPECIFICATION.
GETIO LDA "IO"
      JMP ERRS      ERROR: "IO0X".
      SPC 2 
ERR   LDB "06"      IMPROPER REQUEST: "DS06". 
      RSS 
      LDB "04"      ILLEGAL NODE: "DS04"
      LDA "DS"
ERRS  DST #RQB+#EC1   ERROR CODE INTO REQ.BUFR
ERRA  EQU *-1       ERROR MESSAGE ADDRESS [DEF #RQB+#EC1] 
      SPC 2 
ERROR LDA RCODE,I   GET ICODE 
      SSA           NO ABORT BIT SET ?
      JMP ATEND     YES, IT IS
* 
      CCA 
      ADA DSTIO     WE HAVE THE ADDRESS OF THE JSB
      LDB ERRA      GET ADDRESS OF THE ERROR MESSAGE
      JSB #TILT     WE DO NOT COME BACK FROM THIS CALL
* 
      SKP 
* DATA AREA 
* 
"01"  ASC 1,01
"04"  ASC 1,04
"06"  ASC 1,06
"IO"  ASC 1,IO
"DS"  ASC 1,DS
N#PRM ABS .NPRM 
* 
*     EQUATES 
IEQT5 EQU IOCNW     DEFINE RETURN OF EQT WORD 5 INFO (RC=13)
IEQT4 EQU IOBUF        "     "    "   "    "  4   "   "   " 
LUST  EQU IOBFL        "     "    "  LU STATUS    "   "   " 
A     EQU 0 
B     EQU 1 
* 
* 
* 
C#DLW ABS #DLW      MAX. REQUEST/REPLY LENGTH.
DM513 DEC -513
D5    DEC 5 
STDEX EQU D5        STREAM TYPE FOR "DEXEC" CALLS 
D13   DEC 13
RQLEN NOP 
ICODE NOP 
WRLEN NOP 
RDLEN NOP 
CONWD NOP 
BIT12 OCT 10000     BIT 12
B77   OCT 77
B20   OCT 20
B300  OCT 300 
B7700 OCT 7700
* 
      END 
                            