ASMB,R,Q,C
      HED <#DOWN> REROUTING ROUTINE * (C) HEWLETT-PACKARD CO. 1979* 
      NAM #DOWN,7 91750-1X005 REV 2013 800318 ALL W/ RR 
      SPC 1 
      ENT #DOWN 
      SPC 1 
      EXT #NCNT,#LCNT,#NRV,#CM,#QCLM,#MDCT
      EXT #LVSC,#FDMN,#NRVS,#CMCT 
      EXT $OPSY,$LIBR,$LIBX,$TIME 
      EXT XLUEX,EXEC,.MVW,.LDX
* 
*    NAME:   #DOWN
*    SOURCE: 91750-18005
*    RELOC:  91750-1X005
*    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.       *
******************************************************************
* 
* 
*  #DOWN CALLING SEQUENCE:
* 
*     < A REG. = LU THAT IS DOWNED >
*     < B REG. = NODE # > 
*      JSB #DOWN
*     <RETURN 1--NOT RR LINK> 
*     <RETURN 2--RR LINK, REQUEUE TO NEW LU>
* 
* 
      SKP 
#DOWN NOP 
      STA LU        SAVE DOWN LU
      STB NODE
NOP   JSB CONFG 
      LDA #LCNT     RR ENABLE?
      SZA,RSS 
      JMP #DOWN,I   .NO 
      LDA LU
      JSB #LVSC     FIND INDEX & SAM ADDR OF DOWN LU
       JMP #DOWN,I  NOT FOUND, NOT RR LINK
      STA LIX       SAVE INDEX AS LIX 
      STB @LV       SAVE LV ADDRESS 
* 
*  CHECK IF LINK IS REALLY DOWN 
* 
      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 DRIVER? 
      JMP CKDWN     .YES, SKIP CHECK
      RBR 
      SLB,RSS       ANY ERROR?
      JMP RETRN     .NO, TRY THIS LINK AGAIN
* 
*  CHECK IF LINK HAS ALREADY BEEN DECLARED DOWN 
* 
CKDWN EQU * 
      LDB @LV 
      JSB LDWD      <B> --> SAM BUFFER FROM #LVSC 
      SSA           LINK DOWN ALREADY?
      JMP RR        .NO, TRY REROUTE
      JSB #NRVS     .YES, FIND CURRENT LINK 
       DEF *+2
       DEF NODE 
       JSB ERROR
      CPA LU        = TO DOWNED LINK? 
      JMP #DOWN,I   .YES, NO RR 
      JMP RETRN     .NO, TRY NEW LINK 
RR    EQU * 
      XOR =B100000  .NO, SET LINK TO BE DOWN
      JSB STWD      STORE IT BACK 
* 
*  WRITE DOWN LINK MESSAGE TO USER
* 
      LDA #QCLM 
      SZA,RSS 
      JMP SETUP 
      DLD $TIME 
      DST TOD 
      JSB EXEC      SEND MESSAGE TO #QCLM 
       DEF *+8
       DEF NA20 
       DEF K0 
       DEF MSGBF
       DEF MSGLN
       DEF K7       MESSAGE TYPE = 7
       DEF K0 
       DEF #QCLM
       NOP          IGNORE ERROR RETURN 
* 
*  SET UP INITIAL VALUES FOR THE MAIN LOOP
* 
SETUP EQU * 
      CLA,INA       SET UP
      STA I          LOOP INDEX 
* 
      LDA LIX       SET UP STARTING 
      ADA =D-1       ADDRESS OF CM
      ALS           MULTIPLY BY 2 (SIZE OF CM ENTRIES)
      ADA #CM 
      STA @CM 
* 
      LDA #NRV      SET UP STARTING 
      ADA N.LU       ADDRESS OF NRV.LU
      STA @NRV
* 
*  LOOP TO NOTE DOWN LINK FOR ALL NODES 
* 
LOOP  EQU * 
      LDB @CM       <B> --> CM ENTRY
      JSB LDWD      LOAD COST VALUE 
      SZA,RSS       ZERO COST?
      JMP CKEND     .YES, NO UPDATE 
      LDA =D2 
      STA SSLEN     2 WORD STORE
      LDA @MAX      <A> --> VALUE TO BE STORED
      JSB STWS      STORE MAX VALUE IN CM 
* 
      LDB @NRV      <B> --> NRV.LU ENTRY
      JSB LDWD      <A> WILL RETURN NRV.LU WORD 
      AND =B377     MASK OFF ALL EXECPT LU
      CPA LU        EQUAL TO DOWN LU? 
      RSS           .YES, SKIP TO FIND NEW MIN
      JMP CKEND     .NO, CHECK END LOOP 
* 
      LDA I 
      CLB 
      JSB #FDMN     FIND NEW MIN LINK 
       JSB ERROR    ERROR RETURN
* 
CKEND EQU * 
      LDA MAXH      LOOP COUNT EQUAL
      CPA I          TO MAX HOP COUNT?
      JMP SEND      .YES, EXIT LOOP 
      ISZ I         UP LOOP COUNT 
      LDA @CM       UP
      ADA CMIX       CM 
      STA @CM        ADDRESS
      LDA @NRV      UP
      ADA NRVSZ      NRV
      STA @NRV       ADDRESS
      JMP LOOP
* 
SEND  EQU * 
      CLA,INA       SET SEND FLAG 
      STA #CMCT 
      JSB EXEC      SCHEDULE SEND PROCESS W/O WAIT
       DEF *+4
       DEF NA10 
       DEF #SEND
       DEF K1       DOWN MSG STARTS WITH SEQ# = 2 
       JSB ERROR
* 
*  UP/DOWN COUNTER PROCESSING 
* 
      LDA =D3       GET SAVED TIME & COUNTER
      STA LSLEN      3 WORD MOVE
      LDA @LV        GET LV ADDRESS 
      ADA =D2        ADD OFFSET 
      STA @LV 
      LDB @LBUF      LOCAL ADDRESS
      JSB LDWS       GET 3 WORDS FROM SAM 
* 
      JSB EXEC      GET CURRENT TIME
       DEF *+3
       DEF NA11 
       DEF TBUF 
       JSB ERROR
* 
      LDA T.DAY 
      MPY =D24      CONVERT CURRENT DAY TO HRS
      ADA T.HR
      ADA L.HR      - SAVED HOUR
      SSA           CURRENT HR SHOULD BE = OR > 
      ADA =D8760    IF NOT, ADD 1 YEAR (365X24 HRS) 
      SZA,RSS       CURRENT HR = SAVED HR?
      JMP CPSEC     .YES, COMPARE SEC 
      ADA =D-1
      SZA           OVER 1 HOUR?
      JMP RESET     .YES, RESET COUNTER & TIME
      LDA =D60      CARRY OVER 1 HR 
CPSEC EQU * 
      ADA T.MIN     ADD CURRENT MIN 
      MPY =D60      CONVERT TO SEC
      ADA T.SEC 
      ADA L.SEC     - SAVED SEC 
      ADA =D-300    OVER 5 MIN? 
      SSA,RSS 
      JMP RESET     .YES, RESET COUNTER & TIME
      ISZ L.CNT     .NO, UP COUNTER 
      JMP STLV      IF DONOT ROLL OVER, STORE LV
* 
      LDA LU        IF ROLL OVER, DISABLE LINK
      IOR =B100000
      STA CONWD 
      LDA =B3100
      STA CONWD+1 
      JSB XLUEX     DISABLE CALL
       DEF *+3
       DEF NA3
       DEF CONWD
       JSB ERROR
      CLA           CLEAR SAVED VALUE 
      STA L.HR
      STA L.SEC 
      STA L.CNT 
* 
      LDA #QCLM 
      SZA,RSS 
      JMP STLV
      DLD $TIME 
      DST TOD 
      JSB EXEC
       DEF *+8
       DEF NA20 
       DEF K0 
       DEF MSGBF
       DEF MSGLN
       DEF K5 
       DEF K0 
       DEF #QCLM
       NOP
      JMP STLV
RESET EQU * 
      LDA T.DAY 
      MPY =D24
      ADA T.HR
      CMA,INA 
      STA L.HR      RESET HR
      LDA T.MIN 
      MPY =D60
      ADA T.SEC 
      CMA,INA 
      STA L.SEC     RESET SEC 
      LDA #MDCT 
      STA L.CNT     RESET COUNTER 
STLV  EQU *         STORE LV BACK TO SAM
      LDA =D3 
      STA SSLEN 
      LDA @LBUF 
      LDB @LV 
      JSB STWS
RETRN EQU * 
      ISZ #DOWN 
      JMP #DOWN,I 
      SKP 
* 
*  ERROR HANDLING 
* 
ERROR NOP 
      DST AREG
      CLA 
      STA #LCNT     DISABLE RR
      LDA #QCLM 
      SZA,RSS 
      JMP #DOWN,I 
      LDA @#DWN 
      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 
       NOP
      JMP #DOWN,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, JUST INIT CONSTANT 
      STB LDMOD     .YES, MODIFED INSTRUCTIONS
      STB SDMOD 
      STB LSMOD 
      STB SSMOD 
* 
INIT  EQU * 
      LDA =B77777 
      STA MAXC      SET UP MAX COST 
      LDA #NCNT 
      CMA,INA 
      STA MAXH      SET UP MAX HOP COUNT
      LDA #LCNT 
      ALS           MULTIPLY BY TWO 
      STA CMIX      SET UP INCREMENTAL IX FOR CM
      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 
* 
*** 
*** 
* 
*  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 
K5    DEC 5 
K7    DEC 7 
K8    DEC 8 
NA3   OCT 100003
NA10  OCT 100012
NA11  OCT 100013
NA20  OCT 100024
CONWD BSS 2 
LIX   NOP           DOWN LINK INDEX 
I     NOP           LOOP INDEX
NODE  NOP 
@#DWN DEF #DOWN 
PNAME ASC 3,#DOWN 
#SEND ASC 3,#SEND 
* 
MAX   BSS 2 
MAXC  EQU MAX       MAX COST
MAXH  EQU MAX+1     MAX HOP COUNT 
@MAX  DEF MAX       ADDRESS OF MAX
* 
@CM   NOP           POINTER TO CM IN SAM
CMIX  NOP           INCREMENTAL INDEX FOR CM
* 
@NRV  NOP           POINTER TO NRV IN SAM 
NRVSZ DEC 3         LENGTH OF NRV ENTRIES 
N.LU  DEC 2 
* 
MSGBF BSS 12
LU    EQU MSGBF     DOWN LU 
PREG  EQU MSGBF+4 
AREG  EQU MSGBF+5 
TOD   EQU MSGBF+7 
PGM   EQU MSGBF+9 
MSGLN ABS *-MSGBF 
* 
TBUF  BSS 5 
T.SEC EQU TBUF+1
T.MIN EQU TBUF+2
T.HR  EQU TBUF+3
T.DAY EQU TBUF+4
* 
@LV   NOP 
LBUF  BSS 3 
L.HR  EQU LBUF
L.SEC EQU LBUF+1
L.CNT EQU LBUF+2
@LBUF DEF LBUF
      END 
                                                                                                                        