ASMB,Q,C
      HED DEXEC: DS/1000 REMOTE EXEC ROUTINE *(C) HEWLETT-PACKARD CO.1980*
      NAM DEXEC,7 91750-1X067 REV.2013 800924 ALL 
      SUP 
*  ***************************************************************
*  * (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.   *
*  ***************************************************************
*    NAME:   DEXEC
*    SOURCE: 91750-18067
*    RELOC:  91750-1X067
*    PGMR:   C. HAMILTON  [ 07/28/77 ]
*    MODIF'D: GAB [790206] TO REPLACE EXTENDED INSTR'S W/ JSB'S 
*    MODIF'D: JDH [790213] FOR DS REQUEST EQUATED OFFSETS.
*    MODIF'D: CCH [08/05/80] FOR 91750. 
      SPC 1 
*  <DEXEC> (DISTRIBUTED EXECUTIVE) IS THE DS/1000 USER INTERFACE FOR
*   'TRANSPORTABLE' CALLS TO EITHER THE LOCAL, OR REMOTE-NODE RTE SYSTEM. 
* 
*  <DEXEC> WILL ACCEPT ALL VALID REQUEST CODES FOR 'LOCAL' EXECUTION. 
* 
*  FOR EXECUTION AT A REMOTE NODE, <DEXEC> WILL ACCEPT REQUEST CODES: 
*    1, 2, 3, 6, 9, 10, 11, 12, 13, 23, 24, 25, <99>  * ONLY *
* 
*  ** UNACCEPTABLE REQUESTS WILL BE REJECTED WITH A "DS06" ERROR! 
*  ** "IO01" IS RETURNED UPON DETECTION OF INCORRECT, MISSING, OR 
*      TOO MANY (>9) PARAMETERS.
*  ** "IO04" WILL BE RETURNED FOR BUFFER-ERROR SPECIFICATIONS:
*      REMOTE READ/WRITE BUFFER LENGTH GREATER THAN 512 WORDS,
*      INTERACTIVE WRITE LENGTH > READ LENGTH, 'Z' BUFFER LENGTH =0.
*  ** "SC01" INDICATES A MISSING SCHEDULING PARAMETER.
*  ** "SC05" INDICATES AN IMPROPER PROGRAM NAME SPECIFICATION.
*  ** ERROR QUALIFIERS SET TO: 0-SYSTEM, 1-DEXEC, 2-EXECM, 3-EXECW, 4-#RQUE 
* 
* REQUEST CODES: 1,2,3,6,10,11,12,13,25,99 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. REQUEST CODES: 9,23,24 WILL BE
*   TRANSMITTED TO THE REMOTE NODE, VIA STREAM #3, TO BE PROCESSED BY 
*   <EXECW>. A LONG MASTER TIMEOUT (APPROX. 20 MIN.) WILL BE ALLOWED, 
*   IN ORDER TO PROVIDE SUFFICIENT TIME FOR SCHEDULE-WITH-WAIT REQUESTS.
* 
*  CALLING SEQUENCE:     CALL DEXEC(NODE,P1,P2,P3,P4,P5,P6,P7,P8,P9)
* 
*  RETURN (X&Y INTACT) : <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 
*           [ CALL WILL ALSO EXECUTE, LOCALLY, IF THE 'LOCAL' NODE IS USED ]
* 
*    P1 TO P9 - NORMAL 'EXEC' CALLING PARAMETERS (P1 = REQUEST CODE, ETC.)
* 
*    <DEXEC> 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). 
* 
* * RCODE=99: PROGRAM STATUS; P2:PGM.NAME ADDR; P3: OPTIONAL STATUS ADDR. 
*   RTN: <A>#15=1: SHORT I.D.,#3-0: STATUS, <B>= 0. 
*   ERR: <A>='DS', <B>= -1. 
* 
* * NOTE: FOR RC=9/23, IF ICODE BIT#11=1, A CLONE PROGRAM MAY BE CREATED, 
* *       IF THE DESTINATION NODE CONTAINS SESSION MONITOR. 
* 
* <DLUEX> IS AN ALTERNATE ENTRY INTO <DEXEC> WHICH MAY BE CALLED WHENEVER 
*   THE USER DESIRES TO PERFORM A REMOTE READ, WRITE, OR I/O STATUS REQUEST 
*   WHICH MUST REFER TO A SYSTEM LOGICAL UNIT NO. GREATER THAN 63 DECIMAL.
*   SUCH REQUESTS WILL BE PERFORMED VIA THE 'XLUEX' PROCESSOR IN THE REMOTE 
*   NODE. [BIT#12 IS SET IN TRANSMITTED REQUEST CODE PARAMETER, TO NOTIFY 
*          <EXECM> THAT THE REQUEST CONTAINS A DUAL CONTROL WORD.]
* 
*  CALLING SEQUENCE:     CALL DLUEX(NODE,ICODE,CONWD,P3,P4,P5,P6) 
* 
*             WHERE:     ICODE = 1(READ)/2(WRITE)/3(CONTROL)/13(I/O STATUS) 
* 
*                        CONWD IS A POINTER TO A TWO WORD INTEGER ARRAY:
* 
* 
*              DOUBLE ('XLUEX') CONTROL WORD: 
* 
*              WORD #1
*             *15*14*13*12*11*10* 9* 8* 7* 6* 5* 4* 3* 2* 1* 0* 
*             +-----------------------------------------------+ 
*             ! S!    RESERVED        !   LOGICAL UNIT        ! 
*             +-----------------------------------------------+ 
*             NOTE: WORD #1,S-BIT SPECIFIES NO LU MAPPING USED. 
* 
*              WORD #2
*             *15*14*13*12*11*10* 9* 8* 7* 6* 5* 4* 3* 2* 1* 0* 
*             +-----------------------------------------------+ 
*             ! X! X! X! Z! I!  FUNCTION    !    RESERVED     ! X=DON'T CARE
*             +-----------------------------------------------+ 
*             NOTE: I-BIT#11 IS INTERACTIVE WRITE-READ FLAG.
* 
* <D#OPS>, AN ACCESSIBLE ENTRY POINT, INITIALLY CONTAINS 0; IS SET =$OPSY 
*   IN THE LOCAL NODE, WHEN <DEXEC/DLUEX> IS FIRST CALLED; IS SET =$OPSY
*   FROM THE REMOTE NODE, WHEN A REQUEST IS SUCCESSFULLY COMPLETED BY A 
*   LEVEL 1 NODE; IS SET =0, WHEN A COMMUNICATION ERROR IS DETECTED.
* 
      SKP 
* GLBLK-START 
* 
******************************************************************
*                                                                *
*     G L O B A L   B L O C K               REV XXXX 790531      *
*                                                                *
*     GLOBAL OFFSETS INTO DS/1000 MESSAGE BUFFERS, USED BY:      *
*                                                                *
*         REMAT, RFMST, DEXEC, DMESS, FLOAD, POPEN, #MAST        *
*         GET,   #SLAV, RQCNV, RPCNV, GRPM,  LSTEN, PTOPM        *
*         EXECM, EXECW, OPERM, RFAM1, RFAM2, DLIST, DLIS3        *
*                                                                *
******************************************************************
* 
***!!!!! THE FIRST 7 WORDS (#STR THRU #ENO) MUST BE FIXED !!!!!***
#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 
      SPC 1 
* 
* LENGTH DEFINITIONS FOR REQUEST BUFFERS. 
* 
L#I/O ABS #KEY+1    REQ LEN FOR DEXEC(1),(2),(3),(13) 
L#TYR ABS #TYR+1    REQ LEN FOR DEXEC(11) 
L#ST3 ABS #PM2+1    REQ LEN FOR DEXEC(25) 
L#PGN ABS #PGN+3    BASE FOR DEXEC(6,9,10,12,23,24,25,99) 
      SPC 10
* 
*  > > > > >      C  A  U  T  I  O  N      < < < < < < < < < <
* 
      SPC 10
* USE CAUTION IF THE PARAMETER PORTION CHANGES FOR THE VARIOUS
* REQUESTS.  SUBROUTINE NAMP INITIALIZES THE LENGTH TO THE END OF 
* THE PROGRAM NAME (L#PGN) FOR ICODES 6,9,10,12,23,24,25,99.
* THE REMAINDER OF THE LENGTH IS COMPUTED ON THE FLY AS PARAMETERS
* ARE MOVED TO THE REQUEST BUFFER.
* 
* ADJUSTMENTS ARE AUTOMATIC IF ONLY THE REQUEST HEADER CHANGES. 
* 
      SKP 
      ENT DEXEC,DLUEX,D#OPS 
      EXT .ENTR,$LIBR,$LIBX,$OPSY,EXEC,REIO,XLUEX 
      EXT #MAST,#NODE,#RQB,#TILT,PGMAD
      EXT .ADX,.CYA,.DSX,.ISX,.ISY,.LAX,.LDX,.LDY,.MVW
      EXT .SAX,.STX,.STY
DEXEC NOP 
      JMP *+2       BYPASS <DLUEX> ENTRY. 
DLUEX NOP           REMOTE EXTENDED-LU ENTRY. 
      DST SAVEA     SAVE <A&B> FOR RETURN-PARAMETER CHECKS. 
      JSB .STX      SAVE <X> REGISTER.
      DEF SAVEX 
      JSB .STY      SAVE THE <Y> REGISTER.
      DEF SAVEY 
      ERA,ALS       MOVE <E> TO SIGN BIT. 
      SOC           IF THE OVERFLOW BIT IS SET, 
      INA            THEN SET BIT #0 ALSO.
      STA SAVEO     SAVE THE STATUS OF <E&0>. 
      LDA DLUEX     IF ENTRY WAS VIA <DLUEX>, 
      SZA,RSS        THEN SAVE ITS CONTENTS FOR RETURN. 
      LDA DEXEC     GET THE RETURN POINTER. 
      STA EXIT      SAVE FOR '.ENTR' PROCESSING.
      STA SAVEN     SAVE FOR 'DEXEC'/'DLUEX' DECISIONS. 
      JSB .LDX
      DEF D12 
      CLA 
      STA RQB+#ECQ  INITIALIZE ERROR QUALIFIER =0(SYSTEM).
INIT0 JMP INIT      FIRST PASS, ONLY; 'NOP', THEREAFTER.
      JSB .SAX      INITIALIZE PARAMETER AREA 
      DEF PRAMS-1 
      JSB .DSX
      JMP *-3 
      JMP GETPR     GO TO OBTAIN PARAMETER ADDRESSES. 
      SPC 1 
CALEX JSB RQLEN,I   LOCAL-EXECUTION CALL TO EXEC/REIO/XLUEX 
PRAMS REP 10        PARAMETER ADDRESSES/LOCAL EXECUTION AREA
      NOP 
      NOP           (TEMP)
      NOP           (TEMP+1)
ERTST SEZ,RSS       LOCAL EXECUTION: ANY ERRORS DETECTED? 
      ISZ EXIT       NO. ESTABLISH RETURN TO <P+2>. 
      DST RQB+#EC1  SAVE <A&B> FOR RETRIEVAL BY CALLER. 
      JMP RSTEO     GO TO RESTORE REGISTERS & RETURN. 
      SPC 1 
EXIT  NOP 
GETPR JSB .ENTR     GET DIRECT ADDRESSES
      DEF PRAMS       FOR THE USER-SPECIFIED PARAMETERS.
* 
      LDA N#DBS     INITIALIZE THE DATA BUFFER
      STA RMNDR      REMAINDER CHECK VALUE TO MAXIMUM.
      LDA DABFA     INITIALIZE NEXT AVAILABLE LOCATION
      STA DBLOC      POINTER TO BEGINNING OF DATA BUFFER. 
      LDA $OPSY     INITIALIZE THE OPSYSTEM IDENTIFIER
      STA D#OPS      TO REFER TO THE LOCAL NODE.
* 
      LDA PRAMS+1   GET THE ADDRESS OF THE REQUEST CODE.
      SZA,RSS       WAS THE PARAMETER PROVIDED? 
      JMP ERDS6     NOT PROVIDED, ERROR!
* 
      LDA PRAMS+1,I GET THE REQUEST CODE. 
      AND CLNMS     REMOVE 'CLONE-OK' BIT(#11)--IF ANY. 
      STA RCODE     SAVE FOR POSSIBLE USE IN LOCAL REQUEST. 
      RAL,CLE,ERA   REMOVE THE NO-ABORT BIT, AND SAVE IN
      STA ICODE      ICODE FOR MAPPING & POST PROCESSING. 
* 
      LDB A         CARRY MASKED REQUEST CODE IN <B>. 
      LDA PRAMS,I   GET THE DESTINATION 
      CPA #NODE     FOR US ?
      JMP LOCAL      YES. GO TO LOCAL PROCESSING. 
      INA,SZA,RSS     IS IT AN ABSOLUTE LOCAL REFERENCE?
      JMP LOCAL        YES. GO TO LOCAL PROCESSING. 
* 
SPLOC JSB .LDX      GET MAX. REQ/REPLY LENGTH.
      DEF C#DLW     INITIALIZE BUFFER SIZE COUNT IN <X>.
      CLA,CCE       <A>=0: BUFFER INIT; <E>=1: CONWORD PREP.
      JSB .SAX      INITIALIZE THE
      DEF RQB-1      REQUEST BUFFER 
      JSB .DSX        TO CONTAIN
      JMP *-3          ALL ZEROES.
* 
      STA WRLEN     SET THE 'NO DATA' 
      STA RDLEN      DEFAULT CONDITIONS.
      ERA           SET THE 'ERROR-RETURN' FLAG FOR 
      STA CONWD      THE <#MAST> CALLING SEQUENCE.
* 
      LDA PRAMS,I   GET THE DESTINATION 
      STA RQB+#DST  SAVE IT IN THE REQUEST
      LDA D5        GET THE STREAM TYPE 
      STA RQB+#STR  SET IT IN THE REQUEST 
* 
      LDA ICODE     GET THE REQUEST CODE
      CPA D99       IF THE REQUEST IS FOR PROGRAM STATUS, 
      JMP PGMST      THEN PROCESS IT INDEPENDENTLY. 
* 
      SZA           REQUEST CODE =0?
      ADA UPLIM      NO. SEE IF IT'S WITHIN 
      SSA,RSS             THE RANGE: 0 < RC < 27 ?
      JMP ERDS6    ERROR, OUT OF RANGE: RC=0, OR RC>26! 
      LDA PRAMS+2 
      SZA,RSS       WAS A THIRD PARAMETER SPECIFIED?
      JMP ERIO1      NO, ERROR! 
* 
      SKP 
      LDA SAVEN     IF THE ENTRY
      CPA DEXEC      WAS VIA <DEXEC>, THEN
      CLA,RSS         AVOID SETTING THE <DLUEX> FLAG; 
      LDA BIT12        ELSE, INCLUDE BIT#12 
      IOR ICODE         AND THE CALLER'S REQUEST CODE TO
      STA RQB+#ICD       CONFIGURE THE REQUEST BUFFER ENTRY.
* 
*  SELECT THE PRE-PROCESSOR ROUTINE, VIA MAPPED REQUEST CODE. 
* 
      LDB ICODE     MAP USER'S REQUEST CODE,
      ADB SUBAD      USING THE PRE-PROCESS MENU.
      JMP B,I       GO DO IT. 
* 
*  PRE-PROCESSOR JUMP TABLE 
* 
SUBAD DEF SUBS-1,I
SUBS  DEF ICI/O     READ                               RC=01
      DEF ICI/O     WRITE                              RC=02
      DEF ICI/O     CONTROL                            RC=03
      DEF ERDS6     * TRACK ALLOCATION                 RC=04
      DEF ERDS6     * TRACK RELEASE                    RC=05
      DEF ICOD6     PROGRAM TERMINATION                RC=06
      DEF ERDS6     * PROGRAM SUSPEND                  RC=07
      DEF ERDS6     * SEGMENT LOAD                     RC=08
      DEF SCHW      SCHEDULE W/WAIT                    RC=09
      DEF ICD10     SCHEDULE W/O WAIT                  RC=10
      DEF ICD11     TIME                               RC=11
      DEF ICD12     TIME SCHEDULE                      RC=12
      DEF ICI/O     I/O STATUS                         RC=13
      DEF ERDS6     * GET STRING                       RC=14
      DEF ERDS6     * GLOBAL TRACK ALLOCATE            RC=15
      DEF ERDS6     * GLOBAL TRACK RELEASE             RC=16
      DEF ERDS6     * CLASS READ                       RC=17
      DEF ERDS6     * CLASS WRITE                      RC=18
      DEF ERDS6     * CLASS CONTROL                    RC=19
      DEF ERDS6     * CLASS WRITE/READ                 RC=20
      DEF ERDS6     * CLASS GET                        RC=21
      DEF ERDS6     * SWAP CONTROL                     RC=22
      DEF SCHW      QUEUE-SCHEDULE W/WAIT              RC=23
      DEF SCHW      QUEUE-SCHEDULE W/O WAIT            RC=24
      DEF PARST     PARTITION STATUS                   RC=25
      DEF ERDS6     *  MEMORY STATUS (RTE-IV)          RC=26
*                                   * = REMOTE REQUEST NOT SUPPORTED. 
* 
UPLIM ABS SUBAD-*   REQUEST CODE LIMIT-VALUE:-(MAX.RCODE +1)
      HED DEXEC: PRE-PROCESSORS * (C) HEWLETT-PACKARD CO. 1980 *
*  PRE-PROCESSING FOR READ, WRITE, CONTROL, AND I/O STATUS (RC=1,2,3,13). 
* 
ICI/O DLD PRAMS+2,I GET CONTROL WORD(S).         RC=1,2,3,13
      STA RQB+#CNW  SET IN REQUEST
      CCE           PREPARE FOR A <DLUEX> ENTRY.
      LDA SAVEN     IF THIS IS A
      CPA DEXEC      NORMAL <DEXEC> REQUEST,
      CLB,CLE         THEN CLEAR <B>, CLEAR <E>,  AND 
      STB RQB+#CWX     CONFIGURE CONWORD EXTENSION. 
      SEZ,CLE,RSS   IF THIS WAS A <DEXEC> ENTRY,
      LDB RQB+#CNW   THEN RETRIEVE CONWORD FROM REQUEST.
      BLF           POSITION FOR LATER TEST OF BITS#11,12.
      STB CONSV     SAVE FOR FUTURE USE.
      CLA 
      LDB ICODE     IF THIS IS AN 
      CPB D13        I/O STATUS REQUEST,
      JMP SET0        THEN FORCE OPTIONAL KEYWORD =0
* 
      LDA PRAMS+9,I    ELSE, GET THE KEYWORD--IF ANY, 
SET0  STA RQB+#KEY      AND ADD IT TO THE OUTBOUND REQUEST. 
      ADB DM3       IF THIS IS A READ OR WRITE REQUEST, 
      SSB,RSS        SKIP TO PROCESS THE DATA BUFFER; 
      JMP OPTPR       ELSE, BYPASS DATA PROCESSING. 
* 
      LDB PRAMS+4   GET THE BUFFER-LENGTH ADDRESS.    RC=1,2
      SZB,RSS       WAS IT SUPPLIED?
      JMP ERIO1      NO BUFFER LENGTH PROVIDED, ERROR!
* 
      JSB LENCK     GO VERIFY & GET BUFFER WORD COUNT.
      STB RQB+#BFL  CONFIGURE BUFFER LENGTH INTO REQUEST. 
* 
      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 PRAMS+3   GET THE BUFFER ADDRESS. 
      SZA,RSS       WAS IT SUPPLIED?
      JMP ERIO1      NO BUFFER, ERROR: IO01!
* 
      STA OUTBF     INITIALIZE <#MAST> TO REFER BOTH
      STA INBUF      INPUTS & OUTPUTS TO USER'S DATA BUFFER.
      SLB           IF THIS IS A READ REQUEST,
      JMP OPTPR      THEN NO NEED TO MOVE DATA. 
* 
      LDB CONSV     GET THE SHIFTED CONWORD.
      SLB           IF THIS IS A 'Z' BUFFER REQUEST,
      JSB MDATA      THEN MOVE USER'S DATA TO LOCAL BUFFER. 
* 
OPTPR CLA           PREPARE FOR MISSING PARAMETER.   RC=3,13
      LDA PRAMS+5,I GET FIRST OPTIONAL PARAMETER
      STA RQB+#PM1  ADD PARAMETER-OR 0-TO REQUEST BUFFER. 
* 
      CLA           PREPARE FOR MISSING PARAMETER.
      LDA PRAMS+6,I GET SECOND OPTIONAL PARAMETER 
      STA RQB+#PM2  ADD PARAMETER-OR 0-TO REQUEST BUFFER. 
* 
      LDA CONSV     RETRIEVE THE SHIFTED CONWORD. 
      AND HILO      ISOLATE INTERACTIVE BIT#11 AND Z BIT#12.
      SZA,RSS       IF NEITHER IS SET,
      JMP CHEK3      THEN GO TO CHECK FOR A CONTROL REQUEST.
* 
      LDB ICODE     GET THE REQUEST CODE. 
      CPB D1        IF THIS IS A READ REQUEST,
      SSA,SLA,RSS    CHECK FOR BOTH BITS SET
      JMP *+2         ONLY ONE IS SET, SO CONTINUE
      JMP ERIO1        BOTH ARE SET: ERROR IO01!
* 
      LDB PRAMS+6   GET ADDRESS FOR WRITE/Z-BUFFER LENGTH.
      JSB LENCK     GO VERIFY & GET 'WRITE' WORD COUNT. 
      LDB WRLEN     CONFIGURE REQUEST TO SHOW THE OFFSET
      STB RQB+#ZOF   OF 'Z' BUFFER FROM START OF DATA BUFFER. 
      ADB A         COMPUTE TOTAL DATA BUFFER LENGTH. 
      LDA ICODE     GET REQUEST CODE, AGAIN.
      CPA D13       IF THIS IS AN I/O STATUS REQUEST, 
      STB RDLEN      PREPARE <#MAST> TO RECEIVE DATA, 
      CPA D13         AND ALSO BYPASS THE SPECIAL 
      JMP MOVEZ        INTERACTIVE WRITE-READ PROCESSING. 
* 
      STB WRLEN     CONFIGURE TRANSMITTED DATA LENGTH.
* 
      CPA D1        CHECK AGAIN FOR A READ REQUEST. 
      JMP IRW?      READ: GO TO CHECK FOR INTERACTIVE W/R.
      JMP MOVEZ     NOT A READ: BYPASS INTERACTIVE CODE.
* 
IRW?  LDB CONSV     GET SHIFTED CONWORD.
      SSB,RSS       INTERACTIVE WRITE-READ? 
      JMP MOVEZ      NO. IGNORE SPECIAL LENGTH CHECK. 
* 
      LDA TEMP+1    RETRIEVE THE WRITE LENGTH 
      CMA,INA        AND MAKE IT NEGATIVE.
      ADA RDLEN     IF THE WRITE LENGTH 
      SSA            IS GREATER THAN THE 'READ' LENGTH, 
      JMP ERIO4       THEN THE REQUEST IS INVALID!
* 
      LDA RDLEN     FORCE ADEQUATE SAM TO BE
      STA WRLEN      ALLOCATED AT RECEIVING NODE. 
      LDA CONWD     GET THE <#MAST> CONTROL WORD. 
      ARS           SET THE LONG TIMEOUT BIT(#14).
      STA CONWD     RESTORE CONWD (140000B).
* 
MOVEZ LDA PRAMS+5   GET THE SECOND BUFFER ADDRESS 
      SZA,RSS       IF NONE WAS SPECIFIED,
      JMP ERIO1      THEN THE REQUEST IS INVALID! 
* 
      LDB ICODE     IF THIS IS NOT
      SLB            A WRITE REQUEST, THEN
      JMP SETZA       THERE IS NO NEED TO MOVE USER DATA. 
* 
      SKP 
      JSB MDATA     MOVE USER'S DATA TO LOCAL BUFFER. 
      LDA DABFA     REFER <#MAST> TO THE LOCAL
SETZA STA OUTBF      OR USER'S TRANSMISSION BUFFER. 
* 
CHEK3 LDA ICODE     IF THE REQUEST
      CPA D3         IS FOR I/O CONTROL, THEN 
      CLA,RSS         MORE PARAMETERS MUST BE PROCESSED;
      JMP I/OND        ELSE, PROCESSING IS COMPLETE.
* 
      LDA PRAMS+3,I GET FIRST OPTIONAL CONTROL PARAMETER. 
      STA RQB+#PRM  ADD IT TO THE REQUEST BUFFER. 
      CLA           PREPARE FOR MISSING PARAMETER.
      LDA PRAMS+4,I GET SECOND OPTIONAL CONTROL PARAMETER.
      STA RQB+#PR2  PLACE IT INTO REQUEST BUFFER. 
* 
I/OND LDA L#I/O     GET THE REQUEST LENGTH AND GO 
      JMP SETLN      TO CONFIGURE THE <#MAST> CALL. 
* 
      SPC 3 
ICOD6 LDB PRAMS+9   IF MORE THAN EIGHT PARAMETERS      RC=06
      SZB,RSS        WERE PASSED, OR IF THE 
      CPB PRAMS+3     'INUM' PARAMETER WAS NOT PASSED,
      JMP ERIO1         THEN THE CALL IS INCORRECT; 
      JMP ICD10          ELSE, GO COMPLETE THE REQUEST. 
* 
      SKP 
PGMST STA RQB+#ICD  PROGRAM STATUS SHARES SCHED CODE.  RC=99
* 
ICD10 JSB NAMP      GO TO PROCESS THE PROGRAM NAME.    RC=10
      JSB .LDX      BUILD LOOP COUNTER
      DEF DM7 
LOOP3 JSB .LAX      GET PARAMETER ADDRESS 
      DEF PRAMS+10
      SZA,RSS       IS IT THERE?
      JMP DON10     NO-EXIT 
      LDA A,I       YES, GET ITS VALUE
      JSB .SAX      STORE INTO REQUEST
      DEF RQB+#IBL+1
      JSB .ISY      ADVANCE THE PARAMETER COUNT.
      JSB .ISX      PROCESSING STRING-LENGTH PARAMETER? 
      JMP LOOP3      NO, CONTINUE 
      LDB PRAMS+9    YES. GET THE STRING-LENGTH ADDRESS.
      JSB LENCK     GO TO CHECK THE STRING-BUFFER LENGTH. 
      STA WRLEN     CONFIGURE WRITE LENGTH FOR <#MAST>. 
      LDB PRAMS+8   GET THE STRING BUFFER ADDRESS.
      STB OUTBF     CONFIGURE '#MAST' TO PASS DATA. 
* 
DON10 JSB .CYA      GET THE PARAMETER COUNT 
      JMP SETLN     GO TO ESTABLISH REQUEST LENGTH. 
* 
      SPC 1 
ICD11 LDA L#TYR     GET REQUEST LENGTH AND GO TO       RC=11
      JMP SETLN      ESTABLISH TIME REQUEST LENGTH. 
      SPC 1 
ICD12 JSB NAMP      GO TO PROCESS THE PROGRAM NAME.    RC=12
* 
      JSB .LDX      SET A LOOP COUNTER
      DEF D3
      CLA 
      LDA PRAMS+5,I GET 6TH PARAMETER 
      SSA 
      JMP LOOP1 
      JSB .ADX      ABSOLUTE TIME, MORE PARAMETERS
      DEF D3
* 
LOOP1 JSB .LAX      GET A PARAMETER ADDRESS 
      DEF PRAMS+2 
      SZA,RSS 
      JMP ERSC1     ABSENT, ERROR 
      LDA A,I       GET THE PARAMETER 
      JSB .SAX      SET IT IN THE REQUEST 
      DEF RQB+#PGN+2
      JSB .ISY      ADVANCE THE PARAMETER COUNT 
      JSB .DSX      ALL DONE ?
      JMP LOOP1     NO, CONTINUE
* 
      JSB .CYA      GET THE PARAMETER COUNT.
      JMP SETLN     READY TO SEND 
* 
      SKP 
PARST LDA PRAMS+3   DO THEY HAVE ANY ROOM ?            RC=25
      SZA,RSS 
      JMP ERIO1     NO, GET OUT!
* 
* 
      LDA PRAMS+5   USER PREPARED TO ACCEPT 3 PARAMETERS? 
      SZA,RSS 
      JMP ERIO1      NO. THE CALL IS INCORRECT! 
* 
      CLA 
      LDA PRAMS+2,I GET CALLER'S PARTITION NO. PARAMETER. 
      STA RQB+#CNW  CONFIGURE CALLING SEQUENCE. 
* 
      LDA L#ST3     GET THE REQUEST LENGTH AND GO TO
      JMP SETLN      ESTABLISH I/O STATUS REQUEST LENGTH. 
      SPC 2 
SCHW  LDA PRAMS+1,I IF THE USER SPECIFIED 
      XOR RCODE      THAT CREATION OF A CLONE 
      SZA,RSS         WAS DESIRED, THEN SKIP; 
      JMP SCHW1        ELSE, BYPASS SETTING BIT#11. 
* 
      CPA BIT11     IF THE 'CLONE-OK' BIT(#11) IS NOT SET,
      CPB D24        OR, IF IT IS SET, AND RC=24, THEN
      JMP ERDS6       THE REQUEST IS NOT ACCEPTABLE: 'DS06'!
* 
      IOR ICODE     CONFIGURE THE 'CLONE-OK' BIT(#11) 
      STA RQB+#ICD   INTO THE TRANSMITTED REQUEST PARAMETER.
* 
SCHW1 LDB D3        SET THE STREAM-TYPE 
      STB RQB+#STR   FOR THE SCHEDULE-WITH-WAIT MONITOR.
      RBR,RBR       MODIFY THE <#MAST> CONTROL WORD FOR 
      STB CONWD      WRITE & LONG TIMEOUT (140000B).
      JMP ICD10     PROCESS ALL PARAMETERS. 
* 
      SKP 
*  CHECK VALIDITY OF BUFFER LENGTH SPECIFICATIONS: DATA+Z <= #DBS WORDS.
* 
LENCK NOP           <A>= DON'T CARE, <B>= ADDRESS OF LENGTH.
      CLA           PREPARE TO RETURN WORD LENGTH =0. 
      SZB,RSS       IF THE LENGTH WAS NOT SPECIFIED,
      JMP LENCK,I   RETURN WITH <A&B> =0. 
* 
      LDB B,I       GET THE BUFFER LENGTH.
      STB TEMP      SAVE USER'S BUFFER LENGTH SPEC. 
      SSB,RSS       WORDS OR -BYTES?
      JMP WORDS      POSITIVE WORDS.
      BRS            NEGATIVE BYTES--CONVERT TO -WORDS. 
      CMB,INB       MAKE THAT +WORDS
WORDS STB TEMP+1    SAVE ACTUAL LENGTH, IN WORDS. 
      LDA B         SAVE +WORDS IN <A> FOR RETURN.
      ADB RMNDR     CHECK FOR ACCEPTABLE LENGTH 
      SSB,RSS 
      JMP ERIO4     >512, TOO MUCH
* 
      STB RMNDR     SAVE REMAINING LOCATION COUNT.
      LDB TEMP      RETURN: A=WORDS, B=USER SPECIFIED LENGTH. 
      JMP LENCK,I   RETURN TO CALLER. 
* 
*  MOVE DATA FROM USER'S BUFFER INTO LOCAL DATA BUFFER. 
* 
MDATA NOP           A=USER BUFFER ADDRESS, B=DON'T CARE.
      LDB TEMP+1    GET MOVE LENGTH (SET BY 'LENCK'). 
      SZB,RSS       IF LENGTH IS ZERO,
      JMP MDATA,I    RETURN NOW.
* 
      LDB DBLOC     DESTINATION IS NEXT DATA BUFFER LOC'N.
      JSB .MVW      MOVE USER'S DATA
      DEF TEMP+1     TO LOCAL DATA BUFFER.
      NOP 
      STB DBLOC     UPDATE NEXT LOCATION POINTER. 
      JMP MDATA,I   RETURN: <A&B>= MEANINGLESS. 
* 
*  VERIFY, AND MOVE PROGRAM NAME TO REQUEST BUFFER; INITIALIZE PARAM. COUNT.
* 
NAMP  NOP           CHECK AND MOVE PROGRAM NAME.
      LDA PRAMS+2   GET ADDRESS OF PROGRAM NAME.
      LDB A,I       IF THE FIRST TWO CHARACTERS 
      SZB,RSS        ARE NULLS, THEN
      JMP ERSC5       THE CALL IS INCORRECT!
* 
      LDB NAMA      GET POINTER TO NAME, IN REQUEST 
      JSB .MVW      MOVE THE NAME TO THE REQUEST
      DEF D3
      NOP 
      JSB .LDY      INITIALIZE THE PARAMETER COUNTER. 
      DEF L#PGN 
      JMP NAMP,I    RETURN
* 
      SKP 
*  SEND THE REMOTE EXEC REQUEST VIA "#MAST" AND AWAIT REPLY 
* 
SETLN STA RQLEN     ESTABLISH REQUEST LENGTH FOR <#MAST>. 
* 
      JSB #MAST     CALL MASTER REQUEST INTERFACE ROUTINE 
      DEF *+8 
      DEF CONWD     CONTROL WORD
      DEF RQLEN     REQUEST LENGTH
OUTBF 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.
INBUF DEF *         CONFIG. REPLY DATA ADDRESS--IF ANY. 
      JMP ERROR     * ERROR DETECTED BY "#MAST"--REPORT IT
* 
      ADA RQBFP     COMPUTE ADDRESS OF OP-SYSTEM IDENTIFIER.
      LDB A,I       GET REMOTE OP-SYSTEM IDENTIFIER,
      STB D#OPS      AND MAKE IT AVAILABLE FOR CALLER.
* 
      LDB ICODE     IF THE REQUEST CODE WAS FOR A:
      CPB D11       - TIME REQUEST, THEN THE
      JMP IPD11        TIME VALUES MUST BE POST-PROCESSED;
      CPB D13       - DEVICE-STATUS REQUEST, THEN THE DEVICE
      JMP IPD13        PARAMETERS NEED POST-PROCESSING; 
      CPB D25       - PARTITION-STATUS REQUEST, THEN THE
      JMP IPD13        PARTITION PARAMETERS NEED PROCESSING;
      CPB D99       - PROGRAM-STATUS REQUEST, THEN CHECK THE
      JMP IPD13        STATUS PARAMETER FOR POST-PROCESSING.
* 
      SKP 
      HED DEXEC: POST-PROCESSING * (C) HEWLETT-PACKARD CO. 1980 * 
IPOST LDA RQB+#ENO
      SSA           ANY ERROR ? 
      JMP ERROR     YES 
LOCND EQU * 
      LDA PRAMS+1,I GET ICODE 
      SSA           WAS THE NO ABORT BIT SET ?
      ISZ EXIT      YES PUSH RETURN ADDRESS 
* 
      LDB ICODE     GET THE REQUEST CODE. 
      CPB D9        SCHEDULE WITH WAIT? 
      CCA,RSS        YES. SET VALUE FOR PARAMETER CHECK.
      CPB D23       QUEUE SCHEDULE WITH WAIT? 
      CCA,RSS        YES. SET VALUE FOR PARAMETER CHECK.
      JMP ATEND      NO. PARAMETER PROCESSING NOT REQUIRED. 
* 
      LDB SAVEB     GET CALLER'S ORIGINAL <B> CONTENTS. 
      CPA RQB+#XML  IF <EXECW> RETURNED PARAMETERS, THEN
      JMP MVPRM      GO MOVE PARAMETERS TO ID SEGMENT.
      JMP RESTX     IGNORE <B> FROM REPLY BUFFER. 
* 
MVPRM CLA           INITIALIZE NAME ARRAY TO INDICATE 
      STA TEMP       REQUEST FOR RETURN OF 'THIS' ID ADDR.
      JSB PGMAD     GET 
      DEF *+3        'THIS' PROGRAM'S 
      DEF TEMP         I.D. SEGMENT 
      DEF TEMP+1         ADDRESS. 
      LDB SAVEB     GET CALLER'S ORIGINAL CONTENTS OF <B>.
      SZA,RSS       IF 'PGMAD' CALL FAILED ( <A>=0),
      JMP RESTX      BYPASS RETURN OF PARAMETERS; 
      ISZ TEMP+1      ELSE, SET POINTER TO ID SEG. WORD#2.
      LDA IRTNP     SOURCE: RETURNED PARAMETERS IN REPLY. 
      LDB TEMP+1    DEST'N: SET INTO CALLER'S ID SEGMENT. 
* 
      JSB $LIBR     GAIN ACCESS TO PROTECTED AREA.
      NOP 
XMAP1 JSB .MVW      MOVE 'PRTN' PAREMETERS [RTE-IV:JSB .LDX]
      DEF D5         INTO CALLER'S ID SEGMENT.
XMAP2 NOP            [RTE-IV: MWI]
      LDB TEMP+1    POINT CALLER'S <B>-REG. TO PARAMETERS.
      JSB $LIBX     RESTORE PROTECTION
      DEF *+1        AND RETURN TO
      DEF RESTX       COMPLETE PROCESSING.
* 
ATEND LDB RQB+#XML  GET <B> FROM THE REPLY BUFFER.
RESTX JSB .LDX      RESTORE THE ORIGINAL CONTENTS 
      DEF SAVEX 
      JSB .LDY       OF BOTH THE <X> & <Y> REGISTERS. 
      DEF SAVEY 
RSTEO LDA SAVEO     GET ORIGINAL STATE FOR <E&O>. 
      CLO           INITIALIZE OVERFLOW TO CLEAR STATE. 
      SLA,ELA       RESTORE <E>, AND IF <O> WAS SET,
      STO            THEN RESTORE IT TOO. 
      CLA           CLEAR THE ALTERNATE 
      STA DLUEX      ENTRY-POINT INDICATION.
      LDA RQB+#EC1  SET <A> FOR RETURN TO CALLER. 
      JMP EXIT,I    RETURN TO <DEXEC'S> CALLER
      SKP 
IPD11 LDA IRTNP     GET ADDRESS OF THE TIME VALUES. 
      LDB PRAMS+2   GET USER'S BUFFER ADDRESS 
      JSB .MVW      PASS 5 WORDS TO THE USER
      DEF D5
      NOP 
      LDB RQB+#TYR  GET THE CURRENT 'YEAR'. 
      STB PRAMS+3,I PASS THE YEAR (OPTIONALLY)
      JMP IPOST     FINISH THE JOB
      SPC 1 
IPD13 LDA RQB+#ST1  GET THE FIRST RETURN-PARAMETER. 
      STA PRAMS+3,I PASS: EQT5/STARTING PAGE/PROG. STATUS 
      CPB D99       IF THE REQUEST WAS FOR PROGRAM STATUS,
      JMP ER99?      THEN CHECK FOR NUMERIC ERROR;
* 
      CLA           PREPARE FOR UNREQUESTED PARAMETER.
      LDB RQB+#ST2  GET THE NEXT RETURN-PARAMETER.
      STB PRAMS+4,I RC=13: EQT4/IPT6  RC=25: NO. PAGES. 
* 
      LDA ICODE     GET REQUEST CODE
      LDB CONSV      AND SHIFTED CONWORD. 
      CPA D13       IF THIS IS AN I/O STATUS REPLY, 
      SLB,RSS        AND A 'Z' BUFFER WAS SPECIFIED, SKIP.
      JMP GETOP     NOT 'Z'. GO GET OPTIONAL PARAMETERS.
* 
      LDA RQB+#XML  GET RETURN LENGTH PARAMETER.
      CPA RQB+#EQ5  A&B MUST BE EQUAL, IF DATA WAS RETURNED.
      CMA,SSA,INA   IF NOT A NEGATIVE WORD LENGTH,
      JMP IPOST      THEN NO 'Z' DATA HAS BEEN RETURNED.
* 
      STA RQB+#XML  SAVE POSITIVE WORD COUNT. 
      LDA DABFA     SOURCE IS LOCAL DATA BUFFER.
      LDB PRAMS+5   DESTINATION IS USER'S BUFFER. 
      JSB .MVW      RETURN THE STATUS 
      DEF RQB+#XML   INFORMATION TO THE CALLER. 
      NOP 
      JMP IPOST     COMPLETE THE PROCESSING.
* 
GETOP CLA           PREPARE FOR UNREQUESTED PARAMETER.
      LDB RQB+#ST3  RC=13:LU STATUS/$DVTP;RC=25:PAR. STATUS.
      STB PRAMS+5,I RETURN TO USER--IF REQUESTED (A, IF NOT)
      CLA           PREPARE FOR UNREQUESTED PARAMETER.
      LDB RQB+#ST4  RC=13: $DVTP+1 (RTE-L). 
      STB PRAMS+6,I RETURN TO USER--ELSE, TO A. 
      JMP IPOST     COMPLETE THE PROCESSING.
* 
ER99? CCA           IF EXECM
      CPA RQB+#EC2   DETECTED AN ERROR, THEN
      JMP ERROR       TAKE THE ERROR PATH; ELSE,
      JMP IPOST        GO COMPLETE NORMAL PROCESSING. 
* 
      HED DEXEC: ERROR PROCESSING * (C) HEWLETT-PACKARD CO. 1980 *
*  DEXEC ERROR ROUTINES.
* 
ERDS6 LDB "06"      IMPROPER REQUEST: "DS06". 
      LDA "DS"
      JMP ERCQ
* 
ERIO1 LDB "01"      INCORRECT,MISSING,OR TOO MANY PARAMETERS
      JMP GETIO 
* 
ERIO4 LDB "04"      IMPROPER BUFFER SPECIFICATION.
* 
GETIO LDA "IO"      ERROR: "IO0X".
      JMP ERCQ
* 
ERSC1 LDB "01"      MISSING SCHEDULEING PARAMETER.
      JMP GETSC 
* 
ERSC5 LDB "05"      INCORRECT PROGRAM NAME. 
* 
GETSC LDA "SC"      ERROR: "SC0X".
* 
*** MAINTAIN ORDER OF NEXT TWO INSTRUCTIONS *** 
ERCQ  CCE,RSS       SET FLAG: ESTABLISH ERROR QUALIFIER.
NECQ  CLE           CLEAR FLAG: DO NOT MODIFY QUALIFIER.
*********************************************** 
      DST RQB+#EC1  SET ERROR CODES INTO REQ.BUFR 
ERRA  EQU *-1       ERROR MESAGE ADDRESS [DEF RQB+#EC1].
      SEZ,RSS       ESTABLISH AN ERROR CODE QUALIFIER?
      JMP ERROR      NO. IT IS ALREADY SET. 
      LDA B21        YES. SET QUALIFIER =1(DEXEC), AND
      STA RQB+#ECQ    MESSAGE LEVEL =1, FOR USER RETRIEVAL. 
      LDA #NODE     GET THE LOCAL NODE NUMBER.
      IOR BIT15     FORM ERROR NODE NO. W/ASCII FLAG. 
      STA RQB+#ENO  SAVE FOR USER RETRIEVAL.
ERROR CLA           CLEAR THE ALTERNATE-
      STA DLUEX      ENTRY INDICATOR, 
      STA D#OPS       AND THE REMOTE $OPSY LOC'N. 
      LDA PRAMS+1,I GET ICODE 
      SSA           NO ABORT BIT SET ?
      JMP ATEND     YES, IT IS
* 
      CCA 
      ADA EXIT      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
* 
"01"  ASC 1,01
"04"  ASC 1,04
"05"  ASC 1,05
"06"  ASC 1,06
"DS"  ASC 1,DS
"IO"  ASC 1,IO
"SC"  ASC 1,SC
* 
      HED DEXEC: LOCAL PROCESSING * (C) HEWLETT-PACKARD CO. 1980
* 
LOCAL LDA #NODE     GET LOCAL NODE FOR USER ERROR ANALYSIS. 
      CPB D99       IF THIS IS A PROGRAM STATUS REQUEST,
      JMP LOCST      THEN PROCESS IT INDEPENDENTLY; 
* 
      IOR BIT15       ELSE, PREPARE REQUEST BUFFER
      STA RQB+#ENO     FOR USER ERROR RETRIEVAL.
* 
      CPB D1        IF THIS IS A READ REQUEST,
      JMP *+2        THEN SKIP FOR FURTHER CHECKING;
      JMP LCHEK       ELSE, CONTINUE LOCAL PROCESSING.
* 
      LDA PRAMS+2   GET ADDRESS OF CONWORD(S).
      LDB SAVEN     IF THIS IS A REFERENCE TO AN
      CPB DLUEX      EXTENDED LOGICAL UNIT NUMBER,
      INA             THEN POINT TO SECOND WORD OF PAIR.
      LDA A,I       GET THE CONTROL WORD. 
      ALF           IF THE INTERACTIVE BIT(#11) 
      SSA            IS SET, THEN THE REQUEST MUST BE 
      JMP SPLOC       PASSED TO <EXECM> FOR PROCESSING. 
* 
LCHEK LDB GETPR+1   GET ADDRESS OF DEF'S FOR CALL.
      JSB .LDX      UP TO 9 PARAMETERS; MORE = ERROR; 
      DEF DM10
LOCL  INB           ADVANCE THE RETURN POINTER. 
      JSB .LAX      GET A PARAMETER ADDRESS 
      DEF PRAMS+11
      SZA,RSS       PRESENT ? 
      JMP LOC1      NO
* 
      JSB .ISX      MORE THAN 10 PARAMETERS PASSED? 
      JMP LOCL       NO. CONTINUE CHECKING. 
      JMP ERIO1      YES. TOO MANY--BUFFER MAY BE DESTROYED!
* 
LOC1  STB PRAMS     SET THE "DEF RETURN"
      DLD ERCQ      GET ERROR-DETECTION INSTRUCTIONS. 
      DST PRAMS,I   INSERT AT RETURN LOCATIONS. 
* 
      LDB RCODA     GET POINTER TO REQUEST CODE VALUE.
      LDA PRAMS+1,I IF THIS IS A LOCALLLY PROCESSED 
      XOR RCODE      REQUEST, WITH THE 'CLONE-OK' BIT SET,
      SZA             THEN, REFER <EXEC> TO THE MASKED
      STB RCODP        REQUEST CODE; IT KNOWS NOT OF BIT#11.
* 
      LDA XLUX      GET POINTER TO 'XLUEX'. 
      LDB SAVEN     IF THE USER CALLED
      CPB DLUEX      VIA THE <DLUEX> ENTRY, THEN
      JMP LOCLN       GO TO ESTABLISH 'XLUEX' AS THE TARGET.
* 
      LDB ICODE     GET REQUEST CODE. 
      LDA EXECX     GET "EXEC" ADDRESS
      ADB DM3 
      SSB,RSS       IS IT READ OR WRITE?
      JMP LOCLN     NO, DO "EXEC" CALL
* 
      LDB PRAMS+5 
      SZB,RSS       OPT.PARAMETERS SPECIFIED? 
      LDA REIOX     NO, OK TO USE REIO! 
LOCLN STA RQLEN     SAVE ADDR FOR MP CHECK
      LDB $OPSY     IF THIS IS
      CPB DM31       AN RTE-L SYSTEM, 
      JMP *+2         THEN SKIP TO COMPENSATE;
      JMP GETRX        ELSE, BYPASS EXEC-CALL MODIFICATION. 
* 
      LDB JSBIN     GET THE NORMAL JSB,I INSTRUCTION. 
      CPA EXECX     IF THIS IS TO BE A CALL TO <EXEC>,
      STA CALEX      THEN CONVERT JSB,I INTO FUNNY 'L' CODE.
      CPA REIOX     IF THIS IS TO BE A CALL TO <REIO>,
      STB CALEX      THEN RESTORE THE JSB,I INSTRUCTION.
* 
GETRX JSB .LDX      RESTORE <X> REGISTER,[LDX USED IN INIT] 
      DEF SAVEX 
      DLD SAVEA      AND THE <A&B> REGISTERS, 
      JMP CALEX       AND GO EXECUTE THE CALL.
* 
LOCST STA RQB+#ENO  SET ERROR NODE: NO SIGN(NUMERIC). 
      JSB PGMAD     GET THE CURRENT STATUS
      DEF *+2        FOR THE USER-SPECIFIED 
      DEF PRAMS+2,I   PROGRAM NAME. 
      SZA           DOES THE PROGRAM EXIST? 
      JMP GETST      YES. GO TO PROCESS THE STATUS. 
* 
      LDA B21       ESTABLISH ERROR QUALIFIER =1, AND 
      STA RQB+#ECQ   MESSAGE LEVEL ALSO =1, FOR RETRIEVAL.
      LDA "DS"       NO. SET <A>='DS' FOR ERROR INDICATION, 
      CCB                AND <B>= -1, FOR USER RETRIEVAL. 
      STB PRAMS+3,I RETURN ERROR TO USER'S PARAM.--IF ANY.
      JMP NECQ      TAKE THE ERROR EXIT.
* 
GETST LDA B         GET THE PROGRAM'S STATUS WORD.
      AND B17       ISOLATE THE STATUS BITS(#3-0), AND
      RAL,ERA        SET SHORT I.D. BIT(#15)--IF TRUE.
      STA PRAMS+3,I RETURN IT TO CALLER'S PARAMETER--IF ANY.
      CLB           <B> =0 FOR GOOD RETURN. 
      DST RQB+#EC1  CONFIGURE ERROR INFO IN HEADER. 
      STB RQB+#XML  ENSURE <B> RETURNED = 0 
      JMP LOCND     GO TO COMPLETE THE CALL.
* 
      SKP 
*  INITIALIZATION: CALLED FIRST ENTRY, ONLY; USES PARAM. AREA TO SAVE SPACE.
* 
      ORG PRAMS     MAKE DOUBLE USE OF CODE SPACE.
* 
INIT  LDB CALEX     GET THE 'JSB RQLEN,I' INSTRUCTION.
      STB JSBIN     SAVE FOR POSSIBLE RESTORATION.
      LDB $OPSY     IF THIS IS
      CPB DM9        AN RTE-IV SYSTEM, THEN 
      JMP CNFGX       CONFIG. FOR X-MAP PARAM. RETURN;
      JMP NOMAP        ELSE, NO CHANGES ARE REQUIRED. 
* 
CNFGX LDB GETRX     GET A 'JSB .LDX' (ASSUMES B.P. LINK)
      STB XMAP1     IT PREPARES 'X' FOR 'MWI'.
      LDB MWINS     GET 'MWI' INSTRUCTION AND INSTALL IT
      STB XMAP2      TO MOVE PARAMS. INTO I.D. SEGMENT. 
* 
NOMAP STA INIT0     NO NEED TO EVER 
      JMP INIT0+1    CALL THIS CODE AGAIN.
* 
ASMER EQU ERTST-*   ASSEMBLY ERROR = OVERFLOW OF PRAMS AREA.
* 
      ORR 
* 
* 
      HED DEXEC: CONSTANTS AND STORAGE * (C) HEWLETT-PACKARD CO. 1980 * 
A     EQU 0 
B     EQU 1 
RQB   EQU #RQB
RQBFP DEF #RQB-1
TEMP  EQU PRAMS+10  TEMPORARY STORAGE.(2 WDS.)
SAVEA NOP 
SAVEB NOP 
SAVEO NOP 
SAVEX NOP 
SAVEY NOP 
SAVEN NOP           'ENT' SAVE FOR 'DEXEC'/'DLUEX' DECISIONS. 
C#DLW ABS #DLW      MAX. REQUEST/REPLY LENGTH.
N#DBS ABS -#DBS-1   BUFFER LENGTH VALIDITY-CHECKING CONSTANT. 
DM3   DEC -3
DM7   DEC -7
DM9   DEC -9
DM10  DEC -10 
DM31  DEC -31 
BIT11 OCT 4000
BIT12 OCT 10000 
BIT15 OCT 100000
B17   OCT 17
B21   OCT 21
D1    DEC 1 
D3    DEC 3 
D5    DEC 5 
D9    DEC 9 
D11   DEC 11
D12   DEC 12
D13   DEC 13
D23   DEC 23
D24   DEC 24
D25   DEC 25
D99   DEC 99
JSBIN NOP           STORAGE FOR 'JSB RQLEN,I' INSTRUCTION.
MWINS MWI           MOVE WORDS INTO ALTERNATE MAP.
CONWD NOP 
CONSV NOP           SHIFTED CONWD: SIGN=BIT#11, LSB=BIT#12
CLNMS OCT 173777    BIT#11 EXCLUSION MASK.
D#OPS NOP           LOCAL/REMOTE OP-SYSTEM IDENTIFIER.
DBLOC NOP           NEXT LOCATION IN DATA/Z BUFFER. 
HILO  OCT 100001
ICODE NOP 
RCODA DEF RCODE     POINTER TO LOCAL REQUEST CODE PARAMETER.
RCODE NOP           ..........   "      "      "      " 
RCODP EQU PRAMS+1   ADDRESS OF RCODE CALLING PARAMETER. 
RDLEN NOP 
RMNDR NOP           1'S COMPLEMENT: REMAINING BUFFER LOC'NS.
RQLEN NOP 
WRLEN NOP 
IRTNP DEF RQB+#RPM  ADDRESS OF RETUTNED PARAMETERS. 
NAMA  DEF RQB+#PGN
EXECX DEF EXEC
REIOX DEF REIO
XLUX  DEF XLUEX 
DABFA DEF DABUF 
DABUF BSS #DBS      DATA/Z BUFFER.
* 
SIZE  EQU *-DEXEC   SIZE OF <DEXEC> (OCTAL).
* 
      END 
                                                