
In the Turbo course a program that went wrong while it ran printed Run-time error and a number, and Turbo took you to the place. HiSoft Pascal prints a message in words and an address, and leaves the finding to you. And the Turbo course taught you that a runaway loop could only be stopped if you had compiled it with {$U+}. In HiSoft Pascal it is the other way round - and that turns out to matter more than you would think.
When something goes wrong in a running program, it stops with one line and returns to 0::
| Message | What happened |
|---|---|
Overflow at PC=0E98 | An integer sum went past 32767 (S6) |
/ by Zero at PC=0EC2 | DIV or MOD by zero - an error here, unlike Turbo |
Index too High at PC=0F36 | An array index past the top of its range |
Out of RAM at PC=0E7D | The program ran out of memory - usually a procedure calling itself without end |
Number expected at PC=1016 | A READ of a number met something else (S9) |
Halt at PC=0EA5 | You pressed CTRL-C |
The address after PC= is where in the program it stopped. It is the same kind of address the compiler's listing gives at the start of each line - so the listing tells you the line. Find the last line whose address is not more than the one in the message.
For example, with this in the listing:
0EA8 70 WRITELN(I DIV (I-5))
0ECB 80 END
/ by Zero at PC=0EC2 is in line 70: 0EC2 comes after 0EA8 and before 0ECB. The addresses are hexadecimal, but they only need comparing, digit by digit from the left.
If the listing has scrolled away, compile again (;Y) and watch for the line.
CTRL-C stops a running HiSoft program, even one sitting in an empty loop. It prints Halt at PC= - with the address of where it was, which tells you which loop it was stuck in.
That is because the compiler, unless told otherwise, puts a check for CTRL-C into every loop. It is the Turbo course's {$U+} - but on from the start.
The check is not free. It runs every time round every loop, and it is slow: an empty FOR loop that runs about 44,000 times a second without it runs about 1,440 times a second with it. Turbo, with its check off, did about 39,000.
So you have the choice Turbo gave you, the other way about. A comment starting with $ gives the compiler an option; (*$C-*) turns the check off for the lines after it:
(*$C-*)
PROGRAM COUNT;
Now the loops run thirty times faster - and CTRL-C does nothing. A program under (*$C-*) that never ends can only be stopped by restarting the Einstein, or by a way out you write into it yourself (S15).
The sensible habit: write and test with the check on. When the program works, add (*$C-*) at the top and compile it again.
Options take the same form, a letter and + or -: (*$O-*) switches off the overflow check on sums (S6), and (*$L-*) makes the compiler list only the lines with errors - handy once your programs are too long to watch go by.
10 PROGRAM COUNT;
20 VAR I,J:INTEGER;
30 BEGIN
40 FOR I:=1 TO 10 DO
50 BEGIN
60 FOR J:=1 TO 3000 DO;
70 WRITELN(I)
80 END
90 END.
Line 60 is an empty loop - it does nothing 3,000 times, just to take time.
Starting from
COUNT.ASC saved from XBAS; HPEIN COUNT.
What you should see
The numbers 1 to 10, one about every two seconds - about 21 seconds in all. Run it again, and press CTRL-C after a few seconds:
1
Halt at PC=0EA5
0:
Line 60 starts at 0E88 in the listing and line 70 at 0EA8, so 0EA5 is in the empty loop - where it spends nearly all its time.
(*$C-*) in as a new line 5, save and compile. How long do the ten numbers take now? What does CTRL-C do?WRITELN(I DIV (I-5)). What does it print before it stops, which message does it stop with, and which line does the address point to?3 DIV (3-5) prints - -1 or -2?5.1 Write a program with a REPEAT ... UNTIL FALSE loop that prints a count. Run it and stop it with CTRL-C. Which line does the PC= address point to?
5.2 Time COUNT with and without (*$C-*), and work out how many times a second each runs the empty loop.
Worked solutions are in Appendix II.
| Symptom | Cause |
|---|---|
| CTRL-C does nothing | The program has (*$C-*). Restart the Einstein - and put a key test in the loop next time (S15). |
| A loop is much slower than in Turbo | The CTRL-C check is on. (*$C-*) once it works. |
/ by Zero at PC=... | A DIV or MOD by zero. In Turbo this was not an error; here it stops the program. |
The PC= address matches no line | It is between two line addresses: it belongs to the earlier line. |
A run-time error prints its message and at PC= an address; the compiler's listing shows which line holds that address. CTRL-C stops a program - Halt at PC= - because the compiler checks for it in every loop by default. That check makes loops about thirty times slower; (*$C-*) removes it, and CTRL-C with it.
S6, Numbers - integers and reals: mostly as in Turbo, with a space after every number and some differences at the edges.