ASMB,R,Q,C
      HED <#SEND> REROUTING ROUTINE * (C) HEWLETT-PACKARD CO. 1979* 
      NAM #SEND,17,3 91750-16208 REV 2013 800107 ALL W/ RR
      SPC 1 
      EXT #NCNT,#NRV,#GRPM,#NODE
      EXT #LCNT,#CM,#QCLM,#CMCT,#LV 
      EXT #LVSC 
      EXT $OPSY,$LIBR,$LIBX,$TIME 
      EXT XLUEX,EXEC,.ENTR,.LDX,.MVW,DTACH
* 
*    NAME:   #SEND
*    SOURCE: 91750-18208
*    RELOC:  91750-16208
*    PGMR:   DOUG W. TSUI   JULY 1979 
**
* 
******************************************************************
*  * (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 HEWLETT-PACKARD COMPANY.       *
******************************************************************
* 
* 
*  #SEND SENDS UPDATE MESSAGES TO ALL NEIGHBORS.
*   IT SCANS THE NRV FOR THE ENTRY WITH THE CHANGE BIT SET. 
* 
      SKP 
* 
******************************************************************
*                                                                *
*     G L O B A L   B L O C K               REV 2001 790531      *
*                                                                *
*     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                                    *
******************************************************************
* 
***!!!!! 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 >>>
* 
******************************************************************
* 
      SKP 
#SEND EQU * 
      LDA 1,I       GET PASSED SEQ #
      STA SEQ#
      JSB DTACH     DETACH FROM ANY SESSION 
       DEF *+1       IF NECESSARY 
NOP   JSB CONFG 
TEST  EQU * 
      LDA #CMCT     GET SEND SIGNAL 
      SZA,RSS       NEED TO SEND? 
      JMP DONE      .NO 
      CLA           .YES, CLEAR SEND SIGNAL FIRST 
      STA #CMCT 
      STA I         SET UP LOOP INDEX 
      LDB #NRV
      STB @NRV      SET UP NRV ADDRESS
* 
LOOP  EQU * 
      LDA @DABF 
      STA @DA       SET UP DATA BUFFER ADDR 
      CLA 
      STA DALEN     SET UP DATA LEN 
* 
LOOP1 EQU * 
      ISZ I         UP LOOP INDEX 
      ADB N.LU      <B> ==> NRV.LU
      JSB LDWD      <A> WILL RETURN NRV.LU WORD 
      SSA,RSS       CHANGE BIT SET? 
      JMP CK1       .NO, NO ACTION
      STA LU        SAVE IT AS LU 
      JSB CLBIT     JMP TO CLEAR CHANGE BIT 
      LDA LU        GET LU BACK 
      AND =B377     MASK OFF ALL EXCEPT LU
      SZA           NRV.LU = 0? 
      JSB #LVSC     .NO, FIND INDEX OF LU 
       CLA,INA      CANNOT FIND LU, USE 1ST LINK
      STA MNLIX     STORE IT AS MIN LINK INDEX
      LDB @NRV      <B> ==> NRV.NODE
      JSB LDWD      <A> WILL RETURN NRV.NODE WORD 
      STA @DA,I     STORE IT IN DATA BUFFER 
      ISZ @DA       UP @DA TO POINT TO COST AND HOP COUNT 
      JSB LDCM      CALL TO LOAD COST AND H.C. FROM CM
       DEF *+4
       DEF I
       DEF MNLIX
@DA    NOP
       JSB ERROR
      ISZ @DA       UP DATA 
      ISZ @DA        BUFFER ADDRESS 
      LDA DALEN 
      ADA =D3 
      STA DALEN     UP DATA LEN 
      CPA MXLEN     = MAX BUF LEN?
      JMP SEND      .YES, SEND IT 
CK1   EQU * 
      LDA N 
      CPA I         ALL NODES?
      JMP SEND      .YES, SEND IT 
      LDB @NRV      UP
      ADB NRVSZ      NRV
      STB @NRV
      JMP LOOP1 
* 
*  SEND NEWS TO ALL NEIGHBORS 
* 
SEND  EQU * 
      LDA DALEN 
      SZA,RSS       ANYTHING TO SEND? 
      JMP TEST      .NO 
      CLA,INA 
      STA J         SET UP LOOP INDEX 
      LDB #LV 
      STB @LV       SET UP LV ADDRESS 
* 
LOOP2 EQU * 
      JSB LDWD      <A> WILL RETURN LU WORD 
      SSA,RSS       LINK DOWN?
      JMP CK2       .YES, CHECK END LOOP
      AND =B377     .NO, MASK OFF FLAGS 
      LDB 0         SAVE IT IN B REG. 
      IOR =B100000
      STA CONWD     STORE IT AS CONTROL WORD
      CMB,INB 
      STB DESTN     SET NEGATIVE LU AS DESTINATION NODE 
      ISZ SEQ#      UP SEQUENCE NUMBER FOR RR MSG 
      NOP           IN CASE SEQ# OVERFLOW 
      JSB XLUEX 
       DEF *+8
       DEF NA20 
       DEF CONWD
       DEF DABUF
       DEF DALEN
       DEF RQBUF
       DEF RQLEN
       DEF #GRPM
       JSB ERROR
* 
CK2   EQU * 
      LDA J 
      CPA #LCNT     END OF LV TABLE?
      JMP CK
      ISZ J         .NO, UP J 
      LDB @LV 
      ADB LVSZ      UP LV ADDRESS 
      STB @LV 
      JMP LOOP2 
* 
CK    EQU * 
      LDA N 
      CPA I         END LOOP? 
      JMP TEST
      LDB @NRV
      ADB NRVSZ 
      STB @NRV
      JMP LOOP      BACK TO LOOP
* 
*  EXIT FROM PROGRAM
* 
DONE  EQU * 
      JSB EXEC
       DEF *+2
       DEF K6 
      SKP 
* 
*  ERROR HANDLING 
* 
ERROR NOP 
      DST AREG
      CLA 
      STA #LCNT     DISABLE RR
      LDA #QCLM 
      SZA,RSS 
      JMP DONE
      LDA @SEND 
      CMA,INA 
      ADA ERROR 
      ADA =D-1
      STA PREG
      LDA PNAME 
      STA PGM 
      DLD PNAME+1 
      DST PGM+1 
      DLD $TIME 
      DST TOD 
      JSB EXEC
       DEF *+8
       DEF NA20 
       DEF K0 
       DEF MSGBF
       DEF MSGLN
       DEF K8 
       DEF K0 
       DEF #QCLM
       NOP
      JMP DONE
* 
*  CONFIGURE THE SYSTEM ENVIRONMENT 
* 
CONFG NOP 
      CLB 
      STB NOP       CLEAR CALL TO THIS ROUTINE
      LDA $OPSY     GET O/S TYPE
      RAR 
      SLA,RSS       DMS?
      JMP INIT      .NO 
      STB LDMOD     .YES, MOD INSTS 
      STB CLMOD 
      STB LSMOD 
* 
INIT  EQU * 
      LDA #NCNT 
      CMA,INA 
      STA N 
* 
      LDA #NODE 
      STA SRC#
      LDA =B10000   SET LEVEL BIT 
      STA STREM 
      CLA 
      STA RQBUF+#REQ
      JMP CONFG,I 
*** 
* 
*  LDWD LOADS ONE WORD FROM SAME TO LOCAL 
* 
*  CALLING SEQUENCE:
* 
*     <A> = RETURN WORD 
*     <B> ==> SAM BUFFER
* 
LDWD  NOP 
LDMOD JMP LDLDA 
      XLA 1,I 
      JMP LDWD,I
LDLDA LDA 1,I 
      JMP LDWD,I
* 
*** 
*** 
* 
*  CLBIT CLEARS BIT 15 IN SAM 
* 
*  CALLING SEQUENCE:
* 
*     <B> ==> SAM WORD
* 
CLBIT NOP 
      JSB $LIBR 
       NOP
CLMOD JMP CLLDA 
      XLA 1,I 
      AND =B77777 
      XSA 1,I 
      JMP CLRTN 
CLLDA LDA 1,I 
      AND =B77777 
      STA 1,I 
CLRTN JSB $LIBX 
       DEF CLBIT
* 
*** 
*** 
* 
*  LDCM MOVES WORDS FROM COST MATRIX TO LOCAL BUFFER
* 
*  CALLING SEQUENCE:
* 
*    JSB LDCM 
*     DEF *+4 
*     DEF NIX       NODE INDEX
*     DEF LIX       LINK INDEX
*     DEF BUF       RETURN BUFFER AREA
*    <ERROR RETURN> 
*    <NORMAL RETURN>
* 
@NIX  NOP 
@LIX  NOP 
@BUF  NOP 
* 
LDCM  NOP 
      JSB .ENTR     GET PARAMETER ADDRESS 
       DEF @NIX 
* 
*  CM ADDR CALCULATION = (#LCNT(NIX-1)+LIX-1)2+#CM
* 
      LDA @NIX,I
      ADA =D-1
      MPY #LCNT 
      SZB 
      JMP LDCM,I    ERROR RETURN
      ADA @LIX,I
      ADA =D-1
      ALS           LEFT SHIFT(X2) FOR 2 WORD CM ELEMENTS 
      ADA #CM 
* 
      LDB @BUF      <B> ==> SAM BUFFER
      JSB LDWS      LOAD 2 WORDS FROM SAM 
* 
      ISZ LDCM      ADJUST RETURN ADDR
      JMP LDCM,I
* 
*** 
*** 
* 
*  LDWS MOVES WORDS FROM SAM TO LOCAL 
* 
*  CALLING SEQUENCE:
* 
*     <A> ==> SAM WORDS 
*     <B> ==> LOCAL BUFFER
* 
LDWS  NOP 
LSMOD JMP LSMVW 
      JSB .LDX
       DEF LSLEN
      MWF 
      JMP LDWS,I
LSMVW JSB .MVW
       DEF LSLEN
      NOP 
      JMP LDWS,I
LSLEN DEC 2         TWO WORD MOVE 
* 
*** 
      SKP 
* 
*  DATA AREA
* 
CONWD NOP           WRITE CONTROL WORD
      OCT 10100 
NA20  OCT 100024
K0    DEC 0 
K6    DEC 6 
K8    DEC 8 
I     NOP           NRV LOOP INDEX
J     NOP           LV LOOP INDEX 
N     NOP           # OF NODES IN THE NET 
MNLIX NOP           MIN LINK INDEX
@SEND DEF #SEND 
PNAME ASC 3,#SEND 
* 
@LV   NOP           LV POINTER
LVSZ  DEC 6         LV SIZE 
* 
@NRV  NOP           NRV POINTER 
NRVSZ DEC 3         SIZE OF NRV ENTRIES 
N.LU  DEC 2         LU OFFSET 
* 
RQBUF BSS #MHD+#LSZ+1 
STREM EQU RQBUF 
SEQ#  EQU RQBUF+1 
SRC#  EQU RQBUF+2 
DESTN EQU RQBUF+3 
RQLEN ABS *-RQBUF 
* 
DABUF BSS 384       MAX BUFFER SIZE = 128*3 
MXLEN ABS *-DABUF 
DALEN NOP 
@DABF DEF DABUF     ADDRESS OF DATA BUFFER
* 
MSGBF BSS 12
LU    EQU MSGBF     UP LU 
PREG  EQU MSGBF+4 
AREG  EQU MSGBF+5 
TOD   EQU MSGBF+7 
PGM   EQU MSGBF+9 
MSGLN ABS *-MSGBF 
      END #SEND 
                          