ASMB,Q,C
      HED <MATIC> MA 'WATCH DOG' TIMER * (C) HEWLETT-PACKARD CO. 1980 
      NAM MATIC,19,30 91750-16136 REV 2013 800423 ALL (MA)
      SPC 1 
******************************************************************
*  * (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 THE HEWLETT-PACKARD COMPANY.   *
******************************************************************
      SPC 1 
      EXT #MARN,#GRPM,#MCTR,#MTBL,#MARL,#MHCT,DTACH 
      EXT RNRQ,EXEC,XLUEX,$LIBR,$LIBX,.MVW,.LDX 
      EXT #NRVS,$OPSY,#LEVL,#NODE 
      SPC 2 
*         MATIC 
*     --------------
*     SOURCE PART # 91750-18136 
*     REL.   PART # 91750-16136 
*     PROGRAMMER    TOM MILNER
*     WRITTEN       06.19.79
      SPC 2 
* MATIC IS THE 'WATCH DOG' TIMER FOR MESSAGE ACCOUNTING (THE
* DS/1000 END-TO-END PROTOCOL).  IT SHOULD BE SCHEDULED TO RUN
* EVERY SECOND (UPLIN CURRENTLY DOES THIS).  ITS OPERATION IS 
* AS FOLLOWS: 
* 
*     1. ACCESS TO THE MA TABLE IS DISABLED (BY RESOURCE NUMBER). 
*     2. THE NEXT MA ENTRY IS MOVED TO A LOCAL BUFFER (FOR EASY 
*        ACCESS.
*     3. IF THE TRANSMISSION TIMEOUT CLOCK (VT1) IS RUNNING...
*        3A. VT1 IS DECREMENTED (CLOCK TICK). 
*        3B. IF A TIMEOUT OCCURS (VT1=0) THEN THE CANCELATION 
*            TIMER (VCC) IS INCREMENTED.
*        3C. IF VCC < 4 THEN A CANCEL MESSAGE IS SENT.
*        3D. IF VCC >= 4 THEN A 'NO RESPONSE' MESSAGE IS SENT 
*            TO THE LOCAL GRPM TO INFORM #MAPP THAT NOTHING HAS 
*            COME FROM THE OTHER SIDE OF THE CHANNEL. 
*     4. IF THE IDLE CLOCK IS RUNNING (VT2) THEN... 
*        4A. VT1 IS DECREMENTED.
*        4B. IF VT1 = 0 THEN A 'RECEIVER READY' MESSAGE IS SENT 
*            TO THE OTHER NODE. 
*     5. IF THE 'DIRTY BIT' IS SET THEN THE MA TABLE ENTRY IS 
*        WRITTEN BACK.
*     6. ACCESS TO THE MA TABLE IS RE-ENABLED.
*     7. THE ABOVE STEPS ARE REPEATED FOR EVERY MA TABLE ENTRY
      SKP 
* GLBLK-START 
* 
******************************************************************
*                                                                *
*     G L O B A L   B L O C K               REV 2013 790531      *
*                                                                *
*     GLOBAL OFFSETS INTO DS/1000 MESSAGE BUFFERS, USED BY:      *
*                                                                *
*         REMAT, RFMST, DEXEC, DMESS, FLOAD, POPEN, #MAST        *
*         GET,   #SLAV, RQCNV, RPCNV, GRPM,  LSTEN, PTOPM        *
*         EXECM, EXECW, OPERM, RFAM1, RFAM2, DLIST, DLIS3        *
*                                                                *
******************************************************************
* 
***!!!!! THE FIRST 7 WORDS (#STR THRU #ENO) MUST BE FIXED !!!!!***
#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 >>>
* 
******************************************************************
* 
* GLBLK-END 
      SPC 1 
A     EQU 0 
B     EQU 1 
      SKP 
MATIC EQU * 
      JSB DTACH 
       DEF *+1
      JSB CONFG     ONE TIME CHECK FOR DMS
      DLD #MCTR     (-) NUMBER OF MA ENTRIES
      SZA,RSS       ANY ENTRIES?
      JMP EXIT      . NO RETURN, NOTHIN' TO DO... 
      STA CTR 
      ELB,CLE,ERB   CLEAR SIGN BIT (DEBUG FLAG) 
      STB LINK
      CLA 
      STA DIRTY     INITIALIZE DIRTY BIT TO 'CLEAN' 
* 
CYCLE NOP           ... FOR TIMING... 
      NOP 
      NOP 
      JSB RNRQ      LOCK MA TABLE 
       DEF *+4
       DEF LK 
       DEF #MARN     MA RESOURCE NUMBER 
       DEF TMP       (DUMMY ENTRY)
ZERO   NOP
* 
      LDB LINK      <B> --> NEXT MA TABLE ENTRY 
      JSB LODWD     GET NODE
      SSA           DUMMY ENTRY?
      JMP FINI      . YES EXIT LOOP 
      JSB FETCH     GET ENTRY 
* 
      LDA VA        OUTSTANDING 
      CPA VS           MESSAGES ? 
      JMP TIME?     . NO
      LDA VT1       IF TIMER IS NOT 
      SZA,RSS          RUNNING, SET IT
      LDA D2              TO TWO TIMER
      STA VT1                "TICKS"
* 
*     CHECK FOR TRANSMISSION TIMEOUT
* 
TIME? EQU * 
      LDA VT1 
      SZA,RSS       CLOCK RUNNING?
      JMP IDLE      . NO CHECK IDLE CLOCK 
      ISZ DIRTY     SET DIRTY BIT 
      ADA N1        TICK
      STA VT1 
      SZA           TIMEOUT?
      JMP IDLE      . NO CHECK IDLE CLOCK 
* 
*     ACK TIMED OUT 
* 
      LDA VCC       CHECK FOR TOO MANY CANCELS
      INA 
      STA VCC       BUMP CONSECUTIVE CANCEL COUNTER 
      CMA 
      ADA #MARL 
      SSA,RSS       VCC EXCEEDS MAX?
      JMP CAN       . NO SEND (ANOTHER) CANCEL MSG
* 
*     TOO MANY CONSECUTIVE  TIMEOUTS; SEND 'NO RESPONSE' TO GRPM
* 
      LDA .NR 
      JSB FMT 
      LDA MSS+#STR  MAKE REQUEST LOOK LIKE
      IOR BIT14        A REPLY... 
      STA MSS+#STR
      CLA           SEND TO LU=0
      JSB SEND
      JMP FINI
* 
*     SEND 'CAN' MESSAGE TO NODE & RESET TIMER
* 
CAN   LDA TMAX
      STA VT1 
      LDA .CAN
      JSB FMT       FORMAT MA MESSAGE 
* 
      JSB #NRVS     FIND LU OF NODE 
       DEF *+2
       DEF NODE 
       JMP FINI      (ERROR RETURN) 
      JSB SEND      CLASS WRITE/READ
* 
*     CHECK IDLE TIMER;  IF TIMEOUT SEND 'RR' 
* 
IDLE  LDA VT2 
      SZA,RSS       IDLE CLOCK RUNNING? 
      JMP FINI      . NO END OF LOOP
      ISZ DIRTY     INDICATE ENTRY MODIFIED 
      ADA N1        TICK
      STA VT2 
      SZA           TIMEOUT?
      JMP FINI      . NO
* 
      LDA .RR       RECEIVER READY (AND IDLE) MESSAGE 
      JSB FMT       FILL REQUEST BUFFER 
* 
      JSB #NRVS 
       DEF *+2
       DEF NODE 
       JMP FINI      (ERROR RETURN) 
      JSB SEND      CLASS WRITE/READ
* 
*     FINISHED W/ THIS ENTRY; RESTORE IF MODIFIED 
* 
FINI  LDA DIRTY     CHECK DIRTY BITS
      SZA           'DIRTY' ENTRY 
      JSB STORE     . YES RESTORE ENTRY 
* 
      JSB RNRQ      UNLOCK MA TABLE 
       DEF *+4
       DEF UNLK 
       DEF #MARN
       DEF TMP
       NOP
* 
      LDA LINK
      ADA RECLN     <A> --> NEXT ENTRY
      STA LINK
      ISZ CTR 
      JMP CYCLE     CONTINUE IF MORE
* 
EXIT  JSB EXEC      BYE BYE 
       DEF *+4
       DEF D6 
       DEF D0 
       DEF N1        SAVING RESOURCES...
      SKP 
*-----------------------------------------------------------
*                   SUBROUTINES 
*-----------------------------------------------------------
      SPC 2 
* SEND-    WRITES OUT REQUEST BUFFER; <A>=LU
* 
      BSS 1         (STORAGE) 
SEND  NOP 
      IOR BIT15     BYPASS SESSION SST
      STA LU
* 
      LDA #GRPM     SET THE 
      IOR BIT15        NO 
      STA SEND-1          WAIT BIT!!! 
* 
      JSB XLUEX     CLASS WRITE/READ
       DEF *+8
       DEF CLS20
       DEF LU 
       DEF ZERO     NO DATA 
       DEF ZERO     DATA LENGTH = 0 
@MSS   DEF MSS      REQUEST BUF 
       DEF MSSLN    REQUEST LENGTH
       DEF SEND-1   GRPM'S CLASS
       NOP
      JMP SEND,I
LU    NOP 
CONWD OCT 010100    CONTROL WORD
      SPC 2 
* FMT- FORMAT LOCAL REQUEST BUFFER, <A> = MA MESSAGE
* 
      BSS 1         (STORAGE) 
FMT   NOP 
      STA FMT-1     SAVE MA MESSAGE 
      CLA 
      STA MSS       CLEAR BUFFER
      LDA @MSS
      LDB @MSS
      INB 
      JSB .MVW
       DEF MSSLN
       NOP
      LDA STREM     STREAM WORD 
      STA MSS+#STR
      LDA #NODE 
      STA MSS+#SRC
      LDA NODE
      STA MSS+#DST  ASSUME 'NODE' IS DESTINATION NODE 
      LDA #LEVL 
      STA MSS+#LVL
      LDA #MHCT     SET HOP COUNT 
      STA MSS+#HCT
      LDA VS
      ADA N1        NS:=VS-1
      SZA,RSS 
      ADA DIFF      ADJUST FOR ROLLOVER 
      LDB STATE 
      CPB .DOWN     IF CHANNEL IS DOWN
      CCA              SET INITIALIZATION INDICATOR 
      STA MSS+#MAS
      LDA VR
      STA MSS+#MAR
      LDA VC
      STA MSS+#MAC
      CCA 
      STA MSS+#REP  MA INDICATOR
      LDA FMT-1     MA MESSAGE
      STA MSS+#REP+1
      LDA LLU       SET MA ASSIGNMENT BIT 
      IOR BIT11        (BIT11) IN THE 
      STA LLU             LAST LU WORD
      JMP FMT,I 
      SPC 2 
* LODWD-  GET WORD FROM SAM <B> --> SAM 
* 
LODWD NOP 
DMS3  JMP *+4       NOP IF DMS
      XLA B,I 
      RSS 
      LDA B,I 
      JMP LODWD,I 
      SPC 2 
* BEGIN-FETCH 
* 
FETCH NOP 
      STA NODE
      LDA LINK      <A> -->NEXT ENTRY (SAVE FOR STORE)
      LDB @REC      <B> -->LOCAL BUFFER 
DMS1  JMP *+5       'NOP'ED IF DMS
      JSB .LDX
       DEF RECLN
      MWF 
      JMP *+4 
      JSB .MVW
       DEF RECLN
       NOP
*--   UNPACK CHANNEL RECORD 
      CLA 
      LDB .TBL+1    STATE WORD WHEN PACKED
      LSR 2         ISOLATE STATE 
      RAL,RAL 
      STA STATE 
      LSR 8         ISOLATE MAX TIMEOUT VALUE 
      ALF,ALF 
      STA TMAX
      LSR 2         VS OFFSET (VSO) WHEN PACKED 
      ADB VA        CALCULATE VS
      SSB 
      ADB OFFST     ADJUST FOR ROLLOVER 
      STB VS        VS:=VA+OFFSET FROM VA 
      LDB .TBL+3    VT1 AND VT2 WHEN PACKED 
      CLA 
      LSR 8         ISOLATE VT2 
      ALF,ALF 
      STA VT2 
      STB VT1 
      LDB .TBL+7
      LSR 12
      BLF 
      LSR 4 
      STB VCC       CANCEL COUNTER
      STA VCD       DOWN COUNTER
      JMP FETCH,I 
      SPC 1 
MACTR NOP           NUMBER OF MA TABLE ENTRIES
@REC  DEF .TBL      --> START OF PACKED RECORD
RECLN DEC 10        LENGTH OF MA ENTRY
.NON  DEC 1         NON-MA STATE
DIFF  OCT 077777    (SUBTRACTION) CONSTANT FOR ROLLOVER 
OFFST OCT 100001    (ADDITION)    CONSTANT FOR ROLLOVER 
      SPC 2 
* STORE-  PACKS AND RESTORES CHANNEL RECORD 
* 
STORE NOP 
      CLA 
      STA DIRTY     SET DIRTY BITS TO 'CLEAN' 
*--   PACK CHANNEL RECORD 
      LDA VCD 
      ALF 
      LDB VCC 
      LSR 4 
      STA .TBL+7
      LDA VT2 
      LSL 8 
      LDB VT1 
      LSR 8 
      STA .TBL+3    TIMERS (VT1/VT2)
      LDA TMAX
      RAL,RAL 
      IOR STATE 
      LSL 4 
      LDB VA
      CMB,INB 
      ADB VS        CALCULATE VSO = VS-VA 
      SSB 
      ADB DIFF      ADJUST FOR ROLLOVER 
      LSR 4 
      STA .TBL+1    STATE WORD (MSW) WHEN PACKED
      LDA NODE
      STA .TBL      RESTORE NODE NUMBER 
* 
      JSB $LIBR     TURN OFF INTERRUPTS 
       NOP
      LDA @REC      <A> -->LOCAL BUFFER 
      LDB LINK      <B> -->SAM
DMS2  JMP ST2       'NOP'ED IF DMS
      JSB .LDX
       DEF RECLN
      MWI           MOVE BACK INTO SAM
      JMP ST3 
ST2   JSB .MVW      MOVE BACK INTO SAM
       DEF RECLN
       NOP
ST3   JSB $LIBX     TURN INTERRUPTS BACK ON 
       DEF *+1
       DEF *+1
      JMP STORE,I   END-STORE 
* END-FETCH 
      SKP 
*-----------------------------------------------------------
*               CONSTANTS 
*-----------------------------------------------------------
STREM OCT 010000    STREAM WORD 
BIT11 OCT 004000    MA ASSIGNMENT BIT 
BIT14 OCT 040000    REPLY BIT 
BIT15 OCT 100000
N1    DEC -1
D0    DEC 0 
D2    DEC 2 
D6    DEC 6 
.RR   DEC 1 
.CAN  DEC 8 
.NR   DEC 16
* 
.DOWN OCT 0 
.UP   OCT 2 
.PEND OCT 3 
* 
CLS20 DEF 20,I
LK    OCT 040001
UNLK  OCT 040004
MSSLN ABS #REP+2+#LSZ 
*-----------------------------------------------------------
*               STORAGE 
*-----------------------------------------------------------
CONFG NOP           CONFIGURE IF DMS (ROUTINE OVERLAYED)
      CLA 
      CCB 
      ADB CONFG     ADDRESS OF CALL 
      STA B,I       NOP CALL
      LDB $OPSY 
      RBR,SLB       DMS?
      RSS 
      JMP CONFG,I   . NO RETURN 
      STA DMS1
      STA DMS2
      STA DMS3
      JMP CONFG,I   RETURN (END-CONFG)
* 
      ORG CONFG 
LINK  BSS 1         . ADDRESS OF ENTRY
NODE  BSS 1         . NODE # OF CHANNEL 
IDX   BSS 1         . INDEX INTO MA TABLE 
DIRTY BSS 1         . DIRTY BITS
STATE BSS 1         . CHANNEL STATE 
TMAX  BSS 1         . MAX TIMEOUT TICKS 
VS    BSS 1         . SEND SEQUENCE # 
.TBL  EQU *         WORD ZERO OF TABLE ENTRY WHEN PACKED
VT2   BSS 1         . RECEIVER IDLE TIMER 
VCD   BSS 1         . # TIMES CHANNEL DOWN
VA    BSS 1         . ACKNOWLEDGEMENT VARIABLE
VT1   BSS 1         . ACKNOWLEDGEMENT TIMER 
VR    BSS 1         . RECEIVE SEQUENCE #
VF    BSS 1         . RECEIVE FLAGS 
VC    BSS 1         . CANCEL FLAGS
VCC   BSS 1         . # CONSECUTIVE CANCELATIONS
LERC  BSS 1         . LAST ERROR / QUALIFIER REPORTED 
LERN  BSS 1         . LAST NODE REPORTING ERROR 
* 
TMP   BSS 1 
CTR   BSS 1 
MSS   BSS #REP+3+#LSZ 
LLU   EQU MSS+#REP+1+#LSZ 
* 
SIZE  EQU * 
      END MATIC 
                                                                                                                                                                                        