Tape and Disk - Adapting programs to the system TR-DOS (Part 3).
Adapting programs to the system TR-DOS
CHAPTER 3
=========================
MORE ON BASIC = =
A programmer who is not familiar with the representation of
numbers BASIC interpreter Computer ZX Spectrum, a lot of
surprise, faced with the following program:
10 CLEAR 100
20 PAPER 27: INK 8E-12: BORDER 65536: CLS
30 PRINT AT -10000,22 E22; "PLEASE WAIT"
40 LOAD "" CODE 0,0
50 RANDOMIZE USR 0
This programmer will be strongly
argue that this nonsense is written in no other way,
as psychiatric patients,
until then, until the program starts and
not see the results of its work. What happens to the
programmer, after a middle of the screen will display PLEASE
WAIT, then download and run the game
difficult to predict. Most likely, he
run in the PND with a presumptive diagnosis
"Manic-depressive psychosis on the basis of
programming.
To you it does not, you will discover another mystery. The
thing is that the processing of numbers BASIC interpreter uses
two of their submission. first impression is pleasing to
Eye symbolic form in which the number of
16389, for example, is written by five bytes per table ASCII.
However, such form a relatively long handled
BASIC interpreter, therefore, for their
needs, it uses a different representation
binary numbers. Binary form of numbers,
prefixed with Code 14 (0Eh),
stored in memory immediately after
symbolic forms. Number 16389, for example,
looks in memory as follows:
symbolic form of pre-binary
June 1 3 8 9 fixe form
... 49 54 51 56 57 14 0 0 5 64 0 ...
This shows that the binary form of
occupies 5 bytes plus bytes prefix. When
entire record of the constants in the range from 0 to
65535 "meaningful" is the third and 4-byte
after prefiksa.V this case, the binary form of numbers can be
pervesti to decimal using the operator
PRINT PEEK (n +3) +256 * PEEK (n +4)
- Where n is the address to which the stored bytes
prefix.
Binary and symbolic forms of numbers exist in parallel. When
you execute the BASIC interpreter is guided only by the binary
form, character Form does not care, it is saved
for the sake of readability of programs. Therefore,
"Blight" symbolic representation of numbers
resulting in a horrible kind of program listing,
but does not affect its performance.
Binary form the number is added at the time syntax checking
line, that is After a set of rows and press Enter.
When you call on-line editing binary form is removed, and after
I corrected the line is restored in accordance with the new
edition.
From the above it should be clear that
mysterious program given at the beginning
this chapter will not work if it
enter from the keyboard in the usual way, not
using any special techniques
(Maybe you've tried it to recruit and
run, and decided that no one else like me
and I am a patient of the above clinics)
In order to bring the program to such a perverted mind,
while leaving its workable, requires external means, for
example, the monitor debugger STS5.1 or similar. However, we
still are talking about adapting programs to disk, rather than
bringing them into a state of alcoholic intoxication,
therefore, the problem we are back.
It would be possible to do a lengthy description of the
representation of numbers in binary form, but I prefer to give
practical advice on the calculation of what is hidden under the
guise of symbolic forms.
The simplest and most effective way to
determining the true values of the numbers of
my experience, is a permutation operator instead of the PRINT
program operators. In this case all the numbers used by the
program, will be successively displayed on the screen in the
normal way.
If provided in the beginning of the chapter program change
follows (note Note that not using the numbers operators and
other "extra" characters are replaced gaps outlined in this case
underscore):
10 PRINT 100
20 27 PRINT: PRINT 8E-12: PRINT 65536: ___
30 PRINT _-10000, 22E22 ;________________
40 PRINT ___0, 0
50 PRINT _0
- As a result of its implementation on the screen
appears:
24999
0
4
0
October 1910
25000 40000
25000
0 OK, 50:1
Substituting these values into the program, we get the
familiar and intuitive text:
10 CLEAR 24999
20 PAPER 0: INK 4: BORDER 0: CLS
30 PRINT AT 10,10; "PLEASE WAIT"
40 LOAD "" CODE 25000,40000
50 RANDOMIZE USR 25000
If you have already reached out to key Edit,
to quickly arrange the operators
PRINT, I advise you to read all over again.
As already mentioned, the call to edit a binary form of
permanently is lost, there is only symbolic, and
If you modify INK 8E-12 at PRINT 8E-12
using the BASIC editor, then get
neither more nor less than 8E-12.Chtoby replace the operators
of the program on PRINT, do not "break" the binary form of
numbers, we need other ways. You can use all the same debugger
STS5.1; in extreme cases will come down and the operator of
POKE. This text is not my aim to educate the work with the
debugger, so tell better how to defeat the program without
improvised.
POKE operator is very good, but only
if you know what settings need to follow after him. And it
needs to look into the computer's memory. For example, we use
the line, which displays the address and the contents of cells
memory and the symbolic representation of the
Content:
FOR n = 23755 TO 4E10: PRINT n, PEEK n;
TAB 22; CHR $ (PEEK n * (PEEK n = 32)): NEXT n
After completing this line on the screen we get:
23755 0? line number
23756 10?
23757 11? string length
23758 0?
23759 253 CLEAR keyword
23760 49 1
23 761 48 0 sim.forma parameter
23762 14 0
23763 14? prefix
23764 0?
23765 0?
23766 167 COS binary form
parameter
23 767 1997 _
23768 0?
23769 13? carriage return
23770 0? line number
23771 20?
23772 38 &
23773 0?
23774 218 PAPER
23775 50 2
23776 55 7
scroll?
Now you need to carefully examine the contents of the screen.
As you may already know, the first two bytes
is the row number, then the keyword
CLEAR, which is actually what we need.
Grab a piece of paper and pencil and write down the address to
which is CLEAR (2375 9), and continue this highly intelligent
work. After CLEAR following symbolic form
number, then binary, then the symbol
"Carriage return" (end of line), number and
length of the next line and the operator PAPER.
Again, take a pencil and write down the address
operator PAPER.
After reviewing the program to the end and writing
all addresses that need to be replaced
you can begin to change:
POKE 23759,245: REM Replace CLEAR
POKE 23774,245: REM Replace PAPER
POKE 23884,245: REM Replace INK
POKE 23997,245: REM Replace BORDER
POKE 24110,32: REM Replace CLS
POKE 24117,32: REM Replace AT
etc. The number 245 is the code the keyword PRINT, and 32 code
probela.V this example, spaces are replaced the following
operators and symbols:
CLS
AT
"PLEASE WAIT"
"" CODE
USR
When will you make all necessary changes, review the program
listing, to make sure that fixes everything
what you need. Then the program can be run
and examine the results.
Sometimes this operation can be somewhat
simplified. If the binary representation
numbers using integers between 0 constants
65535, then to determine their true values
can be directly while viewing the memory. To do this, it is
desirable to add to pencil and paper, calculator.
Find in the symbolic form of memory that you want to
"expose", followed by the be a prefix and binary forma.Esli an
integer between 0 and 65535, the the prefix two zeros, then the
two numbers in range from 0 to 255 and another zero.
If not, then definitely we can say that number or not an
integer, or leaves outside the specified range. In this
case it is better to resort to the previous method. If the
number of "fit", then multiply 4-th byte of the prefix 256 and
add 3rd. In this example, to get the option of the operator
CLEAR, we must calculate:
PRINT PEEK (23763 +3) +256 * PEEK (23763 +4)
or
PRINT 167 256 * 97
The result (24,999) and there is
that tried to hide from us.
Uncover the secret of another common focus based on the
knowledge of the number format BASIC interpreter (although may
otgadku you already know).
You probably have met such
lines:
10 CLEAR VAL "24999": INK VAL "7": PAPER
BIN: BORDER BIN
Thus, programmers save memory. Paradoxically, but
Record VAL "24999" takes up less space
than 24,999. Since the first case
number 24999 zalkyucheno in quotes, it is a character string,
and not by the number and has, after a six-byte binary
representation. If you select VAL
this line is translated into a number. Thereby saving three
bytes. As for BIN, the win is even more evident. If, instead of
BIN substitute 0, then the memory will be occupied by more than
six bytes, and the same result.
This way of saving some memory
slows down the program, but it can and should be used in the
loader, so as they are usually most sensitive to size and are
not critical to the speed implementation.
Continued to be ...
-----------------------------
In the next issue of Micro searched Chapter 4
= LOADER, native =
For those who do not know
What is computer code.
..........................
Gloom Demons Inc. & Computer Eye
special for Micro 9.
08.10.98
Other articles:
|
|
Tape and Disk - Adapting programs to the system TR-DOS (Part 3).
|
|
|
|
|
|
|
|
|