*DECK TVF
PRGM TVF1;
BEGIN
# COPYRIGHT CONTROL DATA SYSTEMS INC. 1994. #
*IF,DEF,IMS
#
* TVF (TERMINAL VERIFICATION FACILITY) PAGE 1
* IMS (INTERNAL MAINTENANCE SPECIFICATION) DATE.
#
#
*1DC TVF IMS
*
* PROG NAME AUTHOR DATE
* TVF P. WARBURTON 77/05/16
*
*
* CONTENTS
*
* 1. INTERFACES
* 2. DATA ARRAYS
*
* 3. DESIGN APPROACH
*
* 4. PROGRAM STRUCTURE
*
* 1.0 INTERFACES
* INTERFACES ARE DESCRIBED AS TVF RESPONSE TO INPUT.
*
* FOR AN OVERVIEW OF THE USER INTERFACE, SEE THE NAM ERS
* APPENDIX E OR NAM REFERENCE MANUAL. FOR EXPLANATION OF
* TABLE FLAGS, SEE SECTION 2.0 BELOW.
*
* 1.1 USER (TERMINAL OPERATION) INTERFACE
*
* 1.1.1 BANNER - RESPONSE TO FC/INIT/SM
*
*
* 1.1.2 TESTLIST - RESPONSE TO COMMAND "TEST"
*
* 1.1.3 COMLIST - RESPONSE TO COMMAND "HELP"
*
* 1.1.4 LOOPBACK TEST MSG-S
* (A) BEGIN - RESPONSE TO COMMAND "1"
* (B) MSG - RESPONSE TO USER INPUT FOR TEST = 1
* (C) COMPLETE - RESPONSE TO COMMAND "ENDL" FOR TEST = 1
*
* 1.1.5 LINE TEST MSG-S
* (A) BEGIN - RESPONSE TO COMMAND "2"
* (B) MSG - RESPONSE TO USER INPUT FOR TEST = 2
* (C) COMPLETE - SEND FOLLOWING MSG
*
* 1.1.6 SCREEN TEST MSG-S
* (A) BEGIN - RESPONSE TO COMMAND "3"
* (B) MSG - RESPONSE TO USER INPUT FOR TEST = 3
* (C) (THERE IS NO COMPLETE MSG FOR SCREEN TEST)
*
* 1.1.7 AUTO-END - RESPONSE TO SHUT/INDS/SM WITH SHUTF = 1
*
* 1.1.8 UNRECOGNIZED - RESPONSE TO UNIDENTIFIABLE COMMAND
*
* 1.1.9 PARITY - RESPONSE TO INPUT MSG WITH PARITY ERROR FLAG
*
* 1.1.10READY - SEND WHEN TVF CLEARS INTERNAL TTST FLAG
*
* 1.2 DAYFILE MSG-S
*
* 1.2.1 NETON ATTEMPT - RESPONSE WHEN TVF CALLED
*
* 1.2.2 NETON SUCCESSFUL - RESPONSE WHEN NETON ACCEPTED
*
* 1.2.3 TVF ERC -RESPONSE TO ERR/LGL/SM
*
* 1.2.4 TVF ERRMSG -RESPONSE TO SM OR TERM DATA MSG TVF
* CANNOT PROCESS
* -PFCSFC NOT APPROPRIATE FOR TVF
* -PFCSFC OUT-OF-SEQUENCE FOR NAM PROTOCOL
* -ABT OUT-OF-RANGE
* -ADR OUT-OF-RANGE
*
* 1.3 TVF CALLS TO NAM
* -NETON
* -NETWAIT
* -NETGETL
* -NETPUT
* -NETOFF
*
* 1.4 TVF-TO-NAM SUPERVISORY MSG-S
*
* 1.4.1 CON/REQ/N-RESPONSE TO CON/REQ/SM
*
* 1.4.2 CON/REQ/A-RESPONSE TO CON/REQ/SM IF ACN OUT-OF-RANGE,
* OR IF DEVICE TYPE NOT CONSOLE
* OR IF FROM APPLICATION
*
* 1.4.3 FC/INIT/N-RESPONSE TO FC/INIT/SM
*
* 1.4.4 CON/END/SM-RESPONSE TO USER COMMAND"END",
* TO CON/CB/SM, TO FC/STP/SM, TO FC/NAK/SM,
* TO SHUT/INSD/SM SHUTF = 1
*
* 1.4.5 FC/RST/SM-RESPONSE TO FC/BRK/SM, TO FC/STP/SM
*
* 1.4.6 LST/OFF/SM - SENT FOLLOWING MESSAGE TO TERMINAL
*
* 1.4.7 LST/ON/SM - RESPONSE TO FC/ACK/SM
*
* 1.5 TABLE UPDATES
*
* 1.5.1 CLEAR TABLE -RESPONSE TO NETON SUCCESSFUL
*
* 1.5.2 SET WORD0,WORD1 -RESPONSE TO CON/REQ/SM IS TO SET
* (PER TERMINAL) WORD0,WORD1 = CON/REQ WORD1,
* -SET TEST=0,TFLAG=0
*
* 1.5.3 TTST=N -RESPONSE TO USER COMMAND "N"
*
* 1.5.4 TTST=0 -WHEN TEST "COMPLETE" SENT
*
* 1.5.5 TFLAG=1 -WHEN DATA MSG SENT
*
* 1.5.6 TFLAG=0 -WHEN FC/ACK/SM RECEIVED
*
* 1.5.7 CLEAR TABLE -RESPONSE TO CON/END/N
* ENTRY
*
* 1.5.8 TPFCSFC=FCINIT -RESPONSE TO FC/INIT/SM
*
* 1.5.9 TPFCSFC=CONEND -WHEN CONEND SENT
*
* 1.5.10 SET PW,PL -RESPONSE TO TCH/TCHAR/SM
*
* 1.5.1.11 SET FLAG2 RESPONSE IN TEST 2 WHEN LINE SENT
*
* 1.6 SYSTEM MACREL CALLS
* -DATE (FOR BANNER)
* -CLOCK (FOR BANNER)
* -XCOD (CONVERT OCTAL-TO-DISPLAY)
* -XCDD (CONVERT OCTAL-TO-DECIMAL-TO-DISPLAY)
* -XCHD (CONVERT HEX-TO-DISPLAY
* -MESSAGE (FOR OUTPUT DAYFILE MSG-S)
*
* 2.0 DATA STRUCTURE: ARRAYS.
*
* 2.1 ABH - APPLICATION BLOCK HEADER - LENGTH: 1 WORD.
* HOLDS THE HEADER FOR CALLS TO/FROM NAM.
*
* 2.2 BUFFER - LENGTH: BUFFERSIZE = 280 WORDS.
* HOLDS INPUT/OUTPUT FOR NAM CALLS, DAYFILE
* MESSAGES AND TERMINAL MESSAGES.
*
* 2.3 TABLE - LENGTH: TERMCOUNT (=20) * 2 WORDS.
* HOLDS DATA FOR EACH TERMINAL CONNECTED.
* - FORMAT SAME AS WORDS 0 AND 1 OF CON/REQ/SM
* - UNUSED BIT FIELDS OF CON/REQ/SM USED AS FLAGS
* - TTST INDICATES WHICH TVF TEST IN EXECUTION
* - TFLAG INDICATES A CURRENT TEST WILL CONTINUE
* WHEN CURRENT OUTPUT BLOCK IS ACK (FC/ACK/SM)
*
* 2.4 BANNER - LENGTH: 15 WORDS.
* HOLDS BANNER FORMAT
*
* 2.5 MODELS - LENGTH: 15 WORDS.
* HOLDS MODEL NUMBERS FOR TERMINAL DEVICE TYPES
* (USED BY BANNER)
*
* 2.6 ASCII - LENGTH: 14 WORDS
* HOLDS ASCII 95 CHARACTER SUBSET, DIGITS 0-9 REPEATED
* TO FILL 105 8-BIT CHARACTER IN 14 WORDS (PACKED
* 7.5 CHARACTERS PER WORD)
*
* 2.7 COMLIST - TVF COMMAND LIST - LENGTH: 4 WORDS
* HOLDS TVF COMMANDS, RESPONSE TO HELP COMMAND
*
* 2.8 TESTLIST - TVL TEST LIST - LENGTH: 10 WORDS
* HOLDS DISPLAY TESTLIST, RESPONSE TO TEST COMMAND
*
* 3.0 DESIGN APPROACH AND CONVENTIONS
* -TVF CONSISTS OF A MAINLOOP AND CALLED PROCEDURES.
* -THE MAINLOOP DOES NETON AND NETGETL.
* -NO OTHER PROCEDURE READS DATA FROM NAM (NETGETL).
* -CALLED PROCEDURES FORMAT TERMINAL AND DAYFILE
* MESSAGE RESPONSES TO INPUT MESSAGES.
* -AS PROCESSING PROCEEDS, ONE PROCEDURE MAY CALL ANOTHER.
* -BUT NO PROCEDURE IS USED AS A RETURN JUMP, I.E., NO
* PROCEDURE RETURNS CONTROL TO ITS CALLER.
* -PROCESSING OF AN INPUT TERMINATES WITH A GOTO
* NEXT, WHICH RETURNS CONTROL TO MAINLOOP NETGET CALL.
* -IF NETON FAILS, CHECK STATUS BIT TO DETERMINE IF
* SHOULD LOOP ON NETON CALL, OR SIMPLY ABORT TVF.
* -IF NETGETL FINDS NO INPUT (ABT=0), NETWAIT IS
* ENTERED.
* -THERE IS NO PARAMETER PASSING BETWEEN PROCEDURES,
* SINCE DATA NEEDED BY A CALLED PROCEDURE IS HELD
* IN EITHER:
* (A) TABLE ARRAY - STATUS OF CONNECTED TERMINAL
* (B) BUFFER - INPUT SM OR TERMINAL MSG
* -RESPONSES TO INCOMING SM (OUTPUT SM, DF MSG) AND
* FIRST RESPONSE TO TERMINAL COMMANDS ARE GENERATED
* IMMEDIATELY FOLLOWING IF-CONDITIONAL IDENTIFYING
* SM
* -FOR A TVF TEST, THERE ARE THREE RESPONSES
* (A) TEST BEGIN MSG
* (B) TEST MSG
* (C) TEST COMPLETE MSG
* -TEST BEGIN RESPONSE IS GENERATED IMMEDIATELY, BUT
* (B) AND (C) MAY BE GENERATED SEPARATELY, DEPENDING
* UPON THE COMPLEXITY OF THE TEST.
* -NETPUT CALLS ARE SPREAD THRU CODE, OTHER NAM CALLS
* (NETON,NETWAIT,NETGETL,NETOFF) OCCUR AT ONLY ONE
* PLACE IN CODE.
* -TFLAG SET/CLEARED SO THAT WHEN SHUTDOWN OCCURS, MAY
* HAVE TO WAIT FOR FC/ACK/SM BEFORE SENDING AUTO
* END MESSAGE
* -ONLY ONE MSG AT A TIME IS SENT TO A TERMINAL.
* LIST OFF IS SENT FOLLOWING THE MSG.
* LIST ON IS SENT WHEN FC/ACK/SM IS RECEIVED.
* THIS AVOIDS POTENTIAL TYPE-AHEAD BY TERMINAL OPERATOR.
*
* 4.0 PROGRAM STRUCTURE
*
* 4.1 MAIN LOOP
* -NETON (INITIALIZE TVF)
* -NETGETL FOR NEXT MSG
* -AFTER EACH MSG IS PROCESSED, CONTROL RETURNS TO THIS
* POINT OF THE MAINLOOP, BY A "GOTO NEXT"
* -NETWAIT, IF NO INPUT AVAILABLE
* -ROUTE SHUT/INSD/SM TO PROC SHUTDOWN
* -ROUTE ALL MSGS TO PROC SHUTDOWND, IF THE SHUTDOWNF FLAG
* IS SET.
* -ROUTE ERR/LGL/SM TO PROC ERRMSG
* -IF ACN (DATA MSG) OR ADR (SM) OUT-OF-RANGE, ROUTE TO
* ERRMSG
* -ROUTE SM TO PROC SMTREE
* -ROUTE DM TO PROC TERMSG
* -ROUTE ANYTHING ELSE TO ERRMSG
* -IF SHUTDOWNF FLAG SET, ROUTE SM AND DM TO SHUTDD
*
* 4.2 SHUTDOWN
* -IF SHUTYPE"1, NETOFF IMMEDIATELY
* -IF SHUTYPE=1, INITIATE SHUTDOWN
* -IF NO CONNECTIONS, NETOFF
* -SET SHUTDOWN = 1
* -SEND AUTO END MSG, IF POSSIBLE
*
* 4.3 SHUTDD
* -IF REDUNDANT SHUTF=1, IGNORE
* -IF TERMINAL DATA INPUT, IGNORE
* -IF FC/INIT/SM AND TFLAG=1, SEND AUTO END, TFLAG=0
* -IF FC/INIT/SM AND TFLAG=0, SEND CON/END/SM
* -IF CON/END/N, CLEAR TABLE ENTRY
* -WHEN ALL TABLE ENTRIES CLEARED, NETOFF
*
* 4.3 ERRMSG
* -FORMAT DAYFILE MSG: "TVF ERRMSG" FOR SPURIOUS SM-S
* "TVF ERC=NN" FOR ERR/LGL/SM
*
* 4.5 SMTREE: PROCESS SUPERVISORY MSG-S
* -PROCESSING CONTROLLED BY ENTRY FOR TERMINAL IN TABLE
* -ENTRY CLEARED: LOOK FOR CON/REQ/SM, NOTHING ELSE
* IF IT COMES, SET TABLE
* -CONREQ: LOOK FOR FC/INIT/SM, NOTHING ELSE
* IF IT COMES, SET FCINIT
* -FCINIT: LOOK FOR VARIOUS MSGS AND RESPOND ACCORDINGLY
* IF A CON/END/SM IS SENT, UPDATE TABLE
* -CONEND: LOOK FOR CON/END/N, IGNORE OTHER MSGS
* IF IT COMES, CALL CONEND
*
* 4.6 ENDCON
* -SEND END/CON/SM
* -EXIT TO MAINLOOP
* -CALLED BY SHUTDD, SMTREE, TERMSG TO END A CONNECTION
*
* 4.7 TERMSG: PROCESS DATA MSGS
* -PROCESSING CONTROLLED BY ITEM "TTST" IN TERM TABLE ENTRY
* -TTST=0: LOOK FOR TVF USER COMMANDS, INCLUDING TEST NUMBER
* -FORMAT APPROPRIATE REPLY
* -FOR TEST NUMBER, UPDATE TEST=N
* -TTST=1: DO LOOPBACK TEST
* -CHECK FOR "ENDL" TO END TEST
* -TTST=2: SET I FOR NUMBER OF CHAR IN LINE,
* CALL GENDATA TO GENERATE OUTPUT
* -TTST=3: SET I FOR NUMBER OF CHAR IN SCREEN,
* CALL GENDATA TO GENERATE OUTPUT
* -TTST"1,2,3: SEND MSG TO TERMINAL, RESET TTST=0
*
* 4.8 GENDATA: GENERATE DATA (USED BY LINE AND SCREEN TESTS)
* -IF USER INPUT, USE IT
* -IF NULL INPUT, USE ASCII CODES
* -EXIT TO LOFFMSG
*
* 4.9 ENDTEST: CALLED TO SEND TEST COMPLETE MSG
* -CALLED BY TERMSG WHEN TEST=1 AND "ENDL" RECEIVED
* -CALLED BY SMTREE TO END TEST 2
* -EXIT TO LOFFMSG
*
* 4.10 LOFFMSG
* -SEND LST/OFF/SM, SET TFLAG = 1.
* -EXIT TO MAINLOOP
* -CALLED BY SMTREE WHEN BANNER SEND
* -CALLED BY TERMSG AND GENDATA WHEN MSG SENT
*
* SEE SECTIONS BELOW FOR PROC DESCRIPTIONS
*
#
*ENDIF
XREF
BEGIN
PROC ABORT;
PROC NETON;
PROC NETOFF;
PROC NETGETL;
PROC NETWAIT;
PROC NETPUT;
PROC MESSAGE;
PROC CLOCK;
PROC RECALL;
PROC TVFRECV ;
PROC DATE;
FUNC XCDD C(10);
FUNC XCHD C(10);
END
DEF BUFFERSIZE # 280 #;# I/O BUFFER SIZE #
DEF TERMCOUNT # 20 #;# NUMBER OF TERMINALS #
DEF DFOPTION # 3 #;# OPTION FOR DESTINATION OF DAYFILE MSG-S#
DEF BDOPTION # 1 #;# OPTION FOR DISPLAY MSG AT CONTROL-POINT#
DEF WAIT #4095 #;# NETWAIT TIME LIMIT #
DEF NUMTC # 31#;# NUMBER OF TERMINAL CLASSES #
ITEM I;
ITEM J;
ITEM K;
ITEM TEMP C(10);
ITEM SHUTDOWNF = 0;
ITEM ACN;
ITEM NETFLG I = 0; # FIRST UNSUCCESSFUL NETON FLAG #
ITEM MSGFLG I = 0; # PUT MSG ON DAY-FILE ONCE FLAG #
# COMDECKS: USERDEFS, CONDEF, CTRLDEF, DCDEF, ERRDEF, FCDEF, FILEDEF,#
# LOUTDEF, LSTDEF, MSGDEF, SHUTDEF, TCHDEF, HEADER, #
# USERITMS, SUPMSG, CON, CTRL, DC, ERR, FC, FILE, LOUT, #
# LST, MSG, SHUT, TCH, NAMLEV. #
CONTROL NOLIST;
*CALL USERDEFS
ARRAY ABH;
BEGIN
*CALL HEADER
END
BASED ARRAY SMESSAGE;
BEGIN
*CALL USERITMS
END
*CALL NAMLEV
CONTROL LIST;
ARRAY BUFFER [0:BUFFERSIZE] S(1);
BEGIN
ITEM BUF U(0,0,60);
ITEM BUC C(0,0,10);
END
ARRAY NSUP[0:0] S(1);
ITEM NSUPN B(0,2,1);
BASED ARRAY BUFFOUT;
ITEM BUFMSG U;
ARRAY TABLE [1:TERMCOUNT] S(2);
ITEM
TWORD0 U(0,0,60),
TWORD1 U(1,0,60),
TPFCSFC U(0,0,16),
TRC U(0,16,8),
TACN U(0,24,12),
TABL U(0,36,3),
TTST U(0,39,4),
THW U(0,43,1),
TDT U(0,44,3),
TTC U(0,47,5),
TORD U(0,52,8),
TNAME C(1,0,7),
TFLAG U(1,42,1),
TFLAG2 U(1,43,1),
TPW U(1,44,8),
TPL U(1,52,8);
ARRAY MODELS [1:NUMTC] S(1);
ITEM MODEL C(0,0,10) =["M33",
"713",
"721",
"2741",
"M40",
"H2000",
"X364",
"T4014X",
"HASP-POST",
"200UT",
"714-30",
"711-10",
"714-10",
"HASP-PRE",
"734",
"2780-BSC",
"3780-BSC",
"3270",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"UNKNOWN",
"TC28-USER",
"TC29-USER",
"TC30-USER",
"TC31-USER"];
ARRAY [0:13] S(1);
ITEM ASCII U(0,0,60) =[X"202122232425262",
X"728292A2B2C2D2E",
X"2F3031323334353",
X"63738393A3B3C3D",
X"3E3F40414243444",
X"5464748494A4B4C",
X"4D4E4F505152535",
X"455565758595A5B",
X"5C5D5E5F6061626",
X"36465666768696A",
X"6B6C6D6E6F70717",
X"273747576777879",
X"7A7B7C7D7E30313",
X"233343536373839"];
ARRAY COMLIST S(9);
ITEM
C1 C(0,00,16) = ["TVF COMMAND LIST"],
C2 U(1,36,24) = [0],
C3 C(2,00,06) = [" HELP"],
C4 U(2,36,24) = [0],
C5 C(3,00,06) = [" TEST"],
C6 U(3,36,24) = [0],
C7 C(4,00,05) = [" END"],
C8 U(4,30,30) = [0],
C9 C(5,00,20) = [" ENDL (END TEST 1)"],
C10 U(7,00,60) = [0],
C11 C(8,00,02) = [".."],
C12 U(8,12,48) = [0];
ARRAY TESTLIST S(11);
ITEM
T1 C(0,00,30) = ["PLEASE ENTER TEST LIST DESIRED"],
T2 U(3,00,60) = [0],
T3 C(4,00,17) = [" 1-LOOPBACK TEST"],
T4 U(5,42,18) = [0],
T5 C(6,00,13) = [" 2-LINE TEST"],
T6 U(7,18,42) = [0],
T7 C(8,00,15) = [" 3-SCREEN TEST"],
T8 U(9,30,30) = [0],
T9 C(10,0,02) = [".."],
T10 U(10,12,48)= [0];
ARRAY PR [0:0] S(1);
ITEM
PROMPTC C(0,0,2) = [".."],
PROMPTB U(0,12,48)= [0],
PROMPT U(0,0,60);
ARRAY AUTERM S(3);
ITEM
AUTERMA C(0,0,24) = [ "AUTO END -TVF TERMINATES"],
AUTERMB U(2,24,36) = [0];
ARRAY TVFERR S(3);
ITEM
TVFERRA C(0,0,15) = ["ERROR TVF READY"],
TVFERRB U(1,30,30) = [0],
TVFERRC C(2,0,2) = [".."],
TVFERRD U(2,12,48) = [0];
ARRAY TESTCOM S(3);
ITEM
TESTCOMA C(0,0,17) = ["TVF TEST COMPLETE"],
TESTCOMB U(1,42,18) = [0],
TESTCOMC C(2,0,2) = [".."],
TESTCOMD U(2,12,48) = [0];
CONTROL EJECT;
# MAIN LOOP #
*IF,DEF,IMS
#
*1DC TVF MAINLOOP
*
* 1. TFV PRGM AUTHOR DATE
* MAINLOOP P.WARBURTON 77/05/16
*
* 2. FUNCTIONAL DESCRIPTION
* WHEN TVF CALLED, DOES NETON. MAINLOOP CONTAINS:
* -NETGETL CALL, LABELED "NEXT". CONTROL RETURNS HERE IN
* MAINLOOP.
* -NETWAIT, IF NO INPUT (ABT=0), LOOP TO "NEXT".
* -JUMP ON ABT VALUE IN ABH HEADER FOR SUPERVISORY OR DATA
* MSG
* -TESTS FOR ADR AND ABT IN RANGE, ERROR IF NOT.
* -FOR SHUTDOWN, CALLS SHUTDOWN OR SHUTDD.
* -FOR SM OR DATA MSG, PUT ACN IN LOC "ACN".
*
* 3. METHOD USED
* IF-THEN CONDITIONAL TESTS TO CALL OTHER TVF PROCEDURES,
* FALL THROUGH TO PROCESS ERROR MSG WHEN CONDITIONS FAIL.
*
* 4. ENTRY CONDIIONS
* NONE
*
* 5. EXIT CONDITIONS
* EXITS WITH MSG READ BY NETGETL IN BUFFER (FOR FURTHER
* PROCESSING)
* EXITS TO PROCS: TERMSG,SMTREE,SHUTDOWN,ERRMSG,SHUTDD
* -ACN FROM HEADER OR MSG IS IN LOC "ACN"
*
* 6. COMMON DECKS CALLED
* HEADER-ABH ITEM DEFS
* USERIMS-SUPERVISORY MSG ITEM DEFS
*
* 7. PROCEDURES/FUNCTIONS CALLED
* NETON
* NETGETL - GET NEXT INPUT, (LIST=0) SUPERVISORY OR DATA MSG
* NETWAIT - FOR ABT=0, NETWAIT AND LOOP BACK TO "NEXT" NETGETL
* TERMSG - EXIT FOR TERMINAL INPUT MSG (ABT=2) WITH ADR IN RANGE
* SHUTDOWN - EXIT FOR SHUT/INSD/SM
* SHUTDD - FOR ORDERLY SHUTDOWN
* ERRMSG - EXIT FOR ERR/LGL/SM
* SMTREE - EXIT TO PROCESS SUP MSG (ABT=3) WITH ACN IN RANGE
* ERRMSG - FALL THRU EXIT FOR ABT, ADR, OR ACN OUT-OF-RANGE
*
* 8. DAYFILE MSG
* -TVF ATTEMPTING NETON
* -TVF NETON SUCCESSFUL
*
#
*ENDIF
TVFRECV ;
BUC[0] = "TVF ATTEMP";
BUC[1] = "TING NETON";
BUF[2] = 0;
MESSAGE (BUFFER,DFOPTION);
FOR I = 1 WHILE I NQ 0 DO
BEGIN
NETON("TVF",NSUP,I,1,TERMCOUNT);
IF I EQ 2 THEN
BEGIN #TVF ALRDY PRESENT, ABORT#
BUC[0] = "NETON REJE";
BUC[1] = "CTED, TVF ";
BUC[2] = "ALREADY PR";
BUC[3] = "ESENT";
BUF[4] = 0;
MESSAGE(BUFFER,DFOPTION);
ABORT;
END
ELSE
BEGIN
IF I EQ 3 THEN
BEGIN #WAITING FOR TVF TO ENABLE#
BUC[0] = "WAITING FO";
BUC[1] = "R TVF TO B";
BUC[2] = "E ENABLED";
BUF[3] = 0;
IF MSGFLG EQ 0 THEN
BEGIN #PUT MSG ON DF ONCE ONLY #
MESSAGE(BUFFER,DFOPTION);
MSGFLG = 1;
END
ELSE #PUT MSG ON B-DISPLAY #
MESSAGE(BUFFER,BDOPTION);
END
END
RECALL(0);
END
BUC[0] = "TVF NETON ";
BUC[1] = "SUCCESSFUL";
BUF[2] = 0;
MESSAGE (BUFFER,DFOPTION);
SHUTDOWNF = 0;
FOR I = 1 STEP 1 WHILE I LQ TERMCOUNT DO
BEGIN
TWORD0[I] = 0;
TWORD1[I] = 0;
END
P<SMESSAGE> = LOC(BUFFER);
P<BUFFOUT> = LOC(BUF[10]);
NEXT:
BUF[0] = 0;
BUF[1] = 0;
NETGETL (0,ABH,BUFFER,BUFFERSIZE);
IF ABHABT EQ 0 THEN
BEGIN
NETWAIT (WAIT,0);
GOTO NEXT;
END
IF ABHABT EQ 3 AND ABHADR NQ 0 THEN GOTO NEXT;
IF ABHABT EQ 3 THEN ACN = CONACN[0];
IF ABHABT EQ 1 OR ABHABT EQ 2 THEN ACN = ABHADR;
IF ABHABT EQ 3 AND PFC EQ ERR THEN ERMMSG;
IF ABHABT EQ 3 AND PFCSFC EQ SHUINS THEN SHUTDOWN;
IF ACN EQ 0 OR ACN GR TERMCOUNT THEN ERMMSG;
IF SHUTDOWNF EQ 1 THEN SHUTDD;
IF ABHABT EQ 1 OR ABHABT EQ 2 THEN TERMSG;
IF ABHABT EQ 3 THEN SMTREE;
ERMMSG;
# END OF MAINLOOP #
PROC NETOF;
BEGIN
NETOFF;
ABORT;
END
CONTROL EJECT;
PROC SHUTDOWN;
BEGIN
*IF,DEF,IMS
#
*1DC SHUTDOWN
*
* 1. PROC NAME AUTHOR DATE
* SHUTDOWN P.WARBURTON 77/05/16
*
* 2. FUNCTIONAL DESCRIPTION
* PROCESSES SHUT/INSD/SM, TERMINATING TVF WITH A NETOFF.
*
* 3. METHOD USED
* IF SHUTF EQ 1, THEN "TVF TERMINATE" MESSAGE SENT TO EACH
* CONNECTED TERMINAL AND CON/END/SM SENT FOR EACH TERMINAL,
* THEN NETOFF AND STOP.
* IF SHUTF EQ 0, THEN NETOFF AND STOP IMMEDIATELY.
* IF ORDERLY SHUTDOWN CANNOT BE DONE IMMEDIATELY, SET SHUTDOWNF
* FLAG FOR SHUTDD PROCEDURE, WHICH FINISHES SHUTDOWN.
*
* 4. ENTRY CONDITIONS
* SHUT/INSD/SM IS IN BUFFER,
* TABLE HAS NON-ZERO ENTRY FOR EACH TERMINAL CONNECTED.
*
* 5. EXIT CONDITIONS
* IF NO NETOFF, THEN SET SHUTDOWNF = 1.
*
* 6. COMMON DECKS CALLED
* IF NO NETOFF, THEN SET SHUTDOWNF = 1, AND EXIT TO NEXT
*
* NONE
*
* 7. PROCEDURES/FUNCTIONS CALLED
* NETPUT-SEND MSG TO TERMINALS, SEND CON/END/SM MSG-S
* NETOFF-TVF TERMINATES
*
* 8. DAYFILE DIAGNOSTIC MESSAGES
* NONE
*
#
*ENDIF
K = 0;
FOR I = 1 STEP 1 WHILE I LQ TERMCOUNT DO
IF TWORD0[I] NQ 0 THEN K = 1;
IF SHUTF OR K EQ 0 THEN
BEGIN
NETOFF;
STOP;
END
IF SHUTDOWNF EQ 1 THEN GOTO NEXT;
SHUTDOWNF = 1;
FOR I = 1 STEP 1 WHILE I LQ TERMCOUNT DO
IF TPFCSFC[I] EQ CONREQ THEN
BEGIN
ABHTLC = 2;
PFCSFC = CONEND;
CONACN = TACN[I];
BUF[1] = 0;
NETPUT (ABH,BUFFER);
END
ABHABT = 1;
ABHTLC = 30;
ABHACT = 4;
ABHNFE = 1;
FOR I = 1 STEP 1 WHILE I LQ TERMCOUNT DO
IF TPFCSFC[I] EQ FCINIT AND TFLAG[I] EQ 0 THEN
BEGIN
ABHADR = TACN[I];
NETPUT(ABH,AUTERM);
END
GOTO NEXT;
END
CONTROL EJECT;
PROC SHUTDD;
BEGIN
*IF,DEF,IMS
#
*1DC SHUTDD
*
* 1. PROC NAME AUTHOR DATE
* SHUTDD P.WARBURTON 77/06/01
*
* 2. FUNCTIONAL DESCRIPTION
* PROCESS INCOMING MESSAGES DURING SHUTDOWN, WHEN SHUTDOWNF = 1.
*
* 3. METHOD USED
* -IGNORE TERMINAL INPUT
* -TRACK TFLAG AND FC/ACK/SM TO INSURE THAT
* A. AUTO END MSG SENT
* B. CON/END/SM SENT EITHER BY SHUTDOWN OR BY SHUTDD
* -NETOFF WHEN CON/END/N RECEIVED FOR ALL CONNECTIONS
* -UPDATE FLAGS
*
* 4. ENTRY CONDITIONS
* MESSAGE IN BUFFER
* TFLAG SET IF AUTO END NOT YET SENT
*
* 5. EXIT CONDITIONS
* RETURN TO MAIN LOOP, OR NETOFF
*
* 6. COMMON DECKS CALLED
* NONE
*
* 7. PROCEDURES CALLED
* GOTO NEXT (RETURN TO MAINLOOP)
*
* 8. DAYFILE/DIAGNOSTIC MESSAGES
* NONE
*
#
*ENDIF
IF ABHABT NQ 3 THEN GOTO NEXT;
IF PFCSFC EQ CONREQ THEN
BEGIN
ABHTLC = 1;
EB = TRUE;
NETPUT (ABH,BUFFER);
GOTO NEXT;
END
IF PFCSFC EQ FCNAK OR (PFCSFC EQ FCACK AND TFLAG[ACN] EQ 0) THEN
ENDCON;
IF PFCSFC EQ FCACK AND TFLAG[ACN] NQ 0 THEN
BEGIN
TFLAG[ACN] = 0;
ABHABT = 1;
ABHADR = ACN;
ABHACT = 4;
ABHNFE = 1;
ABHTLC = 30;
NETPUT(ABH,AUTERM);
GOTO NEXT;
END
IF PFC EQ CON AND SFC EQ ENDD AND RB THEN
BEGIN
TWORD0[ACN] = 0;
TWORD1[ACN] = 0;
END
K = 0;
FOR I = 1 STEP 1 WHILE I LQ TERMCOUNT DO
IF TWORD0[I] NQ 0 THEN K = 1;
IF K EQ 0 THEN
BEGIN
NETOFF;
STOP;
END
GOTO NEXT;
END
CONTROL EJECT;
PROC ERMMSG;
BEGIN
*IF,DEF,IMS
#
*1DC ERRMSG
*
* 1. PROC NAME AUTHOR DATE
* ERRMSG P.WARBURTON 77/05/16
*
* 2. FUNCTIONAL DESCRIPTION
* GENERATE DAYFILE MSG-S "TVF ERRMSG" AND "TVF ERC", FILLING IN
* VALUES FOR ABT, ADR, TEXT, AND TERMINAL
*
* 3. METHOD USED
* SET UP FOR ERRMSG OR ERR/LGL/SM.
* IF ERR/LGL/SM, FILL IN VALUE FOR RC, THEN MOVE HEADER OF
* MSG THAT CAUSED ERR FROM BUF[1] TO HEADER, AND FIRST WORD OF
* MSG THAT CAUSED ERR FROM BUF[2] TO BUF[0].
* NOW FILL IN VALUES FOR VARIABLES. USE ACT OF HEADER TO
* DETERMINE WHETHER HEX OR OCTAL SOURCE TO DISPLAY CODE.
* THEN DETERMINE IF TABLE CONTAINS A RELEVANT TERMINAL NAME.
*
* 4. ENTRY CONDITIONS
* MSG IN BUFFER, EITHER ERR/LGL/SM, SUPERVISORY, OR DATA MSG.
* TABLE HAS ENTRY FOR CONNECTED TERMINAL.
*
* 5. EXIT CONDITIONS
* GOTO NEXT, FOR NEXT INPUT.
*
* 6. COMONDECKS CALLED: NONE
*
* 7. PROCEDURES/FUNCTIONS CALLED
* XCHD, HEX TO DISPLAY CONVERSION
* XCDD, OCTAL TO DECIMAL TO DISPLAY CONVERSION
* MESSAGE, TO OUTPUT DAYFILE MSG
*
* 8. DAYFILE/DIAGNOSTIC MESSAGES
* (SEE ABOVE, 2 THRU 7)
#
*ENDIF
IF PFC EQ ERR THEN
BEGIN
BUC[10] = "TVF ERC=NN";
TEMP = XCDD(RC);
C<8,2> BUC[10] = C<8,2> TEMP;
ABHWORD = BUF[1];
BUF[0] = BUF[2];
END
ELSE BUC[10] = "TVF ERRMSG";
BUC[11] = ", ABT=NN, ";
BUC[12] = "ADR=NNNN, ";
BUC[13] = "TEXT=NNNN ";
TEMP = XCDD(ABHABT);
C<6,2> BUC[11] = C<8,2> TEMP;
TEMP = XCDD(ABHADR);
C<4,4> BUC[12] = C<6,4> TEMP;
IF ABHACT EQ 1 OR ABHACT EQ 2 OR ABHACT EQ 3 THEN
BEGIN
TEMP = XCHD(PFCSFC);
C<5,4> BUC[13] = C<6,4> TEMP;
END
ELSE C<5,4> BUC[13] = C<0,4> BUC[0];
IF ACN NQ 0 AND ACN LQ TERMCOUNT AND TPFCSFC[ACN] NQ 0 THEN
BEGIN
BUC[14] = ",TERMINAL =";
C<0,7> BUC[15] = C<0,7> TNAME[ACN];
B<42,18> BUF[15] = 0;
BUF[16] = 0;
END
ELSE BUF[14] = 0;
MESSAGE (BUFFOUT,DFOPTION);
IF TPFCSFC [ABHADR] EQ FCINIT THEN CLEANUP;
ELSE GOTO NEXT;
END
CONTROL EJECT;
PROC SMTREE;
BEGIN
*IF,DEF,IMS
#
*1DC SMTREE
*
* 1. PROC NAME AUTHOR DATE
* SMTREE P.WARBURTON 77/05/16
*
* 2. FUNCTIONAL DESCRIPTION
* ANALYZE SUPERVISORY MESSAGE AND DO APPROPRIATE ACTION (REPLY
* UPDATE TABLE, MSG TO TERMINAL, OR GOTO ERRMSG TO PROCESS
* ERROR)
*
* 3. METHOD USED
* DECISION TREE TESTS SM IN AN ORDERLY SEQUENCE BY TABLE
* VALUES:
* -TABLE ENTRY CLEAR, LOOKING FOR CON/REQ/SM
* -TABLE ENTRY HAS CONREQ, LOOKING FOR FC/INIT/SM
* -TABLE ENTRY HAS FCINIT, LOOKING FOR LEGAL SM
* -TABLE ENTRY HAS CONEND, LOOKING FOR CON/END/N
* IF NOT LEGAL, GOTO ERRMSG TO PROCESS ERROR.
*
* 4. ENTRY CONDITIONS
* MSG IN BUFFER, HEADER IN ABH
* TABLE HAS ENTRY FOR TERMINALS
*
* 5. EXIT CONDITIONS
* GOTO NEXT, IF MSG PROCESSED OR DELIBERATELY IGNORED.
* ENDTEST, IF ENDTEST CONDITION DETECTED.
* ERRMSG, IF FALLTHRU DECISION TREE, MSG IN BUFFER FOR ERRMSG.
* ENDCON, TO END A CONNECTION.
* LOFFMSG, AFTER SENDING BANNER.
* TABLE ENTRY UPDATED.
*
* 6. COMMON DECKS CALLED
* NONE
*
* 7. PROCEDURES/FUNCTIONS CALLED
* GOTO NEXT - CONTROL PASSES BACK TO MAINLOOP
* NETPUT - MSG TO TERMINAL
* ENDTEST - EXIT TO PROC ENDTEST
* ERRMSG - EXIT TO PROC ERRMSG
* ENDCON - EXIT TO END A CONNECTION
* LOFFMSG - AFTER SENDING A BANNER
* DATE - FOR BANNER DISPLAY TO TERMINAL
* CLOCK - BANNER
* XCDD - BANNER, OCTAL TO DECIMAL TO DISPLAY CODE
*
* 8. DAYFILE MSG
* NONE - EXIT TO ERRMSG TO PROCESS ERROR
*
#
*ENDIF
IF TPFCSFC[ACN] EQ 0 AND PFCSFC EQ CONREQ THEN
BEGIN
IF COND EQ 0 # ALLOW CONSOLE DEVICE CONNECTION ONLY #
THEN
BEGIN
TWORD0[ACN] = BUF[0];
TWORD1[ACN] = BUF[1];
TTST[ACN] = 0;
TFLAG[ACN] = 0;
RB = TRUE;
CONACT = 2;
CONALN = 0;
END
ELSE EB = TRUE;
ABHTLC = 1;
NETPUT (ABH,BUFFER);
GOTO NEXT;
END
IF TPFCSFC[ACN] EQ CONREQ AND PFCSFC EQ CONCB THEN ENDCON;
IF TPFCSFC[ACN] EQ CONREQ AND PFCSFC EQ FCINIT THEN
BEGIN
TPFCSFC[ACN] = PFCSFC; # FC/INIT/N #
RB = TRUE;
NETPUT (ABH,BUFFER);
DATE (TEMP); #NOW CONSTRUCT BANNER #
BUC[10] = TEMP;
CLOCK (TEMP);
BUC[11] = TEMP;
BUF[12] = 0;
BUC[13] = "TVF ";
B<18,42>BUF[13] = 0;
BUC[14] = "TERMINAL N";
BUC[15] = "AME = ";
C<6,4> BUC[15] = C<0,4>TNAME[ACN];
C<0,3> BUC[16] = C<4,3>TNAME[ACN];
B<18,42>BUF[16]= 0;
BUC[17] = "TERMINAL C";
BUC[18] = "LASS=NN/MO";
TEMP = XCDD(TTC[ACN]);
C<5,2> BUC[18] = C<8,2>TEMP;
BUC[19] = "DEL XXXXXX";
C<4,6> BUC[19] = MODEL[TTC[ACN]];
BUC[20] = C<6,4>MODEL[TTC[ACN]];
B<24,36>BUF[20] = 0;
BUC[21] = "LINE WIDTH";
BUC[22] = " = XXX ";
TEMP = XCDD(TPW[ACN]);
C<3,3> BUC[22] = C<7,3>TEMP;
B<36,24>BUF[22] = 0;
BUC[23] = "PAGE LENGTH";
BUC[24] = "H = XXX ";
B<42,18>BUF[24] = 0;
TEMP = XCDD(TPL[ACN]);
C<4,3> BUC[24] = C<7,3>TEMP;
BUF[25] = 0;
C<00,10> BUC[26] = C<00,10> NAMVER;
C<00,03> BUC[27] = C<10,03> NAMVER;
C<3,05> BUC[27] = NAMLV;
B<48,12> BUF[27] = 0;
BUF[28] = PROMPT;
ABHABT = 2;
ABHADR = ACN;
ABHACT = 4;
ABHNFE = 1;
ABHTLC = 190;
NETPUT (ABH,BUFFOUT);
LOFFMSG;
END
IF TPFCSFC[ACN] EQ FCINIT THEN
BEGIN
IF PFCSFC EQ CONCB OR PFCSFC EQ FCSTP OR PFCSFC EQ FCNAK
THEN ENDCON;
IF PFCSFC EQ INTRUSR
AND (INTRCHR EQ RIR"UB1"
OR INTRCHR EQ RIR"UB2")
THEN # USER BREAK 1 OR 2 OCCURRED #
BEGIN
ABHWORD = 0;
ABHABT = 3;
ABHACT = ACINTR;
ABHTLC = LINTR;
SPMSG0 = 0;
PFCSFC = INTRRSP;
INTRACN = ACN;
NETPUT(ABH,BUFFER); # SEND INTR/RSP #
ABHWORD = 0;
ABHABT = 3;
ABHADR = ACN;
ABHACT = 2;
ABHTLC = LROMARK;
SPMSG0 = 0;
PFCSFC = ROMARK;
NETPUT(ABH,BUFFER); # SEND SYN CMD RO/MARK #
ENDTEST;
END
IF PFCSFC EQ TCHTCH THEN
BEGIN
TPW[ACN] = TCHPW;
TPL[ACN] = TCHPL;
GOTO NEXT;
END
IF PFCSFC EQ FCACK AND TFLAG2[ACN] EQ 1 THEN ENDTEST;
IF PFCSFC EQ FCACK THEN
BEGIN
TFLAG[ACN] = 0;
PFCSFC = LSTON;
NETPUT (ABH,BUFFER);
GOTO NEXT;
END
IF PFCSFC EQ FCINA THEN GOTO NEXT;
END
IF TPFCSFC[ACN] EQ CONEND THEN
IF PFC EQ CON AND SFC EQ ENDD AND RB THEN
BEGIN
TWORD0[ACN] = 0;
TWORD1[ACN] = 0;
GOTO NEXT;
END
ELSE GOTO NEXT;
ERMMSG;
END
CONTROL EJECT;
PROC ENDCON;
BEGIN
*IF,DEF,IMS
#
*1DC ENDCON
* 1. PROC NAME AUTHOR DATE
* ENDCON P.WARBURTON 77/06/01
*
* 2. FUNCTIONAL DESCRIPTION
* ISSUES CON/END/SM WHEN CALLED
*
* 3. METHOD USED
* FORMATS HEADER AND SM
*
* 4. ENTRY CONDITIONS
* LOC "ACN" CONTAINS ACN
*
* 5. EXIT CONDITIONS
* NONE - EXITS TO MAINLOOP
*
* 6. COMMON DECKS CALLED
* NONE
*
* 7. PROCEDURES CALLED
* NETPUT
*
* 8. DAYFILE MSG
* NONE
*
#
*ENDIF
ABHABT = 3;
ABHADR = 0;
ABHACT = 1;
ABHTLC = 2;
PFCSFC = CONEND;
CONACN = ACN;
RC = 0;
BUF[1] = 0;
TPFCSFC[ACN] = CONEND;
NETPUT (ABH,BUFFER);
GOTO NEXT;
END
CONTROL EJECT;
PROC TERMSG;
BEGIN
*IF,DEF,IMS
#
*1DC TERMSG
*
* 1. PROC NAME AUTHOR DATE
* TERMSG P.WARBURTON 77/05/16
*
* 2. FUNCTIONAL DESCRIPTION
* ANALYZE INPUT DATA MSG TO DETERMINE APPROPRIATE OUTPUT,
* GENERATE OUTPUT, PASS CONTROL TO MAINLOOP (GOTO NEXT) OR
* CALL PROCEDURE TO PROCESS NEXT OUTPUT STEP
*
* 3. METHOD USED
* DECISION TREE TESTS INPUT MSG IN AN ORDERLY SEQUENCE BY
* TABLE:
* -TTST[ADR] EQ 0, LOOK FOR VARIOUS TVF COMMANDS - IF FALLTHRU,
* ISSUE UNREG ENTRY MSG
* -TTST[ADR] EQ 1, PROCESS INPUT FOR TEST 1
* -TTST[ADR] EQ 2 OR 3, SET UP FOR CALL TO PROC GENDATA
* -TTST[ADR] EQ OTHER, SET TEST = 0, SEND "TVF READY" MSG
*
* 4. ENTRY CONDITIONS
* DATA MSG IN BUFFER, HEADER IN ABH
* TABLE ENTRIES FOR CONNECTED TERMINALS
*
* 5. EXIT CONDITIONS
* GOTO NEXT, IF MSG PROCESSED
* GENDATA, IF READY TO GENERATE DATA FOR TEST 2 AND 3
* ERRMSG, IF ADR FOR TERMINAL NOT CONNECTED
* TABLE UPDATED, AND FOR TEST 2 SET TFLAG2
* ENDTEST, IF TEST 1 "ENDL" MSG
* LOFFMSG, IF MSG SENT TO TERMINAL
*
* 6. COMMON DECKS CALLED
* NONE
*
* 7. PROCEDURES/FUNCTIONS CALLED
* NETPUT - OUTPUT MSG TO TERMINAL
* GOTO NEXT - EXIT TO MAINLOOP
* ERRMSG - EXIT FOR ERROR PROCESSING
* GENDATA - EXIT TO GENERATE DATA FOR TESTS 2 AND 3,
* I = NUMBER OF CHAR TO BE GENERATED
* ENDTEST - EXIT FOR TEST 1 "ENDL" COMMAND
* LOFFMSG - EXIT AFTER SENDING MESSAGE
#
*ENDIF
IF TPFCSFC[ABHADR] EQ CONEND THEN GOTO NEXT;
IF TPFCSFC[ABHADR] NQ FCINIT THEN ERMMSG;
IF ABHBIT EQ 1 THEN
BEGIN
BUF [10] = X"4552524F52202D2"; #PARITY ERR MSG TO TERMINAL #
BUF [11] = X"050415249545920";
BUF [12] = 0;
BUF [13] = 0;
K = ABHTLC*8;
IF K GR 40 THEN K = 40;
FOR J = 0 STEP 8 WHILE J LQ K DO
B<J,8> BUF[12] = B<J,8> BUF[0];
ABHABT = 2;
BUF[14] = X"1F2E2E1F0000000";
ABHNFE = 1;
ABHBIT = 0;
ABHTLC = 34;
NETPUT (ABH,BUFFOUT);
TTST[ABHADR] = 0;
LOFFMSG;
END
IF TTST[ABHADR] EQ 0 THEN
BEGIN
IF ABHTLC EQ 4 AND
B<0,32>BUF[0] EQ X"48454C50" OR #TEST FOR HELP COMMAND #
ABHTLC EQ 4 AND
B<0,32>BUF[0] EQ X"68656C70" THEN
BEGIN
ABHABT = 2;
ABHACT = 4;
ABHNFE = 1;
ABHTLC = 90;
NETPUT (ABH,COMLIST);
LOFFMSG;
END
IF ABHTLC EQ 4 AND
B<0,32>BUF[0] EQ X"54455354" OR #TEST FOR TESTLIST COMMAND#
ABHTLC EQ 4 AND
B<0,32>BUF[0] EQ X"74657374" THEN
BEGIN
ABHABT = 2;
ABHACT = 4;
ABHNFE = 1;
ABHTLC = 110;
NETPUT (ABH,TESTLIST);
LOFFMSG;
END
IF ABHTLC EQ 3 AND
B<0,24>BUF[0] EQ X"454E44" OR #TEST FOR END #
ABHTLC EQ 3 AND
B<0,24>BUF[0] EQ X"656E64" THEN ENDCON;
IF ABHTLC EQ 1 AND PFC EQ X"31" THEN
BEGIN
BUC[10] = "LOOPBACK T";
BUC[11] = "EST BEGINS";
TTST[ACN] = 1;
END
IF ABHTLC EQ 1 AND PFC EQ X"32" THEN
BEGIN
BUC[10] = "LINETEST B";
BUC[11] = "EGINS ";
B<30,30>BUF[11] =0;
TTST[ACN] = 2;
END
IF ABHTLC EQ 1 AND PFC EQ X"33" THEN
BEGIN
BUC[10] = "SCREEN TES";
BUC[11] = "T BEGINS ";
B<48,12>BUF[11] = 0;
TTST[ACN] = 3;
END
IF TTST[ACN] NQ 0 THEN
BEGIN
BUF[12] =0;
BUF[13] = PROMPT[0];
ABHABT = 2;
ABHACT = 4;
ABHNFE = 1;
ABHTLC = 40;
NETPUT (ABH,BUFFOUT);
LOFFMSG;
END
BUF [10] = X"4552524F52202D2"; #MSG TO TERMINAL #
BUF [11] = X"0454E5452592020"; #UNRECOGNIZED ENTRY #
BUF [12] = 0;
BUF [13] = 0;
K = ABHTLC*8;
IF K GR 40 THEN K = 40;
FOR J = 0 STEP 8 WHILE J LQ K DO
B<J,8> BUF[12] = B<J,8> BUF[0];
BUF [14] = X"1F2E2E1F0000000";
ABHACT = 2;
ABHABT = 2;
ABHNFE = 1;
ABHTLC = 34;
NETPUT (ABH,BUFFOUT);
TTST[ABHADR] = 0;
LOFFMSG;
END
IF TTST[ABHADR] EQ 1 THEN
BEGIN
IF ABHTLC EQ 4 AND B<0,32> BUF[0] EQ X"454E444C" OR
ABHTLC EQ 4 AND B<0,32>BUF[0] EQ X"656E646C" THEN ENDTEST;
ABHNFE = 1;
I = ABHTLC;
COMPUTEUS;
IF ABHABT EQ 2
THEN
BEGIN
I = ABHTLC;
COMPUTEUS; # SECOND UNIT SEPARATOR FOR ASYCH TERMINAL #
END
NETPUT (ABH,BUFFER);
LOFFMSG;
END
IF TTST[ABHADR] EQ 2 THEN
BEGIN
TFLAG2[ACN] = 1;
I = TPW[ABHADR];
IF I EQ 0 THEN ENDTEST;
ABHABT = 1;
ABHNFE = 1;
GENDATA;
END
IF TTST[ABHADR] EQ 3 THEN
BEGIN
I = TPW[ACN]*(TPL[ACN]-1);
IF I LS 96 THEN I =96;
IF I GR 2000 THEN I = 2000;
ABHABT = 2;
ABHNFE = 0;
GENDATA;
END
CLEANUP;
END
CONTROL EJECT;
PROC COMPUTEUS; # COMPUTE AND POSITION <US>, INCREMENT ABHTLC #
BEGIN # I = COUNT OF ASCI CHARACTERS #
J = (I/15)*2; # COMPUTE WD ADR OF LAST WD PAIR OF ASCI CHAR #
K = I-(15*(I/15));# COMPUTE NUMBER OF CHAR IN LAST WORD PAIR #
IF K LS 7 THEN
BEGIN
K=K*8;
B<K,8>BUF[J] = X"1F";
END
IF K EQ 7 THEN
BEGIN
B<56,4>BUF[J] = X"1";
B<0,4> BUF[J+1] = X"F";
END
ELSE
BEGIN
K =((K-8)*8)+4;
B<K,8> BUF[J+1] = X"1F";
END
ABHTLC = I + 1;
END
CONTROL EJECT;
PROC CLEANUP;
BEGIN
ABHABT = 2;
ABHACT = 4;
ABHTLC = 30;
TTST[ABHADR] = 0;
NETPUT(ABH,TVFERR);
LOFFMSG;
END
CONTROL EJECT;
PROC GENDATA;
BEGIN
*IF,DEF,IMS
#
*1DC GENDATA
*
* 1. PROC NAME AUTHOR DATE
* GENDATA P.WARBURTON 77/05/16
*
* 2. FUNCTIONAL DESCRIPTION
* FOR TESTS 2 AND 3, TVF USER MAY RETURN A CHARACTER TO BE USED
* IN THE LINE OR SCREEN TESTS, OR A NULL INPUT, IN WHICH CASE
* TVF GENERATES OUTPUT FROM THE 95 CHAR ASCII SUBSET.
*
* 3. METHOD USED
* IF NULL INPUT, 14 WORDS (110 ASCII CHARACTERS) ARE MOVED FROM
* THE ARRAY "ASCII" TO THE BUFFER REPEATEDLY UNTIL BUFFER
* CONTAINS MORE THAN ENOUGH CHARACTERS FOR LINE OR SCREEN
* OUTPUT. IF CHAR INPUT, CHAR IS PACKED IN WORD PAIR (15
* CHARACTERS) AND THE BUFFER FILLED WITH ENOUGH WORD PAIRS
* FOR OUTPUT. FOR TEST 3, FIRST WORD PAIR CONTAINS A FORMAT
* EFFECTOR TO CLEAR SCREEN: FE IS FIRST CHAR, REST IS NULL
* FILLED. FOR TEST 2, FIRST WORD PAIR IS NULL FILLED.
*
* 4. ENTRY CONDITIONS
* ITEM I CONTAINS NUMBER OF CHAR TO BE GENERATED.
* BUFFER CONTAINS INPUT MSG, IF ANY.
* ABH CONTAINS HEADER, TLC=0 FOR NULL INPUT.
* TABLE CONTAINS ENTRY FOR TERMINAL.
*
* 5. EXIT CONDITIONS
* EXIT TO LOFFMSG.
*
* 6. COMMON DECKS CALLED
* NONE
*
* 7. PROCEDURES/FUNCTIONS CALLED
* LOFFMSG - EXIT AFTER SENDING MESSAGE.
* NETPUT - OUTPUT MSG TO TERMINAL.
*
* 8. DAYFILE MSG
* NONE
*
#
*ENDIF
IF ABHTLC EQ 0 THEN
BEGIN
FOR J = 0 STEP 14 WHILE (J*15) LS (I*2) DO
FOR K = 0 STEP 1 UNTIL 13 DO
BUF[J+K] = ASCII[K];
END
ELSE
BEGIN
FOR J = 8 STEP 8 WHILE J LS 56 DO
B<J,8> BUF [0] = PFC;
B<56,4> BUF [0] = B<0,4> PFC;
B<0,4> BUF [1] = B<4,4> PFC;
FOR J = 4 STEP 8 WHILE J LS 60 DO
B<J,8> BUF [1] = PFC;
FOR J = 2 STEP 2 WHILE (J/2) LS ((I+15)/15) DO
BEGIN
BUF [J] = BUF [0];
BUF [J+1] = BUF [1];
END
END
IF TTST[ACN] EQ 3 THEN
BEGIN
PFC = X"31";
TTST[ACN] = 0;
END
COMPUTEUS;
NETPUT (ABH,BUFFER);
LOFFMSG;
END
CONTROL EJECT;
PROC ENDTEST; # TEST 1, 2 COMPLETE #
BEGIN
*IF,DEF,IMS
#
*1DC ENDTEST
*
* 1. PROC NAME AUTHOR DATE
* ENDTEST P.WARBURTON 77/05/16
*
* 2. FUNCTIONAL DESCRIPTION
* SEND TO TERMINAL "TEST COMPLETE" MSG.
* -CALLED FROM PROC GENDATA.
* -CALLED FROM PROC SMTREE WHEN FC/ACK/SM RECEIVED.
* -CALLED FROM PROC TERMSG DN TEST 1 "ENDL" COMMAND.
*
* 3. METHOD USED
* FORMAT MSG, NETPUT IT, AND CLEAR TEST AND TFLAG.
*
* 4. ENTRY CONDITIONS
* ABHABT SET FOR DATA MSG
* ABHADR SET FOR ACN
* TFLAG2 SET (FOR TEST 2 ONLY)
*
*
* 5. EXIT CONDITIONS
* EXIT TO LOFFMSG.
*
* 6. COMMON DECKS CALLED
* NONE
*
* 7. PROCEDURES/FUNCTIONS CALLED
* NETPUT - SEND MSG TO TERMINAL
* LOFFMSG - EXIT AFTER SENDING MESSAGE.
*
* 8. DAYFILE MSG
* NONE
#
*ENDIF
ABHABT = 2;
ABHADR = ACN;
ABHACT = 4;
ABHNFE = 1;
ABHTLC = 30;
NETPUT(ABH,TESTCOM);
TTST[ABHADR] = 0;
TFLAG2[ACN] =0;
LOFFMSG;
END
CONTROL EJECT;
PROC LOFFMSG;
BEGIN
*IF,DEF,IMS
#
*1DC LOFFMSG
* 1. PROC NAME AUTHOR DATE
* LOFFMSG P.WARBURTON 77/06/01
*
* 2. FUNCTIONAL DESCRIPTION
* ISSUES LST/OFF/SM WHEN CALLED
*
* 3. METHOD USED
* FORMATS HEADER AND SM
*
* 4. ENTRY CONDITIONS
* ACN IS IN LOC "ACN"
*
* 5. EXIT CONDITIONS
* NONE - EXITS TO MAINLOOP
*
* 6. COMMON DECKS CALLED
* NONE
*
* 7. PROCEDURES CALLED
* NETPUT
*
* 8. DAYFILE MSG
* NONE
*
#
*ENDIF
PFCSFC = LSTOFF;
LSTACN = ACN;
ABHABT = 3;
ABHADR = 0;
ABHACT = 1;
ABHTLC = 1;
NETPUT (ABH,BUFFER);
TFLAG[ACN] = 1;
GOTO NEXT;
END
END #END OF TVF PROG #
TERM