ASMB,Q,R,C
      HED <#SLAV> SLAVE REPLY INTERFACE * (C) HEWLETT-PACKARD CO. 1980
      NAM #SLAV,7 91750-1X034 REV 2013 800331 ALL 
      SPC 1 
******************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980. ALL RIGHTS      *
*  * RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,       *
*  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT*
*  * THE PRIOR WRITTEN CONSENT OF THE HEWLETT-PACKARD COMPANY.   *
******************************************************************
      SPC 1 
      ENT #SLAV,#RPB,#SKEY
      EXT #OTCV,#LEVL,#BREJ,#RPCV,#GRPM,#MHCT 
* 
      EXT XLUEX,.ENTR 
      EXT #NRVS,#MAAS,#RSAX 
      SPC 2 
*     #SLAV 
*     ----------------
*     SOURCE PART # 91750-18229 
* 
*     REL PART #    91750-16229 
* 
*     WRITTEN BY    TOM MILNER
* 
*     DATE WRITTEN  JUNE 1979 
* 
*     MODIFICATIONS 
*     ------------- 
*     SET BIT8 (DS STATUS BIT) IN LAST WORD OF REQUEST BUF
*          TKM 05.23.79 
*     MOVED REPLY BUFFERS TO LOCAL  -- TKM 06.01.79 
*     ADDED ENTRY POINT 'C.BUF' WHEN 'Z' OPTION USED - TKM 06.25.79 
*     CHANGED #RSAX ERROR RETURN TO RETURN DS07  - TKM 07.09.79 
*     NOW SET BIT14 (REPLY BIT) IN STREAM WORD
*        AND ADDED MESSAGE ACCOUNTING (MA)  -TKM  07.23.79
*     PLUG IN HOP COUNT (#HCT) IN REPLY BUFFER  -TKM 09.13.79 
*     CHECK FOR LEVEL CONVERTERS PRESENT  - TKM 11.06.79
*     INCLUDED 'XLUEX' CALLS FOR LU > 63  -TKM 12.05.79 
*     ADDED #SKEY ENTRY POINT FOR #RQUE/#NQUE  -TKM 03.17.80
*     ------------- 
      SPC 2 
*     THIS ROUTINE SENDS SLAVE REQUESTS 
*     CALLING SEQUENCE: 
*                   JSB #SLAV 
*                   DEF *+4 
*                   DEF RQLEN       REQUEST LENGTH
*                   DEF DABUF       DATA BUFFER 
*                   DEF DATAL       DATA LENGTH 
*                   <ERROR RETURN>
*                   <NORMAL RETURN> 
* 
* 
*    #SLAV IS CALLED BY DS/1000 MONITORS TO SEND A REPLY AND
*    POSSIBLY DATA BACK TO THE ORIGINATING NODE.  IT PERFORMS THE 
*    FOLLOWING STEPS: 
*        1.  DEALLOCATES THE SLAVE TCB, IF THIS FAILS TAKES THE 
*            ERROR RETURN.
*        2.  VERIFIES THAT #MHD <= (REPLY LENGTH) <= #MXR AND IF NOT
*            RETURNS A DS03 ERROR.
*        3.  CONVERTS THE NODAL ADDRESS OF THE ORIGINATING CPU
*            TO AN OUTPUT LU. IF LU CONVERSION FAILS, A DS04 ERROR
*            IS RETURNED. 
*        4.  DOES A CLASS I/O WRITE/READ OF THE REPLY(/DATA) TO 
*            GRPM'S CLASS NUMBER (OR RPCNV'S CLASS IF A 3000 WAS
*            WAS THE REQUEST ORIGINATOR.
*        5.  RETURNS
      SKP 
* GLBLK-START 
* 
******************************************************************
*                                                                *
*     G L O B A L   B L O C K               REV 2013 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 
      SPC 3 
A     EQU 0 
B     EQU 1 
      SKP 
RQLEN NOP 
DABUF NOP 
DATAL NOP 
* 
#SLAV NOP 
      JSB .ENTR     GET CALLER'S PARAMETERS 
      DEF RQLEN 
      LDA CONWX 
      STA LU+1      INITIALIZED CONTROL WORD
* 
      JSB #RSAX     DELETE #SLAV TCB
      DEF *+4 
      DEF K7
      DEF RPB+#SEQ
      DEF RPB+#STR  STREAM WORD 
      SSB 
      JMP DS07      TCB SEARCH FAILED, ERROR RETURN 
      STA RPB+#SEQ    RESTORE OLD SEQ # IN REPLY
* 
*  CHECK NO-REPLY OPTION
* 
      LDA RPB+#ECQ  LOAD NO-REPLY BIT 
      SSA,RSS       IS IT SET?
      JMP *+3       .NO 
      ISZ #SLAV     .YES, ADJUST FOR
      JMP #SLAV,I    GOOD RETURN
* 
*     CLEAR OUT PARTS OF REPLY BUFFER 
* 
      CLA 
      STA RPB+#MAS
      STA RPB+#MAR
      STA RPB+#MAC
*--   FILL IN HOP COUNT 
      LDA #MHCT 
      STA RPB+#HCT
      CCB 
      ADB @RPB
      ADB C#LSZ     ALLOW FOR LOCAL APPENDAGE 
      ADB RQLEN,I   <B> --> 2ND WORD OF LOCAL APPENDAGE 
      LDA BIT8      SET DS STATUS BIT & CLEAR 2ND WORD OF 
      STA B,I          LOCAL APPENDAGE. 
* 
*  VERIFY REPLY LENGTH
* 
      LDB "03"
      LDA MINLN     CHECK REPLY LENGTH
      CMA,INA 
      ADA RQLEN,I 
      SSA 
      JMP GETDS     GIVE DS03 IF < MINIMUM
      LDA MAXLN 
      CMA 
      ADA RQLEN,I 
      SSA,RSS 
      JMP GETDS     GIVE DS03 IF > MAXIMUM
* 
*     MODIFY STREAM WORD
* 
      LDA RPB+#STR  GET THE STREAM WORD OF THE REPLY. 
      AND RTYCT     CLEAR THE OLD RETRY COUNTER.
      IOR #BREJ     INITIALIZE NEW RETRY COUNT. 
      IOR BIT14     SET REPLY BIT 
      IOR BIT12     SET ">LEVEL 0" INDICATOR
      STA RPB+#STR  RESTORE MODIFIED STREAM WORD. 
* 
*  CHECK FOR REPLY TO DS/3000 REPLY CONVERTER.
* 
      LDB #RPCV     PRESET <B>= "RPCNV'S" CLASS NO. 
      CLE,ELA       POSITION DS/3000 BIT#15 TO <E>. 
      CLA,SEZ,CLE   IF THIS IS A DS/3000 REPLY, SET LU=0, 
      JMP RPL3K      THEN BYPASS DS/1000 PROCESSING.
* 
*     CLEAR MA RETRY TICKS IN APPENDAGE 
* 
      LDB @RPB
      ADB RQLEN,I 
      INB           <B> --> RETRY TICKS 
      LDA B,I 
      AND MAMSK 
      STA B,I 
* 
*     CONVERT DESTINATION NODE TO AN LU # 
* 
      JSB #NRVS     SEARCH NRV FOR LU NUMBER
      DEF *+4 
      DEF RPB+#SRC    (NODE NUMBER) 
      DEF LU          (NOT USED)
      DEF UPLVL       (UPGRADE LEVEL OF DEST. NODE) 
      JMP GETDS     ERROR RETURN (IF NODE NOT IN NRV) 
      STA LU        LU NUMBER OF NODE 
* 
*     ASSIGN MESSAGE ACCOUNTING (MA) SEQUENCE NUMBER
* 
      JSB #MAAS     MA ASSIGNMENT 
      DEF *+3 
      DEF RPB       (REPLY BUFFER)
      DEF RQLEN,I   (REPLY BUFFER LENGTH) 
      JMP GETDS     BUSY ERROR CODE DS08 IN <B> 
* 
*  ASSIGN LEVEL# AND SEND THE REQUEST(/DATA)
* 
      LDA RPB+#LVL   LEVEL WORD 
      AND BM17      MASK (OFF) #LVL BITS
      IOR #LEVL        AND PLUG IN CURRENT UPGRADE
      STA RPB+#LVL        LEVEL.
* 
*     CHECK DESTINATION UPGRADE LEVEL - IF LESS THAN ME SEND
*     MESSAGE TO REQUEST/REPLY CONVERTERS FOR TRANSMISSION. 
* 
      LDA #LEVL     IS UPGRADE LEVEL OF LOCAL NODE
      CMA,INA         HIGHER THAN 
      ADA UPLVL        THAT OF ORIGINATION
      SSA,RSS            NODE?
      JMP SETUP     . NO WRITE OUT AS IS
* 
      LDB #OTCV     OUTPUT CONVERTERS CLASS 
      SZB,RSS       CONVERTERS THERE? 
      JMP DS071     . NO DS07 QUALIFIER 1 
      CLA           OUTPUT TO BIT BUCKET
      JMP RPL3K 
* 
SETUP LDB #GRPM     GET "GRPM'S" CLASS NUMBER.
      LDA LU        GET LU
RPL3K IOR BIT15     BYPAS SESSION SST 
      STA LU        SAVE CONFIGURED CONWD.
      STB CLASS     SAVE CLASS NUMBER (#GRPM,#RPCV,#OTCV).
* 
      LDA RQLEN,I 
      ADA C#LSZ 
      STA RQLEN     BUMP REQUEST SIZE FOR LOCAL APPENDAGE 
* 
      JSB XLUEX     DO CLASS WRITE/READ 
      DEF *+8 
      DEF CLS20     NO ABORT
      DEF LU        LU
      DEF DABUF,I   DATA BUFFER ADDRESS 
      DEF DATAL,I   DATA LENGTH 
@RPB  DEF RPB       REPLY BUFFER ADDRESS
      DEF RQLEN     REPLY LENGTH
      DEF CLASS 
* 
      JMP #SLAV,I   ERROR RTN TO P+1
      ISZ #SLAV 
      JMP #SLAV,I   GOOD  RTN TO P+2
* 
DS071 LDA BIT4      DS07/1 - NO CONVERTERS
      STA RPB+#ECQ
DS07  LDB "07"      RETURN DS07 ERROR 
GETDS LDA "DS"
      JMP #SLAV,I   RETURN WITH ERROR CODE
      SKP 
*-----------------------------------------------------
*                   CONSTANTS 
*-----------------------------------------------------
* 
MAXLN ABS #MXR      MAXIMUM REQUEST/REPLY HEADER
MINLN ABS #MHD      MINIMUM      "         "
C#LSZ ABS #LSZ
BIT4  OCT 000020
BIT8  OCT 000400
BIT12 OCT 010000
BIT14 OCT 040000
BIT15 OCT 100000
BM17  OCT 177760
MAMSK OCT 007777
CONWX OCT 010100
RTYCT OCT 170077
CLS20 DEF 20,I      CLASS WRITE/READ--NO ABORT
K7    DEC 7 
"03"  ASC 1,03
"07"  ASC 1,07
"DS"  ASC 1,DS
*-----------------------------------------------------
*                   STORAGE 
*-----------------------------------------------------
#SKEY BSS 1         NOTE! THIS WORD MUST COME BEFORE RPB! 
RPB   EQU * 
#RPB  BSS #MXR+#LSZ  REPLY BUFFER 
LU    BSS 2 
UPLVL BSS 1 
CLASS BSS 1 
* 
SIZE  EQU * 
      END 
                                                                                                                                                                                                                                      