... statement produces a call for this subroutine.</para></listitem>
</varlistentry>
+<varlistentry>
+<term>TAPERD</term>
+<listitem><para>Entry to this subroutine causes BCD information to be
+read from tape. The arguments are: (1) location of the format
+specification, (2) tape number, and (3) a list of variable to be read.
+The READ BCD TAPE . . . statement produces a call for this
+routine.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>READ</term>
+<listitem><para>Similar to TAPERD above except that the use of tape 7 (the input tape) is implied. The READ FORMAT . . . statement
+produces a call for this subroutine.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>PUNCH</term>
+<listitem><para>Entry to this subroutine causes BCD information to be
+written on tape 5 (punch output type).
+The arguments are the same as PRINT and the PUNCH FORMAT
+. . . statement produces the call.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>COMMNT</term>
+<listitem><para>Entry to this subroutine causes
+BCD informtion to be printed on the attached (on-line) printer. The
+arguments are the same as PRINT except that the line spacing is not
+given in the format specification since an automatic 1/6 page skip is
+produced. The statement producing the call is PRINT ON LINE
+. . . .</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>SETEOF</term>
+<listitem><para>This name may appear explicitly in the form
+SETEOF.(S). where S is an expression in the statement label mode
+designating the point of return when an end-of-tape is encountered
+during the reading or the writing of magnetic tape.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>SETETT</term>
+<listitem><para>This name may appear explicitly in the form
+SETETT.(S). where S is an expression in the statement label mode
+designating the point of return when an end-of-tape is encountered
+during the reading or the writing of magnetic tape.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>SETERR</term>
+<listitem><para>This name may appear explicitly in the form
+SETERR.(S), where S is an expression in statement label mode
+designating a point of return after an illegal data character or
+illegal format specification has been encounterered by an input-output
+subroutine.</para></listitem>
+</varlistentry>
+
</variablelist>
+
+<para>It should be understood thatthe subroutines described above may be called by other subroutines as well as statements. Thus, for example,
+SETEOF is called by TAPERD, TAPEWR calls PRINT, and all of the
+input-output routines call ERROR.</para>
</sect1>
</chapter>
+
+<appendix><title>The DEFINE Statement in MAD</title>
+
+<note><para>DEFINE is not supported in the Retrocomputing Museum
+implementation.</para></note>
+
+<para>The following describes a procedure by which new operators and
+mode conversion operations may be introduced into the MAD language and
+used immediately thereafter in the rest of the program. As each
+definition is processed, the sequence of machine-like operations
+defining the behavior of the operator becomes part of the translator,
+just as the sequence for any already existing operator in the MAD
+language. The definition is "temporary", in that it applies only the
+program or external function definition which contains the definition
+program. In every case, the definition program must precede the first
+use of the operator or conversion being defined. A definition may
+refer to previously defined operators and conversions, but not to
+operators or conversions not yet defined. An example is given
+immediately below, to which reference may be made while reading the
+complete explanation which follows it.</para>
+
+<programlisting>
+ Example:
+
+ DEFINE BINARY OPERATOR .LOGADD., PREDECENCE SAME AS .OR.
+ MODE STRUCTURE 2 .LOGADD.2 TO 2, 1 .LOGADD.1 TO 1
+
+
+ JMP *+1, MQ, *+7
+ STQ T
+ CAL A
+ ORA B
+ SLW T+1
+ CLA T+1
+ OUT AC
+ STO T
+ JMP *-6
+ END
+</programlisting>
+
+<para>This example illustrates some, but not all, of the pertinent facts about definitions.</para>
+
+<sect1><title>Operator name</title>
+
+<para>The name of the operator being defined consists of a sequence of
+<emphasis>letters</emphasis> (at most six), preceded and followed by
+periods (e.g. .LOGADD.).</para>
+
+</sect1>
+<sect1><title>Modes</title>
+
+<para>The modes already existing in MAD are referred to in operator
+and conversion definition programs by numeric codes:</para>
+
+<programlisting>
+ Floating Point 0
+ Integer 1
+ Boolean 2
+ Function Name 3
+ Statement Label 4
+</programlisting>
+
+<para>The user may find it necessary to introduce new modes to accompany
+newly defined operators. These are introduced via mode declarations
+similar to those of the form</para>
+
+<para role='centered'>INTEGER J,M,P,GCD.,E</para>
+
+<para>except that the new modes are designated by number, as, for
+example,</para>
+
+<para role='centered'>MODE NUMBER 5 MP, GR, V., T</para>
+
+<para>The available numbers are 5, 6, and 7, and these may represent any
+modes desired. This mode declaration does not carry any information
+as to the nature of the arithmetic implied by the mode; it merely
+declares certain variables and function values to be of that mode.
+The interpretation of the mode is implicit in the operator and
+conversion definition programs. Mode declarations may occur anywhere,
+as before, except within operator and conversion definition programs.</para>
+
+</sect1>
+</appendix>
+
+
</book>
<!--
Local Variables: