*DECK NS$MSG USETEXT COM$NS USETEXT DEF$NS USETEXT HIS$NS USETEXT LIN$NS USETEXT NPT$NS USETEXT NST$NS USETEXT PFC$NS USETEXT SMD$NS USETEXT SMB$NS PROC NS$MSG(MSG$TXT,(MSGSIZE),(MSGROUTING)); # DISPATCH MSG # # TITLE NS$MSG - DISPATCH MESSAGE. # BEGIN # NS$MSG # # ** NS$MSG - DISPATCH MESSAGE. * * J.C. LEE 1981 * * THIS ROUTINE DISPATCHES MESSAGES. * * PROC NS$MSG(MSG$TXT,(MSGSIZE),(MSGROUTING)) * * ENTRY: * MSG$TXT = A MESSAGE TEXT ARRAY OF UP TO 58 * CHARACTERS AND LINE TERMINATOR. * (ZERO BYTE) * MSGSIZE = LENGTH OF MESSAGE TEXT IN CM WORDS. * MSGROUTING = MESSAGE ROUTING OPTIONS, CAN ONE OR * ANY COMBINATIONS OF THE FOLLOWING: * - HOP COMMAND INDICATOR. * - ABORT NS INDICATOR. * - NAM ERROR INDICATOR. * - NETWORK LOG FILE INDICATOR. * - SIGNIFICANT EVENT INDICATOR. * - DAYFILE MESSAGE INDICATOR. * - MACREL MESSAGE MACRO ROUTING OPTIONS. * * EXIT: * NONE. * * METHOD: * USE *MSGROUTING* TO DETERMINE ACTION TO TAKE. * IF MESSAGE MACRO OPTIONS: * USE MESSAGE MACRO TO ROUTE IT TO THE * SPECIFIED DAYFILES. * IF NETWORK LOG FILE OPTION: * ADD LINE HEADER. * TIME STAMP IT. * SEND IT TO HISTORY BUFFER. * IF K-DISPLAY ASSIGNED: * SEND IT TO *KDB*. * ELSE * IF SIGNIFICANT EVENT: * LOG IN NPU STATUS TABLE. * SET PROGRAM ID, SEND HOP/LG * IF NAM ERROR INDICATOR SET: * SEND DBG/STOP TO ABORT NIP. * IF ABORT NS INDICATOR SET: * NETCHECK * ABORT NS. * # ARRAY MSG$TXT; # MESSAGE TEXT # BEGIN ITEM MSGTXTWORD U(0,0,60); END ITEM MSGSIZE U; # MESSAGE TEXT SIZE IN CM WORDS # ITEM MSGROUTING U; # MESSAGE ROUTING OPTIONS # $BEGIN XREF BEGIN PROC NS$DBG; # TRACE CALL # END $END XREF BEGIN PROC ABORT; # ABORT NS # PROC CLOCK; # GET DISPLAY-CODED CLOCK TIME # PROC EXINCSZ; # INCREASE TSB SIZE # PROC EXREDUC; # REDUCE TSB SIZE # PROC MESSAGE; # ISSUE DAYFILE MESSAGE # PROC MOVEI; # MOVE DATA # PROC MOVEOK; # ALLOW TSB TO MOVE # PROC NETCHEK; # FLUSH NWL BUFFER TO SEND ALL SM-S # PROC NETPUT; # NETPUT # PROC NS$TKD; # MOVE DATA TO K-DISPLAY TSB # PROC TSBINFO; # LOCATE TSB # END DEF L$CLOCK # 1 #; # NUMBER OF WORDS FOR TIME STAMP # DEF L$MSGTEXT # 7 #; # SIZE OF MESSAGE TEXT # ITEM ADDR U; # TEMPORARY VARIABLE # ITEM I I; # LOOP VARIABLE # ITEM LNSIZE U; # LINE SIZE # ITEM NSTTSBN U; # TSB NUMBER OF NPU STATUS TABLE # ITEM TIME U; # DISPLAY CODED TIME OF DAY # ITEM TSBFWA U; # TSB FWA # ITEM TSBSIZE U; # TSB SIZE # ARRAY ROPTIONS [0:0] S(1); BEGIN # MESSAGE ROUTING OPTIONS # ITEM ROUTING U(00,00,60); ITEM F$HOPCMD B(00,50,01); # HOP COMMAND INDICATOR # ITEM F$ABORT B(00,51,01); # ABORT NS INDICATOR # ITEM F$NAMERR B(00,52,01); # NAM ERROR INDICATOR # ITEM F$NAMLOG B(00,53,01); # NETWORK LOG FILE INDICATOR # ITEM F$SIGEVENT B(00,54,01); # SIGNIFICANT EVENT INDICATOR # ITEM F$EVENT B(00,55,01); # EVENT MESSAGE INDICATOR # ITEM F$MESSAGE B(00,56,01); # DAYFILE MESSAGE INDICATOR # ITEM MSGOPTIONS U(00,57,03); # MESSAGE MACRO ROUTING OPTIONS # END ARRAY ABH [0:0] S(1); BEGIN # APPLICATION BLOCK HEADER # ITEM ABH$ABT U(00,00,06) = [APPCMD]; ITEM ABH$ADR U(00,06,12) = [0]; ITEM ABH$ABN U(00,18,18) = [0]; ITEM ABH$ACT U(00,36,04) = [CT60TRANS]; ITEM ABH$DBC U(00,40,08) = [0]; ITEM ABH$TLC U(00,48,12); END ARRAY SMHDR[00:00] S(1); BEGIN ITEM SM$PFCSFC U(00,00,16); # SM PFC/SFC CODE # ITEM SM$HDRWORD U(00,00,60); # WHOLE WORD REFERENCE # END DEF L$MSGLINE # 8 #; # SIZE OF MESSAGE LINE # ARRAY MSGLINE [0:0] S(L$MSGLINE); BEGIN # MESSAGE LINE FORMAT # ITEM MSG$LINHDR U(00,00,60); # LINE HEADER WORD # ITEM MSG$LINID U(00,00,24); ITEM MSG$LINSIZ U(00,42,18); # LINE SIZE IN WORDS # ITEM MSG$LINEND B(00,41,01); # END OF CMD RESPONSE FLAG # ITEM MSG$PROCID C(00,00,10); # NS ID # ITEM MSG$TIME U(01,00,60); # TIME STAMP # ITEM MSG$TXTWD U(02,00,60); # MESSAGE TEXT # END CONTROL EJECT; $BEGIN NS$DBG("MSG"); # TRACE CALL # $END ROUTING[0] = MSGROUTING; # MESSAGE ROUTING OPTIONS # IF F$MESSAGE[0] THEN # ISSUE DAYFILE MESSAGE # MESSAGE(MSG$TXT,MSGOPTIONS[0]); IF F$NAMLOG[0] THEN # NETWORK LOG FILE MESSAGE # BEGIN CLOCK(TIME); # GET DISPLAY CODED TIME OF DAY # LNSIZE = LIN$HDRL + L$CLOCK + MSGSIZE; # SIZE OF NEW LINE # P = LOC(MSG$LINHDR); LIN$HDRWD[0] = 0; LIN$ID[0] = LIN$IDENT; LIN$LNSIZE[0] = LNSIZE; MSG$TIME[0] = TIME; # TIME STAMPED NEW LINE # MOVEI(MSGSIZE,LOC(MSG$TXT),LOC(MSG$TXTWD)); # ADD NEW MESSAGE LINE TO HISTORY BUFFER # IF HISTSBN NQ 0 THEN # NS INITIALIZATION HAS COMPLETED # BEGIN TSBINFO(TSBSIZE,TSBFWA,HISTSBN); # LOCATE HISTORY BUFFER # P = 0; IF HIS$LC[TSBFWA] GQ HIS$MAX$LN THEN # MAX HISTORY BUFFER LINE COUNT REACHED # BEGIN # REMOVE FIRST LINE OF HISTORY BUFFER # P = TSBFWA + HIS$HDRL; # FWA OF FIRST LINE # I = LIN$LNSIZE[0]; # SIZE OF FIRST LINE # MOVEI(HIS$HDRL,TSBFWA,TSBFWA+I); # REMOVE FIRST LINE # EXREDUC(I,HISTSBN,TRUE,TSBFWA); # RETURN UNUSED SPACE # HIS$WC[TSBFWA] = HIS$WC[TSBFWA] - I; # UPDATE WORD COUNT # END ELSE # UPDATE HISTORY BUFFER LINE COUNT # HIS$LC[TSBFWA] = HIS$LC[TSBFWA] + 1; # INCREMENT LINE COUNT# EXINCSZ(LNSIZE,TSBFWA,HISTSBN); # INCREASE HISTORY BUFF SIZE # MSG$LINEND[0] = FALSE; # NOT COMMAND RESPONSE # MOVEI(LNSIZE,LOC(MSG$LINHDR),TSBFWA+HIS$WC[TSBFWA]); HIS$WC[TSBFWA] = HIS$WC[TSBFWA] + LNSIZE; # UPDATE WORD CNT # MOVEOK(HISTSBN); # ALLOW HISTORY BUFFER TO MOVE # END # IF K DISPLAY IS ASSIGNED, SEND LINE TO K DISPLAY # IF DCW$F$ASS[0] THEN # K-DISPLAY ASSIGNED # BEGIN IF NOT F$HOPCMD[0] THEN # NOT A HOP COMMAND # BEGIN # DRIBBLE LINE TO K DISPLAY # MSG$LINEND[0] = TRUE; # END OF RESPONSE # NS$TKD(MSGLINE,LNSIZE,1); # MOVE LINE TO K DISPLAY TSB # END END ELSE # K-DISPLAY NOT ASSIGNED # BEGIN IF F$SIGEVENT[0] # A SIGNIFICANT EVENT MESSAGE # AND NOT DCW$F$IG[0] # ALERT ALLOWED # THEN # SEND HOP/ALT TO ALERT HOP # BEGIN ABH$TLC[0] = LHOPALT; # SET TEXT LENGTH # SM$HDRWORD[0] = 0; SM$PFCSFC[0] = HOPALT; # SET PFC/SFC CODE # NETPUT(ABH,SMHDR); # SEND HOP/ALT/SM # END END IF F$EVENT[0] THEN # AN EVENT MESSAGE # BEGIN # LOG IN NPU STATUS TABLE # NSTTSBN = NPT$NSTTSB[NTORD]; # TSB NUMBER OF NST # TSBINFO(TSBSIZE,TSBFWA,NSTTSBN); # LOCATE NST # P = TSBFWA; # FWA OF NST # ADDR = LOC(NST$EVMSG[0]); # FWA OF EVENT MESSAGE IN NST # MOVEI(MSGSIZE+L$CLOCK,LOC(MSG$TIME[0]),ADDR); # MOVE TO NST # MOVEOK(NSTTSBN); # ALLOW NST TO MOVE # END # SEND HOP/LG TO NIP TO ENTER MESSAGE IN NETWORK LOG FILE # MSG$PROCID[0] = "NS/ "; # SET PROGRAM ID # ABH$TLC[0] = LNSIZE + 1; SM$HDRWORD[0] = 0; SM$PFCSFC[0] = HOPLG; NETPUT(ABH,SMHDR); # SEND HOP/LG TO NIP # END $BEGIN IF F$NAMERR[0] THEN # NAM ERROR DETECTED # BEGIN # SEND DBG/STP TO NIP # ABH$TLC[0] = LDBG; # SET TEXT LENGTH IN CHARACTERS # SM$HDRWORD[0] = 0; SM$PFCSFC[0] = DBGSTOP; # SET PFC/SFC CODE # NETPUT(ABH,SMHDR); # SEND DBG/STOP TO ABORT NIP # END $END IF F$ABORT[0] THEN BEGIN # A FATAL NS ERROR MESSAGE # NETCHEK; # MAKE SURE ALL SM-S ARE SENT # ABORT; # ABORT NS # END RETURN; END # NS$MSG # TERM