Chapter
Eight
Execution Boundary Conditions
BASIC Language statements can be divided into groups
with related functions. The execution boundary statements, RUN, STOP, CONT and END,
cause a BASIC program to start or stop executing. The routines which simulate these
statements are XRUN, XSTOP, XCONT, and XEND. Program Termination Routines
Any BASIC statement can be used as either a direct statement or a program statement,
but some only make sense in one mode. The STOP statement has no real meaning when
entered as a direct statement. When the statement simulation routine for STOP is
asked to execute in direct mode, it does as little processing as possible and exits.
Useful processing occurs only when STOP is a program statement. STOP ($B7A7).
The XSTOP and XEND routines are similar and perform some of the same tasks. The tasks
common to both are handled by the STOP routine. If this statement is not a direct
statement, the STOP routine saves the line number of the current line in STOPLN.
This line number is used later for printing the STOPed message. It is also used by
the CONT simulation routine (XCONT) to determine where to restart program execution.
(Since XEND also uses this routine, it is possible to CONTinue after an END statement
in the middle of a program.) The STOP routine also resets the LIST and ENTER devices
to the screen and the keyboard. XSTOP ($B793). XSTOP does the common STOP
processing and then calls :LPRTOKEN($B535) to print the STOPed message. It then calls
one of the error printing routines, :ERRM2 ($B974), to output the AT LINE nnn
portion. The :ERRM2 routine will not print anything if this was a direct statement.
When :ERRM2 is finished, it jumps back to the start of the editor. 71
Chapter
Eight
XEND ($B7SD). XEND calls the STOP routine to save the current
line number. It then transfers to the start of the editor via the SNX1 entry point.
This turns off the sound, closes any open IOCBs, and prints the READY message. XEND
also leaves values on the 6502 CPU stack. These values are thrown away when the editor
resets the stack. END OF PROGRAM. A user may have neglected to include an
END statement in his program. In this case, when Execution Control comes to the end
of the Statement Table it calls XEND, and the program is terminated exactly as if
the last statement in the program were an END. Program Initiation Routines
The statements that cause a user's program to begin execution are RUN and CONT. These
statements are simulated by XRUN and XCONT XCONT ($B7BE). The CONT statement
has no meaning when encountered as a program statement, so its execution has no effect.
When the user enters CONT as a direct statement, XCONT uses the line number that
was saved in STOPLN to set Execution Control's line parameters (STMCUR, NXTSTD, and
LLNGTH). This results in the current line being the line following the one whose
line number is in STOPLN. This means that any statement following STOP or END on
a line will not be executed; therefore, STOP and END should always be the last statement
in the line. If we are at the end of the Statement Table, XCONT terminates as if
an END statement had been encountered in the program. If there are more lines to
process, XCONT returns to Execution Control, which resumes processing at the line
whose address was just put into STMCUR. XRUN ($B74D). The RUN statement comes
in two formats, RUN and RUN <filespec>. In the case of RUN <filespec>,
XRUN executes XLOAD to load a saved program, which replaces the current one in memory.
The process then proceeds like RUN. XRUN sets up Execution Control's line pointers
to indicate the first line in the Statement Table. It clears some flags used to control
various other BASIC statements; for example, it resets STOPLN to O. It closes all
IOCBs and executes XCLR to reset all 72
Chapter
Eight
the variables to zero and get rid of any entries in the String/Array
Table or the Runtime Stack. If there is no program, so the only thing in the Statement
Table is the direct statement, then XRUN does some clean-up, prints READY, and returns
to the start of the editor, which resets the 6502 CPU stack. If there is a program,
XRUN returns to Execution Control, which starts processing the first statement in
the table as the current statement. When RUN <filespec> is used as a program
statement, it performs the useful function of chaining to a new program, but if RUN
alone is used as a program statement, an infinite loop will probably result. Error
Handling Routine There are other conditions besides the execution boundary statements
that terminate a program's execution. The most familiar are errors. There are two
kinds of errors that can occur during execution: Input/Output errors and BASIC language
errors. Any BASIC routine that does I/O calls the IOTEST routine ($BCB3) to check
the outcome of the operation. If an error that needs to be reported to the user is
indicated, IOTEST gets the error number that was returned by the Operating System
and joins the Error Handling Routine, ERROR ($B940), which finishes processing the
error. When a BASIC language error occurs, the error number is generated by the Error
Handling Routine. This routine calculates the error by having an entry point for
every BASIC language error. At each entry point, there is a 6502 instruction that
increments the error number. By the time the main routine, ERROR, is reached, the
error number has been generated. The Error Handling Routine calls STOP ($B7A7) to
save the line number of the line causing the error in STOPLN. It tests TRAPLN to
see if errors are being TRAPed. The TRAP option is on if TRAPLN contains a valid
line number. In this case, the Error Handler does some clean-up and joins XGOTO,
which transfers processing to the desired line. If the high-order byte of the line
number is $80 (not a valid line number), then we are not TRAPing errors. In this
case, the Error Handler prints the four-part error message, which 73
Chapter
Eight
consists of ERROR, the error number, AT LINE, and finally the line
number. If the line in error was a direct statement, the AT LINE part is not printed.
The error handler resets ERRNUM to zero and is finished. The Error Handling Routine
does not do an orderly return, but jumps back to the start of the editor at the SYNTAX
entry point where the 6502 stack is reset, clearing it of the now- unwanted return
addresses. 74
<-Chapter
07Chapter 09->