Trailing-Edge
-
PDP-10 Archives
-
decus_20tap4_198111
-
decus/20-0134/focal.mem
There is 1 other file named focal.mem in the archive. Click here to see a list.
DEC-10-AJAA-D
19-Oct-76
DECsystem-10
FOCAL-10
PROGRAMMING MANUAL
DIGITAL EQUIPMENT AUSTRALIA * Melbourne * Australia
This document reflects FOCAL-10 as of version 5J(345)-1.
The information in this document is subject to change
without notice and should not be construed as a commitment
by Digital Equipment Australia.
Actual distribution of the software described in this
manual will be subject to terms and conditions announced
from time to time by Digital Equipment Australia Pty. Ltd.
Digital Equipment Australia assumes no responsibility for
the use or reliability of its software on equipment which
is not supplied by Digital Equipment Australia Pty. Ltd.
For additional copies, order DEC-10-AJAA-D from
Digital Equipment Australia, 60 Park Street,
South Melbourne, VICTORIA 3205, AUSTRALIA. Price - $9.00.
FOCAL-10 Page 2
=================================================================
0.0 Table of contents
--- ----- -- --------
0.1 Introduction
0.2 Equipment requirements
0.3 Features of FOCAL-10
0.4 Getting on the air with FOCAL
0.5 Rubout
0.6 Errors
1.0 Simple arithmetic using the commands "TYPE" and "SET"
1.1 Symbols
1.2 Arrays
1.3 Arithmetic operators
1.4 Example of "TYPE" and "SET"
1.5 The symbol table
2.0 FOCAL program commands
2.1 The program text: WRITE, ERASE, COMMENT, MODIFY
2.1.1 WRITE
2.1.2 ERASE
2.1.3 COMMENT
2.1.4 MODIFY
2.2 Program directives: QUIT, GO, GOTO, DO, RETURN
2.2.1 QUIT
2.2.2 GO
2.2.3 GOTO mm.nn, GO TO mm.nn
2.2.4 DO
2.2.5 RETURN
2.3 Program loops and branches: FOR, IF
2.3.1 FOR
2.3.2 IF
2.4 SET
2.5 XECUTE
2.6 TYPE
2.6.1 TYPE "text"
2.6.2 TYPE 'text"
2.6.3 TYPE $
2.6.4 TYPE $$
2.6.5 TYPE /nn
2.7 Typeout of numeric results
2.7.1 TYPE %mm.nn
2.7.2 TYPE %Emm.nn
2.8 ASK
2.8.1 ASK /nn
3.0 LIBRA Commands
3.1 LIBRA CALL
3.2 LIBRA DELETE
3.3 LIBRA SAVE
3.4 Format of LIBRA commands
4.0 Input and output on other devices
4.1 Input and output channels
4.2 Input device initialization
4.3 Output device initialization
4.4 Releasing a device
4.5 Defaults
FOCAL-10 Page 3
=================================================================
4.6 Differences between OPERATE INPUT and LIBRA CALL
4.7 Notes on file I/O
5.0 The trace feature
6.0 Examples of FOCAL programs
7.0 Stopping FOCAL
7.1 How to force a FOCAL program to exit
7.2 The "REENTER" monitor command
8.0 Functions
8.1 What is a function?
8.2 Standard functions
8.3 External functions: FNEW
8.4 Parameters and values internal to FOCAL: FOCAL
8.5 Monitor information: GETTAB(TABNUM,TABINX)
8.6 Random number generator: FRAN
8.7 Single character I/O: FCHR
8.8 Single character string: FCHR$
8.9 Sleeping and hibernating: FHIBER
8.10 Notes on implementing new functions
9.0 Function summary
10.0 FOCAL command summary
11.0 Character interpretations by FOCAL
12.0 Compatibility of FOCAL implementations.
12.1 General differences.
12.2 PDP-8 FOCAL.
12.3 PDP-12 FOCAL.
12.4 DECsystem-10 FOCAL
12.5 PDP-11 FOCAL.
12.6 FOCAL-GT.
12.7 FOCAL-11/RTX.
12.8 FOCAL-G11.
12.9 PDP-15 FOCAL.
13.0 Error diagnostics
13.1 Fatal errors
13.2 Non-fatal errors
13.3 Format of error print
13.4 List of error diagnostics
13.5 Push-down-list Overflow
14.0 External function: FNEW
14.1 How to load your FNEW program
14.2 Example of an FNEW routine
15.0 Internal representation of numbers --- accuracy
15.1 Single precision
15.2 Double precision KA-10
15.3 Double precision KI-10
16.0 Speed of FOCAL
16.1 Speed of Character Interpretation
16.2 Speed of Line-finding
16.3 Speed of Command-execution
16.4 Speed of Arithmetic Operations
16.5 Speed of Item Evaluation
APPENDICES
A FOCAL memory map
FOCAL-10 Page 4
=================================================================
0.1 Introduction
--- ------------
FOCAL is an online, conversational, interpretive language
for the DIGITAL family of computers. It is designed to
help students, engineers, and scientists solve numerical
problems. The language consists of short, easy-to-learn,
imperative English statements. Mathematical expressions
are typed in standard notation. FOCAL puts the full
calculating power and speed of the computer at your
fingertips. FOCAL is an easy way of simulating
mathematical models, plotting curves, handling sets of
simultaneous equations in n-dimensional arrays, and much
more.
FOCAL-10 programs and data can be read from or written on
any device - see section 4.
FOCAL-10 can call subroutines written in other languages -
see section 14.
The best way to learn the FOCAL language is to sit at the
computer terminal and try the commands, starting with a few
of the examples in this manual.
0.2 Equipment requirements
--- --------- ------------
FOCAL-10 operates on any DECsystem-10 computer in at least
3k of user core.
Unlike versions of FOCAL which run on smaller machines,
FOCAL-10 has no "initial dialogue". Due to the large size
of available memory, all standard functions are retained
automatically.
In general FOCAL-10 language features are more extensive
than those on smaller computers (section 12), and the user
should take care to avoid certain of them if he will want
his program to run elsewhere. However, almost all FOCAL
programs for the PDP-8, PDP-9, PDP-11, PDP-12, and PDP-15
should run on the DECsystem-10. Exceptions are those
programs with special functions, and those with the PDP-11
type of subroutines. (Edit off the * at the end of
papertape programs.)
FOCAL-10 Page 5
=================================================================
0.3 Features of FOCAL-10
--- -------- -- --------
* Sharable interpreter (Fully re-entrant)
* Memory requirements 2k hiseg + 0.5k loseg
* Completely versatile memory-management (fully expandable)
* Double precision or single precision (assembly feature)
* Will run on KA-10, KI-10 and PDP-6 under all monitors
* FOR-loops can use positive or negative increment
* Variables can be numbers or strings
* Three-letter variable names
* Variable names can start with the letter "F"
* Up to 18 subscripts may be used for each variable
* Can have function subprograms in other languages
* File I/O to 14 input or output files plus TTY and LIBRA
* Automated test files included
* Adjustable %E format
* Error messages in English
* Error messages include the interpreter's pointer
* Floating-point trap
* Two levels of error-message severity
* Can suppress non-fatal error messages
* Can suppress colon cue for "ASK" command
* Can suppress equals sign on numeric type-out
* Numeric type-out has a floating sign
* Listing headers have time and date
* Symbol table not destroyed unnecessarily
* Symbol table typed in alphabetical order
* Space after commands not mandatory if not ambiguous
* "GO TO" allowed as two words
* All commands allowable in indirect mode (even MODIFY)
* Handles upper and lower case
* Can type out quote marks, form feed & special characters
* Can abort on an "ASK" command in a loop with control-P
* LIBRA CALL, SAVE and DELETE commands
* Nested library calls
* Exponentiation with uparrow or double asterisk
* Positive response if too many rubouts typed
* Internal indexing of text (for greater speed)
* GETTAB function to obtain monitor information
* Logical IF
FOCAL-10 Page 6
=================================================================
0.4 Getting on the air with FOCAL
--- ------- -- --- --- ---- -----
The user should first obtain access to a DECsystem-10
terminal, and go through the "login" procedure, typing in
the project- programmer numbers and password. Thereafter,
all that is required is to type "R FOCAL" followed by
carriage-return. The monitor will then load the FOCAL
interpreter into memory and start it running. FOCAL will
type an asterisk indicating its readiness to accept a
command or line from the keyboard. Each time the user
completes typing a program line and terminates it by
depressing the carriage-return key (or line-feed or
alt-mode or escape) or after FOCAL has performed a command,
an asterisk is typed to tell the user that FOCAL is ready
for another command or line.
A program line contains a command or series of commands
preceded by a reference number and terminated by a
carriage-return, line-feed, alt-mode, or escape. If the
reference number is omitted, the typed-in line is
immmediately executed (immediate mode).
The reference number is called a "line number" and has the
form mm.nn, where mm is called the "group number" and nn is
called the "step number". The group number lies between 1
and 99, and the step number lies between 01 and 99.
All lines having the same mm form a "group". The group is
then referenced by commands as mm or mm.0. For example:
56.78 THIS AND THE NEXT LINE ARE IN GROUP 56.
56.93 THIS LINE IS PART OF GROUP 56.
63.22 THIS LINE IS THE ONLY LINE IN GROUP 63.
When several commands are typed on one line, they must be
separated by semicolons (;). For example:
49.76 SET X=6;SET Y=X+3;TYPE Y;ERASE 56.93
The same command may be executed on several successive
arguments by separating the arguments with commas. For
example:
71.42 SET X=3, Y=4, Z=5
71.61 TYPE X, Y, Z
71.62 DO 44, 45, 99.62
As only the first letter of a command word is significant
to FOCAL, only the first letter need be typed. Also
spelling is unimportant. For example the following forms
are all equivalent:
FOCAL-10 Page 7
=================================================================
TYPE X
tyep X
T X
Note: FOCAL-10 commands and command-modifiers may be any
sequence of alphabetic characters. Spaces, tabs or control
characters (any character with ASCII value less than
41-octal) may be used between commands, command-modifiers
or arguments to improve clarity. They do not affect
execution.
The available commands are summarised in section 10 and
described fully in sections 2, 3 and 4.
0.5 Rubout
--- ------
FOCAL-10 uses the control-U character to delete back to the
beginning of the line. (This is in contrast to PDP-8
FOCAL, which uses the backarrow.)
Single characters may be deleted with the RUBOUT or
BACKSPACE key. If sufficient rubouts are used to go back
beyond the beginning of the line, FOCAL-10 will echo ^, U,
cr, lf, and asterisk. (In a MODIFY command the asterisk is
not printed).
After a few rubouts, you may wish to use control-R to
display the input-line-so-far.
0.6 Errors
--- ------
FOCAL constantly checks user input for invalid commands,
illegal formats, and many other kinds of errors. It types
a message indicating the kind of error detected. In the
following example, HELP is not a valid command:
*HELP
?
?Illegal command
HELP
^
*
The complete list of error diagnostics and meanings is
given under "error diagnostics" (see section 13).
A trace (debug) feature is included (see section 5).
FOCAL-10 Page 8
=================================================================
1.0 Simple arithmetic using the commands "TYPE" and "SET"
--- ------ ---------- ----- --- -------- ------ --- -----
"TYPE" to FOCAL means "type out the result of the following
expression." When you type (following the asterisk which
FOCAL printed),
*TYPE 36.4318+48.1346
And then press the carriage-return key, FOCAL prints
= 84.5664*
The next command may be entered immediately, or carriage
return may be typed to improve readability. If the "TYPE"
command is terminated by an exclamation mark (!), output
advances to the next line after the answer has been
printed.
"SET" tells FOCAL "store this symbol and its numerical
value. When this symbol appears in an expression, insert
the numerical value." Thus, you may type,
*SET A=3.14159;SET B=428.77; SET C=2.71828
*
You may now use these symbols to manipulate the values
defined in the SET command.
1.1 Symbols
--- -------
Symbols consist of one, two or three alphanumeric
characters. The first character must be a letter.
Note:"alphanumeric" means one of the characters:
ABCDEFGHIJKLMNOPQRSTUVWXYZ (UPPER CASE)
abcdefghijklmnopqrstuvwxyz (lower case)
0987654321
1.2 Arrays
--- ------
Arrays may be stored in FOCAL. However, the arrays may be
sparse, and do not require a DIMENSION statement, since
they are stored without intervening unused elements. Each
subscript may consist of a number, symbol or expression and
the subscripts are all enclosed in parentheses, so that
elements of an array are written in one of the forms:
A(5), B(X), Q(3,3,X), or VEC(Q+2*J/43.)
Further details are given in section 12.9.
FOCAL-10 Page 9
=================================================================
1.3 Arithmetic Operators
--- ---------- ---------
Numeric expressions may be formed by combining numeric
variables and constants with the arithmetic operators. In
order of precedence the arithmetic operators are:
parentheses
exponentiation ^ or **
division /
multiplication *
addition + and subtraction -
Evaluation is done from left to right, so that, for
example, 15/3/2 has the value 2.5 (not 10).
1.4 Example of "TYPE" and "SET"
--- ------- -- ------ --- -----
The following dialogue illustrates the use of the "TYPE"
and "SET" commands and the arithmetic operators. (See also
section 2.7 on formats)
*SET A=2,B=3;TYPE A*B;SET X=A^B;TYPE X;SET Y=X/A+5;TYPE Y
= 6.0000= 8.0000= 9.0000*
*SET ASQ=FSQT(A);TYPE ASQ,A,A*A,A*(A+1)
= 1.4142= 2.0000= 4.0000= 6.0000*
1.5 The symbol table
--- --- ------ -----
The command "TYPE $" causes both the currently defined
symbols and their current values to be typed out. (See
section 2.6.3)
FOCAL-10 Page 10
=================================================================
2.0 FOCAL program commands
--- ----- ------- --------
A command preceded by a line number is not executed
immediately but stored in the FOCAL text buffer area in
memory.
2.1 The program text: WRITE, ERASE, COMMENT, MODIFY
--- --- ------- ----- ------ ------ -------- ------
2.1.1 WRITE
----- -----
The WRITE command lists all or part of the program
contained in the FOCAL text buffer area in memory.
Arguments, if any, may be "ALL", group number or line
number, or a string of these separated by commas. If the
first argument is not a line or group number, FOCAL will
write a header showing time and date. To list the entire
program with a header, type "WRITE ALL", and to list the
entire program without a header, type "WRITE 0".
2.1.2 ERASE
----- -----
"ERASE" deletes the currently defined symbols and their
values.
"ERASE mm", "ERASE mm.nn", "ERASE mm.n1,mm.n3,mm.n4" erases
from the program text the group, line, or lines specified.
"ERASE ALL" removes the whole program text.
An ERASE command contained within a program will be
executed. This is useful in programming "once-only"
applications, or where you wish to erase a line after
executing it. If the command erases itself, the rest of
the line won't be executed. Similarly, if a "DO", "FOR" or
"LIBRA CALL" (see sections 2.2.4, 2.3.1 and 3.1) was in
progress when the line containing it was erased, the rest
of the line would be ignored.
2.1.3 COMMENT
----- -------
Beginning a command with the letter C will cause the
remainder of that line to be ignored.
FOCAL-10 Page 11
=================================================================
2.1.4 MODIFY
----- ------
The "MODIFY" command enables alteration of part of a line.
To alter line mm.nn, type "MODIFY mm.nn" followed by
carriage return. FOCAL types a bell and awaits a character
(the search character). Choose a suitable character in
line mm.nn for FOCAL to use as a search character, and key
it in. FOCAL will type out the line up to and including
the first occurrence of the search character. At this
position in the line you may perform any of the following
functions:
* Insert characters by typing them in.
* Delete characters to the left one at a time with the
RUBOUT or BACKSPACE keys, or all to the left with
control-U (^U).
* Delete all the line to the right by pressing
carriage-return.
* Proceed to the next occurrence of the search character
by typing control-L (form-feed).
* Change to a different search character by typing
control-G (bell) followed by the new character.
* Preserve the line as modified by typing a line feed.
* Abort the modification by typing control-P.
* Display the line to the left (cleaned up) by typing
control-R.
Technical notes:
a. A "MODIFY" command may be included in a program, but if the
object line contains an active "DO", "FOR" or "LIBRA CALL"
(sections 2.2.4, 2.3.1, 3.1) then the rest of the line
won't be executed. For example:
32.22 TYPE X; DO 34.44; TYPE Y
34.44 MODIFY 32.22
The execution of line 32.22 can never proceed beyond the
second semicolon, no matter what the MODIFY command does.
b. The "MODIFY" command will not work exactly the same on a
half-duplex terminal. The printing of the search character
is by hardware and so cannot be suppressed by software.
Also, rubbed-out characters are printed with a back-slash
before each one, rather than as a group inside back-slashes
as on full-duplex terminals.
c. Input-end-of-file has the same effect as line-feed.
d. The line number itself cannot be altered in any way by the
"MODIFY" command. If this is required, the line must be
inserted again by re-typing. An empty line will be
deleted.
FOCAL-10 Page 12
=================================================================
2.2 Program directives: QUIT, GO, GOTO, DO, RETURN
--- ------- ----------- ----- --- ----- --- ------
2.2.1 QUIT
----- ----
The "QUIT" command terminates execution, FOCAL then awaits
further commands from the current input device. If the
keyboard is the current input device, a * cue will be
given. (Emergency stops - section 7).
2.2.2 GO
----- --
The "GO" command (or "GOTO") without an argument is
interpreted exactly as "DO ALL". (See 2.2.4 below). It
will therefore start executing at the beginning of the
FOCAL program, and if the "GO" is part of the program or a
LIBRA-CALL file, that program or file will be continued
when the "DO ALL" finishes.
2.2.3 GOTO mm.nn, GO TO mm.nn
----- ---- ------ -- -- -----
The "GOTO" command may be followed by a line number
(mm.nn).
In this usage "GOTO" may be written as two separate words.
The "GOTO" command effectively causes the line to which it
points (object line) to be interpreted as a continuation of
the line containing the "GOTO" command.
Action at the end of this "object line" depends on which of
the following occurred most recently and is still not
completely executed (see sections 2.2.4, 2.3.1, 3.1 for
details):
DO-line The DO is concluded.
DO-group, GOTO outside group The DO is concluded.
DO-group, GOTO within group Execution continues to the end
of the group.
DO ALL Execution continues to end of
program.
FOR The next iteration is begun.
LIBRA CALL Execution continues to end of
program, then LIBRA CALL file
is continued.
None of these Execution continues to end of
program.
FOCAL-10 Page 13
=================================================================
2.2.4 DO
----- --
"DO" or "DO ALL" means execute all lines of the program
text.
"DO mm.nn" means execute the line mm.nn
"DO mm.0" or "DO mm" means execute the lines of group mm.
Control returns to the command after the DO when execution
has been completed as specified or when a "RETURN" command
is encountered.
Lines of the form
DO mm.nn;DO m2;DO mm.n2
may be written as
DO mm.nn, m2, mm.n2
2.2.5 RETURN
----- ------
The "RETURN" command has the following effects:
During a "FOR" command (section 2.3.1), iteration continues
as though end-of-line was reached.
During a "DO" command, control returns as though the limit
of the DO (end of line, end of group, end of text) had been
reached.
During a "LIBRARY CALL" command (section 3.1), the
remainder of that file is ignored.
If none of the above commands is in progress, execution
terminates as for a QUIT command.
If any of the above commands are nested, RETURN only
affects the most recent of the nested commands.
FOCAL-10 Page 14
=================================================================
2.3 Program loops and branches: FOR, IF
--- ------- ----- --- --------- ---- --
2.3.1 FOR
----- ---
"FOR X=A,B,C;commands"
The commands are executed with X=A. X is then incremented
by B and the following test is made:
If B is positive or zero, is X greater than C?
If B is negative, is X less than C?
If the answer is no, the loop is continued (commands
executed, X incremented again, test X again). If the
answer is yes, control passes to the next statement.
If there are only two arguments, B is assumed to be 1. If
B is zero, and C is greater than A, the loop will repeat
indefinitely. If there are more commands than will fit on
one line, continue the line with a GOTO or DO-line, or use
a DO-group command.
Note that the parameters A, B and C are computed only once,
before the beginning of the first loop.
2.3.2 IF
----- --
2.3.2.1 Arithmetic IF
------- ---------- --
"IF(x)m1.n1,m2.n2,m3.n3"
"IF(x)m1.n1,m2.n2;commands"
"IF(x)m1.n1;commands"
where x is a defined numeric symbol, value, or expression.
If x < 0 control passes to line m1.n1
If x = 0 control passes to line m2.n2
If x > 0 control passes to line m3.n3
Where m2.n2 or m3.n3 is not specified, the commands on the
IF line are executed.
2.3.2.2 Logical IF
------- ------- --
"IF(x);commands"
where x is a logical expression. The commands are executed
if the logical expression is true. A logical expression
consists of a pair of numeric expressions or a pair of
FOCAL-10 Page 15
=================================================================
string expressions separated by a logical operator. The
logical operator may be one of the following:
= (test for equality)
# (test for inequality)
.EQ. )
.NE. )
.LT. )
.LE. ) comparative operators (must be upper case)
.GT. )
.GE. )
The programmer must ensure that ambiguous cases such as
1.NE.2 are eliminated by using spaces or extra periods.
Ambiguities will arise if command scanning would allow a
character to be interpreted from the left as part of a
number whereas the programmer intended a logical operator.
For example in the case 1.NE.2, the N is regarded as 14 in
the first decimal place, E is regarded as the exponent
indicator, and .2 is the power of ten used, so it can make
a legal number. Remove the ambiguity by using 1..NE.2 or
1 .NE.2 instead.
FOCAL-10 Page 16
=================================================================
2.4 SET
--- ---
See section 1.0 for an introduction to the SET statement.
The SET command may be used to assign values to any symbol.
If the symbol contains a terminating $ sign,
(e.g. ABC$(5,4) or X$) then the symbol refers to a string
variable, but otherwise the symbol refers to a numeric
variable. The SET command takes the form:
sym = expr
where sym is a variable name and expr is an expression of
the same type. A string variable can only be assigned the
value of a string expression, and a numeric variable can
only be assigned the value of a numeric expression.
String expressions may be formed by combining string
variables with string constants, using the
string-concatenation operator "+".
For example:
SET SV$(4) = SV$(4)+"TODAY"
Technical notes:
a. The setting of a symbol to zero is insufficient to place a
new entry in the symbol table. To ensure that a symbol is
placed in the symbol table it must be assigned a non-zero
value.
2.5 XECUTE
--- ------
"XECUTE EXPR"
will evaluate the expression EXPR and discard the result.
It has the same effect as
SET DUMMY=EXPR
and is used in cases where a function is to be called
without requiring any value to be returned.
FOCAL-10 Page 17
=================================================================
2.6 TYPE
--- ----
See section 1.0 for introduction to "TYPE".
The "TYPE" command may be used to output numbers, values,
expressions, text, or the contents of the symbol table. To
cause carriage-return and linefeed after typing, terminate
the command with the exclamation mark(!). To cause
carriage-return only, terminate with hatch (#). When
outputting text, enclose the text in double quotes.
2.6.1 TYPE "text"
----- ---- ------
All material within the quote marks is typed out. The
quote marks themselves are not typed out. The text may
include single quotes and must be all on one line. If
there are no closing quote marks, the command will type out
everything up to the end of the line.
2.6.2 TYPE 'text"
----- ---- ------
A double quote is typed out followed by the text, which may
be null. If you want to type out some text enclosed in
double quotes, you should use the form:
TYPE 'text"'"
Note: This feature may be removed at a later date to
provide compatibility with PDP-11 FOCAL.
2.6.3 TYPE $
----- ---- -
The symbol table is typed in alphabetical order. For
example:
S I = 6.0000
S J = 6.0000
S PI = 3.1415
S X = 3.0999
S Y = 22.4000
S Z(43) = 126.0000
S FOO$ = "Hi there!"
2.6.4 TYPE $$
----- ---- --
The symbol table is typed in the same way as for TYPE $,
but the octal value of the symbol is commented on to the
table thus:
FOCAL-10 Page 18
=================================================================
S I = 6.0000 ;C 203600000000 000000000000
S J = 6.0000 ;C 203600000000 000000000000
S PI = 3.1415 ;C 202622077325 021026430215
S X = 3.0999 ;C 202614623027 301573224215
S Y = 22.4000 ;C 205546314631 231463146315
S Z(43) = 126.0000 ;C 207770000000 000000000000
S FOO$ = "Hi there!"
2.6.5 TYPE /nn
----- ---- ---
To select another output channel, give the command TYPE
/nn, where nn is a decimal number less than 16,
representing a channel which has previously been
initialized for output (see section 4). If zero is
selected, the controlling terminal will be used for output.
Once a channel has been selected for output, all output
generated by TYPE and WRITE commands will be directed to
that channel.
2.7 Typeout of numeric results
--- ------- -- ------- -------
When FOCAL types out numeric results, the format may be
either of the following:
F-format 3672.4906 or
E-format 0.3672E+4
FOCAL is initially set to type out results in F-format with
up to eight digits, four to the left of the decimal point
(the integer part) and four to the right of the decimal
point (the fractional part). This format is %8.04.
Leading zeroes are suppressed and spaces are shown instead.
Trailing zeroes are always printed. FOCAL-10 will use
F-format if it is legal and the value does not exceed the
maximum allowable by the current F-format specification.
E-format will be used otherwise. To force the use of
E-format the command TYPE % may be given (equivalent to
%00.00).
FOCAL-10 Page 19
=================================================================
2.7.1 TYPE %mm.nn
----- ---- ------
To change the F-format specification, use the command
TYPE %mm.nn
where mm is the total number of digits including any
leading spaces, and nn is the number of digits to the right
of the decimal point including trailing zeroes. (nn may be
either blank or two digits but not one digit.)
If nn is zero or blank, the data will be printed as
integers without a decimal point. If mm.nn is zero or
blank, the data will be printed in E-format.
If the F-format specification is changed, the changed
format will remain operative until reset by the user.
For example:
*SET A=-12.34;TYPE A;TYPE %2,A;TYPE %,A;TYPE A;TYPE %8.04,A
= -12.3400=-12=-1.2340E+1=-1.2340E+1= -12.3400*
*
Rule: mm must be greater than or equal to nn.
F-format is initially set at %8.04.
2.7.2 TYPE %Emm.nn
----- ---- -------
To change the E-format: nn is the number of decimal
places (and must be specified as two digits).
Rule: mm must be greater than nn by at least 1.
E-format is initially set at %E5.04.
FOCAL-10 Page 20
=================================================================
2.8 ASK
--- ---
ASK X,Y,Z
When this command is encountered during execution, FOCAL
types a colon (:).
(The : may be suppressed - See section 8.4)
The user then types a value for the first symbol (X),
followed by a comma, carriage-return, line-feed, alt-mode,
escape or space. Leading spaces are ignored before numeric
values. FOCAL then types another colon and so on until all
symbols in the ASK statement have been given values. If
the ASK statement had been written as
ASK "x,y,z?" X,Y,Z
the text x,y,z? would have been typed out before the first
colon. If a string is being asked for, it must be
terminated by carriage-return or line-feed.
If the user types a value followed by an escape, or just an
escape by itself, then the symbol retains its original
value. (Escape and alt-mode have the same effect.)
Characters may be rubbed out individually with the RUBOUT
or BACKSPACE keys. If a space is rubbed out, then leading
spaces are once again acceptable (i.e. ignored). If all
the characters were rubbed out before RUBOUT or BACKSPACE
was struck, FOCAL would echo ^U, CR, LF and the colon cue
again. You may display the cue and cleaned-up line-so-far
by typing control-R.
If a control-P is typed, the program will be aborted, since
control-P has the effect of an instantaneous "QUIT". Thus
a program loop containing an "ASK" can be broken by typing
control-P, and the program will be terminated as though the
"ASK" command had been a "QUIT" command. It should be
noted, however, that if the ASK arguments were enclosed in
question marks, then the debug switch will remain on.
Technical Notes:
"Leading space" includes any "non-wake-up" character with
ASCII value less than space.
Input-end-of-file has the same effect as line-feed.
During an ASK command, output data will never go anywhere
but to TTY. However, output is generated only if the
currently-selected input channel (see section 4) is TTY.
FOCAL-10 Page 21
=================================================================
2.8.1 ASK /nn
----- --- ---
To select another input channel, give the command ASK /nn,
where nn is a decimal number less than 16, representing a
channel which has previously been initialized for input
(see section 4). If zero is selected, the controlling
terminal will be used. Once a channel has been selected
for input, FOCAL will expect all input to come from that
channel, including commands and data.
FOCAL-10 Page 22
=================================================================
3.0 LIBRA Commands
--- ----- --------
3.1 LIBRA CALL
--- ----- ----
A previously written program is recalled from a file -
either program or immediate-mode commands or both. The
whole file is read into memory before its data is used in
any way. If you are using the LIBRA CALL command to
replace a program already in the text buffer, you should
first give the "ERASE ALL" command, so that the old text
buffer is removed; otherwise the new program is
superimposed on the old. The FOCAL-10 LIBRA CALL is akin
to BASIC-10's "WEAVE" command.
3.2 LIBRA DELETE
--- ----- ------
The file specified is deleted from the device.
3.3 LIBRA SAVE
--- ----- ----
All or part of the program text may be saved as a file. If
no list is specified on the LIBRA SAVE command, the symbol
table is written out as part of the file, so that a
subsequent LIBRA CALL will restore the symbols as well as
the program. FOCAL will perform a backup function if LIBRA
SAVE is given for an already-existing file name. The
existing file will be renamed to *.BAK, and the name will
be given to the newly created save. [The backup feature is
not available for KA-10 double-precision FOCAL.]
3.4 Format of LIBRA commands
--- ------ -- ----- --------
LIBRA func dev:file.ext [proj,prog] <prt> list
LIBRA is the FOCAL command (may be abbreviated).
func is the library function "SAVE" or "CALL" (may be
abbreviated.)
dev: (optional) is the device name. Only the first six
characters are significant. Spaces may not be
included. The delimiter ":" must immediately follow
the name. If omitted, "DSK" is assumed.
file is the filename. Only the first six characters are
significant. Spaces may not be included. If omitted,
"FOCAL" is assumed. The delimiter ".", if given, must
immediately follow the file name.
ext (optional) is the file extension. If the delimiter
"." is encountered, the program expects a file
extension to follow it. However a null extension is
allowed, which is indicated by a space following the
".". Only the first three characters are significant.
FOCAL-10 Page 23
=================================================================
Spaces may not be included. If no file extension is
given, the defaults are:
CALL: First look for "FCL". If not found, look
for a null extension.
SAVE: "FCL" is the default extension.
[proj,prog](optional) indicates the disk area to be used for the
command.
<prt> (optional)(SAVE function only) is an octal number
indicating the protection to be given to the file.
Warning: If an error occurs during LIBRA SAVE
command, and a pre-5-series monitor is being used, the
device is released without renaming to the requested
protection.
list (optional)(SAVE function only) indicates which lines
or groups are to be saved. If omitted, or "all" is
specified, the whole program is saved.
LIBRA commands may be included in programs, with some
restrictions on the LIBRA CALL. LIBRA CALL may not
attempt to overwrite the program line which issued the
call. On a LIBRA CALL, there must generally be
sufficient memory space to hold the whole file because
it is read in in its entirety before execution/loading
is commenced. (This enables I/O functions to be
nested to any depth.)
FOCAL-10 Page 24
=================================================================
4.0 Input and output on other devices
--- ----- --- ------ -- ----- -------
Although the controlling terminal is usually selected as
the input and output device, this is not essential; in
fact it is possible to use almost any DECsystem-10 device
for this purpose. To select another input or output
device, it must first be initialized, and the following set
of commands performs both the initialization and selection
functions.
4.1 Input and output channels
--- ----- --- ------ --------
DECsystem-10 software allows programs like FOCAL to
associate up to 16 (decimal) devices or files with the
program, and each such association is called a "channel".
In FOCAL, the controlling terminal uses channel zero, the
LIBRA commands use channel one, and the other channels are
available for file input and output. The channels are
numbered in decimal from 0 to 15. In FOCAL it is not
possible to use a single channel for both input and output
simultaneously, and attempts to do so will result in the
first selection being cleared. (The controlling terminal,
however, can have both input and output on the same
channel).
In FOCAL, when a certain channel has been selected for
input, then all input, (commands and data) will be taken
from that channel. This applies to such commands as ASK,
MODIFY, and input subsequent to the QUIT command.
In FOCAL, when a certain channel has been selected for
output, then all subsequent output from WRITE and TYPE will
be directed to that channel.
4.2 Input device initialization
--- ----- ------ --------------
The command:
OPERATE INPUT dev:file.ext[prj,prg]/m
initializes the specified file on channel n, and selects
channel n for input. Defaults are used if necessary as
specified below. Channel 1 is used for the LIBRA command,
and is therefore unavailable for input in other ways.
FOCAL-10 Page 25
=================================================================
4.3 Output device initialization
--- ------ ------ --------------
The command:
OPERATE OUTPUT dev:file.ext[prj,prg]<prt>/m
is used to initialize a file for output on channel m and
select channel m for output. Defaults are used if
necessary as specified below. Channel 1 is used for the
LIBRA command, and is, therefore, unavailable for output in
other ways.
4.4 Releasing a device
--- --------- - ------
The most convenient method for releasing a device/file from
a channel is to attempt to initialize device "TTY" on that
channel. This will automatically release the channel
because the device "TTY", being the user's console is
always assigned to channel zero.
4.5 Defaults
--- --------
dev: DSK
file FOCAL
.ext .LST for output.
.FCL for input, but if the file is not found, look
for a null extension.
/m 2 for output.
3 for input.
4.6 Differences between OPERATE INPUT and LIBRA-CALL
--- ----------- ------- ------- ----- --- ----------
At the end-of-file, the LIBRA-CALL will continue the
program which called it; when the OPERATE INPUT file
reaches the end, FOCAL will exit.
The QUIT command will terminate the LIBRA-CALL but not the
OPERATE INPUT file.
The entire LIBRA-CALL file is read into memory first; the
OPERATE INPUT file is read in one buffer at a time.
FOCAL-10 Page 26
=================================================================
4.7 Notes on file I/O
--- ----- -- ---- ---
Errors are typed out and cause reversion to keyboard mode,
and the output device is released (without <prt> on
4-series monitors).
At end-of-file, the following action takes place:
FCHR(-1) takes the value -1. Input to MODIFY and ASK is as
though terminated by a line-feed. Input to the command
scanner causes FOCAL-10 to exit after the last command has
been executed.
While non-keyboard input is in progress, FOCAL suppresses
the asterisk cue used to indicate readiness to accept
another command. This asterisk is neither typed out nor
sent to the output file.
FOCAL-10 Page 27
=================================================================
5.0 The trace feature
--- --- ----- -------
The "?" character has special significance when it appears
in a string being interpreted by FOCAL. It is ignored
except for its action in turning the "debug" feature on and
off. When FOCAL is started or re-started, the "debug"
feature is inactive. This means that any "?" appearing in
the interpreter's input string is able to activate the
"debug" feature. When "debug" is active, every character
passing through the interpreter is typed out. A second "?"
will de-activate the "debug". Any errors will de-activate
the "debug".
"Appearing in the interpreter's input string" means
appearing anywhere within a line number, command,
command-modifier or argument but not inside a pair of
double quotes as a string constant. The question mark
itself is never typed. Lines typed in by the user with
line numbers at the beginning ("indirect" commands) are not
considered as being interpreted while they are merely being
placed in the program. This applies to the LIBRA CALL
command too.
It is illegal to put a question mark in a line number
preceding a line to be placed in a program. In other words
you must not type
1.0?1 SET X=5
Warning: If ?? are put around the arguments of an ASK
command, then any abnormal action (control-C or control-P)
leaves the trace feature activated.
FOCAL-10 Page 28
=================================================================
6.0 Examples of FOCAL programs
--- -------- -- ----- --------
.R FOCAL
*C THE FOLLOWING IS A SAMPLE SHOWING USE OF FOCAL
*C TO WRITE AND RUN A PROGRAM, DEBUG IT AND SAVE IT.
*C THE PROGRAM WILL CONVERT DEGREES F TO DEGREES C.
*
*1.02 ASK "ENTER F",F; DO 2
*1.04 GO TO 1.02
*2.02 SET C =(F-32)*5/9; T "F",F," C",C!
*C NOW WRITE OUT ALL
*W
C-FOCAL v3C(245)-1 1227 15-Jan-74
1.02 ASK "ENTER F",F; DO 2
1.04 GO TO 1.02
2.02 SET C =(F-32)*5/9; T "F",F," C",C!
*
*C THE PROGRAM AS WRITTEN WILL CONTINUE FOREVER UNLESS
*C STOPPED WITH ^C (SEE SECTION 7).
*C OTHERWISE WE COULD,
*C BY DIRECT COMMAND, RUN A SERIES OF CHOSEN VALUES:
*FOR F=34,2,38;DO 2
F= 34.0000 C= 1.1111
F= 36.0000 C= 2.2222
F= 38.0000 C= 3.3333
*
*C THE TEXT MAY BE STORED AS A FILE WITH A LIBRA SAVE
*L S TEXTF
*
*C WHICH STORES IT AS TEXTF.FCL ON DISK.
*
*C SUPPOSE, IN TYPING 2.02, WE HAD WRITTEN 3" INSTEAD OF
*C 32, LEADING TO AN ILLEGAL CHARACTER MESSAGE
*C
*C IF THE CAUSE IS NOT OBVIOUS, USE DEBUG - SECTION 5.
*C THE CHARACTER CAUSING THE TROUBLE CAN BE LOCATED.
*?DO 2.02
DO 2SET C =(F-3?
?Mismatched parentheses
02.02 SET C =(F-3")*5/9; T "F",F," C",C!
^
*
*C THE ERROR MESSAGE TURNS OFF THE DEBUG.
*
*
*
*C NOW GET A PROGRAM PREVIOUSLY SAVED AS FILE G1.FCL ON DSK
*ERASE ALL;C- USUALLY A GOOD IDEA.
*L C G1
*C TO GET A LISTING GIVE COMMAND WRITE, OR WRITE ALL
*W
FOCAL-10 Page 29
=================================================================
C-FOCAL v3C(245)-1 2123 15-Jan-74
1.01 C-PROGRAM TO TYPE THE VALUE OF PI.
1.02 TYPE %20.17,"PI",4*FATN(1)!
1.03 QUIT
*
*GO
PI= 3.14159265358980672
*
*C NOW IF WE HAVE FINISHED, WE CAN TYPE CONTROL-Z
*^Z
EXIT
.
FOCAL-10 Page 30
=================================================================
7.0 Stopping FOCAL
--- -------- -----
If FOCAL is waiting for you to type something, you may
return to the DECsystem-10 monitor by typing control-C. If
FOCAL has tied itself into a loop or if for some other
reason you wish to quit during execution, you may return to
the DECsystem-10 monitor by typing control-C twice. In
either case, you may continue by giving the monitor command
"CONTINUE" or re-start FOCAL with the "START" or "REENTER"
commands or log off the system with the "KJOB" command (see
monitor manual). "START" will give an error message, but
"REE" will cause the action of a "QUIT" command to be
executed.
If you have been doing output ("OPERATE" command), and want
to close the output files before finishing, you should type
control-Z, which causes FOCAL to exit to the monitor. This
is a clean method of closing all files.
FOCAL may be saved with the monitor "SAVE" command after
typing control-C, but thereafter it cannot be re-started or
continued except by the "START" command. All text, symbols
and values are retained, but I/O in progress will be
aborted. (To save program only see section 3)
A re-start will always reset the "FOCAL" function switches.
If FOCAL is waiting for you to type a command or to type
something during an ASK command, you may abort by typing
control-P. This will have the effect of executing an
instantaneous "QUIT".
7.1 How to force a FOCAL program to exit
--- --- -- ----- - ----- ------- -- ----
You can take advantage of FOCAL's behaviour when it reaches
the end of its input file. For example, the following
program will exit cleanly:
OPERATE INPUT NUL: ;QUIT
Alternatively, if input is from the keyboard, control-Z
will cause FOCAL to exit.
FOCAL-10 Page 31
=================================================================
7.2 The "REENTER" monitor command
--- --- --------- ------- -------
While FOCAL is executing a program, you may wish to abort
the current task. To do this, type two control-C's and
"REENTER". REENTER has the effect of executing a QUIT
command without releasing any I/O devices. FOCAL will
continue using the same input device as before; it will
take its next command from there and continue execution.
FOCAL-10 Page 32
=================================================================
8.0 Functions
--- ---------
8.1 What is a function?
--- ---- -- - ---------
Certain specific names relate to mathematical functions
that take an argument (in parentheses following the
function name) and use it to produce a numerical result.
For example:
*SET X=FSIN(37.5*180/PI)
This statement will give X the value represented by the
sine of the expression inside the parentheses. If there is
no expression in parentheses immediately following the
function name (or no parentheses at all), zero will be used
as the argument. For example:
*SET X=5+FCOS+3
This will use the cosine of zero in evaluating the
expression to the right of "=".
8.2 Standard functions
--- -------- ---------
The standard FOCAL functions, FSIN, FCOS, FATN, FSQT, FEXP,
and FLOG are tabulated in section 9.0.
Additional functions included are:
FLOG10 log to base 10
FSIND sine in degrees
FCOSD cosine in degrees
8.3 External functions: FNEW
--- -------- ---------- ----
External function - see section 14.
FOCAL-10 Page 33
=================================================================
8.4 Parameters and values internal to FOCAL: FOCAL
--- ---------- --- ------ -------- -- ------ -----
If the first argument is in the range 1-18 inclusive,
"FOCAL" is a two-argument function capable of modifying the
operation of FOCAL itself. The first argument specifies
the switch to be modified by its serial number. The second
argument provides the value to be inserted. For logical
switches, +1.0 means set, -1.0 means clear, and zero means
restore to initial setting. The previous setting is
returned as the function value.
Switch initially if set, switch will
------ --------- -- ---- ------ ----
1 cleared suppress ":" cue for ASK data
2 cleared suppress "=" prefix to numeric O/P
3 cleared suppress non-fatal error messages.
If the first argument is greater than or equal to 23,
"FOCAL" is a one-argument function performing a "PEEK" on
FOCAL's low segment. The argument is the address in the
low segment, and the value returned by the function is a
signed 36-bit number which is the contents of that
location. Some useful locations are:
Address Contents
------- --------
23-95 Job data area
34 Accumulated error count
36 Highest address in low segment
95 FOCAL's version number
97 Right half holds address of index data block
98 Right half points just below FOCAL's text area
101 Pointer to last character in FOCAL text area
102 Current output channel number
103 Current input channel number
104-151 Sixteen sets of 3-word buffer-headers
152-167 Buffer space pointers - one per channel
168 FORFLG: Current "FOR" line number (right half)
170 Most recent argument of repetitive loop (line
number)
172 Current line number
173 LINNUM: Current line number in right half
176 Highest address in the symbol table
177 F-format control
178 E-format control
179 Last random number (floating point)
Further details must be obtained from Appendix A.
FOCAL-10 Page 34
=================================================================
8.5 Monitor information: GETTAB(TABNUM,TABINX)
--- ------- ------------ ---------------------
FOCAL programs may obtain certain information from the
DECsystem-10 monitor by the use of the GETTAB function.
The FOCAL "GETTAB" function uses the monitor GETTAB UUO
which must therefore be available as a monitor service.
GETTAB requires two arguments - a table number and a table
index. The table numbers and table indices are listed in
the monitor manual, but it should be noted that numbers in
FOCAL are decimal while the numbers in the monitor manual
are probably octal! The answer returned by the monitor is
interpreted as a signed 36-bit integer. Single-precision
versions of FOCAL are not capable of holding all 36 bits at
once. There are no plans to remove this restriction.
Examples of GETTAB calls.
GETTAB(4,-1) total time used by this job (in jiffies)
GETTAB(5,-1) kilo-core-ticks of this job
GETTAB(9,8) time of day in jiffies since midnight
GETTAB(9,9) today's date (12-bit format)
If the GETTAB UUO gives the error return, location .JBERR
in the job data area will be incremented, and the GETTAB
function will return TABNUM+(TABINX*2**18).
8.6 Random number generator: FRAN
--- ------ ------ ---------- ----
Function FRAN will generate a random or pseudo-random
number greater than or equal to 0.5 and less than 1.0. The
argument determines what kind of random number is given:
ARGUMENT RESULT
-------- ------
0 Next in pseudo-random sequence.
Positive Restart pseudo-random sequence as for
virgin program.
Negative True random number
FOCAL-10 Page 35
=================================================================
8.7 Single character I/O: FCHR
--- ------ --------- ---- ----
To output a single character with ASCII value q, execute
the function FCHR(q), where q is zero or positive.
To input a single character, waiting for it if necessary,
but not affecting terminal echoing status, use the function
FCHR(-1), which will return the ASCII value of the
character. If end of file has been passed, FCHR will
return the value -1. All negative arguments are treated as
-1, but are reserved for future definition, to control
echoing, waiting etc. You may use FHIBER(1+2^21) to test
whether FCHR(-1) would wait for input or not. FOCAL
programs using FCHR for input should include a check for ^P
so that users can escape from program loops easily.
8.8 Single character string: FCHR$
--- ------ --------- ------- -----
FCHR$(x) returns a string containing a single character
created by taking the value of x modulo 128 as an ASCII
value.
8.9 Sleeping and hibernating: FHIBER
--- -------- --- ------------ ------
At times it is useful for a FOCAL program to pause for a
while during execution. The FHIBER function may be used to
do this by specifying the length of pause as the argument
(in milliseconds). For example a five-second pause may be
introduced by the FOCAL command X FHIBER(5000). There are
other ways of hibernating too, such as waiting for certain
events to occur, and details may be obtained from the
documentation of the HIBER monitor UUO. FHIBER accepts an
argument which is treated as a signed 36-bit integer. The
36-bit number so formed is used in an accumulator for the
HIBER UUO. For example X FHIBER(5000+2^21) will sleep for
5 seconds or until a character is typed on the controlling
terminal - whichever occurs first. As another example,
X FHIBER(10000-2^(35)) will cause an immediate swap-out and
a pause for 10 seconds. If FOCAL is running under a
monitor lacking the HIBER UUO, FOCAL uses the SLEEP UUO,
and the FHIBER argument is the number of seconds to sleep,
modulo 4096.
The value returned by the FHIBER function gives the status
of the terminal controlling FOCAL. If the terminal's input
buffer is empty, FHIBER returns zero, but otherwise it
returns 1.0. This feature is useful when you don't want
your program to hang up in "input-wait" state, and can also
be used to determine whether the FHIBER sleep was woken by
the teletype or not, if you used those particular wake bits
in the FHIBER argument. It should be noted that due to
FOCAL-10 Page 36
=================================================================
certain idiosyncrasies of the HIBER UUO it may be necessary
to include X FHIBER(1) at the beginning of your program to
remove a spurious wake-up later on.
Execution of the FHIBER function will cause .JBERR to be
incremented if the job is detached or TRMNO. UUO is
illegal.
8.10 Notes on implementing new functions
---- ----- -- ------------ --- ---------
By re-assembling FOCAL, more functions may be included.
Function names may be any number of characters of which the
first six are significant.
Function names need not commence with the letter "F" in
FOCAL-10. However, it is suggested that they should, to
comply with the rule that reserved words begin with "F".
Note: In evaluating an expression, if the interpreter
finds a name in the list of functions, then the interpreter
takes it as a function name.
FOCAL-10 Page 37
=================================================================
9.0 Function summary
--- -------- -------
NAME DESCRIPTION
---- -----------
FSQT Square root
FABS Magnitude part
FSGN Sign part (i.e. +1.0 or -1.0)
FITR Integer part (rounded towards zero)
FRAN Random number between 0.5 and 1.0
FEXP Exponential
FSIN Sine with argument in radians
FCOS Cosine with argument in radians
FSIND Sine with argument in degrees
FCOSD Cosine with argument in degrees
FATN Arctangent (range -PI/2 to +PI/2)
FLOG Logarithm
FLOG10 Logarithm to base 10
FOCAL Change internal parameters of FOCAL
GETTAB Obtain monitor information
FNEW External function call
FCHR Single character I/O
FCHR$ Single character string
FHIBER Hibernate or sleep
FOCAL-10 Page 38
=================================================================
10.0 FOCAL command summary
---- ----- ------- -------
ASK X Accepts a value from the keyboard.
COMMENT Allows dummy lines in a program.
DO mm.nn Executes a line or group as a
subroutine.
ERASE Wipes the symbol table.
ERASE mm.nn Wipes a line (or group) from the
program.
FOR X=1,.5,20 Loops while incrementing a variable.
GO, GOTO Reroutes execution.
IF (X) m1.n1,m2.n2,m3.n3 Allows conditional branching.
IF NAME$ = "Harry" ;TYPE "Fred." Allows conditional commands.
LIBRA CALL Executes a file or loads it if it has
line numbers.
LIBRA DELETE file Deletes the named file from the users
file directory on the disk.
LIBRA SAVE mm.nn Writes a line or group as a file.
LIBRA SAVE Writes the program as a file.
MODIFY mm.nn Allows program editting.
OPERATE INPUT file Initializes a new file for input.
OPERATE OUTPUT file Initializes a new file for output.
QUIT Stops execution.
RETURN Terminates subroutine and returns to
caller.
SET X=Y+3 Assigns a value to a variable.
TYPE "Hello",X! Prints data on the terminal.
WRITE mm.nn Lists a line or group
WRITE ALL Lists the entire program.
XECUTE exp Evaluates expression exp and discards
the result.
FOCAL-10 Page 39
=================================================================
11.0 Character interpretations by FOCAL
---- --------- --------------- -- -----
Symbol meaning or use
------ ------- -- ---
A-Z Used to construct commands, function names and variable
names.
a-z Lower case letters are treated as upper case letters
except when they appear in strings between quote marks.
E or e Used to introduce the exponent part of a constant.
0-9 Decimal digits. Used to construct numeric constants and
array indices
+ Arithmetic addition operator.
- Arithmetic subtraction operator.
* Arithmetic multiplication operator, or part of arithmetic
exponentiation operator.
/ Arithmetic division operator. Also channel-selection
indicator (see sections 2.6.4, 4.2 and 4.3).
^ Arithmetic exponentiation operator.
( ) Parentheses. Used to hold array indices, function
parameters, and arithmetic sub-expressions.
[ ] Parentheses. May be used instead of (). Also to hold
project-programmer pairs.
< > Parentheses. May be used instead of (). Also to hold
file protection code. It is suggested that the use of <>
as parentheses should be avoided where possible in
FOCAL-10. The present specification provides
compatibility of FOCAL-10 with other FOCAL
implementations, but a future extension of FOCAL to cover
logical operations may require <> for other purposes.
, Comma. Used to separate function arguments and command
arguments.
. Decimal point. Used to construct numbers and logical
operators, and also to separate file name from file
extension.
; Semicolon. Used to terminate statements.
: Colon. Used to delimit device name.
= Equals. Used in the construction of the "FOR" and "SET"
FOCAL-10 Page 40
=================================================================
statements. Also used as a logical operator.
! Exclamation mark. In the ASK or TYPE statement - cr/lf
(see sections 1.0, 2.6 and 2.8).
# Hatch. In the ASK or TYPE statement - CR only (see
section 2.6). Also used as a logical operator to mean
"not equal to".
" Double quote. Used to delimit string constants (see
section 2.6.1 and 2.4).
' Single quote. Used in the "TYPE" and "ASK" statements to
delimit string constants (see section 2.6.2).
& Ampersand. Not legal except in text.
@ At. Not legal except in text.
% Percent. Used in "TYPE" statements to change the format
(see sections 2.7.1, 2.7.2).
$ Dollar. Used in "TYPE" statements to cause output of the
symbol table (see section 2.6.3). Also as the delimiter
of a string name.
$ Escape. May be used to terminate a command in the same
way that a carriage-return does.
_ Backarrow. Not legal except in text.
? Question mark. Used to turn the "trace" feature on and
off (see section 5).
^C Control-C. This is a monitor-call request. It suspends
FOCAL and puts the terminal into monitor mode. (Two
control-C's may be required if a program is running.)
^P Control-P. If FOCAL encounters a control-P in input data,
it will execute a QUIT command.
^R Control-R. During type-in you can display the line-so-far
by typing control-R. The cue will precede it at the
beginning of the line.
^U Control-U. Never appears in FOCAL text. Used from the
keyboard to erase the whole of the current input line.
^Z Control-Z. FOCAL-10 will EXIT if you type control-Z on
the keyboard during keyboard input.
RUBOUT Never appears in FOCAL text. Used from the keyboard to
erase the most recent character from the input line.
FOCAL-10 Page 41
=================================================================
BACKSPACE Never appears in FOCAL text. Used from the keyboard to
erase the most recent character from the input line.
FOCAL-10 Page 42
=================================================================
12.0 Compatibility of FOCAL implementations.
---- ------------- -- ----- ----------------
Historically, the raison-d'etre of FOCAL was the need
for a powerful interpreter in a minimal core size. The
language was designed to allow the implementer to take
short cuts in coding by restricting the freedom of the
language to a certain extent, and many of these
restrictions remain in the small-computer FOCALs today.
Recent enhancements, particularly in the PDP-11
versions, have enabled FOCAL to be used as a software
operating system to drive special hardware, and we see
FOCAL-GT, FOCAL-11/RTX etc. with large sets of special
functions for special hardware.
The problem for the user, however, is the increased
complexity of the language introduced by such
enhancements, and the confusion which new
incompatibilities introduce. The intent of the
following section is to serve as a guide to the
differences between FOCAL implementations, to assist the
user who changes machines or who wishes to allow himself
full flexibility.
12.1 General differences.
---- ------- ------------
The following list illustrates incompatibilities which
arise because of the environment such as word size,
software operating system and interfacing.
12.1.1 Always different.
- Accuracy. Every implementation of FOCAL uses a
different internal storage method and therefore the
number of significant figures varies.
- Loading, starting and re-starting. This is always
machine-dependent.
- Error messages. Each FOCAL has its own set of error
messages.
12.1.2 OPERATE command.
Paper-tape-only systems usually have a * command. More
sophisticated systems use the OPERATE command with a
single letter as argument. Under a high-level disk
operating system, a high-level OPERATE command is used.
12.1.3 Function list.
All FOCALs have certain functions specific to
themselves. There is no standard for the range or
distribution of the FRAN function, nor for the meaning
of its argument.
12.1.4 LIBRA command.
Not all FOCALs have this command. Those which do
usually have LIBRA CALL and LIBRA SAVE; some have more
options.
12.1.5 Character set.
Most FOCALs use ASCII-1968 (ANSI X3.4-1968) with a few
FOCAL-10 Page 43
=================================================================
minor variations.
12.2 PDP-8 FOCAL.
---- ----- ------
12.2.1 Implementation characteristics.
- The fundamental interpreting process is fairly simple.
FOCAL-8 will almost always scan until a "terminator"
is found, skip over the terminator and then perform
the function. This requires that all commands be
delimited by a space or similar "noise character",
since the interpreter will not backspace over it when
it continues after performing the command. In a few
cases this may lead to problems unless liberal spacing
is allowed. The Technical Specifications (para 2.1.3)
does not actually define "terminator".
- Additional terminators for ASK data are allowed beyond
space, comma, carriage-return, line-feed and escape.
- Arithmetic expressions must be terminated by a comma.
- WRITE disables trace.
- WRITE .., MODIFY .., ERASE .., TYPE $ cannot be
followed by ;commands.
- Line numbers only extend to 31.99.
- Format descriptors are limited to 19.19.
- Symbols are held as two characters.
12.2.2 OPERATE command.
FOCAL-8 uses the * command which is incompatible with
the more usual OPERATE command because of its usage and
handling of end-of-file.
12.2.3 Function list.
FOCAL-8 has all standard functions.
12.2.4 LIBRA command.
The LIBRA version of FOCAL-8 has this command, including
LIBRA LIST, but it is not necessarily compatible with
other FOCALs.
12.2.5 Character set.
Uses ASCII-1963. Altmode is non-printing. Characters
175 176 and 33 octal are treated as altmode. Backarrow
is used instead of ^U. The rubout key is handled
differently from most FOCALs.
FOCAL-10 Page 44
=================================================================
12.3 PDP-12 FOCAL.
---- ------ ------
12.3.1 Implementation characteristics.
FOCAL-12 is an expansion of FOCAL-8. The extensions are
principally for utilizing the PDP-12 peripheral devices
including LINC tape.
12.3.2 OPERATE command.
FOCAL-12 uses a command called "OUTPUT" which is similar
to an "OPERATE" command. It is used to change the
output device (O S and O T), but it also has some
unrelated functions (O D to display or to indicate the
display refresh rate; O E and O C to clear all or part
of the display screen; O I to do timing). Some of the
functions normally associated with the OPERATE command
are performed by the LIBRA commands in FOCAL-12 (see
below).
12.3.3 Function list.
FOCAL-12 functions are very similar to FOCAL-8
functions.
12.3.4 LIBRA command.
LIBRA SAVE and LIBRA LOAD in FOCAL-12 are the
traditional commands to save and recall FOCAL programs
(LIBRA SAVE and LIBRA CALL in FOCAL-10). The command
LIBRA GO in FOCAL-12 is a convenience to facilitate
chaining of FOCAL programs. (In FOCAL-10 this would be
done by using LIBRA CALL;GO). In FOCAL-12 LIBRA LOAD
and LIBRA GO imply prior ERASE ALL and ERASE. This
means a WEAVE is not possible. In FOCAL-10 you would
use ERASE ALL,;LIBRA CALL etc. to simulate the FOCAL-12
LIBRA LOAD.
FOCAL-12's LIBRA MAKE is used to allocate a space on the
file storage device for use as random-access storage.
The space is used by opening (LIBRA OPEN), referencing
(Fn(mm)), and closing (LIBRA CLOSE) such a random-access
area. In FOCAL-10 this kind of operation would be done
by using normal FOCAL variables, since large amounts of
core storage are usually available. The array could be
saved and recalled from disk with the usual LIBRA SAVE
and LIBRA CALL commands or by explicitly writing the
array with the TYPE command.
12.3.5 Character set.
Uses ASCII-1963. Altmode is non-printing. Characters
175 176 and 33 octal are treated as altmode. Backarrow
is used instead of ^U.
FOCAL-10 Page 45
=================================================================
12.4 DECsystem-10 FOCAL
---- ------------ -----
12.4.1 Implementation characteristics.
12.4.1.1 ** may be used for exponentiation.
12.4.1.2 Variable names may be any number of characters, of which
the first three are significant, and the first must be a
letter. (It may be "F") [In evaluating an expression,
if the interpreter does not find a name in the list of
functions, then it takes it as a variable name.]
12.4.1.3 Any non-alphanumeric can be used to delimit, and
FOCAL-10 (in contrast to FOCAL-8) will interpret the
delimiter. For example, TYPE"ABC" will work in
FOCAL-10 as if it had a space after the E.
12.4.1.4 Arrays may be multiple-dimensioned.
Elements of an array are written as the array name
followed by the list of subscripts in parentheses, each
separated by commas. It is up to the user to remember
to specifically cite the exact number of subscripts each
time an element is referenced, otherwise wrong values
may be used. The subscripts are evaluated and used
modulo a certain value which depends on the total number
of subscripts. The following table describes the array
element successor function, the combined subscript
value, and the modulo applicable to each subscript.
Number of Subscripts Subscript Modulo
Subscripts Value
none none 0 -
1 (a) a 262144
2 (a,b) a+512*b 512
3 (a,b,c) a+64*b+4096*c 64
4 (a,b,c,d) a+16*b+256*c+4096*d 16
5 (a,...e) a+8*b+...+4096*e 8
6 (a,...f) a+8*b+...+32768*f 8
7 (a,...g) a+4*b+...+4096*g 4
8 (a,...h) a+4*b+...+16384*h 4
9 (a,...i) a+4*b+...+65536*i 4
10 (a,...j) a+2*b+...+512*j 2
11 (a,...k) a+2*b+...+1024*k 2
.... ..... ...... 2
18 (a,...r) a+2*b+...+131072*r 2
19 or more (a,b,...) 0 -
12.4.1.5 Replacement of an active line.
If while a line is being executed a replacement is
inserted, FOCAL-10 will behave as if the line were first
erased and then a new one inserted. For example:
FOCAL-10 Page 46
=================================================================
2.22 2.22 The quick brown fox
will effectively erase itself. Also the program:
2.22 DO 4.44; TYPE Y
4.44 2.22 DO 4.44; TYPE Y
will never execute beyond the semicolon.
12.4.1.6 The symbol table is typed in alphabetical order.
FOCAL-10 has the capability (TYPE $$) to include octal
in the symbol-table printout. The symbol table is not
destroyed unless explicitly ERASEd; some small computer
FOCALs use the symbol table space during immediate-mode
commands.
12.4.1.7 GO TO may be two words.
12.4.1.8 ASK data may have leading spaces.
12.4.1.9 Negative FOR indices are allowed.
12.4.1.10 FOCAL-10 has no computed GOTO.
12.4.1.11 FOCAL-10 has no FSBR function.
The reason for this is that the character & is reserved
for future expansion in FOCAL-10.
12.4.1.12 The FCHR function does not have multiple arguments.
The reason for this is that expansion plans call for
control of echoing, which is difficult for
multi-argument FCHR. FCHR should be called once for
each desired argument.
12.4.1.13 FOCAL-10 does not have a control character to interrupt
execution. This is a monitor restriction. It has been
suggested that control-C might have been used, but
control-C, in my opinion, should be used only to return
to monitor mode, and it is not possible to use it for
two purposes.
12.4.1.14 FOCAL-10 allows string values.
12.4.1.15 FOCAL-10 allows logical IF.
12.4.2 OPERATE command.
The asterisk (for paper-tape mode) is not used in
DECsystem-10 FOCAL.
12.4.3 Function list.
Unique FOCAL-10 functions include GETTAB, FOCAL, FSIND,
FCOSD, FLOG10, FHIBER and FCHR$. Some of the standard
functions may behave slightly differently on the
DECsystem-10.
12.4.4 LIBRA Command.
Only LIBRA CALL, LIBRA SAVE and LIBRA DELETE are
FOCAL-10 Page 47
=================================================================
available. There is no LIBRA LIST command and it is
unlikely to be implemented, since DECsystem-10 users
expect wild-card handling which is very complex and can
be obtained with the DIRECT program. If the user
desires the FOCAL text area to be cleared before the
LIBRA CALL he should execute ERASE ALL first. If the
user desires immediate execution following the CALL, he
should either arrange to have GO in the called file, or
execute LIBRA CALL ..;GO.
12.4.5 Character set.
FOCAL-10 uses ASCII-1968. Special character-handling
is as follows.
- Escape echoes as $, for compatibility with other
DECsystem-10 software.
- Any control-Z character from the keyboard will cause
FOCAL to exit.
- Any control-P character in the input file will cause
immediate execution of a QUIT.
- A control-R from the keyboard will display the cue and
first part of the input line.
- Lines are delimited by line-feed only. Escape (33
octal) is always changed to line-feed except in the
ASK data; carriage-returns are ignored. Other break
characters such as form-feed etc. may be used as
ordinary characters.
- Control-U, rather than backarrow, is used for line
deletion.
- Rubout echoes the rubbed-out characters embedded in
- Backspace is used to rub out.
12.5 PDP-11 FOCAL.
---- ------ ------
12.5.1 Implementation characteristics.
- Only the first two characters of a symbol's name are
stored internally.
- FOCAL-11 variables can take either one or two
subscripts.
- FOCAL-11 variables cannot begin with the letter F.
- The symbol table print-out always uses two subscripts
instead of one.
- Care should be taken when using the ASK command. Some
versions of FOCAL-11 accept expressions but not
alphabetic equivalents of numeric literals (such as
"YES"="0YES").
- The rubout key cannot be used while inputting data for
the ASK command.
- Data tapes require nulls embedded in them.
- Care should be taken with the function FITR(-x), since
it may not be compatible with your intuitive concepts.
- The format-size specifier % can accept an expression
as argument.
FOCAL-10 Page 48
=================================================================
- The width of E-format printout cannot be varied.
- The input line width is limited to 79 characters. (77
for indirect commands.)
- The output line width is limited to 71 characters.
- The exponentiation operator (^) is restricted to
positive integer arguments.
- The command ERASE ALL in PDP-11 FOCAL not only erases
all text, but it also erases the symbol table; the
command ERASE TEXT takes the form ERASE ALL in other
FOCALs.
- The KILL command is unnecessary in other FOCALs.
- Computed GOTO except with expressions that begin with
the letter A.
- The DO command can accept as argument a variable or a
number except a variable that begins with the letter
A.
- The symbol table is not retained in any particular
order.
- The maximum total width of numerical type-out is
limited.
- ASK will print a colon on the terminal even though
input is coming from another device.
- In the FOR command, if the increment is negative,
iterations beyond the second will continue
indefinitely because the sense of the looping test is
independent of the sign of the increment. This is
different from FOCAL-10.
12.5.2 OPERATE command.
This has single-letter arguments and hence is not
compatible with disk system FOCALs.
12.5.3 Function list.
Unique FOCAL-11 functions are FX, FCLK and FSBR. The
range of FRAN is from -1 to +1. The argument of FRAN is
less generalized than FOCAL-10's FRAN. FSGN(0) is zero
instead of +1. FCHR function accepts multiple arguments
and treats them as though the function were called
multiple times.
12.5.4 LIBRA command.
12.5.5 Character set.
Uses ASCII-1963. Altmode is non-printing. Character
175 octal is treated as alt mode(esc). Backarrow is
used instead of ^U. Control-C is used as an interrupt
character. Rubout echoes as \ in MODIFY commands.
12.6 FOCAL-GT.
---- ---------
12.6.1 Implementation characteristics.
FOCAL-GT follows PDP-11 FOCAL in most respects.
12.6.2 OPERATE command.
This is the same as FOCAL-11.
12.6.3 Function list.
FOCAL-GT has the following unique functions: FVEC,
FOCAL-10 Page 49
=================================================================
FMOV, FXCO, FYCO, FPT, FSET, FCLR, FTXT, FSKP, FLP,
FSAM, FLED, FDIS, FTIC.
12.6.4 LIBRA command.
12.6.5 Character set.
Uses ASCII-1963. FOCAL-GT prompts with # rather than *.
Control-C is used to escape from the display program.
Control-T and Control-F have special functions. Altmode
is non-printing. Characters 175, 176 and 33 octal are
treated as altmode. Backarrow is used instead of ^U.
12.7 FOCAL-11/RTX.
---- -------------
12.7.1 Implementation characteristics.
FOCAL-11/RTX is very similar to PDP-11 FOCAL.
- FOCAL-11/RTX has an option on the TYPE command to
provide a facility like FORTRAN's T-format. TYPE 'mm
brings the carriage to column mm.
- All commands must be delimited by a space.
- There is a BLOCK command but its purpose is obscure.
12.7.2 OPERATE command.
12.7.3 Function list.
Unique FOCAL-11/RTX functions are FWT, FZCL, FTIC, FDI,
FDO, FTR, FADC, FDAC, FDT, FTI, FTO, FLED, FSAM, FSCD,
FOCAL, FINT and FATR. The FOCAL function is
incompatible with FOCAL-10's function of the same name,
since FOCAL-11/RTX does not allow you to leave a
parameter unchanged or to find out what its previous
setting was.
12.7.4 LIBRA command.
12.7.5 Character set.
Uses ASCII-1963. Altmode is non-printing. Characters
175 176 and 33 octal are treated as altmode. Backarrow
is used instead of ^U.
12.8 FOCAL-G11.
---- ----------
12.8.1 Implementation characteristics.
FOCAL-G11 is an implementation of FOCAL designed to work
with the GAMMA-11 system. FOCAL-G11 follows PDP-11
FOCAL in most respects. The UTILITY command performs a
data interface function with the GAMMA-11 Save
registers.
The ASK command has been slightly modified in FOCAL-G11
to allow comment material on data tapes.
TYPE $ is not included in FOCAL-G11.
12.8.2 OPERATE command.
This is the same as FOCAL-11.
12.8.3 Function list.
FOCAL-G11 has the following unique functions: FMPAR,
FMATG, FMATD, FMATS, FMATW, FMATB, FMATSM, FRPAR, FROIG,
FOCAL-10 Page 50
=================================================================
FROID, FROIP, FROIC, FNCR, FPICK. FOCAL-G11 contains
the standard functions FEXP and FLOG.
12.8.4 LIBRA command.
FOCAL-G11 LIBRA command is similar to DECsystem-10 LIBRA
except that it does not include ppn or protection
facilities. FOCAL-G11 has a LIBRA LIST command, which
DECsystem-10 FOCAL does not. FOCAL-G11 LIBRA CALL reads
the entire program in as a block and destroys the old
program.
12.8.5 Character set.
Uses ASCII-1963. Control-L is used to enter FOCAL-G11,
and control-S is used to leave FOCAL-G11 and return to
GAMMA-11. Altmode is non-printing. Characters 175, 176
and 33 octal are treated as altmode. Backarrow is used
instead of ^U.
12.9 PDP-15 FOCAL.
---- ------ ------
12.9.1 Implementation characteristics.
- Since the PDP-15 console Teletype is wired for
half-duplex operation, various commands such as MODIFY
will appear differently on the PDP-15.
- FOCAL-15 uses a concept of "COMMON" to allow certain
variables to be retained permanently and not be erased
during the ERASE command or during MODIFY.
- MODIFY erases the symbol table.
- MODIFY uses alt-mode instead of form-feed.
- Because only LINES are acceptable as data for the ASK
command, a comma or space will not terminate the ASK
command.
- Commands to FOCAL-15 may be spelled in full or
abbreviated to a single letter, but may not be
partially abbreviated or misspelled.
- ERASE ALL will erase the symbol-table too.
- FOCAL-15 allows only a single subscript in arrays.
- Symbols may not begin with the letter F.
- Only a single E is permitted in numbers. This is
realistic but may represent a minor difference from
other implementations.
- Exponents can be used to + or - 999.
- Exponentiation can be performed only with positive
integers. i.e. in m^n, n must be a positive integer.
- FOCAL-15 does not use the equal sign (=) during
numeric print-out.
- The format of symbol-table print-out does allow for
reading it back in through the paper-tape reader.
- Output lines are limited to a width of 72 characters.
- The width of the E-format printout cannot be varied.
12.9.2 OPERATE command.
FOCAL-15 uses the * command which is incompatible with
the more usual OPERATE command because of its usage and
handling of end-of-file.
FOCAL-10 Page 51
=================================================================
12.9.3 Function list.
FOCAL-15 has all the standard functions. However, FRAN
has a different range and is by no means random. ("Most
numbers are positive.")
12.9.4 LIBRA command.
FOCAL-15 has a complicated set of LIBRA commands but
they essentially perform just the standard LIBRA SAVE
and LIBRA CALL functions. It is necessary to perform
the LIBRA SAVE function in three steps - LIBRA OUT,
LIBRA WRITE, and LIBRA CLOSE. A slight advantage here
is that the LIBRA WRITE can actually perform editting
operations such as prefixing an ERASE ALL to the file or
suffixing a GO to the file. On FOCAL-10 this could be
done in a more complicated way or else they could be
done at calling time with a command such as
ERASE ALL,;LIBRA CALL FILNAM;GOTO 55.46.
The LIBRA IN command of FOCAL-15 is the same as
FOCAL-10's LIBRA CALL except that the * command
apparently terminates reading the file.
12.9.5 Character set.
Uses ASCII-1963. Altmode is non-printing. Characters
175 176 and 33 octal are treated as altmode. Backarrow
is used instead of ^U. ^U echoes as "@".
FOCAL-10 Page 52
=================================================================
13.0 Error diagnostics
---- ----- -----------
All errors occurring during execution of a FOCAL program
will be counted in .JBERR (location 34 decimal) and may or
may not cause an error message to be printed.
13.1 Fatal errors
---- ----- ------
Certain errors will not allow execution to continue. These
errors are flagged with a question mark (?).
13.2 Non-fatal errors
---- --------- ------
Certain errors may occur which, although representing a
failure of logic, accuracy, etc., will allow execution to
continue if desired. These are flagged by a percent mark
(%), and execution continues as best it can. Arithmetic
underflow and overflow are fixed by making the best
approximation and other operations leading to errors are
treated by ignoring them. If desired, the messages from
these errors may be suppressed. (See section 8.4)
13.3 Format of error print
---- ------ -- ----- -----
Error messages are typed in the following format:
?
?Error diagnostic
mm.nn this line was in error
^
except where an immediate-mode command was involved in
which case mm.nn is omitted. The up-arrow points to the
place where the interpreter discovered the error.
FOCAL-10 Page 53
=================================================================
13.4 List of error diagnostics
---- ---- -- ----- -----------
Cannot find FOCAL.SHR on DSK: or SYS: or NEW: or OLD:.
Error detected by FNEWGO routine in FOCALL.REL.
In loading FNEW with FOCALL.REL, and executing at the
normal starting address, a routine called FNEWGO is
invoked, which tries to set up the high segment. FNEWGO
tries to find FOCAL.SHR on various places on the disk, and
fails if FOCAL.SHR or FOCAL.EXE cannot be found on the
user's disk or on SYS or NEW or OLD.
Channel not correctly INITted
In order to select a channel with a TYPE command it must
have previously been initialized for output, and to select
a channel with an ASK command it must have been initialized
for input.
ENTER error #
This file name cannot be used to write on the device.
Perhaps the DECtape directory has 22 file names in it or
you cannot enter this particular name in the disk UFD. -
The monitor manual will explain the meaning of the octal
number code.
Floating-point overflow
Result of an arithmetic operation (e.g. Divide by zero)
produced a number greater than the computer could handle.
The result was replaced by the nearest approximation and
execution continued.
Floating-point underflow
Result of an arithmetic operation produced a number smaller
than the computer could handle. Zero was used instead, and
execution continued. Remember that the "FOCAL" function
can be used to suppress the printing of this warning
message, so it won't mess up your output.
FOCALL.REL and FOCAL.SHR are different versions.
This is a warning message, indicating that the procedure in
FOCALL.REL which found FOCAL.SHR on either DSK or SYS or
NEW or OLD could not find a version which exactly matched
the requirements of FOCALL.REL. Checks are made on the
version number and on a core location towards the end of
the high segment. It is likely that this warning message
will be followed by a fatal error such as Illegal UUO,
indicating that the attempt to continue did not succeed.
Illegal command
One of -
Unrecognizable command name (first letter unrecognizable)
Unrecognizable LIBRA option (not CALL, SAVE or DELETE)
Illegal format (ignored)
That particular format specifier was not legal. Remember
that two digits may be required after the decimal point.
Also remember that the number before the decimal point must
be larger than the number after it. In any event your
specification was ignored and execution continued.
FOCAL-10 Page 54
=================================================================
Illegal number
A request was made to store a program line with an illegal
number, or to use an I/O channel outside the range 0-15
decimal.
Illegal variable
A "FOR" index, or the argument of a "SET" command, is not a
variable name.
Imaginary roots required
An attempt has been made to take the square root of a
negative number.
INIT error
This device cannot be initialized either because some-one
else is using it or you do not have the privilege to do so.
Input device error #
Probably a parity error. - Consult the monitor manual to
find the meaning of the number code, as that may help you
to understand why the error occurred. (The number comes
from a GETSTS UUO.)
Insufficient core
The program is probably in an erroneous loop. There is a
request for more variables to be set up or more program
lines to be entered than the system can handle.
Loading error: FOCALL.REL must be loaded first.
Error detected by FNEWGO routine in FOCALL.REL.
LINK-10 must be instructed to load FOCALL.REL in such a way
that the low segment location counter is zero (to start in
absolute 140 octal). This is because FOCAL.SHR high
segment relies on certain locations in the low segment in
much the same way as an overlay does.
Loading error: High segment is forbidden.
Error detected by FNEWGO routine in FOCALL.REL.
In loading and executing FOCALL.REL with FNEW, the high
segment space cannot be used by any routine such as FOROTS,
because it is going to be used by FOCAL.SHR. FOCALL checks
for the absence of a high segment prior to doing a GETSEG
on FOCAL.SHR.
LOOKUP error #
FOCAL cannot find this file name on the device. - Consult
the monitor manual to find the meaning of the number code,
as that may help you to understand why the error occurred.
Mismatched parentheses
Either mismatched number of brackets in an arithmetic
expression, or mismatched "[" with "]" in
project-programmer pair, or mismatched "<" with ">" in
protection key field
Nonexistant line
An "IF", "GOTO", or "MODIFY" command specifies a line
number which does not exist.
Output device error #
For example write-lock on, parity error, tape full, etc. -
Consult the monitor manual to find the meaning of the
number code, as that may help you to understand why the
error occurred. (The number comes from a GETSTS UUO.)
FOCAL-10 Page 55
=================================================================
Program re-started
Either a previously-run program was saved and re-executed
or control-C/START sequence was used. (This is not really
an error.)
RENAME error #
Either during library deletion or at the end of writing a
file, there was a protection failure or other kind of
failure during a rename UUO. Please consult the monitor
manual to determine the meaning of the octal code.
Unexpected character
FOCAL was expecting either a semicolon or carriage-return
(at the end of a command), a "=" (after a "SET" command
variable), or a comma (after a project number before the
programmer number). String expressions cannot be mixed
with numeric expressions.
Note:
# is the (octal) numerical code returned by the monitor
13.5 Push-down-list Overflow
---- -------------- --------
Occasionally a FOCAL program may enter a loop which causes
FOCAL's internal push-down list to fill to capacity. This
may be caused, for example, by a program which includes a
DO ALL which calls itself. The push-down-list overflow
error message (pdl ov) is generated by the monitor, and if
it occurs, the user should recover by giving the monitor
START command.
FOCAL-10 Page 56
=================================================================
14.0 External function: FNEW
---- -------- --------- ----
If you desire to link FOCAL with some other language, this
is done using the FNEW construction. By this method, FOCAL
may call a routine or subroutine with an unlimited number
of arguments, may execute machine code directly, and may
return one numeric result. The arguments are transferred
to the subroutine by value only, and it is therefore not
possible to modify an argument from the subroutine.
Arguments may be numeric (single or double precision) or
ASCII string (FORTRAN type 17). The DECsystem-10 standard
calling sequence is used.
If there is no FNEW routine, a call to FNEW will produce an
error message or, if there is only one argument, will give
the value of the argument.
14.1 How to load your FNEW program
---- --- -- ---- ---- ---- -------
To use the "FNEW" feature, you must write the FNEW routine
itself and compile it. Then load it with the relocatable
binary file "FOCALL.REL", making sure that FOCALL is loaded
first and that there is no high segment. The core image
thus obtained can be executed with the monitor "START"
command. then FNEW may be called from a FOCAL program just
like any other function.
14.2 Example of an FNEW routine
---- ------- -- -- ---- -------
Here is an example of a FORTRAN subroutine which may be
called from FOCAL. The value returned by FNEW will be
equal to the number of characters in the string.
DOUBLE PRECISION FUNCTION FNEW(I)
C FNEW RETURNS THE NUMBER OF CHARACTERS IN A STRING.
DIMENSION I(100)
FNEW=0
DO 100 J=1,100
M=I(J)/2
DO 100 K=1,5
IF((M.AND."376000000000).EQ.0)RETURN
M=M*128
100 FNEW=FNEW+1
END
FOCAL-10 Page 57
=================================================================
Here is how you might use this function in FOCAL:
.EXECUTE SYS:FOCALL/REL,DSK:FNEW.F4/COMP/F10
...........
*1.01 ASK X$;IF (FNEW(X$)#7) ; GO TO 1.01
*GO
:NO :FOO :WORRY :ASK :CORRECT
*
Note: FORTRAN subroutines must be compiled with
----
FORTRAN-10, not F40.
---
FOCAL-10 Page 58
=================================================================
15.0 Internal representation of numbers --- accuracy
---- -------- -------------- -- ------- --- --------
Data words may be represented internally within the
DECsystem-10 in a number of different forms, depending on
how FOCAL was assembled. It is normally assembled as
double-precision.
15.1 Single precision
The DECsystem-10 holds the numbers in 36-bit words, of
which 27 bits are fraction and nine bits are exponent. Of
the 27 bits, the left-most is always a 1, so there are
really only 26 bits of precision, or 26 times
log-2-to-base-10 =8 digits.
15.2 Double precision KA-10
There are 26+27 fraction bits, so the accuracy is 26+27
times log-2-to-base-10 =53*0.30103=16 digits
15.3 Double precision KI-10, KL-10
There are 26+35 fraction bits, so the accuracy is 26+35
times log-2-to-base-10 =61*0.30103=18 digits.
15.4 String values.
The symbol table holds only a pointer to the string which
is stored in a different area of core.
FOCAL-10 Page 59
=================================================================
16.0 Speed of FOCAL
---- ----- -- -----
There are many factors governing the speed of execution of
a FOCAL program. The most important thing to realize is
that the program itself is stored in source form, i.e. as
strings of ASCII characters making up the lines of the
program. As the program is executed, FOCAL examines each
letter of the program text, deciding what meaning to give
to each letter, and then doing whatever is required. For
example, if the line contained "SET X= 0", FOCAL would
first find the "S", determine that it was therefore a "SET"
command, and move the scanning pointer forward past the "E"
and "T" until it found the space. Then it would go to the
"Symbol-find" routine which would find the "X", determine
that it was not indexed, and ensure that it was followed by
"=" and skip the "=". A call to the "EVAL" routine would
then skip the space, evaluate the zero, and return to the
"SET" routine which would store the answer. The only
remaining thing to do would be to ensure that the line is
terminated correctly. Thus it appears that since FOCAL is
an "interpreter", time could be saved by omitting the "E"
and "T", and the space before the zero.
16.1 Speed of Character Interpretation
---- ----- -- --------- --------------
The basic speed of FOCAL's character interpreter may be
measured in units of micro-seconds per character, by
finding the difference between times for
FOR X=1,1000;S Y=0
and
FOR X=1,1000;SET Y=0
It is apparent that these lines differ by two characters,
and the interpreter's speed will be the time difference as
measured above, divided by 2000.
Depending on memory speed, configuration etc., FOCAL-10
will show about 75 microseconds per character (KI-10) or
125 microseconds per character (KA-10). Since FOCAL-10 has
a special capability to skip spaces quickly, the figure is
about 30 to 40 microseconds per character for spaces and
tabs.
FOCAL-10 Page 60
=================================================================
16.2 Speed of Line-finding
---- ----- -- ------------
Interpreters such as FOCAL-10 have various methods of
storing program lines. One method could be to store all
program lines with their line numbers in the text storage
area. In such a case, the line-finding routine would need
to scan all text, searching for end-of-line followed by the
line number. FOCAL-10, however, stores the line numbers in
a separate table, in order of line number, with a similar
table of pointers to the line itself. In finding a line,
then, FOCAL-10 must first scan the table and then use the
pointer to get to the line itself. Speeds are measured by
finding the difference between
FOR X=1,1000;DO 1.01
and
FOR X=1,1000;DO 1.99
where 1.01 through 1.99 are identical and contain only the
letter "C".
Typical times for FOCAL-10 are 18 - 30 microseconds per
line scanned over. The time depends on the number of
entries in the table of line numbers. Obviously it will be
quicker to find low-numbered lines in FOCAL-10, but in all
cases it would be faster than an interpreter which did not
have a line table. (A 100-line program would still take
only 2 milliseconds to find the hundredth line).
16.3 Speed of Command-execution
---- ----- -- -----------------
Many commands in FOCAL can be timed by including them in
loops and performing them many times. The times may be
compared with "COMMENT" execution. However, many commands
can not be executed satisfactorily during loops ("ERASE",
"MODIFY", "WRITE") and some others are I/O-dependent.
Some examples of times in FOCAL-10 are:
"DO" 2100 (KA-10), 1000 (KI-10) microseconds including
line-number decoding.
"GOTO" 1150 (KA-10), 780 (KI-10) microseconds including
line-number decoding.
"SET" 680 (KA-10), 450 (KI-10) microseconds including
data-storage but not expression-evaluation.
FOCAL-10 Page 61
=================================================================
16.4 Speed of Arithmetic Operations
---- ----- -- ---------- ----------
Multiplication, division etc. will take a time dependent
on the hardware being used and also precision (single or
double). All simple operations take about the same time
within about 20% or 30%, including addition, subtraction,
multiplication, division, and exponentiation. Test results
may be produced by the FOCAL test program XSPEED.FCL.
16.5 Speed of Item Evaluation
---- ----- -- ---- ----------
There are many types of evaluations performed by FOCAL.
For example arithmetic functions, constants and variables.
Each of these is determined and printed by the test program
XSPEED.FCL; note that per-character interpretation times
must be computed separately and added to those figures.
FOCAL-10 Page 62
=================================================================
Appendix A. FOCAL memory map.
-------- -- ----- ------ ----
Accumulators (000000 thru 000017)
Job data area (000020 thru 000137)
Static data base (see below: BUFH thru PDL-1)
Push-down list (PDL thru PDL+PDC-1)
Low segment program (if any)
FOCAL program if non-sharable version (FOCAL thru CODEND-1)
Function subroutines (if any - e.g. FNEW)
DDT if any (DDT thru DDTEND-1)
DDT symbols (if DDT is loaded)
Patch area (if any)
A patch area may be created at run time if required for DDT
debugging, by modifying the left half of .JBSA before
starting FOCAL. For example:
.GET FOCAL
.DDT
FOCAL$:
.JBSA/ 7016,,400010 7116,,400010
7016/ 0 (or rubbish) PAT: PATCH:
^C
.SAVE FOCAL
Dynamic data base (@.JBSA/L thru @.JBREL)
I/O buffers pointed to by BUFTAB.(@.JBSA/L thru @INDEX-2)
FOCAL text index (@INDEX-1 thru @TEXTL)
This data block consists of one-word links in the format
Bits 4-17 Program line number.
Bits 18-35 Address just below text.
Words must be stored in order of line number. Zero words
represent deleted line numbers. The first word contains
-1; INDEX points to this word. The last word contains -1;
TEXTL points to this word.
FOCAL program text(@TEXTL+1 thru @BUFL)
The right half of TEXTL points just below the first
character. The pointer in BUFL points to the right-most
character-position of the last word in this data area.
Statements appear in this data area as character strings,
without the line-number prefix. Each new statement begins
in a new word. The line-delimiter is stored as a single
character, "eol".
LIBRA-CALL text area(@BUFL+1 thru @BUFH)
This contains groups of text-lines, where lines are
separated by eol's. BUFL defines the lower limit of this
FOCAL-10 Page 63
=================================================================
area, such that the first character would be obtained into
CH by executing ILDB CH,BUFL. BUFH defines the upper limit
of this area such that BUFH always points above the top
eol. Initially the buffer area is empty and
c(BUFL)=c(BUFH). The area is set to empty condition each
time FOCAL types "*" to accept a new FOCAL command. When
we execute code in this section it is executed as line
zero. During the evaluation of string expressions, BUFH is
temporarily moved up and the temporary strings are stored
in this area.
Unused core (@BUFH thru @SYMTBL)
Symbol table (1+@SYMTBL thru @.JBREL)
Variable labels and values (1+@SYMTBL thru @SYMTBC)
If a variable exists, it will have an entry in this table.
If there is no entry, then the variable has not been
defined and we may assume it does not exist. Entries are
stored in alphabetical order, working downwards from
@SYMTBC. Each entry has the following format: Top word is
the name, in which bit 0 indicates whether string (0) or
number (1), bits 1-17 are the sixbit label, and bits 18-35
contain the index if any. The other word(s) contain the
value being a floating-point number in the case of numeric
data, or a string pointer in the case of string data. The
double precision entry also contains a zero word of
padding. The purpose of this is to speed searching. The
floating-point format used depends on the hardware FOCAL-10
is assembled for. Double-precision versions of FOCAL-10
contain the string pointer in the word with the lesser
address, and the other word if any contains zero.
String variable values (1+@SYMTBC thru @SYMTBH)
The data portion of string variables is stored here. Space
is never reclaimed, so as the variable values change, this
space expands without limit.
High segment (if applicable)(400000 thru @.JBHRL/R)
Vestigial jobdata area(400000 thru 400007)
Function subroutines (if any)(FNEW thru FNWEND-1)
FOCAL program (if sharable version)(FOCAL thru CODEND-1)
FOCAL-10 Page 64
=================================================================
FOCAL low segment data base (extract from FOCAL.MAC)
----- --- ------- ---- ---- -------- ---- ----------
(subject to change without notice)
SUBTTL LOW SEGMENT DATA
RELOC 0
;******** Data-block pointers ********
BUFH: BLOCK 1 ;Pointer to last character in LIBRA-CALL text
area.
DBP: ;This group is checked by the SQUEEZ routine.
INDEX: BLOCK 1 ;Left half unused (contains -1). Right half -
address of index data block.
TEXTL: BLOCK 1 ;Right half points just below FOCAL program
text. Left half contains -1.
PNTR: BLOCK 1 ;Current byte pointer to FOCAL text.
THISPT:BLOCK 1 ;Pointer to beginning of execution of current
line.
BUFL: BLOCK 1 ;Pointer to just below LIBRA-CALL text area.
Left half contains 010700.
DBPEND=+. ;End of data-block pointers.
;******** Program status data words ********
OUTCHN:BLOCK 1 ;Current-output-channel.
INCHN: BLOCK 1 ;Current-input-channel.
WPC==3 ;Three words per channel.
HEDTAB:BLOCK 20*WPC ;Buffer headers.
BUFTAB:BLOCK 20;Table of pointers to buffer space allocated to
each channel. If entry is zero, then no
buffers are allocated. If the word is
negative, it means the channel is initted for
output. Following data is gotten by negating
the whole word first: Left half - size of
buffer space. Right half - address of buffer
space.
FORFLA:BLOCK 1 ;Contains zero if no 'FOR' in execution.
Otherwise XWD -1,LINNUM-of-FOR.
FOVSUP:BLOCK 1 ;If this word is non-zero (set to -1), then
suppress floating-point trap error messages.
LUPARG:BLOCK 2 ;Most recent argument of repetitive loop.
(2 locations to preserve historical map.)
THISLN:BLOCK 1 ;# of the line being executed.
LINNUM:BLOCK 1 ;Right-half - line number of current interest
(Always positive). Left half if negative is a
link to nested lines and pointers. Previous
LINNUM is at PDLEND-2+LH(LINNUM). Previous
PNTR is at PDLEND-1+LH(LINNUM).
;******** Symbol table pointers ********
SYMTBL:BLOCK 1 ;Address just below bottom of symbol-table. It
is a pointer including index RL.
SYMTBC:BLOCK 1 ;Address of first name in symbol table. It is
a pointer including index RL.
SYMTBH:BLOCK 1 ;Highest location of symbol table. Normally
contains same as .JBREL.
FORMAT:BLOCK 1 ;Format control for typing numbers. Bits
0-28:total # of digits. Bits 29-35:# of
digits right of point.
FOCAL-10 Page 65
=================================================================
EORMAT:BLOCK 1 ;Format control for E-format output
OLDRAN:BLOCK WPV;Save last random number.
FORMAX:BLOCK WPV;Logarithm of upper size limit for F-format
output before rounding.
EORMAX:BLOCK WPV;Logarithm of upper size-limit Of F-part of
E-format type-out.
;******** Temporary storage ********
TEMP1: BLOCK WPV;This storage is not
TEMP2: BLOCK WPV;guaranteed preserved by subroutines.
TEMP3: BLOCK WPV;Therefore only use it on the one page.
TEMP4: BLOCK WPV
TEMPE: BLOCK WPV;Temporary storage for EXP. routine.
TEMPR: BLOCK WPV;Temporary storage for RECIPR routine.
TEMPT: BLOCK WPV;Temporary storage for type-out routine.
LUKENT:BLOCK .RBDEV+2+AA ;LOOKUP/ENTER block.
IFLE MONITOR-4.72,<
WPD=4 ;Words per directory entry.
FILTAB:BLOCK 20*WPD ;Space for file name etc.
>;End IFLE MONITOR-4.72
BUFBOT:BLOCK 1 ;Save .JBFF here.
;******** Push-down list ********
PDL: BLOCK PDC;Program push-down list.
PDLEND:BLOCK 2 ;Two spare for overflow.
FOCAL-10 Page 66
=================================================================
! . . . . . . . . . . . . . . . 8
" . . . . . . . . . . . . . . . 17
# . . . . . . . . . . . . . . . 17
$ . . . . . . . . . . . . . . . 9, 17
% . . . . . . . . . . . . . . . 18-19, 52
* . . . . . . . . . . . . . . . 9, 12
** . . . . . . . . . . . . . . 9
+ . . . . . . . . . . . . . . . 9
- . . . . . . . . . . . . . . . 9
/ . . . . . . . . . . . . . . . 9, 18, 21, 24-25
: . . . . . . . . . . . . . . . 20
; . . . . . . . . . . . . . . . 6, 39
? . . . . . . . . . . . . . . . 27
Abbreviations . . . . . . . . . 7
Accuracy . . . . . . . . . . . 58
Addition . . . . . . . . . . . 9
Alphanumeric . . . . . . . . . 8
Alt-mode . . . . . . . . . . . 6, 20
Arithmetic . . . . . . . . . . 8-9
Arithmetic operators . . . . . 9, 45
Arithmetic speed . . . . . . . 61
Arrays . . . . . . . . . . . . 8, 45
ASK command . . . . . . . . . . 20
Asterisk cue . . . . . . . . . 6, 26
Asterisk for paper-tape input . 46
Availability . . . . . . . . . 1
Back-slash . . . . . . . . . . 11
Backarrow . . . . . . . . . . . 47
Backspace . . . . . . . . . . . 7, 11, 20, 41
Calculator . . . . . . . . . . 8
Carriage-return . . . . . . . . 6, 8, 11, 17, 47
Channel . . . . . . . . . . . . 18, 21, 24
Channel not correctly INITted . 53
Character interpretations . . . 39, 45
Colon . . . . . . . . . . . . . 20
COMMENT command . . . . . . . . 10
Conditional branching . . . . . 14
Configuration . . . . . . . . . 4
Control-C . . . . . . . . . . . 27-28, 31, 40, 55
Control-G (bell) . . . . . . . 11
FOCAL-10 Page 67
=================================================================
Control-L . . . . . . . . . . . 11
Control-P . . . . . . . . . . . 11, 20, 27, 30, 40, 47
Control-R . . . . . . . . . . . 7, 11, 20, 40, 47
Control-U . . . . . . . . . . . 7, 11, 40
Control-Z . . . . . . . . . . . 29-30, 40, 47
Cue for ASK data . . . . . . . 33
Data base . . . . . . . . . . . 62
Date . . . . . . . . . . . . . 10, 34
DDT symbols . . . . . . . . . . 62
Debug . . . . . . . . . . . . . 20, 27-28
Deletion of files . . . . . . . 22
Desk calculator . . . . . . . . 8
Diagnostics . . . . . . . . . . 7, 52-53
Dimension . . . . . . . . . . . 8, 45
Disk I/O . . . . . . . . . . . 24
Distribution . . . . . . . . . 1
Division . . . . . . . . . . . 9
DO command . . . . . . . . . . 12-13
Dollar($) . . . . . . . . . . . 17
E-format . . . . . . . . . . . 18-19
Emergency . . . . . . . . . . . 30
ENTER error # . . . . . . . . 53
ERASE command . . . . . . . . . 10
Error messages . . . . . . . . 33, 52-53
Errors . . . . . . . . . . . . 7
Escape . . . . . . . . . . . . 6, 20, 40
Evaluation speed . . . . . . . 61
Examples . . . . . . . . . . . 9, 28
Examples of FOCAL programs . . 28
Exclamation(!) . . . . . . . . 8, 17
Execute Command . . . . . . . . 16
EXIT . . . . . . . . . . . . . 25, 30, 47
Exponentiation . . . . . . . . 9
F-format . . . . . . . . . . . 18-19
FCHR function . . . . . . . . . 35
Features of FOCAL-10 . . . . . 5
FHIBER function . . . . . . . . 35
File storage . . . . . . . . . 22
Floating-point overflow . . . . 53
Floating-point underflow . . . 53
FNEW function . . . . . . . . . 32, 56
FOCAL commands . . . . . . . . 6, 12, 38
FOCAL examples . . . . . . . . 9, 19, 28
FOCAL function . . . . . . . . 33
FOR command . . . . . . . . . . 13-14
Form feed . . . . . . . . . . . 11
Format . . . . . . . . . . . . 18-19, 33, 64-65
Full-duplex . . . . . . . . . . 11
Function FNEW . . . . . . . . . 56
Function FOCAL . . . . . . . . 33
Function names . . . . . . . . 32, 36-37
FOCAL-10 Page 68
=================================================================
Generalised I/O . . . . . . . . 24
GETTAB . . . . . . . . . . . . 34
Getting FOCAL program . . . . . 6
Getting on the air with FOCAL . 6
Getting started . . . . . . . . 6
GO command . . . . . . . . . . 12
GO TO command . . . . . . . . . 12
GOTO command . . . . . . . . . 12
Group number . . . . . . . . . 6
Half-duplex . . . . . . . . . . 11
Hatch(#) . . . . . . . . . . . 17
Heirarchy of operators . . . . 8
HELP . . . . . . . . . . . . . 7
Hibernating and sleeping . . . 35
I/O channel . . . . . . . . . . 18, 21, 24, 33
IF command . . . . . . . . . . 14
Illegal command . . . . . . . . 53
Illegal format (ignored) . . . 53
Illegal number . . . . . . . . 54
Illegal variable . . . . . . . 54
Imaginary roots required . . . 54
Immediate mode . . . . . . . . 6
INIT error . . . . . . . . . . 54
Initial dialogue . . . . . . . 4
Input device error . . . . . . 54
Insufficient core . . . . . . . 54
Interpretation speed . . . . . 59
Iteration . . . . . . . . . . . 14
Jiffies . . . . . . . . . . . . 34
Job data area . . . . . . . . . 33, 62
KA-10 . . . . . . . . . . . . . 5, 58
KI-10 . . . . . . . . . . . . . 5, 58
Kilo-core-ticks . . . . . . . . 34
KJOB . . . . . . . . . . . . . 30
LIBRA CALL command . . . . . . 22, 25
LIBRA SAVE command . . . . . . 22
LIBRARY CALL command . . . . . 13
Line number . . . . . . . . . . 6
Line-feed . . . . . . . . . . . 6, 11
Line-finding speed . . . . . . 60
Logging on procedure . . . . . 6
Login . . . . . . . . . . . . . 6
LOOKUP error # . . . . . . . . 54
Loops . . . . . . . . . . . . . 14, 55
Memory requirements . . . . . . 5
Mismatched parentheses . . . . 54
MODIFY command . . . . . . . . 11
Monitor . . . . . . . . . . . . 6, 30-31, 34
FOCAL-10 Page 69
=================================================================
Monitor SAVE command . . . . . 30
Multiplication . . . . . . . . 9
Nonexistant line . . . . . . . 54
OPERATE INPUT command . . . . . 24-25, 30, 38
OPERATE OUTPUT command . . . . 25, 30, 38
Operators . . . . . . . . . . . 8-9
Output device error . . . . . . 54
Parentheses . . . . . . . . . . 9, 32, 39
Patch area . . . . . . . . . . 62
pdl ov (monitor error message) 55
PDP-11 FOCAL . . . . . . . . . 17
PDP-6 . . . . . . . . . . . . . 5
PDP-8,PDP-9 etc. . . . . . . . 4
PEEK . . . . . . . . . . . . . 33
Percent mark . . . . . . . . . 18-19, 52
Peripheral devices . . . . . . 24
Precision . . . . . . . . . . . 58
Price . . . . . . . . . . . . . 1
Program . . . . . . . . . . . . 6, 10
Program lines, groups . . . . . 6
Program re-started . . . . . . 55
Program storage . . . . . . . . 22
Program text . . . . . . . . . 10
Project-programmer numbers . . 22
Prompt for ASK data . . . . . . 33
Protection . . . . . . . . . . 23
Protection of files . . . . . . 22
Push-down-list Overflow . . . . 55
Query(?) . . . . . . . . . . . 27-28
QUIT command . . . . . . . . . 12
Quote marks . . . . . . . . . . 17
Random numbers . . . . . . . . 33-34, 65
Re-starting FOCAL . . . . . . . 30
REE . . . . . . . . . . . . . . 30-31
REENTER . . . . . . . . . . . . 30-31
RENAME error # . . . . . . . . 55
RETURN command . . . . . . . . 13
Rubout . . . . . . . . . . . . 7, 11, 20, 40
Run time . . . . . . . . . . . 34
Running FOCAL . . . . . . . . . 6
SAVE command . . . . . . . . . 30
Search character . . . . . . . 11
Semicolon . . . . . . . . . . . 6, 39
SET command . . . . . . . . . . 8
Simple arithmetic . . . . . . . 8
Sleeping and hibernating . . . 35
Speed . . . . . . . . . . . . . 59-60
START command . . . . . . . . . 30, 55
FOCAL-10 Page 70
=================================================================
Step number . . . . . . . . . . 6
Stopping . . . . . . . . . . . 30
String constants . . . . . . . 16
String expressions . . . . . . 16
String variables . . . . . . . 16
Subroutines (DO) . . . . . . . 13
Subscripts . . . . . . . . . . 8, 45
Subtraction . . . . . . . . . . 9
Symbol table . . . . . . . . . 9, 17
Symbols . . . . . . . . . . . . 8, 10, 20
Text . . . . . . . . . . . . . 10, 17
Text buffer . . . . . . . . . . 10
Time . . . . . . . . . . . . . 10
Time-of-day . . . . . . . . . . 10, 34
Trace feature . . . . . . . . . 27-28
TYPE $ . . . . . . . . . . . . 9
TYPE command . . . . . . . . . 8, 17
Unexpected character . . . . . 55
UUO -GETTAB . . . . . . . . . . 34
Variables . . . . . . . . . . . 8
Vectors . . . . . . . . . . . . 8, 45
Vestigial jobdata area . . . . 63
WEAVE . . . . . . . . . . . . . 22
WRITE command . . . . . . . . . 10
XECUTE Command . . . . . . . . 16
\ . . . . . . . . . . . . . . . 11
^ . . . . . . . . . . . . . . . 7, 9