ASMB,Q,C
      HED <RPCNV> 3000 REPLY CONVERTER (C) HEWLETT-PACKARD CO.  
      NAM RPCNV,19,25 91750-16170 REV.2013 800319 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,DTACH,$LIBR,$LIBX,$OPSY
      EXT #RPCV,#QXCL,#TST,#GET 
      EXT D$TST,D$MAX,D$BSZ,D$MXR 
      EXT .CAX,.MVW 
      SPC 1 
      UNL           NEXT 5 LINES ARE FOR PRODUCTION ENGINEERING 
*  NAME: RPCNV
*SOURCE: 91750-18170
* RELOC: 91750-16170
*  PGMR: DMT
      LST 
**************************** RPCNV *******************************
*                                                                *
*      SOURCE: 91750-18170                                       *
*                                                                *
*      BINARY: 91750-16170                                       *
*                                                                *
*      PROGRAMMER: JIM HARTSELL                                  *
*                                                                *
*      FEBRUARY 28, 1977                                         *
*                                                                *
*----------------------------------------------------------------*
*                                                                *
*       MODIFIED BY DMT BEGINNING NOVEMBER 7, 1978               *
*        FOR DS/1000 ENHANCEMENTS.                               *
*       MODIFIED BY JDH [790222] FOR DS REQUEST                  *
*        EQUATED OFFSETS.                                        *
*                                                                *
******************************************************************
      SPC 1 
* 
* RPCNV IS THE INTERFACE TO THE DS/1000 SLAVE MONITORS FOR REPLIES
* DESTINED FOR THE HP 3000.  ALL OUTGOING REPLIES ARE CONVERTED 
* TO DS/3000 FORMATS. 
* 
      SUP 
A     EQU 0 
B     EQU 1 
      SKP 
* GLBLK-START 
* 
******************************************************************
*                                                                *
*     G L O B A L   B L O C K               REV 2013 791119      *
*                                                                *
*     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 7 WORDS (#STR THRU #ENO) IS      *
***!!!!!     FIXED BY THE REQUIREMENT THAT THE STREAM, ADDRESSES *
***!!!!!     AND ERROR CODES ALWAYS BE IN THE SAME PLACE,        *
***!!!!!     REGARDLESS OF MESSAGE FORMAT.  THIS MAKES STORE-AND-*
***!!!!!     FORWARD CODE MUCH SIMPLER.                          *
#STR  EQU 0         STREAM WORD.
#SEQ  EQU #STR+1    SEQUENCE NUMBER.
#SRC  EQU #SEQ+1    SOURCE NODE #.
#DST  EQU #SRC+1    DEST. NODE #. 
#EC1  EQU #DST+1    REPLY ECOD1.
#EC2  EQU #EC1+1    REPLY ECOD2.
#ENO  EQU #EC2+1    NUMBER OF NODE REPORTING ERROR. 
* 
#ECQ  EQU #ENO+1    ERROR CODE QUALIFIER (BITS 4 TO 7)
#LVL  EQU #ECQ      MESSAGE FORMAT LEVEL (BITS 0 TO 3)
#MAS  EQU #LVL+1    MA "SEND" SEQ. #
#MAR  EQU #MAS+1    MA "RECV" SEQ. #
#MAC  EQU #MAR+1    MA "CANCEL" FLAGS 
#HCT  EQU #MAC+1    HOP COUNT 
#SID  EQU #HCT+1    SESSION ID WORD 
* 
#EHD  EQU #SID      LAST ITEM OF HEADER 
#MHD  EQU #EHD+1    MINIMUM HEADER SIZE 
#REQ  EQU #MHD      START OF REQUEST SPECIFIC AREA
#REP  EQU #MHD      START OF REPLY SPECIFIC AREA
* 
#MXR  EQU #MHD+24   <<< MAXIMUM DS REQ/REPLY BUFFER SIZE >>>
#LSZ  EQU 2         <<< SIZE OF LOCAL APPENDAGE AREA >>>
* 
******************************************************************
* 
* GLBLK-END 
      SKP 
* 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 791119      *
*                                                                *
*      OFFSETS INTO DS/1000 DEXEC MESSAGE BUFFERS, USED BY:      *
*                                                                *
*       DEXEC, EXECM, EXECW, RQCNV, RPCNV, FLOAD, REMAT          *
*       DSTIO, LUMAP, #SCSM, RMTIO                               *
******************************************************************
* 
* OFFSETS INTO DEXEC REQUEST BUFFERS. 
* 
#ICD  EQU #REQ      ICODE FOR DEXEC(ALL)
#CNW  EQU #ICD+1    CONWD FOR DEXEC(1,2,3,13) 
#CWX  EQU #CNW+1    DLUEX EXTENSION FOR DEXEC(1,2,3,13) 
#BFL  EQU #CWX+1    IBUFL FOR DEXEC(1,2)
#PM1  EQU #BFL+1    IPRM1 FOR DEXEC(1,2)
#PM2  EQU #PM1+1    IPRM2 FOR DEXEC(1,2)
#PRM  EQU #CWX+1    IPRAM FOR DEXEC(3)
#PGN  EQU #ICD+1    PRGNM FOR DEXEC(6,9,10,12,23,24,99) 
#INU  EQU #PGN+3    INUMB FOR DEXEC(6)
#DPM  EQU #INU+1    PARMS FOR DEXEC(6)          (5-WORD AREA) 
#PMS  EQU #PGN+3    PARMS FOR DEXEC(9,10,23,24) (5-WORD AREA) 
#IBF  EQU #PMS+5    IBUFR FOR DEXEC(9,10,23,24) 
#IBL  EQU #IBF+1    IBUFL FOR DEXEC(9,10,23,24) 
#FNO  EQU #IBL+1    FNOD  FOR DEXEC(9)          (APLDR) 
#RSL  EQU #PGN+3    IRESL FOR DEXEC(12) 
#MPL  EQU #RSL+1    MTPLE FOR DEXEC(12) 
#HRS  EQU #MPL+1    IHRS  FOR DEXEC(12) 
#MIN  EQU #HRS+1    IMIN  FOR DEXEC(12) 
#SEC  EQU #MIN+1    ISECS FOR DEXEC(12) 
#MSC  EQU #SEC+1    MSECS FOR DEXEC(12) 
#PAR  EQU #ICD+1    PARTI FOR DEXEC(25)         (PARTITION #) 
#IST  EQU #PGN+3    ISTAT FOR DEXEC(99) 
* 
* OFFSETS INTO DEXEC REPLY BUFFERS. 
* 
#EQ5  EQU #EC1      EQT 5 FOR DEXEC(1,2,3)
#XML  EQU #EC2      TRANSMISSION LOG (DEXEC 1,2)
#RPM  EQU #REP      PRAMS FOR DEXEC(9,23)       (5-WORD AREA) 
#TMS  EQU #REP      MSEC  FOR DEXEC(11) 
#TSC  EQU #TMS+1    SEC   FOR DEXEC(11) 
#TMN  EQU #TSC+1    MIN   FOR DEXEC(11) 
#THR  EQU #TMN+1    HRS   FOR DEXEC(11) 
#TDA  EQU #THR+1    DAY   FOR DEXEC(11) 
#TYR  EQU #TDA+1    YEAR  FOR DEXEC(11) 
#ST1  EQU #REP      ISTA1 FOR DEXEC(13) 
#ST2  EQU #ST1+1    ISTA2 FOR DEXEC(13) 
#ST3  EQU #ST2+1    ISTA3 FOR DEXEC(13) 
#PAG  EQU #REP      IPAGE FOR DEXEC(25) 
#IPN  EQU #PAG+1    IPNUM FOR DEXEC(25) 
#PST  EQU #IPN+1    ISTAT FOR DEXEC(25) 
#KST  EQU #REP      ISTAT FOR DEXEC(99) 
* 
* MAXIMUM SIZE OF DEXEC REQUEST/REPLY BUFFER. 
* 
#DLW  EQU #MHD+11+#LSZ    M A X I M U M   S I Z E   ! ! ! 
* 
* MAXIMUM SIZE OF DEXEC/EXECM DATA BUFFER.
* 
#DBS  EQU 512          M A X I M U M   S I Z E  ! ! ! 
* 
* DXBLK-END 
      SKP 
* 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 
RPCNV LDA $OPSY 
      RAR,SLA       IS THIS AN RTE-III OR IV? 
RSSI  RSS           YES.
      JMP SETCL     NO. 
      LDB RSSI      GET "RSS" INSTRUCTION.
      STB MODI2     MODIFY TO DO CROSS-MAP LOAD.
      STB MODI3     MODIFY TO DO CROSS-MAP STORE. 
      DLD MWFI      MODIFY TO DO "MWF"
      DST DMS3        CROSS-MAP MOVE. 
* 
      JSB DTACH     DETACH FROM POSSIBLE SESSION. 
      DEF *+1 
* 
SETCL LDA #RPCV     SET BIT 
      IOR B60K       TO SAVE
      STA CLASS       BUFFER. 
* 
************************************************************
*                                                          *
* MAIN PROCESSING SECTION FOR ALL REPLIES FOR THE 3000.    *
*                                                          *
************************************************************
* 
GET   EQU * 
      JSB EXEC      LOOK AT THE CLASS.
      DEF *+7 
      DEF D21 
      DEF CLASS 
      DEF T+CLS3
      DEF D8
      DEF PARM1 
      DEF PARM2 
* 
      LDA PARM1     CHECK FIRST OPTIONAL PARAMETER. 
      CPA D8         8? 
      JMP DOCLR        INTERMEDIATE CONTINUATION. 
      CPA D1         1? 
      RSS              SLAVE TIMEOUT FROM UPLIN.
      JMP DO#GT      NEITHER--PICK UP VIA #GET. 
* 
DOCLR LDA CLASS     CLEAR "SAVE BUFFER" 
      ALR,RAR        FLAG IN CLASS. 
      STA TEMP
      JSB EXEC      DO DUMMY "GET"
      DEF *+5        TO RELEASE 
      DEF D21         BUFFER. 
      DEF TEMP
      DEF T+AP25
      DEF D0
* 
      LDA PARM1     TAKE FURTHER ACTION 
      CPA D8         DEPENDING UPON PARM1.
      JMP INTCO 
* 
* SLAVE TCB TIMED OUT AND UPLIN SENT THE SEQUENCE NUMBER. 
* 
      LDA T+CLS3    GET SEQUENCE NUMBER.
      STA RQB+#SEQ  PUT IT IN DS/1000 HEADER WORD.
      JMP SRTST     GO SEARCH TST.
* 
* INTERMEDIATE CONTINUATION REQUEST PASSED VIA RQCNV. 
* 
INTCO LDB PARM2     GET TST ADDRESS.
      STB TSTAD 
      ADB D2        GET HOLDING CLASS 
      JSB LODWD      FROM S.A.M.
      STA T+HCLS
      ADB D9        GET ORIGINAL SEQUENCE 
      JSB LODWD      NUMBER FROM S.A.M. 
      STA T+SEQ3
* 
      LDA T+STR3    IF 3000 
      AND BIT14      REJECTED,
      SZA 
      JMP RLTST        RELEASE TST. 
* 
      JMP PSTUP     DO PRELIMINARY SET-UP.
      SPC 1 
*  BUFFER CAME FROM DS/1000 MONITOR.
DO#GT JSB #GET      PICK UP BUFFER
      DEF *+6        FROM DS/1000 SLAVE MONITORS. 
      DEF #RPCV       RPCNV'S I/O CLASS.
      DEF RQB         1000 REPLY BUFFER.
      DEF C#MXR       MAXIMUM LENGTH. 
DBUFA DEF T+AP25
      DEF D$MAX 
      JMP GET       ERROR RETURN. 
* 
      STA RQLOG     SAVE REPLY LENGTH.
      STB TCNT      SAVE LENGTH OF DATA RECEIVED. 
* 
* SEARCH TRANSACTION STATUS TABLE (TST) FOR MATCHING SEQUENCE # 
* IN 8-WORD FIXED-FORMAT HEADER.
* 
SRTST DLD #TST      GET TST ADDR AND # OF ENTRIES.
      STA TEMP
      CMB,INB 
      STB TEMP1 
      SZA 
      SZB,RSS 
      JMP GET       FORGET IT IF NO TST.
* 
TSTLP LDB TEMP      CHECK NEXT ENTRY. 
      JSB LODWD     VALID ENTRY?
      SZA,RSS 
      JMP NXTST     NO. GO CHECK NEXT ENTRY.
      INB           YES.
      JSB LODWD     (CROSS) LOAD LOCAL SEQ. #.
      CPA RQB+#SEQ
      JMP CONV      MATCH. GO PROCESS REPLY.
* 
NXTST LDB TEMP      BUMP TO NEXT ENTRY. 
      ADB TSTLN 
      STB TEMP
      ISZ TEMP1 
      JMP TSTLP 
      JMP GET       NOT FOUND.
* 
* MOVE TST ENTRY FROM S.A.M. TO LOCAL STORAGE AREA. 
* (THIS IS 8-WORD HEADER BELONGING TO THIS REPLY.)
* 
CONV  LDA TEMP      SAVE ADDR OF TST ENTRY IN S.A.M.
      STA TSTAD 
      LDA TSTLN     MOVE TST ENTRY TO LOCAL STORAGE.
      JSB .CAX
      LDA TSTAD 
      LDB LTSTA 
DMS3  JSB .MVW      MOVE: [DMS: "MWF"]. 
      DEF TSTLN 
      NOP 
* 
* PERFORM PRELIMINARY SET-UP OF FIXED FORMAT HEADER.
* 
PSTUP LDA T+STR3
      AND NOT13     CLEAR CONTINUATION BIT. 
      IOR BIT15     SET REPLY BIT.
      STA T+STR3
      LDA RQB+#SID  REVERSE PROCESS NUMBERS.
      ALF,ALF 
* 
      LDB PARM1     DS/3000 CONTINUATION REQUEST? 
      CPB D8
      JMP CONRQ       YES. GET DATA OFF BUFFER. 
      CPB D1        IF UPLIN DETECTED A TIMEOUT 
      JMP TOREJ       REJECT IT.
* 
      STA T+PRC3    STORE REVERSED PROCESS NUMBERS. 
* 
* IF OPERATOR COMMAND REPLY, PROCESS INTERVENING $STDLIST MESSAGE.
* 
      LDA RQB+#STR
      AND B17 
      CPA D7
      RSS 
      JMP CONV1     NOT A COMMAND REPLY.
* 
      DLD RQB+#EC1  GET ERROR CODE. 
      SZA,RSS       IF ZERO,
      JMP CKRPL       CHECK FOR ASCII REPLY 
* 
      DST T+APN2    STORE ASCII ERROR CODE. 
      LDA D2        LENGTH IS 2 WORDS.
      JMP DO$SD     DO $STDLIST.
* 
CKRPL LDA T+CLS3    IF ORIGINAL 3000 CLASS
      AND B377       WAS 6 (HELLO/BYE/KILL),
      CPA D6          THERE IS NO MESSAGE.
      JMP CONV1 
* 
      LDA RQB+#RLN  IF NO ASCII 
      SZA,RSS        REPLY MESSAGE, 
      JMP CONV1       DON'T DO THE $STDLIST.
* 
      LDA D#PCB     MOVE ASCII REPLY MESSAGE. 
      LDB ARQ10 
      JSB .MVW
      DEF RQB+#RLN
      NOP 
* 
      LDA RQB+#RLN  GET LENGTH OF ASCII REPLY MSG.
* 
DO$SD ADA D2        ADD # CONTROL WORDS.
      ALS 
      STA T+BYT3    STORE BYTE COUNT. 
      ARS 
      ADA D8
      STA RQLEN     SAVE LENGTH OF REQUEST. 
* 
      LDA T+PRC3    SAVE 3000 PROCESS NUMBERS.
      STA SVFTO 
      AND B377      SET "FROM PROCESS NO."
      STA T+PRC3      ZERO. (NO 3000 REPLY) 
      LDA T+CLS3    SAVE 3000 MESSAGE CLASS.
      STA SVMCL 
      LDA T+STR3    SAVE 3000 STREAM TYPE.
      STA SVSTR       (REPLY BIT IS SET)
      LDA D5        BUILD $STDLIST REQUEST. 
      STA T+CLS3      MESSAGE CLASS = 5.
      LDA B20 
      STA T+STR3      STREAM = 20.
      CLA           CLEAR CONTROL WORDS.
      STA T+APNG
      STA T+APN1
      LDA RQLEN     GET LENGTH OF REQUEST.
      ALF,ALF 
      STA B 
      LDA T+CLS3    STORE WORD COUNT. 
      AND B377
      IOR B 
      STA T+CLS3
* 
      JSB SEND      WRITE $STDLIST TO QUEX. 
      JMP RLTST     ERROR RTN: LINE DISCONNECTED. 
* 
      LDA SVMCL     RESTORE 3000 MESSAGE CLASS. 
      STA T+CLS3
      LDA SVSTR     RESTORE 3000 STREAM.
      STA T+STR3
      LDA SVFTO     RESTORE 3000 PROCESS NUMBERS. 
      STA T+PRC3
* 
* CONVERT DS/1000 REPLY TO DS/3000 FORMAT.
* 
CONV1 CLA           CLEAR "DATA IN
      STA INPLC      PLACE" FLAG. 
      JSB D1000     MAKE CONVERSION.
* 
      STA T+BYT3    STORE BYTE LENGTH.
      INA           STORE WORD COUNT BYTE.
      ARS 
      ADA D8
      STA RQLEN     SAVE LEN OF DS/3000 REPLY.
      ALF,ALF 
      STA B 
      LDA T+CLS3
      AND B377
      IOR B 
      STA T+CLS3
* 
* CHECK IF THERE IS DATA IN THIS REPLY. 
* 
      LDA TCNT      IS THERE DATA?
      SZA 
      JMP CONT1     YES. GO PREPARE DATA REPLY. 
* 
* CLASS WRITE THE DS/3000 REPLY TO QUEX'S I-O CLASS.
* 
PUT   JSB SEND      DO CLASS WRITE/READ.
      NOP           IGNORE ERROR RETURN.
* 
* RELEASE TST ENTRY IN S.A.M. 
* 
RLTST LDA T+HCLS    LEAVING A HOLDING CLASS?
      SZA,RSS 
      JMP STO0        NO. SET 1ST WORD TO 0.
* 
      JSB EXEC      GET BUFFER OFF
      DEF *+5        HOLDING CLASS
      DEF CLS21       AND DEALLOCATE. 
      DEF T+HCLS
      DEF TEMP
      DEF D0
      NOP           (IGNORE ERRORS.)
* 
STO0  LDB TSTAD 
      CLA 
      SZB           (MAKE SURE ADDR IS GOOD!) 
      JSB STRWD 
* 
      JMP GET       DONE WITH THIS REPLY. 
      SPC 5 
************************************************************
*                                                          *
*  INTERMEDIATE CONTINUATION REQUEST RECEIVED FOR DS/3000  *
*  DREAD/PREAD/DEXEC(1) DATA REPLIES.                      *
*                                                          *
************************************************************
* 
CONRQ LDA T+PRC3    REVERSE PROCESS NUMBER. 
      ALF,ALF 
      STA T+PRC3
      JSB EXEC      READ DATA.
      DEF *+6 
      DEF CLS21 
      DEF T+HCLS     (DE-ALLOCATE)
      DEF T+APNG
      DEF D$MAX 
      DEF TCNT       # WORDS REMAINING. 
      JMP REJCT     ERROR.
* 
      ISZ INPLC     DATA IS IN PLACE. 
      CLA           RESET BYTE
      STA T+BYT3     COUNT AND CLEAR
      STA T+HCLS      CLASS NUMBER IN 
      LDB TSTAD        LOCAL AND
      ADB D2            SAM TST.
      JSB STRWD 
      LDA T+CLS3    RESET 
      AND B377       WORD 
      IOR UP8         COUNT.
      STA T+CLS3
      SPC 1 
************************************************************
*                                                          *
* SECONDARY SECTION FOR DREAD/PREAD/DEXEC(1) DATA REPLIES. *
*                                                          *
************************************************************
* 
* PROCESS DATA REPLIES (POSSIBLE CONTINUATIONS).
* 
*  USE MINIMUM OF D$BSZ (CONFIGURED LINE SIZE, SET BY QUEX) AND 
*  D$MXR (ACTUAL BUFFER SIZE APPENDED) FOR SENDING DATA.
* 
CONT1 LDA D$BSZ     SUBTRACT D$BSZ
      CMA,INA        FROM D$MXR. IF 
      ADA D$MXR       RESULT > 0 USE D$BSZ. 
      LDB D$BSZ        IF < 0, USE D$MXR. 
      SSA 
      LDB D$MXR 
      STB BUFSZ     SAVE BUFFER SIZE LOCALLY. 
* 
      LDA T+CLS3    STORE HEADER +
      ALF,ALF        APPENDAGE LENGTH.
      AND B377
      STA H&ALN 
      ADA TCNT      ADD TOTAL # DATA WORDS REMAINING. 
      STA RQLEN     SAVE TOTAL REQUEST LENGTH.
      CMA,INA 
      ADA BUFSZ     WILL IT ALL FIT IN THIS REPLY?
      SSA,RSS 
      JMP CONT3     YES.
* 
      LDA BUFSZ     NO. SET LENGTH TO MAX.
      STA RQLEN 
      LDA T+STR3    SET CONTINUATION BIT. 
      IOR BIT13 
      STA T+STR3
      LDA T+LSEQ    SET RTE SEQUENCE # SO CONT. 
      STA T+SEQ3     REQUEST WILL GO TO RPCNV.
* 
CONT3 LDA H&ALN     SUBTRACT HEADER + 
      CMA,INA        APPENDAGE LEN FROM 
      ADA RQLEN       TOTAL REQUEST LENGTH
      STA DALEN        FOR DATA LENGTH. 
* 
      LDA INPLC     IF "DATA IN PLACE"
      SZA             FLAG IS SET,
      JMP CONT4          DON'T NEED TO MOVE DATA. 
* 
      LDB ARQ0      FIND WHERE TO PUT THE DATA
      ADB H&ALN      IN THE DS/3000 REPLY.
      LDA DBUFA 
      JSB .MVW      MOVE THE NEXT DATA BLOCK. 
      DEF DALEN 
      NOP 
* 
CONT4 LDA DALEN     UPDATE REPLY BYTE COUNT.
      ALS 
      ADA T+BYT3
      STA T+BYT3
* 
      JSB SEND      WRITE REPLY TO QUEX.
      JMP RLTST     ERROR RTN: LINE DISCONNECTED. 
* 
      LDA DALEN     REDUCE TCNT BY DALEN. 
      CMA,INA 
      ADA TCNT
      STA TCNT
      SZA,RSS       ANY MORE DATA BLOCKS? 
      JMP RLTST     NO. GO RELEASE TST ENTRY. 
* 
* ALLOCATE A HOLDING CLASS AND WRITE DATA.
* 
      LDA BIT15     INITIALIZE CLASS # FOR
      STA T+HCLS     NO WAIT. 
* 
      LDA DBUFA     CALCULATE ADDRESS 
      ADA DALEN      OF REMAINING DATA. 
      STA DTADR 
* 
      JSB EXEC      WRITE DATA BLOCK TO HOLDING CLASS.
      DEF *+8 
      DEF CLS20 
      DEF D0
DTADR DEF *-*        ADDRESS OF REMAINING DATA. 
      DEF TCNT       LENGTH OF THIS BLOCK.
      DEF TCNT
      DEF D0
      DEF T+HCLS
      JMP REJCT      ERROR. 
* 
      LDB TSTAD     SET HOLDING CLASS 
      ADB D2         NUMBER IN TST. 
      LDA T+HCLS
      JSB STRWD 
* 
      JMP GET       GET  NEXT REPLY.
      SPC 1 
BUFSZ NOP           BUFFER SIZE.
      SKP 
* 
* BEFORE REJECTING, REVERSE PROCESS NUMBERS FOR SLAVE TCB TIMEOUT.
* 
TOREJ LDA T+PRC3
      ALF,ALF 
      STA T+PRC3
* 
* SEND A "REJECT" REPLY TO THE 3000 FOR THIS REQUEST. 
* LOCAL TST STORAGE AREA CONTAINS CURRENT TST 4-WORD HEADER 
* AND FIXED-FORMAT HEADER FROM CURRENT REQUEST. "TSTAD" 
* CONTAINS ADDRESS OF TST ENTRY IN S.A.M. 
* 
REJCT LDA T+STR3    SET REJECT BIT IN REQUEST.
      IOR BIT14 
      AND NOT13     CLEAR CONTINUATION BIT. 
      STA T+STR3
      CLA           SET APPENDAGE/DATA
      STA T+BYT3     LENGTH 0.
      LDA D8        REQUEST LENGTH IS 8.
      STA RQLEN 
      LDA T+CLS3    SET LENGTH OF HEADER
      AND B377       PLUS APPENDAGE TO 8. 
      IOR UP8 
      STA T+CLS3
      JMP PUT       GO SEND REJECT REPLY & RELEASE TST. 
      SPC 5 
* 
* SUBROUTINE TO SAVE RESOURCES AND TERMINATE UNTIL
* RE-SCHEDULED BY QUEX WHEN INTERMEDIATE REPLY ARRIVES. 
* 
* 
* 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 
* 
MWFI  MWF 
      NOP 
      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     RETURN TO CALLER. 
      SKP 
* 
* SUBROUTINE TO WRITE TO QUEX'S I/O CLASS.
* 
SEND  NOP 
* 
      LDA #QXCL     IF DISCONNECTED,
      SSA           TAKE ERROR RETURN.
      JMP SEND,I
* 
      JSB EXEC      DO CLASS WRITE/READ.
      DEF *+8 
      DEF CLS20      NO ABORT.
      DEF D0
      DEF T+CLS3      REPLY ADDRESS.
      DEF RQLEN      REPLY LENGTH.
      DEF RQLEN 
      DEF D0
      DEF #QXCL      I/O CLASS OF QUEX. 
      JMP RLTST     ERROR RETURN. 
* 
      ISZ SEND      TAKE NORMAL RETURN. 
      JMP SEND,I    RETURN TO CALLER. 
      SKP Pl
* 
**************************************************************
*                                                            *
* SUBROUTINE TO CONVERT DS/1000 REPLIES TO DS/3000 FORMAT.   *
*                                                            *
**************************************************************
* 
D1000 NOP 
      LDA RQB+#STR  ISOLATE STREAM TYPE.
      AND B377
      ADA N4        SUBRACT 4.
      LDB D3
      JSB BNDCK     CHECK RANGE: 0 - 3. 
      ADA JTAB1     TABLE ADDRESS + STREAM TYPE.
      LDA A,I 
      JMP A,I       GO TO MESSAGE CLASS PROCESSORS. 
* 
JTAB1 DEF *+1 
      DEF MSCL4     PTOP. 
      DEF MSC8B     DEXEC.
      DEF MSC8A     RFA.
      DEF MSCL3     OPERATOR COMMAND. 
* 
************************************************
* SUBROUTINE TO CHECK FOR ASCII ERRORS.        *
* LOAD B-REG WITH SYSTEM ERROR CODE (-41 FOR   *
* PTOP, -999 FOR RFA) AND CALL CHKER. NO CHANGE*
* TAKES PLACE IF ERROR IS NUMERIC.             *
************************************************
* 
CHKER NOP           ENTRY.
      LDA RQB+#ENO  GET ERROR INDICATOR.
      SSA,RSS       IF ASCII BIT NOT SET, 
      JMP CHKER,I    RETURN.
      LDA RQB+#EC1  GET CHARACTER PART. 
      CPA "DS"      IF IT'S A DS ERROR, 
      RSS            CONVERT TO NUMBER. 
      JMP RTNER     OTHERWISE RETURN. 
      LDA RQB+#EC2  GET NUMERIC PART
      AND B17        OF ERROR CODE. 
      CMA,INA       NEGATE. 
      ADA N50       ADD -50.
      STA B           
RTNER STB RQB+#EC2  STORE NUMERIC IN BUFFER.
      JMP CHKER,I   RETURN. 
* 
************************************************
* MESSAGE CLASS 3 ..... OPERATOR COMMANDS.     *
************************************************
* 
MSCL3 CLA           SET (A) = BYTE COUNT. 
      JMP D1000,I   RETURN. 
* 
************************************************
* MESSAGE CLASS 4 .....      PREAD/PWRIT/PCONT.*
************************************************
* MESSAGE CLASS 7, STREAM 21 ..... POPEN/PCLOS.*
************************************************
* 
MSCL4 LDA RQB+#FCD  PCLOS REPLY?
      AND B17 
      CPA D5
      JMP SBC       YES.
* 
      LDB N44       IF SYSTEM ERROR OCCURRED, 
      JSB CHKER      CHANGE TO NUMERIC CODE.
* 
      LDA RQB+#EC2  MAP DS/1000 ERROR CODES TO DS/3000. 
      LDB BIT15     SET DEFAULT TO "CCE". 
      CPA N41 
      LDB CL209      MAP -41 TO CCL & 209.
      CPA N42 
      LDB CL205      MAP -42 TO CCL & 205.
      CPA N44 
      LDB CL213      MAP -44 TO CCL & 213.
      CPA N45 
      LDB CL216      MAP -45 TO CCL & 216.
      STB T+APNG    STORE IN DS/3000 REPLY. 
* 
      LDA SB21      INIT. STREAM TO 100021B.
      STA T+STR3
* 
      LDB T+MASK    IF POPEN REPLY, 
      LDA T+FNCD
      CPA D1
      STB T+AP25     MOVE MASK WORD TO DS/3000 REPLY. 
* 
      LDA B26       SET ACCEPT/REJECT STREAM TYPE.
      LDB RQB+#FCD
      SSB 
      LDA B27 
      IOR BIT15     SET REPLY BIT.
      STA T+STR3
      ELA,CLE,ERA 
      LDB D211      IF REJECT,
      CPA B27 
      STB T+APNG      STORE CCG & 211.
* 
      CLA           CLEAR UNUSED WORD.
      STA T+APN1
* 
      LDA D#PCB     MOVE PCB & TAG. 
      LDB ARQ10 
      JSB .MVW
      DEF D23 
      NOP 
* 
      ISZ INPLC     SET "DATA IN PLACE" FLAG. 
* 
SBC   LDA T+FNCD    SET REPLY BYTE COUNT. 
      AND B17 
      ADA N1
      ADA JTAB2 
      LDA A,I       RETURN (A) = BYTE CNT W/O DATA. 
      JMP D1000,I 
* 
JTAB2 DEF *+1 
      DEC 52        POPEN.
      DEC 50        PREAD.
      DEC 50        PWRIT.
      DEC 50        PCONT.
      DEC 0         PCLOS.
* 
************************************************
* MESSAGE CLASS 8, STREAM 20 ..... RFA.        *
************************************************
* 
MSC8A LDB N999      IF SYSTEM ERROR OCCURRED, 
      JSB CHKER      CHANGE TO NUMERIC. 
* 
      LDB RQB+#EC2  MOVE IERR TO "A-REG", IERR. 
      STB T+APNG
      STB T+APN2
* 
      CLA 
      SSB           IF ERROR, SKIP RFAMD #. 
      JMP MSCA1 
      LDB T+FNCD    IF DCRET OR DOPEN, MOVE 
      CPB D3        RFAMD ENTRY # TO "B-REG" SLOT.
      LDA RQB+#RFD
      CPB D6
      LDA RQB+#RFD
MSCA1 STA T+APN1
* 
      CPB D9        CHECK FOR ADDITIONAL PROCESSING.
      JMP DREAD 
      CPB D4
      JMP DLOCF 
      CPB D10 
      JMP DSTAT 
* 
      LDA D6        NONE OF THE ABOVE.
      JMP D1000,I   RETURN WITH (A) = BYTE COUNT. 
* 
DREAD LDA RQB+#LOG  MOVE LEN PARAM. 
      LDB RQB+#EC2
      SSB 
      CLA 
      STA T+APN3
      LDA D8
      JMP D1000,I   RETURN WITH (A) = BYTE COUNT. 
* 
DLOCF LDA D#REP     MOVE DLOCF PARAMS.
      LDB ARQ11 
      JSB .MVW
      DEF D7
      NOP 
      LDA D20 
      JMP D1000,I   RETURN WITH (A) = BYTE COUNT. 
* 
DSTAT CLA 
      STA T+APNG
      STA T+APN1
      LDA D4
      JMP D1000,I   RETURN WITH (A) = BYTE COUNT. 
* 
************************************************
* MESSAGE CLASS 8, STREAM 21 ..... DEXEC.      *
************************************************
* 
MSC8B DLD RQB+#EC1  MOVE A&B-REG RETURN VALUES. 
      DST T+APNG
* 
      CLA           MOVE ADDITIONAL VALUES. 
      LDB T+FNCD
      CPB D11 
      LDA D5
      CPB D13 
      LDA D3
      STA TEMP      # ADDITIONAL WORDS. 
* 
      SZA,RSS 
      JMP FRBC      NONE TO MOVE. 
* 
      LDA D#REP 
      LDB ARQ10 
      JSB .MVW
      DEF TEMP
      NOP 
* 
FRBC  LDA TEMP      FIND RESULTING BYTE COUNT.
      ADA D2
      ALS 
      JMP D1000,I   RETURN WITH (A) = BYTE COUNT. 
      SKP 
* 
* SUBROUTINE TO CHECK IF INDEX IS WITHIN SPECIFIED RANGE. 
*   (A) = INDEX (PRESERVED)    (B) = UPPER LIMIT. 
*   REQUEST IS REJECTED OF 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  CMA,INA 
      ADA D$MAX 
      SSA 
      JMP REJCT     EXCEEDS LIMIT. REJECT.
      JMP LIMCK,I 
      SKP 
* 
* CONSTANTS AND WORKING STORAGE.
* 
D0    DEC 0 
D1    DEC 1 
D2    DEC 2 
D3    DEC 3 
D4    DEC 4 
D5    DEC 5 
D6    DEC 6 
D7    DEC 7 
D8    DEC 8 
D9    DEC 9 
D10   DEC 10
D11   DEC 11
D13   DEC 13
D20   DEC 20
D21   DEC 21
D23   DEC 23
D211  DEC 211 
B17   OCT 17
B20   OCT 20
B26   OCT 26
B27   EQU D23 
B377  OCT 377 
B60K  OCT 60000 
UP8   BYT 10,0      DECIMAL 8, LEFT BYTE. 
BIT13 OCT 20000 
BIT14 OCT 40000 
BIT15 OCT 100000
NOT13 OCT 157777
SB21  OCT 100021
CLS20 DEF 20,I
CLS21 DEF 21,I
CL205 OCT 040315
CL209 OCT 040321
CL213 OCT 040325
CL216 OCT 040330
N1    DEC -1
N4    DEC -4
N41   DEC -41 
N42   DEC -42 
N44   DEC -44 
N45   DEC -45 
N50   DEC -50 
N999  DEC -999
"DS"  ASC 1,DS
CLASS NOP 
PARM1 NOP 
PARM2 NOP 
INPLC NOP 
SVMCL NOP 
SVSTR NOP 
SVFTO NOP 
TEMP  NOP 
TEMP1 NOP 
RQLOG NOP 
RQLEN NOP 
H&ALN NOP 
DALEN NOP 
TCNT  NOP 
* 
C#MXR ABS #MXR      MAX LENGTH OF DS/1000 REQUEST.
RQB   BSS #MXR+#LSZ DS/1000 REQUEST BUFFER. 
D#REP DEF RQB+#REP
D#PCB DEF RQB+#PCB
* 
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. 
* 
*  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         MONITOR CLASS NO
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
AP25  EQU 39        APPENDAGE WORD 25 (FWA DATA)
      SPC 3 
ARQ0  DEF T+CLS3    FIRST WORD OF DS/3000 HEADER
ARQ10 DEF T+APN2    SECOND WORD OF DS/3000 APPENDAGE
ARQ11 DEF T+APN3    THIRD WORD OF DS/3000 APPENDAGE 
* 
      BSS 0          ******** SIZE OF RPCNV ************
* 
      END RPCNV 
                                                                                                                                                                                                                        