ASMB,R,Q,C
      HED <#MAAS> ASSIGN MA VARIABLES * (C) HEWLETT-PACKARD CO. 1980
      NAM #MAAS,7 91750-1X015 REV 2013 800725 ALL (MA)
      ENT #MAAS 
      EXT #MARL,#MCTR,#MARN,#MTBL,$OPSY,#NODE 
      EXT $LIBR,$LIBX,.MVW,.ENTR,RNRQ,.LDX
******************************************************************
*  * (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 
*         #MAAS 
*         ------- 
*     SOURCE: 91750-18015 
*     RELOC:  91750-16015 
*     PGMR:   TOM MILNER 11.01.79 
* 
*     ASSIGNS MESSAGE ACCOUNTING (MA) SEQUENCE VARIABLES TO 
*     THE REQUEST/REPLY BUFFER. 
* 
*     CALL FORMAT:
*                   JSB #MAAS 
*                   DEF *+3 
*                   DEF REQUEST/REPLY BUFFER
*                   DEF REQUEST/REPLY BUFFER LENGTH 
*                < ERROR RTN - <B> CONTAINS ERROR CODE >
*                < GOOD  RTN - <A> = UNIQUE MA IDENTIFIER > 
* 
*     THE '#MAAS' ALGORITHM (IN PASCAL) HAS BEEN APPENDED TO
*     THE MA ERS FOR THE READER'S AMUSEMENT.  #MAAS'S OPERATION IS
*     AS FOLLOWS: 
* 
*         1. ACCESS TO THE MA TABLE IS LOCKED (BY RN).
*         2. IF THE MESSAGE IS A REPLY THE SOURCE NODE IS USED FOR
*            THE SEARCH KEY IN (3.), OTHERWISE THE DESTINATION NODE 
*            IS USED. 
*         3. THE ENTRY WITH THE DESIRED NODE (FROM 2.) IS SEARCHED
*            FOR IN THE MA TABLE AND MOVED INTO A LOCAL BUFFER FOR
*            EASIER ADDRESSING. 
*         4. IF THE CHANNEL IS... 
*              UP OR PENDING :
*                   MA VARIABLES ARE ASSIGNED TO THE REQUEST BUFFER 
*                   AS LONG AS THE RETRY COUNT AND MAX OUTSTANDING
*                   MESSAGES ARE NOT EXECEEDED. 
*              DOWN  :
*                   THE ABOVE PROCEDURE IS EXECUTED AND THE 
*                   CONTROL WORD IS MODIFIED TO ADDRESS LU ZERO.
*              NONMA :
*                   THE MA HEADER IS SET TO ZEROS.
*         5. THE CHANNEL RECORD IS RESTORED (IF ANY CHANGES OCCURED) TO 
*            THE MA TABLE AND THE RESOURCE NUMBER IS UNLOCKED.
      SKP 
*GLBLK-START
* 
******************************************************************
*                                                                *
*     G L O B A L   B L O C K               REV XXXX 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
      SKP 
      SUP 
RQBUF NOP           ADDRESS OF REQUEST BUFFER 
RQLEN NOP           ADDRESS OF REQUEST BUFFER LENGTH
CONWD NOP           ADDRESS OF CONTROL WORD (LU)
      SPC 1 
#MAAS NOP 
      JSB .ENTR     GET PARAMETER 
      DEF RQBUF 
      JSB CKDMS     ONE-TIME CHECK FOR DMS; 'NOP'ED 
      LDA #MCTR     
      SZA           MA INITIALIZED IN SYSTEM? 
      JMP WAIT      . YES 
      ISZ #MAAS     . NO, RETURN IMMEDIATELY
      JMP #MAAS,I 
* 
*     LOCK ACCESS TO MA TABLE.
* 
WAIT  JSB RNRQ      WAIT FOR ACCESS TO TABLE
      DEF *+4 
      DEF LK
      DEF #MARN     (MA RESOURCE NUMBER)
      DEF FETCH     (TEMP STORAGE FOR STATUS) 
      NOP 
* 
*     GET NODE NUMBER BASED ON REPLY BIT
* 
      LDB RQBUF 
      ADB C#STR     <B> --> STREAM
      LDA B,I       CHECK FOR REQUEST OR REPLY
      RAL,ELA       <E> = REPLY BIT 
      LDB C#SRC     <B> --> SOURCE NODE IF REPLY
      SEZ,RSS 
      LDB C#DST     <B> --> DESTINATION NODE IF REQUEST 
      ADB RQBUF 
      LDA B,I       GET NODE
      JSB FETCH     FIND MA TABLE ENTRY 
      LDA STATE 
      CPA .NON
      JMP NOMA  
* 
*     ASSIGN MA VARIABLES TO MESSAGE HEADER 
* 
ASIGN EQU * 
      CLB,INB 
      ADB RQBUF 
      ADB RQLEN,I   <B> -->RETRY BITS 
      LDA B,I 
      IOR BIT11     SET MA ASSIGNMENT BIT 
      ADA BIT12     RETRY := RETRY + 1
      STA B,I 
      ALF 
      AND B17       ISOLATE RETRY COUNTER 
      SZA,RSS       OVER 15 RETRIES?
      JMP DS05      . YEP TOO BAD...
      CMA,INA 
      ADA #MARL     RETRIES > MAX ? 
      SSA 
      JMP DS05      . TOO MANY RETRIES
*--   IF VS > (VA+W) THEN CHANNEL SATURATED 
      LDA VA        FIRST CHECK FOR ROLLOVER POINT
      STA TMP 
      CMA,INA 
      LDB VS
      ADA B         (VS-VA) 
      SSA,RSS       IF VS >= VA THEN
      JMP *+7          OK 
      LDA TMP       ELSE BUMP VS & VA BEYOND ROLLOVER 
      ADA W 
      SSA 
      ADA OFFST     ROLLOVER
      STA TMP 
      ADB W 
* 
      LDA TMP       VA
      ADA W         VA+W
      CMA,INA 
      ADA B         VS-(VA+W) 
      SSA,RSS       CHANNEL SATURATED?
      JMP DS08      . YES, EXCEEDS MAX MSGS FOR THIS CHANNEL
* 
      ISZ DIRTY     SET "DIRTY" BIT 
      LDB RQBUF     
      ADB C#MAS     <B> --> NS
      LDA VS
      STA B,I 
      STA IDENT     SAVE SEQUENCE # 
      INA           VS := VS + 1
      SSA           ROLLOVER? 
      ADA OFFST 
      STA VS        SET NS
      INB           <B> --> NR
      LDA VR
      STA B,I       SET NR
      INB           <B> --> NC
      LDA VC
      STA B,I       SET NC
* 
      LDA IDENT     FORM UNIQUE MA IDENTIFIER 
      LSL 12        ISOLATE LOWER 4 BITS
      IOR IDX       MA TABLE INDEX
      STA IDENT     UNIQUE MA MESSAGE IDENTIFIER
      ISZ #MAAS     GOOD RETURN (P+2) 
      LDA STATE 
      CPA .DOWN 
      RSS 
      JMP EXIT
* 
*     IF CHANNEL DOWN (DISCONNECTED) SET #MAS TO
*     INVALID VALUE (-1). 
* 
      LDB C#MAS 
      ADB RQBUF     <B> -->  MAS
      CCA           SET INITIALIZATION  
      STA B,I          INDICATOR (MAS = -1) 
      JMP EXIT
* 
DS05  LDB C#ECQ 
      ADB RQBUF 
      LDA B,I 
      AND BM360     CLEAR QUALIFIER BITS
      IOR Q2        SET QUALIFIER (2) 
      STA B,I 
      LDB "05"      TOO MANY RETRIES - SIMULATE TIMEOUT 
      JMP EXIT
DS08  LDB C#ECQ 
      ADB RQBUF 
      LDA B,I 
      AND BM360     CLEAR QUALIFIER BITS
      IOR Q1        SET QUALIFIER (1) 
      STA B,I 
      LDB "08"      CHANNEL IS SATURATED - RETURN BUSY ERROR
      JMP EXIT
* 
NOMA  EQU *         CLEAR MA REQUEST AREA 
      ISZ #MAAS     GOOD RETURN (P+2) 
* 
*     RESTORE MA VARIABLES IF ENTRY HAS BEEN MODIFIED 
* 
EXIT  EQU * 
      STB IDENT+1 
      LDA DIRTY     SEE IF MA ENTRY HAS BEEN MODIFIED 
      SZA 
      JSB STORE 
* 
      JSB RNRQ      UNLOCK MA TABLE 
      DEF *+4 
      DEF UNLK
      DEF #MARN     (MA RESOURCE NUMBER)
      DEF FETCH     (DUMMY LOCATION)
      NOP 
* 
      DLD IDENT     <A> = UNIQUE MA MSG IDENTIFIER
      JMP #MAAS,I   RETURN
      SKP 
* BEGIN-FETCH 
* FETCH-  FINDS AND UNPACKS CHANNEL RECORD (<A> = NODE)  10.01.79 
* 
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
      SZB,RSS       ZERO ENTRIES? 
      JMP FETCH,I   . YES NO USE HUNTIN' AROUND 
      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 .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' 
      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 
*-----------------------------------------------------------
*               CONSTANTS 
*-----------------------------------------------------------
A     EQU 0 
B     EQU 1 
* 
.DOWN OCT 0 
LK    OCT 040001
UNLK  OCT 040004
W     DEC 15        MAX # OUTSTANDING MSGS / CHANNEL
B17   OCT 000017    ISOLATE RETRY COUNTER 
BM360 OCT 177417
Q1    OCT 000020
Q2    OCT 000040
BIT11 OCT 004000
BIT12 OCT 010000
BIT14 OCT 040000
C#STR ABS #STR
C#SRC ABS #SRC
C#DST ABS #DST
C#MAS ABS #MAS
C#ECQ ABS #ECQ
"05"  ASC 1,05
"08"  ASC 1,08
      SPC 1 
*-----------------------------------------------------------
*               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
      JMP CKDMS,I   RETURN (END-CKDMS)
* 
OVRSZ EQU *-CKDMS   OVERLAY SIZE
* 
*     START OF OVERLAY
* 
      ORG CKDMS 
*                                   LOCAL MESSAGE TABLE BLOCK 
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 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 
* 
TMP   BSS 1 
IDENT BSS 2 
* 
SIZE  EQU *         PROGRAM SIZE
      END 
                                                                              