diff options
Diffstat (limited to 'doc/rfc/rfc120.txt')
-rw-r--r-- | doc/rfc/rfc120.txt | 899 |
1 files changed, 899 insertions, 0 deletions
diff --git a/doc/rfc/rfc120.txt b/doc/rfc/rfc120.txt new file mode 100644 index 0000000..e042014 --- /dev/null +++ b/doc/rfc/rfc120.txt @@ -0,0 +1,899 @@ + + + + + + + NETWORK PL1 SUBPROGRAMS + + + + + + + + + + + + + + + + April 21, 1971 + + Mark Krilanovich + + Computer Research Lab + + University of California + + Santa Barbara, California + + + + + + + + + + + + + + + + + + + + + + + + + + + [Page 1] + +RFC 120 NETWORK PL1 SUBPROGRAMS + + + PREFACE + + The subroutines described in this document have been implemented at UCSB + and make the Network (via the NCP) accessible to PL1 programs executing + in the 360/75. They are callable from within any PL1 main program or + subroutine compiled at UCSB. + + + A set of assembly-language written subprograms is provided to + facilitate the use of the Network by PL1 programmers. They serve as + an interface between the user and the Network Control Program (NCP), + which supervises all Network operations at this site. + + + A concept fundamental to PL1 Network operations is that of a + completion code variable. Associated with each socket that is not in + the closed state is a unique variable, called a completion code + variable. This variable serves two purposes: it identifies the + local socket referenced, and upon completion of the operation it + contains a completion code to indicate the outcome of the operation + to the programmer. It may be used at any time for any purpose other + than Network operations. Its value at the beginning of a Network + operation is immaterial; rather, it is the variable itself that is + important. In all Network operations, whenever a completion code + variable is called for, the only acceptable attributes for the + variable are BINARY FIXED(31,0)ALIGNED. + + In general, the subprograms will initiate the operation, and enter + the WAIT state (consume no CPU time) until notified by the NCP of the + completion of the operation. For such operations, the programmer + supplies a time limit, with attributes BINARY FIXED(31,0), which + specifies, in tenths of a second, the maximum length of time the + subprogram is to wait for the operation to complete. If this time + limit is exceeded, a completion code is supplied to indicate the + error, and control is returned to the calling program, with the + operation still pending. + + In those operations requiring a socket to be specified by its socket + identifier, the following format is used. The identifier is + specified as a BINARY FIXED(31,0) array, singly dimensioned with at + least two elements, and with a lower subscript bound of one. The + first element is taken to be the site number, and the second element + the socket number. A socket number may have any value, positive, + negative, or zero. Since negative numbers are represented internally + in two's complement form, for the purposes of the gender of a socket, + a socket number is even or odd according to whether its absolute + value is even or odd, respectively. + + + + + [Page 2] + +RFC 120 NETWORK PL1 SUBPROGRAMS + + + Following is a description of each subprogram, its function and + calling sequence. + +(1) OPEN + + By invoking this subprogram, the user requests that the specified + local socket be removed from the closed state and thus be prepared + to participate in data transfer. There are three distinct + operations that can be performed by this subprogram, and these are + described below: + + (A) CONNECT + + By initiating this operation, the user requests that the + specified local socket be logically connected to the specified + foreign socket, and that data transfer between the two sockets + be enabled. The subprogram will wait until the foreign socket + either accepts or rejects the connection attempt. This + operation is valid only when the socket is in the closed + state. + + The calling sequence is as follows: + + CALL @OPEN(cmpcd, time,lclsck,fgnsck,ws); + + where + + 'cmpcd' is the completion code variable to be associated + with the local socket. + 'time' is the length of time the subprogram is to wait + for the completion of the operation. + 'lclsck' is the socket identifier of the local socket. + 'fgnsck' is the socket identifier of the foreign socket. + 'ws' is a workspace which has the same attributes as a + socket identifier, and, if the operation if + successful, will become associated with the local + socket for the life of the connection. In response + to certain future operations, information may be + returned to the programmer in this workspace. + + The following completion codes are possible for this + operation: + + 0, The operation was successful and the connection has + been established + 4, The specified completion code variable is already + assigned to a socket; the operation was suppressed + 8, The specified local socket is not in the closed + + + + [Page 3] + +RFC 120 NETWORK PL1 SUBPROGRAMS + + + state; the operation was suppressed + 12, All communication paths to the specified foreign site + are in use; the operation was suppressed + 16, Local resources are insufficient to support another + connection; the operation was suppressed + 20, The connection attempt was rejected by the foreign + process + 24, The specified local socket is not local to UCSB; the + operation was suppressed + 28, The specified foreign site is invalid; the operation + was suppressed + 32, An addressing or protection exception was encountered + with respect to the specified workspace; the + operation was suppressed + 36, Either hardware at the foreign site is inoperative or + the NCP's counterpart at the foreign site does not + exist or has failed + 40, Local and foreign sockets are both either send or + receive sockets; the operation was suppressed + 44, By operator command, all Network operations were + terminated; the socket will be closed + 60, An NCP control transmission error occured; the + operation was suppressed + 252, The specified time limit was exceeded; the operation + was initiated but not completed + + (B) LISTEN + + This operation is a request for notification of any connection + attempt directed toward the specified local socket. The + subprogram waits until such a call is received, at which time + the calling process' socket identifier is returned to the + calling program. This operation is valid only when the + designated local socket is in the closed state. The calling + sequence is as follows: + + CALL @OPEN(cmpcd, time,lclsck,ws); + + where + + 'cmpcd' is the completion code variable to be associated + with the local socket. + 'time' is the length of time the subprogram is to wait + for the completion of the operation. + 'lclsck' is the socket identifier of the local socket. + 'ws' is a workspace which, if the operation is + successful, will contain the socket identifier of + the calling socket, and will become associated with + + + + [Page 4] + +RFC 120 NETWORK PL1 SUBPROGRAMS + + + the local socket for the life of the connection. + 'ws' has the same attributes as a socket identifier. + + The following completion codes are possible for this + operation: + + 0, The operation was successful and a call has been + received + 4, The specified completion code variable is already + assigned to a socket; the operation was suppressed + 8, The specified local socket is not in the closed + state; the operation was suppressed + 12, Local resources are insufficient to support another + connection; the operation was suppressed + 16, The specified local socket is not local to UCSB; the + operation was suppressed + 20, An addressing or protection exception was encountered + with respect to the specified workspace; the + operation was suppressed + 44, By operator command, all Network operations were + terminated; the socket will be closed + 252, The specified time limit was exceeded; the operation + was initiated but not completed + + (C) ACCEPT + + This operation accepts connection with the foreign socket + whose call caused successful completion of a previous LISTEN + operation by the specified local socket. After completion of + this operation, data may be transferred to or from the local + socket, depending on its gender. This operation is valid only + when the last operation referencing the local socket was a + LISTEN operation. The subprogram will wait until the + operation is completed. + + The calling sequence is as follows: + + CALL @OPEN(cmpcd, time); + + where + + 'cmpcd' is the completion code variable associated with + the local socket by a previous LISTEN operation. + 'time' is the length of time the subprogram is to wait + for the completion of the operation. + + The following completion codes are possible for this + operation: + + + + [Page 5] + +RFC 120 NETWORK PL1 SUBPROGRAMS + + + 0, The operation was successful, and the connection is + established + 4, The specified local socket is in the closed state + (the NCP may have received an abort notification from + the foreign process); the operation was suppressed + 8, The previous operation specifying the designated + local socket was not a LISTEN; the operation was + suppressed + 12, All communication paths to the specified foreign site + are in use; the socket has been returned to the + closed state + 252, The specified time limit was exceeded; the operation + was initiated but not completed + +(2) CLOSE + + This operation is a request that the specified local socket be + returned to the closed state. If the last operation involving this + socket was a LISTEN, this operation refuses the foreign process' + connection attempt. If the last operation was a CONNECT, the + attempt is aborted. If a connection is established, any data in + transit from the local socket is allowed to reach the foreign + socket and to be either received or flushed before the local socket + is closed. The subprogram will wait until the socket has been + returned to the closed state. + + The calling sequence is as follows: + + CALL @CLOSE(cmpcd,time); + + where + + 'cmpcd' is the completion code variable associated with the + local socket. + 'time' is the length of time the subprogram is to wait for the + completion of the operation. + + The following completion codes are possible for this operation: + + 0, The operation was successful, and the socket has been + returned to the closed state + 8, The specified completion code variable is not currently + assigned to a socket; the operation was suppressed + 12, The specified local socket is in the process of being + closed; the operation was suppressed, but the local + socket will be closed + 36, Either hardware at the foreign site is inoperative, or the + NCP's counterpart at the foreign site does not exist or + + + + [Page 6] + +RFC 120 NETWORK PL1 SUBPROGRAMS + + + has failed + 44, By operator command, all Network operations were + terminated; the socket will be closed + 60, An NCP control transmission error occured; the operation + was aborted + 64, A transmission error occured; the operation was aborted, + but the socket will be closed + 252, The specified time limit was exceeded; the operation was + initiated but not completed + +(3) SEND + + This operation causes data to be sent to the foreign socket. The + subprogram will wait until the data has been received by the + foreign socket, or until it has been queued locally by the NCP. + + The calling sequence is as follows: + + CALL @WRITE(cmpcd, bfr,len,time[,offset]); + + where + + 'cmpcd' is the completion code variable associated with the + local socket. + 'bfr' is the data to be sent, and must be a singly dimensioned + array, either DECIMAL or BINARY, FIXED or FLOAT. + 'len' is the number of bits of data to be sent. If 'len' is + non-positive, no operation is performed. 'len' has the + attribute BINARY FIXED(31,0). + 'time' is the length of time the subprogram is to wait for the + completion of the operation. + 'offset' is the bit offset from the first bit of 'bfr' at + which data transmission is to begin, and must have the + attributes BINARY FIXED(31,0). If not specified, + 'offset' defaults to zero. + + The following completion codes are possible for this operation: + + 0, The operation was successful, and the data has been sent + 4, The specified local socket is not a SEND socket; the + operation was suppressed + 8, The specified completion code variable is not assigned to + a socket; the operation was suppressed + 12, A previous SEND operation is in progress; the operation + was suppressed + 16, The connection is not fully open; the operation was + suppressed + 20, The foreign socket terminated the connection before + + + + [Page 7] + +RFC 120 NETWORK PL1 SUBPROGRAMS + + + completion of the SEND operation; not all data was + transmitted + 36, Either hardware at the foreign site is inoperative, or the + NCP's counterpart at the foreign site does not exist or + has failed + 44, By operator command, all Network operations were + terminated; the socket will be closed + 52, One or more interrupts were received from the foreign + socket; the operation was suppressed + 56, An addressing exception was encountered with respect to + the data buffer; the operation was suppressed + 60, An NCP control transmission error occured; the operation + was suppressed + 64, A transmission error occured; the operation was aborted, + and the socket will be closed + 252, The specified time limit was exceeded; the operation was + initiated but not completed + +(4) RECEIVE + + This operation causes data to be received from the foreign socket. + The subprogram will wait until the reception of data is complete. + + The calling sequence is as follows: + + CALL @READ(cmpcd,bfr,len,time[,offset]); + + where + + 'cmpcd' is the completion code variable associated with the + local socket. + 'bfr' is the variable into which the data is to be placed, and + must be a singly dimensioned array, DECIMAL or BINARY, + FIXED or FLOAT. + 'len' is the number of bits of data to be received. If 'len' + is non-positive, no operation is performed. 'len' has + the attribute BINARY FIXED(31,0). + 'time' is the length of time the subprogram is to wait for the + completion of the operation. + 'offset' is the bit offset from the first bit of 'bfr' at + which the first bit of data is to be placed, and must + have the attributes BINARY FIXED(31,0). If not + specified, 'offset' defaults to zero. + + The following completion codes are possible for this operation: + + 0, The operation was successful and the data has been + received + + + + [Page 8] + +RFC 120 NETWORK PL1 SUBPROGRAMS + + + 4, The specified local socket is not a receive socket; the + operation was suppressed + 8, The specified completion code variable is not assigned to + a socket; the operation was suppressed + 12, A previous RECEIVE operation is in progress; the + operation was suppressed + 16, The connection is not fully open; the operation was + suppressed + 20, The foreign socket terminated the connection before + completion of the RECEIVE operation; data is + unpredictable + 36, Either hardware at the foreign site is inoperative, or the + NCP's counterpart at the foreign site does not exist or + has failed + 44, By operator command, all Network operations were + terminated; the socket will be closed + 24, An addressing or protection exception was encountered with + respect to the data buffer; the operation was suppressed + 52, One or more interrupts were received from the foreign + socket; the operation was suppressed + 60, An NCP control transmission error occured; the operation + was aborted, and the socket will be closed + 252, The specified time limit was exceeded; the operation was + initiated but not completed + +(5) CHECK + + This operation causes the status of the specified local socket to + be returned. There is no completion code variable associated with + this operation, since it is always successful and the socket is + identified by its socket number. This operation is valid at any + time and is always completed immediately. + + The calling sequence is as follows: + + CALL @CHECK(lclsck,stat,mnem,fgnsck,deficit); + + where + + 'lclsck' is the socket identifier of the local socket. + 'stat' is a code for the status, and has the attribute BINARY + FIXED(31,0). + 'mnem' is a mnemonic for the status, and has the attribute + CHARACTER, of any fixed length greater than or equal to + eight. If 'mnem' is longer than eight bytes, it will be + padded to the right with blanks. + 'fgnsck' is the socket identifier of the foreign socket, or + zero. + + + + [Page 9] + +RFC 120 NETWORK PL1 SUBPROGRAMS + + + 'deficit' is the send/receive deficit in bits, or zero, and + has the attributes BINARY FIXED(31,0). + + 'lclsck' is the only argument the programmer need define; + the others are output from the subprogram. + + Following are the possible status codes, together with their + mnemonics and interpretations. + + 'STAT' 'MNEM' MEANING + ---- ---- + 0 OPEN A connection is fully established. No + SEND/RECEIVE operation is in progress. + 'fgnsck' is the socket identifier of the + connected socket. 'deficit' is the number + of bits queued locally at the socket by the + NCP and available to satisfy a future + RECEIVE operation, or awaiting output as + the result of a previous SEND operation. + + 1 LISTEN A LISTEN has been issued. + + 2 CONNECT A CONNECT has been issued. 'fgnsck' is the + socket identifier of the foreign socket. + + 3 DECISION A LISTEN has been completed. 'fgnsck' is + the socket identifier of the calling + socket. + + 4 CALL(S) One or more calls have been received for + the local socket. No LISTEN or CONNECT has + been issued. + + 5 I/O A connection is fully established. A + SEND/RECEIVE operation is in progress. + 'fgnsck' is the socket identifier of the + connected socket. 'deficit' is the number + of bits yet to be sent or received. + + 6 CLOSED The socket is in the closed state. + + 7 <--DRAIN The foreign socket is attempting to close + the connection. The NCP has data yet to be + read by the local socket. 'fgnsck' is the + socket identifier of the connected socket. + 'deficit' is the number of bits yet to be + received. + + + + + [Page 10] + +RFC 120 NETWORK PL1 SUBPROGRAMS + + + 8 DRAINED The foreign socket is attempting to close + the connection. The NCP is awaiting + arrival at the foreign site of data + currently in transit. 'fgnsck' is the + socket identifier of the connected socket. + + 9 CLOSING The local socket has issued a CLOSE. The + NCP is in the process of returning the + local socket to the closed state. 'fgnsck' + is the socket identifier of the connected + socket. + + 10 DRAIN--> The local socket has issued a CLOSE. The + NCP is completing the last SEND operation + before returning the local socket to the + closed state. 'fgnsck' is the socket + identifier of the connected socket. + 'deficit' is the number of bits the NCP has + yet to transmit. + +(6) IDENTIFY + + This operation is used to identify a local socket by its completion + code variable. The operation is valid at any time, and is always + completed immediately. Since it is always successful, there are no + completion codes for the operation, and the contents of the + completion code variable are not changed. + + The calling sequence is as follows: + + CALL @ID(cmpcd,lclsck); + + where + + 'cmpcd' is the completion code variable to be associated with + the local socket + 'lclsck' is set to the socket identifier of the local socket + if the completion code variable is associated with a + socket, or to zero otherwise. + +(7) SIGNAL + + This operation is used to convey a signal to the foreign process. + The significance of the signal is completely user-dependent. The + effect is that the next time the foreign socket attempts to + initiate a RECEIVE or SEND operation, the operation will be + suppressed, and a completion code supplied indicating that a signal + had been received. The subprogram will wait until the signal has + + + + [Page 11] + +RFC 120 NETWORK PL1 SUBPROGRAMS + + + been sent to the foreign NCP. This operation is valid only when + the socket is fully open. + + The calling sequence is as follows: + + CALL @ID(cmpcd,time); + + where + + 'cmpcd' is the completion code variable associated with the + local socket. + 'time' is the length of time the subprogram is to wait for + completion of the operation. + + The following completion codes are possible for this operation: + + 0, The operation was successful, and the signal has been sent + 4, The specified completion code variable is not assigned to + a socket; the operation was suppressed + 8, The connection is not fully open; the operation was + suppressed + + Certain of the Network subprograms are intended for, although not + restricted to, use with the On-Line System Network operators. The + following is a general description of these operators: + + In all Network operations involving the On-Line System Network + operators, there are certain conventions concerning the format of the + data sent and received. The data is grouped in 'messages' consisting + of three fields, op code, length, and text, in that order. The op + code is one byte in length and is a code which indicates how the text + field is to be interpreted. The length field is two bytes long, and + gives the length, in bits, of the text field, which contains the + actual data. (The op code and length fields together are termed a + header.) + + The following op codes are presently defined: + + op code meaning + + 0 The op code is a NOP. No text field exists, and the + contents of the length field are unpredictable. (This op + code is used mainly as a delimiter.) + + 1 The text field contains EBCDIC characters, one character + per byte. The On-Line System Network operators consider + the characters as intended for display as soon as the + text field has been received. + + + + [Page 12] + +RFC 120 NETWORK PL1 SUBPROGRAMS + + + 2 The text contains codes for keypushes, one byte per key. + The On-Line operators consider the text as intended for + execution as soon as the text field has been received. + + 3 The same as for an op code of 2, except that the On-Line + operators consider that the execution of the keys will be + delayed until all data for that receive operation has + been received. + + The standard format of data sent or received by the On-Line System + operators is a string of messages, with the last message indicated by + a header with a NOP op code, called a trailer. These conventions are + the default situation; any of them may be overridden by appropriate + programming. + + Following are descriptions of those subprograms intended for use with + the On-Line System operators. + +(8) WRITE TO ON-LINE CONSOLE + + This subprogram causes data, assumed to be characters represented + by their EBCDIC codes, to be sent from the specified local socket. + The characters are sent in a standard message, preceded by a + header, and optionally followed by a trailer. The subprogram waits + for the data to be received by the foreign socket, or to be queued + locally by the NCP. This operation is valid only when the local + socket is a send socket, and is fully open. + + The calling sequence is as follows: + + CALL @WTOLC(cmpcd,bfr,len,level,across,down,time); + + where + + 'cmpcd' is the completion code variable associated with the + local socket. + 'bfr' is the character string to be sent, and must have the + attribute STRING, either CHARACTER or BIT, of any length, + fixed or varying. + 'len', in absolute value, is the number of characters to be + sent. If 'len' is positive or zero, the end of the data + is indicated by a trailer; if 'len' is negative, no + trailer is sent. 'len' has the attributes BINARY + FIXED(31,0). + 'level' indicates the mode of typing. The absolute value of + 'level', if non-zero, is the shift level on which to + type, and must be less than or equal to nine. If greater + than nine, one is used. If 'level' is positive, 'across' + + + + [Page 13] + +RFC 120 NETWORK PL1 SUBPROGRAMS + + + and down are relative to the current typing location. If + 'level' is negative, the carriage is positioned to the + upper left-hand corner before typing begins, thus making + 'across' and 'down' absolute coordinates. If 'level' is + zero, the typing is in case one characters, and a + carriage return precedes the positioning for 'across' and + 'down'. If the characters to be displayed are case one + characters, the header sent will have an op code which + indicates characters to be displayed as soon as they are + received; otherwise, the op code will indicate buttons + to be executed as soon as received. 'level' has the + attributes BINARY FIXED(31,0). + 'across' is the number of spaces to be moved horizontally + across the display tube before beginning to type. + 'across' can have any value, positive, negative, or zero, + and has the attributes BINARY FIXED(31,0). + 'down' is the number of lines to be moved vertically down the + display tube before beginning to type. 'down' can have + any value, positive, negative, or zero, and has the + attributes BINARY FIXED(31,0). + 'time' is the length of time the subprogram is to wait for the + completion of the operation. + + The completion codes for this operation are the same as for SEND. + +(9) READ FROM ON-LINE CONSOLE + + This subprogram receives data, assumed to be characters represented + by their EBCDIC codes, from the foreign socket in one or more + standard messages. The subprogram will wait for the data, + optionally followed by a trailer, to be received by the local + socket. This operation is valid only when the local socket is a + receive socket and is fully open. + + The calling sequence is as follows: + + CALL @RFOLC(cmpcd,bfr,len,time); + + where + + 'cmpcd' is the completion code variable associated with the + local socket. + 'bfr' is the variable into which the data is to be placed, and + has the attribute CHARACTER, of any fixed length. If the + length of 'bfr' is greater than the amount of data + received, 'bfr' will be padded to the right with blanks. + 'len', in absolute value, is the maximum number of characters + to be placed in 'bfr'. If the length fields of the + + + + [Page 14] + +RFC 120 NETWORK PL1 SUBPROGRAMS + + + header(s) received total more data than 'len', the excess + data will be received, but will not be placed into 'bfr', + and will not be accessible to the program. If 'len' is + positive or zero, data will be received until a trailer + is encountered. If 'len' is negative, a single message, + exclusive of trailer, will be received. 'len' has the + attributes BINARY FIXED(31,0). + 'time' is the length of time the subprogram is to wait for the + completion of the operation. + + The completion codes for this operation are the same as for + RECEIVE. + +(10) WRITE TO ON-LINE CONSOLE WITH REPLY + + This subprogram combines the functions of 'WRITE TO ON-LINE + CONSOLE' and 'READ FROM ON-LINE CONSOLE'. The subprogram first + sends a string of data to the foreign socket from the specified + send socket, waits for it to be received by the foreign socket (or + queued locally by the NCP), and then waits for a reply directed + toward the specified receive socket. The operation is valid only + when the sockets have the correct gender and both are fully open. + + The calling sequence is as follows: + + CALL @WTOLCR(cmpcd, bfr, len, level, across, down, time, + cmpcd2, bfr2, len2); + + where + + 'cmpcd' is the completion code variable associated with the + local send socket. + 'bfr' is as in 'WRITE TO ON-LINE CONSOLE'. + 'len' is as in 'WRITE TO ON-LINE CONSOLE'. + 'level' is as in 'WRITE TO ON-LINE CONSOLE'. + 'across' is as in 'WRITE TO ON-LINE CONSOLE'. + 'down' is as in 'WRITE TO ON-LINE CONSOLE'. + 'time' is the length of time the subprogram is to wait for + completion, individually, of the transmission and + reception of data. + 'cmpcd2' is the completion code variable associated with the + local receive socket. + 'bfr2' is as 'bfr' in 'READ FROM ON-LINE CONSOLE'. + 'len2' is as 'len' in 'READ FROM ON-LINE CONSOLE'. + + The completion codes for the send socket are the same as for the + SEND operation, and the completion codes for the receive socket are + the same as for the RECEIVE operation. + + + + [Page 15] + +RFC 120 NETWORK PL1 SUBPROGRAMS + + +(11) ERASE + + This subprogram causes data constituting an On-Line System command + to erase the display tube to be sent from the specified local + socket. The data is sent in a single standard message, including + an op code indicating characters to be displayed as they are + received, and optionally including a trailer. The subprogram + waits for the data to be received by the foreign socket, or to be + queued locally by the NCP. This operation is valid only when the + local socket is a send socket, and is fully open. + + The calling sequence is as follows: + + CALL @ERASE(cmpcd,delay1,delay2,time); + + where + + 'cmpcd' is the completion code variable associated with the + local socket. + 'delay1', in absolute value, is the length of time, in tenths + of a second, the subprogram is to pause (in the WAIT + state) before sending the erase. If 'delay1' is + positive or zero, a trailer will be sent after the + erase; if negative, no trailer will be sent. 'delay1' + has the attributes BINARY FIXED(31,0). + 'delay2', is the length of time, in tenths of a second, the + subprogram is to pause after sending the erase and + before returning control to the calling program, and has + the attributes BINARY FIXED(31,0). + 'time' is the length of time the subprogram is to wait for + the completion of the operation. + + The completion codes for this operation are the same as for SEND. + + + [ This RFC was put into machine readable form for entry ] + [ into the online RFC archives by Rune Skaarsmoen 6/97 ] + + + + + + + + + + + + + + + [Page 16] + |