Basic Boss Manual English PDF
Basic Boss Manual English PDF
Basic Boss Manual English PDF
##########################################################################################
BASIC-BOSS
Basic-Compiler
Table of contents
Foreword
Introduction
Chapter 1 - Introduction
1.1 Basics
1.1.1 Basic and machine language
1.1.2 Data types
2.2 General
2.2.1 Compiler directives
2.2.2 Number systems
2.2.3 Inactivation of REM commands
2.2.4 The compilation
Appendix
A Summary of all directives
B Additional commands and functions
C Automatic mode
D Value ranges of the variable types
E The fast loader software Ultraload Plus
F Index
-----------
Foreword
-----------
Most had not expected that even a Basic compiler appears for the C64, which represents our
past experience, in the shade. Now, it is still a reality: Basic-Boss translates your
programs in pure machine language. Provide your programs even with so-called "compiler
directives", so you can speed up your programs even further. This acceleration by a factor
of "100" are not uncommon. You do not need in the future in many cases, the costly
programming in machine language.
Many features allow a comfortable and performance-based work, because Basic-Boss contains,
among other new commands and allows you to compile programs that were created with various
Basic extensions. Moreover, the programmer can use a Basic-Boss parameter table ready to
store frequently used default settings. We wish you much success with the Basic-Boss.
Your extra software editors.
--------------
Introduction
--------------
Once I had the idea to convert a basic program directly in machine language. Since the whole
thing was a bit repetitive, I wanted to automate the process and sat in front of my C64 and
programmed a Basic Compiler. After over a year of hard work and many sacrifices it was done:
The Basic-Boss saw the light of the world. It (source code) now covers two floppy sides (41
tracks) and a complete run assembler requires about 30 minutes. The assembly is only on a
512-Kbyte RAM disk possible (I use Turbo Trans, but which has not some minor drawbacks.
Thus, for example, it deletes every now and then uncalled individual sectors or entire disk
sides). The assembler which makes such a huge project at all possible, is the "Assi" by Dirk
Zabel. An equivalent approximately Assembler way I could not even distinguish yet on the
"computer professional" Amiga and Atari ST.
Such extensive compiler also needs more detailed instructions. This consists of two
chapters. Chapter "1" teaches the basics and introduces the operation of Basic-Boss. Most of
you will be able to skip large parts of it, since there is a precaution all started from
scratch and manages the user with almost no knowledge. But this section does not purport to
be accurate or even complete, but is intended as an introduction. Nevertheless, one can
already work with the Basic-Boss after its reading. In contrast to chapter "1" offers
chapter "2" an accurate and complete description of all commands and characteristics of the
Basic-Boss. But there is usually not provided much knowledge.
In order to understand the manual and can use the compiler, however, some basic knowledge of
the Basic programming language are necessary because only the features and commands of the
compiler are described, but not that of Commodore Basic. Therefore, the basic beginner to
recommend a good basic book, because the standard Commodore manual is pretty thin.
The entire manual was written by the way on the C64 VizaWrite. I prefer the C64 in word
processing over the Amiga and the Atari ST (which are next to useless) and consider the
statement to be absurd, the C64 was too small for reasonable word processing. Before working
with the compiler, you should make a backup. This is not a problem as the Basic-Boss
contains no copy protection on the one and the other can even copy itself. And it goes like
this: Make sure that you have a largely empty and formatted diskette available and then
download the Basic-Boss of the original disk with
LOAD "BASIC-BOSS",8
When the computer has finished loading, type "RUN". Now you can push your formatted floppy
disk in the drive. Then press the <*> button and enter a name under which the Basic-Boss is
then saved when you exit the entry with <RETURN>. On the original disk are still a few
example programs that you should look at. Otherwise, I hope you enjoy reading this guide and
I hope that you do not have too much trouble with the Basic-Boss.
----------------------------
- Chapter 1 - Introduction -
----------------------------
1.1 Basics
The C64/C128 includes as a factory default, the Basic programming language. This has a
reason. Basic is an easy-to-learn language to recommend to any beginner. But Basic not only
work with beginners. Also, advanced and professionals prefer to write their programs in
Basic as in any other language, because Basic has powerful mathematical functions and a
comfortable string management and certainly allowed the development of larger programs.
Basic could easily prevail against it only serious competitor. This competitor is the
machine language. It has no string management, can not count on floating-point numbers and
is generally very primitive and extremely cumbersome. In addition, it takes a long time for
large programs until you can test out the writing at all. In Basic, the entry of "RUN" will
suffice. But despite these drawbacks the machine language is often used because it has a
distinct advantage: it is much faster than Basic.
This difference is due to the different principles of the two languages. The machine
language is interpreted by the computer itself (the machine). Why it is so fast and so
primitive, because it would be too expensive to build a computer that understands a less
primitive, high-level language. Since the user can not expect such a primitive language, to
write in this machine language program that processes a higher or interpreted language. This
is the interpreter. Now these can be programmed in high level language, for example in
Basic. Their commands are recognized and executed by the interpreter. However, this process
requires a lot of time, and therefore Basic is just so slow.
It seems impossible to use the advantages of programming in Basic, if you want to write fast
programs, because for most applications Basic is unbearably slow. But there is a way out of
this dilemma: one can translate someone's own Basic programs into machine language. There
will be for this are anything but boring job, it makes sense to automate this process and to
leave it to the computer, repetitive tasks to accomplish because it is there eventually. The
only issue is that it is necessary a translator program (the compiler), because is
enormously expensive and complicated, since the task is in fact not monotonous. That is why
many compilers confined to implementing the Basic program into a more efficient something
special code that is interpreted but then again, why only a moderate acceleration is
achieved.
The first real compiler was published in the magazine 64'er long time ago As-Compiler that
actually produced real machine code. However, he understood only a very limited basic and
was therefore only very limited use. However, the Basic-Boss understands all the basic
commands and even creating a more efficient code. But you should be quite clear that even
the Basic-Boss does not need the machine language, because very time-critical programs will
be written as before in machine language, since a compiler can never generate efficient
machine programs, like a real person can write. But now you can with the Basic at least an
order of magnitude to reach the speed of the machine language.
The low speed of the BASIC interpreter does not result solely from the interpreter
principle. Another is the exclusive use of floating point numbers (for example, 1.2345 or
572545.2647254). Such figures, the processor of the C64 (which is responsible for all
calculations and operations block in C64) process only with great difficulty, which is why
it is quite slow. Therefore it is natural to use simpler numbers, the processor can process
easier. These are integers, so completely normal numbers without decimal places. If you
look at Basic programs, one will realize that no decimal places are required in most cases
and you could use instead of floating-point variables, integer variables. Such variables are
actually. Every now and then you come in Basic programs to variables of the form "A%". These
variables can only accept integers from -32768 to +32767. One might suspect that these
numbers are processed faster therefore. The statement A%=B%+C% should be faster than A=B+C.
However this is not so. These so-called integer numbers are even slower, which is not
located on the figures themselves, but to the lack of efficient implementation in operating
system.
After all, the Commodore Basic has thus been called three data types or in other words:
Basic provides three ways to display data. This is firstly the representation as Floating
Point Numbers, also called Real (for example, A = 1.2345), on the other hand, the
representation as Integers (A% = 10000) and also the representation as Strings, the strings
are called (for example, A$="cuckoo"). Thus, in the three basic types available data "Real",
"Integer" and "String".
But two of these data types are almost completely unsuitable for the processor (Real and
String) and the third only partially (Integer). For the Integer type is often useless when
working with memory addresses, so with PEEK and POKE, because the memory cells of the C64
are known numbered from 0 to 65535 and not -32768 to +32767 (Chapter "2" is explained, why
both are actually the same). Therefore it is natural to introduce more data types, where the
deficiency is not attached. I call these types "Word" and "Byte". A variable of type "Word"
is an integer from "0" to "65535," and is therefore well adapted to the C64 and its
processor. Even better fits the type Byte to the processor, because with the 6510 (the
processor of the C64) fits exactly into one of the 65536 memory locations of the C64. A
variable of this type can assume an integer from 0 to 255. If these types are used in the
basic program, you can translate it into a very fast machine program.
It raises the question of how to use these new data types at all, because the Basic
interpreter does not understand it so, and you have to somehow tell the Basic-Boss that you
want to use it. For example, you wrote the following program:
Of all 65536 memory locations, which has the C64, the program selects the which lie between
the 1024th and 2023th and fill it with the value 160. But because the screen memory is right
there, the screen is slow (in some C64 to complete only the lines of text, but that should
not bother) from top to bottom filled. Since you would like it a little faster and ragged,
you will compile the program, for example, with the Basic-Boss.
And that's what you can do now. So turn on your computer, monitor and drive and write this
little Basic program. If you start it with "RUN", you can surprise yourself of the very high
speed. Then you should save it in a not-too-full disk under the name "TEST". Then push the
Basic-Boss disk into the drive and load the Basic-Boss:
LOAD "BASIC-BOSS",8
+---------------------------------------------------+
! !
! !
! !
! *** Basic-Boss Compiler *** !
! Version 2.40 !
! (C) 1988 by Thilo Herrmann !
! !
! Quelldatei: [Source File] !
! _ !
! !
! !
! !
! !
+---------------------------------------------------+
Figure 1: How the Basic-Boss reports after the start
Now it can take something without floppy accelerator (which is why I would advise such a
principle-tion. On the Basic-Boss diskette, see the speeder software "Ultraload Plus" which,
although a hardware speeder can not replace, but still represents a big help. Please refer
to Appendix E). When "READY". appears type "RUN". Now if a page of text is displayed, so you
can make this disappear with a function key (<F1> <F3> <F5> or <F7>). Now you are prompted
for the source file, after which you enter "TEST", after you have inserted the disk on which
the test program is located. If you have the entry with <RETURN> completed, the Basic-Boss
begins its work. He reads the BASIC program from disk and creates a machine program, which
it stores under the name "+TEST" (this process is called "compile"). If an error occurs in
between, he interrupts his work and waits for the operation of <SHIFT>. Then you need to
improve the errors and start from scratch.
+ -------------------------------------------------------------------------- +
! !
! Datenbereich Schreiben [Data writing area] ........ !
! Variablen anlegen [Creating Variables]....................... !
! ......... !
! !
! ***** pass 2 ***** !
! Unterroutinen linken [Subroutines left].................... !
! ......................................... !
! ......................................... !
! Datenbereich schreiben [Write data area]......... !
! routinen :2049 -5845 , $0801-$16d5 !
! daten [data] :5845 -5904 , $16d5-$1710 !
! programm :5904 -11794 , $1710-$2e12 !
! variablen [variable] :11794-17958 , $2e12-$4626 !
! hilfsspeicher [auxiliary storage]:17958-17994 , $4626-$464a !
! strings :17994-40960 , $464a-$a000 !
! !
! '<-' fuer Neustart, 'f1' fuer Reset, [For reboot, 'f1' for reset] !
! alles andere fuer ende [everything else for the end]: _ !
! !
+----------------------------------------------------------------------------+
Figure 2: A program has been successfully compiled
The finished machine program (also "compiled code" called) can normally load with
LOAD "+TEST",8
and started with "RUN". What you see now, is indeed much faster than the basic program, but
you can probably still not quite convinced that the Basic-Boss should be worth it. Because
if you use any other compiler, the result will be about as fast. You want to know why? The
answer is simple: it was, as usual, expected real variables and that takes times now its
time. But there are really only integers between 0 and 65535 are used in the program, the
data Word type would be much more meaningful. But how to share this with the Basic-Boss? The
Basic interpreter distinguishes its data types (Real, String, Integer) based on a double-
digit appended to the variable name special character. In real variables nothing is appended
(for example, "A"), a String variables "$" appended (for example, "A$") and integer
variables is a "%" appended (for example, "A% "). The Basic-Boss makes basically the same.
But it can also communicate in other ways, of which type is to be a variable. For example,
if the variable "I" of the example program type should be Word, then it must in the first
line of the program, the command "£WORD I" are, like so:
5 £word i
This command is a compiler directive. It tells the compiler how it has anything to do (he
has the variable "I" to be regarded as a Word variable). Such a directive always starts with
the "£" sign. The compiler would accept the program that way. The interpreter but complains
when entering "RUN". And rightly so, because "£WORD" he does not understand. Therefore it is
useful to have a "REM" to write before the command. Then the interpreter accepts the program
and executes it properly - the Basic-Boss ignores the REM line, however. Thus, this dilemma
can be resolved, there is a way to make ineffective a REM command for the Basic-Boss. Just
use:
5 rem@ £word i
Then the Basic-Boss ignores the REM command line and evaluates it. The interpreter, however
recognize the REM command and ignored about the rest. When you now load your test program,
add it to this line, save them back to disk and compile, then you are at the machine program
("+TEST") find a strong increase in speed (this is now roughly the speed of "Petspeed" with
integer variables).
But it goes even faster. The FOR-NEXT loop of the Basic-Boss is quite cumbersome and slow
just because it is unfortunately no other way, if it is to do exactly the same as that of
the interpreter. However, you can instruct the Basic-Boss, to make it better. This is done
with the command "£FASTFOR". However there are a few limitations that you should look in the
chapter "2" under "£FASTFOR" and "£SLOWFOR".
and compile, then no distinction can be established to the machine language of a purely
visual. Apart "£FASTFOR" particularly the compiler directives "£ALLRAM" and "£OTHERON" are
important. "£ALLRAM" instructs the Basic-Boss to use the entire memory of the C64 for the
basic program and the variables. If "£OTHERON" is at program start, then are allowed by
commas parameters attached to the SYS command, for example. Both commands must, as usual,
are on the program start. For more information you should look up in chapter "2".
1.2.2 Examples
To give you an idea of the application of the new data types and the compiler directives,
I'm showing a few small examples. They will be compiled and executed as described.
The color screen is switched through with all 16 colors. Because the variable "A" can only
have values from 0 to 15, it can be declared as a Byte variable.
In this example, via "INPUT" read 20 Byte values in the array "A(" and calculates their sum
and multiply. Something seems strange to line 10 you can see how arrays (fields) are
defined. The variable name is simply a bracket is appended. Interesting is also the command
"£WORD #". A variable "#" does not exist and cannot exist. With this command, all variables
without additive (for example "A", "AB" and "COL", etc. and not "A%", "B$", etc.) will be
declared Word if it is not already on elsewhere declared with a variable type. Variables of
the form "A%", "VOL%" and so on are declared with "£WORD %" as a Word. So now are "SUM" and
"MUL" Word type and "A(" and "X" of type Byte.
It tells the compiler by "£ALLRAM" that he will use all the memory. Then, a byte array is
dimensioned to 62000 elements, filled at 100.
Well you have come to the end of the first chapter. You can now use the compiler and use. A
detailed description of the Basic-Boss, its commands and its properties, see part "2" of the
manual.
--------------------------------
- Chapter 2 - Operating Manual -
--------------------------------
Here you will find an accurate, complete and systematic description of all the features and
commands of the Basic-Boss. Therefore, this chapter is very well suited for future
reference.
LOAD "BASIC-BOSS",8
and started with "RUN". Now if a page of text on the screen, you can have this with a
function key (<F1> <F3> <F5> <F7>) disappear (but this is not essential). Then a copyright
message and version number appears and the user is prompted for the source file. Now you can
display the directory with "$" + <RETURN> or immediately enter the file name (with the naked
pressing <RETURN> it is accepted with "BASIC"). Then start the compilation. This consists of
two passes (Pass 1 and Pass 2). During pass 1 is read the source file and performed the
distribution of addresses. In pass 2, the Basic program is again read from the machine
program that can be generated, which is simultaneously written to the disk. The name of the
generated machine program is by default generated from the source file by adding a "+" at
the beginning. If an error occurs during compilation, the number of the faulty line is
displayed. After the number is an extract of the previously processed part of the current
line to find that the error can be more easily located. This extract consists of double
points, arithmetic operators, and one point for each command. Below is the actual error
message after an error number to facilitate (Chapter 2.12.1) to locate the error in the
error list. The compiler stops on any error inherent to this not being seen again disappears
from the screen (unless it was the "£PROTOCOL" command is used). Pressing the <SHIFT>
finished this state of pause. The error messages are displayed in both passes and therefore
often appear twice, but that did not bother. At the end of pass 1 Basic-Boss report the not
dimensioned arrays, which are then dimensioned to 10. You can always abort the compilation
with pressing <RUN/STOP> with <RESTORE>. After completion of the compilation the Basic-Boss
shows the addresses of the various areas and prompts the user, either to press < <- >, <F1>
or any other button . With < <- > the compiler is restarted, <F1> performs a reset. Any
other key stops the Basic-Boss without reset. The Basic-Boss also offers another memory
function, with which you can save him. If the name you require is a star when entering the
source file ("*"), then the compiler under this name is written on drive "8". The At sign
can be applied here by the way safe (for example, "* @:NEW BOSS").
If you often compiled, for example, if a program can only be run as compiled code, then you
will often type in always the same. It would be better if you could automate the operation
of the Basic-Boss. Such a possibility there is in fact. One can convey various information
to the compiler. You are in the cartridge buffer from 900 memory location. When run, the
Basic-Boss first examined the locations 1000 and 1001. He finds the values 123 and 234, it
is assumed that the user wants to automatic mode. From 1002 he then gets the device number
for the source file, from 1003 the corresponding secondary address. In 1004, he expects the
length of the file name and the file name itself from 1005 The program described in this way
is then compiled. Once the compilation is complete, the Basic-Boss picks up a device number
of 900, a secondary address from 901, a name length of 902 and a name from 903. Then this
causes that the reloaded program starts and stops itself. The program can for example, be
reloaded the compiled program, which can then be tested immediately.
However, it is not as simple, but much more complicated to tell the Basic-Boss in this way
the name of the source file, since it requires many POKEs. Thus, one should use for the
POKEs a small program that uses the locations from 900 correctly and then the Basic-Boss
invites. You can save even more work when this little program integrated into the to be
compiled Basic program, it expanded to a few floppy commands and a SAVE command and press
"£IGNORE" and "£USE" clings to it the compiled not meaningless extended. Then you need it
only with "RUN start line" call to automatically save the source program and to allow
compiling, wherein the compiled program will also automatically loaded and started. A sample
program did illustrates the procedure is to be found on the program disk under the name
"AUTOBOSS" The program is based on a small basic routine that isolated and packaged into
"AUTO.SHORT" is and can therefore be easily incorporated into your own programs.
2.2. General
The Basic-Boss is controlled almost exclusively by means of compiler directives. These are
commands that are like others in the Basic program. But they do not meet any normal function
such as "PRINT" or "POKE" but tell the compiler what he has to do. All Compiler directives
begin with the pound sign (£), based on the C64/C128 keyboard with a single button (button
between is accessible <-> and <HOME>. Then the command name and then possibly some
parameters follow.
Numbers accepted the Basic-Boss both in decimal and in hexadecimal form, with hexadecimal
values with a dollar sign ("$") are introduced. In addition, it can be any length and you
don't need to take on consideration the randomly generated Basic Commands. For example, the
following is possible: "PRINT $F, $DEF, $123456789ABCDEF" or "GOTO $1E". Decimal numbers can
only be specified in decimal form.
The Basic-Boss reacts to a REM command as well as the interpreter: he ignores the rest of
the line. This can be prevented, however, if you write directly behind the REM command an At
sign (@). Then the compiler examines the lines available after the REM. After REM one can
only write compiler directives and compiler commands due to a peculiarity of the interpreter
(tokenization) but Basic commands are not recognized there. The disabling of REM commands is
useful to hide compiler directives before the interpreter, so that this does not complain
when debugging a Basic program with an error message if it contacts a directive.
The compilation is normally provided by the Basic-Boss with a SYS-line stored as a normal
program. It can be like a BASIC program loaded and started. But you can also put in a
specific memory area and a Basic program to call out with "SYS start address" (see chapter
2.4.3 "£ROUTSTART"). The Basic program works after the compilation more properly, as all are
important locations for Basic restored after the compilation again.
The type system is probably the most important aspect of the Basic-Boss. It has the types:
Byte, Integer, Word, Real and String. There is also the type Boolean, which is however quite
important and is treated in most cases as Byte. Every variable in the Basic program can be
one of these types.
Real and String are the most used in Basic data types. Their range of values likely to be
known to you. While one can speak little of the String type value range, as it describes
strings of (almost) arbitrary length, can be better the Real type samples. It describes
decimal floating point numbers in the range of + -2.93873588 * 10(-39) to + -1.70141183 *
10(38). When Integer type, the value range is considerably easier from: It ranges from -
32768 to +32767. Word summarizes values from 0 to 65535 (= (2 to the 16)-1) and byte from 0
to 255 (= (2 to the 8)-1). The types Byte, Word, Integer and Real values are chosen for
their range called numerically. Boolean can really only take the values "0" and "-1". This
type is needed for decisions.
The interpreter recognizes the data type of a variable on the variable name added. If no
additional follows, for him is the variable of type real (floating point). If "%" followed,
he concludes on an integer variable (for example, "A%") and "$" to a string variable (for
example, "B$"). The Basic-Boss holds by default also follow this rule. One can assign to
variables but also other types. This is done with a compiler directive. This generally looks
like this:
£Type variable list
Instead of "Type" of each of these types can be (Boolean, Byte, Integer, Word, Real,
String). The variable list consists of one or more variable names separated by commas. An
example:
10 £byte a,b%,c
20 £word co
Here are the variables "A", "B%" and "C" for Byte variables and the variable "CO" for Word
variable. You can declare the variables according to their additions as well. If you want,
for example, all the variables of the form "A%" declare as a Word variable, then it is
sufficient to take the potentially large number of variable names to use in the simple
declaration "%". Consequently, you can also declare the variables of the form "A$"
differently, by using "$". Particularly important is the possibility to assign a specific
type to variables without additive. This is possible with the hash character ("#"). The
declaration of variables by means of its name, however, has priority over the declaration on
the basis of the additive. One can therefore define as Word and still assign the type Byte
of the variable "X%", for example, all the variables with the suffix "%". The order of
declarations is basically irrelevant.
Are declared with the addition of "%" as a Word, the variables "A", "B" and "C" and all. All
variables and without the addition of the variable "X%" is assigned the Byte type. Since the
explicit declaration takes precedence, is "X%" of type Byte and not the Word type, as well
as "A", "B" and "C" are Word type and are not of type Byte. The high flexibility of course
you can also abuse:
The interpreter gets off with a "Type Mismatch" but the compiler absorbs the program without
difficulty.
In the programming language "C" on the Amiga or Atari ST, there are register variables,
which tries to store the C compiler in the registers of the main processor so that they can
be processed very quickly. When the processor C64/C128 this would be a hopeless task, since
it has only a few very small tab that why he constantly needed elsewhere. But he has the
nice property that it (the so-called Zero Page) processed very efficiently the lowest 256
bytes of its address range. Therefore allowed the Basic-Boss, a few variables of type Byte,
Word or Integer (no arrays) to be placed in this area. In normal operations bring such a
variable speed gain of about 25%. The memory consumption decreases by about a third.
Dramatic is FAST variables affect in PEEK and POKE. If such a variable is used instead of a
normal variable for the address, then these operations are accelerated by a factor of three
and require only one-third of the program memory. Therefore one should FAST variables apply
especially here. When declaring a FAST variables the variable name with an equal sign is
simply appended to the "FAST" follows (for example, "£WORD A=FAST, B=FAST"). However, it
should be noted that only four bytes for FAST variables are available. It can therefore only
two word variables are declared with FAST or four byte variables or word variable and two
byte variables. The addresses are used 251 to 254. Note: Fast start of the program
variables are not like everyone else set to "0". Therefore, you need to be initialized by
the programmer.
+----------------------------------------------------------------+
! !
! !
! *** Basic-Boss Compiler *** !
! Version 2.40 !
! (C) 1988 by Thilo Herrmann !
! !
! Quelldatei: [Source File] !
! test 57 !
! !
! 20 .,, !
! 62/zuviel 'fast'-variablen [too much 'fast' variables]!
! !
! !
+----------------------------------------------------------------+
Figure 3: Error Message 62: There were too many FAST-declared variables
Normally, the Basic-Boss determines the address of each variable itself. However, you can
specify the address of a variable, provided it is numeric. This is done similar to the FAST
declaration must only instead of "FAST" an address to be specified, for example: "£WORD
A=49152". Arrays can also be declared ("£BYTE SCREEN=1024"). Now you can for example very
easily appeal to the tab for the background color, if you declare "COL" as follows: "£BYTE
COL=53281". You can also speak to any variables of machine programs by placing their own
variables to the affected locations. Another application is the transfer of values to
programs that are loaded and include the same declarations. You can also create more FAST
variables by placing normal variables on the zero page address of $2B to $2E, which
otherwise are not touched by the compiled code. In fact, the statement "£WORD A=$FB" respect
"A" is identical with "£WORD A=FAST". Just as FAST-defined variables are variables to a
specific address is not initialized and the program beginning any random value.
2.3.5 Advantages and disadvantages of the types of data and use the correct type
One may ask, what for sure five types of data are needed. The answer is simple: use the
correct data types increases the efficiency of a program. Thus, it is faster and shorter.
Essential to the decision of the correct data type is the desired range of values. In
addition, it is preferable to always use the data type that consumes the least memory and is
the fastest. The following applies:
- Byte is the fastest and uses the least memory variables (just one byte)
and program memory.
- Word is about half as fast and consumes exactly twice as much memory variables
(Two bytes), and usually more than twice the amount of program memory.
- Integer is just as fast as Word for many operations and uses as
much memory variables. For integer comparison operations but is much slower
(Except for "=" and "<>").
- Real is much slower than the types described above and consumed whole
five bytes of memory variables, but due to a special calculation method somewhat
less program memory than Word.
- String is an extremely complex data type and therefore not too fast.
But the editing is still a lot faster than the Basic interpreter, not only
what garbage collection is concerned. The space requirement is similar to the Real type.
Added to this is the space requirement of the text string.
It follows from this that you should use the Byte type, if possible, otherwise Word,
otherwise Integer and only if it is absolutely necessary Real. If you use for example the
variable "I" exclusively for string processing in the form of "A$=LEFT$(B$,I)", then you
should declare "I" as a Byte variable, since "I" only values between "0" and "255" are
meaningful. If a variable "X" will still be used in the form "POKE X,0", it should be
defined as a Word. For more information, to improve the efficiency of programs, see
"Efficient Programs (Section 2.8)". The expected types in commands and functions you can
read under "types in operations, functions, and commands" (Chapter 2.3.9).
Because different data types may conflict with each other, they must be converted into each
other every now and then. One can differentiate between two types of conversion.
Under this program, the interpreter is running properly. There is indeed only expected Real
variables. But when compiler it would be a problem, because in line 30 is a Real variable
assigned to a Byte variable. This is actually technically impossible, because you can not
assign a five-byte and very accurate real value of a primitive Byte variable, but the only
whole numbers between "0" and "255" interpreted. But the Basic-Boss compiled this program
without any difficulties. If you start it, you can see the principle: there are simply cut
off all decimal places and of 97.374546 is simply 97. However, real numbers may be larger.
If a Byte variable is now assigned as 258.123, cutting off the decimal places is not enough.
In addition, the number is then made simply smaller by basically only the remainder of a
division is made by 256. Easily explained: it is so often taken 256 until the result fits
into the Byte variable. In this case, the Byte variable would after assigning the value "2"
included (258-256). It is similar with the other transformations. If Real is to be converted
to Word or Integer, the decimal places are also cut off and taken only the rest of the
division by 65536. This is somewhat surprising for Integers, because this type has a
different range of values, but more on that later. If Word or Integer to be converted to
Bytes, only the remainder of the division is again taken over by 256 (in other words: It is
simply the high byte omitted).
In the transformations described so far always been something lost or the accuracy
decreased. However, there are a number of other transformations, which do not have this
disadvantage. These are conversions of Bytes to Word, from Byte to Integer or from Word to
Real. In these cases, the value range of the source type is always included completely in
the value range of the target type. The transformation of Boolean way, is also lossless.
When this program is run under the interpreter with "RUN" then the result of "6" appears on
the screen. Whatever else in this example, the compiler but comes back to a type mismatch.
In line 30, the real variable "R" is to be multiplied by the Word variable "W". The Basic-
Boss can not associate variables of different types. The multiplication can be performed,
consequently only when one of the variables has been converted into the other type. So, for
example, the compiler can convert the content of "R" in the Word type to multiply then. He
would convert the decimal value 1.5 into a Word value and therefore cut off the decimals. He
then would receive 1. Then he would multiply this "1" with "4". The result would be "4" and
obviously wrong. It should be better to convert the contents of Word variable "W" into a
real number. Then the Word value "4" convert to the real value of "4" and would result with
"1.5" multiplies the correct result "6". This is exactly what the Basic-Boss do. If it has a
choice, it always converts the type from the smaller range of values to the larger range.
This, he decides, based on the value of some type. The lowest value of Boolean and Byte.
Then follows Integer, before Word and before Real. In one type of conflict, the Basic-Boss
preferably opt for the type with the higher value. Meanwhile, you should always be aware
when you provoke a type mismatch. Another problem:
In line 30 the result of the W1/W2 real variable "R" should be assigned. "W1" and "W2" are
both of type Word, so the division could be done in just this type. However, the result of
W1 by W2 would not be 1.5, but 1 was not expected because real numbers. This incorrect
result would then be assigned to "R". To prevent this, the Basic-Boss has basics assignments
minimal with the target type, in this case Real. Therefore, also agrees with the first
output from the PRINT command in line 30 value. The second is true because the compiled code
of the indicated problem is not entirely because there is no target variable in the PRINT
command (which is why the minimum type for PRINT with "£PRINTTYPE" can be set).
It has been claimed that a Byte variable can only assume values between 0 and 255. But it
looks like this:
To the value of the variable "A" (5) the value of "B" (-1) is added. The result would be 4
and, behold, it works. "A" is "4" displayed by the compiled program with. Particularly
interesting is the content of "B", because it can not be -1 because it does not fit into the
value range. "B" is displayed in line 40 with "255". But why 255? -1 is less than 0 So you
have to go back a step from 0. To take another example, if 10 is reduced by 1, we obtain 9
Suppose someone sees only the rearmost position and knows why only the numbers from 0 to 9
When he observed the number 10, he only sees the 0, He was told that it would now subtract 1
and suddenly out 0 become a 9. As the number at the end of the value range was known to him
(at 0), she jumped again after the deduction of 1 to the highest value of the range (9).
Just as it is the Byte type. If one subtracts 1 from a minimum value of the range, the
number jumps to the highest value. So the 255 declared. But why a 5 is a "4". It's simple:
255 was added to 5 (in line 30) and the result would be 260. Since this is out of the range
of bytes, so you can often deduct 256 until you are in range again. And 260-256 is "4",
Consequently, one can also expect a Byte to sign limited. The same is true for the data type
Word. For it -1 is the same as 65535. But be careful!
Not all operations allow this. It works in the addition, subtraction and multiplication, but
not in the division. It function "=" and "<>", but not "<", "<=", ">", "> =". In type Byte -
1 is defined as greater than 100, because -1 is identical to 255. Therefore, in these cases
you should preferably work with "=" and "<>".
No such problems one has the Integer type. It can take values between -32768 and +32767. In
this area, all operations work correctly and as expected. This also applies to "<", "<=",
">", ">=" (these operations are Integer type but relatively slow) and the Division. Since
this model also like Word has exactly two bytes of memory, it seems likely that they are
similar in some way. And in fact they are not only similar, but actually identical. Because
whether an Integer variable assigns a value of -1, or a Word variables does not matter. In
both cases is exactly the same in memory. How are these types differ at all? Only by the
operations "<", "<=", ">", ">=", the division and the conversion to a string (with PRINT or
STR$) or for Real. Otherwise, these types are totally right! Thus, for example, "I=55296:
POKE I,1" possible with "I" as an Integer variable. Since the data type Word is the more
important, by the way changed arbitrarily to Word in a type conflict. But such a conversion
of Integer to Word or Word to Integer consumes neither time nor memory because no conversion
takes place.
The expected and provided by operations, functions, and types of commands you should know,
so no unnecessary conversions are made, wasting the time and memory.
Many commands of Basic V2 expect one or more parameters. These parameters are the
interpreter always of type Real. But the compiler expects a particular functional type. If
the user specifies a print of another type, a conversion is made. When a particular type is
expected, then the type is here easily substituted for the parameter.
GOTO Number
GOSUB Number
ON Byte GOTO Number
ON Byte GOSUB Number
"Number" is a number of type Word and not a variable.
PRINT A
INPUT V
GET V und READ V
OPEN Byte, Byte, Byte, String
CLOSE Byte
PRINT# Byte, A
GET# Byte, V
INPUT# Byte, V
LOAD String, Byte, Byte
SAVE String, Byte, Byte
CMD Byte
"A" can be an expression of any type.
"V" is a variable of any type.
DIM V (Number,...)
DATA D, D, D
RESTORE Word
WAIT Word, Byte, Byte
The data "D" are normal strings or numbers
Functions differ from commands in that they deliver results. These results are of a
particular type. SIN, COS, TAN, ATN, LOG, EXP, RND, RND, USR each expect a real number, and
also supply such (for example, "Real =SIN(Real)". SGN, INT, ABS can be applied to all
numeric types. The result is a number in this type respectively.
In this division, Arrays fit. You expect parameter of type Word and deliver the type of the
Array variable. For one-dimensional Arrays of type Byte, Boolean, Integer or Word, the
parameter type Byte is expected if the dimension of the Array is correspondingly small (then
an efficient addressing mode may be used).
The following operators provide the same type with which they are supplied: plus (+), minus
(-), AND and OR process all numeric types. Multiply (*) and Division (/) processing Word,
Integer and Real. Exponentiation can only with real numbers. The negation (-), and NOT
handle all types from Bytes to Real. AND, OR and NOT also handle all numeric types and
additionally Boolean. There is also a group of operators that do not provide the type you
would expect. These are the comparison operators. They handle all types (including String),
and generally deliver the type Boolean.
The C64 is familiar with the system variables TI, TI$ and ST. TI is of type Real, TI$ is of
type String and ST is treated as a Byte.
Pascal and Modula offer the programmer the ability to replace difficult to interpret numbers
with meaningful names. Basic does not have this advantage. Here one must instead use
variables if you want to write any numbers. This is particularly unfortunate because the
efficiency of compilations when using constant numbers instead of variables increases
significantly. The code is faster and shorter. "POKE COL,1" is compiled as three times as
long and slow as "POKE 53281,1" Therefore I have enriched the Basic-Boss the data type of
Constant. A constant is declared like any other variable, which is specified as the data
type "CONSTANT". It may variables of the form "A", "A%" and "A$" are declared as constants.
Like any other variables of a constant in the program can be assigned a value by placing an
equal sign after the variable name, followed by the desired value. In this way, the
compatibility is maintained to the interpreter. However, a constant may be assigned a value
only once. This must also be done prior to their use (ie, in a previous program line).
Therefore it would be best to assign its value to the constants in the program beginning.
Then the constant is ready for use. It can be used in the following program as often and
then each of its assigned value replaces.
30 poke 53281,1
In the first program, the line 30 is considerably more readable. You should be in the use of
constants aware that they don't have any particular type by default. When assigning a value
to a constant, only the text is actually read and noted. Therefore, you can assign a
constant everything possible (for example, "C =HELLO" or "C =4+1.23*5"). If this constant
shows up later in the program text, then their assigned text is bracketed and used. Only
then the expression is evaluated. If there were errors in the constant text, they are
therefore not reported until now. It is necessary to use parentheses. Assume "C" is a
constant and was determined: "C=1+2". Later, when the expression "A=C*3" appears, without
parentheses the result of "A=1+2*3" would be 7. But what is expected of "A=(1+2)*3" is 9.
Constants can be nested. For example, if VIC and SPR are constants, then these also as
evidence: "VIC=53248: SPR=VIC+21". If SPR is used in the following program text, SPR is
first replaced, VIC and the result is for "POKE SPR,255" of the replacement text
"POKE((53248)+21),255".
2.4 Description of the directives
The settings and properties of the compiler can be changed only with compiler directives
that are in the basic text of the source program. This increases the flexibility and the
ease of use of the Basic-Boss, since you do not have to re-adjust as with some other
compilers for each compiler run program-specific parameters. In the application of compiler
directives, you should always be quite clear that the compiler of the Basic text (which is
determined by the GOTO and GOSUB) works through line by line from front to back and does not
care about the actual execution sequence under the interpreter. The directives should
therefore always be at the beginning of a program. A number of directives can often be used
as opposed to anywhere within the program. If this is the case, it is mentioned in the
description of the directive. The following compiler directives are explained according to
their function. They are written in capital letters and each of them must have a pound (£)
be prefixed so that they are executable. If you do not necessarily want all the
possibilities of Basic-Boss, you only need to see the commands that are designated as
important.
These commands are followed by a list of variables of the form "A, B%, C, D$" with any
number of elements. Instead of variables, "%", "$" or "#" can represent for all variables of
the form "A%", "A$" or "A". The affected variables are declared for this type. Behind a
variable, an equals sign, which in turn must follow "FAST" or an address. These commands
must be at the beginning of the program. More see Section 2.3 "Data Types". The next command
you should also know if you work a lot with DATA:
£DATATYPE Type
Thus, the type of the data DATA of the instruction is set. By default, all data of type
String is stored in this type in the compiled program. Because of the type String can be
converted by the READ command to all other types. If the data but in reality, for example,
are numbers between 0 and 255 (which is very often the case), and are meant for a variable
of type Byte so it would certainly make more sense to store the data already in this type.
This happens after the directive "£DATATYPE byte" has been found. Then the data after the
DATA command should be numbers between "0" and "255". You will then be stored directly in
the type Byte, which saves a lot of memory (approximately 70% to 80%) and increases the
execution speed of the compilation dramatically. You can also use any other data type
instead of "Byte", which then require correspondingly more memory ("REAL" for example,
requires five bytes per data value and thus saves more memory to the String type, but this
time). This directive can be often used in the same program, as required by the different
data. However, it should be noted that the READ command, the numeric types can not converted
into one another. Therefore, the compiled program gets off with a "type mismatch error" if
you want to read Byte data into a Real variable, for example. The problem can be solved by
first reads the Byte data into a Byte variable and then assign the Byte variable to a Real
variables, which is still faster and especially space-efficient than using normal String
data.
£PRINTTYPE Type
It is set to the specified type, the minimum type of calculation in the PRINT command. By
"£PRINTTYPE Real" that is, all operations in the PRINT command are carried out at least in
the Real type. If "W1" and "W2" are word type and the values include "5", "2", the command
"PRINT W1/W2" no longer provides the incorrect result "2" but "2.5". By default, the type is
Boolean.
£BOOLEANTYPE Type
This command sets the minimum type in the calculation of IF-fixed expressions (eg, "IF
A+3.5=B THEN ..."). This minimum standard type is Boolean.
£CALCTYPE Type
This type is generally the minimum specified in calculations. Normally it is set to Boolean.
To establish the full compatibility to Basic, you can set it to Real (with "£CALCTYPE
Real"), but what the programs unnecessarily slow down.
2.4.2 Optimization
The next two commands you should know if you want to write fast programs:
The FOR-NEXT loop in the compiled program works very cumbersome and slow because it is
supposed to work exactly as in Basic. Therefore, the Basic-Boss offers an alternative FOR-
NEXT loop, which is much faster, but has a few limitations. These are the following: FOR and
NEXT must be in the correct sequence in the program text and on each FOR NEXT exactly one
must follow (similar to Pascal, Modula or C). The following constructions can the Basic-Boss
problem about it when it is to produce fast grinding:
10 goto 30
20 next i: end
30 for i=1 to 100
40 print i: goto 20
Another limitation is the type of the counter variable. It may only be of type Byte or Word.
Otherwise, the Basic-Boss used the slow loop. Also in the STEP value, all is not allowed, if
it is specified, it must be stated directly, that is, as a number and not as a variable. He
may, however, be both positive and negative. Moreover, the value of End variable must not
change. In "FOR I = A TO E", the value in "E" must always remain the same during the
execution of the loop when the loop in the compiled code the same shall make such by the
interpreter (unless "E" is an expression). Despite all these limitations, the FASTFOR
command on the vast majority of loops can be applied. Normally, the Basic-Boss slow loops
(because of compatibility) produced. But if he finds the directive "£FASTFOR" he produced
from then on fast loops. When he comes back to "£SLOWFOR" he produced slow but fully
compatible loops again. If you want to make only a single loop faster, then so you can write
on this loop "£FASTFOR" and beyond "£SLOWFOR" One should note that in "£SLOWFOR" all loops
are completed with NEXT, since the Basic-Boss otherwise returns an error. One should always
specify the loop variable after NEXT, because the compiler can detect errors better. Nests
are of course also allows for fast grinding. It is at FASTFOR loops as opposed to slow loops
also unproblematic to jump out of the loop with GOTO. The next four commands are for the
optimizer to you and not essential.
There are two ways to construct an IF branch for the compiler. The method allows an
unlimited number of commands after the THEN, the other not. This saves the second process,
however, for each three-byte memory IF instruction and the code is a bit faster. By default,
the compiler applies to the LONGIF process, which allows an arbitrarily large IF branch.
With "£SHORTIF" one switches to the cost-saving version, but sufficient in most cases.
Therefore I would recommend applying to program with "£SHORTIF". If the Basic-Boss but then
again strike at an IF line (which indicates an error), then you can switch on this IF line
with "£LONGIF" on the longer version, and behind it with "£SHORTIF" back to the shorter. The
following two commands can be important when testing:
If a field (Array), for example, with "DIM A(20)" is dimensioned, it allows the compiler for
simple and fast array that the Basic program accesses to non-existent array elements. The
statement "X=30: A(X)=1000" will be executed without difficulty, Whereby other variables or
memory contents will be destroyed. However, to compensate for such arrays are extremely
fast. If you still want to play it safe, so you can do this with " £SLOWARRAY" what the
program then slowed down. "£FASTARRAY" on the fast array management again. Both commands can
repeatedly appear anywhere in the program, so you can dose the security target.
These commands should only apply if you have some basic knowledge regarding the memory
layout of the C64. Otherwise, you can ignore them. Usually, the compiled program is stored
in a single file whose name matches the Basic-Boss receives from the name of the source
program by preceding it with a "+". The compilation is compiled to the normal Basic start
(2049) inclusive SYS-line so that you can start it with "RUN". But there is another way. You
can lay the compiled program to any location in memory. You can even split it into its
components, and this creates any memory addresses and writes under any name on disk. So it
is even possible to keep multiple compilations simultaneously in memory that call each other
when they are placed at different addresses. To all this may come an ordinary Basic program
that may be using the compilations as subroutines and controls. The memory layout of
compilations usually looks like this: It consists of three parts. These are: program part,
the routine part and the data part. The program portion represents the actual machine
program that was created from the Basic program. This part of the program requires for its
working routines of the Basic-Boss individually obtained from his library and writes behind
the program part, the compiler conforms to the address range (this process is called "left"
[Linken]). Then follows a data area, are in the information about array variables and a
table for the READ command. Finally, the variables follow memory, the memory area for help
and eventually the string memory. Although this sequence appears to be the most reasonable,
but not the reality. Or more precisely, it is only correct in pass 1. In pass 2, the
compiler first routines and data area and then install the program area. This requires
extensive calculations, but it has a significant advantage: The routine area is in the
compiled program at the front. This ensures in the normal case, that the routines are in the
lower 40-Kbytes range. And that's where they need to be, because they must necessarily be in
a storage area that is not superimposed from ROM or from others.
The position of the regions can be changed using the following commands. It should be noted
that there is no overlap in each area. If the position of a code area is changed, then it is
written to a separate file. An old file of the same name is deleted by default (with the
SCRATCH command).
£ROUTSTART address
Defines the beginning of the routine area. The routines are not to be placed under the ROM
or the I/O area. The file name of this part is located by default in "R+" and the name of
the source file. The SYS-line is part of this range. Therefore, the command also turns off
the SYS line, if it was not explicitly enabled with "£SYSON". Then the routine area can be
jumped directly to a SYS command when the compiled program is to be started. By default, the
routine range is 2049, ie at the beginning of the Basic memory.
£DATASTART address
Specifies the starting address for the data area. The file name of the data area is derived
from "D+" and the name of the source file.
£PROGSTART Address
Specifies the starting address of the actual program. It can be laid anywhere, for example,
to $D000, if the compiled program in the "£ALLRAM" mode runs. The file name is derived from
"P+" and the name of the source file.
£VARSTART address
£HELPSTART address
£HEAPSTART address
and
£HEAPEND address
Determine the location of the string memory. The address for "£HEAPEND" are no longer used
at the first memory location. If 0 is specified for "£HEAPEND", no string memory is reserved
at all, which is useful if you want to execute any string operations. Variables, auxiliary
memory and string as the program area can be laid anywhere. Usually, all areas are
concatenated directly. If you have created your own Basic-Boss version using
"£SETPREFERENCES" that does not concatenates the areas, so you can force "0" as the start
address of an area with indication of this".
The file names of the output files, you can specify your own, if you do not like the default
name.
So the name of the file for the routine part sets, usually takes the name also from the data
part and the program part. The device is useful as either "8" or "9", you will usually omit
it (£ROUTFILE "filename"). Behind the device could also specify the secondary address, but
which should be useful in very few cases (only for particularly troublesome RAM disks or
similar).
Function as the program area and the data area. The name of a file can be safely followed At
sign (@) are preceded by a colon. The Basic-Boss recognizes this and then deletes the old
file before opening the new with the SCRATCH command of the floppy. This is necessary
because the overwriting with the At sign (@) because of an error in the floppy does not work
normally and should generally be avoided, otherwise files may be destroyed. If the file name
is preceded by no At sign (@), then an old file of the same name is not deleted and it may
occur a floppy error. There is another command file:
This command seems plenty of sense. It specifies name, unit and secondary address of the
source file after sameness is already open (yes it is read from it). Therefore it only makes
sense against a "£SETPREFERENCES" command. Secondary address, and / or device may be omitted
as usual.
Also, the following directive is not of overriding importance, but should still be in every
compiler or assembler.
The error messages and other data (such as the memory addresses) usually appear only on the
screen. If you want to guide them to the printer, the directive "£PROTOCOL" enough. If the
printer has a different device address as "4" (for example the plotter 1520), then you
should specify this with "£PROTOCOL device". To the device, you can still attach the
secondary address and possibly a file name (for example in Görlitz-Interface this controls
the line spacing). "£PROTOCOL 8,"ERROR", S, W" sends the error messages into the "ERROR"
file on disk (again, you can safely use the At sign). This file is a simple ASCII file and
can, for example, with the program "ERRORREAD" (on the program disk) be read again. If
"£PROTOCOL" was used the compiler will not produce errors anymore. With "£PROTOCOL 0" You
produce this effect without sending any output.
The Basic-Boss allows you to use all the memory of the C64 so "PEEK" and "POKE" will be
slower. If that bothers you, then you just set the directive "£ALLRAM" at the beginning of
the program and the matter is settled. But if you want optimum speed, then you should deal
with the commands "£RAM" and "£ROM".
£ALLRAM
Must be at the beginning of the program and instructs the Basic-Boss to use all the memory
for the program. In addition, the string end memory is automatically set to the end of
memory, if not a "£HEAPEND" command is in the program. In ALLRAM mode, the full 64 Kbyte RAM
of the C64 are always switched on (usually only the bottom 40 Kbytes of on and a small area
starting at address 49152). However, then it must first be switched on all PEEK, POKE and
SYS commands on the ROM, so that in each case they provide the same result as the
interpreter. This slows down of the program is insignificant. When one of these commands,
but anyway want to address only the RAM and not the ROM, the I/O memory area or the color,
then you can prevent the switch with £RAM. Each POKE, PEEK, or SYS command then refers to
the RAM memory. If you want to access the ROM or the I/O blocks again, you have to turn on
the switch before with £ROM again. If you forget this command, for example, the screen color
is not set, but rather the string memory disturbed and the garbage collection runs crazy.
These two commands are useful only for "£ALLRAM" "£RAM" and "£ROM" can be used as many times
in the program. A supporting program ("RAMROM") is on the program disk. Also in the program
"RAMLOAD" makes use of "£ALLRAM" and "£RAM". A more efficient way to access the ROM in
ALLRAM mode provide the commands "<-RAM", "<-ROM" and "<-IOROM", but should only use the
professional (see 2.5 "New commands and functions").
£BASICRAM
Is the counterpart to "£ALLRAM" and causes only the normal Basic memory for programs and
variables used. If the string end ("£HEAPEND") has not yet been set, it is reduced to 40,960
(end of basic memory). This is the normal state.
In ALLRAM mode the compiled program may extend beyond the Basic area, and may be longer than
154 blocks. Then there is also the RAM under the ROM. A length greater than 201-202 block is
therefore not possible, because the ark of the C64-routine overwrites the I/O area, which
can be visually identified by a drastic change in the screen display. In this section, a
program can only be loaded with the compiled code of "RAMLOAD". This RAMLOAD may even not be
overwritten.
The SYS-line makes it possible to load the compiled program as a normal basic program and
launch it. It can be prevented by "£SYSOFF". However, this is usually not necessary because
the "£ROUTSTART" the SYS command line switches off automatically, so the program with "SYS
start address" can be started from the direct mode or from another program. With "£SYSON"
can force the SYS line. The following commands have only purely cosmetic significance:
£SYSNUMBER number
£SYSTEXT "Text"
Switch the row updating on and off. Normally it is disabled because it consumes memory and
slows down the program. If it is on, the errors occurring while the program is running with
the correct line number are displayed, otherwise not. The following commands are now for the
occasional user of lesser importance:
In Basic arbitrarily long names for variables are allowed. Nevertheless, the interpreter
distinguishes only the first two places. "KUCKUCK" and "KUHFLADEN" for the interpreter are
exactly the same. The compiler is designed for however arbitrarily long variables. For
compatibility reasons, but he distinguishes only two places. With "£LONGNAME" can remedy
this deficiency, if one takes into account that the program no longer runs properly under
the interpreter. "£SHORTNAME" switches back to double-digit name.
When using long names should make sure that no Basic command is included in the name, as
this inevitably leads to an error.
"£IGNORE" tells the Compiler to ignore everything below. Only when he meets "£USE" he
examines the Basic program. This function is useful if you want to hide some parts of the
Basic program of the compiler. This can be very useful when the running ability to be
retained under the interpreter and you still want to take advantage of special compiler
features.
£SETPREFERENCES
If you do not want to put new in each program by compiler directive his favorite settings
(for example, start-up, default data type and so on), then you can write a small program
that sets the desired settings, and then the committed "£SETPREFERENCES" command. The
current settings of the Basic-Boss are then copied to the default settings and the
compilation process is aborted. If you now with the Basic-Boss << -> restarts, you can enter
an asterisk ("*") followed by a name under which your individual Basic-Boss is then stored
(not the original disk!). In the future, you can then use this Basic-Boss version instead of
the standard version and will not have to re-set the most commonly used settings. A sample
program can be found under the name "PREFERENCES" on the disk.
This command is intended for expert on the machine language. The command word followed by
any number of comma separated values. This can be Byte values. It can also be password-
values if the numerical value is "w". Strings are also possible if one includes in this " "
". These Bytes or Words or character strings are inserted at the current position in the
compiled program. In this way, one can generate all of the machine language instructions of
the 6510. It is not need to take care of the register values (A, X, Y) as the Basic-Boss
does not require this. If one uses the "£CODE" command careless, then the compiled program
is then not run. A few examples: "£CODE 234,234" inserts two NOP instructions, which causes
a small time delay. "£CODE 0" sets a breakpoint. "£CODE 96" is identical to "RETURN". "£CODE
108,w40962" performs "JMP($A002)" and "£CODE 2" creates a secure system crash.
All variables are known to be set at the beginning of a program to "0" (FAST and address
variable excluded). This can be prevented by "£INITOFF". This command must be always at the
beginning of a program. If he is found before the code generation, then no variables are
initialized at the start of compilation and have a random value. When this command is used,
you should refrain from use strings, as they absolutely need an initialization. "£INITON"
switches the initialization again.
The Basic-Boss sees some new commands and functions. The commands initiated with a "<-" and
the functions with the At sign (@). Since the Basic interpreter does not handle both, you
can "£IGNORE" and "£USE" here put to good use and provide for interpreters and compilers,
different instruction sequences, so that the program will continue to be tested properly
under the interpreter.
This command loads a file to the specified address from the specified device. If the address
is missing, then the file is loaded to the default address. If one omits also the device,
the device address "8 is" accepted. The program will be processed after this command in
difference to normal LOAD command regularly at the next instruction.
The Commodore Basic allows the programmer input commands GET# and INPUT# and the output
command PRINT#. This is sufficient for most applications. However, these commands also have
some disadvantages: numbers are converted to strings only when PRINT# and then saved as a
text, which consumes a lot of time and space. Similarly, the input is slowed INPUT#. For
each command execution is switched between input or output channels. This has a very
unfavorable especially with GET# on speed. It must be frequently worked with the relatively
slow strings, although this would not be necessary.
The solution offers a few new commands and functions Input and Output. The commands to issue
consist of the usual "<-" and the name of a numeric data type. This is then followed by one
or more comma separated expressions (mostly single variables or numbers). The result of this
expression is then converted to the specified type (if necessary) and written to the
currently active output channel. "<-BYTE 3" are, for example, a single Byte that has the
value "3". "<-REAL 1.2345" is made up of five bytes that match the memory size of 1.2345.
Just also work "<-WORD X" and "<-INTEGER X", the write exactly two bytes.
The input is in contrast to issue commands not implemented, but via functions, because they
can be applied more flexibly and more efficient. These functions always begin with a At sign
(@), which similar to the commands follows a numeric data type. No parameters are required,
so you can treat the functions like variables. On "A=@BYTE" a Byte is fetched from the input
channel and assigned to variable A. When "PRINT @REAL" five bytes are read and output as a
floating point number on the screen. "POKE 1,@BYTE" brings a Byte and writes it to address
1. These new commands and functions are in the form but not particularly useful, since they
only write to the standard output device screen and keyboard can read from the standard
input device. This defect helps following commands:
"<-OUT n" directs the channel output to the file n (as well as "CMD n").
"<-IN n" sets up the input channel to the file n.
"<-RESET n" switches the channels back to the default screen and keyboard devices.
If, for example, the 1000 elements of the real array "R(" wants to write to the file
"TEST,S" this can look like this:
When a read or write operation is enclosed, the "<-RESET" command must always be executed,
so you can control screen or keyboard. Because the commands "GET", "INPUT" and "PRINT" each
refer to the current input / output channel. Nevertheless, one should rarely possible reset
due to time issues. The operating system does not allow for that input and output channel to
be diverted. If the input channel has been diverted, so a "<-RESET" must always be made
first before the output channel can be deflected (or vice versa). You can also write data of
different types in the same file, if you meticulously paying attention to the data to be
read in exactly the same order as they were written. The program disk are two examples on
this topic called "BOSSDIR" and "RAMLOAD".
2.5.3 Memory Management
These three commands are intended only for specialists. It makes the most sense to use them
along with "£ALLRAM". "<-ROM" on the ROM and the input / output area (video Processor, SID,
Color RAM and so on), then that may be it accessed very quickly (with poke or peek in
connection with the compiler directive "<-RAM" the one precedes "£"). It can no longer be
accessed in the RAM from $A000 to $BFFF and $ D000 to $FFFF. Therefore, neither program
variables may still be in this range. "<-ROM" only switches the input / output range and the
operating system, but not the Basic interpreter. Can no longer be accessed in the RAM from
$D000 to $FFFF. "<-RAM" switched back on all of the 64 Kbytes. By "<-ROM" or "<-IOROM" only
simple operations with Word or Byte types should be performed. Each complex operation calls
a subroutine that returns to the RAM mode in general. Instead of using these commands, you
can also change the way safely, even with "POKE 1,X" perform (but also only in ALLRAM mode).
These commands are more suitable for more professional programmers. They are identical to
the same machine language instructions. With "<-SEI" you can lock the system interrupt. This
is useful when programming particularly time-critical applications that can not tolerate
brief interruptions. However, the keyboard no longer prompts for "<-SEI" and the time is not
counted. Thus, one should turn to interrupt with "<-CLI" as soon as possible. You can also
be used sensibly using these commands "<-RAM ","<-ROM" and "<-IOROM" if the program is not
running in "£ALLRAM" mode. You then should avoid complex operations. Otherwise called
subroutines may switch back to the ROM mode. You should run these commands very carefully
and do not perform Input and output operations by "<-SEI".
The Commodore Basic V2 is well known, is quite spartan and certainly not famous for his
command range. Meanwhile, you will quickly realize when trying to program graphics or
sounds. So it is not surprising that there are a variety of extensions and additional
routines that address this deficiency. From the perspective of the Basic-Boss, there are
basically three different types of such extensions: The simplest are called with "SYS
address". Possible parameters are previously placed by poke into certain memory cells (eg
POKE 900,A: SYS 49152") Its parameters a little more user friendly is the second type, which
is also called by SYS, but is appended to the SYS command expected (eg "SYS 49152, A, B$,
C"). The last type is the most convenient because it works with completely new commands (eg
"LINE X1, Y1, X2, Y2"). The simple extensions make the compiler no difficulties, since only
completely normal Basic commands are used. Just as willing to process the USR function. In
both cases, no special precautions are necessary provided that the extension does not use
major parts of memory (in which case you may need to work with £HEAPEND).
It becomes difficult for the compiler with additional SYS-parameters or even whole new
commands. Then special precautions must be taken, including one causes the Boss "£OTHERON"
at the beginning of the program. If the compiler is now an unknown command (more tokens or
token sequence), then it assumes that it is the command of an extension. The Basic-Boss
evaluates the unknown command including parameters and delimiters and writes all together in
a special format in the compiled program. The appended to the command parameters from each
other by commas or any other special characters (such Example, be separated with a basic
command) (eg "LINE X1, Y1 TO X2, Y2"). Even more separators or none are accepted. But the
order and the type of delimiters to be expected from the expansion, as well as the command
itself, since otherwise the compiled program a "SYNTAX ERROR" occurs. Because the compiled
program executes the command does not itself but passes it to the Basic interpreter. If an
extension is in memory, which is properly integrated into the interpreter, then they will
process the command. The extension can be passed only Strings and Real numbers, because the
interpreter knows only these types. Other data types are therefore converted to Real. Above
all, it should be noted that the extension should only have read access to the variables. A
machine routine for sorting strings can, for example, are already not used solely for the
administration of the string completely new Basic-Boss. "£OTHERON" by the way also works in
the ALLRAM mode. However, then the transferred string can not be longer than 80 characters
and you should note that the extension also their storage required, the one you should
secure as with "£HEAPEND". "£OTHEROFF" disables the management of SYS extension parameters
and commands. This is the normal state. For those interested a word to the principle: the
transfer of SYS-parameters is actually not readily possible because the variable structure
of the Basic-Boss that of the interpreter is different too. Fortunately, the interpreter
provides a vector for fetching an arithmetic element. This vector is directed from the
compiled program on your own routine in "£OTHERON". Prepares you for the Basic-Boss
variables and fed it to the interpreter, who in turn passes it on to the machine program the
extension. The separator character reads the extension itself. For new orders still come
into play another vector ($308/$309), over which the compiled program starts expanding.
£OTHER
Some extensions to work despite "£OTHERON" with the compiled together and not only produce
"SYNTAX ERROR". This applies to a certain class of extensions that it is often seen that
their commands are preceded by a special character, for example Left Arrow, exclamation mark
or brackets or similar (there are no real token used). If this is not the case, then you
should invite her Basic program even without the expansion in memory. If the extension
commands are now still perfectly good to read, then your extension belongs to this group.
Their commands can not handle without help, because he does not know where the command to
stop and start the parameters of the Basic-Boss. If the instruction for example "!COLA" is,
then either a single command called "!COLA" or "!COLA" mean, with A as a variable. The
"£OTHER" directive creates the remedy. You should follow a list of all the commands used in
the progam, which are separated by commas, for example "£OTHER !COL,!PLOT,!HIRES". If a
program line is not enough, also several other directives can be used. However, for safety's
sake you should not be in REM lines, but are kept by the interpreter by GOTO (for example 10
GOTO11: £OTHER !COL"). Then the extension commands may also contain normal basic commands
(for example "!TEXTON" contains "ON "). "£OTHER" must stand before the first extension
command (otherwise the "7/CODE MOVED" error is possible). In the modern extensions of the
OTHER command is not required (for example HiRes-Master from "The Best of Grafik 3").
In rare cases, it may happen that an extension command unit with a Basic-Boss command in
conflict. If an extension command for example "<-LOAD", the Basic-Boss will incorrectly
assume that this is meant for him. So you can switch off with "£BOSSOFF" all directives and
orders of the Basic-Boss. With the exception of "£BOSSON" because as you switch the commands
again. Both directives can arbitrarily are often used in the program. Which extensions work?
My experience, comprehensive Basic extensions such as Simons' Basic and G-Basic does not
work together with the Basic-Boss because they interfere too deeply into the internal
structure of the Basic. The typical graphic enhancements such as Grafik 2000 (The Best of
Grafik 2), or quite fast HiRes-Masters (The Best of Grafik 3) working against it very well
with the compiled program. In HiRes-Master is to make sure that you bring the strings
"£HEAPEND $8000" in security. Both extensions require no Other command (only "£OTHERON").
Even the Scroll-Machine (The Best of Grafik 2) cooperates with the Basic-Boss. However, here
the Other directive is needed. Other extensions use partially the Basic start up to make
room for sprites or graphics. Again, this is not a major problem. One has only with the
Basic-Boss "£ROUTSTART address"
tell where the start is basic (as compilations, that machine programs as opposed to Basic
programs are not relative). With loaded extension can be the starting address with "PRINT
PEEK(43)+256*PEEK (44)" learn (the end address for £HEAPEND with "PRINT
PEEK(55)+256*PEEK(56)"). Otherwise is still important to ensure that the extension fetches
the values of the variables and not writes herself into it. When it is used third-party
extensions or ... it should not be used fast variables because the memory locations $FB to
$FE remain without changes. When using interrupts the extension (for example raster
interrupts to split screen), then you should never use "£ALLRAM". If in doubt, however,
helps only try. The compilation is like a normal BASIC program loaded and started. Of
course, the extension must be in memory. A demonstration program with a small sample
extension is in addition to source code on the disk under the name "OTHER".
Due to the different working principle of interpreters and compilers result in some of the
normal commands differences or new features. I have also improved a few commands. All that
is listed below.
2.6.1 Improvements
At a few points I have made improvements or corrections. These expand the possibilities, but
do not cause the compiler incompatibilities that arise. However, a basic program does not
work properly under the partial interpreter when these opportunities.
Hexadecimal numbers
A=ASC(A$)
The ASC function was slightly modified. If A is empty, then returns the ASC (Byte) 0, and
there is no "illegal quantity error". This makes sense, because at "GET A$" is a null
character becomes an empty string.
A=FRE(X)
This function returned the interpreter the size of the free space. The result was
occasionally negative (when the area was greater than 32 Kbytes). Well it basically provides
the size of the remaining free memory string and positive impact.
RESTORE
Can now have a line number as a parameter. If the next READ command should refer to the
example on the line 150 so you can now write "RESTORE 150". Thus the data does not have to
necessarily read from front to back and no longer need so embarrassing to pay close
attention to the order.
Does not change the syntax. Nevertheless, these commands have become a good deal more
powerful. The compiler directive "£DATATYPE Type" allows already store the data for DATA in
its determination type, which saves memory and processing speed significantly. You can find
further under 2.4.1 "Control of Data Types" in " £DATATYPE".
There is a second version of the FOR-NEXT loop that can be activated by "£FASTFOR". For
details, see 2.4.2 "Optimization" in "FASTFOR".
All three commands are completely identical to the Basic-Boss with END. For the LIST command
in the compiled code makes little sense, since it would best show the SYS line and then exit
the program anyway. NEW is pretty meaningless in the program and a proper implementation of
STOP does not seem sensible to me.
CONT
They work the same as under the interpreter. LOAD loads data into memory and jumps to the
beginning of the program. SAVE saves the current program in memory from Basic and VERIFY
compares it with another program to disk (and optionally generates a "verify error"). SAVE
and VERIFY were implemented only for the sake of completeness.
2.6.3 Changes
Here are the commands that are not quite as responsive in the compiled program, as under the
interpreter.
INPUT
The concept of the INPUT command is changed a little thing: When "INPUT A,B,C" how else can
show up a "redo from start" notice, if the input is nonsensical. When interpreter, the user
must then enter all three values again. When Basic-Boss he has to enter the values from the
parameters in which the error occurred. The full compatibility seemed rather pointless.
IF A$ THEN
The condition is fulfilled in the compiled code, if "A$" is not empty. The interpreter
responds here apparently whim (now and then with a "formula too complex error") which
suggests to me that this is wrong in lnterpreter. The once published in the magazine 64'er
program "TURBODIR" not as a compiled program works because it takes advantage of the
operating system error. It is checked for the length of 0 where the wrong variable. Since
the interpreter does not check the specified variable, but the other, it works under the
interpreter anyway.
They work normally as expected, but crashes in a given situation "RETURN" from:
This sequence works the interpreter properly. The compilation against crashes. The reason
for this lies in the fact that in the machine language instructions "JSR X" and "RTS" the
Basic-Boss GOSUB and RETURN translated, which also appears as the only sensible way.
However, these commands occupy the stack. However, since FOR sets its parameters on the
stack, RETURN processes the values that were originally designed for NEXT and jumps
somewhere. This could be avoided by a special identifier of the stack content, similar to
the interpreter makes. That would drastically reduce the speed. Such a stack management is
still in the planning stage (switchable). Incidentally, there is no "return without gosub
error" as a superfluous "RTS" jumps back into the basic out of the machine program. Again,
this would not be the case with an identifier.
DIM
When using the DIM command, there are only few restrictions. However, one must be quite
clear that the DIM command is actually a compiler directive, which is why he is already
evaluated during compilation. Therefore it is not allowed to use variables in sizing fields
(for example, "DIM A(B)"). In addition, a variable before its use should be dimensioned with
a DIM (even if it should contain only eleven elements), since then some more efficient code
can be generated (X-indexed addressing mode). Directives from the nature of DIM results also
prohibit the following construction, since the compiler is not based on the actual order of
execution, but the programs by going from front to back:
10 dim a(10)
20 goto 40
30 dim a(20)
40 :
DEF FN
Since the compiler as opposed to the interpreter does not evaluate the expressions during
program execution, problems also arise here. A function must be defined prior to their use
(for example, in a line with a smaller number). A FN function must not be defined more than
once in addition, how is that possible in Basic. Nesting of FN expression is allowed, as a
mixture with variables of type "Constant". One should nevertheless very spare with DEF FN,
since it can greatly extend the compiled program, for the appearance of a FN function every
time it is re-evaluated. This is in the nature of FN reasons: It is a macro and not a
subroutine.
LOAD
Under the Basic interpreter is a program load additional Basic programs. The program then
has reloaded the memory of his predecessor, and can access its variables. This only works if
the program is reloaded smaller than its predecessor and the variables are no string
variables, in the form " A$ =" ... " " were set. A Basic-Boss compiled program can also
reload any other program. But the successor can not access the variables of its predecessor.
In a pinch, you can pass values to POKE, PEEK or address variable (recommended is the range
828-1023).
In all three commands can occur in rare cases, problems with the data types of the Basic-
Boss. Because these three commands the lowest type is the minimum type Boolean, ie at all.
If "A" is an expression, that expression is calculated in its type. The command sequence
"W1=5: W2=2: PRINT W1/W2" will not, for example "2.5" but output "2", if "W1" and "W2" are
Word variables. Meanwhile, you should be aware of when using these commands. You can change
this with the directives "PRINTTYPE" and "BOOLEANTYPE".
The length of the program varies approximately between 80% and 170% of the length of the
original program. One can safely reach factors of 10% or 1000% if it intends to. Normally,
however, this will never be the case. If programmed effectively varies the factor is between
80% and 120%. Add to this the hyperlinked routines (String administration and all that is
normally in ROM). The variable range is shorter. A variable declared as a Byte needs only
one byte. The interpreter is required, in principle seven bytes per variable. The speed
factor varies between three and 1000. When using Word and Byte he is about 50 to 300. In
Real, it's between two and eight and in String it's between five and ten. Order of magnitude
corresponds to the speed of some time ago in the 64er magazine published As-Compilers, the
compiled code of the Basic-Boss but it's more efficient.
This describes how to obtain short and quick compilations. This makes the Basic-Boss
although fairly simple, but you must also do its part to himself. If you want to get short
and quick compilations, you should observe the following basic rules:
Unless it is somehow possible, the Byte data type must be used, because it is the actual
data type of the C64 and therefore the fastest and shortest. The range of values from 0 to
255 is sufficient for many applications (for example, string processing). If a larger range
is desirable, one should use word variables. They are half as fast and consume twice as much
space in the program and variables in memory. If possible, you should also use FAST
variables (especially for addresses in PEEK and POKE addresses). If you really want to do
any operations with signed numbers, because you want to use ">","<",">=" and "<=" but you
can't do without the operators, then you should use the Integer type of the Real type in
each case, as far as possible, then the Integer is as fast as Word in most cases, except for
">","<",">=" and "<=". If these operators are not required, you can expect the numbers are
signed, but where you have to watch out for conversions and the division even with Byte and
Word. Only when it is unavoidable, you should use Real variables or Functions. Similarly,
one should avoid Strings as much as possible. However, operations on Strings or Real numbers
require an extremely economical due to parameter passing principle less program memory than
most of the Word and Integer operations (for example, addition: 17 to 19 bytes in Word, 9
bytes in Real).
2.8.1.2 Transformations
It is extremely important to avoid unnecessary conversions. You should always use the types
that are expected for commands or operations. Which they are, can be read under "types for
functions and commands" in 2.3 "Data Types". The command "POKE A,B" for example, is horribly
inefficient when "A" and "B" are of type Real.
Then, an operation (POKE) made three operations (A <-Word, B<-byte, POKE) and the speed is
greatly reduced. It is similar with the other commands. There are also a few transformations
that may be used arbitrarily because they require neither space nor time. These are:
Boolean<-->Byte, Word<-->Integer, Integer<-->Byte and Word<-->Byte. Very little space and
time require the following transformations: Byte<-->Word, Byte<--> Integer. Especially
conversions to and from Real to be avoided. One should decide the data type for a variable
also based on their use. For example, if the variable "A" takes only the values 0 and 1, you
should not define them as a Byte anyway, but as Real, if it is to be charged exclusively
with Real variables.
Constant
The constant use of numbers instead of variables accelerated processing at Byte, Word and
Integer and saves space. Especially with addresses for PEEK and POKE should use constants
(or FAST variables). But if you want to use non-meaningful numbers, you could use the data
type "Constant".
Operations
If you are using Word, Integer, and Byte, it's best to only use simple operations (addition,
subtraction, assignment, comparisons, AND, OR). Operations such as multiplication, division
or exponentiation should be avoided, but where multiplication and division for special
routines for Word and Integer are used, which are still relatively fast. Essential to avoid
the following functions: SIN, COS, TAN, ATN, EXP, LOG, SQR, RND, and especially
potentiation. How this can often be realized is described later in 2.8.4 "Tables".
Commands
POKE, PEEK, GOTO, GOSUB, RETURN, FOR ... NEXT (FASTFOR), LET, ON, WAIT.
Even the PRINT command in Word, Integer, and Byte much faster, as special output routines
exist for these types.
Arrays
Avoid multi-dimensional arrays, because they are very slow because of calculating
multiplications are necessary and precisely "(dimensions-1) piece". Also, avoid arrays of
type Real and String and use "£SLOWARRAY" only for testing. For one-dimensional arrays, you
need not to worry regarding the speed at the data types Integer, Byte or Word, because the
access is very fast on these arrays due to special algorithms. Sizing your fields always at
the very beginning of the program, even if you need no more than eleven members (DIM A(10)).
Because to be able to apply a particularly efficient addressing the processor 6510, the
Basic-Boss must know from the beginning how big an array is. This only applies for one-
dimensional arrays of type Word, Integer or Byte that has less than 128 or 256 elements. If
you are using multi-dimensional arrays, you should use Constants for the rear dimensions, as
far as possible. You should create your arrays so as that you use instead of "A(10,I)" the
form "A(I,10)". This will save you a lot of time and multiplication, because the Basic-Boss
partially self calculates the array and the compiled program must calculate only the
remainder. On "A (I,10,15)" as two multiplications can be saved.
You should write your programs so that only the commands are executed that are necessary. In
particular, one should avoid the unnecessary processing of Real numbers or Strings. The
following program can significantly speed for example:
10 get a$
20 if a$="a" then ...
30 if a$="b" then ...
40 ...
50 rem here you continue
5 if peek(198)=0 then 50
10 get a$
Here, it is checked if the keyboard buffer is empty. If so, no operation string is performed
at all. This is the optimal solution.
2.8.4 Tables
You can greatly accelerate its programs with the help of tables. For example, consider again
the following routine to set a point on the screen. "X" (0 to 39) and "Y" (0 to 24) contain
the position and the routine is called with "GOSUB 1000". All variables are of type Word
(because they are charged with Word).
If this little routine is called frequently, then the program is quite slow, because
multiplication has been used. The additions are comparably small. But it is also better. The
multiplication you can save if you perform all possible multiplications before, and then
used only the results. Here's how:
10 dim sc(24)
20 gosub 2000
30 ...
1000 poke sc(y)+x,160: return
2000 for y=0 to 24: sc(y)=1024+y*40: next y: return
Now the multiplication results are read at the start of the program in an array, so it can
be accessed directly in the program. The same can be done for instance also for sine values
or with the powers of two are often needed because sine calculation and potentiation are
even slower.
10 a=10+20
When you start the interpreter with "RUN" as a result of this unnecessary addition. Because
instead of "10+20" it would be more sensible to simply write "30". If you compile the line
and examined the compiler, you will find that this does not perform addition. The Basic-Boss
has therefore recognized that here he himself can simplify a little and already during
compilation "10" and "20" added together, so the compiled code for "A=10+20" or "A=30" is
exactly the same. This instant calculations, the compiler with the basic arithmetic
operations "+", "-", "*" and "/" to perform. It can also potentiate or negate (for example -
(1+2) ). All these calculations are always performed in Real type. Even the expression
"1+2+A" can simplify the compiler. But on "A+1+2" he has trouble. Therefore one should
"A+(1+2)" write if you want to have efficient code.
As far as possible, FASTFOR should be used (see 2.4.2 "optimization possibilities" and
"£FASTFOR"). When using READ and DATA be sure to specify the type of data with "£DATATYPE
Type" (for more on "£DATATYPE"). In addition, "£SHORTIF" is recommended.
Probably you have basic programs that you wrote at a time when you knew nothing of Basic-
Boss. If you want to adapt such a program to the Basic-Boss, then gives a number of
characteristic problems. If you want to master these, then you should consider the following
steps: Make sure that DIM and DEF FN and determine whether these commands are used in an
improper way. DEF FN should be at the beginning of the program (before the use of the
function) and DIM must not be used to define array variables (see "Changes in Commodore
Basic V2" under 2.4.6 "problem cases").
Adjust then determines whether the program has any memory, for example for machine programs
or reloaded for a changed character set or the like. A sure sign of this is a POKE command,
which has the address 56 (Basic memory end) to the destination. This command is usually
followed by the CLR command. The POKE command you wish to remove, and instead use the
compiler directive "£HEAPEND address" which directly indicates the Boss Basic, Basic end
memory. With it you can ensure that the compiled program can be the reserved area untouched.
You should also remove all other POKE commands that affect the addresses 43-56. If the
compiled remaining space is not sufficient (the compiler reports "heapend unter heapstart"
("heapend below heapstart")), then you need to install either the reserved area or a part of
the compilation (program area, range of variables or string field) to another location
(possibly is "£ALLRAM" necessary). In any case, you should make sure that no POKE command
accesses the program on one of the areas of the compiler.
If the Basic program is very long, you can precaution "£ALLRAM" use. However, it is
important to ensure that the entire memory is then used. For example, if a machine program
from $C000 (49152) is located, then you should set the basic memory end with "£HEAPEND
$C000" before this area. If SYS commands are appended with parameters in the program, then
"£OTHERON" is necessary. However, it must ensure that the machinery routines do not try to
change the passed variable, but we also its value. Also, not all machine (language?)
programs tolerate Basic-Boss. This helps best try. Unlike other Basic languages are not just
assistance to structured programming; this is further complicated by the rather
uncomfortable line numbers and the concept of global, two-digit variable. In addition, many
consider it Basic programmers with the order not too sure why a basic program can easily
degenerate into an uncontrollable chaos. Therefore must be considered in the adaptation in
particular the following:
A Basic program normally operates exclusively in the Real type. However, since the compiled
program for calculations in this type is not overly fast, you would certainly like to use
the remaining types of Basic-Boss. This one should do but very economical, as in a Basic
program is not so easy to determine where the variables are used. Therefore, it is advisable
to redefine only a few variables that are used at central and especially significant for the
speed locations. You have to know exactly where these variables are used throughout to
ensure that they do not elsewhere must be of type Real, while you declare it as a Word, or
Byte Integer. The code in this way is indeed quite long, but it can usually cope with
("£ALLRAM"). For this work, a cross-reference program can be very useful in indicating
exactly where the variables are used.
Every now and then also provides the FOR-NEXT loop constitutes a problem. When popped in a
subroutine of a loop with GOTO, then you risk in Basic only a stack overflow, the compiled
program crashes against the next RETURN (see under "Changes in Commodore Basic V2" under
2.6.4 "problem cases"). Preventing you can do this by not jumping with a mere GOTO out of
the loop, but set the loop variable first to the final value, execute a NEXT command, which
does not lead to the beginning of the loop, so you can now work freely with GOTO. On this
theme, you will find a program called "FORRETURN" on the Basic-Boss disk.
If the first alternative is correct, I can not help you. Then you must proceed according to
the general rules for the eradication of mistakes. But if you suspect you have to apply the
data types is incorrect, you can tentatively set all variables to Real, by making all
declarations ineffective (with "£IGNORE" and "£USE") or by using the "@" after the REM
remove commands. The compilation is then indeed quite long and inefficient, but if it has
enough memory (if need, you can "£ALLRAM" to help take) and then runs the program, so this
is an indication that any variable should be of type Real, but this is not. Now you can find
the error, you can either conclude from the reactions of the program or in groups of
redefining the variables back to the desired type. If the program will not run, is probably
to blame for a peculiarity of the compiler. Is probably jumped out of a FOR-NEXT loop, so
the compiled during the subsequent RETURN crashes. It is also possible that the Basic
program calls machinery routines that are not compatible with the compiled program. Here is
an overlap of memory regions is conceivable that the compiled program is often longer than
the original. For this purpose you should look at the 2.6.4-"problem cases" under "Changes
in Commodore Basic V2". Finally, there is an error in the Basic-Boss into consideration.
Such is possible because the Basic-Boss is still very young. In such a case, you should
ensure that there is actually a compiler error. The program should therefore run flawlessly
under the interpreter and the errors described above should be largely excluded. I would be
most obliged if you could isolate the problem as much as possible, that is, the faulty
program should be made small as possible, without the error disappears. Then you should send
me the faulty program with a precise description of the error (the error effects); very,
very small programs than the expression and everything beyond that to disk. You may forget
the version number of your compiler in any case.
The compilation contains routines and algorithms written by me, especially in the region
routine. Nevertheless, I claim no copyright on the compiled program, provided these routines
are not removed and used for other purposes. The compilation can thus be freely copied or
sold unless the author of the compiled Basic program permits. In him alone the copyright for
the compiled program is located. However, I think it is fair that is mentioned in the
program or instructions that it was compiled with the Basic-Boss. For the compiler itself
full copyright applies. It also applies to the compiler manual. Both can not (even
partially) be copied or reproduced without written permission in any way. For damages caused
by the compiler is incidentally not assume any liability or legal responsibility.
There are two types of error messages. The reports of a Basic-Boss already at compile time,
and the others appear only in the execution of compilation.
These messages appear during the compilation process. Since it is the Basic-Boss is a two-
pass compiler, most error messages appear twice on (once in Pass 1 and once in Pass 2). The
errors message consists of at least two rows. In the first line line number, and behind it a
sort of extract the line are shown. This extract consists of the arithmetic operators used,
a point for each instruction and the colon, which separate the commands. The extract allowed
a more precise localization of the error. At least the double of points give an accurate
information on the location of the error and the operators can be useful. If unknown
operators appear occasionally (for example "k,g,v,u ....") so you should not worry about it,
since this arises from an internal representation in the Basic-Boss. The line below contains
the error number followed by the actual error message. The error number easier to find in
the error list. There are also some errors that may never appear and the text makes sense
only to me. Namely, if no error number is displayed and the error starts with a pound sign,
then this indicates a problem in the Basic-Boss that really should not exist. In such cases,
a division of a complex expression into smaller expressions fix the problem. A pound error
can also occur when certain errors are preceded that have the Basic-Boss suddenly pulled out
from the command processing. In these cases, the problem will resolve with the correction of
other errors by itself. One should not rigidify when an error occurs on the specified error,
because often out different types of writing errors to the same error. Therefore, you should
check with untraceable difficulties the general syntax of the fault location. In particular,
the previous expression should be examined closely because a mistake can put in it, which
causes the compiler to assume the expression to end early, which can lead to a variety of
error messages. For longer variable names you should make sure the fact that they do not
contain basic commands, as this may also have multiple effects. If an error appears, I can
not guarantee the functionality of the compilation. Some errors are so serious that the
compilation process is aborted when they occur anyway. If the displayed error line 65535,
the error occurred after processing the last line of the program.
The errors are classified by their number. This order does not purport to be useful, because
the list is only meant for reference. Follow a more detailed error description of the
problem and possible suggestions to correct it.
The end of the string memory is less than its beginning. This is typically the case when the
compilation is too long and does not fit in the basic memory, making it about the end of
string memory (usually 40,960 or $A000) extends. Remedy is for example the "£ALLRAM" command
and / or the laying of the string with memory "£HEAPSTART" and "£HEAPEND". The error also
occurs when you put the compiled program into another memory area, for example, after $C000.
Then it must also "£HEAPEND" are applied.
It is a calculation performed with direct numbers, which requires a division by "0" (for
example "PRINT 2/0").
The number range is exceeded by Real at a direct calculation (for example "PRINT 10^50").
Computing any error has occurred in a direct calculation is not precisely known.
The generated code of the previous line in Pass 2 is compared with the one generated in Pass
1 is shorter or longer. This error should only occur if other errors are preceded (for
example "Constant is not defined"). It disappears when the other errors are corrected. When
it occurs alone, then a variable of the same value was assigned twice.
If in the expression with IF appears GOTO and should appear THEN, then this error appears.
But it can also be the expression of IF in a faulty manner, the compiler assumes that the
term end early.
This message if the Basic-Boss is a token (a coded Basic command), he does not know will
appear. This is usually when compiling programs the case, which were created using a basic
extension and contain commands that extension.
Here the Basic-Boss suspects a command with too many parameters. The error comes about when
the Basic-Boss believes to have arrived at the end of command, but then neither is a colon
or a newline. A typical cause is for example the SYS command suffix parameter. Then the
"£OTHERON" command is recommended.
It was for example, attempts to assign something to a system variable, although this is not
allowed. This is for example, in the case of TI. ST enables one to assign something.
The compiler believes to edit a variable assignment, but is behind the suspected variable
with an equal sign. Then usually there is a command that was misspelled and the editor of
the interpreter has therefore not recognized as a token. But it can also be a long variable
name that contains the basic command words, which is not allowed.
The compiler did not recognize the additional instruction behind the left arrow. Presumably
it was written incorrectly or it is the command of a Basic extension.
A command like "£ROUTSTART", "£PROGSTART" etc. is not at the beginning of the program, as it
should be and therefore can not be utilized.
The compiler does not understand an initiated with a pound sign compiler directive. It is
probably a typo.
The compiler has at this point expects a data type such as "Byte" or "Word". There is
probably a typo.
The file name is too long and has been truncated to 20 characters. This error also occurs
when "£SYSTEXT".
The compiler expected at this point a quoted file name. Probably lack the quotes. This error
can also occur when "£SYSTEXT".
20/ES WURDE BEREITS CODE ERZEUGT [IT HAS BEEN GENERATED CODE]
The Basic-Boss has found a directive that is not the beginning of a program, there should be
but because they will not work properly (for example "£SETPREFERENCES").
Instead of "GOTO" can also write "GO TO". However, when "GO" without writing "TO," the
Basic-Boss complains.
There was a line number used for which there is no line. So you should examine where you
actually want to jump to appeal to either the previous or the next line then.
When DIM command either a comma or a closing parenthesis is expected behind each dimension
specified. Presumably, the expression has been suggested to end early, for which any
typographical errors might be responsible.
When DIM command an array is defined, which was used in the previous program text. Besides,
many dimensions must be used in each case the same. If this is not observed, then this error
appears.
Behind the loop variable must be specified in a FOR "=" are the Basic-Boss can not find
here. It is also a long variable name, which contains basic commands, which is not allowed.
At the FOR command was on the site of "TO" found something else. Possible is a typing error
or an error in the assignment after "FOR" so that its end is suspected to be early.
It was tried in FASTFOR mode, complete a loop with NEXT, which does not exist. The reason
for this could be, for example, that the "£FASTFOR" command in the program behind the FOR
command is targeted instead of before it. In any case, you should examine the FOR-NEXT
structure.
With FOR as may counter variable only numeric variables are used and no string variables.
Arrays are also prohibited.
The Basic-Boss expects a comma at this point. However, it may also be that the end of the
previous expression is thought too soon. It should be in doubt, check the entire expression
here.
32/NACH DEM INPUTSTRING MUSS ';' FOLGEN [AFTER THE INPUT STRING ';' MUST FOLLOW]
If after the INPUT command is a parenthesized string in quotes, a must for this string ";"
follow. After that, to read in variable follows.
33/NACH ON MUSS GOSUB ODER GOTO FOLGEN [MUST BE AFTER ON GOTO OR GOSUB FOLLOW]
After the ON command is followed by an expression, which in turn GOTO or GOSUB. If this
order is not complied with, this error. It is also an error in the expression after ON, the
result is that the phrase was supposed to end early.
34/DAS ARRAY WURDE BEREITS DIMENSIONIERT [THE ARRAY HAS ALREADY DIMENSIONED]
It tries to dimension an array twice with DIM was. One should look for the other DIM
statement and eliminate.
This error occurs only in FASTFOR mode. It tries to complete a FOR loop with "NEXT X", but
the specified variable at NEXT is not identical with the specified with FOR. Either the
variable has been misspelled or the FOR-NEXT structure is messed up.
36/BEI DER FELDDIMENSIONIERUNG DUERFEN KEINE VARIABLEN [IN THE FIELD SIZING PERMISSIONS ARE
NO VARIABLE UNRELATED]
If you dimension an array with "DIM A(B)", then you get this error, because the Basic-Boss
can not handle variable sizing. So you have to use constant numbers for example "DIM
A(1000)". If the field size before starting the program is not known, one has to dimension
the field for better or worse to the largest possible size and may utilize memory losses.
(See the "Changes in Commodore Basic V2" in Chapter 2.6.4 "problem cases".)
It was expected a number between 0 and 65535. It may be used at this point is not a
variable.
It tried too many send a function parameter. It is also a missing closing parenthesis for
nested functions and function arrays.
43/DAS KOMMA MUSS INNERHALB EINER FUNKTIONS/ARRAY-KLAMMERUNG STEHEN [THE COMMA MUST BE
WITHIN PARENTHESES IN FUNCTION / ARRAY]
The Basic-Boss can do anything with a comma occurring in the expression. This error can
occur only within a parenthesis.
The error is raised when a string expression is used in a function, although a numeric
expression is required (for example "PRINT ABS(A$)").
It attempts to address more dimensions of an array, as this has, according to its definition
with DIM (the first use of an array of Basic-Boss also considered as a definition) was. It
is also possible a missing closing parenthesis for nested functions and arrays.
Were specified with the use of array dimensions less than this, according to their own
definition with DIM (the first use of an array of Basic-Boss also considered as a
definition). It is also possible an excess close parenthesis for nested functions and
arrays.
48/DAS ARRAY MUSS MINDESTENS EINDIMENSIONAL SEIN [THE ARRAY MUST BE AT LEAST ONE-
DIMENSIONAL]
If less than one parameter is specified at the first use of an array, then this error
appears.
If an expression abruptly breaks off, then you get this message. The Basic-Boss expected
here may still be a number.
Declaring a variable using a compiler directive (for example "£WORD A,B") occurred only
after the code has been generated. Therefore, the declaration of these variables can not be
considered. It should therefore be at the beginning of the program as possible.
51/EIN STRING KANN NICHT IN EINE ZAHL UMGEWANDELT WERDEN [A STRING CAN NOT BE CONVERTED INTO
A NUMBER]
It is a string expression was used at a point where a numeric expression should be.
52/EINE ZAHL KANN NICHT IN EINEN STRING UMGEWANDELT WERDEN [ONE NUMBER CAN NOT BE CONVERTED
INTO A STRING]
It was used a numeric expression to a point where a string expression should be. May have
been trying to link a numeric expression to a string.
Behind a function is missing the opening parenthesis that there must necessarily be ("A =
SIN 10" is not possible). So basically you can not do without the grip.
An attempt to declare a system variable (such as TI, TI$, ST), which is useless but because
they have already been declared from the outset was.
At this point, a variable or possibly a number was expected but not found.
The floppy drive has the compiler signals an error. Behind "DISK ERROR:" You will receive
the message that was read from the floppy. You can look up their meaning in floppy manual.
After a disk error occurred, the compilation is aborted.
If, in the declaration of a variable follows behind an equals sign, then it must follow that
either a number or "FAST". Otherwise, this error appears (see "Data Types" in 2.3.2 "The
Declaration").
A maximum of four bytes with FAST variables are assigned. This corresponds to two
Word/Integer variables or four Byte variables. If these four bytes are used, then this error
appears.
Only variables of type Byte, Word and Integer variables are declared as FAST. These can also
be no arrays. The error can also occur if you try to assign a string variable, an address,
which is also prohibited. Possibly also an array should be declared as a constant.
It has made an error in the definition of a FN function with "DEF". Maybe you should look at
the syntax of the function definition again in the Basic Manual.
The same FN function was defined more than once in the program with "DEF". The interpreter
will not permit this, the Basic-Boss.
An attempt to apply an FN function was not defined at this time with "DEF" was. Such a
function must be defined in a smaller line number, and prior to their application.
If a FN function was found, the parameter is a string, then this message is displayed - for
example, when "FN("abc")".
It attempts to assign a variable of type Constant has a value twice. However, this is
allowed throughout the program only once.
An attempt is made to define a FN function or a constant, although the function of the text
or constant text is missing. There is therefore a serious syntax error at "DEF FN" or the
constant allocation.
The compiler with a "£" initiated function found that he does not know. Usually a typing
error is the cause. See also Section 2.5 "New commands and functions".
These are the error messages that are issued during the execution of the compiled program.
The number of the affected line is not normally displayed. This shortcoming can fix it if
you used "£LINEON" (see under "£LINEON" in Chapter 2.4.8 "Other directives". The errors are
not numbered, which is not really a problem as there are not very many, because most errors
are already caught by the compiler. It used to be the normal English error messages from the
interpreter. They usually have the same meaning as in the interpreter.
The program has arrived at a NEXT command without previously a FOR command has been
processed. You should carefully check the program run, therefore, to determine when this
NEXT is called. This error can not occur in a FASTFOR loop.
The READ command has run out of data. So you should check out when and where the READ
command is executed and the data to which it should normally access.
This error has the compiled program usually has a different meaning than the interpreter. It
indicates that the data to be read with the READ command from a different type than the
variable into which they are to be read. For example, has declared all data "£DATATYPE Byte"
as byte data, and later the command "READ R" is executed (R be a floating point variable),
then this error appears. If you still want to read it into a floating-point variable data,
it must first be read into a Byte variable, then assign it to a Real variables (for example
"READ B: R=B", where B is to be a Byte variable). If the data are of type String, this error
normally occurs because the READ command strings can transform into any other type. But it
will still appear when the conversion is impossible (you can not convert any letter string
to a number).
It attempts to address an array Elernent (element?) that does not exist was. The field
limits were exceeded so if for example, as with "DIM A(100)" dimensioned a field and then
with this "I=101:A(I)=1", then you get this error. By default, this error occurs but not in
all fields. In one-dimensional Word, Integer or Byte fields, a field overrun is not noticed
unless you use "SLOW ARRAY".
The error has nothing in common with its original meaning (it can normally only occur in
direct mode). The compilation (more precisely, the garbage collection) shows him that the
string memory is defective. The reason for this can be either a careless poke in the string
memory or at worst an error in the string management of the compiler.
The error can only occur when adding strings (for example "A$=B$+C$"). The string to be
added, have a total length of more than 255 characters, which is not processed my string
management.
This error can be triggered in the MID$ function, if the second parameter is "0" (for
example "MID$ (A$, 0, 2)"). It must be at least "1".
SYNTAX ERROR
If extended SYS commands are allowed "£OTHERON", then this error can also occur. It is
triggered by the compiled code when the parameter passing is mixed up to the called machine
program. In "£OTHERON" other faults may occur that causes the called machine program.
There are also other possible messages that originate from the Basic interpreter of
C64/C128. These messages generally have the same meaning as usual (for example, "division by
zero error" or "overflow error"). They can occur because the arithmetic routines of the
Basic ROM be used by partially compiled code (for real numbers).
-------------------------------------------
- Appendix A - Overview of all directives -
-------------------------------------------
--------------------------------------------------
- Appendix B - Additional commands and functions -
--------------------------------------------------
1000,1001 They contain the values "123" and "234", the automatic mode is activated
---------------------------------------------------
- Appendix D - value ranges of the variable types -
---------------------------------------------------
+------------------------------------------------------------------------+
! Type ! Range minimum ! Range maximum ! Memory !
!-----------+---------------------------+--------------------------------+
! Real ! +-2.93873588*10(exp)-39 to! +-1.70141183*10(exp)38! 5 Byte !
! Integer ! -32768 to ! +32767 ! 2 Byte !
! Word ! 0 to ! 65535 ! 2 Byte !
! Byte ! 0 to ! 255 ! 1 Byte !
! Boolean ! 0 and ! -1 ! 1 Byte !
+------------------------------------------------------------------------+
--------------------------------------------------
- Annex E - The Software Load Speeder Ultra Plus -
--------------------------------------------------
The loading of Basic-Boss takes without floppy speeder approximately two minutes. If you are
compiling multiple programs, so there is a considerable loading time. With the program
"Ultraload Plus" described here, you can shorten the charging time by a multiple. The Basic-
Boss, your Basic programs, and your compilations are then loaded into a seven-time speed.
Please download the file:
Now you can use the increased charging speed. Their programs invite as usual. The following
description of "Ultraload Plus" is divided into two parts: The first part describes the
program for the user (the benefits and opportunities), while the second part applies to
interested programmers who want to know more about this system. But first, a simple
description of this program. Even though you might not have your floppy for the C64 (C128)
long, so be sure you have the 1541/1570/1571 have met the infamous long wait times. There
are now several solutions to deal with the slow speed of the floppy disk drive, be it
hardware or software. Ultrload Plus is a software solutions and, moreover, a very good one.
The following are the benefits to you are listed as a user:
Maybe you already know the program "Hypra-Load". But Ultraload Plus is also better than
Hypra-Load, as the following summary shows.
So you see that Ultraload Plus brings several advantages. Above all you will but the
blindingly fast strike. Gone are the coffee breaks when loading the 193 block long Basic-
Boss. To collaborate with Ultraload Plus, you only need to start it with the commands
mentioned above. Then you have the faster loading routines immediately. In the last line of
the startup message you see a SYS command (SYS 336). You can use it, you should hold <RUN-
STOP/RESTORE> or have triggered a reset. Even then you can continue to use the faster
loading routines immediately, without having to reload the program.
Should there be a program that does not run smoothly with the floppy speeder, I would refer
you to the following part, do not be put off by any special terms. In between, you will
always find valuable information to work with this program, for example increasing the speed
to up to 8 times! In addition to two tool (tools) provided, which are also described below.
The fast data transfer from the disk drive to the computer is based on the simultaneous
transmission of two bits on the restricted handshake mode as well as the time saving use of
a table. In search of the Directory Entries own GCR encoding is used (Group Code Recording,
as is the recording process of the 1541). The rapid data transmission to the drive is
responsible for the delayed fractions of seconds starting the engine and is based on a very
short transfer routine. Loading the directories (LOAD "$", 8 ...) is not accelerated. This
is the VERIFY command - as mentioned above - processed faster. In contrast to the original
routine-Verify, the program breaks when a fault occurs immediately. Use the command sequence
"PRINT PEEK(174) + 256 * PEEK(175)" You can find the first different byte.
If you list the program directly after loading, you will see the following line:
In the following we will explain each parameter in detail. We will replace it but first
through letters to make them easier to describe. Accordingly, the start line is as follows:
In principle, the length of the Basic line must always be the same. Therefore, any changes
must be provided with leading zeros (eg 00288 instead of 288).
But now we come finally to the parameters: Ultraload Plus can be either two-part or three-
part version in memory. For each part there exists a start address (A-C). Because two parts
of the address of the third program block can be omitted, it is necessary in the case B with
the specified information coincide C (E must be 2).
A is simply given as a decimal, so it can take values between 0 and 65535 (these are all
possible addresses in C64). It is recommended, however, to remain at the address 288. The
following information about the data B and C are understood only assembly language
programmers of you. But that's no reason to despair, there still below a solution for all
the other readers will be offered. The boot routine (from 288) calls the main-program (about
2 Kbytes) on. The data for C (main part), determine by specifying each of the high byte of
the address (decimal). So that means that the number 88 represents the start address 22528
(= $5800). As already mentioned, must correspond with the two-part version B and C.
This second part contains all loading routines and a small memory. It is protected against
overwriting by itself, that is, it can not be destroyed when loading. This part of the
program for example you can put in the RAM under the kernel or to the RAM under the I/O
modules. The third and last part is the so-called work area (determined by B). This area is
protected against overwriting. First, I would like to illustrate this principle, the memory
layout of an example:
The boot part is therefore from address 288, the work area from 49152 (= $C000), the main
part is from 54784 (= $D600), and the "3" at the end once again indicates that it is a
three-part version. The fifth parameter specifies the transfer speed is to be loaded and
saved with the. This "N" stands for normal and "H" for high. Would you like to improve the
speed by a factor of 8, enter the following lines:
open 1,8,15
print# 1, "m-w"+chr$(105)+chr$(0)+chr$(1)+chr$(7);
close l
With this brief command sequence of the block spacing is changed on disk of usually ten to
seven. This allows access Ultraload Plus more quickly to the disk. All programs that have
been saved are also loaded later faster. However, this mechanism only works if the transfer
mode to "H" have provided. Finally, I would like to address in the event that a program is
not cooperating with Ultraload. Download the program to "ULTRALOAD TOOL 1", and run it. It
fills the memory with a specific code, and then performs a reset. Download then your
"problem child," and solve again a reset (SYS 64738 or, if necessary with a reset switch).
Download now "ULTRALOAD TOOL 2", and then also this tool. Then you start all the possible
addresses for the individual program components of Ultraload Plus display. These values can
then immediately take over in the SYS command from Ultraload Plus.