Trailing-Edge
-
PDP-10 Archives
-
decuslib10-10
-
43,50516/basic.mem
There are no other files named basic.mem in the archive.
University of Pennsylvania Medical School BASIC Page 1
Introduction
Introduction
The University of Pennsylvania Medical School BASIC is a segmented program
derived from DECSYSTEM-10 BASIC, version 17E. There are currently five
segments.
BASIC - COMMAND/EDIT (6K/11P)
BASCOM - COMPILE/LOAD (6K/12P)
BASXCT - EXECUTE (8K/15P)
BASDDT - BASIC DEBUGGER (12K/24P)
BASCRF - BASIC CREF (5K/10P)
BASERR - ERROR (1K/2P)
The design goals of this program are to approach compatibility with the
BASIC-PLUS language on the PDP-ll, under the restriction that all existing
BASIC-10 programs should run unchanged, to add more computing power and user
convenience to BASIC, and to fix all known bugs in version l7E. Certain
features of PDP-11 BASIC-PLUS, such as those assuming a 16-bit two-character
word, and system functions, were considered too machine-dependent for inclusion,
and record I/O was not implemented due to conflicts with BASIC-10 I/O. In most
other respects the functionality of PDP-11 BASIC-PLUS, with some minor syntax
changes to retain compatibility with BASIC-10, has been reproduced. No existing
BASIC-10 programs are known to have been affected.
This document describes the enhancements made to BASIC-10, and is intended
to be used in conjunction with and as an appendix to the DECSYSTEM-10 BASIC
Conversational Language Manual, DEC order code DEC-10-LBCMA-A-D.
University of Pennsylvania Medical School BASIC Page 2
Syntax Changes
Syntax Changes
A) Multiple Statements on a Single Line
More than one statement can be written on a single line as long as each
statement (except the last) is terminated with a backslash, \ (SHIFT-L on
teletypes). Thus only the first statement on a line can (and must) have a line
number. For example:
10 INPUT A,B,C
is a single statement line, while
20 LET X=X+1 \ PRINT X,Y,Z \ IF Y=2 GOTO 10
is a multiple-statement line containing three statements: a LET, a PRINT, and an
IF-GOTO statement.
The following restrictions apply to this construction:
1) DATA statements and Image statements must be the only statement
in lines in which they appear.
2) DEF FN? statements must be the first statement in lines in which
they appear.
3) REM statements and comments indicated by a single quote must be
the last element in lines in which they appear. (i.e. the
remainder of the line is treated as text for the comment)
4) END and FNEND statements must be the last statement in lines in
which they appear.
B) A Single Statement on Multiple Lines.
A single statement can be continued on successive lines of the program. To
indicate that a statement is to be continued, the line is terminated with the
LINE FEED key instead of the RETURN key. The LINE FEED causes a carriage
return/line feed operation on the terminal and the line to be continued does not
contain a line number. For example:
10 LET W7=(W-X4*3)*(Z-A/
(A-B)-17)
where the first line was terminated with the LINE FEED key is equivalent to:
10 LET W7=(W-X4*3)*(Z-A/(A-B)-17)
Note that the LINE FEED key does not cause a printed character to appear on the
University of Pennsylvania Medical School BASIC Page 3
Syntax Changes
page. Programs using this construction may not be edited by the line editors,
LINED or SOS.
C) Line Length
The maximum length of a BASIC program line has been expanded to 255
characters. The maximum length of a string used or generated by a BASIC program
remains 132 characters.
University of Pennsylvania Medical School BASIC Page 4
BASIC Statements
BASIC Statements
A) OPEN
The OPEN statement associates a file on disk with an I/O channel number.
BASIC permits up to nine files to be open at a given time, and, therefore,
permits internal file designators to be integers between one and nine. The
general form of the open statement is as follows:
<ln> OPEN <string> (FOR INPUT) AS FILE <type> <expression> (TO PLOT)
(FOR OUTPUT)
The string field is a character string constant, variable or expression that
contains the external file specification of the file to be opened. The type is
either # for sequential access or : for random access, and must be present. The
expression must have an integer value between one and nine, corresponding to the
internal channel number on which the file is being opened.
There are three distinct forms for the OPEN statement:
OPEN <string> FOR OUTPUT
OPEN <string> FOR INPUT
OPEN <string>
A) An OPEN FOR INPUT statement will cause an automatic RESTORE to be
done on the file. If the file does not exist at this time, an
error message will be given.
B) An OPEN FOR OUTPUT statement will cause an automatic SCRATCH to
be done on the file. If the file exists at this time, it will be
deleted.
C) An OPEN statement without an INPUT or OUTPUT designation will
perform no other function except to associate the file with the
specified I/O channel number.
The OPEN statement does not control whether the program attempts to perform
input or output on the file or whether read and/or write access to the file is
granted; these privileges are controlled by the file protection code.
For an explanation of the OPEN statement argument TO PLOT, see the
description of the BASIC Plotting Package below.
In the OPEN statement, as well as in the FILE and FILES statements, and any
edit-level commands where it is appropriate, project-programmer numbers can be
specified for files in the usual format - [project no.,programmer no.].
University of Pennsylvania Medical School BASIC Page 5
BASIC Statements
B) CLOSE
The CLOSE statement is used to terminate I/O between the BASIC program and
the disk file. Once a file has been closed, it can be reopened for reading or
writing on any internal file designator. All files will automatically be closed
at the end of program execution or upon execution of the CHAIN statement. The
format of the CLOSE statement is as follows:
<ln> CLOSE <expression> (,<expression>,...)
The expression indicated has the same meaning as the expression in the OPEN
statement and indicates the internal channel number of the file to close. Any
number of files can be closed with a single CLOSE statement; if more than one
file is to be closed, the expressions are separated by commas.
C) ON-GOSUB
The ON-GOSUB statement is used to transfer control conditionally to one of
several subroutines or to one of several entry points in one (or more)
subroutines. The statement has the following form:
<ln> ON <expression> GOSUB <list of line numbers>
Depending on the integer value (truncated if necessary) of the expression,
control is transferred to the subroutine which begins at one of the line numbers
listed. Encountering the RETURN statement after control is transferred in this
way allows the program to resume execution at the line following the ON-GOSUB
line.
D) INPUT
Messages to be printed at execution time can now be inserted within the
INPUT statement itself. This message is set off by double quotes from the other
arguments of the INPUT statement and must be the first element, if used. For
example:
10 INPUT "YOUR AGE IS";A
is equivalent to:
10 PRINT "YOUR AGE IS";
20 INPUT A
The use of the comma or semicolon character (or no character) to separate a
character string to be printed from the input variable names is analogous to the
PRINT statement.
University of Pennsylvania Medical School BASIC Page 6
BASIC Statements
Strings may appear anywhere in INPUT statements, however each time a string
appears the data elements following it must be entered at the beginning of a new
line. The character left-arrow or underline, _, may optionally follow a string
and its format character, if present, and has the effect of suppressing the ?
normally output by BASIC. For example:
10 INPUT "TYPE X AND Y : "_X,Y
The INPUT LINE statement followed by a single string argument can be used
to put a complete line of input, including blanks, tabs, and commas, into the
string argument of the statement:
10 INPUT LINE A$
E) User-Defined String Functions
Character string functions can be written in the same way as numeric
functions. The function is indicated as being a string function by the $
character after the function name.
User-defined string functions return character string values, although both
numeric and string values can be used as arguments to the function. For
example, the following multiple-line function returns the string which comes
first in alphabetical order:
10 DEF FNF$(A$,B$)
20 FNF$=A$
30 IF A$>B$ THEN FNF$=B$
40 FNEND
Numbers cannot be used as arguments in a function where strings are
expected or vice versa.
F) Statement Modifiers
To increase the flexibility and ease of expression within BASIC, five
statement modifiers are available (IF, UNLESS, FOR, WHILE, and UNTIL). These
modifiers are appended to program statements to indicate conditional execution
of the statements or the creation of implied FOR loops.
University of Pennsylvania Medical School BASIC Page 7
BASIC Statements
1) The IF Statement Modifier
The form:
<ln> <statement> IF <condition>
is analogous to the form:
<ln> IF <condition> THEN <statement>
For example:
10 PRINT X IF X <>0
is the same as:
10 IF X <> 0 THEN PRINT X
When a statement modifier appears to the right of an IF-THEN statement, the
modifier operates only on the THEN clause or the ELSE clause, depending on its
placement to the left or right of ELSE. It is not possible to include an ELSE
clause when using the modifier form of IF. Several modifiers may be used within
the same statements. For example:
70 PRINT X(I,J) IF I=J IF X(I,J) <> 0
which will print the value of X(I,J) only if the value X(I,J) is non-zero and if
I equals J. Whenever there is more than one modifier on a line, the modifiers
are executed in a right-to-left order. That is, the rightmost one is executed
first, and the leftmost one is executed last.
2) The UNLESS Statement Modifier
The form:
<ln> <statement> UNLESS <condition>
causes the statement to be executed only if the condition is false. For
example, the following statements are all equivalent:
10 PRINT A UNLESS A = 0
20 PRINT A IF NOT A=0
30 IF NOT A=0 THEN PRINT A
40 IF A <> 0 THEN PRINT A
This particular form simplifies the negation of a logical condition.
University of Pennsylvania Medical School BASIC Page 8
BASIC Statements
3) The FOR Statement Modifier
The form:
<ln> <statement> FOR <variable>=<expr.>TO<expr.>(STEP<expr.>)
or the form:
<ln> <statement> FOR <variable>=<expr.>(STEP<expr.>)(WHILE<expr.>)
(UNTIL<expr.>)
can be used to imply a FOR loop on a single line. For example (using none of
the optional elements):
10 PRINT I, SQR(I) FOR I = 1 TO 10
This statement is equivalent to the following FOR-NEXT loop:
10 FOR I = 1 TO 10
20 PRINT I,SQR(I)
30 NEXT I
In cases where the FOR-NEXT loop is extremely simple, the necessity for separate
FOR and NEXT statements is eliminated. Notice that this implied FOR loop will
only modify (and hence execute iteratively) one statement in the program. Any
number of implied FOR loops can be used in a single program.
As is the case with all modifiers, a FOR modifier in an IF statement operates
only on the THEN or ELSE clause with which it is associated, and never on the
the conditional expression to the left of the THEN. Thus, if it was desired to
print all non-zero values in a vector X(100), the following program would not
operate properly:
10 DIM X(100)
20 READ X(I) FOR I = 1 TO 100
30 IF X(I)<>0 THEN PRINT I,X(I) FOR I = 1 TO 100
since the implied FOR loop at line 30 applies only to the THEN PRINT . . . part
of the statement, and not to the IF . . . part. The first value of X tested is
X(100), since I remained at 100 from statement 20. To achieve the desired
effect, it is only necessary to code line 30, not as an IF statement, but rather
as a PRINT statement with nested modifiers; for example:
30 PRINT I,X(I) IF X(I)<> 0 FOR I = 1 TO 100
When expressed in the latter form, the nested modifier rule takes effect, all
the values of X(I) are tested and printed as appropriate.
University of Pennsylvania Medical School BASIC Page 9
BASIC Statements
4) The WHILE Statement Modifier
The form:
<ln> <statement> WHILE <condition>
is used to repeatedly execute the statement while the specified condition is
true. For example:
10 LET X=X*X WHILE X<1E6
is equivalent to:
10 IF X>=1E6 GO TO 30
20 LET X=X*X
The WHILE modifier operates usefully only in iterative loops where the logical
loop structure modifies the values which determine loop termination. This is a
significant departure from FOR loops, in which the control variable is
automatically iterated; a WHILE statement need not have a formal control
variable. The following statements never terminate properly:
10 X=X+1 WHILE I<1000
20 PRINT I,A(I) WHILE A(I)<>0
In both cases, the program fails to alter the values which are used to determine
when the loop is done. A successful application of the WHILE modifier is shown
below:
10' TEST OF SQUARE ROOT ROUTINE
20 X=X+1 WHILE X=SQR(X*X) AND X<1.E6
30 PRINT X
5) The UNTIL Statement Modifier
The form:
<ln> <statement> UNTIL <condition>
is used to execute the statement repeatedly until the condition becomes true;
which is to say, while the condition is false. For example:
10 X=X+1 UNTIL X<>SQR(X*X) OR X>=1.E6
is the same as
10 X=X+1
20 IF X=SQR(X*X) AND X<1.E6 THEN 10
University of Pennsylvania Medical School BASIC Page 10
BASIC Statements
6) Multiple Statement Modifiers
More than one modifier can be used in a single statement. Multiple
modifiers are processed form right to left. For example:
10 LET A=B IF A>0 IF B>0
which is equivalent to:
10 IF B>0 THEN IF A>0 THEN A=B
or
10 IF B>0 AND A>0 THEN LET A=B
A matrix (M by N) can be read one row at a time as follows:
50 READ A(I,J) FOR J=1 TO M FOR I = 1 TO N
G) Relational and Logical Expressions
Variables and constants may be combined with relational and logical
operators in addition to arithmetic operators to form expressions. Unless
otherwise stated in the documentation, logical and relational expressions may be
substituted wherever an arithmetic expression is legal. In the absence of
parentheses, the following precedence of operators will be followed:
1) exponentiation
2) unary minus
3) multiplication and division
4) addition and subtraction
5) relational operators
<,<=,>,>=,=,<>
6) NOT
7) AND,OR(IOR),XOR,IMP,EQV
The logical operators are as follows:
University of Pennsylvania Medical School BASIC Page 11
BASIC Statements
Operator Example Meaning
NOT NOT A The logical negative of A.
If A is true, NOT A is false.
AND A AND B The logical product of A and B.
A AND B is true only if both
A and B are true, otherwise, false.
OR A OR B The logical sum of A and B.
or IOR A OR B has the value true if either
A or B is true, otherwise, false.
XOR A XOR B The logical exclusive or of A and B.
A XOR B is true if either A or B is
true but not both, otherwise, false.
IMP A IMP B The logical implication of A and B.
A IMP B is false if and only if
A is true and B is false.
EQV A EQV B A is logically equivalent to B.
A EQV B has the value true if
A and B are both true or both false.
There is one special restriction on the use of logical expressions: a
construct of the form F OR <expression> may not appear in a context, e.g. as an
element of a PRINT list, where a FOR modifier would be valid. Furthermore it
should be noted that the ambiguous expression PI OR X is given the more
reasonable interpretation P IOR X.
H) Two-dimensional String Arrays
Two-dimensional string arrays are now permitted in BASIC. They are handled
in the same manner as one-dimensional string arrays. All string functions and
operations are legal.
I) Virtual Data Storage
Some applications may require more core memory for data storage than is
economically feasible. BASIC addresses this need with a simple random-access
file system called virtual core.
The BASIC virtual core system provides a mechanism for the programmer to
specify that a particular data array is not to be stored in the computer core
memory, but within the PDP-10 disk file system instead. Data stored in disk
files external to the user program remain, even after the user leaves his
terminal, and can be retrieved by name at a later session. Items within the
file are individually addressable, as are items within core arrays. In fact, it
is the similar way in which data are treated in both core and these
random-access files which leads to the name virtual core.
University of Pennsylvania Medical School BASIC Page 12
BASIC Statements
With virtual data storage, the user can reference any element of one or
more arrays within the file, no matter where in the file that element resides.
This random access of data allows the user non-sequential referencing of the
data for use in any BASIC statement. The virtual core arrays are read into
memory automatically by the system.
1) Virtual Core DIM Statement
In order for an array of data to exist in virtual core, it must be declared
in a special form of the DIM statement. This special DIM statement is as
follows:
<ln> DIM#<integer constant>,<list>
where the integer constant is between 1 and 9 and corresponds to the internal
file designator on which the program has opened a disk file. The variable list
appears as it would in a DIM statement for a core-resident array. Thus, a 100
by 100 matrix could be defined as:
10 DIM #1, A(100,100)
Numbers and strings can be stored in virtual core arrays. More than one array
can be specified in one virtual core field. For example:
25 DIM #1,A(1000), B(100,100), C$(2500)
allocates space for 1001 numbers for A, 10201 numbers for B, and 2501 character
strings (each 16 characters long) for C$. However, if a virtual array is
defined in this fashion, future references should always dimension the arrays to
the same size.
2) Virtual Core String Storage
One of the few differences in data handling between core and disk arrays
occurs in the storage of strings within string arrays in virtual core. Strings
in the computer memory are of variable length from 0 to a maximum of 132
characters. Strings in virtual core arrays are of fixed length from 0
characters to a maximum of 128 characters. This fixed length can be defined by
the program. The system forces the maximum length to be a power of 2; i.e. one
of the following lengths:
2,4,8,16,32,64,128
Each element in the virtual core string need not use the maximum length
available, even though space is reserved for each element to be the maximum
size. If the user indicates other than one of the values above, he receives the
next higher size. thus:
10 DIM #1,X$(10)=65
is equivalent to:
10 DIM #1,X$(10)=128
University of Pennsylvania Medical School BASIC Page 13
BASIC Statements
If no length is specified, a default length of 16 characters is assumed. The
maximum length of virtual core strings is specified as an expression in the DIM
statement, using the form:
<ln> DIM #<integer const.>,<string(dim(s))>=<integer const.>
For example:
15 DIM #1,A$(100)=32,B$(100)=4,C$(100)
where A$ consists of 101 strings of 32 characters each, maximum, B$ consists of
101 strings of 4 characters each, maximum, and C$ consists of 101 strings of 16
characters each, maximum.
If a length attribute is given in a DIM statement for an in-core string
array, an error will be given.
3) Opening a Virtual Core File
In order for the user to reference his virtual core file, he must first
associate a disk file (by name) with an internal channel designator from 1 to 9
(which is then used in the virtual DIM declaration). This is done with an OPEN,
OPEN FOR INPUT, or OPEN FOR OUTPUT statement:
<ln> OPEN <string> (FOR INPUT ) AS FILE @<expression>
(FOR OUTPUT)
where the string is the name of a disk file and the expression specifies an
internal file designator. The @ sign specifies the type for a virtual core disk
file.
4) Virtual Core Programming Convention
Recoverable errors occur when using virtual core if the user program does
any of the following:
1) References a virtual core array without first
opening the file.
2) Exceeds virtual core, that is defines an array
that is greater than the disk storage quota
allocated to them.
3) Attempts to read or write to the virtual array
disk file.
University of Pennsylvania Medical School BASIC Page 14
BASIC Statements
5) Using the Virtual Array Facility
The BASIC virtual array facility provides the means for a BASIC program to
operate on data structures that are too large to be accommodated in core at one
time. To accomplish this, BASIC uses the disk file system for storage of data
arrays, and only maintains portions of these files in core at any given time.
All references to virtual arrays are ultimately located via file addresses
relative to the start of the file. No symbolic information concerning array
names, dimensions, or data types is stored within the file. Thus, different
programs may use different array names to refer to the data contained within a
single virtual array file. The user must be cautious in such operations, since
it is his (or her) responsibility to ensure that all programs referencing a
given set of virtual arrays are referencing the same data.
Within a single BASIC program, it is possible to open the same virtual core
array file twice on the same channel for the purpose of reallocating the data
within the file. For example:
145 OPEN "DATA" FOR INPUT AS FILE @1
150 DIM#1, A$(10)=4
155 DIM#1, B$(4)=16
The program now has access to the file DATA through both the array A$ and the
array B$. Each element of B$ contains four elements of A$ (B$(0) is equivalent
to the elements A$(0) through A$(3), etc.). Note that the file is open for
input only and that the two DIM# statements reference that file on a single
channel number (#1 in this case).
Note also that the two statements
75 DIM#1,A(10)
80 DIM#1,B(10)
are not equivalent to the statement;
90 DIM#1,A(10),B(10)
In the first case the arrays A and B are equivalent to each other and constitute
the first array in the file open on channel 1. In the second case the arrays A
and B are defined as both existing sequentially in the file open on channel 1.
User programs may define two-dimensional virtual arrays as well as singly
dimensioned ones. Two-dimensional arrays are stored on disk (and in core)
linearly, row-by-row. Thus, in the case of a matrix X(1,2), the array appears
physically as:
X(0,0) lowest address
X(0,1)
X(0,2)
X(1,0)
X(1,1)
X(1,2) highest address
University of Pennsylvania Medical School BASIC Page 15
BASIC Statements
The user should keep in mind that in BASIC, as in most BASICs, array subscripts
begin with 0, not 1. An array with dimension n, or (n,m) actually contains n+1,
or [(n+1)*(m+1)] elements.
If a virtual array is to be referenced sequentially, it is usually
preferable to reference the rows, rather than the columns, in sequence since
there will be fewer disk accesses.
Virtual core arrays are stored on disk in blocks, each of which may contain
maximally 128 pieces of numeric data or 512 characters of string information.
It is permissible to have two (or more) arrays sharing the same file. That is,
the following DIM# statement is perfectly legal:
100 DIM#1,Z(1000),B(999),C(1000)
The array B begins immediately after the 1001st element of Z and C(0) is placed
immediately after B(999). There is, however, an exception to this rule. When
the type of the array changes (from numeric to string or string to numeric) a
new block will be started. Also, if one string array follows another, a new
block will be started if an element of it would otherwise be split across a
block boundary. Consider the following case:
10 DIM#1, A$(24)=16,B$(100)=64
The first 400 characters (25*16) are allocated to A$. If the array B$ were to
begin immediately after A$, one of the elements of B$ (B$(1)) would cross a
block boundary (i.e. after B$(0) is stored, there are only 48 characters left in
the block). Hence, B$ begins at the start of the second block in the file
rather than immediately after A$.
The dimensions indicated in a DIM# statement set maximum allowable values
for subscripts, but do not define the size of the file set up. Instead the file
is expanded as elements of the arrays are used or changed. Thus a user may
specify dimensions as great as may ever be needed without inefficiency.
NOTE - No matrix functions (ZER, INV, etc.) are implemented for virtual
arrays as of this version. They may, however, be implemented at a later date.
J) ON ERROR GOTO Statement
Certain errors can be detected by BASIC while executing a user program.
These errors fall into two broad areas: computational errors (such as division
by 0) and I/O errors (such as attempting to read a non-existent file). Normally
the occurrence of any of these errors causes termination of the user program
execution and the printing of a diagnostic message.
Some applications may require the continued execution of a user program
after an error occurs. In these situations, the user can execute an ON ERROR
GOTO statement within his program. This statement tells BASIC that a user
subroutine exists, beginning at the specified line number, which will analyze
any I/O or computational error encountered in the program and possibly attempt
to recover from that error.
University of Pennsylvania Medical School BASIC Page 16
BASIC Statements
The format of the ON ERROR GOTO statement is as follows:
<ln> ON ERROR GOTO (<line number>)
This statement is placed in the program prior to any executable statements with
which the error handling routine deals. If an error does occur, user program
execution is interrupted and the user-written error subroutine is started at the
line number indicated. The variable ERR, available to the program, assumes one
of the values listed below.
User Recoverable Errors
(*) indicates that program execution continues, following printing of the
error message, if an ON ERROR GOTO statement is not present. Otherwise,
execution terminates and the system prints the READY message.
1 internal error within BASIC or monitor error
2 illegal filename format
3 file opened on more than one channel
4 cannot enter file for output
5 cannot lookup file for input
6 out of static list space for string manipulations
7 string record or formula length < 1 or > 132
8 end-of-file
9 attempt to reference a file that was never established
10 broad class of input/output errors
18 SET argument is out of bounds
27 subroutine or function calls itself
28 line number is out of bounds
31 RETURN before GOSUB
32 mixed random access and sequential
35 output item too long for list
36 cannot erase file on specified channel
37 file not found by RESTORE command
38 input line too long
41 mixed strings and numbers
42 no fields in image
46 illegal channel number
*50 input data not in correct form
*53 attempt to take log of zero or negative number
*54 attempt to take square root of negative number
*56 singular matrix inverted
57 out of data
58 ON evaluated out of range
60 no more core available
*61 division by zero
70 attempt to output a number to a string field or vice versa
71 output line more than 132 characters
72 no character in image
73 more than 132 characters in image
74 exponent requested for * or $ field
University of Pennsylvania Medical School BASIC Page 17
BASIC Statements
75 attempt to output negative number to an * or $ field
76 MARGIN is too small
77 MARGIN is out of bounds
78 PAGE length is out of bounds
79 I/O to file opened as a plot file
80 attempt to write a line number > 99999
81 impossible vector length
82 illegal character seen on input
83 string size exceeded for virtual array
84 DIMENSION error
85 CHR$ argument out of bounds
86 INSTR argument out of bounds
87 LEFT$ argument out of bounds
88 MID$ argument out of bounds
89 RIGHT$ argument out of bounds
90 SPACE$ argument out of bounds
91 VAL argument not in correct form
*92 arithmetic overflow
*93 arithmetic underflow
*94 too many elements in MAT INPUT
*95 over or underflow occurred during MAT INV
*96 magnitude of SIN or COS arg too large to be significant
*97 TAN of PI/2 or COTAN or zero
*98 underflow in integer exp.
*99 overflow in integer exp.
*100 underflow in floating exp.
*101 overflow in floating exp.
*102 zero to a negative power
*103 negative value raised to fractional power
When an error is encountered in a user program, BASIC checks to see if the
program has executed the ON ERROR GOTO statement. If this is not the case, then
a message is printed at the user's terminal and the programs proceeds (if the
error does not cause execution to terminate). If the ON ERROR GOTO statement
was executed previously, then execution continues at the specified line number
where the program can test the variables ERR and ERL to discover precisely what
error occurred and decide what action is to be taken.
There is one error condition that causes program termination regardless of
the execution of ON ERROR GOTO with the message: Too many FN's, GOSUB's or error
traps. This is most often caused by incorrect use or absence of the RESUME
statement.
K) RESUME Statement
After the problem is corrected (if this is both possible and desired by the
programmer), execution of the user program can be resumed through use of the
RESUME statement (which is placed at the end of the error handling routine, much
like a return statement in a normal subroutine). The RESUME statement causes
the program statement that originally caused the error to be reexecuted. If
execution is to be restarted at some other point within the program (as might be
the case for a non-correctable problem), the new line number can be specified in
University of Pennsylvania Medical School BASIC Page 18
BASIC Statements
the RESUME statement at the end of the error handling routine.
The format of the RESUME statement is as follows:
<ln> RESUME (<line number>)
For example:
2000 RESUME
2001 RESUME 100
The line 2000 restarts the user program at the line in which the error was
detected, and is equivalent to the statement:
2000 RESUME 0
A RESUME or RESUME 0 statement in an error handling routine passes control
to the line containing the statement which caused the error. If the statement
which caused the error is on a multiple statement line, control is passed to the
first statement on the line. Therefore, the first statement on a multiple
statement line with error handling should be the statement which generates the
trappable error. Such placement of the statement prevents logic errors.
Line 2001 above restarts the user program at line 100 (which can be used to
print some terminal message for the particular operation). The RESUME statement
with a line number argument should otherwise be used sparingly, since it can
lead to a variety of subtle error conditions.
A RESUME statement will dismiss the error condition and should always be
included in the error handling routine. A GOTO statement should never be used
to exit from the error routine.
L) Disabling The User Error Handling Routine
If there are portions of the user program in which any errors detected are
to be processed by the system and not by the user program, the error subroutine
can be disabled by executing the following statement:
<ln> ON ERROR GOTO 0
which returns control of error handling to the system. An equivalent form is:
<ln> ON ERROR GOTO
in which case line 0 is assumed. Executing this statement causes the system to
treat errors as it would if no ON ERROR GOTO <ln> had ever been executed.
Generally, the error handling subroutine should detect and properly handle
only a few different errors; it is useful to have the BASIC system handle other
errors, if they occur. For this reason, BASIC allows the ON ERROR GOTO 0
statement to be executed within the error subroutine itself. Special treatment
is accorded this case, in that the disabling occurs retroactively; the error
University of Pennsylvania Medical School BASIC Page 19
BASIC Statements
which caused entry to the error subroutine is then reported and a message
printed as though no ON ERROR GOTO <ln> statement had been in effect.
As an example of this feature, suppose a user wished only to handle the
case where a file is expected to be on disk and is not found for input.
The program below requests the file name and attempts to read from it.
10 INPUT F$
20 ON ERROR GOTO 100 \ OPEN F$ FOR INPUT AS FILE #1
30 READ #1,I,J
40 .
50 .
.
.
100 'THIS IS THE ERROR HANDLING ROUTINE
110 IF ERR <> 37 THEN ON ERROR GOTO 0 'FILE NOT FOUND ERROR ONLY
120 PRINT F$;" WAS NOT FOUND, IS THERE ANOTHER";
130 INPUT A$
140 IF A$ = "N" THEN STOP
150 INPUT "NEW FILE NAME";F$
160 RESUME
170 END
In this example, if the call to the error subroutine was caused by some
error other than the file not found error, the program would exit via the ON
ERROR GOTO 0 in line 110. This permits an appropriate error message to be
printed on the user's terminal.
M) The ERL Variable
It is sometimes useful to be able to recognize the line number at which an
error occurred. Following an error detection, the integer variable ERL contains
the line number of the error.
ERL would be used, for example, to indicate which of several INPUT
statements caused an error.
The ERL variable should not be tested against a constant for equality,
since resequencing the program could change the number of the line causing the
error. Instead the LL function (see below) should be used.
N) The PAUSE and PLOT Statements
The PAUSE and PLOT statements are used exclusively in connection with
graphical output, see below under BASIC Plotting Package.
University of Pennsylvania Medical School BASIC Page 20
BASIC Statements
O) The FOR Statement
The FOR statement may be terminated by WHILE <expression> or UNTIL
<expression> instead of TO <expression>.
P) The WHILE and UNTIL Statements
Loops may be initiated by the statements WHILE <expression> or UNTIL
<expression>. Such loops operate exactly as FOR loops, except that there is no
variable incremented for each execution of the loop. They are terminated by the
NEXT statement with no argument.
University of Pennsylvania Medical School BASIC Page 21
New Functions
New Functions
The following new functions have been added to the list of BASIC Library
routines.
A) TIME$
Returns an eight character string representing the 24-hour time of day
as HH:MM:SS.
B) DATE$
Returns a nine character string representing the current date as
DD-MON-YY.
C) ASCII(S$)
Generates the ASCII value of the first character contained in the
string S$. i.e. ASCII("XAB")=88.
D) FIX(N)
Returns the truncated value of X (SGN(X)*INT(ABS(X)). i.e.
FIX(-.5)=0.
E) LINE
Returns the current line number of the statement being executed or the
line number of the statement last executed when ^C (control-C) interruption
occurred. (useful in BASDDT)
F) LL(<constant>)
Returns the value of its argument, which must be an ambiguous constant
equal to a line number in the program. This argument is recognised as a
line number by the RESEQUENCE command.
G) NUM$(N)
Indicates a string of numeric characters representing the value of N
as it would be output by a PRINT statement. NUM$(N)=(SPACE)N(SPACE) FOR N
>= 0 NUM$(N)=-N(SPACE) FOR N < 0
University of Pennsylvania Medical School BASIC Page 22
New Functions
H) PI
Constant value of PI (3.1415927)
I) POS(N)
Returns current position on the output line. N is the I/O channel
number. POS(0) returns the value for the user's teletype.
J) CRT(I%)
If I% is non-zero, the ASCII characters with decimal values 10-13 are
legal within strings, if it is zero, they are not. The value returned by
the CRT function is the argument with which it was last called, or zero if
it has not been called before. Note that a CRT(1%) must be executed before
using the BASIC plotting package (see below) to allow the control
characters required for screen functions on the Tektronix-4010 to be sent.
K) DAY$
Returns a string containing the day of the week, spelled out in full.
L) ECHO(I%)
If I% is non-zero, the teletype echo is turned off, if it is zero, the
echo is turned on again. The value returned is either 1% or 0%, according
to whether the echo had been turned off or on respectively by the previous
call. The echo is always turned on again when the program ends execution
or is aborted.
M) SLEEP(I%)
Causes the program to suspend execution for I% seconds, or until a
line is typed on the terminal. If the suspension is ended by a time-out, a
value of 0% is returned, if by terminal input, -1% is returned. This
function can be used to check if anything has been typed, using an argument
of 0%, or, for example, to prompt students using an educational program.
University of Pennsylvania Medical School BASIC Page 23
Edit Level Commands
Edit Level Commands
A) SAVFIL(NL)
These commands, followed by an optional file name, create compact core
images of BASIC programs on the disk. The source code is deleted from these
files, so for large programs, they occupy substantially less memory than the
code produced by the RUN or RUNNH commands. Since they are already compiled,
their execution does not carry the overhead of compilation for each run. The
SAVFILNL command differs from the SAVFIL command in that the line number tables
are also deleted. This results in a further saving of memory at the expense of
deleting line numbers from any execution-time error message. The files created
by these commands are given the name specified, if any, or else the name of the
current program. They are always given the extension .SAV, thus eliminating any
conflict with .BAS files. Their extension must be given explicitly to delete
them with the UNSAVE command.
Since line number information is deleted from .SAV files created by the
SAVFILNL command the statements RESUME and ON ERROR GOTO without arguments and
CHAIN with a line number argument are illegal in them.
B) RUNSAV
This command, followed by a file name, runs the .SAV file of that name
created by the SAVFIL(NL) command. It is not possible to start the program at
other than the first line. The CHAIN statement with a line number argument is
regarded as a syntax error in creating a .SAV file. The CHAIN statement
executed from a .SAV file requires a .SAV file to be chained. It is therefore
unnecessary to specify the file extension. Since the source code is deleted
from .SAV files, a new session is begun after the execution of any of these
commands. The .SAV files produced are normal .SAV files which can be run from
the Monitor by use of the RUN command. However, return is to the Monitor level
instead of BASIC Edit level. With new versions of BASIC, .SAV files may become
obsolete. If this is the case, a warning message to resave soon will be given
when the .SAV file is run. Please heed the warning.
C) RUNFSAV
This command is similar to the RUNSAV command except that the .SAV file is
assumed to be created by the Monitor SAVE command. Exit from the program is
always to Monitor level.
University of Pennsylvania Medical School BASIC Page 24
Edit Level Commands
D) DDT(NH)
This command calls for the BASIC debugger to be included as part of the
execution routine along with your BASIC program. Refer to the section on BASDDT
for use of the debugger.
E) GENERATE (NN)(,(MM))(,(LL))
This command will generate line sequence numbers for input from the
teletype. NN is the starting value, MM is the maximum number, and LL is the
increment. If NN or LL is omitted, they will default to 10. If MM is omitted,
99999 will be the maximum. Therefore, if no arguments are given, they will be
10,99999,10. If NN is greater than LL, only one line sequence number will be
generated. To prematurely end the generation of line sequence numbers, the
ALTmode or ESCape character (echoed as $) is typed on the line followed by a
RETURN. Normally the GENERATE command automatically inserts a blank at the
beginning of each line. To suppress this feature the GENERATE NO BLANK or GEN
NOB command can be substituted. For example:
READY
GEN 10,,40
10 LET A=1
20 LET B=23
30 LET C=PI/2
40 FOR J = 1 TO 10
READY
GEN 60
60 D=SIN(J*C)
70 PRINT D
80 NEXT J
90$
READY
F) SYNTAX
This command will cause each line of input to be automatically syntax
checked upon being entered. It will not check for logic errors, but merely
guarantee that the statement entered is grammatically correct. SYNTAX is the
default state upon entering BASIC. The statement will be entered into the
source text regardless of the outcome of the syntax check. SYNTAX may be
combined with GENERATE, however, a new line sequence number will always be
generated. For example:
University of Pennsylvania Medical School BASIC Page 25
Edit Level Commands
READY
10 LET K=1
20 FOR J = 1 TO 1O
? ILLEGAL "FOR" USE (An O was typed instead of a 0)
20 FOR J=1 TO 10 (User corrects the syntax error)
30 LET K=K+J^2
40 NEXT K (Notice that this is a logical
error and cannot be detected)
50 PRINT K
60 END
RUNNH
? NEXT WITHOUT FOR IN LINE 40
? FOR WITHOUT NEXT IN LINE 20
READY
40 NEST J (NEXT was misspelled)
? ILLEGAL STATEMENT KEYWORD
40 NEXT J
RUNNH
386
READY
G) NOSYNTAX
This command turns off the automatic syntax checking of the input line. It
must be used when creating a BASIC data file from Edit level.
H) CATALOG
Two switches have been added to the CATALOG command, /FAST and /PROTECTION.
/FAST will give the directory with four filename.ext per line. /PROTECTION will
print the protection code following the file to which it applies. The switches
may be abbreviated to as few as one character. For example:
University of Pennsylvania Medical School BASIC Page 26
Edit Level Commands
READY
CATALOG/FAS
TEST .BAS TEST1 .BAS STAR .TRK DATA .BAS
SWITCH.INI
READY
CAT/PROTECTION
TEST .BAS<155>
TEST1 .BAS<155>
STAR .TRK<157>
DATA .BAS<055>
SWITCH.INI<055>
READY
I) CREF
The CREF command gives a cross reference listing on the line printer. The
file will be queued to the printer after the CREF command is given.
There is one switch implemented for the CREF command. /TTY will cause the
cross reference listing to come out on the user's terminal.
J) PPN Specification
In all commands and statements referencing files, except QUEUE,
project-programmer numbers can be specified in the usual format following the
file name - [project no.,programmer no.].
University of Pennsylvania Medical School BASIC Page 27
BASIC Debugger
BASIC Debugger
This is a new release of the BASIC debugging technique (BASDDT). Most
BASIC statements are now included. BASDDT occupies its own high segment (11k)
and in no way affects running programs when not used.
A) BASDDT Control Commands
There are six BASDDT control commands. These commands may be abbreviated
to the first three characters. As the name implies, they control the action of
BASDDT. The BASDDT control commands may not be used in multiple statement
lines, nor may they be used in conjunction with BASDDT statements, they are
intended only for single, immediate action.
1) START N (Where N is an optional line number)
This command initializes BASDDT and must be used to begin execution of
the program. Prior to the START command, only BASDDT control commands
(with the exception of CONTINUE) are legal. When BASDDT is invoked
with the edit command DDT(NH), BASDDT will respond with:
[BASDDT EXECUTION]
>
after compilation of the program. At this point, it is ready to
receive and process commands. Whenever the right angle bracket
appears, BASDDT is waiting for input of a command or statement. When
the user is ready to begin execution of the program (i.e. after
setting stops), he should issue the START command. The program will
optionally begin 1) at the line number specified in the start command,
if one was included, 2) at the line number specified in the DDT(NH)
command or 3) at the first executable statement.
2) STOP N(,M,L...) (where N,M,L... are line numbers)
Execution of the BASIC program may be suspended at various line
numbers throughout the program through use of the STOP command. STOP
takes as its argument a list of line numbers separated by commas. The
line numbers must exist in the user program. There is no limit to the
number of stops a user may have. Setting stops at non-executable
statements will cause a stop at the next executable statement. When a
stop is reached, BASDDT will inform the user at which line the stop
occurred. The stop will occur prior to execution of that line number.
Example:
University of Pennsylvania Medical School BASIC Page 28
BASIC Debugger
>STOP 90
>START
<STOP># 90
>
3) CONTINUE N (where N is an optional line number)
CONTINUE is used to proceed from a stop. If N is specified,
control will go to that line number. However, unlike the BASDDT GOTO
statement, CONTINUE is an unconditional transfer. As such, CONTINUE
with an argument should be used sparingly and with care. Example:
>STOP 90,50,150
>START
<STOP># 50
>CONT
<STOP># 90
4) LIST
LIST (takes no arguments) will print on the user's teletype a
list of all program stops. Example:
>LIST
STOPS: 50 90 150
>
5) REMOVE N(,M,L,...) (where N,M,L,.. are line numbers)
REMOVE is used to remove a previously placed stop in the user's
program. If no argument is specified, all stops are removed.
Removing a non-existent stop is considered a no-op. Example:
>LIST
STOPS: 50 90 150
>REMOVE 90
>LIST
STOPS: 50 150
6) DECLARE V1(,V2,V3,V4,V5) (where V1-V5 are variable names)
For your convenience, five scalar locations have been reserved to
use as an aid to debugging. Before they can be referenced, they must
be assigned a legal BASIC scalar name through use of the DECLARE
command. Once a variable name has been declared, it cannot be
removed. Example:
University of Pennsylvania Medical School BASIC Page 29
BASIC Debugger
>DECLARE T1,T4
>LET T1=5 \ T4=1
>PRINT T1;T4
5 1
>
B) BASDDT Statements
The following statements cause a specific action to occur.
Except where noted, they are exactly alike in nature to the normal
BASIC statement except that they are executed immediately. Multiple
statement lines and multiple line statements are also legal in BASDDT.
Two backslashes in BASDDT are used to end control of an IF-THEN or
IF-THEN-ELSE. Example:
>IF A = B THEN C=1 \ B=2 \ D=4
In this case, if A does not equal B, no statements will be executed.
However, in the following example:
>IF A = B THEN C=1 \\ B=2 \ D = 4
B=2 and D=4 will be executed regardless of the outcome of IF A = B.
Statement Available BASIC-BASDDT difference
DATA no
READ yes none
PRINT yes none
LET yes none
GOTO yes none
IF-THEN yes use of two backslashes
IF-THEN-ELSE yes use of two backslashes
FOR-NEXT yes none
ON-ERROR no
ON-GOTO yes none
ON-GOSUB yes none
DIM no
END yes exits to edit mode with runtime message
GOSUB yes none
INPUT yes none
STOP no BASDDT control command
REM no BASDDT control command for REMOVE
RESUME yes none
RESTORE yes none
CHANGE yes none
CHAIN yes chained program will also have BASDDT
MARGIN yes none
PAGE yes none
NOPAGE yes none
QUOTE yes none
University of Pennsylvania Medical School BASIC Page 30
BASIC Debugger
NOQUOTE yes none
PRINT USING yes none
FILES no
FILE no use OPEN instead
OPEN yes none
CLOSE yes none
SCRATCH yes none
WRITE yes none
IF END yes none
SET yes none
PAUSE no
PLOT no
All matrix instructions and functions are implemented.
All statement modifiers are implemented.
In addition, the BASDDT statement, BASDDT, has been added. It will transfer
control to BASDDT input level. Example:
>FOR I = 1 TO 10 \ IF X2 > 30 THEN BASDDT \ X2=X2+X1^2 \ NEXT I
>PRINT X2,I
31 8
>
C) Control-C
The control-C (^C) has different actions depending upon where it is given.
At the input level (i.e. when the right angle bracket is displayed), a control-C
causes an immediate return to edit level with no runtime message printed. When
the control-C is given during the execution of the user's program or BASDDT
statments, control will return to BASDDT input level. The LINE function can be
used to determine where control was interrupted. Example
>CONT
^C
^C
>PRINT LINE
50
Warning- - -the statement being executed may be interrupted before completion
and partial answers may occur. The continue command without a line number is
illegal after a control-C.
University of Pennsylvania Medical School BASIC Page 31
BASIC Debugger
D) Execution Errors
Any program execution errors result in a return to BASDDT input level after the
printing of the message. Thereafter the continue command without a line number
is illegal.
University of Pennsylvania Medical School BASIC Page 32
BASIC Plotting Package
BASIC Plotting Package
Graphical output on the Tektronix-4010-1 can now be done in BASIC. The
Tektronix-4010-1 has a grid size of 780 vertical points and 1024 horizontal
points. All coordinates greater than the above will be truncated to these
values.
There are two types of positioning on the Tektronix-4010-1. The
alphanumeric cursor which represents the point at which alphanumeric output will
begin and the "pen" position which represents the point at which graphing will
begin. BASIC PRINT statements modify the alphanumeric cursor but will not
affect the "pen" position. Using the BASIC PLOT functions will modify the "pen"
postion and also move the position of the alphanumeric cursor to the "pen"
position at the end of the graphing movement. An alphanumeric character is 14
vertical positions by 10 horizontal positions.
All coordinate arguments in the following definitions are screen
coordinates relative to users origin. All scaling must be done by the user.
The form:
<ln> PLOT F1 (,F2,F3,....)
where Fn represents one of the following eight functions.
1) INIT
This call initializes internal plotting parameters. It also sets
the "pen" to the lower left hand corner and defines this point as the
origin (0,0). INIT should be the first PLOT call in the program,
unexpected results may occur otherwise.
2) PAGE
This call erases the screen and moves the alphanumeric cursor to
the upper left hand corner. It does not affect the position of the
"pen".
3) LINE(X,Y,I)
This call will move the "pen" position to the coordinates (X,Y).
If I is greater than 0 (I>0), the movement will be made with the "pen"
down (that is to say a line will be drawn). If I is less than or
equal to 0 (I<=0), the movement will be made with the "pen" up.
University of Pennsylvania Medical School BASIC Page 33
BASIC Plotting Package
4) ORIGIN(X,Y)
This call will move the "pen" position to (X,Y) and define it as
(0,0).
5) STRING(X,Y,<string expression>)
This call will output the <string expression> with the lower left
hand corner of the first character beginning at (X,Y). The "pen"
position will be left at the lower right hand corner of the last
character typed.
6) WHERE(X,Y)
This call will return the coordinates of the "pen" position in
(X,Y) relative to the users origin. For example, if the origin was
defined at absolute screen coordinates (500,500) and the "pen"
position was at absolute screen coordinates (600,50), coordinates
(100,-450) would be returned.
7) CURSOR(X,Y,Z)
This call causes the cross-hairs to be displayed on the screen.
After typing any alphanumeric character, the cross-hair coordinates,
relative to the users origin, are returned in (X,Y), and the decimal
representation of the typed character is returned in Z.
8) SAVE(N)
This call causes the graphical output saved on disk in a file on
channel number N to be plotted.
In order to suspend program execution so that a hard copy may be made of
the screen, the PAUSE statement (with no arguments) has been added. Its purpose
is merely to pause until any printing keyboard character is typed.
Below is a sample program which will plot a sine and cosine curve.
100 PRINT "STEP IN FRACTION OF PI" 'ASK FOR STEPPING FACTOR
110 INPUT J2 'GET THE STEP
120 LET J1=200/J2 'CONVERT TO SCREEN COORDINATES
130 PLOT INIT,PAGE 'INITIALIZE FOR PLOTTING
135 'AND CLEAR THE SCREEN
140 PLOT STRING(0,700,"COSINE ") 'PRINT LABEL FOR COSINE CURVE
150 PLOT WHERE(X,Y) 'SAVE POSITION OF LINE FOR SINE CURVE
160 PLOT LINE (250,700,1) 'DRAW SOLID LINE FOR COSINE CURVE
170 PLOT STRING(0,675,"SINE ") 'PRINT LABEL FOR SINE CURVE
180 PLOT LINE (X,675,0) 'MOVE PEN BELOW COSINE LINE
190 REM DRAW DASHED LINE TO LABEL SINE CURVE USING
200 REM STEPPING FACTOR
210 N=1 'BEGIN WITH PEN DOWN
220 FOR R2=X+J1 TO 250 STEP J1 'ARGUMENTS FOR DASHED LINE
University of Pennsylvania Medical School BASIC Page 34
BASIC Plotting Package
230 PLOT LINE (R2,675,N) 'DRAW OR MOVE THE PEN POSITION
240 N=N+1 \ IF N>1 THEN N=0 'IF PEN WAS UP, MAKE IT DOWN
250 'AND VICE VERSA
260 NEXT R2 'LOOP THROUGH POINTS
270 PLOT ORIGIN (0,400) 'DECLARE ORIGIN
280 REM
290 REM DRAW THE AXIS
300 REM
310 PLOT LINE (0,-200,0),LINE(0,200,1) 'Y-AXIS 400 POINTS
320 PLOT LINE (1000,0,0),LINE (0,0,1) 'X-AXIS 1000 POINTS
330 PLOT LINE (0,COS(0)*100,0) 'MOVE WITH PEN UP TO FIRST POINT
340 FOR R2=J1 TO 1000 STEP J1 'DRAW COSSINE CURVE
350 Y=COS(PI/200*R2)*100 'CALCULATE Y POSTION
360 PLOT LINE (R2,Y,1) 'DRAW THE LINE
370 NEXT R2 'DO ALL THE POINTS
380 PLOT LINE (0,SIN(0)*100,0) 'POINT TO FIRST SINE POSITION
390 N=1 'UP-DOWN DASH LINE INDICATOR,
395 'START AT DOWN
400 FOR R2=J1 TO 1000 STEP J1 'DRAW DASHED SINE CURVE
410 Y=SIN(PI/200*R2)*100 'CALCULATE Y POSITION
420 PLOT LINE (R2,Y,N) 'DRAW OR MOVE THE PEN
430 N=N+1 \ IF N>1 THEN N=0 'IF PEN UP, MAKE DOWN
440 NEXT R2 'DO ALL POINTS
450 PLOT ORIGIN (0,-250) 'NEW ORIGIN FOR LABELLING
460 FOR J=0 TO 4 'OUTPUT FIVE "PI" LABELS
465 X=J*200 'CONVERT TO SCREEN COORDINATES
470 IF X=0 THEN PLOT STRING(X,0,"0") '0 PI
480 IF X <>0 THEN PLOT STRING (X,0,STR$(J)+"*PI") 'LABEL PI(S)
490 PLOT LINE (X,240,0),LINE (X,260,1) 'DRAW HASH MARK ON AXIS
500 NEXT J 'GO THRU LOOP
505 PAUSE 'LET HIM MAKE A HARD COPY IF HE WANTS
510 END
Plotting output may be saved on disk and recalled at a later date. To
save plotting output, the OPEN statement of the following form is used:
<ln> OPEN <file spec> FOR OUTPUT AS FILE #N TO PLOT
The file must be opened as a sequential access file. N must be a legal BASIC
channel number. All graphical output (except cursor and string plotting) will
be saved in the file specified until a CLOSE statement is executed or until
the end of the program (whichever comes first). Only one file may be opened
for output plotting at a time. If another file is opened on channel N, the
previous file will be closed.
To recall the file to be plotted on the screen, the OPEN statement of the
following form is used:
<ln> OPEN <file spec> FOR INPUT AS FILE #N TO PLOT
As above, the file must be opened as a sequential access file and N must be a
legal BASIC channel number. This OPEN statement merely associates the file
with a channel for plotting. As many files as there are channel numbers may
University of Pennsylvania Medical School BASIC Page 35
BASIC Plotting Package
be opened at any time. To have the file displayed on the screen, the SAVE(N)
PLOT function is used (where N is a channel number corresponding to the file
opened to plot). The contents of the file will then be displayed. Assuming
the user has already created a plot file, the following example would be used
to display it.
10 OPEN "PLOT.BAS" FOR INPUT AS FILE #1 TO PLOT
20 PLOT INIT,PAGE,SAVE(1)
30 END
University of Pennsylvania Medical School BASIC Page 36
Integer Usage
Integer Usage
Numbers on the system can be represented and manipulated in either integer
or floating point format. The implications of representing numbers in a certain
format and the resultant benefits are described in the following discussion.
Certain operations involving integer numbers are more efficient if performed
using a forced integer format.
A) Integer Constants and Variables
Normally, all numeric values (variables and constants) specified in a BASIC
program are stored internally as floating-point numbers. Integer constants can
assume values in the range -99999999 to +99999999.
A constant, variable or function can be specified as an integer by
terminating its name with the % character. For example:
100% A% FNX%(Y)
-4% A1% FNL%(N%,L%)
The user is expected to indicate where an integer constant is to be generated by
using the % character. Otherwise a floating-point value is normally produced.
When a floating-point value is assigned to an integer variable, the
fractional portion of that number is lost. The number is not rounded to the
nearest value (a FIX function is performed rather than an INT function). For
example:
A%=-1.1
causes A% to be assigned the value -1.
B) Integer Arithmetic
Arithmetic performed with integer variables is performed modulo 2^35. The
number range -34359738368 to +34359738367 is treated as continuous, with the
number after +34359738367 equal to -34359738368.
Integer division forces truncation of any remainder, for example 5%/7%=0%
and 199%/100%=1%. Operations can be performed in which both integer and
floating-point data are freely mixed. The result is stored in the format
indicated as the resulting variable, for example:
25 LET X% = N%+FNA(R)+2
The result of the expression on the right is truncated to provide an integer
value for X%. The result of mixing integer and floating-point data is explained
in section G below.
University of Pennsylvania Medical School BASIC Page 37
Integer Usage
C) Integer I/O
Input and output of integer variables is performed in exactly the same
manner as operations on floating-point variables. (Remember that in cases where
a floating-point variable has an integer value it is automatically printed as an
integer but is still stored internally as a floating-point number). It is
illegal to provide a floating-point value for an integer variable through either
a READ or INPUT statement. For example:
LISTNH
10 READ A,B%,C,D%,E
20 PRINT A,B%,C,D%,E
30 DATA 2.7,3,4,5.7,6.8
40 END
READY
RUNNH
? BAD DATA IN LINE 10
READY
when line 30 is changed to
30 DATA 2.7,3,4,5,6.8
the following is printed:
RUNNH
2.7 3 4 5 6.8
READY
D) User-defined Integer Functions
Functions can be written to handle integer variables as well as
floating-point variables. A function is defined to be of integer type by
following the function name with the % character.
A function to return the remainder when one integer is divided by another
is shown below:
10 DEF FNR%(I%,J%) = I% - J%*(I%/J%)
and could be called later in a program as follows:
100 PRINT FNR%(A%,11%)
University of Pennsylvania Medical School BASIC Page 38
Integer Usage
Integer arguments can not be used where floating-point arguments are
expected and vice versa, if they are an error message will be given at compile
time.
E) Use of Integers as Logical Variables
Integer variables or integer valued expressions can be used in any place
that a logical expression can appear. An integer value of 0% corresponds to the
logical value FALSE, and any non-zero value is defined to be TRUE. The logical
operators (AND, OR(IOR), NOT, XOR, IMP, EQV) operate on logical (or integer)
data in a bitwise manner. The integer -1% (which is represented internally as
thirty-six binary ones) is normally used by the system when a TRUE value is
required.
Logical values generated by BASIC always have the values -1% (TRUE) and 0%
(FALSE). The following statements illustrate the use of integers in logical
applications.
10 IF -1% THEN PRINT "TRUE" ELSE PRINT "FALSE"
20 J%=-1% \ I%=0%
30 PRINT J% AND I%,J% OR I%
40 IF 1<0 XOR -1% THEN PRINT "TRUE" ELSE PRINT "FALSE"
50 A$="ABCDE" \ B$="FGHIJ"
60 K%= A$ <> B$ EQV I% EQV J%
70 PRINT K%
80 END
RUNNH
TRUE
0 -1
TRUE
-1
READY
F) Logical Operation on Integer Data
BASIC permits a user program to combine integer variables or integer valued
expressions using a logical operator to give bit-wise integer results
(operations on floating-points numbers are also permitted, but logical string
operations are not).
In the following truth tables, A represents the condition of one bit in one
integer value, and B represents the condition of the bit in the corresponding
bit position of another integer value. The truth tables are as follows.
University of Pennsylvania Medical School BASIC Page 39
Integer Usage
A B A AND B A B A OR B
1 1 1 1 1 1
1 0 0 1 0 1
0 1 0 0 1 1
0 0 0 0 0 0
A B A XOR B A B A EQV B
1 1 0 1 1 1
1 0 1 1 0 0
0 1 1 0 1 0
0 0 0 0 0 1
A B A IMP B A NOT A
1 1 1 1 0
1 0 0 0 1
0 1 1
0 0 1
The result of a logical operation is an integer value generated by
combining the corresponding bits of two integer values according to the rules as
shown in the truth tables above. For example, the following command prints the
logical product of the integers 85 and 28.
PRINT 85% AND 28%
20
Each bit in the internal representation of 85% is combined with each
corresponding bit in the internal representation of 28% according to the rules
in the AND truth tables. By consulting the AND (logical product) truth table,
it can be seen that a bit is generated in the bit position of the result only if
both bits are 1 in the corresponding bit position of the integer values 85% and
28%. The resultant value of 20 printed by BASIC is the integer value of the
bits set in the internal representation of the logical product.
G) Mixed-mode Arithmetic
The user can perform arithmetic operations using a mix of integer and
floating-point numbers. To force a floating point representation of an integer
constant, terminate it with a decimal point. Use the % character as described
above to force an integer representation of a constant. Constants without a
decimal point or % character are termed ambiguous. The remainder of this
section describes the results of arithmetic operations using a mix of numbers.
University of Pennsylvania Medical School BASIC Page 40
Integer Usage
If both operands of an arithmetic operation are either explicitly integer
or floating-point, the system generates, respectively, integer or floating-point
results. If one operand of an arithmetic operation is an integer and another is
floating-point, the system converts the integer to a floating-point
representation and generates a floating-point result. For example:
PRINT 1%/2%;1./2.;1%/2.;1./2%
0 .5 .5 .5
In the first two operations, the system generates the explicit results; in the
second two, the system converts the explicit integer and generates floating
point results.
When an ambiguous constant appears in an arithmetic expression (for
example, 10 as opposed to 10% or 10.), the system represents it in integer
format if an integer variable (for example, I%) or an integer constant (for
example 3%) occurs anywhere to the left of the constant in the expression.
Otherwise, the system treats the ambiguous constant as a floating point number.
University of Pennsylvania Medical School BASIC Page 41
Index
Index
INDEX
BASDDT . . . . . . . . . . . . . . . . . 27
BASIC Debugger . . . . . . . . . . . . . 27
BASIC Plotting Package . . . . . . . . . 32
CATALOG . . . . . . . . . . . . . . . . 25
CLOSE . . . . . . . . . . . . . . . . . 5
CREF . . . . . . . . . . . . . . . . . . 26
DDT(NH) . . . . . . . . . . . . . . . . 24
Debugging . . . . . . . . . . . . . . . 27
Disabling User Error Handling . . . . . 18
Edit Level Commands . . . . . . . . . . 23
ERL Variable . . . . . . . . . . . . . . 19
ERR Variable . . . . . . . . . . . . . . 16
FOR Statement . . . . . . . . . . . . . 20
GENERATE . . . . . . . . . . . . . . . . 24
Index . . . . . . . . . . . . . . . . . 41
INPUT . . . . . . . . . . . . . . . . . 5
Integer Usage . . . . . . . . . . . . . 36
Logical and Relational Expressions . . . 10
New Functions . . . . . . . . . . . . . 21
NOSYNTAX . . . . . . . . . . . . . . . . 25
ON ERROR GOTO . . . . . . . . . . . . . 15
ON-GOSUB . . . . . . . . . . . . . . . . 5
OPEN . . . . . . . . . . . . . . . . . . 4, 34
Plotting . . . . . . . . . . . . . . . . 22, 32
PPN Specification . . . . . . . . . . . 26
Relational and Logical Expressions . . . 10
RESUME . . . . . . . . . . . . . . . . . 17
RUNFSAV . . . . . . . . . . . . . . . . 23
RUNSAV . . . . . . . . . . . . . . . . . 23
SAVFIL(NL) . . . . . . . . . . . . . . . 23
Statement Modifiers . . . . . . . . . . 6
SYNTAX . . . . . . . . . . . . . . . . . 24
Syntax Changes . . . . . . . . . . . . . 2
Two-dimensional String Arrays . . . . . 11
UNTIL Statement . . . . . . . . . . . . 20
User Error Handling . . . . . . . . . . 15
User-defined String Functions . . . . . 6
Virtual Arrays . . . . . . . . . . . . . 11
Virtual Data Storage . . . . . . . . . . 11
WHILE Statement . . . . . . . . . . . . 20