ASMB,R,Q,C
      HED <#MAPP> MA POST PROCESSOR * (C) HEWLETT-PACKARD CO. 1980
      NAM #MAPP,7 91750-1X016 REV 2013 801013 ALL (MA)
      ENT #MAPP 
* 
      EXT #NQUE,#RQUE,RNRQ,$LIBR,$LIBX
      EXT .MVW,.LDX,#GBUF 
      EXT #NRVS,EXEC,XLUEX,#RSAX,#GETR,#PUTR
* 
      EXT #MCTR,#MAHC,#MARN,#MTBL,#MARL,#MAZE 
      EXT #PLOG,#GRPM,$OPSY,#NODE,#LEVL,#QCLM,#MHCT 
      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 
*     #MAPP 
*     --------
* 
*     SOURCE PART # 91750-18016 
*     REL. PART #   91750-1X016 
*     PROGRAMMER    TOM MILNER
*     WRITTEN       06.20.79
*     REVISED       801013   CLARK JOHNSON
* 
* 
* #MAPP MONITORS OUTGOING AND INCOMING NETWORK MESSAGES.
* CALLING SEQUENCE: 
* 
*         <A> =   READ/WRITE COMPETION (0/1)
*         <B> =   LAST LU WORD IN LOCAL APPENDAGE 
*         <#GBUF HAS REQUEST/REPLY BUFFER IN GRPM>
*         JSB #MAPP 
*         < RETURN IF MESSAGE DISCARDED > 
*         < NORMAL RETURN > 
* 
* 
* THE ALGORITHM (IN PASCAL) HAS BEEN APPENDED TO THE MA ERS FOR 
* THE READER'S AMUSEMENT.  #MAPP'S OPERATION IS AS FOLLOWS: 
* 
*     1. ACCESS TO THE MESSAGE TABLE IS LOCKED (BY RN)
* 
*     IF THE MESSAGE WAS OUTBOUND 
*     2. AND WAS TRANSMITTED BY A SLAVE THEN THE MESSAGE IS 
*        'REQU'D TO A HOLD CLASS FOR POSSIBLE LATER RETRANSMISSION. 
*        THERE IS NO FURTHER PROCESSING FOR OUTBOUND MESSAGES.
* 
*     IF THE MESSAGE WAS INCOMING --
*     3. IF THE MESSAGE WAS A REQUEST TO REININITIALIZE THEN THE
*        CHANNEL STATE IS SET TO PENDING AND AN INITIALIZE RESPONSE 
*        IS ECHOED BACK.
*     4. OTHERWISE, PROCESSING IS DETERMINED BY THE CHANNEL'S STATE:
*        DOWN -     THE MESSAGE IS DISCARDED AND INITIALIZATION 
*                   IS REQUESTED ('INIT' IS SENT) 
*        PENDING -  THE MESSAGE IS DISCARDED AND IF IT WAS AN INITIALIZE
*                   RESPONSE THEN THE STATE IS CHANGED TO 'UP' AND THE
*                   NORMAL ACKNOWLEDGEMENT PROCESSING IS PERFORMED. 
*        UP -       IF THE MESSAGE IS WITHIN THE ACK 'WINDOW' THE 
*                   ACKNOWLEDGEMENT PROCESSING IS DONE. IF IT IS
*                   WITHIN THE RECEIVE 'WINDOW' THEN THE RECEIVE
*                   PROCESSING IS DONE.  IF IT IS NOT WITHIN THIS LATTER
*                   WINDOW THE MESSAGE IS DISCARDED.
*        NONMA -    RETURN TO CALLER
*     5. UPDATED CHANNEL INFO IS RESTORED (INTO SAM) IN THE MA
*        MESSAGE TABLE AND THE TABLE IS UNLOCKED (ITS RN FREED UP). 
      SKP 
* GLOBAL-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,  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 >>>
* 
******************************************************************
* 
* GLOBAL-END
* 
G     EQU #GBUF 
      SKP 
#MAPP NOP 
      STA RD.WC     SAVE READ/WRITE COMPLETION
      STB LLU       SAVE LAST LU WORD (FROM LOCAL APPENDAGE)
      JSB CKDMS     ONE-TIME CHECK FOR DMS; 'NOP'ED 
      LDA CONWD 
      STA LU+1      INITIALIZE I/O CONTROL WORD 
      STA FSCTR     << INITIALIZE FAILSAFE >> 
      CLA 
      STA DIRTY     CLEAR DIRTY FLAG
      STA DSCRD     INIT MSG DISCARD FLAG 
      STA MAMSG     INITIALIZE MA MESSAGE 
      STA _MAZE     INITIALIZE TO OUTBOUND TRAFFIC
      LDA #MCTR 
      SZA,RSS       MA INITIALIZED IN SYSTEM? 
      JMP FLY       . NO RETURN 
* 
*     CHECK FOR NETWORK (STREAM 0) MESSAGES 
* 
      LDA G+#STR    GET STREAM WORD 
      LSL 10        ISOLATE STREAM
      SZA           STREAM ZERO?
      JMP RSM?      . NO CHECK FOR REMOTE SESSION MESSAGE 
      LDA G+#REP    . YES CHECK SUBFIELD INDICATOR
      CPA N1        MA SUBFIELD?
      RSS 
      JMP FLY       . NO, IGNORE ALL OTHER NETWORK MSGS 
      LDA G+#REP+1  . YES GET MA MESSAGE
      STA MAMSG 
* 
*     CHECK FOR SPECIAL LOGOFF MSG (STREAM 7) FROM UPLIN
*     (IE., REMOTE SESSION) AND IGNORE IT TOO 
* 
RSM?  LDA G+#MAS    CHECK FOR NS = -2 
      CPA N2              AND IGNORE IF IT IS 
      JMP FLY 
      STA NS        OTHERWISE SAVE NS 
* 
      LDA G+#MAR    NR
      STA NR
      LDA G+#MAC    NC
      STA NC
* 
      LDA G+#SRC    CHECK FOR STORE & 
      LDB G+#DST       FORWARD TRAFFIC
      CPA #NODE           AND IGNORE
      RSS                     IT. 
      CPB #NODE 
      RSS 
      JMP FLY 
      CPA B         AND IGNORE LOCAL-TO-LOCAL TRAFFIC 
      JMP FLY 
* 
*     WAIT FOR ACCESS TO MA TABLE 
* 
      JSB RNRQ      WAIT AND DISABLE ACCESS 
       DEF *+4
       DEF LK 
       DEF #MARN     (MA RESOURCE #)
       DEF TMP       (TMP STORAGE FOR STATUS) 
ZERO   NOP
* 
*     CHECK SOURCE/DESTINATION FOR OUTGOING OR INCOMING 
* 
      LDA G+#STR
      RAL,ELA       REPLY BIT TO <E>
      LDA G+#DST
      SEZ,RSS       CHECK FOR REPLY 
      JMP QUEST     REQUEST 
      CPA #NODE     LOCAL NODE? 
      JMP *+3       . YES OUTGO:=TRUE  NODE:=SORCE
      CLB           . NO  OUTGO:=FALSE NODE:=DEST 
      JMP GTVAR 
      CCB 
      LDA G+#SRC
      JMP GTVAR 
QUEST CPA #NODE     LOCAL NODE? 
      JMP *+3       . YES OUTGO:=FALSE  NODE:=SORCE 
      CCB           . NO  OUTGO:=TRUE   NODE:=DEST
      JMP GTVAR 
      LDA G+#SRC
      CLB 
GTVAR STB TMP       SAVE OUTGO FLAG 
      JSB FETCH     GET CHANNEL VARIABLES 
      LDA TMP 
      SZA,RSS       OUTBOUND MESSAGE? 
      JMP INCOM     . NO INCOMING 
      SKP 
*---------------------------------------------------------------+ 
*                                                               | 
*             PROCESS OUTGOING MESSAGES                         | 
*                                                               | 
*---------------------------------------------------------------+ 
OUTGO EQU * 
      LDB STATE 
      CPB .NON      NON MA NODE?
      JMP EXIT      . YES ALL DONE
*--   CHECK FOR LOCALLY GENERATED TRAFFIC (CHECK ASSIGNMENT BIT)
* 
      LDA LLU       GET LAST LU WORD
      AND BIT11     TEST MA ASSIGNMENT BIT
      SZA,RSS       IGNORE IF NOT 
      JMP EXIT         SET... 
* 
      LDA MAMSG     CHECK FOR MA MESSAGE
      SZA           IGNORE IF MA MSG PRESENT
      JMP DOWN? 
      LDA VT1       SET ACK TIMER 
      SZA,RSS          IF NOT ALREADY SET 
      ISZ DIRTY           AND SET DIRTY FLAG
      SZA,RSS 
      LDA TMAX
      STA VT1 
DOWN? LDA MAMSG     CLEAR IDLE TIMER EXCEPT 
      CPA .RR          FOR IDLE TRAFFIC!
      JMP *+3 
      CLA 
      STA VT2       CLEAR IDLE TIMER
      LDB STATE 
      CPB .DOWN     CHANNEL DOWN? 
      RSS           . YES REQUEST INITIALIZATION
      JMP SLAV?     . NO, CHECK FOR SLAVE TRANSMISSION
* 
*     CHANNEL DOWN;  TRY TO INITIALIZE
* 
      ISZ DIRTY     SET DIRTY BIT 
      LDA .PEND      CHANGE STATE TO PENDING
      STA STATE 
      CCA 
      STA VC        SO THAT NC:=-1  (ALL MESSAGES CANCELED) 
      ADA #MARL     NO RETRIES
      STA VCC 
      LDA TMAX
      STA VT1       SET ACKNOWLEDGEMENT TIMER 
* 
*     FORMAT INITIALIZE MESSAGE 
* 
      LDA BIRTH     INITIALIZE NUMBER SEQUENCE
      STA VA        VA:=BIRTH 
      STA VR        VR:=BIRTH 
      STA NS        NS:=BIRTH 
      JSB INCR
      STA VS        VS:=BIRTH+1 
      JSB FMT 
      LDA .INIT     INITIALIZE MESSAGE
      STA RQB+#REP+1
      JSB SEND      SEND 'INIT' MESSAGE 
* 
*     IF SLAVE TRANSMISSION SAVE IN HOLD QUEUE TILL ACK 
* 
SLAV? LDA MAMSG     IGNORE MA MESSAGES
      SZA 
      JMP EXIT
* 
      LDA G+#STR
      RAL 
      SSA,RSS       REPLY?
      JMP EXIT      . NO ALL DONE 
* 
      LDA VS        VALIDITY CHECK - VERIFY 
      JSB DECR        THAT MSG IN RANGE OF
      STA TMP           VS-1 AND VA 
      LDA NS
      JSB RANGE     VS-1 >= NS >= VA ?? 
       DEF VA       (LOWER BOUND) VA
       DEF TMP      (UPPER BOUND) VS-1
       JMP AGAIN    OUT OF RANGE - RESEND IT! 
* 
*     SAVE SLAVES TRANSMISSIONS 
* 
      LDA NS        GET SEQUENCE # AND FORM 
      LSL 12           UNIQUE MA IDENTIFIER 
      IOR IDX 
      STA G+#MAS    SAVE IDENTIFIER 
* 
      JSB #NQUE     REQUEUE TO HOLD CLASS 
       DEF *+9
       DEF CLS20     (WRITE/READ) 
       DEF BIT15     (LU=0 BYPASS SESSION SST)
       DEF ZERO 
       DEF ZERO 
       DEF G         (ZBUF OVERLAY) 
       DEF P#MAS     (ZBUF OVERLAY LENGTH)
       DEF #MAHC     (DESTINATION CLASS)
       DEF #GRPM     (SOURCE CLASS) 
       JMP *+4       ERROR RETURN 
      LDA BIT15 
      STA DSCRD     SET REQUEUE (BIT15) FLAG
      JMP *+6 
      DST MAERR+2   SAVE REGISTERS
      LDA _MAZE 
      IOR BIT10     SET 'CANNOT REQUEUE' BIT
      STA _MAZE 
      LDA NS
      STA G+#MAS
      JMP EXIT
      SPC 2 
* 
* FOR DRIVER 65 LINKS, IF RTRY HAS HAD MSG IT MAY HAVE
* BEEN PASSED OVER FOR RETRANSMISSION, THEREFORE RESEND IT
* 
AGAIN EQU *         SINCE MSG OUT OF WINDOW RESEND IT 
      LDA VS
      STA RQB+#MAS  NS
      JSB INCR      VS:=VS+1
      STA VS
      LDA VR
      STA RQB+#MAR  NR
      LDA VC
      STA RQB+#MAC  NC
* 
      JSB #NRVS     FIND LU OF THIS NODE
       DEF *+2
       DEF NODE 
       NOP
      IOR BIT15     BYPASS SESSION SST
      STA LU
* 
      LDA _MAZE 
      IOR BIT5      'RESENDING SLAVE' BIT 
      STA _MAZE 
* 
      JSB #NQUE     RESEND SLAVE
       DEF *+9
       DEF CLS20     WRITE/READ 
       DEF LU 
       DEF ZERO 
       DEF ZERO 
       DEF RQB       ZBUFFER OVERLAY
       DEF P#MAC     ZBUF OVERLAY LENGTH
       DEF #GRPM     (DESTINATION CLASS #)
       DEF #GRPM     (SOURCE CLASS #) 
       RSS           ERROR RETURN 
      JMP EXIT
      DST MAERR+2     SAVE ERROR CODES
      LDA _MAZE 
      IOR BIT10       << REQUE ERROR ! >> 
      STA _MAZE 
      JMP EXIT
      SKP 
*---------------------------------------------------------------+ 
*                                                               | 
*             PROCESS INCOMING MESSAGES                         | 
*                                                               | 
*---------------------------------------------------------------+ 
INCOM EQU * 
      LDA BIT0
      STA _MAZE     INBOUND 
      LDA VA
      LDB NS
      DST MAERR+2   << DATA FOR FAILSAFE >> 
      LDA MAMSG     IS IT AN MA MESSAGE?
      SZA             NO, SO SKIP IT
      ISZ DSCRD       YES, SO DISCARD IT LATER
* 
*--   IF NS=0 THEN STATE:=NONMA 
      LDA NS
      SZA,RSS       FROM MA NODE? 
      JMP GONON     . NO CHANGE STATE TO NONMA
      ISZ DIRTY 
      LDA NR
      CPA N1        CHECK FOR GRPM ERROR
      RSS 
      JMP CKMA      CHECK FOR MA MESSAGE
* 
*--   NR=-1 MEANS ERROR ECHOED FROM GRPM
* 
      LDA G+#ECQ
      LSR 4         SAVE THIS ERROR MESSAGE FOR 
      AND B17          LATER AND ENCRYPT IT 
      LDB A               TO TAKE UP LESS SPACE 
      STA TMP       SAVE FOR LATER
      LDA G+#EC2
      AND B17 
      ALF 
      IOR B 
      STA LERC      ERROR CODE / QUALIFIER
      LDA G+#ENO
      STA LERN      REPORTING NODE NUMBER 
* 
      DLD G+#EC1    CHECK FOR DS08(4) AND 
      CPA "DS"         LET IT GO BACK TO THE USER 
      RSS 
      JMP KILLM 
      CPB "08"
      RSS 
      JMP KILLM 
      LDA TMP 
      CPA .4        DS08(4)?
      JMP EXIT      . YES PASS IT ON TO THE USER
* 
KILLM EQU * 
      ISZ DSCRD     FLUSH THIS MESSAGE
      LDB MAMSG 
      SZB,RSS       MA MSG? 
      JMP EXIT      . NO JUST FLUSH MESSAGE 
      LDA G+#EC2    IF DS06 ON STREAM 0 THEN OTHER
      CPA "06"         SIDE DOES NOT HAVE MA
      JMP GONON     TURN OFF MA 
      LDA STATE 
      CPA .PEND 
      JMP FAIL4     IF PENDING THEN CHANGE STATE TO DOWN
      JMP EXIT
* 
CKMA  LDB MAMSG 
      SZB,RSS       MA MESSAGE? 
      JMP SETT2     . NO SET IDLE TIMER (VT2) 
      LDA G+#EC2    CHECK FOR "DS06"
      CPA "06"
      JMP GONON     DS06 MEANS OTHER SIDE HAS NO MA 
      CPB .RR       DON'T SET IDLE TIMER
      RSS              ON .RR MESSAGES
SETT2 JSB ITIME           BUT SET IT ON ALL OTHERS
      LDB MAMSG 
      CPB .NR       NO RESPONSE?
      JMP FAIL      . YES SET CHANNEL DOWN
      CPB .INIT     INITIALIZE REQUEST? 
      JMP SETUP     . YES RE-UP MA
      JMP CASE. 
* 
GONON LDA .NON      ALREADY NONMA?
      CPA STATE 
      JMP EXIT      .  YES NO NEED TO MODIFY
      ISZ DIRTY     MA TABLE ENTRY IS DIRTY 
      STA STATE     STATE CHANGED TO NONMA
      CLA 
      STA VR
      STA VT1 
      STA VT2 
      STA VCC 
      JSB EXEC      SEND "MA REMOVED FROM XXX" TO QCLM
       DEF *+8
       DEF CLS20
       DEF ZERO     (LU=0)
       DEF MAERR
       DEF .1 
       DEF .4       (ERROR MSG 4) 
       DEF ZERO 
       DEF #QCLM
       NOP
      JSB FLUSH     CLEAR OUT MA HOLD QUEUE 
      JMP EXIT
* 
*     'NO RESPONSE' RECEIVE FROM CHANNEL TIMER; INFORM MASTERS, 
*     CLEAR SLAVE TRANSMISSIONS FROM HOLD CLASS, STATE TO DOWN. 
* 
FAIL  EQU * 
      LDA N17 
      STA FSCTR     << INITIALIZE FAILSAFE >> 
      LDA VA        ANY MORE OUTSTANDING MESSAGES?
      CPA VS
      JMP FAIL4     . NO, DONE W/ MSG CLEANUP 
*--   FORMAT UNIQUE MA IDENTIFIER 
      LSL 12
      IOR IDX 
      STA IDENT 
*--   BUMP TO NEXT MESSAGE NUMBER 
      LDA VA
      JSB INCR      VA:=VA+1
      STA VA
* 
      JSB #RSAX     SEARCH MASTER TCBS
       DEF *+3
       DEF .11       SEARCH USING MA IDENTIFIER AS KEY
       DEF IDENT
      SSB           WAS A TCB FOUND?
      JMP FAIL3     . NO CONTINUE 
* 
      ADB .3        . YES, <B> --> MASTERS CLASS (TCB+3)
      JSB LODWD     GET CLASS 
      RAL,CLE,ERA   CLEAR SIGN
      STA TMP 
      JSB FMT 
      LDA "DS"
      STA RQB+#EC1
      LDA LERC
      SZA,RSS       ANY ERROR REPORTED? 
      LDA DS053     . NO USE DEFAULT OF DS05(3) 
      CLB 
      RRR 4         EC2 TO <A>, ECQ TO <B>
      IOR "00"
      STA RQB+#EC2
      BLF,BLF 
      STB RQB+#ECQ  QUALIFIER 
      LDA LERN
      SZA,RSS       ANY REPORTING NODE? 
      LDA #NODE     . NO USE LOCAL
      IOR BIT15 
      STA RQB+#ENO
      LDA #NODE 
      STA RQB+#DST
* 
      JSB XLUEX     SEND MSG TO MASTER
       DEF *+8          INDICATING A TIMEOUT
       DEF CLS20
       DEF BIT15     LU=0 
       DEF ZERO      DATA BUFFER
       DEF ZERO      DATA LENGTH = 0
       DEF RQB       REQUEST BUFFER DS05(3) 
       DEF P#MHD     REQUEST LENGTH 
       DEF TMP       CLASS NUMBER 
       NOP
* 
FAIL3 ISZ FSCTR     << FAILSAFE >>
      JMP FAIL+2    CHECK FOR ANY MORE MSGS 
* 
FAIL4 EQU * 
      JSB FLUSH     FLUSH MA HOLD QUEUE 
      ISZ VCD       BUMP DOWN COUNTER 
      LDA .DOWN 
      STA STATE     CHANGE STATE TO DOWN
      CLA 
      STA VT1 
      STA VT2 
      STA VCC 
      JMP EXIT
* 
*     ACKNOWLEDGE INITIALIZE REQUEST AND RESPOND WITH 'IR'. 
* 
SETUP EQU *         RESPOND TO 'INIT' REQUEST 
      LDA VA
      STA OLDVA     SAVE FOR LATER
      LDA VS
      STA OLDVS     SAVE CURRENT VS FOR LATER 
      JSB ITIME     SET IDLE TIMER (VT2)
      LDA .UP 
      STA STATE     CHANGE STATE TO UP
      LDA NR
      JSB INCR
      STA VS        VS:=NR+1
      STA VA        VA:=NR+1
      LDA NS
      JSB INCR
      STA VR        VR:=NS+1
      CLA 
      STA VF        VF:=0 
      STA VCC       MAX RETRIES 
      CCA 
      STA VC        SO THAT NC:=-1  (CAUSE OTHER SIDE TO RETRANSMIT)
* 
*     ECHO INITIALIZE MESSAGE WITH 'IR' (INIT RESPONSE) 
* 
      JSB FMT       FORMAT MA MESSAGE 
      LDA G+#STR
      IOR BIT14     SET REPLY BIT IN STREAM 
      STA RQB+#STR
      LDA G+#SRC    GET SOURCE NODE 
      STA RQB+#SRC
      LDA #NODE     DESTINATION NODE (LOCAL NODE) 
      STA RQB+#DST
      LDA .IR 
      STA RQB+#REP+1  'IR' MESSAGE
* 
      JSB SEND      SEND 'IR' 
*--   RETRANSMIT CURRENTLY UNACKNOWLEDGED MESSAGES (VA TO VS-1) 
      LDA OLDVA 
      LDB OLDVS 
      JSB REXMT     RETRANSMIT ANY OUTSTANDING MSGS 
      JMP EXIT
      SPC 2 
*     PROCESSING DETERMINED BY STATE OF CHANNEL 
* 
CASE. EQU *         PROCESSING DETERMINED BY STATE
      LDA STATE 
      CPA .UP       UP? 
      JMP UP.       . YES 
      CPA .PEND     PENDING?
      JMP PEND. 
      SPC 2 
* 
*     DOWN; IGNORE ALL MESSAGES 
* 
DOWN. ISZ DSCRD 
      JMP EXIT
      SPC 2 
* 
*     PENDING; RESPOND IF MA MSG IN VALID RANGE 
* 
PEND. EQU * 
      ISZ DSCRD 
      LDA MAMSG 
      SZA,RSS       MA MESSAGE? 
      JMP EXIT      . NO FLUSH IT 
      LDA VR        NOW CHECK THAT
      JSB DECR         MESSAGE IS IN THE RANGE
      STA TMP             OF VR TO VR-1 
      LDA NS        VR >= NS >= (VR-1) ?
      JSB RANGE 
       DEF TMP      (LOWER BOUND) VR-1
       DEF VR       (UPPER BOUND) VR
      JMP EXIT      OUT OF RANGE - JUST FLUSH MSG 
* 
      LDA .UP 
      STA STATE     STATE:=UP 
      JSB RECVR     ADJUST VR 
      JSB ACK       ACKNOWLEDGE 
      JMP EXIT
      SPC 2 
*     NORMAL PROCESSING; CHANNEL IN 'UP' STATE
*     RECEIVE MSGS WITHIN RECV 'WINDOW' OTHERWISE DISCARD 
*     IF VR <= NS <= (VR+W+1) THEN RECV ELSE DISCARD
*     ACKNOWLEDGE MSGS WITHIN ACK 'WINDOW'
*     IF VA+1 <= NR <= VS THEN ACK; 
* 
UP.   EQU * 
      LDA MAMSG     CHECK FOR RR - IGNORE IF IT IS
      CPA .RR 
      JMP UP.2      CHECK FOR ACK PROCESSING
      LDA VR        CHECK FOR VALID RECEPTION 
      ADA W 
      ADA N2        VR+W-1
      JSB INCR      (THIS EXTRA -1+1 IS TO CATCH ROLLOVER)
      STA TMP 
      LDA NS
      JSB RANGE     TEST FOR WITHIN RANGE 
       DEF VR        VR     (LOWER BOUND) 
       DEF TMP       VR+W-1 (UPPER BOUND) 
      JMP UP.1      OUT OF RANGE - DISCARD
      LDA MAMSG     CHECK FOR CANCEL MESSAGE
      CPA .CAN         AND BYPASS INDIVIDUAL
      JMP RECV            CHECKS, SINCE CAN IS MULTIPLE 
* 
*--   SEQUENCE WITHIN WINDOW; BUT ALREADY RECEIVED? 
      LDA VR
      CMA,INA 
      ADA NS        OFFSET IN RECV. WINDOW = NS-VR
      SSA 
      ADA DIFF      ALLOW FOR ROLLOVER
      JSB POWER     CHANGE TO BIT POSITION (2**N) 
      AND VF        RECEIVE FLAGS 
      SZA,RSS       THIS MESSAGE ALREADY RECEIVED? (BIT = 1)
      JMP RECV      . NO RECEIVE IT 
UP.1  ISZ DSCRD     . YES DISCARD DUPLICATE 
      RSS 
RECV  JSB RECVR 
* 
UP.2  EQU * 
      LDA VA
      JSB INCR      VA+1
      STA TMP 
      LDA NR
      JSB RANGE     TEST FOR WITHIN RANGE 
       DEF TMP       VA+1 (LOWER BOUND) 
       DEF VS        VS   (UPPER BOUND) 
      RSS 
      JSB ACK       WITHIN WINDOW, ACKNOWLEDGE
      SKP 
*---------------------------------------------------------------+ 
*               EXIT ROUTINE                                    | 
*---------------------------------------------------------------+ 
EXIT  EQU * 
      LDA IDX       SET REMAINING DEBUG BITS
      LSL 12        ISOLATE MA INDEX (UPTO 16 NODES)
      IOR _MAZE 
      LDB G+#STR
      RBL 
      SSB 
      IOR BIT1      'REPLY' BIT 
      LDB MAMSG 
      SZB,RSS 
      IOR BIT2      'DATA MESSAGE'
      LDB DSCRD 
      CLE,ELB 
      SEZ 
      IOR BIT3      'MSG REQUEUED'
      SZB 
      IOR BIT4      'MESSAGE DISCARDED' 
      LDB FSCTR 
      SZB,RSS       FAILSAFE BEEN PASSED? 
      IOR BIT11     . YES INTERNAL ERROR !!!! 
      STA _MAZE 
* 
      STA MAERR+1 
      AND BADMA     INTERNAL ERROR? 
      SZA,RSS 
      JMP DBUG? 
      LDA .DOWN     AFTER CASTASTROPHIC ERROR 
      STA STATE        CHANGE STATE TO DOWN 
      JSB ITIME           AND SET IDLE TIMER TO 
      ISZ DIRTY              CAUSE RE-INITIALIZATION
      JSB EXEC      TELL QCLM INTERNAL ERROR !!!
       DEF *+8
       DEF CLS20
       DEF ZERO      (LU=0, NO ZBIT)
       DEF MAERR
       DEF .4        (ERROR LENGTH = 4) 
       DEF .9        (ERROR MSG 9)
       DEF ZERO 
       DEF #QCLM
       NOP
* 
DBUG? LDA #MAZE     DEBUG TRACE ENABLED?
      SZA,RSS       . YES 
      JMP UNLOK     . NO CONTINUE 
      JSB XLUEX     CLASS WRITE OF DEBUG RECORD 
       DEF *+8
       DEF CLS20
       DEF BIT15    LU=0
       DEF _MAZE    DATA RECORD = MA INFO 
       DEF .12       MA INFO LENGTH = 12
       DEF G        ZBUF = REQUEST BUFFER 
       DEF .15       REQUEST BUFFER LENGTH = 15 
       DEF #MAZE
       NOP
* 
UNLOK LDA DIRTY     CHECK IF ENTRY DIRTY
      SZA 
      JSB STORE     RESTORE ENTRY 
* 
      JSB RNRQ      ENABLE MESSAGE TABLE ACCESS 
       DEF *+4
       DEF CLR
       DEF #MARN
       DEF TMP       (DUMMY VAR FOR STATUS) 
       NOP
* 
      LDA DSCRD     IS MESSAGE TO BE DISCARDED? 
      SZA,RSS 
      JMP FLY       . NO RETURN TO P+2
      SSA           WAS THIS MSG REQUEUED?
      JMP FLY+1     . YES TAKE THE DISCARDED (P+1) EXIT 
* 
GULP  EQU *         'SWALLOW' MESSAGE 
      LDA #GRPM     CLASS NUMBER
      JSB RELEZ     RELEASE MESSAGE 
      SZA              IF SUCCESSFUL RETURN TO P+1
FLY   ISZ #MAPP     RETURN TO P+2 (MSG KEPT)
      JMP #MAPP,I 
      SKP 
*---------------------------------------------------------------+ 
*               #MAPP SUBROUTINES                               | 
*---------------------------------------------------------------+ 
      SPC 2 
* BEGIN-FETCH 
* FETCH-  FINDS AND UNPACKS CHANNEL RECORD (<A> = NODE) 
* 
FETCH NOP 
      STA NODE      NODE TO SEARCH FOR
      CLA 
      STA DIRTY     CLEAR 'DIRTY' BITS
      LDA .NON
      STA STATE     INIT STATE TO NON-MA
      LDB #MCTR     <B> = COUNT 
      STB MACTR     NUMBER OF MA ENTRIES
      LDA #MTBL     <A> --> MA TABLE
      ELA,CLE,ERA   CLEAR BIT15 -- DEBUG FLAG 
FLOOP STA 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
      LDB @REC,I    NODE NUMBER OF THIS ENTRY 
      CPB NODE      IS THIS THE ENTRY?
      JMP *+4       . YEP 
      ISZ MACTR     . NOP, BUMP COUNTER 
      JMP FLOOP          AND TRY AGAIN
      JMP FETCH,I   COULDN'T FIND ENTRY RETURN
* 
*--   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
* 
      LDA #MCTR 
      CMA,INA 
      INA 
      ADA MACTR     INDEX := MACTR - #MCTR + 1
      STA IDX 
      JMP FETCH,I 
      SPC 1 
MACTR NOP           NUMBER OF MA TABLE ENTRIES
@REC  DEF VT2       --> START OF PACKED RECORD
RECLN DEC 10        LENGTH OF MA ENTRY
.NON  DEC 1         NON-MA STATE
DIFF  OCT 077777    (SUBTRACTION) CONSTANT FOR WRAPAROUND 
OFFST OCT 100001    (ADDITION)    CONSTANT FOR WRAPAROUND 
      SPC 2 
* STORE-  PACKS AND RESTORES CHANNEL RECORD 
* 
STORE NOP 
      CLA 
      STA DIRTY     SET DIRTY BITS TO 'CLEAN' 
      CPA MACTR     CHECK FOR INVALID ENTRY 
      JMP STORE,I      AND RETURN IF NO GOOD
*--   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 
      SPC 2 
*---------------------------------------------------------------+ 
* POWER-  CONVERT NUMBER IN <A> TO BIT POSITION (2**N)          | 
*---------------------------------------------------------------+ 
POWER NOP 
      STB STORE     SAVE B
      AND B17       ONLY ALLOW 4 BITS 
      IOR SHIFT     FORMAT SHIFT INSTRUCTION
      STA *+2 
      CLA,INA       SET A TO 1
      DEF *-*       (MODIFIED TO LSL XX)
      SZA,RSS 
      CLA,INA       2**0 = 1
      LDB STORE 
      JMP POWER,I 
SHIFT LSL 16        'LSL' INSTRUCTION SKELETON
      SPC 2 
*---------------------------------------------------------------+ 
* ITIME-   SETS IDLE TIMER (VT2)                                | 
*---------------------------------------------------------------+ 
ITIME NOP 
      LDB VT2 
      LDA TMAX      SET IDLE TIMER (VT2)
      ARS,ARS          TO TMAX/4
      SZA,RSS             UNLESS LESS THAN 4
      INA                     THEN SET TO 1 
      SZB,RSS                    UNLESS ALREADY RUNNING 
      STA VT2 
      JMP ITIME,I 
      SPC 2 
*---------------------------------------------------------------+ 
* FLUSH-   CLEARS OUT ANY MSGS IN MA HOLD QUEUE (KEY IN IDENT)  | 
*---------------------------------------------------------------+ 
FLUSH NOP 
      CLA,INA 
      STA VS
      STA VR
      LDA W         SETUP TO CLEAR HOLD QUEUE 
FL1   STA VA
      LSL 12
      IOR IDX       FORM MA IDENTIFIER
      STA IDENT 
      JSB FIND      SEARCH IN HOLD QUEUE
      JMP FL2       NOT FOUND CONTINUE
      LDA #MAHC 
      JSB RELEZ     FOUND  - RELEASE MSG
      JSB FIND      NOW LOOK FOR A DUPLICATE! 
      JMP FL2 
      LDA _MAZE 
      IOR BIT9      << DUPLICATE MSG IN HOLD QUEUE! >>
      STA _MAZE 
      JMP *-7       CLEAR HIM 
FL2   LDA VA
      CPA VS        ALL DONE? 
      JMP FLUSH,I   . YEP  VS=VA=VR=1  !!! (IMPORTANT)
      ADA N1
      JMP FL1 
      SPC 2 
*---------------------------------------------------------------+ 
* RECVR-  RECEIVE MSG PROCESSING   VR+W <--- NS ---> VR         | 
*---------------------------------------------------------------+ 
      BSS 1         (STORAGE) 
RECVR NOP 
      LDA MAMSG     CHECK FOR CANCEL MESSAGE
      CPA .CAN      CANCEL? 
      RSS           . YES SET VC
      JMP RECV2     . NO ADJUST VR
      LDA NS
      JSB INCR
      STA RECVR-1   NEW VR:=NS+1
RECV1 LDA VR
      CPA RECVR-1   CANCELED ALL MSGS?
      JMP RECV3     . YES 
      JSB INCR      . NO BUMP TO NEXT VR
      STA VR
      LDB VF
      LDA VC
      LSR 1         SHIFT FLAGS (VC & VF) OVER 1
      XOR BIT15     VC IS OPPOSITE OF VF
      STB VF
      STA VC
      JMP RECV1 
RECV2 EQU * 
      LDA VR
      CMA,INA 
      ADA NS         (NS-VR)
      SSA 
      ADA DIFF       ALLOW FOR ROLLOVER 
      JSB POWER      2 ** (NS-VR)  IE., BIT POSITION
      IOR VF         SET RECEIVE BIT
      STA VF
RECV3 EQU * 
      LDB VF         THIS MSG RECEIVED? 
      SLB,RSS 
      JMP RECVR,I    . NO NOT YET RECEIVED
      LDA VR         . YES, NEXT EXPECTED VR
      JSB INCR          RECEIVED; BUMP
      STA VR               VR & SHIFT FLAGS OVER
      LDA VC
      ERB,CLE,ELB    CLEAR LSB - VC(15) WILL = 0
      LSR 1          SHIFT VF & VC OVER 1 
      STB VF
      STA VC
      JMP RECV3 
      SPC 2 
*---------------------------------------------------------------+ 
* ACK-    PERFORMS ACK PROCESSING    VS <--- NR ---> VA+1       | 
*---------------------------------------------------------------+ 
ACK   NOP 
      LDA _MAZE 
      IOR BIT7      MSG BEING ACK'ED
      STA _MAZE 
      CLA 
      STA LERC      CLEAR LAST REPORTED ERROR 
      STA LERN
*--   RETRANSMIT ANY CANCEL ACKS (VA TO NR-1) 
      LDA VA        <A> = VA
      LDB NR        <B> = NR
      JSB REXMT 
* 
*     ADJUST VA; RELEASE ANY ACKNOWLEDGED SLAVE MESSAGES; 
*     AND (IF REQUEST) SET BIT IN TCB.
* 
      LDA NC
      STA CFLAG 
      LDA NR
      STA TMP 
      LDA N17       << SETUP FAILSAFE >>
      STA FSCTR 
ACK1  EQU * 
      LDA TMP 
      CPA VA        ALL ACKNOWLEDGEMENTS PROCESSED? 
      JMP ACK2      . YES 
      ISZ FSCTR 
      RSS 
      JMP ACK2      << FAILSAFE EXIT >> 
      JSB DECR      NR:=NR-1
      STA TMP 
      LSL 12
      IOR IDX       FOR UNIQUE MA IDENTIFIER
      STA IDENT 
      LDA CFLAG 
      CLE,ELA       CANCEL BIT TO <E> AND 
      STA CFLAG        SHIFT CANCEL FLAGS OVER
      SEZ           CANCEL ACKED? 
      JMP ACK1      . YES ALREADY TAKEN CARE OF...
* 
      JSB #RSAX     TRY TO FIND MASTER TCB
       DEF *+3          AND INDICATE IT WAS ACKED 
       DEF .12             OTHERWISE LOOK FOR SLAVE 
       DEF IDENT              MESSAGE.
      SSB,RSS       MASTER FOUND? 
      JMP ACK1      . YES 
* 
      JSB FIND      . NO LOOK FOR SLAVE 
      JMP ACK1      HO HUMM... CAN'T FIND HIM 
      LDA #MAHC 
      JSB RELEZ     HURRAH! FOUND HIM! NOW DUMP HIM 
      JMP ACK1
* 
ACK2  EQU * 
      LDA NR
      STA VA        VA:=NR
* 
*     IF NO UNACKNOWLEDGED MESSAGES CLEAR ACK TIMER (VT1) 
* 
      LDB TMAX
      CPA VS        VS=VA?
      CLB           . YES NO UNACK MSGS, CLEAR TIMER
      STB VT1       . NO MORE TO ACK; RESET TIMER 
      CLB 
      STB VCC       RESET CONSEQUTIVE CANCEL COUNTER
      JMP ACK,I     UND RETURN
      SPC 2 
*---------------------------------------------------------------+ 
* REXMT-  RETRANSMITS CANCEL ACKNOWLEDGEMENTS                   | 
*            FROM U-1 DOWNTO (AND INCLUDING) L                  | 
*         <A> = LOWER BOUND (L)   <B> = UPPER BOUND (U)         | 
*---------------------------------------------------------------+ 
REXMT NOP 
      DST RL
      LDA NC        GET CANCEL FLAGS (NC) 
      JMP REX1+2
* 
REX1  LDA CFLAG     ADJUST FOR NEXT CANCEL FLAG 
      CLE,ELA       SHIFT LEFT
      STA CFLAG 
      SZA,RSS       ANY MORE CANCEL FLAGS?
      JMP REXMT,I   . NO ALL DONE 
      LDA RU
      CPA RL        END OF WINDOW?
      JMP REXMT,I   . YEP ALL DONE
* 
      LDA RU
      JSB DECR      U-1 
      STA RU        U:= U-1 
      LSL 12        FORM UNIQUE MA IDENTIFIER 
      IOR IDX       MA TABLE INDEX
      STA IDENT 
      LDA CFLAG     NC
      SSA,RSS       CANCEL ACKNOWLEDGEMENT? 
      JMP REX1      . NO TRY NEXT BIT 
      LDA _MAZE 
      IOR BIT8      INDICATE CANCEL ACK RECEIVED
      STA _MAZE 
* 
      JSB #RSAX     SEARCH FOR MASTER TCB 
       DEF *+3
       DEF .11       MODE 11
       DEF IDENT     MA SEQUENCE #
      SSB           TCB FOUND?
      JMP REX2      . NO LOOK IN SLAVE LIST 
* 
      ADB .2        . YES, <B> --> SEQUENCE NUMBER (TCB+2)
      JSB LODWD     GET SEQUENCE NUMBER FOR LU MAPPING
      STA TMP           AND SAVE FOR LATER
      INB           <B> --> MASTERS CLASS (TCB+3) 
      JSB LODWD 
      ELA,CLE,ERA   CLEAR NO WAIT BIT 
      STA CLASS     SAVE CLASS
      LSL 3         CLEAR UPPER 3 BITS
      SZA,RSS       IF CLASS = 0 THEN 
      JMP REX1         BYPASS MASTER RETRANSMISSION 
* 
      JSB XLUEX     CLASS WRITE/READ TO MASTER
       DEF *+8
       DEF CLS20
       DEF BIT15     (LU=0) BYPASS SESSION SST
       DEF ZERO      (DATA BUFFER)
       DEF ZERO      (DATA LENGTH)
       DEF TMP       MESSAGE SEQUENCE # (FOR LU MAPPING)
       DEF .1        LENGTH = 1 FOR MASTER RETRY REQUEST
       DEF CLASS     MASTERS CLASS
       NOP
      SZA           SUCCESSFUL WRITE? 
      JMP REX1      . NO TRY NEXT BIT 
      LDA _MAZE     . YES SET 
      IOR BIT6         'RESENDING MASTER' BIT 
      STA _MAZE 
      JMP REX1
* 
REX2  EQU *         TRY TO FIND SLAVE TRANSMISSION & RETRANSMIT 
      JSB FIND
     JMP REX1      MSG NOT FOUND... CONTINUE
* 
      JSB #GETR     GET ZBUF INTO LOCAL BUFFER
       DEF *+8          FOR MODIFICATION
       DEF #MAHC
       DEF RQB       ZBUF 
       DEF P#MAC     ZBUF LENGTH DESIRED
       DEF ZERO      DATA BUF 
       DEF ZERO      DATA BUF LENGTH DESIRED
       DEF RANGE     (NOT USED) 
       DEF TMP       LLU WORD 
       NOP           ERROR - IGNORE 
      INA 
      STA CTR       OFFSET OF LLU WORD
      CLE 
      LDA TMP       BUMP RETRY COUNT (BITS 12-15) 
      ADA BIT12 
      IOR BIT11     SET MA ASSIGNMENT BIT (BIT11) 
      STA TMP 
      SEZ           TOO MANY RETRYS ( >15)? 
      JMP REX3      . YES JUST RELEASE MSG
* 
      JSB #PUTR     REPLACE LLU WORD
       DEF *+3
       DEF CTR       OFFSET OF LLU WORD 
       DEF TMP       NEW LLU
       NOP           ERROR - IGNORE 
* 
      LDA VS
      STA RQB+#MAS  NS
      JSB INCR      VS:=VS+1
      STA VS
      LDA VR
      STA RQB+#MAR  NR
      LDA VC
      STA RQB+#MAC  NC
* 
      JSB #NRVS     FIND LU OF THIS NODE
       DEF *+2
       DEF NODE 
       NOP
      IOR BIT15     BYPASS SESSION SST
      STA LU
* 
      LDA _MAZE 
      IOR BIT5      'RESENDING SLAVE' BIT 
      STA _MAZE 
* 
      JSB #NQUE     FINALLY! RESEND SLAVE 
       DEF *+9
       DEF CLS20     WRITE/READ 
       DEF LU 
       DEF ZERO 
       DEF ZERO 
       DEF RQB       ZBUFFER OVERLAY
       DEF P#MAC     ZBUF OVERLAY LENGTH
       DEF #GRPM     (DESTINATION CLASS #)
       DEF #MAHC     (SOURCE CLASS #) 
       RSS
      JMP REX1
      DST MAERR+2     SAVE ERROR CODES
      LDA _MAZE 
      IOR BIT10       << REQUE ERROR ! >> 
      STA _MAZE 
      JMP REX1
* 
REX3  LDA #MAHC 
      JSB RELEZ     RELEASE MSG - CHANNEL BUSY
      JMP REX1
* 
CFLAG BSS 1         CANCEL FLAG 
RL    BSS 1         LOWER LIMIT OF SEQUENCE # 
RU    BSS 1         UPPER LIMIT OF SEQUENCE # 
      SPC 2 
*---------------------------------------------------------------+ 
* RANGE-    IF P1 <= <A> <= P2 RETURN TO P+2 ELSE P+1           | 
*---------------------------------------------------------------+ 
      BSS 1         (STORAGE) 
RANGE NOP 
      STA RANGE-1 
      DLD RANGE,I   GET PARAMETER ADDRESSES 
      ISZ RANGE 
      ISZ RANGE 
      LDA A,I       GET LOWER BOUND (P1)
      LDB B,I       GET UPPER BOUND (P2)
      STA LO
      CMA,INA       TEST FOR LOWER BOUND <= UPPER 
      ADA B 
      SSA,RSS 
      JMP RANG2     LOWER BOUND <= UPPER (NO ROLLOVER)
*--   PUSH WINDOW BEYOND "WRAP AROUND" POINT
      LDA RANGE-1   PUSH TEST ITEM
      ADA W 
      SSA           CHECK FOR WRAP AROUND 
      ADA OFFST 
      STA RANGE-1 
      LDA LO        PUSH LOWER LIMIT
      ADA W 
      SSA 
      ADA OFFST     ADJUST FOR (POTENTIAL) ROLLOVER 
      ADB W         PUSH UPPER LIMIT
      SSB 
      ADB OFFST     ADJUST FOR (POTENTIAL) ROLLOVER 
      RSS 
RANG2 LDA LO
      CMA,INA 
      ADA RANGE-1 
      SSA 
      JMP RANGE,I   TOO LOW - RETURN P+1
      CMB           TEST FOR <= P2 (UPPER LIMIT)
      ADB RANGE-1 
      SSB,RSS       OK? 
      JMP RANGE,I   TOO HI - RETURN P+1 
      ISZ RANGE     GOOD RETURN - P+2 
      JMP RANGE,I 
LO    BSS 1 
      SPC 2 
*---------------------------------------------------------------+ 
*     LOAD WORD FROM SAM; <B> -->SAM                            | 
*---------------------------------------------------------------+ 
LODWD NOP 
DMS4  JMP *+4       NOP IF DMS
      XLA B,I 
      RSS 
      LDA B,I 
      JMP LODWD,I 
      SPC 2 
*---------------------------------------------------------------+ 
* INCR/DECR - INCREMENTS/DECREMENTS <A> AND ALLOWS FOR ROLLOVER + 
*---------------------------------------------------------------+ 
INCR  NOP 
      INA 
      SSA 
      ADA OFFST     ALLOW FOR ROLLOVER
      JMP INCR,I
* 
DECR  NOP 
      ADA N1
      SZA,RSS 
      LDA DIFF      ALLOW FOR ROLLOVER
      SSA 
      ADA DIFF
      JMP DECR,I
      SPC 2 
*---------------------------------------------------------------+ 
* FMT-   FORMATS MA MESSAGE BUFFER (STREAM ZERO ONLY)           | 
*---------------------------------------------------------------+ 
FMT   NOP           FORMAT MA MESSAGES
      CLA 
      STA RQB       ZERO BUFFER 
      LDA @RQB
      LDB A 
      INB 
      JSB .MVW
       DEF RQBLN
       NOP
      LDA BIT12     STREAM WORD 
      STA RQB+#STR
      LDA #NODE     SOURCE NODE 
      STA RQB+#SRC
      LDA NODE      DESTINATION NODE
      STA RQB+#DST
      LDA #LEVL     UPGRADE LEVEL 
      STA RQB+#LVL
      LDA #MHCT     SET HOP COUNT 
      STA RQB+#HCT
      LDA VS
      JSB DECR      VS-1
      STA RQB+#MAS  NS
      LDA VR
      STA RQB+#MAR  NR
      LDA VC
      STA RQB+#MAC  NC
      CCA           MA INDICATOR
      STA RQB+#REP
      LDA BIT11     SET MA ASSIGNMENT BIT 
      STA RQB+#REP+1+#LSZ   (BIT11) IN LLU WORD 
      JMP FMT,I 
      SPC 2 
*---------------------------------------------------------------+ 
* SEND-     SENDS MA MESSAGE ACROSS CHANNEL (LU FROM NRV)       | 
*---------------------------------------------------------------+ 
      BSS 1         (STORAGE) 
SEND  NOP 
      JSB #NRVS     FIND LU 
       DEF *+2
       DEF NODE 
       NOP
      IOR BIT15     BYPASS SESSION SST
      STA LU
* 
      LDA #GRPM     SET THE 'NO 
      IOR BIT15                 WAIT' 
      STA SEND-1          BIT!!!
* 
      JSB XLUEX     SEND MESSAGE (CLASS WRITE/READ) 
       DEF *+8
       DEF CLS20
       DEF LU 
       DEF ZERO 
       DEF ZERO 
@RQB   DEF RQB
       DEF RQBLN
       DEF SEND-1   GRPM'S CLASS NUMBER 
       NOP
      JMP SEND,I
      SPC 2 
*---------------------------------------------------------------+ 
* FIND-   FIND SLAVE MSG, RETURN P+1 NOT FOUND, P+2 FOUND.      | 
*---------------------------------------------------------------+ 
FIND  NOP 
      JSB #NQUE     FIND SLAVE MSG - KEY IN 'IDENT' 
       DEF *+9
       DEF N40       (SEARCH) 
       DEF BIT15     (LU=0 AND DOUBLE WORD CONWD) 
       DEF IDENT     (SEARCH KEY) 
       DEF N#MAS     (1'S COMPLEMENT OFFSET IN ZBUF)
       DEF ZERO 
       DEF ZERO 
       DEF #MAHC     (DESTINATION CLASS)
       DEF #MAHC     (SOURCE CLASS) 
       JMP FIND,I    RETURN TO P+1  - NOT FOUND 
      ISZ FIND
      JMP FIND,I    RETURN TO P+2 - FOUND 
      SPC 2 
*---------------------------------------------------------------+ 
* RELEZ-  RELEASES MSG FROM CLASS QUEUE; <A> = CLASS            | 
*---------------------------------------------------------------+ 
      BSS 1         (STORAGE) 
RELEZ NOP 
      STA RELEZ-1   SAVE CLASS #
      LDA #PLOG 
      SZA,RSS       IS LOGGING ENABLED??? 
      JMP RELE2     . NO GULP MESSAGE 
* 
RELE1 JSB #RQUE     . YES REQUEUE TO PLOG 
       DEF *+9
       DEF CLS20     WRITE/READ 
       DEF BIT15     (LU=0 AND DOUBLE WORD CONWD) 
       DEF ZERO 
       DEF ZERO 
       DEF ZERO 
       DEF ZERO 
       DEF #PLOG     (DESTINATION CLASS)
       DEF RELEZ-1   (SOURCE CLASS) 
       CCA,RSS      ERROR RETURN
      CLA           SUCCESSFUL RETURN 
      JMP RELEZ,I   ... UND RETURN
* 
RELE2 LDA RELEZ-1 
      ALR,RAR       ZERO BIT 14 (AND 15)
      STA RELEZ-1 
* 
      JSB EXEC      DO CLASS GET TO DE-ALLOCATE MSG 
       DEF *+5
       DEF CLS21
       DEF RELEZ-1   CLASS NUMBER 
       DEF ZERO 
       DEF ZERO 
       CCA,RSS      ERROR RETURN
      CLA           SUCCESSFUL RETURN 
      JMP RELEZ,I   ... UND RETURN
      SKP 
*---------------------------------------------------------------+ 
*               CONSTANTS                                       | 
*---------------------------------------------------------------+ 
A     EQU 0 
B     EQU 1 
* 
BIRTH OCT 000001    START OF NUMBER SEQUENCE (1-77777B) 
CLS20 DEF 20,I
CLS21 DEF 21,I      CLASS GET 
W     DEC 15        MAX # OUTSTANDING MSGS / CHANNEL
"DS"  ASC 1,DS
"00"  ASC 1,00
DS053 OCT 123       ENCRYPTED DS05(3) 
"06"  ASC 1,06
"08"  ASC 1,08
BIT12 OCT 010000
BIT14 OCT 040000
BIT15 OCT 100000    NOTE! THESE TWO WORDS MUST STAY 
CONWD OCT 010100    TOGETHER !!!!!!! ('BIT15' & 'CONWD')
B17   OCT 17
P#MAS ABS #MAS+1
N#MAS ABS -#MAS-1   1'S COMPLEMENT OFFSET 
P#MAC ABS #MAC+1
P#MHD ABS #MHD+1
N1    DEC -1
N2    DEC -2
N17   DEC -17 
N40   DEC -40 
.1    DEC 1 
.2    DEC 2 
.3    DEC 3 
.4    DEC 4 
.9    DEC 9 
.11   DEC 11
.12   DEC 12
.15   DEC 15
RQBLN ABS #REP+2+#LSZ 
CLR   OCT 040004
LK    OCT 040001
*                                   MA DEBUG BITS (WHEN SET)
BIT0  OCT 0001      . INBOUND 
BIT1  OCT 0002      . REPLY 
BIT2  OCT 0004      . DATA MESSAGE
BIT3  OCT 0010      . MESSAGE REQUEUED
BIT4  OCT 0020      . MESSAGE DISCARDED 
BIT5  OCT 0040      . RESENDING SLAVE MSG 
BIT6  OCT 0100      . RESENDING MASTER REQUEST
BIT7  OCT 0200      . ACK BEING PROCESSED 
BIT8  OCT 0400      . CANCEL ACK RECEIVED 
BIT9  OCT 1000      . << DUPLICATE MSG IN #MAHC !!! >>
BIT10 OCT 2000      . << REQUEUE ERROR !!! >> 
BIT11 OCT 4000      . << WINDOW SCREWED UP !!! >> 
BADMA OCT 7000      INTERNAL ERROR CONDITIONS 
* 
*                                   MA MESSAGE VALUES 
.RR   OCT 01        . RECEIVER READY
.INIT OCT 02        . INITIALIZE REQUEST
.IR   OCT 04        . INITIALIZE RESPONSE 
.CAN  OCT 10        . MESSAGE CANCEL
.NR   OCT 20        . NO RESPONSE 
* 
*                                   MA STATE VALUES 
.DOWN OCT 0         . DOWN
.UP   OCT 2         . UP
.PEND OCT 3         . PENDING 
      SPC 2 
*---------------------------------------------------------------+ 
*               STORAGE                                         | 
*---------------------------------------------------------------+ 
CKDMS NOP           CONFIGURE IF DMS (ROUTINE OVERLAYED)
      CLA 
      CCB 
      ADB CKDMS     ADDRESS OF CALL 
      STA B,I       NOP CALL
      LDB $OPSY 
      RBR,SLB       DMS?
      RSS 
      JMP CKDMS,I   . NO RETURN 
      STA DMS1
      STA DMS2
      STA DMS4
      JMP CKDMS,I   RETURN (END-CKDMS)
* 
*     START OF OVERLAY
* 
      ORG CKDMS 
*                                   (UNPACKED) MA TABLE BLOCK 
LINK  BSS 1         . ADDRESS OF ENTRY
MAERR EQU *         . MA INTERNAL ERROR MSG BLOCK 
NODE  BSS 1         . NODE # OF CHANNEL 
      BSS 3         . DEBUG INFORMATION 
IDX   BSS 1         . INDEX INTO MA TABLE 
DIRTY BSS 1         . DIRTY BITS
STATE BSS 1         . CHANNEL STATE 
TMAX  BSS 1         . MAX TIMEOUT TICKS 
_MAZE BSS 1         . DEBUG 
VS    BSS 1         . SEND SEQUENCE # 
.TBL  EQU *         WORD ZERO OF MESSAGE TABLE 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 
*                                   END-MA TABLE BLOCK
TMP   BSS 1 
CTR   BSS 1 
RD.WC BSS 1         READ/WRITE COMPLETION (0/1) 
FSCTR BSS 1         FAILSAFE ...
OLDVA BSS 1 
OLDVS BSS 1 
MAMSG BSS 1 
DSCRD BSS 1         0=RTN P+2, -=RTN P+1, +=DO GET & RTN P+1
LU    BSS 2 
IDENT BSS 1 
LLU   BSS 1         LAST LU WORD FROM LOCAL APPENDAGE 
NS    BSS 1 
NR    BSS 1 
NC    BSS 1 
CLASS BSS 1 
RQB   BSS #REP+3+#LSZ    REQUEST BUFFER 
* 
SIZE  EQU *         PROGRAM SIZE
      END 
                                                                                                                                                                                                        