ASMB,Q,C
      HED <RQCNV> 3000 REQUEST CONVERTER (C) HEWLETT-PACKARD CO.
      NAM RQCNV,19,25 91750-16171 REV.2013 800903 MEF 
      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 2 
      EXT EXEC,$LIBR,$LIBX,$RNTB,$OPSY,RNRQ,DTACH,PGMAD 
      EXT #RSAX,#TST,#NULL,#LDEF,#TBRN,#RSM,#NODE 
      EXT #RQCV,#QRN,#RPCV,#QXCL
      EXT D$TST,D$MXR,D$MAX 
      EXT .CAX,.MVW 
      SPC 2 
      UNL           NEXT 5 LINES ARE FOR PRODUCTION ENGINEERING 
*  NAME: RQCNV
*SOURCE: 91750-18171
* RELOC: 91750-16171
*  PGMR: DMT
      LST 
**************************** RQCNV *******************************
*                                                                *
*      SOURCE: 91750-18171                                       *
*                                                                *
*      BINARY: 91750-16171                                       *
*                                                                *
*      PROGRAMMER: JIM HARTSELL                                  *
*                                                                *
*      FEBRUARY 14, 1977                                         *
*                                                                *
*----------------------------------------------------------------*
*                                                                *
*          MODIFIED BY DMT BEGINNING NOVEMBER 7, 1978            *
*           FOR DS/1000 ENHANCEMENTS.                            *
*          MODIFIED BY JDH [790222] FOR DS REQUEST               *
*           EQUATED OFFSETS.                                     *
*                                                                *
******************************************************************
      SPC 2 
* 
* RQCNV IS THE INTERFACE TO THE DS/1000 SLAVE MONITORS FOR REQUESTS 
* ORIGINATING FROM THE HP 3000.  ALL INCOMING REQUESTS ARE CONVERTED
* TO DS/1000 FORMATS FOR PROCESSING AT THE RTE SYSTEM.
* 
A     EQU 0 
B     EQU 1 
XEQT  EQU 1717B 
      SUP 
      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 
* RFBLK-START 
* 
******************************************************************
*                                                                *
*       R F A   B L O C K                REV 2013  791119        *
*                                                                *
*       OFFSETS INTO DS/1000 RFA MESSAGE BUFFERS, USED BY:       *
*                                                                *
*           RFMST, RFAM1, RFAM2, REMAT, RQCNV, RPCNV             *
*                                                                *
******************************************************************
* 
* OFFSETS INTO RFA REQUEST BUFFERS. 
* 
#FCN  EQU #REQ      RFA FUNCTION CODE.
#DCB  EQU #FCN+1    DCB/FILENAME AREA.
#IRC  EQU #DCB+3    DAPOS: IREC 
#IRB  EQU #IRC+1           IRB
#XIB  EQU #IRC+2           IRB   (DXAPO)
#IOF  EQU #IRB+1           IOFF 
#XIO  EQU #XIB+2           IOFF  (DXAPO)
#ITR  EQU #DCB+3    DCLOS: ITRUN
#IC1  EQU #DCB+3    DCONT: ICON1
#IC2  EQU #IC1+1           ICON2
#ICR  EQU #DCB+3    DCRET,DNAME,DOPEN,DPURG: ICR(1) 
#ID   EQU #ICR+1                             IDSEG
#ISC  EQU #ID+1                              ISECU
#SIZ  EQU #ISC+1    DCRET: ISIZE(1) 
#SZ2  EQU #SIZ+1           ISIZE(2) 
#XRS  EQU #SIZ+2           RECSZ (DXCRE)
#TYP  EQU #SZ2+1           ITYPE
#XTY  EQU #XRS+2           ITYPE (DXCRE)
#NNM  EQU #ISC+1    DNAME: NNAME
#IOP  EQU #ISC+1    DOPEN: IOPTN
#NUR  EQU #DCB+3    DPOSN: NUR
#IR   EQU #NUR+1           IR 
#XIR  EQU #NUR+2           IR    (DXPOS)
#IL   EQU #DCB+3    DREAD,DWRIT: IL 
#NUM  EQU #IL+1                  NUM
#LEN  EQU #FCN+1    DSTAT: ILEN 
#FOR  EQU #LEN+1           IFORM
#OPT  EQU #FOR+1           IOP
#NOD  EQU #ICR+1    "FLUSH" REQUEST: NODE NUMBER
* 
* OFFSETS INTO RFA REPLY BUFFERS. 
* 
#RFD  EQU #REP      DCRET,DOPEN: RFAMD ENTRY #
#JSZ  EQU #RFD+1    DCRET: JSIZE (DXCRE)
#LOG  EQU #REP      DREAD: XLOG 
#REC  EQU #REP      DLOCF: IREC 
#RB   EQU #REC+1           IRB
#XRB  EQU #REC+2           IRB   (DXLOC)
#OFF  EQU #RB+1            IOFF 
#XOF  EQU #XRB+2           IOFF  (DXLOC)
#JSC  EQU #OFF+1           JSECT
#XJS  EQU #XOF+1           JSECT (DXLOC)
#JLU  EQU #JSC+1           JLU
#XJL  EQU #XJS+2           JLU   (DXLOC)
#JTY  EQU #JLU+1           JTY
#XJT  EQU #XJL+1           JTY   (DXLOC)
#JRC  EQU #JTY+1           JREC 
#XJR  EQU #XJT+1           JREC  (DXLOC)
#IAD  EQU #REP      DSTAT: IADD 
* 
* MAXIMUM SIZE OF RFA REQUEST/REPLY BUFFER. 
* 
#RLW  EQU #MHD+13      M A X I M U M   S I Z E   ! ! !
* 
* RFBLK-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 
* PPBLK-START 
* 
******************************************************************
*                                                                *
*      P T O P   B L O C K                 REV 2013 791119       *
*                                                                *
*      OFFSETS INTO DS/1000 PTOP MESSAGE BUFFERS, USED BY:       *
*                                                                *
*   POPEN, PTOPM, GET/ACEPT/REJCT, RQCNV, RPCNV, DINIT, REMAT    *
*   #SCSM                                                        *
******************************************************************
* 
* OFFSETS INTO PTOP REQUEST AND REPLY BUFFERS.
* 
#FCD  EQU #REP      FUNCTION CODE.
#PCB  EQU #FCD+1    PCB AREA (3 WORDS). 
#TAG  EQU #PCB+3    TAG AREA (20 WORDS).
* 
* MAXIMUM SIZE OF PTOP REQUEST/REPLY BUFFER.
* 
#PLW  EQU #MXR      M A X I M U M   S I Z E    ! ! !
* 
* PPBLK-END 
      SPC 3 
* OPBLK-START 
* 
******************************************************************
*                                                                *
*      O P R E Q   B L O C K               REV 2013 791119       *
*                                                                *
*      OFFSETS INTO DS/1000 OPREQ MESSAGE BUFFERS, USED BY:      *
*                                                                *
*                   DMESS, OPERM, RQCNV, RPCNV                   *
*                   RSM,   DLGON, #MSSM, #UPSM                   *
******************************************************************
* 
* OFFSETS INTO OPREQ REQUEST AND REPLY BUFFERS. 
* 
#CML  EQU #REQ      COMMAND LENGTH. 
#CMS  EQU #CML+1    COMMAND STRING. 
#LGC  EQU #CMS+1    LOGON REQUEST CODE
#LNL  EQU #LGC+1    LENGTH OF USER NAME 
#LUN  EQU #LNL+1    LOGON USER NAME 
* 
#RLN  EQU #REP      REPLY LENGTH. 
#MSG  EQU #RLN+1    REPLY MESSAGE.
* 
* MAXIMUM SIZE OF OPREQ REQUEST/REPLY BUFFER. 
* 
#OLW  EQU #CMS+23     M A X I M U M   S I Z E   ! ! ! 
* 
* OPBLK-END 
      SKP 
RQCNV LDA $OPSY 
      RAR,SLA       IS THIS AN RTE-III OR IV? 
RSSI  RSS           YES.
      JMP GET       NO. 
      LDB RSSI      GET "RSS" INSTRUCTION.
      STB MODI2     MODIFY TO DO CROSS-MAP LOAD.
      STB MODI3     MODIFY TO DO CROSS-MAP STORE. 
      CLB 
      LDA MWII      MODIFY TO DO "MWI"
      DST DMS2        CROSS-MAP MOVE. 
      LDA MWFI      MODIFY TO DO "MWF"
      DST DMS3        CROSS-MAP MOVE. 
* 
      JSB DTACH     DETACH FROM POSSIBLE SESSION. 
      DEF *+1 
* 
************************************************************
*                                                          *
* MAIN PROCESSING SECTION FOR ALL REQUESTS FROM THE 3000.  *
*                                                          *
************************************************************
* 
GET   EQU * 
* 
      JSB EXEC      WAIT FOR A REQUEST. 
      DEF *+5 
      DEF CLS21 
      DEF #RQCV       RQCNV'S I/O CLASS.
ARQ0  DEF T+CLS3      3000 REQUEST BUFFER.
      DEF D$MXR 
      NOP             IGNORE ERRORS.
* 
      STB RCVLN     SAVE ACTUAL # WORDS RECEIVED. 
      CLA           CLEAR TST POINTER INTO S.A.M. 
      STA TSTAD 
      STA T+STR1    CLEAR LOCAL TST HEADER. 
      STA T+LSEQ
      STA T+HCLS
      STA T+MCLS
      STA T+FNCD
      STA T+MASK
* 
      LDA D#RQB     CLEAR DS/1000 REQUEST BUFFER AREA.
      STA TEMP
      LDB C#MXR 
      CMB,INB 
      CLA 
CLR   STA TEMP,I
      ISZ TEMP
      INB,SZB 
      JMP CLR 
* 
**** EVENTUALLY, BREAK SHOULD BE HANDLED BY REMOTE SESSION MONITOR **** 
      LDA T+CLS3    CHECK FOR MESSAGE CLASS 6,
      AND B377       STREAM 22 OCTAL (BREAK). 
      ALF,ALF 
      STA B 
      LDA T+STR3
      AND B377
      IOR B 
      CPA M6S22 
      JMP SNRP1     YES. JUST SEND A REPLY. 
* 
*   3000 SENDS DSLINE REQUEST FOLLOWING HELLO. IT WILL BE STREAM 22,
*   BUT MAY BE EITHER CLASS 3 OR 7. 
* 
      CPA M3S22 
      JMP SNRP1 
      CPA M7S22 
      JMP SNRP1 
* 
* CHECK TRANSACTION STATUS TABLE (TST) FOR MATCHING SEQUENCE #
* IN 8-WORD FIXED-FORMAT HEADER. A MATCH WILL BE FOUND FOR
* RFA/P-TO-P/DEXEC WRITE AND READ CONTINUATIONS. NOTE THAT
* THE CONTINUATION BIT IS NOT SET IF THIS IS THE LAST ONE.
* 
      DLD #TST      GET TST ADDR AND # OF ENTRIES.
      STA TEMP
      CMB,INB 
      STB TEMP1 
      SZA 
      SZB,RSS 
      JMP REJCT     REJECT IF NO TST. (SHOULDN'T HAPPEN)
* 
TSTLP LDB TEMP      CHECK NEXT ENTRY. 
      JSB LODWD     ENTRY IN USE? 
      SZA,RSS 
      JMP NXTST     NO. GO ON TO NEXT ENTRY.
      INB           YES.
      JSB LODWD     (CROSS) LOAD LOCAL SEQ. #.
      CPA T+SEQ3
      JMP CONT1     MATCH. GO PROCESS CONTINUATION. 
* 
NXTST LDB TEMP      BUMP TO NEXT ENTRY. 
      ADB TSTLN 
      STB TEMP
      ISZ TEMP1 
      JMP TSTLP 
* 
* NO TST ENTRY. PERFORM "GRPM" FUNCTIONS FOR NEW REQUEST. 
* 
      LDA T+CLS3    IF WORD COUNT BYTE = 8
      ALF,ALF 
      AND B377
      CPA D8
      RSS 
      JMP OK1 
      LDA T+STR3     AND CONTINUATION BIT IS SET, 
      RAL,RAL         THIS IS A RESIDUAL CONTINUATION 
      SSA              REQUEST AFTER A TIMEOUT. 
      JMP REJCT 
* 
OK1   LDB #NULL 
      SZB,RSS       ANY TCBS AVAILABLE? 
      JMP REJCT     NO. REJECT. 
* 
      LDA T+CLS3    GET 3000 MESSAGE CLASS. 
      AND B377
      STA TEMP1 
      LDA T+STR3    GET 3000 STREAM TYPE. 
      AND B377
      STA TEMP2 
* 
      LDB MAPTB     MAP DS/3000 MSG CLASS AND 
MAPLP STB TEMP       STREAM TO DS/1000 STREAM.
      LDA B,I       GET NEXT MAP TABLE ENTRY. 
      CPA N1
      JMP REJCT     NOT IN TABLE. 
      CPA TEMP1     COMPARE MESSAGE CLASS.
      RSS 
      JMP NMACH     NO MATCH ON THIS ONE. 
* 
      INB           MATCH.
      LDA B,I       COMPARE DS/3000 STREAM TYPE.
      SZA           IF TABLE ENTRY = 0, IT'S A MATCH. 
      CPA TEMP2     NON-ZERO: TEST IT.
      JMP MATCH     MATCH. GO GET DS/1000 STREAM TYPE.
* 
NMACH LDB TEMP      BUMP TO NEXT MAP TABLE ENTRY. 
      ADB D3
      JMP MAPLP     CONTINUE SEARCH.
* 
MATCH INB 
      LDA B,I       GET DS/1000 STREAM TYPE.
      STA T+STR1
* 
      IOR BIT3K     ADD 3000 BIT AND
      STA RQB+#STR   STORE IN REQ BUFFER. 
* 
      LDA T+STR1
      ADA #LDEF 
      ADA D2        POINT TO LIST HEADER POINTER. 
      LDB A,I       POINT TO LIST HEADER. 
      INB 
      LDA B,I 
      STA T+MCLS    SAVE MONITOR'S CLASS #. 
      INB 
      LDA B,I       GET FIRST WORD OF NAME. 
      RAL,CLE,ERA 
      SZA,RSS       IF MONITOR NOT ENABLED, 
      JMP REJCT       REJECT REQUEST. 
      STA NAME      SAVE FIRST TWO CHARACTERS.
      INB           GET REST
      DLD B,I        OF NAME. 
      DST NAME+1    STORE.
      JSB PGMAD     GET STATUS. 
      DEF *+2 
      DEF NAME
      SZA           NOT FOUND OR
      CPB D4         AVAILABLE MEMORY SUSPEND?
      JMP REJCT     YES. REJECT THE REQUEST.
* 
      LDB $RNTA 
      RSS 
      LDB B,I       RESOLVE INDIRECT. 
      RBL,CLE,SLB,ERB 
      JMP *-2 
      LDA #QRN      GET QUIESCENT RN. 
      AND B377      ISOLATE TABLE INDEX.
      ADB A         COMPUTE POSITION IN RN TABLE. 
      LDA B,I       GET IT. 
      AND B377
      SZA           QUIESCING?
      JMP REJCT     YES. SEND IT BACK.
* 
      STA RQB+#EC1  CLEAR 
      STA RQB+#EC2   UNUSED 
      STA RQB+#ENO    DS/1000 
      STA RQB+#MAS     HEADER 
      STA RQB+#MAR      WORDS.
      STA RQB+#MAC
      STA RQB+#HCT
* 
      LDA #NODE 
      STA RQB+#SRC  SET SOURCE AND
      STA RQB+#DST   DESTINATION NODES = LOCAL. 
* 
      CLA,INA 
      STA RQB+#LVL  FORMAT LEVEL = 1. 
* 
      LDA T+PRC3    SET SESSION ID WORD.
      STA RQB+#SID
* 
      JSB #RSAX     BUILD TCB FOR THIS STREAM.
      DEF *+5 
      DEF D3
      DEF D0        PASS ORIGINATORS SEQUENCE # 
      DEF T+STR1      & STREAM
      DEF RQB+#SRC      & ORIGIN NODE #.
* 
      SSB           OK? 
      JMP REJCT     NO. 
      STA RQB+#SEQ  YES. STORE SEQ # IN RQB.
      STA T+LSEQ    SAVE FOR TST ENTRY. 
* 
      INB           SET "3K" BIT IN WORD 2 OF TCB.
      JSB LODWD 
      IOR BIT14 
      JSB STRWD 
      ADB D2
      LDA T+LSEQ    STORE "LOCAL SEQ #" AS
      JSB STRWD     "ORIG SEQ #" IN TCB.
* 
      LDB #NULL     IF WE USED
      SZB            LAST TCB,
      JMP OK
      JSB RNRQ          LOCK TABLE
      DEF *+4            ACCESS RN
      DEF LGNW             [GLOBAL LOCK]
      DEF #TBRN            [NO WAIT]
      DEF TEMP             [NO ABORT] 
* 
* IF CONTINUATION BIT IS SET IN DS/3000 REQUEST, ALLOCATE 
* A HOLDING CLASS FOR COLLECTION OF DATA BLOCKS BEFORE
* PASSING REQUEST TO DS/1000 MONITOR. 
* 
OK    LDA T+STR3    BIT 13 OF STREAM WORD 
      RAL,RAL        IS CONTINUATION BIT. 
      SSA,RSS 
      JMP CONV      NO CONTINUATION.
* 
      LDA B1315     INITIALIZE CLASS # FOR
      STA T+HCLS    NO RELEASE & NO WAIT. 
* 
      JSB EXEC      QUICK ALLOCATE - NO ABORT.
      DEF *+5 
      DEF CLS19      CLASS CONTROL. 
      DEF D0         LU = "BIT BUCKET" FOR ALLOCATION.
      DEF D0         DUMMY PARAM FOR ALLOCATION.
      DEF T+HCLS     CLASS NUMBER STORAGE ADDRESS.
      JMP REJCT     ERROR.
* 
      JSB EXEC      COMPLETE PREVIOUS ALLOC. REQUEST. 
      DEF *+5 
      DEF CLS21      CLASS GET - NO ABORT.
      DEF T+HCLS
      DEF D0
      DEF D0
      JMP REJCT     ERROR.
* 
* CONVERT DS/3000 REQUEST TO DS/1000 FORMAT.
* 
CONV  JSB D1000 
* 
      STA RQLEN     SAVE LENGTH OF DS/1000 REQUEST. 
* 
* BUILD ENTRY IN TRANSACTION STATUS TABLE (TST).
* 
      DLD #TST      FIND EMPTY SLOT (AVAIL. ENTRY). 
      STA TEMP
      CMB,INB 
      STB TEMP1 
BLOOP LDB TEMP      CHECK NEXT ENTRY. 
      JSB LODWD     CROSS LOAD WORD 1.
      SZA,RSS       ZERO? 
      JMP STTST     YES. (B) = ADDR IN S.A.M. 
* 
      LDB TEMP      NO. GO TO NEXT ENTRY. 
      ADB TSTLN 
      STB TEMP
      ISZ TEMP1 
      JMP BLOOP 
      JMP REJCT     NO AVAILABLE ENTRY. 
* 
STTST STB TSTAD     SAVE ADDR OF TST ENTRY IN S.A.M.
      LDA TSTLN     LENGTH OF A TST ENTRY.
      JSB .CAX      PREPARE FOR A DMS "MWI".
      LDA LTSTA     GET LOCAL TST AREA ADDRESS. 
      JSB $LIBR 
      NOP 
DMS2  JSB .MVW      MOVE ENTRY TO TST [DMS: "MVI"]. 
      DEF TSTLN 
      NOP 
      JSB $LIBX 
      DEF *+1 
      DEF *+1 
* 
      LDB ARQ0      PREPARE FOR DATA ADDRESS POINTER. 
      LDA T+CLS3    IS THERE DATA?
      ALF,ALF 
      AND B377
      ADB A 
      STB DABUF     SET ADDR OF POSSIBLE DATA.
      ADA N8
      CMA,INA 
      LDB T+BYT3
      INB 
      BRS 
      ADA B 
      STA DALEN     SAVE LENGTH OF DATA (OR ZERO).
* 
* CHECK IF THERE WILL BE A CONTINUATION OF DATA.
* 
      LDA T+STR3    CONTINUATION BIT SET IN 
      RAL,RAL       DS/3000 REQUEST?
      SSA 
      JMP CONT2     YES. GO USE HOLDING CLASS.
* 
PUT   LDA RQB+#SID  IF DESTINATION
      AND B377       SESSION ID 
      SZA             HASN'T BEEN SET,
      JMP PUT1
      LDA #RSM         AND THIS NODE
      RAL,CLE,ERA       HAS REMOTE
      SZA                SESSION MONITOR, 
      STA T+MCLS            WRITE TO RSM. 
* 
PUT1  LDA RQLEN     ADD SIZE OF 
      ADA C#LSZ      LOCAL APPENDAGE
      STA RQLEN       (MONITOR WILL REMOVE).
* 
* CLASS WRITE THE DS/1000 REQUEST TO REQUIRED MONITOR.
* 
      JSB EXEC      DO CLASS WRITE/READ.
      DEF *+8 
      DEF CLS20      NO ABORT.
      DEF CONWX      CONTROL WORD W/"Z" BIT & "WRITE".
      DEF DABUF,I    DATA ADDRESS.
      DEF DALEN      DATA LENGTH (COULD BE ZERO). 
      DEF RQB        REQUEST ADDRESS. 
      DEF RQLEN      REQUEST LENGTH.
      DEF T+MCLS     I/O CLASS OF MONITOR.
      JMP REJCT     ERROR RETURN. 
* 
      JMP GET       GO GET NEXT REQUEST.
      SKP 
* 
* PROCESS CONTINUATION REQUEST. 
* 
CONT1 LDA TEMP      SAVE ADDR OF TST ENTRY IN S.A.M.
      STA TSTAD 
* 
      LDA T+CLS3    IF REQUEST IS A 
      ALF,ALF        CONTINUATION 
      AND B377        WITHOUT DATA, 
      ADA N8
      CLE,ELA 
      CMA,INA 
      ADA T+BYT3
      SZA                PASS IT TO RPCNV.
      JMP CONRQ          (OTHERWISE PROCESS CONT.)
      SPC 1 
************************************************************
*                                                          *
*  LET RPCNV HANDLE INTERMEDIATE CONTINUATION REQUESTS FOR *
*  DREAD/PREAD/DEXEC(1).                                   *
*                                                          *
************************************************************
* 
      JSB EXEC      CLASS WRITE/READ TO RPCNV.
      DEF *+8 
      DEF CLS20      NO ABORT.
      DEF D0         SEND ONLY ONE BUFFER.
      DEF T+CLS3     DS/3000 CONT. REQ. 
      DEF D8         # OF WORDS.
      DEF D8         FLAG TO RPCNV. 
      DEF TSTAD      TST ENTRY ADDR.
      DEF #RPCV      REPLY CONVERTER CLASS. 
      JMP REJCT      ERROR RETURN.
      JMP GET       GET NEXT REQUEST. 
      SPC 1 
************************************************************
*                                                          *
* SECONDARY SECTION FOR DWRIT/PWRIT/DEXEC(2) WHEN DATA     *
* RECORD LENGTH IS GREATER THAN 256 WORDS (CONTINUATIONS). *
*                                                          *
************************************************************
* 
CONRQ LDA D6        MOVE 1ST 6 WORDS OF TST ENTRY 
      JSB .CAX       TO LOCAL TST STORAGE AREA. 
      LDA TSTAD 
      LDB LTSTA 
      JSB $LIBR 
      NOP 
DMS3  JSB .MVW      MOVE: [DMS: "MWF"]. 
      DEF D6
      NOP 
      JSB $LIBX 
      DEF *+1 
      DEF *+1 
* 
      JSB #RSAX     IS SLAVE TCB STILL AROUND?
      DEF *+4 
      DEF D5
      DEF T+LSEQ
      DEF T+STR1
* 
      SSB 
      JMP REJCT     NO! REJECT. 
* 
      LDB ARQ0      YES. SET DATA POINTER & LENGTH. 
      LDA T+CLS3
      ALF,ALF 
      AND B377
      ADB A 
      STB DABUF 
      ADA N8
      CMA,INA 
      LDB T+BYT3
      INB 
      BRS 
      ADA B 
      STA DALEN 
* 
      JMP CONT3     GO STACK THE DATA BLOCK.
* 
* WRITE DS/1000 REQUEST TO HOLDING CLASS. LOCAL TST STORAGE 
* AREA CONTAINS APPLICABLE TST ENTRY. 
* 
CONT2 JSB EXEC      WRITE THE DS/1000 REQUEST TO
      DEF *+8        THE HOLDING CLASS. 
      DEF CLS20 
      DEF D0
      DEF RQB        ADDRESS OF REQUEST.
      DEF RQLEN      LENGTH.
      DEF RQLEN 
      DEF D0
      DEF T+HCLS
      JMP REJCT     ERROR.
* 
* WRITE THE DATA BLOCK TO THE HOLDING CLASS. LOCAL TST
* STORAGE AREA CONTAINS APPLICABLE TST ENTRY. 
* 
CONT3 JSB EXEC      WRITE DATA BLOCK TO HOLDING CLASS.
      DEF *+8 
      DEF CLS20 
      DEF D0
      DEF DABUF,I    ADDRESS OF DATA. 
      DEF DALEN      LENGTH OF THIS BLOCK.
      DEF DALEN 
      DEF D0
      DEF T+HCLS
      JMP REJCT     ERROR.
* 
      LDA T+STR3    CONTINUATION BIT SET (IS THERE MORE?).
      RAL,RAL 
      SSA,RSS 
      JMP GATHR     NO. GO PREPARE FOR MONITOR. 
* 
* SEND INTERMEDIATE REPLY FOR THIS CONTINUATION REQUEST.
* 
      LDA T+LSEQ    STORE LOCAL SEQUENCE NUMBER.
      STA T+SEQ3
SNRP1 LDA T+STR3    SET REPLY BIT.
      IOR BIT15 
      STA T+STR3
SNREP LDA T+CLS3    SET WDCNT = 8.
      AND B377
      IOR LFT8
      STA T+CLS3
      LDA T+PRC3    REVERSE PROCESS NUMBERS.
      ALF,ALF 
      STA T+PRC3
      CLA           SET N = 0.
      STA T+BYT3
* 
      LDA #QXCL 
      SSA 
      JMP GET       LINE IS DISCONNECTED. IGNORE. 
* 
      JSB EXEC      WRITE "REPLY" TO QUEX'S CLASS.
      DEF *+8 
      DEF CLS20 
      DEF D0
      DEF T+CLS3
      DEF D8
      DEF D8
      DEF D0
      DEF #QXCL 
      JMP REJCT     ERROR.
* 
      JMP GET       GO WAIT FOR CONTINUATION. 
* 
* GATHER DS/1000 REQUEST AND DATA BLOCKS FOR
* PASSAGE TO DS/1000 SLAVE MONITOR. 
* 
GATHR JSB EXEC      GET DS/1000 REQUEST.
      DEF *+6 
      DEF CLS21 
      DEF T+HCLS    NO WAIT, NO RELEASE.
      DEF RQB 
      DEF C#MXR 
      DEF LOG 
      JMP REJCT     ERROR.
* 
      SSA           ANYTHING THERE? 
      JMP REJCT     NO. 
* 
      LDA LOG 
      STA RQLEN     SAVE LEN OF DS/1000 REQUEST.
* 
      LDA ARQ8      INIT DATA BUFFER POINTER. 
      STA DABUF     SET POINTER TO DATA.
      STA TEMP
      CLA           INIT TOTAL DATA LENGTH. 
      STA DALEN 
* 
GDATA CMA,INA       SUBTRACT DATA LENGTH
      ADA D$MAX      FROM MAX BUFFER LENGTH 
      STA TEMP1       TO GET REMAINING LENGTH.
* 
      JSB EXEC      GET A DATA BLOCK. 
      DEF *+6 
      DEF CLS21 
      DEF T+HCLS    NO WAIT, NO RELEASE.
      DEF TEMP,I    DATA BUFFER POINTER.
      DEF TEMP1     REMAINING BUFFER LENGTH.
      DEF LOG 
      JMP REJCT     ERROR.
* 
      SSA,RSS       ANYTHING THERE? 
      JMP ADJST     YES.
      LDA DALEN     NO. DID WE GET ANY DATA?
      SZA,RSS 
      JMP REJCT     NO. REJECT. 
      JSB RLEAS     YES. RELEASE HOLDING CLASS. 
      JMP PUT       GO SEND REQUEST TO MONITOR. 
* 
ADJST LDA TEMP      ADJUST FOR NEXT DATA BLOCK. 
      ADA LOG 
      STA TEMP
      LDA DALEN 
      ADA LOG 
      STA DALEN 
* 
      JMP GDATA     GET MORE DATA.
      SKP 
* 
* SEND A "REJECT" REPLY TO THE 3000 FOR THIS REQUEST. 
* LOCAL TST STORAGE AREA CONTAINS CURRENT TST 6-WORD HEADER 
* AND FIXED-FORMAT HEADER FROM CURRENT REQUEST. "TSTAD" 
* CONTAINS ADDRESS OF TST ENTRY IN S.A.M. 
* 
REJCT LDB TSTAD     DELETE TST ENTRY IN S.A.M.
      CLA 
      SZB           SKIP IF NO TST CREATED. 
      JSB STRWD 
* 
      LDA T+LSEQ    WAS SLAVE TCB CREATED?
      SZA,RSS 
      JMP HLD       NO. 
* 
      JSB #RSAX     YES. DELETE SLAVE TCB.
      DEF *+4 
      DEF D7
      DEF T+LSEQ
      DEF T+STR1
* 
HLD   LDA T+HCLS    HOLDING CLASS ALLOCATED?
      SZA 
      JSB RLEAS     YES. RELEASE IT.
* 
      LDA T+STR3    SET REJECT BIT IN REQUEST.
      IOR BIT14 
      AND NBT13     CLEAR CONTINUATION BIT. 
      STA T+STR3
      LDA D8
      STA RQLEN 
      LDA T+LSEQ    STORE LOCAL SEQUENCE NUMBER.
      STA T+SEQ3
      JMP SNREP     GO SEND REJECT REPLY. 
      SKP 
* 
* SUBROUTINE TO FLUSH AND RELEASE THE HOLDING CLASS.
* 
RLEAS NOP 
* 
CREPT CCA           SET RELEASE RE-TRY SWITCH 
      STA TEMP      TO -1.
* 
CLRTN JSB EXEC      RELEASE CLASS NUMBER. 
      DEF *+5 
      DEF CLS21     NO ABORT. 
      DEF T+HCLS    HOLDING CLASS #.
      DEF D0
      DEF D0
      RSS 
* 
      ISZ TEMP      RELEASE PROCESSING COMPLETED? 
      JMP RLEND     YES.
      INA,SZA       NO. ARE ALL PENDING REQUESTS CLEARED? 
      JMP CREPT     NO. CONTINUE TO CLEAR REQUESTS. 
* 
      LDA T+HCLS    YES. SET FOR DE-ALLOCATE. 
      AND CLMSK 
      STA T+HCLS
      JMP CLRTN     DO FINAL DEALLOCATION.
* 
RLEND CLA           CLEAR SLOT IN LOCAL TST.
      STA T+HCLS
      LDB TSTAD     IF TST ENTRY EXISTS,
      SZB,RSS 
      JMP RLEAS,I 
      ADB D2        CLEAR SLOT THERE, TOO.
      JSB STRWD 
      JMP RLEAS,I   RETURN TO CALLER. 
      SKP 
* 
* SUBROUTINE TO LOAD FROM ALTERNATE MAP (IF RTE-III OR IV). 
* 
LODWD NOP 
MODI2 LDA B,I       (RSS IF DMS SYSTEM) 
      JMP LODWD,I   RETURN IF RTE-II. 
      XLA B,I       LOAD WORD FROM ALTERNATE MAP. 
      JMP LODWD,I 
* 
MWII  MWI 
* 
MWFI  MWF 
      SPC 3 
* 
* SUBROUTINE TO STORE INTO ALTERNATE MAP (IF RTE-III OR IV).
* 
STRWD NOP 
      JSB $LIBR 
      NOP 
MODI3 STA B,I       (RSS IF DMS SYSTEM) 
      JMP OUT 
      XSA B,I       STORE WORD INTO ALTERNATE MAP.
OUT   JSB $LIBX 
      DEF STRWD 
      SKP 
**************************************************************
*                                                            *
* SUBROUTINE TO CONVERT DS/3000 REQUESTS TO DS/1000 FORMAT.  *
*                                                            *
**************************************************************
* 
D1000 NOP 
* 
* KEY OFF 3000 MESSAGE CLASS NUMBER.
* 
      LDA T+CLS3
      AND B377      ISOLATE MESSAGE CLASS.
      ADA N3        SUBRACT 3.
      LDB D5
      JSB BNDCK     CHECK RANGE: 0 - 5. 
      ADA JTAB1     TABLE ADDRESS + MESSAGE CLASS.
      LDA A,I 
      LDB T+STR3    GET DS/3000 STREAM WORD.
      JMP A,I       GO TO MESSAGE CLASS PROCESSORS. 
* 
JTAB1 DEF *+1 
      DEF MSCL3     OPERATOR COMMAND. 
      DEF MSCL4     PREAD/PWRIT/PCONT.
      DEF MSCL5     $STDLIST/$STDIN.
      DEF MSCL6     HELLO/BYE/KILL
      DEF MSCL7     POPEN/PCLOS.
      DEF MSCL8     RFA/DEXEC.
* 
************************************************
* MESSAGE CLASS 3 ..... OPERATOR COMMANDS.     *
************************************************
* 
MSCL3 LDA T+BYT3    STORE COMMAND LENGTH. 
      STA RQB+#CML  (+ BYTES) 
      INA 
      ARS           CONVERT +BYTES TO +WORDS. 
      STA TEMP
* 
      CMA,INA       CHECK LENGTH AGAINST LIMIT. 
      ADA MXCMD 
      SSA 
      JMP REJCT     COMMAND IS TOO LONG. REJECT.
* 
      LDA ARQ8      MOVE ASCII COMMAND. 
      LDB CMDA
      JSB .MVW
      DEF TEMP
      NOP 
* 
      LDA TEMP      SET LENGTH OF DS/1000 REQUEST.
      ADA L#CML 
      JMP D1000,I   RETURN. 
* 
************************************************
* MESSAGE CLASS 4 ..... PREAD/PWRIT/PCONT.     *
************************************************
* 
MSCL4 LDA B         GET DS/3000 STREAM WORD.
      AND B377      ISOLATE STREAM. 
      ADA NB22      SUBRACT 22 OCTAL. 
      LDB D2
      JSB BNDCK     CHECK RANGE: 0 - 2. 
      ADA D2        FORM PTOP FCODE.
      STA RQB+#FCD  STORE IN REQUEST. 
      STA T+FNCD    STORE IN TST ENTRY. 
* 
      LDA ARQ10     MOVE PCB AND TAG FIELD. 
      LDB PCBA
      JSB .MVW
      DEF D23 
      NOP 
* 
      LDA T+FNCD
      CPA D4
      JMP MSC4A     SKIP IF PCONT.
      LDA T+APN1    CHECK FOR DATA LIMIT. 
      JSB LIMCK 
      STB RQB+#PCB+2  STORE IL PARAM IN RQB.
* 
MSC4A LDA C#PLW     SET LENGTH OF DS/1000 REQUEST.
      JMP D1000,I   RETURN. 
* 
************************************************
* MESSAGE CLASS 5 ..... $STDLIST/$STDIN        *
************************************************
* 
*  SEND SHORT DS/1000 HEADER TO CNSLM AND PUT ENTIRE
*  DS/3000 REQUEST AS DATA BUFFER.
* 
MSCL5 LDA ARQ0      SET CLASS I/O 
      STA DABUF      DATA ADDRESS,
      LDA RCVLN 
      STA DALEN       DATA LENGTH,
      LDA D7
      STA RQLEN        AND REQUEST LENGTH.
      JMP PUT1      PASS ON TO "CNSLM". 
* 
************************************************
* MESSAGE CLASS 6 ..... HELLO/BYE/KILL.        *
************************************************
* 
MSCL6 LDA #RSM      GET REMOTE SESSION MONITOR'S
      RAL,CLE,ERA    CLASS. IF NOT PRESENT, 
      SZA,RSS         REJECT THE REQUEST. 
      JMP REJCT 
* 
      STA T+MCLS    STORE CLASS NUMBER IN TST.
      LDA T+STR3
      AND B377      ISOLATE STREAM. 
      CPA B20       STREAM 20 
      JMP HELLO      IS HELLO.
      CPA B21       STREAM 21 
      JMP BYE        IS BYE.
      CPA B27       STREAM 27 
      JMP BYE        IS KILL. 
      JMP REJCT     REJECT OTHERS.
* 
HELLO LDA T+BYT3    GET # OF BYTES. 
      ADA N6        SUBTRACT "HELLO". 
      STA RQB+#LNL  STORE IN DS/1000 HEADER.
      SZA           IF LENGTH IF ZERO,
      SSA            OR NEGATIVE, 
      JMP REJCT        REJECT.
      INA           CONVERT 
      CLE,ERA        TO WORDS.
      STA TEMP
* 
      CMA,INA       CHECK LENGTH AGAINST LIMIT. 
      ADA MXUSR 
      SSA 
      JMP REJCT     ACCOUNT IS TOO LONG. REJECT.
* 
      LDA ARQ11     ACCOUNT NAME SOURCE 
      LDB ACTA       AND DESTINATION. 
      JSB .MVW      MOVE ACCOUNT. 
      DEF TEMP
      NOP 
      CLA,INA       SET ICODE = 1.
      JMP STCOD 
* 
BYE   CLA,INA       LENGTH OF MSG 
      STA TEMP       IS ONE WORD. 
      LDA RQB+#SID  STORE DESTINATION SESSION 
      AND B377       IN BUFFER AND
      STA RQB+#LNL     CLEAR DESTINATION
      XOR RQB+#SID      IN SESSION ID WORD. 
      STA RQB+#SID
      CLA           SET ICODE = 0 
* 
STCOD STA RQB+#LGC  STORE ICODE.
      LDA D2        SET COMMAND 
      STA RQB+#CML   LENGTH TO 2. 
      LDA "XX"      STORE 
      STA RQB+#CMS   "XX".
      LDA TEMP      SET UP
      ADA L#LNL      LENGTH.
      JMP D1000,I   RETURN. 
* 
************************************************
* MESSAGE CLASS 7, STREAM 21 ..... POPEN/PCLOS.*
************************************************
* 
MSCL7 LDA T+APN2    GET DS/3000 "RFA" CODE. 
      AND B377
      ADA NB25      SUBTRACT 25 OCTAL.
      LDB D1
      JSB BNDCK     CHECK RANGE: 0 - 1. 
      SZA 
      JMP PCLOS 
* 
* CONVERT POPEN REQUEST.
* 
      LDA POCLO     STORE PTOP FCODE
      STA RQB+#FCD   (POPEN WITH CLONE).
      STA T+FNCD    STORE IN TST ENTRY. 
* 
      LDA ARQ11     MOVE PROGRAM NAME.
      LDB PCBA
      JSB .MVW
      DEF D3
      NOP 
      LDA ARQ29     MOVE TAG FIELD. 
      LDB PCBA
      ADB D3
      JSB .MVW
      DEF D20 
      NOP 
* 
      LDA T+AP47    STORE POPEN MASK IN TST ENTRY.
      STA T+MASK
* 
      LDA C#PLW     SET LENGTH OF DS/1000 REQUEST.
      JMP D1000,I   RETURN. 
* 
* CONVERT PCLOS REQUEST.
* 
PCLOS LDA D5        STORE PTOP FCODE. 
      STA RQB+#FCD
      STA T+FNCD    STORE IN TST ENTRY. 
* 
      LDA ARQ11     MOVE PCB. 
      LDB PCBA
      JSB .MVW
      DEF D3
      NOP 
* 
      LDA L#PCB     SET LENGTH OF DS/1000 REQUEST.
      JMP D1000,I 
* 
************************************************
* MESSAGE CLASS 8, STREAM 20 ..... RFA.        *
************************************************
* 
MSCL8 LDA B 
      AND B377
      CPA B20 
      RSS 
      JMP STM21     STREAM 21 IS DEXEC. 
      LDA ARQ12     MOVE DCB (GARBAGE FOR DSTAT). 
      LDB NAMA
      JSB .MVW
      DEF D3
      NOP 
* 
      LDA T+APNG    GET FCN CODE FROM DS/3000 REQUEST.
      ADA N150      SUBRACT 150.
      LDB D12 
      JSB BNDCK     CHECK RANGE: 0 - 12.
      ADA JMAP1     TABLE ADDRESS + 3000 FCN CODE.
      LDA A,I       GET DS/1000 FCN CODE. 
      STA RQB+#FCN  STORE IN DS/1000 REQUEST. 
      STA T+FNCD    STORE IN TST ENTRY. 
* 
      ADA JTAB3     TABLE ADDRESS + 1000 FCN CODE.
      LDB A,I 
      LDA XEQT      GET ID SEG ADDR OF RQCNV (DUMMY). 
      JMP B,I       GO CONVERT THE RFA REQUEST. 
* 
JMAP1 DEF *+1       DS/3000 - DS/1000 FCN MAPPING TABLE.
D3    DEC 3          DCRET
D8    DEC 8          DPURG
D6    DEC 6          DOPEN
D12   DEC 12         DWRIT
      DEC 9          DREAD
D7    DEC 7          DPOSN
      DEC 11         DWIND
D1    DEC 1          DCLOS
D5    DEC 5          DNAME
D2    DEC 2          DCONT
D4    DEC 4          DLOCF
D0    DEC 0          DAPOS
      DEC 10         DSTAT
* 
JTAB3 DEF *+1       TABLE OF CONVERSION ROUTINE ADDRESSES.
      DEF DAPOS 
      DEF DCLOS 
      DEF DCONT 
      DEF DCRET 
      DEF DLOCF 
      DEF DNAME 
      DEF DOPEN 
      DEF DPOSN 
      DEF DPURG 
      DEF DREAD 
      DEF DSTAT 
      DEF DWIND 
      DEF DWRIT 
* 
* CONVERT DS/3000 RFA REQUEST TO DS/1000 FORMAT.
* 
DAPOS STA RQB+#DCB
      LDA T+APN7    MOVE RECNUM PARAM.
      STA RQB+#IRC
      LDA T+APN8    MOVE REL BLOCK PARAM. 
      STA RQB+#IRB
      LDA T+APN9    MOVE BLOCK OFFSET PARAM.
      STA RQB+#IOF
* 
      LDA L#IOF     SET LENGTH OF DS/1000 REQUEST.
      JMP D1000,I   RETURN. 
* 
DCLOS STA RQB+#DCB
      LDA T+APN7    MOVE ITRUN PARAM. 
      STA RQB+#ITR
      LDA L#ITR     SET LENGTH OF DS/1000 REQUEST.
      JMP D1000,I   RETURN. 
* 
DCONT STA RQB+#DCB
      DLD T+APN7    MOVE ICON1, ICON2 
      DST RQB+#IC1
* 
      LDA L#IC2     SET LENGTH OF DS/1000 REQUEST.
      JMP D1000,I   RETURN. 
* 
DCRET STA RQB+#ID 
      LDA T+AP11    MOVE ICR PARAM. 
      STA RQB+#ICR
      LDA T+AP10    MOVE ISECU PARAM. 
      STA RQB+#ISC
      DLD T+APN7    MOVE ISIZE(1), ISIZE(2).
      DST RQB+#SIZ
      LDA T+APN9    MOVE ITYPE PARAM. 
      STA RQB+#TYP
* 
      LDA L#TYP     SET LENGTH OF DS/1000 REQUEST.
      JMP D1000,I   RETURN. 
* 
DLOCF STA RQB+#DCB
      LDA L#DCB     SET LENGTH OF DS/1000 REQUEST.
      JMP D1000,I   RETURN. 
* 
DNAME STA RQB+#ID 
      LDA T+AP11    MOVE ICR PARAM. 
      STA RQB+#ICR
      LDA T+AP10    MOVE ISECU PARAM. 
      STA RQB+#ISC
      DLD T+APN7    MOVE NEWNAME PARAM. 
      DST RQB+#NNM
      LDA T+APN9
      STA RQB+#NNM+2
* 
      LDA L#NNM     SET LENGTH OF DS/1000 REQUEST.
      JMP D1000,I   RETURN. 
* 
DOPEN STA RQB+#ID 
      LDA T+APN9    MOVE ICR PARAM. 
      STA RQB+#ICR
      LDA T+APN8    MOVE ISECU PARAM. 
      STA RQB+#ISC
      LDA T+APN7    MOVE IOPTN PARAM. 
      STA RQB+#IOP
* 
      LDA L#IOP     SET LENGTH OF DS/1000 REQUEST.
      JMP D1000,I   RETURN. 
* 
DPOSN STA RQB+#DCB
      LDA T+APN7    MOVE NUR PARAM. 
      STA RQB+#NUR
      LDA T+APN8    MOVE ICR PARAM. 
      STA RQB+#IR 
* 
      LDA L#IR      SET LENGTH OF DS/1000 REQUEST.
      JMP D1000,I   RETURN. 
* 
DPURG STA RQB+#ID 
      LDA T+APN8    MOVE ICR PARAM. 
      STA RQB+#ICR
      LDA T+APN7    MOVE ISECU PARAM. 
      STA RQB+#ISC
* 
      LDA L#ISC     SET LENGTH OF DS/1000 REQUEST.
      JMP D1000,I   RETURN. 
* 
DREAD STA RQB+#DCB
      LDA T+APN7    MOVE IL PARAM.
      STA RQB+#IL 
      LDA T+APN9    MOVE NUM PARAM. 
      STA RQB+#NUM
* 
      LDA L#NUM     SET LENGTH OF DS/1000 REQUEST.
      JMP D1000,I   RETURN. 
* 
DSTAT CLA           CLEAR 
      STA RQB+#FOR   IFORM
      STA RQB+#OPT    AND IOP 
      LDA D125      ILEN IS 
      STA RQB+#LEN   125. 
* 
      LDA L#XXX     SET LENGTH OF DS/1000 REQUEST.
      JMP D1000,I   RETURN. 
* 
DWIND STA RQB+#DCB
      LDA L#DCB     SET LENGTH OF DS/1000 REQUEST.
      JMP D1000,I   RETURN. .q
* 
DWRIT STA RQB+#DCB
      LDA T+APN7    MOVE IL PARAM.
      STA RQB+#IL 
      LDA T+APN8    MOVE NUM PARAM. 
      STA RQB+#NUM
* 
      LDA T+APN2    CHECK FOR DATA LIMIT. 
      JSB LIMCK 
* 
      LDA L#NUM     SET LENGTH OF DS/1000 REQUEST.
      JMP D1000,I   RETURN. 
* 
************************************************
* MESSAGE CLASS 8, STREAM 21 ..... DEXEC.      *
************************************************
* 
STM21 LDA T+APN4    GET RCODE FROM DS/3000 REQUEST. 
      ADA N1        SUBTRACT 1. 
      LDB D12 
      JSB BNDCK     CHECK RANGE: 0 - 12.
      LDB A         STORE RCODE IN TST ENTRY. 
      INB 
      STB T+FNCD
      STB RQB+#ICD  STORE RCODE FOR DS/1000.
      ADA JTAB4     TABLE ADDRESS + RCODE.
      LDA A,I 
      JMP A,I       GO CONVERT THE DEXEC REQUEST. 
* 
JTAB4 DEF *+1       TABLE OF CONVERSION ROUTINE ADDRESSES.
      DEF DEX1       READ 
      DEF DEX1       WRITE (SAME AS READ) 
      DEF DEX3       I/O CONTROL. 
      DEF REJCT 
      DEF REJCT 
      DEF REJCT 
      DEF REJCT 
      DEF REJCT 
      DEF REJCT 
      DEF DEX10      SCHEDULE 
      DEF DEX11      TIME 
      DEF DEX12      EXECUTION TIME 
      DEF DEX13      I/O STATUS 
* 
* CONVERT DS/3000 DEXEC REQUEST TO DS/1000 FORMAT.
* 
DEX1  LDA T+APN5     MOVE ICNWD PARAM.
      STA RQB+#CNW
      LDA T+APN6     MOVE IBUFL PARAM.
      STA RQB+#BFL
      DLD T+APN7     MOVE IPRM1, IPRM2. 
      DST RQB+#PM1
* 
      LDA T+APN2    CHECK FOR DATA LIMIT. 
      JSB LIMCK 
* 
      LDA L#PM2      SET LENGTH OF DS/1000 REQUEST. 
      JMP D1000,I    RETURN.
* 
DEX3  LDA T+APN5     MOVE ICNWD PARAM.
      STA RQB+#CNW
      LDA T+APN6     MOVE IPRAM 
      STA RQB+#PRM
* 
      LDA L#PRM      SET LENGTH OF DS/1000 REQUEST. 
      JMP D1000,I    RETURN.
* 
DEX10 LDA ARQ13      MOVE PROG NAME & 5 PARAMS. 
      LDB NAMA
      JSB .MVW
      DEF D8
      NOP 
* 
      LDA L#PMS      SET LENGTH OF DS/1000 REQUEST. 
      JMP D1000,I    RETURN.
* 
DEX11 LDA L#TYR      SET LENGTH OF DS/1000 REQUEST. 
      JMP D1000,I    RETURN.
* 
DEX12 LDA ARQ13      MOVE PROGRAM NAME. 
      LDB NAMA
      JSB .MVW
      DEF D3
      NOP 
      DLD T+APN8     MOVE IRESL, MULT PARAMS. 
      DST RQB+#RSL
      LDA T+AP10     MOVE IOFST/IHRS PARAM. 
      STA RQB+#HRS
      SSA 
      JMP DX12A      NEGATIVE - DONE WITH THIS ONE. 
* 
      DLD T+AP11     MOVE MINS, ISECS.
      DST RQB+#MIN
      LDA T+AP13     MOVE MSECS.
      STA RQB+#MSC
      LDA L#MSC      SET LENGTH OF DS 1000 REQUEST. 
      RSS 
* 
DX12A LDA L#HRS      SET LENGTH OF DS/1000 REQUEST. 
      JMP D1000,I    RETURN.
* 
DEX13 LDA T+APN5     MOVE ICNWD PARAM.
      STA RQB+#CNW
* 
      LDA L#ST3      SET LENGTH OF DS/1000 REQUEST. 
      JMP D1000,I    RETURN.
      SKP 
* 
* SUBROUTINE TO CHECK IF INDEX IS WITHIN SPECIFIED RANGE. 
*   (A) = INDEX (PRESERVED)    (B) = UPPER LIMIT. 
*   REQUEST IS REJECTED IF OUT OF BOUNDS. 
* 
BNDCK NOP 
      STA LOC        SAVE A-REGISTER. 
      SSA 
      JMP REJCT      REJECT IF NEGATIVE.
      CMA,INA 
      ADA B 
      SSA 
      JMP REJCT      REJECT IF BEYOND LIMIT.
      LDA LOC        RESTORE A-REGISTER.
      JMP BNDCK,I    RETURN.
* 
LOC   OCT 0 
      SPC 3 
* 
* SUBROUTINE TO CHECK IF DATA LENGTH EXCEEDS DS/1000 LIMIT. 
* 
LIMCK NOP           (A) = TCOUNT: -BYTES OR +WORDS. 
      SSA,RSS 
      JMP LIM1      + WORDS.
      CMA,INA       - BYTES. CONVERT TO +WORDS. 
      INA 
      ARS 
LIM1  STA B         SAVE WORD COUNT IN B-REG. 
      CMA,INA 
      ADA D$MAX 
      SSA 
      JMP REJCT     EXCEEDS LIMIT. REJECT.
      JMP LIMCK,I 
      SKP 
* 
* CONSTANTS AND WORKING STORAGE.
* 
* MAPPING TABLE BETWEEN DS/3000 AND DS/1000 STREAM TYPES. 
* 
*   WORD 1 = DS/3000 MESSAGE CLASS. 
*   WORD 2 = DS/3000 STREAM (0 = DON'T CARE). 
*   WORD 3 = DS/1000 STREAM TYPE. 
* 
MAPTB DEF *+1 
      OCT 3,20,7    RTE COMMANDS            - OPERM 
      OCT 4,0,4     SLAVE PREAD/PWRIT/PCONT - PTOPM 
      OCT 5,0,2     UNREQUESTED I/O         - CNSLM 
      OCT 6,0,7     HELLO/BYE/KILL          - OPERM/RSM 
      OCT 7,21,4    SLAVE POPEN/PCLOS       - PTOPM 
      OCT 10,20,6   RTE FMP RFA             - RFAM
      OCT 10,21,5   REMOTE EXEC (DEXEC)     - EXECM 
      OCT -1        DELIMITER FOR MAP TABLE.
* 
LGNW  OCT 140002    USED FOR RN LOCK
POCLO OCT 20001     CODE FOR POPEN WITH CLONE.
B20   OCT 20
B21   OCT 21
B377  OCT 377 
B1315 OCT 120000
BIT14 OCT 40000 
BIT15 OCT 100000
BIT3K OCT 110000    "3K" & LEVEL BITS FOR DS/1K STREAM WORD 
NBT13 OCT 157777    ALL BUT BIT 13. 
CLMSK OCT 117777
LFT8  BYT 10,0      DECIMAL 8, LEFT BYTE. 
CONWX OCT 10100 
CLS19 DEF 19,I
CLS20 DEF 20,I
CLS21 DEF 21,I
M3S22 BYT 3,22      CLASS 3, STREAM 22. 
M6S22 BYT 6,22      CLASS 6, STREAM 22. 
M7S22 BYT 7,22      CLASS 7, STREAM 22. 
D20   DEC 20
D23   DEC 23
D125  DEC 125 
B27   EQU D23 
N1    DEC -1
N3    DEC -3
N5    DEC -5
N6    DEC -6
N8    DEC -8
N150  DEC -150
NB22  OCT -22 
NB25  OCT -25 
"XX"  ASC 1,XX
$RNTA DEF $RNTB 
LOG   NOP 
NAME  BSS 3 
TEMP  NOP 
TEMP1 NOP 
TEMP2 NOP 
RCVLN NOP 
RQLEN NOP 
DABUF NOP 
DALEN NOP 
* 
C#PLW ABS #PLW
L#CML ABS #CML+1
L#LNL ABS #LNL+1
L#PCB ABS #PCB+3
L#IOF ABS #IOF+1
L#ITR ABS #ITR+1
L#IC2 ABS #IC2+1
L#TYP ABS #TYP+1
L#DCB ABS #DCB+3
L#NNM ABS #NNM+3
L#IOP ABS #IOP+1
L#IR  ABS #IR+1 
L#ISC ABS #ISC+1
L#NUM ABS #NUM+1
L#XXX ABS #OPT+1
L#PM2 ABS #PM2+1
L#PRM ABS #PRM+1
L#PMS ABS #PMS+5
L#TYR ABS #TYR+1
L#MSC ABS #MSC+1
L#HRS ABS #HRS+1
L#ST3 ABS #ST3+1
C#LSZ ABS #LSZ
* 
C#MXR ABS #MXR      MAX LENGTH OF DS/1000 REQUEST.
RQB   BSS #MXR      DS/1000 REQUEST BUFFER. 
D#RQB DEF RQB 
NAMA  DEF RQB+#DCB
PCBA  DEF RQB+#PCB
CMDA  DEF RQB+#CMS
ACTA  DEF RQB+#LUN
* 
MXCMD ABS #OLW-#CMS MAXIMUM LENGTH OF COMMAND STRING. 
MXUSR ABS #OLW-#LUN MAXIMUM LENGTH OF ACCOUNT IN HELLO. 
* 
TSTAD NOP           ADDR OF TST ENTRY IN S.A.M. 
TSTLN DEC 14        LENGTH OF TST ENTRY.
LTSTA DEF T+STR1    ADDR OF LOCAL TST AREA. 
      SPC 1 
*  OFFSETS INTO LOCAL TST AND DS/3000 REQUEST BUFFER: 
T     EQU D$TST 
STR1  EQU 0         DS/1000 STREAM
LSEQ  EQU 1         LOCAL SEQUENCE NO 
HCLS  EQU 2         HOLDING CLASS NO
MCLS  EQU 3         MONITOR CLASS NO
FNCD  EQU 4         FUNCTION CODE 
MASK  EQU 5         POPEN MASK WORD 
CLS3  EQU 6         DS/3000 CLASS 
STR3  EQU 8         DS/3000 STREAM
PRC3  EQU 10        PROCESS NUMBERS 
SEQ3  EQU 11        SEQUENCE NUMBER 
BYT3  EQU 13        BYTE COUNT
APNG  EQU 14        APPENDAGE 
APN1  EQU 15        APPENDAGE WORD 1
APN2  EQU 16        APPENDAGE WORD 2
APN3  EQU 17        APPENDAGE WORD 3
APN4  EQU 18        APPENDAGE WORD 4
APN5  EQU 19        APPENDAGE WORD 5
APN6  EQU 20        APPENDAGE WORD 6
APN7  EQU 21        APPENDAGE WORD 7
APN8  EQU 22        APPENDAGE WORD 8
APN9  EQU 23        APPENDAGE WORD 9
AP10  EQU 24        APPENDAGE WORD 10 
AP11  EQU 25        APPENDAGE WORD 11 
AP13  EQU 27        APPENDAGE WORD 13 
AP21  EQU 35        APPENDAGE WORD 21 
AP47  EQU 61        APPENDAGE WORD 47 
* 
ARQ8  DEF T+APNG
ARQ10 DEF T+APN2
ARQ11 DEF T+APN3
ARQ12 DEF T+APN4
ARQ13 DEF T+APN5
ARQ29 DEF T+AP21
* 
      BSS 0          ******** SIZE OF RQCNV ************
* 
      END RQCNV 
                                                                                                                                                                                                                                                              