; ; ROUTEMAC.MAR ; ; INLAND STEEL ; PROCESS AUTOMATION DEPT. ; 3210 WATLING ST. MS 2-465 ; EAST CHICAGO, IN 46312 ; ; DATE OF LAST UPDATE: 6/28/88 ; ; ; The following macros define Message ID's, Node ; names and buffers used in defining the ; routing database. ; ; ; MODIFICATION HISTORY: ; ; E. LAKIA (IPACT) 6/26/88 ; Pad out short node names ; ; E. LAKIA 2/25/87 ; Added the revision and flag word to the beginning of ; the database. ; ; E. Lakia 2/23/87 ; Added support for the Logical type mode name within ; the NRB. ; ; ; macro for defining buffer requirements ; .MACRO RTBUFDEF,- MAX_OUT_MSG_SIZE=1024,- MAX_OUT_MSG_COUNT=10,- RESP_BUF_COUNT=0 VERSION==^X20001 ; Must change this and also the ; MA_ROUTER include file !!!!! ; This is used to verify compatible versions ; of the software. ; ; UPPER WORD= RELEASE, LOWER WORD=VERSION ; ; THE FOLLOWING EQUATE MUST AGREE WITH THE FOLLOWING OTHER FILES: ; NRBDEF.MAR ; NRBDEF.TXT ; NRBDEF ; DEFINE NRB OFFSETS NET_MBX_SIZE==128 ; SIZE OF THE NETWORK MAILB BOX BUFFER ; RESP_COUNT=RESP_BUF_COUNT .IIF EQ RESP_BUF_COUNT, RESP_COUNT=MAX_OUT_MSG_COUNT .IIF LE MAX_OUT_MSG_COUNT, .ERROR ;INVALID MAX_OUT_MSG_COUNT SPECIFIED .IIF LT , MAX_OUT_MSG_COUNT=2 ; ; ALLOCATE RESPONSE AND OUTPUT BUFFERS ; .LIBRARY /MA_Q$DEF:QUEUE.MLB/ .MCALL RSPDEF ; RESPONSE BUFFER DEFINITION RSPDEF ; DEFINE SIZE OF RESPONSE BUFFERS .SAVE_PSECT .PSECT Z_ROUTER_BUFFERS,CON,NOEXE,PAGE ; ; RESPONSE BUFFERS ; RSP_BUFRS: ALLC=/4 ; MAKE COUNT EVEN BY 4 .LONG ALLC*4 ; NUMBER ALLOCATED .BYTE 0[ALLC*4] ; IN USE FLAG ; ; BUILD ADDRESS TABLE TO RESPONSE BUFFERS ; I=0 .REPT ALLC*4 .LONG + I=I+1 .ENDR ; ; ACTUAL RESPONSE BUFFERS ; RSP_BUF: .REPT ALLC*4 ; NUMBER ALLOCATED .BYTE 0[RESP_BUF_SIZE] ; ALLOCATE ACTUAL BUFFER .ENDR ; ; OUTPUT BUFFERS ; BUFFERS: ALLOC= /4 ; MAKE NUMBER LONG WORD ALLC=/4 ; MAKE LONG WORD ALLIGNMENT .LONG ALLOC*4 ; NUMBER ALLOCATED .BYTE 0[ALLOC*4] ; IN USE FLAG ; ; BUILD ADDRESS TABLE TO OUTPUT BUFFERS ; I=0 .REPT ALLOC*4 .LONG +> ; ADDRESS OF BUFFER I=I+1 .ENDR ; ; ACTUAL BUFFERS ; OUTBUF: .REPT ALLOC*4 .LONG 0[ALLC] .ENDR .RESTORE_PSECT .ENDM .page ; ; SIMPLE MACRO TO DEFINE A SYMBOL FOR THE ; NUMBER OF MESSAGE IDS FOR A PARTICULAR NODE ; .MACRO LENGTH,NODE_COUNT,IDCNT NODE'NODE_COUNT=IDCNT .ENDM ; ; SIMPLE MACRO TO GENERATE A LONG WORD WITH ; .MACRO MSGCNT,NODE_COUNT .LONG NODE'NODE_COUNT .ENDM .PAGE ; ; NODE DEFINITION MACRO ; .MACRO NODE,- LOGNODE,- ; Is the primary node a logical node name? PRINODE,- ; PRIMARY NODE NAME SECNODE,- ; SECONDARY NODE NAME ACC=<"TASK=MA_ROUTER">,- ; ACCESS CONTROL STRING INPSIZ=1024 ; SIZE OF INPUT BUFFER ; ; MAKE SURE USER TERMINATED PREVOUS MACRO SET CORRECTLY ; .IF NOT_DEFINED ND ; ROUTE DATABASE INITIALIZATION ; ;*** DATABASE HEADER *** ; (PSECT STARTS WITH A TO BE SORTED TO FRONT OR IMAGE) ; .PSECT AROUTE_HEAD,CON,NOEXE,PAGE START: .LONG VERSION ; REVSION NUMBER .LONG 0 ; FLAGS .LONG RSP_BUFRS-START ; START OF RESPONSE BUFFERS .LONG BUFFERS-START ; START OF THE OUTPUT BUFFERS .LONG 0 ; TOTAL NUMBER OF ID'S (OVERLAID BY ROUTE MACRO) TOT_ID=0 ; INIT FOR ROUTE MACRO ; ; LIST OF NRBS (TERMINATED WITH A ZERO) ; .LONG 0 ; ASSUME NO NODES DEFINED (USED FOR NRB LINKS ND=0 .PSECT ROUTE_DATABASE,CON,NOEXE,PAGE NODE_COUNT=0 .ENDC ; .IF NOT_EQUAL ND .ERROR ; MISSING MESSAGE ID TERMINATATING ROUTE MACRO .MEXIT .ENDC .PSECT AROUTE_HEAD,CON,NOEXE,PAGE .=.-4 ; BACK UP 1 LONG WORD .LONG PRINODE'OFF - START .LONG 0 ; ASSUME THIS IS THE LAST ONE ; .PSECT ROUTE_DATABASE,CON,NOEXE,PAGE $J=. ; MAKE SURE EACH NRB START ON A PAGE BOUNDRY $J= <$J+511>/512 $PAD = <$J*512> - . .IIF NOT_EQUAL $PAD, .BYTE 0[$PAD] ; PRINODE'OFF: ND=1 IDCNT=0 ; CURRENT NUMBER ID DEFINED FOR THIS NODE NODE_COUNT=NODE_COUNT+1 ; ; SEE IF MULTIPLE DEFINITION OF PRIMARY NODE NAME ; .IF DEFINED PRINODE .ERROR ; MULTIPLE DEFINITION OF NODE NAME .MEXIT .ENDC .IF BLANK PRINODE .ERROR ; NO PRIMARY NODE NAME SPECIFIED .MEXIT .ENDC ; ; BUILD THE NODE BLOCK ; ; PRIMARY NODE NAME ; I=6 - %LENGTH(PRINODE) .IF LESS_THAN I .ERROR ; PRIMARY NODE NAME TOO LONG .MEXIT .ENDC .ASCII /PRINODE/ .IIF GREATER I, .BYTE ^A/ /[I] ; PAD IN CASE TOO SHORT ; ; SECONDARY NODE NAME IF PRESENT (USE PRIMARY IF NOT PRESENT) ; .IF BLANK SECNODE .ASCII /PRINODE/ .IIF GREATER I, .BYTE ^A/ /[I] .IF_FALSE I=6-%LENGTH(SECNODE) .IF LESS_THAN I .ERROR ; SECONDARY NODE NAME TOO LONG .MEXIT .ENDC .ASCII /SECNODE/ .IIF GREATER I, .BYTE ^A/ /[I] ; PAD TO 6 BYTES .ENDC ; ; INFORMATION NEEDED TO BUILD NCB FOR OUT BOUND CONNECTION REQUEST ; .QUAD 1 ; NCB DESCRIPTOR .BYTE 0[8] ; CURRENT IN USE NODE NAME ; ; ACCESS CONTROL STRING ; .IF BLANK ACC .ERROR ; ACCESS CONTROL STRING NOT SPECIFIED .MEXIT .ENDC I= 60 - %LENGTH(ACC) .IF LESS_THAN I .ERROR ; ACCESS CONTROL STRING TOO LONG .MEXIT .ENDC .ASCII /ACC/ .IIF GREATER I, .BYTE ^A/ /[I] .BYTE 0[100] ; STORAGE FOR CREATEING AN NCB FOR INCOMMING REQUESTS ; MUST BE LARGE ENOUGH TO HANDLE COMPLETE MESSAGE. .LONG 0,0 ; NETWORK STATUS BLOCK FOR LINK CONNECTIONS, ETC. .LONG 0,0 ; PREVIOUS STATUS (SO WON'T LOG SAME STATUS REPEATEDLY) .LONG 0,0 ; NETWORK MAILBOX READ STATUS .IF BLANK LOGNODE .LONG 0 ; NO FLAGS .IF_FALSE .LONG NRB$M_PRILOG ; PRIMARY NODE IS A LOGICAL NODE .ENDC .LONG 0 ; CHANNEL NUMBER FOR NETWORK .LONG 0 ; CHANNEL NUMBER FOR NETWORK MAIL BOX .LONG 0 ; LINK SEQUENCE NUMBER .BLKB NET_MBX_SIZE ; SIZE FOR A LETTER .IIF GREATER , .ERROR ; INPUT BUFFER TOO LARGE ALLC= /4 ; FORCE TO LONG WORD BOUNDRY ALLC=ALLC*4 ; SIZE OF BUFFER .LONG PRINODE'INP-START ; ADDRESS OF INPUT BUFFER .LONG ALLC ; SIZE OF READ BUFFER, PLUS STATUS BLOCK, PLUS NRB ADDRESS ; ; CREATE STORAGE FOR INPUT BUFFER ; .SAVE_PSECT .PSECT Z_ROUTER_BUFFERS,CON,NOEXE,PAGE PRINODE'INP: LS=/4 .LONG 0,0 ; STATUS BLOCK .LONG PRINODE'OFF-START ; BACK LINK TO NRB .LONG 0[LS] ; DATA BUFFER .RESTORE_PSECT ; .LONG 1 ; LAST ID SCANNED FOR BUFFER FREE INDEX MSGCNT \NODE_COUNT ; NUMBER OF MESSAGE ID'S DEFINED FOR THIS NODE ; DEFINED LATER BY BLANK ROUTE MACRO .IIF NDF,NRBSIZE,NRBSIZE= . - PRINODE'OFF ; LENGHT OF A NRB .ENDM .PAGE ; ; ROUTE DEFINE MACRO. SPECIFIES A PARTICULAR MESSAGE ID TO BE ; ROUTED BY THIS NODE. ; .MACRO ROUTE,MSGID ; ; SEE IF USER IS TERMINATING A LIST ; .IF BLANK MSGID .IF EQUAL ND .ERROR ; NO NODE MESSAGE ID ROUTE LIST PRESENT TO TERMINATE .MEXIT .ENDC ; ; TERMINATE MESSAGE ID ROUTE LIST ; LENGTH \NODE_COUNT,IDCNT ND=0 .BYTE 0[16] ; NEED NULL TO TERMINATE .LONG 0 .LONG 0 ; " " " " .LONG 0,0 .SAVE_PSECT .PSECT AROUTE_HEAD,CON,NOEXE,PAGE .=16 TOT_ID=TOT_ID+IDCNT ; TOTAL NUMBER OF IDS ROUTED BY ROUTER .LONG TOT_ID ; NUMBER OF ID'S .RESTORE_PSECT .IF_FALSE .IF EQUAL ND .ERROR ; NO NODE TO ASSOCIATE THIS ROUTE ID LIST TOO .MEXIT .ENDC ; ; ADD THIS TO THE MESSAGE ID ROUTE LIST ; I=16-%LENGTH(MSGID) .IF LESS_THAN I .ERROR ; MESSAGE ID IS TOO LONG .MEXIT .ENDC .ASCII /MSGID/ .IIF NOT_EQUAL I, .BYTE ^A/ /[I] .LONG 0 ; INDEX TO MESSAGE ID LIST IN QUEUE OR NULL .LONG 0 ; READ BUT NOT ACKNOWLEGED INDEX .LONG 0 ; MESSAGE ID INDEX IDCNT=IDCNT+1 .ENDC .ENDM ; END OF ROUTE MACRO ; ;