|
DataMuseum.dkPresents historical artifacts from the history of: CP/M |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CP/M Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 201472 (0x31300) Types: TextFile Names: »D100«
└─⟦2520239fd⟧ Bits:30005867/disk13.imd Dokumenter (RCSL m.m.) └─⟦this⟧ »D100«
i T_A_B_L_E_ _O_F_ _C_O_N_T_E_N_T_S_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _P_A_G_E_ _ 1. INTRODUCTION .......................................... 1 2. PARAMETER FORMAT ...................................... 2 3. COMMAND FILE SYNTAX ................................... 3 4. OPERATOR COMMUNICATION ................................ 7 5. CHAINED PROGRAMS ...................................... 8 A_P_P_E_N_D_I_X_ A. REFERENCES ............................................ 11 \f ii \f 1_._ _ _ _ _ _ _ _ _I_N_T_R_O_D_U_C_T_I_O_N_ 1. The EXEC program is the DOMUS batch processor module, which exe- cutes utility-program calls and S-functions in a sequential user defined sequence. Commands are supplied by the user as ASCII characters on a discfile or external device. In contrary to the DOMUS INT (ERPRET) function each termination of a utility-program is awaited and the success of the call is checked. In case of error the whole job is aborted is specified so by the user in the EXEC call. The command file is read to the internal workfile .XEC before interpretation, hereby releasing the input device for use in the job. \f 2_._ _ _ _ _ _ _ _ _P_A_R_A_M_E_T_E_R_ _F_O_R_M_A_T_ 2. The syntax of the call follows the general rules given in 2, and the parameters are: EXEC IN.<filename' LIST.<filename' STOP<boolean' CONT.<filename' IN: This is the file containing a number of lines with nor- mal S-functions, internal commands or utility calls in the same format as used when entering commands to the S-process from the operator console. The syntax check is left to the S-process, and the function of the EXEC program is mainly to split the file into single commads send for interpretation and execution at the S-process. LIST: A log of the commands is produced on this file. The file can not be used by programs loaded during the job. STOP: If this parameter equals YES, a check is performed on each utility termination, and if the program reports a non-sucessful termination, the whole job is terminated with an error message. CONT: If specified, this file must be a command file for DOMUS. When the EXEC command FINISH is executed, the EXEC program will be removed, and the operating system is requested to interpret this file. Default: EXEC IN.PTR LIST.<0'...<0' STOP.NO CONT.<0'...<0' \f 3_._ _ _ _ _ _ _ _ _C_O_M_M_A_N_D_ _F_I_L_E_ _S_Y_N_T_A_X_ 3. The only check performed by the EXEC program is a check on the identifier found as the first item on each line, and a final check is left to the operating system and the programs loaded. The syntax is then the one described in 1 and 2, and the only operation done by the EXEC module is the line separation, as the lines are handed over to the S-process for execution line by line. However, following exception exists: - BEGIN and END commands are blind and the rest of the line is skipped, hereby left for comments. - A DRIVE function implies that following program-loads are per- formed from the catalog unit given as parameter, until a new DRIVE function is found, and the END function will not reset the drive number to zero. - A CONNECT command implies that the filenames stated in the following utility program calls will be interpreted as belong- ing to the stated catalog. Note, that an END-command has no effect in the command file. - A RELEASE command will change the current catalog to the cata- log that was current, when the EXEC program was loaded. Note, that if connection to the main catalog is wanted, the command CONNECT CAT must be used. - Comments can be given anywhere in the command file as !<any number of characters except!'!. The whole comment is skipped and replaced by a single space, but transferred to the list- file unchanged. Newline characters in a comment string have no effect. - LIST functions are ignorred by the S-process. \f - Each line must not exceed 500 characters in length, including comments which are counted as one character. - Characters which are interpreted as blind or illegal by the S-process are skipped. - Tabulation characters are converted to spaces on the listfile. The action taken by the EXEC module depends on the identifier found as the first item on each line, and is given in the below table. Internal functions can be viewed on as utility functions, although no load is performed. B_E_G_I_N_ The line is ignored by the EXEC program. B_O_O_T_ The line is send to the S-process for execution. If the command is accepted, the DOMUS system, including the EXEC-program, is overwritten and properly termination of log output or job can not be expected. C_L_E_A_N_ The line is send to the S-process. C_L_E_A_R_ The line is send to the S-process. C_O_N_N_E_C_T_ The current catalog is changed to the one given as par- ameter. Note that the current catalog is not changed even if an END-command is met. D_R_I_V_E_ The drive-number specified as a parameter will be the catalog unit from where the following program loads are performed. Note that the drive-number is not changed even if an END command is found in contrary to normal use of console entered commands. Before a DRIVE command or a load from a catalog unit different from zero is used, an INIT command should be given. Only decimal drive numbers are allowed. E_N_D_ The command is ignored by the EXEC program. \f F_I_N_I_S_H_ This is an internal command. Job execution is termina- ted, and the EXEC program is removed from the core, and all processes loaded during run is removed too by the operating system. The command must be the last in the command file. F_R_E_E_ The line is send to the S-process. G_E_T_ The line is send to the S-process. I_N_I_T_ The line is send to the S-process. I_N_T_ The line is send to the S-process. K_I_L_L_ The line is send to the S-process. The process to kill must not have messages pending at the EXEC process, else this is breaked with breakcause 1. L_I_S_T_ Ignored by the operating system. L_O_A_D_ The line is send to the S-process. LOAD function can be used for utility program loads like LOAD (DELETE PIP) but the termination of the utility program is not awai- ted. The termination messages will, however, be granted and the utility program is removed when the message is send. If the utility function has not terminated when EXEC program finds a FINISH command, it is removed un- conditionally. P_A_U_S_E_ This is an internal command. A number sign (#) is output on the operator console, and the EXEC process waits for operator intervention. If operator inputs STOP the EXEC process will stop execution as if a FINISH command was\f met, and the outputs the message >EXECUTION STOPPED BY THE OPERATOR>, else the execution is continued. R_E_L_E_A_S_E_ Changes the current catalog to the one that was current catalog of DOMUS, when EXEC was called. This is not neccessarily the main catalog. To change to the main catalog, use the command CONNECT CAT. S_T_A_R_T_ The line is send to the S-process. S_T_O_P_ The line is send to the S-process. <any other name' The line is send to the S-process as a utility program load function. A termination message from the utility module is awaited, and if this indicates an unsuccessful run the execution is aborted is STOP.YES is specified, else job execution is continued. If the job is aborted the text >UTILITY PROGRAM ERROR, PROGRAM <name' is output on the operator console. Note: Do not load other modules than utility programs in this way, as a missing termination message will hang up EXEC for ever. \f 4_._ _ _ _ _ _ _ _ _O_P_E_R_A_T_O_R_ _C_O_M_M_U_N_I_C_A_T_I_O_N_ 4. The EXEC program accepts input from operator during run. If operator inputs STOP the execution of the command-file is aborted and the program outputs EXECUTION STOPPED BY OPERATOR If a PAUSE command is met a numbersign (#) is output, and the program waits for input. If the operator inputs STOP the execu- tion is aborted as above explained, else the execution is con- tinued. Example (input marked with _): c_o_n_t_r_o_l_ _G_ 'E_X_E_C_ S_T_O_P_ EXECUTION STOPPED BY OPERATOR 'S FINISH EXEC \f 5_._ _ _ _ _ _ _ _ _C_H_A_I_N_E_D_ _P_R_O_G_R_A_M_S_ 5. When utility programs sends a termination message, this message can hold a string of commands, which is requested to be interpre- ted and executed when removal of the program from core has taken place. The EXEC module interprets such commands as if they were present in the operator specified command file after the previous execu- ted line, and the commands must therefore obey the rules given in section 3. The list file output is ignored during execution of these commands, and they are invisible to operator, as if the requesting program was still running, and can be repeated any number of times, only limited by disc space. Example: Command file PROG1 request PROG2 request PROG3 request PROG1 PROG2 PROG4 PROG5 PROG3 PROG6 Resulting sequence of program calls: PROG1 PROG2 PROG4 PROG5 Not listed on log. PROG3 PROG6 \f If the file TESTC contains the text: CHATR ASC1 EDIT ASC1 ! UNPROTECT, EDIT AND ! CHATR ASC1 PW ! PROTECT SOURCE 1 ! PAUSE ! WAITING FOR READER ! COPY PTR ASC2 ! READ ,EDIT AND ! EDIT ASC2 ! PROTECT SOURCE 2 ! CHATR ASC2 PW DOMAC LIST.LPT BIN.R1 ASC1 DELETE XXX DOMAC LIST.XXX BIN.R2 ASC2 PRINT XXX PRINT XXX ! PROCEDURE TWO LISTING OF ASC2 ! DELETE TEST LINK TEST LOG.LPT FORM.R IN.R1 R2 TEST ! LOAD THE PROGRAM ! FINISH the call EXEC TESTC will call the Editor twice, assemble the two sources and load the resulting program. Listing of the code is produced for both modules, with two copies of the source read from paper tape. \f \f A_P_P_E_N_D_I_X_ _A_ _-_ _R_E_F_E_R_E_N_C_E_S_ 1 DOMUS User>s Guide, Part 1. 2 DOMUS User>s Guide, Part 2. \f \f i T_A_B_L_E_ _O_F_ _C_O_N_T_E_N_T_S_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _P_A_G_E_ 1. INTRODUCTION ........................................... 1 1.1 Structure of this Manual .......................... 2 1.2 Notes on Notation and Terminology ................. 2 2. RC8000 TERMINAL PROCESS INTERFACE ...................... 4 2.1 Attention Message ................................. 4 2.2 Sense Operation ................................... 5 2.3 Input Operation ................................... 5 2.3.1 Initialization ............................. 6 2.3.2 Input Phase ................................ 6 2.3.3 Termination ................................ 7 2.3.4 Input Operation Format ..................... 8 2.4 Output Operation .................................. 8 2.4.1 Initialization ............................. 8 2.4.2 Output Phase ............................... 9 2.4.3 Termination ................................ 9 2.4.4 Output Operation Format .................... 10 2.5 Other Operations .................................. 10 2.6 Printouts ......................................... 10 3. NETWORK INTERFACE ...................................... 13 3.1 NPM Operations .................................... 13 3.1.1 Open Operations ............................ 13 3.1.2 Receive Operations ......................... 13 3.1.3 Send Operations ............................ 14 3.1.4 Close Operations ........................... 15 3.2 SC Operations ..................................... 15 3.2.1 Event Control .............................. 15 3.2.1.1 Establish Request ................. 15 3.2.1.2 Removal Request ................... 16 3.2.1.3 Other Results ..................... 16 3.2.2 Connect Accept ............................. 17 3.2.3 Disconnect Accept .......................... 17 3.2.4 Abort Request .............................. 17 \f ii T_A_B_L_E_ _O_F_ _C_O_N_T_E_N_T_S_ _(_c_o_n_t_i_n_u_e_d_)_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _P_A_G_E_ 3.3 VTP Operations .................................... 18 3.3.1 Connection and Disconnection of Terminals .. 18 3.3.2 Input ...................................... 19 3.3.2.1 Text Blocks ....................... 20 3.3.2.2 Ctrl Blcoks ....................... 20 3.3.2.3 Conn Blocks ....................... 20 3.3.2.4 Telegrams ......................... 21 3.3.3 Output ..................................... 21 3.3.3.1 Text Blocks ....................... 21 3.3.3.2 Ctrl Blocks ....................... 21 3.3.3.3 Conn Blocks ....................... 22 3.3.3.4 Telegrams ......................... 22 4. PROGRAM STRUCTURE ...................................... 23 4.1 Notation .......................................... 23 4.2 Normal Operation Flow ............................. 26 4.2.1 Message from an Application Process ........ 26 4.2.2 Input Answer from the Network .............. 27 4.3 Start and Stop of Operation Flow .................. 29 4.3.1 Start of Operation Flow .................... 29 4.3.2 Stop of Operation Flow ..................... 29 4.4 Structure of the Program Text ..................... 30 5. SEMAPHORES AND OPERATIONS .............................. 32 5.1 Semaphores ........................................ 32 5.1.1 Initialization of Semaphores ............... 33 5.2 Operations ........................................ 33 5.2.1 Operations Signalled to wait _answer _pool/ att _answer/input _answer .................... 33 5.2.2 Operations Signalled to wait _message ....... 34 5.2.3 Operations Signalled to start _input ........ 35 5.2.4 Operations Signalled to term _task .......... 35 5.2.5 Survey of Operations ....................... 39 \f iii T_A_B_L_E_ _O_F_ _C_O_N_T_E_N_T_S_ _(_c_o_n_t_i_n_u_e_d_)_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _P_A_G_E_ 6. COROUTINES ............................................. 40 6.1 Coroutine start _network _input ..................... 40 6.1.1 Strategy for Multibuffering in answers Zone 41 6.2 Coroutine network _input ........................... 42 6.3 Coroutine appl _message ............................ 44 6.4 Coroutine terminal ................................ 45 6.4.1 Outlines of the Automaton .................. 46 6.4.2 Survey of States, Actions and Derivation Rules ...................................... 51 6.4.3 The Work of the Automaton .................. 53 6.4.3.1 Notes ............................. 53 6.4.3.2 Description of the Actions ........ 54 6.5 Manipulations of VTP Text Blocks .................. 59 6.5.1 Character Conversions ...................... 59 6.5.2 Format Transformations ..................... 61 6.6 Manipulations of Zones ............................ 63 6.6.1 Open of Zones .............................. 63 6.6.2 Prepare read _char .......................... 63 6.6.3 Prepare Zone Record ........................ 64 6.6.4 Prepare write/out _char ..................... 64 6.6.5 Close of Zones ............................. 65 6.6.6 Block Procedures ........................... 65 6.6.6.1 Block Procedure answer _input ...... 65 6.6.6.2 Block Procedure send _output ....... 66 6.6.6.3 Block Procedure write _text _seg .... 67 7. TEST AND DEBUG TOOLS ................................... 68 7.1 Testoutput ........................................ 68 7.1.1 User Records ............................... 69 7.1.2 Printing the Testoutput .................... 70 7.1.3 Block Procedure ............................ 70 7.2 Log Printout ...................................... 71 7.3 Trace of Messages and Answers ..................... 71 7.4 Pseudonet ......................................... 73 \f iv T_A_B_L_E_ _O_F_ _C_O_N_T_E_N_T_S_ _(_c_o_n_t_i_n_u_e_d_)_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _P_A_G_E_ 7.4.1 Program Structure .......................... 74 7.4.2 Semaphores ................................. 75 7.4.2.1 Initialization of Semaphores ...... 75 7.4.3 Operations ................................. 76 7.4.3.1 Survey of Operations .............. 76 7.4.4 Coroutines ................................. 77 7.4.4.1 Coroutine npm _message ............. 77 7.4.4.2 Coroutine npm _answer .............. 78 7.4.5 Input Commands and Verification ............ 80 7.4.5.1 Input Syntax ...................... 80 7.4.5.2 Verification ...................... 83 8. PROGRAM EXECUTION ...................................... 85 8.1 Resource Demands .................................. 85 8.1.1 Size ....................................... 85 8.1.2 Buf ........................................ 86 8.1.3 Area ....................................... 86 8.2 Prerequisites ..................................... 87 8.3 Program Parameters ................................ 87 8.3.1 Survey of Program Parameters ............... 87 8.4 Program Start Up .................................. 89 8.5 Error Messages .................................... 90 8.5.1 Warnings ................................... 90 8.5.2 Alarms ..................................... 90 8.6 Program Close Down ................................ 93 8.7 System Generation ................................. 93 A_P_P_E_N_D_I_C_E_S_: A. REFERENCES ............................................. 95 B. INDEX .................................................. 97 B.1 Survey of Figures ................................. 97 B.2 Survey of Examples ................................ 97 \f F_ 1_._ _ _ _ _ _ _ _ _I_N_T_R_O_D_U_C_T_I_O_N_ 1, This paper is the reference document for the RC8000 Scroll Mode Mapping (SMM) module. The purpose of the SMM module is to convert (i.e. map) the X.28 interface and the Virtual Terminal Protocol (VTP) into the terminal process interface used on the RC822 stan- dard terminal. The mapping is performed so that the applications, operating systems etc. executed in the RC8000 may be accessed from virtual terminals - connected to CENTERNET - without chan- ging the RC8000 programs. A software configuration where two virtual terminals are acces- sing RC8000 processes is outlined in example 1. Example 1: Virtual terminals connected as RC8000 terminals. \f The example shows that the virtual terminals can be either local (1) or remote (2). But the most important aspects of the example are that 1 terminal = 1 port = 1 pseudo process and that one terminal may access a number of applications. 1_._1_ _ _ _ _ _ _ _S_t_r_u_c_t_u_r_e_ _o_f_ _t_h_i_s_ _M_a_n_u_a_l_ 1.1 The interface to the RC8000 apllications is described in chapter 2. The interface is explained so that use of the manual: RC8000 Terminal Process (ref. 1) is superfluous. Chapter 3 resumes the use of the host interface, i.e. NPM, the Session Control, SC, and the Virtual Terminal Protocol, VTP. The interface to the terminal operator is also described. The implementation of the SMM module is explained in chapter 4: Program Structure, chapter 5: Semaphores and Operations and chapter 6: Coroutines. The tools for debugging and/or testing the program are described in chapter 7. Finally, chapter 8 defines how to start and stop the execution of SMM. Error messages and alarms are described. 1_._2_ _ _ _ _ _ _ _N_o_t_e_s_ _o_n_ _N_o_t_a_t_i_o_n_ _a_n_d_ _T_e_r_m_i_n_o_l_o_g_y_ 1.2 Character values are given in the same way as in ref. 4. A character value is defined by <column>/<row> referring to the IA5 Basic Code Table. I.e. 2/0 corresponds to the character value 2*16 + 0 = 32 (= SP) and 6/13 = 6*16 + 13 = 109 (= m). \f In general this description uses the term 'coroutine' as a short of 'incarnation of a coroutine', but hopefully this will not cause any confusion. \f F_ 2_._ _ _ _ _ _ _ _ _R_C_8_0_0_0_ _T_E_R_M_I_N_A_L_ _P_R_O_C_E_S_S_ _I_N_T_E_R_F_A_C_E_ 2. The SMM module has a terminal process interface to the applica- tions in RC8000, i.e. the applications may access terminals con- nected to CENTERNET as if they were ordinary RC822 terminals; see ref. 1. The communication takes place via pseudo processes named SMM1, SMM2, ..., SMM50 (if <first> has the default value 1). The use of pseudo processes has no effect on the use of SMM as terminal pro- cess except that the process cannot be reserved. The operations can be initiated by any internal process (no user- check is performed). All operations are related to conversational mode (mode = 0), i.e. ordinary roll mode. On each terminal the operations are executed in the same order as they are received, i.e. before executing the next operation the current operation is answered. 2_._1_ _ _ _ _ _ _ _A_t_t_e_n_t_i_o_n_ _M_e_s_s_a_g_e_ 2.1 The operator can initialize an attention to an internal process in different ways depending on the current state of the terminal and on the purpose of the attention, see subsection 6.4.1. Before the attention tasks are performed the current operation is interrupted, if any. The primitives ATT(1), PLEASE and EOM(2) will cause a printout of the text <new line> att <space> on the terminal and the operator is able to key the processname. \f The rules for converting input characters as described in subsec- tion 2.3.2 apply also to the reading of the processname. The processname may be empty, indicating current process. If the process exists or if the primitive ATT(2) is entered, an attention message is sent to the process via the corresponding pseudo process with the following format: message +8 0 +10 0 +12 0 +14 0 If the application does not answer the attention message within an optional time limit, the message is regretted. The status word is not examined but the result of the answer must be normal (i.e. = 1). 2_._2_ _ _ _ _ _ _ _S_e_n_s_e_ _O_p_e_r_a_t_i_o_n_ 2.2 The sense operation is dummy. The message is always answered with status ok. Format: message answer message/answer address: 0 0 status +2: 0 number of halfwords +4: 0 number of characters 2_._3_ _ _ _ _ _ _ _I_n_p_u_t_ _O_p_e_r_a_t_i_o_n_ 2.3 Input operations are accepted when the terminal is idle. Before and during the negotiation phase, input operations are answered with status disconnected. \f 2_._3_._1_ _ _ _ _ _I_n_i_t_i_a_l_i_z_a_t_i_o_n_ 2.3.1 When an input operation is accepted, the address of the sender is compared with the process description address of the current pro- cess. If the addresses are not equal the text <new line> to <space> <name of sender> <new line> is sent to the terminal. By means of an output message with 'your turn' indication - sent by SMM - the bell is activated in the terminal and the operator can enter data. 2_._3_._2_ _ _ _ _ _I_n_p_u_t_ _P_h_a_s_e_ 2.3.2 During the input phase TEXT-SEG primitives are transformed to one text string stored in a local buffer with three 8-bit characters per word. The characters are treated as 7-bit ISO characters without parity. Provided that the conversion condition is true the capital letters A through Z and the 3 national letters (e.g. Æ, Ø, Å) (i.e. 4/1 through 5/13) are converted to the small let- ters (i.e. 6/1 through 7/13). The characters (5/14) and (7/14) are converted to NUL (0/0) no matter what the conversion condition is. No control characters can appear in TEXT-SEG primitives (i.e. 0/0 through 1/15). The conversion condition is set to true when - the terminal is connected at VTP protocol level - the text 'att' has been written on the terminal - an INTD is accepted. The conversion condition is set to false when - a small letter is received. \f 2_._3_._3_ _ _ _ _ _T_e_r_m_i_n_a_t_i_o_n_ 2.3.3 The input phase ends when the first primitive different from TEXT-SEG is received. If the primitive is either EOM(1) or EOM(2), an NL character (0/10) is stored in the local buffer. Unused character positions in the last word are filled with NUL characters. Provided that the storage area within the application process defined by first and last in the input message can hold the contents of the local buffer, the input message is answered with status ok and a re- ceipt is sent to the terminal (i.e. an output message with an NL primitive). The input message is answered with status timer and no bytes transferred if either the input message or the local buffer in SMM (it can hold 150 characters) is too small. In this situation the receipt is an output message with the text <new line> last inputline skipped <new line> If the primitive is either ATT(1), CLEAR or an illegal VTP primi- tive, the situation is treated as if the input message is too small. If the primitive is ATT(2), the input message is answered with status attention and no bytes transferred. Any other input from the network will cause an answer with status disconnected and no bytes transferred. Note that the input operation cannot be terminated by a timer in- terrupt. \f 2_._3_._4_ _ _ _ _ _I_n_p_u_t_ _O_p_e_r_a_t_i_o_n_ _F_o_r_m_a_t_ 2.3.4 message answer message/answer address: 3<12+0 status +2: first storage address number of halfwords transferred +4: last storage address number of charac- ters transferred Contents of possible status words: 0 ok 2 = 1<21 timer 7 = 1<16 attention 19 = 1< 4 disconnected 2_._4_ _ _ _ _ _ _ _O_u_t_p_u_t_ _O_p_e_r_a_t_i_o_n_ 2.4 Output operations are accepted when the terminal is idle. Before and during the negotiation phase, output operations are answered with status disconnected. 2_._4_._1_ _ _ _ _ _I_n_i_t_i_a_l_i_z_a_t_i_o_n_ 2.4.1 When an output operation is accepted, the address of the sender is compared with the process description address of current pro- cess. If the addresses are not equal, the text <new line> from <space> <name of sender><new line> is sent to the terminal. \f 2_._4_._2_ _ _ _ _ _O_u_t_p_u_t_ _P_h_a_s_e_ 2.4.2 During the output phase, the text string within the application process, defined by first and last in the output message, is transformed to NL and TEXT-SEG primitives. The primitives are sent in one or more blocks to the terminal. The text string must be packed with three 8-bit characters per word. The characters are interpreted as 7-bit ISO characters without parity. The NL character (0/10) is sent as an NL primitive whereas the text characters SP through å, except (i.e. 2/0 through 7/13 except 5/14) are sent without conversion in TEXT-SEG primitives. All other characters are ignored. A sequence of text characters is sent as one TEXT-SEG primitive. If the sequence consists of more than 60 characters or if the network buffer is exhausted, current TEXT-SEG primitive is terminated and a new one is initia- lized. 2_._4_._3_ _ _ _ _ _T_e_r_m_i_n_a_t_i_o_n_ 2.4.3 Normally, the output phase ends when the text string is proces- sed; in this case the output message is answered with status ok. Between the blocks sent to the terminal, SMM may receive input from the network. Depending on the type of these inputs, the out- put message may be returned with various status words. If SMM receives a TEXT-SEG primitive, an EOM(1) or an illegal VTP primitive, the output message is answered with status ok, but number of characters transferred may be less than the length of the text string. If SMM receives an interrupt (i.e. ATT(1), ATT(2), PLEASE, EOM(2), CLEAR) the output message is answered with status atten- tion; the number of characters transferred may be less than the length of the text string. \f Any other input from the network will cause an answer with status disconnected and no bytes transferred. Note that the output operation cannot be terminated by a timer interrupt. 2_._4_._4_ _ _ _ _ _O_u_t_p_u_t_ _O_p_e_r_a_t_i_o_n_ _F_o_r_m_a_t_ 2.4.4 message answer message/answer address: 5<12+0 status +2: first storage address number of halfwords transferred +4: last storage address number of charac- ters transferred Contents of possible status words: 0 ok 7 = 1<16 attention 19 = 1< 4 disconnected 2_._5_ _ _ _ _ _ _ _O_t_h_e_r_ _O_p_e_r_a_t_i_o_n_s_ 2.5 If SMM receives a message where the operation-mode word (i.e. message address + 0) is different from 0 (sense), 3<12+0 (input) and 5<12+0 (output), the message is returned with result 3 (i.e. unintelligible). Note that the status word and the rest of the answer are irrelevant. 2_._6_ _ _ _ _ _ _ _P_r_i_n_t_o_u_t_s_ 2.6 During communication, a number of printouts may be produced by SMM. These printouts can either be of an informative nature or they can indicate an illegal situation. \f The printouts have the same format as the output blocks produced for output operations from an application. The printouts are listed in alphabetical order and the informa- tive printouts are marked with an asterisk (*). * EOM(2) indicates that the application is able to receive input; the turn is changed in order to enable the operator to enter data and the bell is activated. * <nl> receipt on an input operation im- plying that the characters have been forwarded to the application or a process name has been received. * <nl> att indicates that a (new) processname may be written on the terminal. disconnected <nl> dummy answer (4) on an attention message to the application. does not exist<nl> dummy answer (5) on an attention message to the application. * <nl> from <processname><nl> is written if the succeeding data is sent by another process than latest active application. illegal <nl> the processname is not the name of an internal process. <nl> last inputline skipped<nl> The last input line has not been forwarded to the application be- cause it was longer than wanted by the application or similar error. \f no answer <nl> the application did not answer the attention message within a certain (optional) time limit. The atten- tion message has been regretted by SMM. rejected <nl> dummy answer (2) on an attention message to the application. * <nl> to <process name><nl> indicates that <process name> is able to receive data. The text is sent only if the former process was different to <process name>. unintelligible <nl> dummy answer (3) on an attention message to the application. unknown <nl> the process does not exist. The name is either the one just typed or current process name if the name was omitted. unnormal <nl> dummy answer (1); usually that answer means normal answer but if this error occurs, it denotes an abnormal situation in SMM. \f F_ 3_._ _ _ _ _ _ _ _ _N_E_T_W_O_R_K_ _I_N_T_E_R_F_A_C_E_ 3. All communication between SMM and the network take place via Net- work Port Module (NPM), see ref. 3. SMM works on two protocol levels, i.e. Session Control (SC) and Virtual Terminal Protocol (VTP). 3_._1_ _ _ _ _ _ _ _N_P_M_ _O_p_e_r_a_t_i_o_n_s_ 3.1 All operations from SMM to the network are packed in SEND opera- tions and all operations from the network to SMM are packed in RECEIVE operations, with the only exception that SMM requests open and close of ports by means of OPEN and CLOSE operations. The format of the operations is described in ref. 3. 3_._1_._1_ _ _ _ _ _O_p_e_n_ _O_p_e_r_a_t_i_o_n_s_ 3.1.1 When a terminal coroutine is started or after a close of the port, an open operation is sent to NPM. The receivermask used in the open operation is optional with all- ones as a default. The number of buffers is set to 2 plus number of letters per terminal (optional) for receiving and 1 for sen- ding. The bufferlength is 201 characters for receiving as well as sending. The immediate acknowledge request for sending is not used, i.e. R=0. If the open was unsuccessful, the procedure is repeated after a certain - optional - amount of time. The number of attempts is unlimited. 3_._1_._2_ _ _ _ _ _R_e_c_e_i_v_e_ _O_p_e_r_a_t_i_o_n_s_ 3.1.2 The network is able to forward data only in case the receiver has delivered a receive operation with the sc-function in question. \f In order to establish a session, SMM sends an event control to NPM. When the SC connection is settled, SMM sends a telegram operation and an optional number of letter operations. (The con- nection on VTP level is requested by means of letters). Whenever SMM accepts a receive operation, the contents are trans- formed to local operations and a new receive operation with the same sc-function is delivered to NPM. I.e. if a letter is recei- ved from NPM, SMM sends a new receive operation fitted for a let- ter to NPM. If a receive operation is provided with serious er- rors, the operation is not repeated, and a local operation is created which causes the removal of the connection and the clo- sing of the port in question. 3_._1_._3_ _ _ _ _ _S_e_n_d_ _O_p_e_r_a_t_i_o_n_s_ 3.1.3 SMM outputs send operations to NPM for SC negotiation operations, letters and telegrams. The SC negotiation operations used are connect accept (CON-AC), disconnect accept (DISCON-AC) and abort request (ABORT). All operations at VTP level are forwarded by letters and tele- grams. The letters are used for text blocks, control blocks and negotiation phase commands while telegrams are used for inter- rupts (i.e. the CLEAR primitive). \f 3_._1_._4_ _ _ _ _ _C_l_o_s_e_ _O_p_e_r_a_t_i_o_n_s_ 3.1.4 The close operation is used if SMM receives a status different from OK from NPM or if the sc mode delivered in a receive oper- ation contains an illegal sc function or if the sc result is not OK. The status and result of the close operation is not inspected and the execution of SMM continues, cf. subsection 3.1.1. If the execution of SMM is stopped by the supervisor cf. section 8.6 or by a serious error in the program, close operations are sent for each possible port (= terminal). 3_._2_ _ _ _ _ _ _ _S_C_ _O_p_e_r_a_t_i_o_n_s_ 3.2 The SC level is used for establishment, monitoring and removal of sessions. Before a session can be established the port must be open; SMM opens a port as described in subsection 3.1.1. Sessions are monitored by means of the receive operation EVENT CONTROL while the removal of sessions is achieved either by the send operation ABORT or by the close operation (described in subsec- tion 3.1.4). Data transfer is done by RECEIVE and SEND operations as described in subsections 3.1.2 and 3.1.3. 3_._2_._1_ _ _ _ _ _E_v_e_n_t_ _C_o_n_t_r_o_l_ 3.2.1 The event control is a receive operation which can give a number of results. 3_._2_._1_._1_ _ _ _E_s_t_a_b_l_i_s_h_ _R_e_q_u_e_s_t_ 3.2.1.1 All sessions are initiated by SMT, i.e. SMM receives an establish request as a result of an event control. \f The request is accepted if the terminal coroutine is in the state just after open (i.e. port reserved) and the following tests are fulfilled - class = high (i.e. 2) - protocol field = VTP identification (i.e. 251); this field is the first character in the condata area - VTP role = terminal role (i.e. 0); this field is the second character in the condata area. If the request is not accepted SMM aborts the session, if any. 3_._2_._1_._2_ _ _ _R_e_m_o_v_a_l_ _R_e_q_u_e_s_t_ 3.2.1.2 SMT sends a removal request when the operator enters the CLR command. SMM accepts the disconnection in any state provided the port is reserved. The cause received in the operation is not examined. This removal request at SC level is a disconnect at VTP level, too. 3_._2_._1_._3_ _ _ _O_t_h_e_r_ _R_e_s_u_l_t_s_ 3.2.1.3 If the result delivered from SC is abnormal termination, low layer error or SC protocol error, the session is removed and SMM accepts the operation and continues as just after an open of the port. But if the result modification is unknown or if the basic result does not indicate that the function was processed succesfully, SMM aborts the session. \f 3_._2_._2_ _ _ _ _ _C_o_n_n_e_c_t_ _A_c_c_e_p_t_ 3.2.2 If SMM accepts an establish request, a connect accept operation (CON-AC) is sent to SC. Besides the VTP role, which is applica- tion role (i.e. 1) the contents are the same as received in the request. 3_._2_._3_ _ _ _ _ _D_i_s_c_o_n_n_e_c_t_ _A_c_c_e_p_t_ 3.2.3 If SMM accepts a removal request, a disconnect accept operation (DISCON-AC) is sent to SC. The 'cause' field is used for inform- ing SMT about the state of the terminal at SMM site, i.e. cause explanation 0 = disconnect confirma- current state is after VTP connect, tion i.e. datatransfer at VTP level. 166 = connect procedure current state is datatransfer, i.e. error after SC connect but before VTP connect. 176 = sc protocol error in any other state, i.e. no SC connection. 3_._2_._4_ _ _ _ _ _A_b_o_r_t_ _R_e_q_u_e_s_t_ 3.2.4 The abort request operation is used whenever SMM discovers a pro- tocol error at the SC level or an error during the clear mecha- nism or in the negotiation phase at VTP level. The operation con- tains information about the cause of requiring the abnormal ter- mination: cause explanation 164 = clear procedure one of the symbols CELAR and CLEAR error mark appears in an illegal context. \f cause explanation 166 = connect procedure VTP symbols before VTP connection error is negotiated. 170 = unexpected vtp VTP connect request received but connect the terminal is not in data trans- fer state. 176 = sc procol error error in an SC operation or an establish request when a session is already established. 244 = parameters not errors in the parameters for a VTP acceptable connection. 3_._3_ _ _ _ _ _ _ _V_T_P_ _O_p_e_r_a_t_i_o_n_s_ 3.3 The VTP protocol is based on the X.28 interface, see ref. 4, and is implemented by means of letters and telegrams. The defini- tion of the VTP protocol is given in ref. 5. The protocol operates with two partners, the terminal and the application. In this case the terminal role is played by the SMT terminal (operator) and the application role is played by the SMM terminal coroutine. This means that SMM has the tour after the negotiation phase and after the execution of a clear mechanism. SMM keeps the tour until input from the terminal operator is required, i.e. SMM gives the tour to the terminal when an input message is received from the application process or when the ope- rator wants to contact another process by means of an attention. When the operator completes the input, the tour is returned to SMM. 3_._3_._1_ _ _ _ _ _C_o_n_n_e_c_t_i_o_n_ _a_n_d_ _D_i_s_c_o_n_n_e_c_t_i_o_n_ _o_f_ _T_e_r_m_i_n_a_l_s_ 3.3.1 Any connection at VTP level is initiated by the SMT. The connec- tion is accepted if the terminal coroutine is in the state just\f after SC connection (i.e. data transfer) and the following tests are fulfilled - protocol field = VTP identification (i.e. 251) - maximum 7 parameters - terminal mode = scroll mode (i.e. paramter 0) - if any other parameter than terminal mode is stated the range must allow the default value. SMM accepts a connection by sending a connect accept command (CACC) with the same parameters as received. The parameter values returned to SMT are the default values except for the parameters: terminal mode: is always scroll mode line discrete: is the greatest value suggested in the range given in the VTP connect request. The extension field is zero. The VTP command for disconnection is never used, instead one of the SC operations disconnect request (removal request), abort request (abnormal termination) and close is activated. 3_._3_._2_ _ _ _ _ _I_n_p_u_t_ 3.3.2 Input operations are either letters or telegrams. The contents of letters must be structured as follows: transport header = 1: text block: EOM indicator TEXT-SEG primitives control block: please primitive/clear mark primitive transport header = 2: conn block \f Letters with other primitives, block indicators, transport headers or which in other ways neglect the structure, are transformed to illegal _vtp operations. 3_._3_._2_._1_ _ _ _T_e_x_t_ _B_l_o_c_k_s_ 3.3.2.1 One text block contains one EOM indicator and a number of TEXT- SEG primitives. Each TEXT-SEG primitive is transformed to an in- ternal operation, if the number of data characters in the TEXT- SEG primitive is greater than a certain value (p.t. 81 charac- ters) the primitive is divided into a number of internal oper- ations with at most 81 characters each. When all the TEXT-SEG primitives in the text block have been pro- cessed succesfully, the EOM indicator is examined. If the EOM indicator is zero, no more operations are produced, but if it equals 1, an eom operation is produced and any other value of the EOM indicator will result in an eom _att _1 operation. 3_._3_._2_._2_ _ _ _C_t_r_l_ _B_l_o_c_k_s_ 3.3.2.2 One ctrl block must hold exactly one primitive which can be either a please primitive or a clear mark primitive. 3_._3_._2_._3_ _ _ _C_o_n_n_ _B_l_o_c_k_s_ 3.3.2.3 The conn blocks are examined as described in subsection 3.3.1. If the contents are acceptable, a vtp _conn _accp operation is produced. Otherwise a vtp _conn _not _accp is produced. \f 3_._3_._2_._4_ _ _ _T_e_l_e_g_r_a_m_s_ 3.3.2.4 A telegram holds one telegram byte and SMM accepts the following values: telegram byte internal operation 1 att _1 2 att _2 15 att _15 16 clear An illegal telegram byte will give an illegal _vtp operation. 3_._3_._3_ _ _ _ _ _O_u_t_p_u_t_ 3.3.3 Output operations are produced either because of the protocol, reception of application messages or errors. The operations are sent in letters and telegrams. The formats of the operations are described in ref. 5 and 6. 3_._3_._3_._1_ _ _ _T_e_x_t_ _B_l_o_c_k_s_ 3.3.3.1 Each text block contains one EOM indicator and a number of TEXT- SEG and NL primitives. The EOM indicator is either zero (i.e. my turn) or it is 2 (i.e. your turn). 3_._3_._3_._2_ _ _ _C_t_r_l_ _B_l_o_c_k_s_ 3.3.3.2 SMM produces only one kind of ctrl blocks and that is clear mark ctrl block. \f 3_._3_._3_._3_ _ _ _C_o_n_n_ _B_l_o_c_k_s_ 3.3.3.3 As described in subsection 3.3.1 SMM produces cacc blocks, and no other conn blocks are sent. 3_._3_._3_._4_ _ _ _T_e_l_e_g_r_a_m_s_ 3.3.3.4 Attention from SMM to the terminal does not exist, so the only telegram sent is clear (telegram byte = 16). \f F_ 4_._ _ _ _ _ _ _ _ _P_R_O_G_R_A_M_ _S_T_R_U_C_T_U_R_E_ 4. The SMM program consists of a number of coroutines communicating by means of operations which are signalled to or waited from se- maphores. The external communication is implemented by messages and answers. The control and monitoring of coroutines, operations and sema- phores are performed by a coroutine system, see ref. 7, which offers standard procedures for signal and wait of operations and a centrallogic which performs the scheduling and which transforms (some of) the external messages and answers to internal opera- tions. 4_._1_ _ _ _ _ _ _ _N_o_t_a_t_i_o_n_ 4.1 user semaphore with a name and an name identification number (no) (no) group of user semaphores with the M_M_ name same name and function but with P_P_ different identification numbers M_M_ (no ,..., no ) P_P_ 1 n standard semaphore defined by the coroutine system signal an operation to a semaphore wait for an operation from a semaphore \f coroutine with a name and an ident- name ification number (no) (no) incarnations of a coroutine with name one name and a number of different M_M_ (no ,..., no ) identification numbers P_P_ 1 n M_M_ (no ,..., no ) P_P_ 1 n message and corresponding answer message answer transformation of an input oper- ation to an output operation per- formed by a coroutine by means of: wait operation <execute task> signal operation *) one operation results in two oper- ations/messages/answers *) two operations/messages/answers re- sult in one operation *) if the paths are disjointed, it in- dicates a choice \f F_ Figure 1: Normal operation flow. \f F_ 4_._2_ _ _ _ _ _ _ _N_o_r_m_a_l_ _O_p_e_r_a_t_i_o_n_ _F_l_o_w_ 4.2 The diagram in fig. 1 shows the flow of the operations during normal operation, i.e. when a session is active (=connected). For each terminal the flow can be activated either when SMM re- ceives a message form an application process or when SMM receives an answer from the network concerning an input message. 4_._2_._1_ _ _ _ _ _M_e_s_s_a_g_e_ _f_r_o_m_ _a_n_ _A_p_p_l_i_c_a_t_i_o_n_ _P_r_o_c_e_s_s_ 4.2.1 When SMM receives a message from an application process, the cen- trallogic waits for an operation on the wait _message _pool sema- phore and signals the operation to the wait _message semaphore. The appl _message coroutine applied for the pseudo process, which has received the message, is started. After processing this ope- ration, the appl _message coroutine signals the operation to the term _task applying to the same pseudo process. The terminal coroutine processes the operation, i.e. converts the output message to an internal operation, prints 'from' or 'to' on the terminal, sends a 'your turn' indication to SMT, tranforms an output buffer to a network operation and answers the application- message, etc. If the operation is an output operation which could not be com- pleted in one output message, the operation is returned to the terminal _task semaphore. If the operation implies output to the network, the terminal co- routine sends an output message and awaits the answer before the process proceeds. When an operation is completed by the terminal coroutine, the operation is returned to wait _message _pool semaphore. \f 4_._2_._2_ _ _ _ _ _I_n_p_u_t_ _A_n_s_w_e_r_ _f_r_o_m_ _t_h_e_ _N_e_t_w_o_r_k_ 4.2.2 When SMM receives an answer on an input message from the network, the centrallogic examines the wait _answer _pool semaphore for an operation with the same message buffer address. This operation is signalled to the semaphore indicated in the operation, i.e. input _answer semaphore. The network _input coroutine waits for the operations on the input _answer semaphore. The input answer is transformed to an internal operation, the resource for this operation is required either from the small _pool or from the large _pool semaphore de- pending on the type of the input. The internal operation is sig- nalled to the terminal _task specified in the operation received from input _answer semaphore. After processing the input answer, a new input message is sent to the network and the original opera- tion is returned to the wait _answer _pool semaphore. The terminal coroutine applied for the port in question receives the operation from the terminal _task semaphore and processes it, i.e. converts the input characters to a text string, answers an application message with the converted input line, sends an at- tention message to an application process, aborts current ses- sion, etc. If the process implies an attention message to an application, the terminal coroutine waits for the message _pool semaphore for a free operation, which is signalled to the wait _answer _pool sema- phore with the actual message buffer address of the attention message sent. When the application has answered the attention message, the centrallogic returns the operation from the wait _answer _pool for the att _answer sempahore. Now the terminal coroutine receives the operation and continues by returning it to the message _pool semaphore. \f F_ Figure 2: Start and stop of operation flow. \f F_ 4_._3_ _ _ _ _ _ _ _S_t_a_r_t_ _a_n_d_ _S_t_o_p_ _o_f_ _O_p_e_r_a_t_i_o_n_ _F_l_o_w_ 4.3 The diagram in fig. 2 shows how the operation flow is started and how it is stopped. 4_._3_._1_ _ _ _ _ _S_t_a_r_t_ _o_f_ _O_p_e_r_a_t_i_o_n_ _F_l_o_w_ 4.3.1 After a successful open of a port, the terminal coroutine gets a free operation from the small _pool semaphore and signals it to the start _input semaphore. The coroutine start _network _input waits for operations on the start _input semaphore and when it gets one it sends one or more input messages to the network and returns the operation to the small _pool semaphore. 4_._3_._2_ _ _ _ _ _S_t_o_p_ _o_f_ _O_p_e_r_a_t_i_o_n_ _F_l_o_w_ 4.3.2 When the network input coroutine receives an input answer ope- ration with status not OK or other unacceptable results/contents, the operation is returned to the message _pool semaphore and the input message is not repeated. In order to inform the terminal coroutine, the network _input coroutine gets a free operation from the small _pool semaphore and signals it to the terminal _task; this operation will move the terminal coroutine to send a close port message to the network. Finally the operation is released to the small _pool semaphore, again. \f 4_._4_ _ _ _ _ _ _ _S_t_r_u_c_t_u_r_e_ _o_f_ _t_h_e_ _P_r_o_g_r_a_m_ _T_e_x_t_ 4.4 The program consists of a number of blocks; the most important of the blocks are first declaration block initialize program options second declaration block initialize actions and states initialize text strings and conversion tables coroutines initialize coroutine system trap routine. The structure of these blocks and the details concerning declaration of variables and procedures are shown in fig. 3. \f F_ begin release identification begin <_*_ _f_i_r_s_t_ _d_e_c_l_a_r_a_t_i_o_n_ _b_l_o_c_k_ _ _ _ _*_>_ declarations (alphabetical order per type) begin <_*_ _i_n_i_t_i_a_l_i_z_e_ _p_r_o_g_r_a_m_ _o_p_t_i_o_n_s_ _*_>_ declarations procedure get _param initialize program options end initialize constants begin <_*_ _s_e_c_o_n_d_ _d_e_c_l_a_r_a_t_i_o_n_ _b_l_o_c_k_ _ _ _*_>_ declarations (alphabetical order per type) procedure test _error trace _message trace _answer trace _buffer monitor _send _answer monitor _send _message initialize arrays begin <_*_ _a_c_t_i_o_n_s_ _a_n_d_ _s_t_a_t_e_s_ _ _ _ _ _ _ _ _ _*_>_ procedure table initialize tables end begin <_*_ _t_e_x_t_ _s_t_r_i_n_g_s_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _*_>_ declarations procedure write _text copy _string initialize text strings end initialize conversion tables initialize zones begin <_*_ _c_o_r_o_u_t_i_n_e_ _p_r_o_c_e_d_u_r_e_s_ _ _ _ _ _ _ _*_>_ procedure terminal start _network _input prepare _upon _input (no coroutine) network _input appl _message npm _message (pseudonet) answer _npm _message (pseudonet) npm _answer (pseudonet) initialize the coroutine system close _all _ports: <_*_ _t_r_a_p_ _r_o_u_t_i_n_e_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _*_>_ trap routine end coroutine block end second declaration block end first declaration block end program Figure 3: Structure of the program text. \f F_ 5_._ _ _ _ _ _ _ _ _S_E_M_A_P_H_O_R_E_S_ _A_N_D_ _O_P_E_R_A_T_I_O_N_S_ 5. 5_._1_ _ _ _ _ _ _ _S_e_m_a_p_h_o_r_e_s_ 5.1 There are two groups of semaphores, standard (pre-defined) semaphores and user defined semaphores. Each semaphore is identified by a number. SMM uses the standard semaphores delay (-3) wait _answer _pool (-2) wait _message (-1) wait _message _pool (0). The standard semaphores are described in ref. 7. The user defined semaphores are large _pool (1) message _pool (2) semaphores for free operations of small _pool (3) different lengths input _answer (4) used for receiving answers on input messages to the network att _answer (5) used for receiving answers on attention messages to application processes start _input (6) used for initiating input messages to the network terminal _task (11,12...,10 + terms) each semaphore holds the operations (tasks) for a specific terminal (i.e. port or pseudo process). \f 5_._1_._1_ _ _ _ _ _I_n_i_t_i_a_l_i_z_a_t_i_o_n_ _o_f_ _S_e_m_a_p_h_o_r_e_s_ 5.1.1 Before the coroutine system is started, the semaphores are init- ialized with a number of operations of a specific size: semaphore operation number of operations size (HW) per terminal wait _message _pool 22 1 large _pool 168 1 + <letters per term> message _pool 22 1 + <inputs per term> small _pool 8 2 + <inputs per term>. 5_._2_ _ _ _ _ _ _ _O_p_e_r_a_t_i_o_n_s_ 5.2 Each operation is received by a coroutine from a semaphore by means of the standard procedure wait and after use it is returned to a semaphore by means of the standard procedure signal. This description will define the contents of the operations sig- nalled to each semaphore. The semaphores delay, wait _message _pool, large _pool, message _pool and small _pool will never hold operations with defined contents. M_M_m_m_5.2.1 Operations Signalled to wait _answer _pool/att _answer/input _answer 5.2.1 P_P_p_p_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ The centrallogic requires that the second field is the message buffer address and that the third field is the identification of the answer semaphore where the operation is returned when the answer is received. The rest of the fields in the operation are not used by the centrallogic but when SMM signals an operation to wait _answer _pool, some of the free fields may hold information. When the answer semaphore is att _answer the operation format is field type name 1 i - 2 i message _addr 3 i answer _semaphore = att _answer. \f When the answer semaphore is input _answer the operation format is field type name 1 i terminal _semaphore 2 i message _addr 3 i answer _semaphore = input _answer 4 i share _no 5 i first _shared. The centrallogic returns the operation - unchanged - to the answer semaphore when the answer for the specified message buffer is received. M_M_m_m_5.2.2 Operations Signalled to wait _message 5.2.2 P_P_p_p_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ The centrallogic signals to the wait _message semaphore when it receives a message. The operation has the following format field type name 1 i (sender) 2 i (receiver) 3 i buffer = message buffer address 4 ia message _area where the format of the message _area array is field type name 1 i operation _mode 2 i first 3 i last 4 i start _relative or port _address 5 i sc _mode. \f M_M_m_m_ 5.2.3 Operations Signalled to start _input 5.2.3 P_P_p_p_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ There is one kind of operations on the start _input semaphore, i.e. field type name 1 i current _term _task 2 i protocol _state. Current _term _task is the identification of the term _task sema- phore connected to the terminal coroutine which is going to be started. The field protocol _state indicates which kind of input (receive) message the start _network _input coroutine shall send to the net- work: protocol _state = 1: after open: send one event control = 2: after sc connect: send one receive telegram and <letters per term> receive letter(s). M_M_m_m_5.2.4 Operations Signalled to term _task 5.2.4 P_P_p_p_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ The name term _task is used on the semaphores connected to the terminal coroutine incarnations; each incarnation owns one semaphore. All operations signalled to term _task have an operation code in the first field field type name 1 i op _code = typegroup < 6 + symbol \f The operation code divides the operations into groups of types: typegroup value contents a 1 SC operations and NPM operations b 2 VTP operations from ctrl block, conn blocks and telegrams; and illegal VTP operations c 3 VTP operations form text blocks d 4 application messages e 5 internal operations concerning application outputs. The values of symbol are independent of the typegroup. In the rest of this subsection, the contents of the operations are de- scribed (in numerical order of symbol); note that the contents of undescribed fields are not defined. Name: sc _conn; typegroup = a, symbol = 1 field type name 3 i length 4 ia data where data (index) is the integer number index received as a connect request result of an event control. Name: sc _disc; typegroup = a, symbol = 2 no fields. Name: sc _abort; typegroup = a, symbol = 3 field type name 3 i cause. \f Name: ts _close; typegroup = a, symbol = 4 sc _error; typegroup = a, symbol = 5 no fields. Name: abnormal _answer; typegroup = a, symbol = 6 field type name 3 i answer _result. Name: illegal _status; typegroup = a, symbol = 7 field type name 3 i rec _status where rec _status either contains the status word or the result received from NPM. If both the result and the status word was acceptable, the field contains the value of the sc _mode field (indicated by its negative value). Name: att _1 ; typegroup = b, symbol = 8 att _2 ; typegroup = b, symbol = 9 att _15 ; typegroup = b, symbol = 10 clear ; typegroup = b, symbol = 11 please ; typegroup = b, symbol = 12 clear _mark ; typegroup = b, symbol = 13 no fields. Name: vtp _conn _accp; typegroup = b, symbol = 14 field type name 3 i counter 4 ia parameters where each parameter is described as follows parameters (index*2 - 1) = parameter identification number parameters (index*2) = accepted value of parameter. \f Name: vtp _conn _not _accp; typegroup = b, symbol = 15 illegal _vtp ; typegroup = b, symbol = 16 no fields. Name: text _portion; typegroup = c, symbol = 17 field type name 3 i length 4 ia data where data(index) is the value of the character number index. Name: eom ; typegroup = c, symbol = 18 eom _att _1 ; typegroup = c, symbol = 19 no fields. Name: sense _message ; typegroup = d, symbol = 20 input _message ; typegroup = d, symbol = 21 output _message ; typegroup = d, symbol = 22 illegal _message; typegroup = d, symbol = 23 field type name 2 i sender 3 i buffer 4 ia message _area (see subsection 5.2.2). Name: output _portion; typegroup = e, symbol = 24 field type name 2 i sender 3 i buffer 4 ia message _area and message _area.start _relative >_ 0 indicating the index of the first halfword to be processed. \f 5_._2_._5_ _ _ _ _ _S_u_r_v_e_y_ _o_f_ _O_p_e_r_a_t_i_o_n_s_ 5.2.5 semaphore name generated by source destination answer _op, before network _input/ input _answer wait _answer _pool start _network _input message _pool wait _answer _pool answer _op, after centralogic wait _answer _pool (def. in field 3) message _op, before terminal terminal _task wait _message _pool message _op, after centralogic wait _message _pool wait _message start _input terminal small _pool start _input sc _conn network _input large _pool terminal _task sc _disc network _input small _pool terminal _task sc _abort network _input small _pool terminal _task ts _close network _input small _pool terminal _task sc _error network _input small _pool terminal _task abnormal _answer network _input small _pool terminal _task illegal _status network _input small _pool terminal _task att _1 network _input small _pool terminal _task att _2 network _input small _pool terminal _task att _15 network _input small _pool terminal _task clear network _input small _pool terminal _task please network _input small _pool terminal _task clear _mark network _input small _pool terminal _task vtp _conn _accp network _input large _pool terminal _task vtp _conn _not _accp network _input small _pool terminal _task illegal _vtp network _input small _pool terminal _task text _portion network _input large _pool terminal _task eom network _input small _pool terminal _task eom _att _1 network _input small _pool terminal _task sense _message appl _message wait _message terminal _task input _message appl _message wait _message terminal _task output _message appl _message wait _message terminal _task illegal _message appl _message wait _message terminal _task output _portion terminal terminal _task terminal _task Note that the coroutines, terminal and appl _message, exist in one incarnation per terminal and that each terminal has one terminal _ task semaphore. All operations on a terminal _task semaphore con- cern only the terminal that owns the semaphore. \f F_ 6_._ _ _ _ _ _ _ _ _C_O_R_O_U_T_I_N_E_S_ 6. The coroutines are implemented as procedures and the incarnations are started by means of the ALGOL8 procedure new _activity. Each incarnation is identified by a number. When an incarnation of a coroutine is started, the parameters for the procedure are stated. The coroutines all have the same priority, i.e. zero. The coroutines are name identification start _network _input 1 network _input 2 appl _message 3, 5, ..., 1 + terms*2 terminal 4, 6, ..., 2 + terms*2 The identifications indicate that start _network _input and network _input have only one incarnation while appl _message and terminal have one incarnation per terminal. M_M_m_m_6.1 Coroutine start _network _input 6.1 P_P_p_p_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ The start _network _input coroutine initiates the receiving of inputs from the network depending on the protocol state of the terminal in question. Pseudo code: procedure start _network _input; repeat wait (start _input, start _op); if start _op. protocol _state = after sc connect then send receive letter <letters per term>-times send receive telegram else send event control signal (small _pool, start _op); until false; \f 6_._1_._1_ _ _ _ _ _S_t_r_a_t_e_g_y_ _f_o_r_ _M_u_l_t_i_b_u_f_f_e_r_i_n_g_ _i_n_ _a_n_s_w_e_r_s_ _Z_o_n_e_ 6.1.1 The zone named answers has one share per possible input (receive) message sent to the network (i.e. NPM) plus one for the trap routine. Each terminal may have one event control, one receive telegram and <letters per term> receive letter(s) input messages sent to the network. Each share is dedicated for one purpose connected to a specific terminal. The shares for one terminal are consecutive: shareno purpose i + 1 first receive letter M_M_ . . . . P_P_ . . i + <letters per term> last receive letter i + <letters per term> + 1 receive telegram i + <letters per term> + 2 event control The shares for the whole system are grouped as follows: shares for the first terminal shares for the second terminal M_M_ . . P_P_ . shares for the last terminal one share for the trap routine (for closing ports) \f M_M_m_m_6.2 Coroutine network _input 6.2 P_P_p_p_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ The network _input coroutine receives the answers on the input messages sent to the network. The coroutine transforms an answer to one or more internal oper- ations which are signalled to the associated terminal _task sema- phore. If the answer was acceptable, i.e. status was OK, result was normal, sc-result was OK and the contents of the data buffer were legal, a new input message with the same sc function is sent to the network. If the answer was unacceptable, the input is not repeated. A description of the tests on the contents of the data buffer can be found in the sections 3.2 and 3.3. \f F_ Pseudocode: procedure network _input; repeat wait (input _answer, answer _op); wait _message (answer _op. share _no, answer); if result is not ok or status is not ok then create abnormal _answer or illegal _status operation signal (message _pool, answer _op); else if sc _function = receive _letter and sc _result is ok then text block: create one or more text _portion operations create eom or eom _att _1 operation, if necessary ctrl block: create please or clear _mark operation conn block: create vtp _conn _accp or vtp _conn _not _accp operation if any errors during examination of input then cancel the created operations, if possible create illegal _vtp operation else if sc _function = event _control then establish _request: create sc _conn operation removal _request: create sc _disc operation abnormal _termination: create sc _abort operation sc _low _layer _error: create sc _close operation sc _protocol _error: create sc _close operation if any errors during examination of input then cancel the created operation create sc _error operation else if sc _function = receive _telegram and sc _result is ok then create att _1, att _2, att _15, clear or illegal _vtp operation else create illegal _status operation signal (message _pool, answer _op); goto end; send new input message with the same sc _function signal (wait _answer _pool, answer _op); end: until false; Note that 'create --- operation' means wait for a free operation from the associated pool semaphore, generate the contents of the operation and signal the operation the terminal _task semaphore specified in answer _op. \f M_M_m_m_ 6.3 Coroutine appl _message 6.3 P_P_p_p_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ The appl _message coroutine receives all the messages sent to a specific pseudo process. The messages are transformed to internal operations, which are signalled to the associated terminal _task semaphore. Pseudo code: procedure appl _message (pseudo _process, term _task); repeat wait _select: = pseudo _process; wait (wait _message, message _op); create sense _message, input _message, output _message or illegal _message operation (in message _op) signal (term _task, message _op); until false; \f 6_._4_ _ _ _ _ _ _ _C_o_r_o_u_t_i_n_e_ _t_e_r_m_i_n_a_l_ 6.4 The terminal coroutine performs the tasks signalled to the associated terminal _task semaphore. The execution of the tasks is controlled by a kind of a finite automaton with states, actions and derivation rules (i.e. rules for the next state based on cur- rent state and current input symbol). When a task is completed, the operation as signalled to one of the pool semaphores (i.e. small _pool, large _pool, wait _message _pool). Pseudo code: procedure terminal (term _task, pseudo _process); initialization repeat wait _select: = select (cur _state); wait _time: = time (cur _state); wait (term _task, operation); action: = actions (cur _state, operation.symbol); new _state: = status (cur _state, operation.symbol); perform (action); if operation is not returned already then semaphore: = return _to (operation.symbol); signal (semaphore, operation); cur _state: = new _state; until false; \f 6_._4_._1_._ _ _ _ _O_u_t_l_i_n_e_s_ _o_f_ _t_h_e_ _A_u_t_o_m_a_t_o_n_ 6.4.1 The principles for the work of the finite automaton can be outlined in three stages - start, connect and stop the terminal - normal work - clear mechanism. The notation used in the outlines are symbol C state action (no) D state name name (no) (no) A B which means that when the automaton (i.e. the terminal coroutine) is in state A (identified by no) and receives a symbol (i.e. an operation from terminal _task semaphore), C, it will perform the action, D, and change the state to B. When C is 'no operation received', it means that the queue of operations (semaphore terminal _task) is empty; when D is denoted by a minus (-) it means that no action is performed. \f The start, connect and stop of the terminal deal mainly with SC level of communication, but serious errors at VTP level will force the automaton into this level. See fig. 4. Figure 4: Outline of start, connect and stop a terminal. \f The normal work of the terminal tasks takes place at VTP level. Errors during the work will either start the clear mechanism or bring it to SC level by means of an abort operation. See fig. 5. Remarks to the figure: - the symbols att _15 and please are ignored in states where they are not mentioned. - the symbol illegal _vtp will start the clear mechanism in any state. - the symbols att _1, att _2, text _portion, eom and eom _att _1 will cause the start of the clear mechanism if they occur in a state where they are not described. - before leaving this part of the automaton caused by an error or by a symbol from the SC level, the situation is neutralized, i.e. the application message is answered, working zones are closed and the like. \f F_ Figure 5: Outline of the normal work of a terminal. \f F_ The clear mechanism works at VTP level. It may be started either by the SMT terminal by means of a clear telegram or by an erroneous situation in the automaton (i.e. unaccepted symbol in current state). See fig. 6 and note that - the vtp symbols are blind in all clear states. - if the symbols clear and clear _mark occur in a state where they are not mentioned they will interrupt the VTP protocol, i.e. abort the session at SC level and the automaton continues in the error state. Figure 6: Outline of clear mechanism. \f F_ 6_._4_._2_ _ _ _ _ _S_u_r_v_e_y_ _o_f_ _S_t_a_t_e_s_,_ _A_c_t_i_o_n_s_ _a_n_d_ _D_e_r_i_v_a_t_i_o_n_ _R_u_l_e_s_ 6.4.2 The automaton is implemented by the tables states and actions, which contain the derivation rules and the associated semantic rules (i.e. the action to be taken). Fig. 7 shows the contents of the tables. Figure 7: Survey of the automaton. Each entry denotes <action>/<next state>, a question mark (?) means undefined and a minus (-) means either no action or same state. The states are identified by a number; fig. 7 gives a survey of the states and their names. The actions are also identified by a number. Some of the actions are composed by other actions. Fig. 8 gives a survey of the actions and their names. \f F_ Ident Name Note 1 send _open _port 2 answer _sc _connect 3 send _vtp _cacc 4 answer _appl _disconnected 5 write _att 6 convert _appl _name 7 search _process 8 close _help 9 send _att _message 10 send _att _message _reserved 11 answer _sense _message 12 prepare _input 13 receive _and _convert _input 14 finish _input 15 finish _input _and _write _att = #14 + #5 16 finish _input _after _error 17 finish _input _after _error _and _write _att = #16 + #5 18 answer _input _att _reserved _and _clear 19 answer _input _0 _bytes 20 answer _input _disconnected 21 answer _input _and _clear = #19 + #37 22 answer _input _and _abort = #20 + #45 23 answer _input _and _disconnect = #20 + #51 24 answer _input _and _close _port = #20 + #52 25 prepare _output 26 convert _and _send _output 27 answer _output _ok 28 answer _output _att = #30 + #5 29 answer _output _att _reserved = #30 + #9 30 answer _output _att _2 31 answer _output _ok _and _clear = #27 + #37 32 answer _output _att _and _clear = #30 + #37 33 answer _output _disconnected 34 answer _output _and _abort = #33 + #45 35 answer _output _and _disconnect = #33 + #51 36 answer _output _and _close _port = #33 + #52 37 send _clear 38 send _clear _mark 39 answer _illegal _message 40 answer _illegal _message _and _pass = #39 + #46 41 close _help _and _abort = #8 + #45 42 close _help _and _clear = #8 + #37 43 close _help _and _disconnect = #8 + #51 44 close _help _and _close _port = #8 + #52 45 abort 46 pass 47 answer _sense _message _and _pass = #11 + #46 48 answer _appl _disconnected _and _pass = #4 + #46 49 no _operation _received 50 no _action 51 disconnect 52 send _close _port 53 fatal Figure 8: Survey of actions. \f F_ 6_._4_._3_ _ _ _ _ _T_h_e_ _W_o_r_k_ _o_f_ _t_h_e_ _A_u_t_o_m_a_t_o_n_ 6.4.3 The work of the automaton takes place in steps, with one step per input symbol (as can be seen in the pseudo code, in the beginning of this chapter). The work is controlled by the derivation rules and the actions as described in subsection 6.4.2, but some notes would be useful together with a description of the actions. 6_._4_._3_._1_ _ _ _N_o_t_e_s_ 6.4.3.1 Before a call of the coroutine procedure wait, it is possible to specify a selection mask and a timer. In this case the selection mask is used on the typegroup of the symbols in order to exclude certain types of operations from being received in some states. The timer is used with negative value in order to examine the semaphore without being stopped if the queue is empty; this fa- cility is used when it is necessary to clear the queue of oper- ations before the work may continue. The values of wait _select and wait _time can be seen in fig. 7. Because of the selection of operations, a number of entries in the tables, states and actions, are undefined. If one of these entries is entered, the program is stopped by a run time alarm. Sense messages from an application are always answered with status OK no matter what the state is. Illegal messages are al- ways answered with result unintelligible. Input and output mes- sages are returned with status disconnected if they are received before the idle state or in the port _closed state. An output mes- sage operation is transformed to an internal output _portion oper- ation in order to control the pointer (start _relative) in the buffer when more than one send operation is required during the conversion. If the output _portion operation is received in other states than sending _output, it is treated as if it was an ordinary output message. \f When an abort operation is sent to the network, the state is changed either to port _reserved or to error. Port _reserved is used if it happens before the idle state and error is used if it happens in or after the idle state. Whenever an output (= send) message is sent to the network, the answer is examined and if it is not correct, the action send _close _port is performed and new _state is set to port _closed. 6_._4_._3_._2_ _ _ _D_e_s_c_r_i_p_t_i_o_n_ _o_f_ _t_h_e_ _A_c_t_i_o_n_s_ 6.4.3.2 The actions are described in numerical order of the identifica- tions. The actions, which are solely compounded by other actions, are not mentioned. Action 1: send _open _port an open _port message is sent and the answer is examined. If it is not acceptable, the terminal is delayed a certain - optional - time and the function is repeated. When the answer is correct, an operation with protocol _state = after _open is signalled to start _input. Action 2: answer _sc _connect an sc _connect _response send message is sent and if it was suc- cessful, an operation with protocol _state = after _sc _connect is signalled to start _input. Action 3: send _vtp _cacc a letter with the VTP cacc block is sent and the conversion flag is set to true. Action 4: answer _appl _disconnected the application message is returned with status = disconnected (1<4). Action 5: write _att a letter with the text 'att' and your turn indication is sent and a buffer is prepared for the receiving of text _portions. \f Action 6: convert _appl _name the characters from the text _portion are converted into the buf- fer. Maximum 12 characters are stored and the remaining charac- ters are ignored. Action 7: search _process a letter with an NL primitive is sent and the buffer with the processname is terminated by null characters. The existance of the process is examined and if it exists, the kind is inspected (must be an internal process). If the tests are sucessful, the action send _att _message is performed. Otherwise a letter with an error text is sent. Action 8: close _help the buffer (in the zone help) which was prepared by the action write _att is released. Action 9: send _att _message an attention message is sent to the application process via the pseudo process and the terminal is delayed until the answer is received. If the answer has not arrived after an optional timer period, the message is regretted and a letter with an error text is sent. If the terminal receives a dummy answer (i.e. result <>1), a letter with an error text is sent. The status in the answer word is not examined. Action 10: send _att _message _reserved the conversion flag is set to true and the action send _att _mes- sage is performed. Action 11: answer _sense _message the sense message is answered with status OK. \f Action 12: prepare _input if the process description address of the sender of the input message is the same as the latest active process at the terminal a letter with a your turn indication is sent. If it is another process, the process name is copied from the process description and the text 'to <process name>' is sent in a letter together with a your turn indication. If the status word of the answer on the letter message is not OK, the action answer _appl _disconnected is performed. Otherwise the in _mess zone is opened and the fields file count, block count and free parameter are defined in the zone description as max _chars in application input buffer, cur _chars (=0) and message buffer address of the application message, respectively. Action 13: receive _and _convert _input if there is room for the text _portion, the characters are con- verted and written in the in _mess zone buffer, the field cur _chars in the zone description is updated and the next state is set to current state. If there is not enough free locations in the zone buffer, the action is dummy (i.e. next state will be skipping _input). Action 14: finish _input the in _mess zone buffer is finished by a new line character and the input message is answered (with status OK) by means of clo- sing the in _mess zone. If the close was successful, a letter with an NL primitive is sent. Otherwise the action finish _input _after _error is performed. Action 16: finish _input _after _error The action answer _input _0 _bytes is performed and a letter with the text 'last inputline skipped' is sent. \f Action 18: answer _input _att _reserved _and _clear the input message is answered with status = attention (1<16) and no bytes tranferred, the in _mess zone is closed and the actions send _clear and send _att _message are performed. Action 19: answer _input _0 _bytes the input message is answered with status = timer (1<21) and no bytes transferred and in _mess zone is closed. Action 20: answer _input _disconnected the input message is answered with status = disconnected (1<4) and no bytes transferred and in _mess zone is closed. Action 25: prepare _output if the process description address of the sender of the output message is not the same as the latest active process at the ter- minal, a letter with the text 'from <process name>' is sent. The internal operation is transferred to an output _portion operation with start _relative = 0 and signalled to terminal _task. Action 26: convert _and _send _output the characters from the output message (starting at start _rela- tive) are converted and formatted as VTP TEXT-SEG and NL pri- mitives into a letter which is sent when the letter is exhausted or when all the characters are handled. If the letter is exhausted before all the characters have been handled, the start _relative field in the output _portion operation is updated and the operation is signalled to terminal _task. When all the characters have been handled, the output message is answered (with status OK). Action 27: answer _output _ok the output _portion operation is removed from the terminal _task semaphore and returned to wait _message _pool before the output message is answered with status = OK and 'start _relative' bytes transferred. \f Action 30: answer _output _att _2 as action answer _output _ok except that status = attention (1<16). Action 33: answer _output _disconnected as action answer _output _ok except that status = disconnected (1<4) and no bytes transferred. Action 37: send _clear a telegram with telegrambyte = clear is sent. Action 38: send _clear _mark a letter with a clear _mark block is sent. Action 39: answer _illegal _message the application message is returned with result = unintelligible (3). Action 45: abort an abort _request operation is sent with a cause as described in subsection 3.2.4 and the action pass is performed. Action 46: pass the coroutine procedure set _priority is called twice with the same priority as when the terminal coroutine was started, but the standard variable co _8000 _event is negative both times. Each call will force the centrallogic to examine the event queue and thus activate the coroutines waiting for the events (i.e. messages and answers). Action 49: no _operation _received the action is dummy except that flag, indicating that the opera- tion received from terminal _task has been released to a pool semaphore, is set to true. Action 50: no _action the action is empty, i.e. absolutely nothing is performed. \f Action 51: disconnect an sc _disconnect _accept send message is sent with a cause as de- scribed in subsection 3.2.3. Action 52: send _close _port a close messages is sent but neither the result nor the status word of the answer is examined. The action pass is performed. Action 53: fatal the execution of the SMM program is stopped by means of a call of system (9 <* run _time _alarm*> ...). 6_._5_ _ _ _ _ _ _ _M_a_n_i_p_u_l_a_t_i_o_n_s_ _o_f_ _V_T_P_ _T_e_x_t_ _B_l_o_c_k_s_ 6.5 In order to ease the input and output of VTP text blocks, the procedures read _char and write are used for manipulating the con- tents. At the same time character conversions and format trans- formations will be made possible. 6_._5_._1_ _ _ _ _ _C_h_a_r_a_c_t_e_r_ _C_o_n_v_e_r_s_i_o_n_s_ 6.5.1 The internal alphabet is based on the ISO/ASCII alphabet. The values 5/14 (= 94 = ), 7/14 (= 126 = ) and 7/15 (= 127 = DEL) have non standard interpretations. The 5/14 character is used as a shift down character and the 7/14 character is used as a shift up character, while 7/15 is used as an internal representation of the 0/0 ( = 0 = NUL) value. The shift characters are used for outputting the text constants which are formatted according to the VTP conventions. They are necessary because the text block code and the identifications for the primitives may have values greater than the maximum allowed by the standard procedures (i.e. 127). Each character in a text constant with a value greater than 127 is substituted by the cha- racters <shift up><character value - 128><shift down> and every occurrence of the NUL character is substituted by a DEL. If a NUL character is not given as a DEL character, the constant is fi-\f nished and the NUL is not written in the output buffer. By means of the procedure write, the characters are converted yielding to the wanted VTP format. The conversion table for output is initiated as follows: iso _table (out _conv _table); out _conv _table (shift _down):= 256 <*blind*>; out _conv _table (shift _up):= 1 shift 12 + 128; out _conv _table (127):= 7 shift 12 + 0; for i:= 128 step 1 until 255 do out _conv _table (i):= 7 shift 12 + i; out _conv _table (shift _down +128):= 1 shift 12 + 0; out _conv _table (shift _up + 128):= 256 <*blind*>; out _table (out _conv _table); The conversion table for input is initiated as follows: iso _table (in _conv _table); in _conv _table (0):= 7 shift 12 + 0; in _conv _table (13):= 7 shift 12 + 13; in _conv _table (127):= 7 shift 12 + 127; for i:= 128 step 1 until 255 do in _conv _table (i):= 7 shift 12 + i; in _table (in _conv _table); In this way all character values will be significant, which is essential for the interpretation of the VTP text blocks received from the network. Note that the text constants are defined before the initiation of the input and output conversion tables. \f 6_._5_._2_ _ _ _ _ _F_o_r_m_a_t_ _T_r_a_n_s_f_o_r_m_a_t_i_o_n_s_ 6.5.2 The reading of VTP text blocks is straightforward; the contents are read item by item by means of read _char until the end of the block or until the first primitive code has the value zero (i.e. a fill character in the end of a block). The writing of VTP text blocks is not so simple. SMM may produce two kind of primitives, i.e. NL primitives and TEXT-SEG primi- tives. The NL primitive is a constant string with the contents <shift up><NL primitive identification -128 (=65)> <shift down><DEL> The TEXT-SEG primitive has the format <shift up><TEXT-SEG primitive identification -128 (=64)><shift down> <no of text characters> <1st char><2nd char>...<last char> which means that the length of the text string must be available when the writing is started. This format is obtained by writing the data character in a working zone buffer and when the text string is ready the header of the primitive is written in the output buffer and the contents of the working zone buffer are copied to the output buffer. A TEXT-SEG primitive is produced when - an NL primitive must be written - the application message buffer is emptied - the working zone buffer is full whichever occurs first. \f In order to avoid the VTP text block to exceed the limit of the network buffer length, it is tested that there may be room for a TEXT-SEG primitive of a maximum length (i.e. the length of the working zone buffer). The characters from the application are read word by word, i.e. 3 characters at a time. The algorithm for writing VTP text blocks can be illustrated as follows for more: = get _next _3 _chars while more and chars _produced + max _in _text _segm <max _in _net _buffer-10 do for char: = chars(1), chars(2), chars(3) do if char = 10 then finish TEXT-SEG primitive, if any write (out _mess, nl _primitive _string) update chars _produced else if legal text char then out _char (help, char) finish TEXT-SEG primitive, if any send the letter The statement 'finish TEXT-SEG primitive, if any' means if no _of _text _chars > 0 then out _char (out _mess, text _seg _primitive) out _char (out _mess, no _of _text _chars) i: = 1 write (outmess, string help <*working zone*> (increase (i))); no _of _text _chars: = 0 update chars _produced \f 6_._6_ _ _ _ _ _ _ _M_a_n_i_p_u_l_a_t_i_o_n_s_ _o_f_ _Z_o_n_e_s_ 6.6 Before reading and writing of the contents in a zone buffer, the zone description must be prepared for read _char and write/out _char, respectively. If the characters in the zone buffer may be treated as a text string, the zone is not prepared for read _char. Instead the characters are made accessible in a zone record. After writing of a block either for the network or for an appli- cation process, the block is forwarded to the receiver when the associated zone is closed. 6_._6_._1_ _ _ _ _ _O_p_e_n_ _o_f_ _Z_o_n_e_s_ 6.6.1 When a zone is opened for writing, it is done to a non existing process causing the block procedure to be activated when a block transfer is attempted, i.e. when the buffer is full or because of a call of setposition or close. M_M_m_m_6.6.2 Prepare read _char 6.6.2 P_P_p_p_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ The procedure read _char is used on the multishare zone answers, only; this means that both the share description and the zone description must be initialized. The share description is initialized as follows: share state := ready first shared index := 1 last shared index := length in hw top transferred := first shared + length in hw \f and the zone description is initialized as follows: record base := first shared last halfword := first shared + length in hw used share := share number partial word := first word of data buffer <8 + 1 (i.e. second char <16 + third char <8 + 1) state := after repeat char record length := 0 When these initializations are done, the standard procedure read _char can be used just as usual. 6_._6_._3_ _ _ _ _ _P_r_e_p_a_r_e_ _Z_o_n_e_ _R_e_c_o_r_d_ 6.6.3 The following initializations are done on single shared zones, only record base := base buffer area record length := length in hw last halfword := record base + length in hw then the zone record can be accessed, e.g. processname (1) := z(1) processname (2) := z(2) or i: = 1 write (--, string z(increase (i)) --) M_M_m_m_6.6.4 Prepare write/out _char 6.6.4 P_P_p_p_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ If the zone is just after open or setposition, nothing else is needed before the call of the standard procedures write or out _char. But when the zone is to be used for the same purpose a number of times without activating the block procedure, the zone may be prepared for the next text string by means of the follow- ing changes in the zone description partial word := 1 record base := base buffer area record length := 0 provided that the zone has only one share. \f 6_._6_._5_ _ _ _ _ _C_l_o_s_e_ _o_f_ _Z_o_n_e_s_ 6.6.5 In order to avoid a block transfer and the call of the block procedure, a zone may be 'closed' by means of changes in the zone description. The changes are the same as described for preparing for write/out _char plus zone state := after close 6_._6_._6_ _ _ _ _ _B_l_o_c_k_ _P_r_o_c_e_d_u_r_e_s_ 6.6.6 As described in subsection 6.6.1 the block procedure is called when the buffer is full or when the procedures close or set- position are called. M_M_m_m_6.6.6.1 Block Procedure answer _input 6.6.6.1 P_P_p_p_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ The block procedure answer _input is attached to the in _mess zone, which is used for answering input messages from an application process. If the procedure is called because the buffer is full, it means that the input line was too long (because the share length is greater than the limit of the input line). If the procedure is called when the OK flag is false, the input message may not be returned with status = OK, so the procedure is dummy in this case. Before returning the answer to the application process, the mes- sage buffer area is filled with the contents of the zone buffer by means of the monitor procedure copy _core _area. \f Pseudo code: procedure answer _input (in _mess, stat, halfwords) if halfword <= max _allowed and ok then if monitor (copy _core _area, in _mess, zone _description. message _buffer, answer) = 0 then answer.status := 0 answer.result := normal monitor (send _answer, zone _description.message _buffer, answer) zone _description.message _buffer:= 0 else ok:= false else ok:= false M_M_m_m_6.6.6.2 Block Procedure send _output 6.6.6.2 P_P_p_p_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ The block procedure send _output is attached to the out _mess zone, which is used for forwarding send messages to the network (i.e. NPM). The out _mess zone is defined with a share length greater than the length of a network operation, so if the block procedure is cal- led because the buffer is full, it is a fatal error and the whole SMM program execution must be aborted. Pseudo code: procedure send _output (out _mess, stat, halfwords) if halfwords <= max _allowed then message.operation _mode := output _mode message.port _address := ports (term _task) message.sc _mode := mode (e.g. send _letter, sc _disc _accept) set zone name to name of NPM process send message wait answer reset zone name to dummy name else system (run _time _alarm --) \f M_M_m_m_ 6.6.6.3 Block Procedure write _text _seg 6.6.6.3 P_P_p_p_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ The block procedure write _text _seg is attached to the help zone, which is a working zone for preparing VTP TEXT-SEG primitives, receiving process names and the like. The block procedure is called only when TEXT-SEG primitives are produced. The data buffer is written in the real output buffer (i.e. out _mess) after the TEXT-SEG header and preparations are made for the next TEXT-SEG primitive. Pseudo code: procedure write _text _seg (help, stat, halfwords) prepare zone record if no _of _text _chars> 0 then out _char (out _mess, TEXT-SEG primitive identification) out _char (out _mess, no _of _text _chars) no _of _text _chars:= 0 index:= 1 write (out _mess, string help (increase (index))) \f F_ 7_._ _ _ _ _ _ _ _ _T_E_S_T_ _A_N_D_ _D_E_B_U_G_ _T_O_O_L_S_ 7. The SMM program offers a number of test and debug facilities, which are activated via the fp parameters in the start up of the program. 7_._1_ _ _ _ _ _ _ _T_e_s_t_o_u_t_p_u_t_ 7.1 The coroutine procedures, e.g. centralogic, signal and wait, pro- duce test records in a (disc)file in case the standard variable select _test is assigned properly. See ref. 7. Besides the automatical generated test records, so-called user records may be created by the SMM program. The purpose of the testoutput is to follow the execution of the program, e.g. observe the scheduling of the coroutines and dis- play certain variables at main points during the work. The testoutput facility is started if the program parameter ctest is different from zero. The standard variable select _test is initialized with the value of ctest before the coroutines are started. The document name of the discfile holding the testoutput is given in the testname parameter. If the discfile must not be extended when it is filled, but used cyclically, the parameter cyclic must have the value yes, otherwise the file is extended as long as necessary (and possible). When the SMM program is stopped in such a way that the traprou- tine is executed (i.e. break or fatal program error), the test- output zone is closed in order to transfer the latest test re- cords to the discfile. \f 7_._1_._1_ _ _ _ _ _U_s_e_r_ _R_e_c_o_r_d_s_ 7.1.1 The user records are produced if the parameter ctest is different from zero in the following situations - when the next step of the finite automaton is to be executed in the terminal coroutine, i.e. when the next symbol is received and the action and next state is defined (main _loop). - when the block procedure answer _input is called. - when the block procedure send _output is called. - when the status word is not OK in an answer on a send operation to the network. - before the execution of a call of the procedure perform, i.e. actions. - when a message is sent to the network, i.e. receive, send, open and close message. - when an answer to an application message is sent. Each user record as a format acceptable for the coroutine system, i.e. - record length is 8 words - first word contains the type identification - sixth word is the coroutine number - seventh + eighth word is current clock delivered by the procedure prepare _test. \f The contents of the user records are given in fig. 9. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _w_o_r_d_ _1_ _w_o_r_d_ _2_ _ _ _ _w_o_r_d_ _3_ _ _ _ _ _ _ _w_o_r_d_ _4_ _ _ _ _w_o_r_d_ _5_ _ _ _ m_a_i_n_ _l_o_o_p_ _ _ _ _ _ _ _ _1_0_2_4_+_1_ _c_u_r_._s_t_a_t_e_ _s_y_m_b_o_l_ _ _ _ _ _ _ _a_c_t_i_o_n_ _ _ _ _n_e_w_ _s_t_a_t_ _ answer input 1024+2 halfwords state: 1 ok 0 messaddr _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _0_ _n_o_t_ _o_k_ _ _ _ _ _0_ _ _ _ _ _ _ _ _ _ _0_ _ _ _ _ _ _ _ s_e_n_d_ _o_u_t_p_u_t_ _ _ _ _ _ _1_0_2_4_+_3_ _h_a_l_f_w_o_r_d_s_ _m_a_x_ _h_w_ _ _ _ _ _ _ _m_o_d_e_ _ _ _ _ _ _ _0_ _ _ _ _ _ _ _ s_t_a_t_u_s_ _(_o_u_t_p_u_t_)_ _ _1_0_2_4_+_4_ _s_t_a_t_u_s_ _ _ _ _0_ _ _ _ _ _ _ _ _ _ _ _ _0_ _ _ _ _ _ _ _ _ _ _0_ _ _ _ _ _ _ _ p_e_r_f_o_r_m_ _ _ _ _ _ _ _ _ _ _1_0_2_4_+_5_ _a_c_t_i_o_n_ _ _ _ _0_ _ _ _ _ _ _ _ _ _ _ _ _0_ _ _ _ _ _ _ _ _ _ _0_ _ _ _ _ _ _ _ send message 1024+6 halfwords operation<12 port mess _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _+_ _m_o_d_e_ _ _ _ _ _ _ _a_d_d_r_ _ _ _ _ _ _ _a_d_d_r_ _ _ _ _ s_e_n_d_ _a_n_s_w_e_r_ _ _ _ _ _ _1_0_2_4_+_7_ _h_a_l_f_w_o_r_d_s_ _s_t_a_t_u_s_ _ _ _ _ _ _ _r_e_s_u_l_t_ _ _ _ _ _m_e_s_s_a_d_d_r_ Figure 9: Survey of the user records. 7_._1_._2_ _ _ _ _ _P_r_i_n_t_i_n_g_ _t_h_e_ _T_e_s_t_o_u_t_p_u_t_ 7.1.2 The testoutput file can be printed either by means of the fp program print as described in ref. 7 or by means of an ALGOL program using the external procedure test _print as described in ref. 8. The test _print procedure produces a listing of the records where coroutines, semaphores and test record types are written as text and not as numbers. This means that to a large extent the listing can be used immediately, i.e. without prior interpretation. 7_._1_._3_ _ _ _ _ _B_l_o_c_k_ _P_r_o_c_e_d_u_r_e_ 7.1.3 The testoutput zone is provided with the block procedure test _error. If test _error is called with the end-of-document bit (1<18) and the program parameter cyclic is yes, the zone is positioned to the first segment of the disc file and the block is written there before the procedure returns. \f If test _error is called with any other status bits or if cyclic in no, the generating of records is stopped (select _test = ctest = 0) and a warning is written on current output. 7_._2_ _ _ _ _ _ _ _L_o_g_ _P_r_i_n_t_o_u_t_ 7.2 The coroutine procedure centra _logic produces log on current output with the semaphore table at call and/or return controlled by the program parameter log. The values of log are described in ref. 7. 7_._3_ _ _ _ _ _ _ _T_r_a_c_e_ _o_f_ _M_e_s_s_a_g_e_s_ _a_n_d_ _A_n_s_w_e_r_s_ 7.3 The messages and answers received and sent by SMM can be traced together with the contents of the data buffer received/sent. The messages and answers concerning testoutput, current input and current output are not traced. The facility is activated if the program parameter trace is yes. The output is printed on current output and has the following contents traced message (<message buffer address>) <next buffer><previousbuffer><receiver or answer type><sender> <message word 1><message word 2>...<message word 8> traced answer (<message buffer address>) <answer word 1><answer word 2>...<answer word 8> traced buffer area (<first halfword>,<last halfword>) <char 1><char 2>...<char 12> <char 13><char 14>...<char 24> . . . \f where <char i> is a description of the character number i written as the decimal value of the character and the graphic representation or a space if the character value is less than 33 or greater than 125. See example 2. Example 2: The printout with trace.yes. Note the verifications of the program parameters before the trace is started. \f 7_._4_ _ _ _ _ _ _ _P_s_e_u_d_o_n_e_t_ 7.4 The pseudonet substitutes the network interface and therefore the whole network too. It has been implemented in order to debug the SMM module as a stand-alone program. The pseudonet receives all the messages destinated for Network Port Module (NPM) and creates answers to them controlled by the input commands read from current input. The pseudonet is used if the program parameter pseudonet is yes. It is implemented as a part of the SMM program. Nevertheless the communication is realistic enough, because the entry to the pseudonet is implemented as a pseudo process, (with the name given in the program parameter netname). See fig. 10. Figure 10: Pseudo process as pseudonet. \f 7_._4_._1_ _ _ _ _ _P_r_o_g_r_a_m_ _S_t_r_u_c_t_u_r_e_ 7.4.1 The flow of operations, messages and answers are illustrated in fig. 11. Figure 11: Operation flow between SMM and pseudonet. The pseudonet consists of two coroutines, npm _message and npm _answer, and a 'common' procedure answer _npm _message. \f 7_._4_._2_ _ _ _ _ _S_e_m_a_p_h_o_r_e_s_ 7.4.2 The pseudonet uses four (user defined) semaphores, i.e. open _pool (7) used for open request operations event _pool (8) used for queueing receive opera- tions for event _control; one opera- tion for each receive message sent to NPM with sc _mode = event _con- trol. The semaphore holds all event controls with no respect to the port number telegram _pool (9) as event _pool but concerning re- ceive _telegram operations letter _pool (10) as event _pool but concerning re- ceive _letter operations. Beside these semaphores the pseudonet shares the following semaphores with the SMM program (see section 5.1): wait _message (-1) wait _message _pool (0) message _pool (2) 7_._4_._2_._1_ _ _ _I_n_i_t_i_a_l_i_z_a_t_i_o_n_ _o_f_ _S_e_m_a_p_h_o_r_e_s_ 7.4.2.1 The semaphores are initialized together with the other semaphores in the SMM program before the execution of the coroutines (see subsection 5.1.1). semaphore operation number of operations size (HW) per terminal wait _message _pool 22 1 + <inputs per term> message _pool 22 1 + <inputs per term> \f 7_._4_._3_ _ _ _ _ _O_p_e_r_a_t_i_o_n_s_ 7.4.3 The operations signalled to the semaphores wait _message, wait _message _pool and message _pool are similar to those described in section 5.2. The operations signalled to the semaphore open _pool have the fol- lowing format field type name 1 i - 2 i - 3 i buffer = message buffer address of the open operation The operations signalled to the semaphores event _pool, telegram _pool and letter _pool have the same format as follows field type name 1 i - 2 i (port) = actual port address 3 i buffer = message buffer address of the input operation 7_._4_._3_._1_ _ _ _S_u_r_v_e_y_ _o_f_ _O_p_e_r_a_t_i_o_n_s_ 7.4.3.1 semaphore name generated by source destination open npm _message message _pool open _pool event npm _message message _pool event _pool telegram npm _message message _pool telegram _pool letter npm _message message _pool letter _pool \f 7_._4_._4_ _ _ _ _ _C_o_r_o_u_t_i_n_e_s_ 7.4.4 The coroutines npm _message and npm _answer have one incarnation each and their identifications are name identification npm _message 3 + terms * 2 npm _answer 4 + terms * 2 M_M_m_m_7.4.4.1 Coroutine npm _message 7.4.4.1 P_P_p_p_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ The npm _message coroutine receives all messages destinated for the network process. Pseudo code: procedure npm _message (npm _process); activ (1):= ...:= activ (terms):= closed; repeat wait _select:= npm _process; wait (wait _message, message _op); case message _op. message _area. operation _mode do open _port: queue an open operation on open _pool semaphore close _port: activ (port address):= closed answer message _op. buffer with status = ok input: if activ (port address) = closed then answer message _op. buffer with status = act _timeout else queue an operation on event _pool, telegram _pool or letter _pool semaphore output: if activ (port address) = closed then answer message _op. buffer with status = ack _timeout else answer message _op. buffer with status = ok signal (wait _message _pool, message _op); until false; \f Close messages are answered immediately with status = 0, and the state of the port is set to closed in the port survey (activ(port):= 0). Output messages (i.e. send operations) are answered immediately too, but the status depends on the state of the port; status = 0 if the port is open (activ(port) <> 0) and status = 1<20 (i.e. ack _timeout) if the port is closed. If the port is closed, input messages (i.e. receive operations) are answered with status = 1<20 (i.e. ack _timeout). On the other hand if the port is open, the input message is queued on one of the semaphores letter _pool, telegram _pool and event _pool depending on the sc _mode in the message. Open messages are - in any case - queued on the semaphore open _pool. M_M_m_m_ 7.4.4.2 Coroutine npm _answer 7.4.4.2 P_P_p_p_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ The npm _answer coroutine reads commands from current input. A command is a description of a task which is either an answer to an input or an open operation or it is an order to delay the execution of answers. \f Pseudo code: procedure npm _answer; while read _char (in, task) <> EM do read port number if task = wait then delay port number/10 seconds else if task = open then wait (open _pool, term _op); activ (pool number):= open; answer term _op. buffer with status = ok signal (message _pool, term _op); else <* task = event, telegram or letter *> if activ (port number) = closed then return all the messages queued for this port on the pool semaphores with status = term _by _req else wait _select:= port number; wait (event/telegram/letter _pool, term _op); if event control then repeat read _char (in, function) until legal function repeat read (in, char _value); if char _value >= 0 and <= 255 then store char _value else if char _value = 256 then read _string (in, string) and store string until next char = NL answer term _op. buffer with status = ok and the stored characters <*end input *> repeat pass with priority less than other coroutines answer all the messages queued on 'the pool semaphores with status = term _by _req until no operations on the pool semaphores pass wait (open _pool, term _op); answer the open message with status = term _by _req signal (message _pool, term _op); Note that every parameter read from current input is echoed on current output as a verification of the input. \f 7_._4_._5_ _ _ _ _ _I_n_p_u_t_ _C_o_m_m_a_n_d_s_ _a_n_d_ _V_e_r_i_f_i_c_a_t_i_o_n_ 7.4.5 7_._4_._5_._1_ _ _ _I_n_p_u_t_ _S_y_n_t_a_x_ 7.4.5.1 Task Command Syntax Event results open o<port address> * telegram t<port address> <element>* c connect request d disconnect request M_M_m_ a abnormal termination event e<port address> <element>* NL EM P_P_p_ l low layer error p protocol error i illegal letter 1<port address> <element>* wait w<time> where <port address> is a number from 1 to number of ter- minals <element>* is a list of parameters to be used in the answer. There could be none, one or more parameters for one answer. Each element results in one character in the answer. An element is either an integer with the character value or it is a textstring. If it is a textstring, the element starts with the number 256 and one character ending the reading of the number (e.g. one space); The textstring itself is ended by a delimiter (class > 6, e.g. space). <time> is a number determining the waiting time given as number of seconds times ten. NL is the character value 10. EM is the character value 25. \f The letters in front of the commands are read by read _char and the succeeding integer is read by the standard procedure read, leaving the possibility of writing letters, delimiters etc. be- tween the leading letter and the integer. The open and the wait command are skipping all characters until the next NL or EM character. The event command skips all charac- ters after the port address until the first letter in the range of a to z. This letter is interpreted as a result and all illegal letters are treated as i. The elements are read by the standard procedure read; when an element equals 256, a text is read by means of read _string. The list of elements is ended when the last read character is either NL or EM. This implementation permits comments consisting of let- ters, delimiters etc. between the elements. Example 3 shows a legal sequence of commands for the pseudonet. \f F_ Example 3: Commands for the pseudonet which form an ordinary SMT-SMM communication. \f 7_._4_._5_._2_ _ _ _V_e_r_i_f_i_c_a_t_i_o_n_ 7.4.5.2 Whenever the pseudonet reads an element of a command, it is echoed on current output as a verification. The output does not contain the characters skipped between the elements. See example 4 which is the output from a test with the input described in example 3. Example 4: Verification of the commands described in example 3. \f F_ 8_._ _ _ _ _ _ _ _ _P_R_O_G_R_A_M_ _E_X_E_C_U_T_I_O_N_ 8. 8_._1_ _ _ _ _ _ _ _R_e_s_o_u_r_c_e_ _D_e_m_a_n_d_s_ 8.1 The SMM module must be executed with sufficient resources of primary storage (size), message buffers (buf), area processes (area) and disc storage (perm/temp). All requirements are based on release 1.20 of the SMM module. 8_._1_._1_ _ _ _ _ _S_i_z_e_ 8.1.1 The storage demands can be estimated as a sum of - standard requirements (FP, RS etc.) - program segments - variables. The standard requirements are HW file processor (FP) 1536 running system (RS) 3072 in and out zone 1024 working locations, approx. 1_0_0_0_ 6_6_3_2_ The translated program requires during execution: HW segment table 362 program segments 4_6_3_3_6_ 4_6_6_9_8_ The estimations of storage locations for program segments are based on the rule that half the program must be in primary sto- rage (i.e. 181 segments /2 = 90.5 segments = 90.5*512 HW) \f The number of variables depends on the program parameters <terms>, <letters per terminal>, <trace> and <pseudonet>: HW own variables 0 global variables 6 2100 2736 + terms*12 + terms*(2+letters)*172 X coroutine descriptions 40 + terms*40 semaphore descriptions 160 + terms* 8 semaphore operations 0 + terms*(288+letters*198) coroutines: start _network _input 524 network _input 670 terminal Y + terms*1304 appl _message _ _ _ _ _ _ _0_ _+_ _t_e_r_m_s_*_ _6_2_6_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ X+Y+6236 + terms*(2622+letters*370) if pseudonet: coroutine descriptions 40 semaphore operations 0 + terms*(132+letters* 44) npm _message 532 npm _answer _ _ _1_1_0_0_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 1672 + terms*(132+letters* 44) The parameter X is 0 if <trace> is no, but if <trace> is yes, X is the maximum number of halfwords in a message or in an answer. The parameter Y is the maximum number of halfwords in an appli- cation output message. \f The total storage requirements are HW standard requirements 6632 variables 7236 + terms*(2622+letters*370) program 4_6_6_9_8_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 6_0_5_6_6_ _+_ _t_e_r_m_s_*_(_2_6_2_2_+_l_e_t_t_e_r_s_*_3_7_0_)_ _ _ _ provided that X+Y = 1000 HW and that the pseudonet is not activated. 8_._1_._2_ _ _ _ _ _B_u_f_ 8.1.2 The message buffer demands are running system (RS) 1 in + out 2 network input messages 1 + terms*(2+letters) testoutput (if ctest<>0) 1 attention messages 0 + terms TEXT-SEG packing 0 + terms answer application input 0 + terms network output messages 0_ _+_ _t_e_r_m_s_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 5_ _+_ _t_e_r_m_s_ _*_(_6_+_l_e_t_t_e_r_s_)_ _ _ In addition the pseudonet requires terms*(4+letters) message buf- fers if it is activated. 8_._1_._3_ _ _ _ _ _A_r_e_a_ 8.1.3 The execution requires area processes as follows standard 2 pseudo processes 0 + terms testoutput (if ctest <>0) 1 in+out (if bs areas) 2 pseudonet (if active) 1 During normal production the process requires 3_+_t_e_r_m_s_ area processes. \f 8_._2_ _ _ _ _ _ _ _P_r_e_r_e_q_u_i_s_i_t_e_s_ 8.2 The software prerequisites are SW8001/1 Basissystem release 1.0 or newer releases SW8101/1 BOSS release 15.0 or newer releases. 8_._3_ _ _ _ _ _ _ _P_r_o_g_r_a_m_ _P_a_r_a_m_e_t_e_r_s_ 8.3 The program parameters are options to the execution of the SMM module. The parameters are given as fp-parameters when the pro- gram is started. Omitted parameters or illegal parameter values will cause the default value to be used. 8_._3_._1_ _ _ _ _ _S_u_r_v_e_y_ _o_f_ _P_r_o_g_r_a_m_ _P_a_r_a_m_e_t_e_r_s_ 8.3.1 name.default description (_m_i_n_,_ _m_a_x_)_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ terms.1 number of terminals; one terminal = (1, 50) one port first.1 identification number of the pseudo (1, 500) process associated to the first terminal. The names of the pseudo- processes are smm<first>, smm<first+1> ... letters.1 number of receive letter operations (1, 10) sent to the network per terminal recmask1.65535 first 16 bits of the receiver mask (0,2**16-1=65535) used in open messages \f recmask2.65535 last 16 bits of the receiver mask (0,2**16-1=65535) used in open messages delay.300 delay after an unsuccesful open (1, 3000) attempt until the next one. The timer count is stated as 10 times the wanted seconds, e.g. the de- fault is half a minute waitatt.300 timeout limit for the answer on an (1, 3000) attention message (sent to the application). The default is half a minute netname.npm process name of the network port module in RC8000 (or the pseudo- process when the pseudonet is ac- tivated) pseudonet.no = no : normal work (no, yes) = yes: the network is simulated via current input and a pseudo process log.0 test output parameter for the (0, 15) coroutine system ctest.0 test output parameter for the (0, 255) coroutine system testname.smmtest document name of the backing sto- rage area for test records. Relevant only when ctest <> 0 \f cyclic.yes = yes: the testoutput document must (yes, no) be used from the beginning again when end _of _document is met, i.e. cyclically = no : the testoutput document must be extended when end _of _do- cument is met. Relevant only when ctest <> 0 trace.no = yes: messages and answers must be (no, yes) traced on current output = no : no printout of messages/ answers. 8_._4_ _ _ _ _ _ _ _P_r_o_g_r_a_m_ _S_t_a_r_t_ _U_p_ 8.4 The SMM module is started in an internal process with sufficient resources and with user bases equal to system bases (i.e. -8388607 8388605). If the user bases do not equal the system bases, it is impossible to get contact with the operating system 's' from the terminals (alias the pseudo processes). The name of the process is the identifications of the ports at the SC level. If the system should serve 8 terminals with 2 letters per terminal and the testoutput must be delivered in the bs file 'smmtestmax' (which must not be extended) and the npm process is named 'npm3', the following resources are required: size: 60566 + 8 * (2622+2*370) = 87462 HW buf : 5 + 8 * (6+2) = 69 area: 2 + 8 + 1 = 11 Thus the process may be defined as follows new smm size 90 000 buf 69 area 11 base -8388607 8388605 run and the program, named smmp could be activated as follows smmp terms.8 letters.2 netname.npm3, ctest.255 testname.smmtestmax \f 8_._5_ _ _ _ _ _ _ _E_r_r_o_r_ _M_e_s_s_a_g_e_s_ 8.5 There are two kinds of error messages; warnings and alarms. 8_._5_._1_ _ _ _ _ _W_a_r_n_i_n_g_s_ 8.5.1 Warnings are printouts on current output indicating an error but the execution keeps going. There is only one warning: testoutput stopped, status = ..., halfwords = ..., segment count = ... this implies that the production of testoutput is stopped because of an illegal status. 8_._5_._2_ _ _ _ _ _A_l_a_r_m_s_ 8.5.2 Alarms are printouts on current output when the execution of SMM is stopped. They are all serious errors which cannot be repaired by SMM, e.g. program errors (index, field and the like) and the network program is not accessible. The alarms provided by the ALGOL8 running system are not listed, but can be found in ref. 7, 8 and 10. The alarms are given in alphabetical order. appl mess <res> One of the appl _message coroutines cannot be started. <res> is the result received from the ALGOL8 procedure new _activity, cf. ref. 10. \f break 6 Too many buffers used, cf. ref. 9. fatal <no> A fatal error has been discovered and <no> = 1 an output message to the network is greater than the network buf- fer size 2 the application process, which has sent a message to SMM, is not available when SMM wants to access its process description in order to get its name 3 illegal action 4 illegal state 5 operation received from the delay semaphore 7 pseudonet only: the message area cannot be accessed 8 pseudonet only: the answer area cannot be accessed 9 pseudonet only: the buffer area of a message or an answer cannot be accessed. netinput <res> As 'appl mess' but concerning the network _input coroutine. npm ans <res> As 'appl mess' but concerning the pseudonet coroutine: npm _answer. npm mess <res> As 'appl mess' but concerning the pseudonet coroutine: npm _message. npm res <res> Dummy answer received from the npm process. <res> is the result from the monitor function wait _answer (18), cf. ref. 2. \f ps create <res>*1000 + <index> if <res> is greater than zero then the creation of the pseudo process corresponding to <index> was un- successful. <res> is the result received from the monitor function create _pseudo _process (80), cf. ref. 11. If <res> is zero the creating of the pseudo process corresponding to <index> was reported correctly but the investigation of the process description by means of the monitor function process _description (4) failed. <index> less than or equal to the number of terminals indicates pseudo processes named 'smm<first>', 'smm<first+1>' and so on, while <index> equal to 1 + number of terminals indicates the pseudonet named 'npm' or the name given as fp-parameter 'netname' in the call of SMM. start <res> As 'appl mess' but concerning the start _network _input coroutine. terminal <res> As 'appl mess' but concerning one of the terminals. \f 8_._6_ _ _ _ _ _ _ _P_r_o_g_r_a_m_ _C_l_o_s_e_ _D_o_w_n_ 8.6 The execution of the program may stop either because of an alarm or an operator initiative. The operator may suspend the execution by means of the break command. Before the program stops, it tries to close all the ports and to remove the pseudo processes created for the terminals and the pseudonet. These actions are provided by the trap routine. In order to inform the operator about the state of the clearing, the trap routine produces a printout at entry, when a close port attempt has been performed, when a remove pseudo process has been executed and finally at exit. At last the ALGOL8 printout 'end <blockread>' will appear. If the operator tries to stop the execution by any other means than the break command, the cleaning will not be completed, i.e. pseudo processes will persist and ports are still reserved. 8_._7_ _ _ _ _ _ _ _S_y_s_t_e_m_ _G_e_n_e_r_a_t_i_o_n_ 8.7 The SMM program is written in ALGOL and must be translated by the software package SW8500/1 ALGOL release 12.0 or newer and the coroutine system SW8240/1 Coroutine System release 1.0 must be available during the compilation. The standard procedure write must be newer than the one released in release 12.0 of the ALGOL package, because it must be able to handle shift-in and shift-out characters in a conversion table defined by means of the standard procedure out _table. \f F_ \f F_ A_._ _ _ _ _ _ _ _ _R_E_F_E_R_E_N_C_E_S_ A. 1 RCSL No 31-D580: R_C_8_0_0_0_ _T_e_r_m_i_n_a_l_ _P_r_o_c_e_s_s_ Palle Andersson, September 1979. A_b_s_t_r_a_c_t_: This paper describes the conventions of an external process controlling a terminal connected to RC8000. Replaces RCSL No 31-D538. (10 printed pages). 2 RCSL No 31-D477: R_C_8_0_0_0_ _M_o_n_i_t_o_r_,_ _P_a_r_t_ _2_,_ _R_e_f_e_r_e_n_c_e_ _M_a_n_u_a_l_. Tove Ann Aris, Bo Tveden-Jørgensen, January 1978. A_b_s_t_r_a_c_t_: This manual describes monitor conventions, monitor procedures and format of monitor tables. (129 printed pages). 3 RCSL No 43-GL11417: C_E_N_T_E_R_N_E_T_,_ _N_e_t_o_w_r_k_ _P_o_r_t_ _M_o_d_u_l_e_ _-_ _N_P_M_,_ _R_e_f_e_r_e_n_c_e_ _M_a_n_u_a_l_ Niels Carsten Jensen, August 1981. A_b_s_t_r_a_c_t_: This manual describes the Network Port Module (NPM) which implements the Host Port Protocol (HPP) in the RC8000 computer. The HPP is used in CENTERNET to connect a host computer with the network. (28 printed pages). 4 RCSL No 43-GL11412: C_E_N_T_E_R_N_E_T_,_ _X_._2_8_ _S_c_r_o_l_l_ _M_o_d_e_ _T_e_r_m_i_n_a_l_ _S_u_p_p_o_r_t_,_ _R_e_p_o_r_t_. Inger Marie Toft Hansen (Not printed yet). 5 RCSL No 43-GL11428: C_E_N_T_E_R_N_E_T_,_ _V_i_r_t_u_a_l_ _T_e_r_m_i_n_a_l_ _P_r_o_t_o_c_o_l_ _(_V_T_P_)_,_ _R_e_p_o_r_t_. Per Høgh, Inger Marie Toft Hansen. A_b_s_t_r_a_c_t_: This document contains the specifications of the Virtual Terminal Protocol for CENTERNET. The protocol covers the three terminal classes, data entry, scroll and native. The protocol definition is mainly based on the Data Entry protocol for EURONET (VTP-D/Issue 4). Scroll and native mode terminals and parameters selecting during a session have been added. (Not printed yet). \f 6 RCSL No 43-GL11341 C_E_N_T_E_R_N_E_T_,_ _R_C_8_0_0_0_ _N_e_t_w_o_r_k_ _A_c_c_e_s_s_,_ _P_r_o_g_r_a_m_m_i_n_g_ _G_u_i_d_e_ Karsten Kynde, August 1981. A_b_s_t_r_a_c_t_: This paper describes the network access methods to be used when the RC8000 is employed as a Host to CENTERNET. (40 printed pages). 7 RCSL Nr 31-D639: A_L_G_O_L_ _C_o_r_o_u_t_i_n_e_ _S_y_s_t_e_m_,_ _B_r_u_g_e_r_v_e_j_l_e_d_n_i_n_g_ Jesper Andreas Tågholt, Oktober 1981. R_e_s_u_m__: Denne manual beskriver et coroutine system til brug under ALGOL8. (50 trykte sider). 8 RCSL Nr 31-D666: A_L_G_O_L_ _C_o_r_o_u_t_i_n_e_ _S_y_s_t_e_m_,_ _T_e_s_t_u_d_s_k_r_i_v_n_i_n_g_,_ _B_r_u_g_e_r_v_e_j_l_e_d_n_i_n_g_ Lis Clement, November 1981. R_e_s_u_m__: Dette skrift beskriver en metode til flexibel udskrivning af test filer genereret af RC8000 Coroutine System. (20 trykte sider). 9 RCSL No 42-i0781: A_L_G_O_L_7_,_ _U_s_e_r_'_s_ _M_a_n_u_a_l_,_ _P_a_r_t_ _1_._ Bodil Larsen, August 1979. A_b_s_t_r_a_c_t_: Description of the ALGOL7 programming language. (148 printed pages). 10 RCSL No 31-D581: A_L_G_O_L_8_ Jørgen Zachariassen, November 1979. A_b_s_t_r_a_c_t_: Description of the ALGOL8 programming language, as extensions to ALGOL7. ALGOL8 includes the activity concept, allowing procedures to act as coroutines with current I/O transfers, format 8000 procedures for IBM3270 compatible transaction processing, new layout possibilities, character constants and a few minor changes to ALGOL7. \f F_ B_._ _ _ _ _ _ _ _ _I_N_D_E_X_ B. B_._1_ _ _ _ _ _ _ _S_u_r_v_e_y_ _o_f_ _F_i_g_u_r_e_s_ B.1 PAGE Figure 1: Normal operation flow ............................ 25 Figure 2: Start and stop of operation flow ................. 28 Figure 3: Structure of the program text .................... 31 Figure 4: Outline of start, connect and stop a terminal .... 47 Figure 5: Outline of the normal work of a terminal ......... 49 Figure 6: Outline of clear mechanism ....................... 50 Figure 7: Survey of the automaton .......................... 51 Figure 8: Survey of actions ................................ 52 Figure 9: Survey of user records ........................... 70 Figure 10: Pseudoprocess as pseudonet ....................... 73 Figure 11: Operation flow between SMM and pseudonet ......... 74 B_._2_ _ _ _ _ _ _ _S_u_r_v_e_y_ _o_f_ _E_x_a_m_p_l_e_s_ B.2 Example 1: Virtual terminals connected as RC8000 terminals .. 1 Example 2: The printout with trace.yes ...................... 72 Example 3: Commands for the pseudonet which form an ordinary SMT-SMM communication ................... 82 Example 4: Verification of the commands described in example 3 ..................................... 83 \f F_ \f i T_A_B_L_E_ _O_F_ _C_O_N_T_E_N_T_S_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _P_A_G_E_ 1. INTRODUCTION ........................................... 1 2. INSTALLATION ........................................... 2 3. KEYBOARD ............................................... 3 4. STARTING DATASTAR ...................................... 4 5. SCREEN CONTROL ......................................... 5 6. PRINTERS ............................................... 6 A_P_P_E_N_D_I_C_E_S_: A. REFERENCES ............................................. 7 B. FUNCTION KEYS .......................................... 8 B.1 Function Keys DATASTAR ............................ 8 B.2 Function Keys FORMGEN ............................. 9 \f ii \f 1_._ _ _ _ _ _ _ _ _I_N_T_R_O_D_U_C_T_I_O_N_ 1. The present issue of DataStar 1.101 has been adapted specially for use on your RC855 Work Station. The DataStar package your have received contains the following: - This manual "DataStar for the RC700 Microcomputer System, In- stallation Guide". - MicroPro's documentation of DataStar: - DataStar, User's Guide. - A diskette containing the DataStar system. Do not write on the original distribution diskette as it is your master copy and serves as last back-up in case of grave errors. \f F_ 2_._ _ _ _ _ _ _ _ _I_N_S_T_A_L_L_A_T_I_O_N_ 2. Make a copy of the original DataStar distribution diskette. Transfer all the DataStar files to a CP/M system diskette. The DataStar standard system need no further installation or modification. \f F_ 3_._ _ _ _ _ _ _ _ _K_E_Y_B_O_A_R_D_ 3. The DataStar system installed only makes use of the standard keys on the keyboard, i.e. alphabetic, numeric and special characters. Included on the distribution diskette your will find two pro- grams, EXTDS and EXTFG, which must be executed if you want to utilize the special keys on the RC700 keyboard. Appendix B con- tains a list of the special keys and their functions in DataStar. EXTDS and EXTFG apply only to the latest production of the RC700 keyboards, i.e. RC721 with production number after KBU723 serial number 50 and RC722 with production number after KBU722 serial number 383, see ref. 1, appendix D. EXTDS handles the data entry program DATASTAR. EXTFG handles the form-generating program FORMGEN. Example of call: A>EXTDS DATASTAR A>EXTFG FORMGEN \f F_ 4_._ _ _ _ _ _ _ _ _S_T_A_R_T_I_N_G_ _D_A_T_A_S_T_A_R_ 4. Once installed, the data entry program is started by typing the name of the command file, normally DATASTAR, possibly followed by the name of the data entry form wanted. The form-generating program is started by typing the command file name, normally FORMGEN. \f F_ 5_._ _ _ _ _ _ _ _ _S_C_R_E_E_N_ _C_O_N_T_R_O_L_ 5. The highlight facility of DataStar has been disabled (the control 0 and control L functions in FORMGEN), the implementation of this facility in DataStar conflicts with the CP/M-BIOS interpretation of screen attributes. The addressing mode of DataStar is horizontal, vertical position (CONFI; cursor addressing 1: H, V). \f F_ 6_._ _ _ _ _ _ _ _ _P_R_I_N_T_E_R_S_ 6. The printer normally used by your CP/M system can be used by the DataStar system without modifications. \f F_ A_._ _ _ _ _ _ _ _ _R_E_F_E_R_E_N_C_E_S_ A. 1 RCSL No 42-i1995: CP/M for the RC700 Microcomputer System, User's Guide \f F_ B_._ _ _ _ _ _ _ _ _F_U_N_C_T_I_O_N_ _K_E_Y_S_ B. B_._1_ _ _ _ _ _ _ _F_u_n_c_t_i_o_n_ _K_e_y_s_ _D_A_T_A_S_T_A_R_ B.1 Key: = Function: = Command: m_ ESC = ESCAPE = ESC = WORD RIGHT = @F = WORD LEFT = @A RUBOUT = DELETE CHARACTER LEFT = DEL CLEAR = NOT USED = = FIRST FIELD = @T PA1 = NEXT RECORD = @N PA2 = PREVIOUS RECORD = @P PA3 = RESTORE SCREEN = @Z PA4 = END ENTRY = @B PA5 = EXIT CURRENT FORM = @E = NOT USED = = NOT USED = = CURSOR LEFT = @S = CURSOR RIGHT = @D PF1 = DELETE CHARACTER = @G PF2 = NOT USED = PF3 = NOT USED = PF4 = INSERT HOLE = @V PF5 = PRINT FORM = @U PF6 = PRINT DATA = @O PF7 = NOT USED = PF8 = HELP = @J p_ = CARRIAGE RETURN = CR \f F_ B_._2_ _ _ _ _ _ _ _F_u_n_c_t_i_o_n_ _K_e_y_s_ _F_O_R_M_G_E_N_ B.2 Key: = Function: = Command: m_ ESC = ESCAPE = ESC = WORD RIGHT = @F = TABULATION = @I (SHIFT + ) = WORD LEFT = @A RUBOUT = DELETE CHARACTER LEFT = DEL CLEAR = NOT USED = = NOT USED = PA1 = SET/CLEAR TAB = @U PA2 = INSERT COL = @B PA3 = DELETE COL = @T PA4 = FORM DONE = @C PA5 = SAVE AND EXIT = B = CURSOR UP = @E = CURSOR DOWN = @X = CURSOR LEFT = @S = CURSOR RIGHT = @D PF1 = DELETE CHARACTER = @G PF2 = DELETE FIELD = @Z PF3 = DELETE LINE = @Y PF4 = INSERT HOLE = @V PF5 = DEFINE FIELD = @R PF6 = DEFINE KEY = @K PF7 = PRINT FORM = @W PF8 = HELP = @J p_ = CARRIAGE RETURN = CR \f F_ \f «eof»