ASMB,R,Q,C
      HED <#FDMN> REROUTING ROUTINE * (C) HEWLETT-PACKARD CO. 1979* 
      NAM #FDMN,7 91750-1X008 REV 2013 791214 ALL W/ RR 
      SPC 1 
      ENT #FDMN 
      SPC 1 
      EXT #NRV,#NODE
      EXT #LCNT,#LV,#CM 
      EXT $OPSY,$LIBR,$LIBX 
      EXT .ENTR,.LDX,.MVW 
* 
*    NAME:   #FDMN
*    SOURCE: 91750-18008
*    RELOC:  91750-1X008
*    PGMR:   DOUG W. TSUI   JULY 1979 
**
* 
******************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979.  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.       *
******************************************************************
* 
* 
*  #FDMN CALLING SEQUENCE:
* 
*     < A REG. = NODE INDEX > 
*     < B REG. = CURRENT MIN COST > 
*      JSB #FDMN
*     <ERROR RETURN>
*     <NORMAL RETURN, REG A = MIN COST, REG B = MIN HOP COUNT>
* 
* 
      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 
#FDMN NOP 
      DST NIX       SAVE NODE IX AND MIN COST 
NOP   JSB CONFG 
      CLA,INA 
      STA MNLIX     SET UP MIN INDEX
      CPA #LCNT     ONE LINK ONLY?
      JMP GETCT .YES
      STA J         SET UP LOOP INDEX 
* 
*  LOOP TO FIND MIN COST OVER ALL LINKS 
* 
LOOP  ISZ J         UP LOOP INDEX 
      JSB LDCM
       DEF *+4
       DEF NIX
       DEF J
       DEF CM1
       JMP #FDMN,I  ERROR RETURN
      JSB LDCM
       DEF *+4
       DEF NIX
       DEF MNLIX
       DEF CM2
       JMP #FDMN,I
      LDB J         LOAD LOOP INDEX 
      LDA CM1 
      CMA,INA 
      ADA CM2 
      SSA,RSS       CM2 > CM1?
      STB MNLIX     .YES, MNLIX = J 
      CPB #LCNT     END LOOP? 
      RSS           .YES, EXIT FROM LOOP
      JMP LOOP      .NO, GO BACK TO LOOP
* 
GETCT EQU * 
      JSB LDCM      GET MIN COST
       DEF *+4
       DEF NIX
       DEF MNLIX
       DEF CM1
       JMP #FDMN,I
      LDA MNLIX     COMPUTE 
      ADA =D-1       ADDRESS
      MPY LVSZ       OF 
      ADA #LV        LV[MNLIX].LU 
      LDB 0         <B> ==> LV[MNLIX].LU
      JSB LDWD      <A> WILL RETURN LU WORD 
      AND =B377     MASK OFF FLAGS
      STA LU        SAVE IT TEMPORARY 
      CLB 
      LDA CM1 
      CPA =B77777   IF MAX COST,
      STB LU         LU = 0 
* 
      LDA NIX       COMPUTE 
      ADA =D-1       ADDRESS
      MPY NRVSZ      OF 
      ADA #NRV       NRV[NIX] 
      STA @NRV      SAVE IT 
* 
*  CHECK IF MIN HAS CHANGED 
* 
      LDA MINC      GET PASSED MIN COST 
      CPA CM1       = TO NEW MIN? 
      JMP SETLU     .YES, NO CHANGE 
      LDA LU
      IOR =B100000  SET CHANGE BIT
      STA LU
* 
SETLU EQU * 
      LDB @NRV
      ADB N.LU      <B> ==> NRV[NIX].LU 
      JSB LDWD      <A> WILL RETURN LU WORD 
      AND =B177400  ZERO OUT LU BYTE
      IOR LU        OR IN NEW MIN LINK
      JSB STWD      STORE IT BACK 
* 
      ISZ #FDMN     ADJUST RETURN ADDRESS 
      DLD CM1       LOAD RETURN VALUE 
      JMP #FDMN,I   NORMAL RETURN 
      SKP 
* 
*  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 
      STB LDMOD     .YES, MOD INSTS 
      STB SDMOD 
      STB LSMOD 
      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
* 
XX    BSS 2 
NIX   EQU XX        NODE INDEX
MINC  EQU XX+1      MIN COST
MNLIX NOP           MIN LINK INDEX
LU    NOP 
J     NOP           LOOP INDEX
LVSZ  DEC 6         SIZE OF LV ENTRIES
* 
CM1   BSS 2 
CM2   BSS 2 
* 
@NRV  NOP           NRV POINTER 
NRVSZ DEC 3         SIZE OF NRV ENTRIES 
N.LU  DEC 2         LU OFFSET 
      END 
                                                                                          