ASMB,R,Q,C
      HED <#UPDA> REROUTING ROUTINE * (C) HEWLETT-PACKARD CO. 1979* 
      NAM #UPDA,7 91750-1X037 REV 2013 800423 ALL W/ RR 
      SPC 1 
      ENT #UPDA 
      SPC 1 
      EXT #MHCT,#NODE,#GRPM,#QCLM 
      EXT #LCNT,#CM,#NRV,#RQUE,#CMCT
      EXT #LVSC,#NRVS,#FDMN,#GETR 
      EXT $OPSY,$LIBR,$LIBX,$TIME 
      EXT EXEC,.ENTR,.LDX,.MVW
* 
*    NAME:   #UPDA
*    SOURCE: 91750-18037
*    RELOC:  91750-1X037
*    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.       *
******************************************************************
* 
* 
*  #UPDA CALLING SEQUENCE:
* 
*     < A REG. = LU OF THE UPDATE MESSAGE > 
*      JSB #UPDA
*     <RETURN 1--GO TO RELEASE THE MESSAGE> 
*     <RETURN 2--MESSAGE HAS BEEN REQUEUED BACK TO SENDER>
* 
* 
      SKP 
#UPDA NOP 
      STA LU
      LDA #LCNT 
      SZA,RSS 
      JMP #UPDA,I 
NOP   JSB CONFG 
      LDA LU
      JSB #LVSC 
       JMP #UPDA,I
      STA LIX 
      STB @LV 
      ADB LV.C      <B> ==> LV[LIX].COST
      JSB LDWD      GET THAT COST 
      STA LKCST     SAVE IT AS THE LINK COST
* 
      JSB #GETR     GET THE UPDATE MESSAGE
       DEF *+6
       DEF #GRPM
       DEF RQBUF
       DEF RQLEN
       DEF DABUF
       DEF DALEN
       JSB ERROR
      LDA EC1 
      SZA           ERROR RETURN? 
      JMP #UPDA,I   .YES, JUST RELEASE MSG
      STB I         STORE LENGTH FOR LOOP CONTROL 
      STB OVLEN     SAVE IT AS OVERLAY LEN ALSO 
* 
*  CHECK FOR INITIAL EXCHANGE MESSAGES (SEQ# = 0 OR 1)
* 
      LDA SEQ#      GET SEQ # 
      SZA           ZERO? 
      CPA K1        ONE?
      RSS           .YES, SKIP NEXT JUMP
      JMP UPDA      .NO, JUST DO UPDATE 
* 
*  IF INIT EXCH MSG, CHECK LINK 
* 
      LDB @LV       GET ADDR OF LV
      JSB LDWD      <B> ==> SAM BUFFER
      SSA           IS LINK UP ALREADY? 
      JMP NEIBR     .YES, SKIP TO UP NEIGHBOR INFO
      IOR =B100000  .NO, SET LINK UP
      JSB STWD      STORE IT BACK 
* 
*  SEND UP LINK MESSAGE TO USER 
* 
      LDA #QCLM 
      SZA,RSS 
      JMP NEIBR 
      DLD $TIME 
      DST TOD 
      JSB EXEC
       DEF *+8
       DEF NA20 
       DEF K0 
       DEF MSGBF
       DEF MSGLN
       DEF K6 
       DEF K0 
       DEF #QCLM
       NOP
* 
*  SET UP NEIGHBOR INFO IF NECESSARY
* 
NEIBR EQU * 
      LDB @LV       GET LINK VECTOR ADDR
      ADB LV.N      ADD NEIGHBOR OFFSET 
      JSB LDWD      GET NEIGNBOR NODE # 
      SSA,RSS       NEIGHBOR NODE SET ALREADY?
      JMP UPDA      .YES, SKIP TO DO UPDATE 
      LDA SRC#      .NO, GET SOURCE NODE #
      JSB STWD      STORE IT AS NEIGHBOR
* 
      JSB #NRVS     FIND THAT NODE IN NRV 
       DEF *+5
       DEF SRC# 
       DEF DUMMY    T/O 
       DEF DUMMY    LEVEL # 
       DEF NAYBR    NEIGHBOR BIT
       JMP UPDA     ERROR RETURN
      LDA NAYBR     GET NEIGHBOR BIT
      SZA           IS IT SET?
      JMP UPDA      .YES, SKIP TO UPDATE
      LDA 1         GET NODE IX 
      ADA =D-1
      MPY NRVSZ 
      ADA #NRV
      ADA NV.LU     SET UP ADDR IN NRV
      LDB 0 
      JSB LDWD      LOAD THAT WORD
      IOR =B400     SET NEIGHBOR BIT
      JSB STWD      STORE IT BACK 
* 
*  UPDATE THIS NODE'S INFO
* 
UPDA  EQU * 
      LDA @DABF 
      STA @DA 
* 
LOOP  EQU * 
      LDA @DA,I     LOAD NODE # 
      CPA #NODE     = TO LOCAL NODE?
      JMP CHK       .YES, SKIP UPDATE 
      JSB #NRVS     FIND NODE INDEX 
       DEF *+2
@DA    NOP
       JMP CHK1 
      STB NIX       STORE IT
      SZA           NRV.LU = 0? 
      JSB #LVSC     .NO, FIND LIX TO MIN COST 
       CLA,INA      USE 1ST LINK
      STA MNLIX 
* 
      JSB LDCM      FIND MIN COST 
       DEF *+4
       DEF NIX
       DEF MNLIX
       DEF MNCST
       JSB ERROR
      JSB LDCM      FIND COST TO NODE 
       DEF *+4
       DEF NIX
       DEF LIX
       DEF CM 
       JSB ERROR
      LDA CM
      SZA,RSS       ZERO COST?
      JMP CHK2      .YES, NO UPDATE 
* 
      LDA @DA       GET DATA ADDRESS
      INA           UP ADDR TO GET
      DLD 0,I        COST & H.C.
      STB CM+1      SAVE HOP COUNT
      ADB #MHCT     - MAX HOP COUNT 
      SSB,RSS       > MAX?
      JMP SETMX     .YES,SET MAX COST 
      CPA =B77777   INFINITE COST?
      JMP SETMX     .YES, SET MAX COST
      ISZ CM+1      UP HOP COUNT
      ADA LKCST     ADD THE LINK COST 
      SSA           IF NOT TOO BIG, SAVE IT AS COST 
SETMX EQU * 
      LDA =B77777   SET COST TO MAX 
      STA CM        SAVE IT 
* 
      JSB STCM      STORE NEW COST AND H.C. 
       DEF *+4
       DEF NIX
       DEF LIX
       DEF CM 
       JSB ERROR
      LDA NIX 
      LDB MNCST 
      JSB #FDMN     FIND NEW MIN
       JSB ERROR
      DST MNCST     STORE NEW MIN COST
      JMP CHK2
* 
CHK   EQU * 
      LDA K0
      STA MNCST 
      STA MNCST+1 
      JMP CHK2
CHK1  EQU * 
      LDA =B77777 
      STA MNCST 
CHK2  EQU * 
      ISZ @DA       POINT TO COST 
      DLD MNCST     LOAD MIN COST FROM THIS NODE
      DST @DA,I 
      ISZ @DA       POINT TO H.C. 
      ISZ @DA       POINT TO NEXT ENTRY 
      LDA I 
      ADA =D-3
      STA I 
      SZA           END LOOP? 
      JMP LOOP      .NO 
      CLA,INA       .YES, SET SEND FLAG 
      STA #CMCT 
      JSB EXEC      SCHEDULE SEND PROCESS 
       DEF *+4
       DEF NA10 
       DEF #SEND
      DEF SEQ#      PASS SEQUENCE # 
       JSB ERROR
      LDA SEQ#      NEED TO EXCHANGE INITIAL MESSAGE? 
      SZA           = 0?
      CPA K1        = 1?
      RSS 
      JMP #UPDA,I   .NO 
      ISZ SEQ#      .YES, FIRST UP SEQ #
      LDA #NODE 
      STA SRC#
      LDA LU
      CMA,INA 
      STA DESTN 
      LDA LU
      IOR =B100000
      STA CONWD 
      JSB #RQUE     SEND IT BACK OUT
       DEF *+9
       DEF NA20 
       DEF CONWD
       DEF DABUF
       DEF OVLEN
       DEF RQBUF
       DEF RQLEN
       DEF #GRPM
       DEF #GRPM
       JSB ERROR
      ISZ #UPDA 
      JMP #UPDA,I 
      SKP 
* 
*  ERROR HANDLING 
* 
ERROR NOP 
      DST AREG
      CLA 
      STA #LCNT     DISABLE RR
      LDA #QCLM 
      SZA,RSS 
      JMP #UPDA,I 
      LDA @#UPD 
      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 #UPDA,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 CONFG,I   .NO, JUST RETURN
      STB LDMOD     .YES, MOD INSTS 
      STB SDMOD 
      STB LSMOD 
      STB SSMOD 
      JMP CONFG,I 
*** 
* 
*  LDWD LOADS ONE WORD FROM SAM 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>
* 
@LNIX NOP 
@LLIX NOP 
@LBUF NOP 
* 
LDCM  NOP 
      JSB .ENTR     GET PARAMETER ADDRESS 
       DEF @LNIX
* 
*  CM ADDR CALCULATION = (#LCNT(NIX-1)+LIX-1)2+#CM
* 
      LDA @LNIX,I 
      ADA =D-1
      MPY #LCNT 
      SZB 
      JMP LDCM,I    ERROR RETURN
      ADA @LLIX,I 
      ADA =D-1
      ALS           LEFT SHIFT(X2) FOR 2 WORD CM ELEMENTS 
      ADA #CM 
* 
      LDB @LBUF     <B> ==> SAM BUFFER
      JSB LDWS      LOAD 2 WORDS FROM SAM 
* 
      ISZ LDCM      ADJUST RETURN ADDR
      JMP LDCM,I
* 
*** 
*** 
* 
*  STCM MOVES WORDS FROM LOCAL BUFFER TO COST MATRIX
* 
*  CALLING SEQUENCE:
* 
*    JSB STCM 
*     DEF *+4 
*     DEF NIX       NODE INDEX
*     DEF LIX       LINK INDEX
*     DEF BUF       BUFFER AREA TO BE STORED
*    <ERROR RETURN> 
*    <NORMAL RETURN>
* 
@SNIX NOP 
@SLIX NOP 
@SBUF NOP 
* 
STCM  NOP 
      JSB .ENTR     GET PARAMETER ADDRESS 
       DEF @SNIX
* 
*  CM ADDR CALCULATION = (#LCNT(NIX-1)+LIX-1)2+#CM
* 
      LDA @SNIX,I 
      ADA =D-1
      MPY #LCNT 
      SZB 
      JMP STCM,I    ERROR RETURN
      ADA @SLIX,I 
      ADA =D-1
      ALS           LEFT SHIFT(X2) FOR 2 WORD CM ELEMENTS 
      ADA #CM 
* 
      LDB 0         <B> ==> CM BUFFER IN SAM
      LDA @SBUF     <A> ==> LOCAL BUFFER
      JSB STWS      STORE 2 WORDS TO SAM
* 
      ISZ STCM      ADJUST RETURN ADDR
      JMP STCM,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 
* 
*** 
*** 
* 
*  STWS MOVES WORDS FROM LOCAL BUFFER TO SAM BUFFER 
* 
*  CALLING SEQUENCE:
* 
*     <A> ==> LOCAL BUFFER
*     <B> ==> SAM BUFFER
* 
STWS  NOP 
      JSB $LIBR 
       NOP
SSMOD JMP SSMVW 
      JSB .LDX
       DEF SSLEN
      MWI 
      JMP SSJSB 
SSMVW JSB .MVW
       DEF SSLEN
      NOP 
SSJSB JSB $LIBX 
       DEF STWS 
* 
SSLEN DEC 2         2 WORD MOVE 
* 
*** 
      SKP 
* 
*  DATA AREA
* 
K0    DEC 0 
K1    DEC 1 
K6    DEC 6 
K8    DEC 8 
NA10  OCT 100012
NA20  OCT 100024
I     NOP 
LIX   NOP 
NIX   NOP 
MNLIX NOP 
LKCST NOP 
DUMMY NOP 
NAYBR NOP 
OVLEN NOP 
CONWD NOP 
      OCT 10100     Z & WRITE BIT 
@#UPD DEF #UPDA 
#SEND ASC 3,#SEND 
PNAME ASC 3,#UPDA 
* 
CM    BSS 2 
MNCST BSS 2 
* 
@LV   NOP 
LV.C  DEC 1 
LV.N  DEC 5 
* 
NRVSZ DEC 3 
NV.LU DEC 2 
* 
MSGBF BSS 12
LU    EQU MSGBF 
PREG  EQU MSGBF+4 
AREG  EQU MSGBF+5 
TOD   EQU MSGBF+7 
PGM   EQU MSGBF+9 
MSGLN ABS *-MSGBF 
* 
RQBUF BSS 5 
STREM EQU RQBUF 
SEQ#  EQU RQBUF+1 
SRC#  EQU RQBUF+2 
DESTN EQU RQBUF+3 
EC1   EQU RQBUF+4 
RQLEN ABS *-RQBUF 
DABUF BSS 384       BUFFER SIZE = 128*3 
DALEN ABS *-DABUF 
@DABF DEF DABUF 
      END 
                                                                                                                                                                                                                    