ASMB,R,Q,C
      HED <#UP> REROUTING ROUTINE * (C) HEWLETT-PACKARD CO. 1979* 
      NAM #UP,7 91750-1X036 REV 2013 800422 ALL W/ RR 
      SPC 1 
      ENT #UP 
      SPC 1 
      EXT #NCNT,#NRV,#GRPM,#NODE
      EXT #LCNT,#CM,#QCLM 
      EXT #LVSC 
      EXT $OPSY,$LIBR,$LIBX,$TIME 
      EXT XLUEX,EXEC,.ENTR,.LDX,.MVW
* 
*    NAME:   #UP
*    SOURCE: 91750-18036
*    RELOC:  91750-1X036
*    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.       *
******************************************************************
* 
* 
*  #UP CALLING SEQUENCE:
* 
*     < A REG. = LU THAT IS COMING UP > 
*      JSB #UP
*     <RETURN 1--GO TO RELEASE THE MESSAGE> 
*     <RETURN 2--NO SAM, TRY AGAIN LATER> 
* 
*  NOTE: #UP DOES NOT ENABLE A LINK TO START TRANSMITTING 
*        USER MESSAGE, IT MERELY SENDS A DUMMY MESSAGE SO 
*        THAT #UPDA WILL ENABLE THE OPERATION.  THIS IS DUE 
*        TO THE LINK RESTRICATION THAT A LINK UP INDICATION 
*        ONLY GUARANTEES TRANSMISSION BUT NOT RECEPTION.
*        THUS, THE DUMMY MESSAGE SERVES AS A SIMPLE INITIAL 
*        EXCHANGE HANDSHAKE.
* 
      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 
#UP   NOP 
      STA LU        SAVE UP LU
NOP   JSB CONFG 
      LDA #LCNT     RR ENABLE?
      SZA,RSS 
      JMP #UP,I     .NO 
* 
*  CHECK IF LINK IS REALLY UP 
* 
      LDA LU
      IOR =B100000
      STA CONWD 
      LDA =B3600
      STA CONWD+1 
      JSB XLUEX     LINK STATUS CALL
       DEF *+3
       DEF NA3
       DEF CONWD
       JSB ERROR
      LDB 0 
      ALF,ALF 
      AND =B77
      CPA =B65      OLD LINK? 
      JMP PREP      SKIP CHECK
      RBR 
      SLB           ANY ERROR?
      JMP #UP,I     .YES, IGNORE THIS UP INDICATION 
* 
* 
*  PREPARE THIS NODE'S COSTS TO BE SENT TO THE NEW NEIGHBOR 
* 
PREP  EQU * 
      LDA LU
      LDB LU
      IOR =B100000
      STA CONWD     SAVE THIS AS THE CONTROL WORD 
      LDA =B10100 
      STA CONWD+1 
      CMB,INB 
      STB DESTN     SET NEGATIVE LU AS DESTINATION NODE 
      CLA           SET UP
      STA I          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 
      LDB @NRV
      ADB N.LU      <B> ==> NRV.LU
      JSB LDWD      <A> WILL RETURN NRV.LU WORD 
      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 
      LDB @NRV      UP
      ADB NRVSZ      NRV
      STB @NRV       ADDRESS
      LDA DALEN 
      ADA =D3 
      STA DALEN     UP DATA LEN 
      CPA MXLEN     = MAZ BUF LEN?
      JMP SEND      .YES, SEND IT 
      LDA N 
      CPA I         ALL NODES?
      RSS           .YES, SEND IT 
      JMP LOOP1 
* 
*  SEND COSTS TO THE NEW NEIGHBOR 
* 
SEND  EQU * 
      LDA #GRPM     LOAD CLASS #
      IOR =B100000  OR IN NO WAIT FOR SAM BIT 
      STA CLASS 
      JSB XLUEX     SEND IT OUT 
       DEF *+8
       DEF NA20 
       DEF CONWD
       DEF DABUF
       DEF DALEN
       DEF RQBUF
       DEF RQLEN
       DEF CLASS
       JSB ERROR    ERROR RETURN
      SZA,RSS       NO SAM FOR MESSAGE? 
      JMP *+3       .NO, SKIP AROUND
      ISZ #UP       .YES, ADJUST RETURN 
      JMP #UP,I      TO RETRY LATER 
      LDA N 
      CPA I         END LOOP? 
      JMP #UP,I     .YES, RETURN
      JMP LOOP      BACK TO LOOP
      SKP 
* 
*  ERROR HANDLING 
* 
ERROR NOP 
      DST AREG
      CLA 
      STA #LCNT     DISABLE RR
      LDA #QCLM 
      SZA,RSS 
      JMP #UP,I 
      LDA @#UP
      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 #UP,I 
* 
*  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 SDMOD 
      STB LSMOD 
* 
INIT  EQU * 
      LDA #NCNT 
      CMA,INA 
      STA N 
* 
      LDA =B10000 
      STA STREM 
      LDA #NODE 
      STA SRC#
      CLA 
      STA SEQ#      UP MSG STARTS WITH  SEQ# = 0
      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
* 
*** 
*** 
* 
*  STWD STORES ONE WORD FROM LOCAL TO SAM 
* 
*  CALLING SEQUENCE:
* 
*     <A> = WORD TO BE STORED 
*     <B> ==> SAM WORD
* 
STWD  NOP 
      JSB $LIBR 
       NOP
SDMOD JMP SDSTA 
      XSA 1,I 
      JMP SDJSB 
SDSTA STA 1,I 
SDJSB JSB $LIBX 
       DEF STWD 
* 
*** 
*** 
* 
*  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 BSS 2         WRITE CONTROL WORD
NA3   OCT 100003
NA20  OCT 100024
K0    DEC 0 
K6    DEC 6 
K8    DEC 8 
I     NOP           LOOP INDEX
N     NOP           # OF NODES IN THE NET 
MNLIX NOP           MIN LINK INDEX
CLASS NOP 
@#UP  DEF #UP 
PNAME ASC 3,#UP 
* 
@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 
                                                                                                                                                                                                                                      