|
ZX Review #5-6
04 ноября 1997 |
|
Forum - Studying and debugging @ files using STS 5.1. Features of debugging using a monitor STS. Bugfix STS 5.1.

(C) Ivan Roshchin, Moscow, 1997
Features of debugging
using a monitor STS
Surely every programmer in debugging their creations a
thought: it would be good to any time during the program being
debugged when you press a certain key combination to go into
the debugger (eg, to see the values of variables)
and then, as if nothing had happened
return to program execution. In the ZX-REVIEW have been
articles on this theme (eg, p. 244
for 1991. on page 33 for 1993)..
Here I want to tell you about the application for this purpose,
the most popular monitor debugger
STS.
In the debugger, there is
opportunity to put in the program being debugged breakpoint
above which is the output of STS. Consider in detail what
happens when you set a breakpoint (using key "W"), and leaving
in STS, when the program being debugged has reached a
breakpoint.
If you set a breakpoint:
1) of the cells and ADR_W ADR_W +1 Be
address the previous point is taken
breakpoint.
2) At this address is entered with
derzhimoe three bytes of memory
earlier (when installing the previous
ing breakpoints) to remember
GOVERNMENTAL in cells ADR_B-ADR_B +2.
3) In cell ADR_W and ADR_W +1 for
sends the address noted
cursor.
4) In the cell ADR_B-ADR_B +2 shown
pertains contents of three bytes
memory starting address of
labeled with the cursor.
5) The address marked the course
rum, recorded a team JP
ADR_OST.
When an executable program
reaches a breakpoint:
1) jumps to the address
ADR_OST, and control variables
given by the resident of the STS.
2) STS content stores
all registers, interrupt mode
vany etc.
3) From cells ADR_W and ADR_W +1 Be
address breakpoint is taken.
4) At this address is entered with
derzhimoe three bytes of memory
earlier (when this
breakpoints) stored in
cells ADR_B-ADR_B +2.
5) You can work in STS.
Given enough information to write
piece of software that, when
Pressing a certain combination
keys (eg, "SS + D" - from
words "Debugger") provides
entrance to the STS with the possibility of
further continuation of work
program being debugged. Need
only know the address ADR_W, ADR_B
and ADR_OST. I note that in different
STS versions of these addresses are different, and address
ADR_OST depends More on the location of the STS-resident in
memory. To find ADR_OST, just look what the command STS will
supply when you press 'W'. To find ADR_B, you can say, write on
some memory address bytes # AB, # CD, # EF, then put this
address breakpoint and find the address at
STS which kept these three
bytes. To find ADR_W, to
put in a URL (eg # 8000) breakpoint, and then see where
These two bytes (# 00, # 80) are stored inside the STS.
Here is the address for the five known versions of my STS
(provided that the resident is on at # 5B90):
ADR_W ADR_B ADR_OST
STS 3.2 # DFC3 # DFE4 # 5B98
STS 3.3 # DFC3 # DFE4 # 5B98
STS 4.1 # E064 # E07C # 5B9B
STS 4.3 # E06E # E088 # 5B9B
STS 5.1 # E02E # E038 # 5B9B
The following piece of you
can insert in the remote
program, for example, after the procedure poll the keyboard or
another frequently used location.
I note that the address of its
location in memory must
be less than # C000, as in this
fragment switch banks
RAM.
140.
ADR_W EQU # E02E; these addresses are given for
ADR_B EQU # E038; STS version 5.1, if the resident
ADR_OST EQU # 5B9B; Available at # 5B90.
BANK_S EQU # 1F; BANK STS
BANK_D EQU # 18; Bank program being debugged
LD BC, # 7FFE; ADDRESS keyboard port
IN A, (C); CHECK OR DEPRESSED "SYMB.SHIFT"
BIT 1, A; IF YES, SET FLAG Z
JR NZ, NEXT_C; IF not pressed, exiting ...
LD B, # FD; changes of address PORT
IN A, (C); similarly verifies
BIT 2, A; KEY "D".
JR NZ, NEXT_C; IF not pressed, exiting ...
LD BC, # 7FFD; determined by the Bank, in
LD A, BANK_S; WHICH IS STS.
OUT (C), A
140.
; Emulating for STS breakpoint:
LD HL, ADR_B; HERE ARE 3 bytes
; Memorized INSTALLATION
, Previous Breakpoints.
LD DE, (ADR_W); ADDRESS WHERE they should be
; PLACE (REQUIRED BELOW # C000)!
LD BC, 3
LDIR; RESTORES 3 bytes
LD HL, NEXT_C; ADDRESS First team
LD (ADR_W), HL; BE IMPLEMENTED AFTER EXIT
; FROM STS, Writes CELL
; ADR_W .. ADR_W +1 (STS THEY KEEP
; Address to which was installed
; Breakpoints).
LD DE, ADR_B; IN CELLS ADR_B .. ADR_B +2 STS STORE
LD BC, 3, 3 bytes, located at
LDIR; Breakpoints.
LD A, BANK_D; returned by the bank, who was
OUT (C), A; before.
JP ADR_OST; Breakpoints.
NEXT_C ... ; HERE TO BEGIN AFTER THE EXECUTION
; OUT OF STS.
2
After clicking the "SS + D" and go to the STS all the
registers take values that were at the time
termination of a program, so that
can continue its execution.
In the process of debugging can be
put a breakpoint in the program, if only at the time of
The above code
(When removing the old point
Stop and put new) address
old breakpoint was lower than
# C000.
You can continue with the program being debugged with
the place where it was stopped, for example, in the step
regime ("SS + Z", "SS + X", "SS + T")
or using the window Trace, or
keyboard shortcut "SS + J"
(STS in versions below 4.0, use the "J", setting the address
run whatever is PC,
or use a combination of
"SS + K", but it will remain
Screen STS). If you want to go back to the assembler, BASIC or
TR-DOS, use the key "Q".
If your program hangs some unknown reason, STS also can
help you. For this you have to build a fragment similar to that
described above, to handle the interrupt 2-nd kind. Bring to
your attention already finished processing procedure
interrupts, which is just as
and described above, verifies the fact
pressing the "SS + D" and enters the STS.
After exiting the STS performance
the program being debugged will be
resume from where it
was interrupted by an interrupt handler procedure. Therefore,
while in the STS, you can determine which part of the program
caused the "hang" register content PC.
Restriction on the address of the procedure in the memory
is the same as that previously described fragment. 140.
ADR_W EQU # E02E; these addresses are given for
ADR_B EQU # E038; STS version 5.1, if the resident
ADR_OST EQU # 5B9B; Available at # 5B90.
BANK_S EQU # 1F; BANK STS
BANK_D EQU # 18; Bank program being debugged
EX (SP), HL; return address from interrupt
LD (M1 +1), HL; Writes CELL M1 +1, and M1 +2
EX (SP), HL
PUSH AF; stored in the stack
PUSH BC; register value
PUSH DE
PUSH HL
PUSH IX
PUSH IY
EXX
EX AF, AF '
PUSH AF
PUSH BC
PUSH DE
PUSH HL
CALL USER; HEREIN MAY BE POLL
; KEYPAD, CALL MUSIC
, In general, anything you want.
LD BC, # 7FFE; ADDRESS keyboard port
IN A, (C); CHECK OR DEPRESSED "SYMB.SHIFT"
BIT 1, A; IF YES, SET FLAG Z
JR NZ, NEXT_C; IF not pressed, exiting ...
LD B, # FD; changes of address PORT
IN A, (C); similarly verifies
BIT 2, A; KEY "D".
JR NZ, NEXT_C; IF not pressed, exiting ...
LD BC, # 7FFD; determined by the Bank, in
LD A, BANK_S; WHICH IS STS.
OUT (C), A
; Emulating for STS breakpoint:
LD HL, ADR_B; HERE ARE 3 bytes
; Memorized INSTALLATION
, Previous Breakpoints.
LD DE, (ADR_W); address at which they MUST
; PLACE
LD BC, 3
LDIR; RESTORES 3 bytes
M1 LD HL, 0; ADDRESS First team
LD (ADR_W), HL; BE IMPLEMENTED AFTER EXIT
; FROM STS, Writes CELL
; ADR_W .. ADR_W +1 (STS THEY KEEP
; Address to which was installed
; Breakpoints).
LD DE, ADR_B; IN CELLS ADR_B .. ADR_B +2 STS STORE
LD BC, 3, 3 bytes, located at
LDIR; Breakpoints.
LD BC, # 7FFD
LD A, BANK_D; returned by the bank, who was
OUT (C), A; before.
POP HL; RESTORES
POP DE; register value
POP BC
POP AF
EXX
EX AF, AF '
POP IY
POP IX
POP HL
POP DE
POP BC
POP AF
EX (SP), HL; removes from STACK
POP HL; return address
EI
JP ADR_OST; Breakpoints.
; After exiting the STS program execution
; Continue from where it was interrupted
; Interrupt servicing routines.
NEXT_C; If the call STS will not need:
POP HL; RESTORES
POP DE; register value
POP BC
POP AF
EXX
EX AF, AF '
POP IY
POP IX
POP HL
POP DE
POP BC
POP AF
EI
RET; AND EXIT FROM THE INTERRUPTION.
2
When debugging programs often
used together STS and assembler (TASM, MASM, ZX ASM and
etc.), which is very convenient. If the
your program is built is one of the
the above-described fragments, you
should pay special attention
on how you run a program for execution. If the
STS, everything will be fine anyway. If the program
start of assembly or
BASIC, you may not be able to leave the STS when you
"SS + D", or you will go to the STS, but
not be able to continue the program.
It is known that stepping processor commands the STS
in three ways:
using shortcuts
"SS + Z", "SS + X" and "SS + T". I'll try
talk about the features of these
ways and that, when better
use each of them:
1) "SS + Z" - is posha
govoe command execution of
core processor Z80. No slozhnos
Tay using "SS + Z"
should not be, not only
trace command HALT,
when the interruption is prohibited -
otherwise, the computer freezes.
2) "SS + X" - the same as the "SS +
Z ", but the team will CALL you
polyene directly without
trace caused by
program, which is assumed
assumed already debugged. The same
As for the team and RST (incidentally
TI, in the description of references STS'a
is only a CALL, but about the RST
not a word). Executable
command can also be found in
RAM and ROM. This is the best free software
proper to carry out well-functioning
routines, but it has
One more feature: as you
subroutine call is
of the resident, the stack instead of
addresses should be carried out
commands in your program will
listed address for return
resident. Almost always, it is not
is irrelevant, but
Some routines can
use the contents of the degree
ka. For example, when debugging
their programs, I have often used
favor of a subroutine that
when it is called print on
the screen contents of the registers
processor at the time of the call.
To determine the value of PC,
it examines what address
was included in the stack when it is you
call of.
3) "SS + T" - debugger puts
after the command being executed,
which can not be in
ROM breakpoint and triggering
follows the program being debugged.
By this point, the WHO
rotates through a resident in
STS.
"SS + T" is convenient to apply for
Trace DJNZ, but to trace routines (CALL, RST)
better this method is not used, since can be a nuisance. This
is seen in the following example: 140.
# 8000: CALL # 8004
# 8003: RET
# 8004: LD A, 7
# 8006: OUT 254, A
# 8008: RET
2
This program must set the white color of the border. If
execute it step by step
with "SS + Z", we can see that this is what she does. However,
if you execute it, pressing the "SS + T", the expected result
you get. To understand why this occurs, analyze in detail
algorithm of the debugger when
Pressing "SS + T":
- After the current command (in
case CALL # 8004) is put the breakpoint (the team
JP, occupying 3 bytes). Former
at this place 3 bytes are stored.
- Control is transferred to the address # 8000;
- When a breakpoint is going back to the debugger, memorized
3 bytes restored.
All is good, but in this case 3 bytes command
JP superimposed on the address to
which control is transferred to the
command CALL # 8004. As a result, this is really done
The following sequence of commands:
140.
# 8000: CALL # 8004
# 8004: SBC A, E
# 8005: LD E, E
# 8006: OUT (254), A
# 8008: RET
# 8003: JP # 5B9B
2
Of course, all of the above applies to the command processor
DJNZ, so that the "SS + T" should be used with caution.
For example, what may be
The situation in the trace DJNZ:
140.
# 8000: LD B, # 00
# 8002: LD A, (# 800A)
# 8005: OUT (# FE), A
# 8007: DJNZ # 8002
# 8009: RET
# 800A: DB 0; BYTES spoil
2
Now let's talk about step by step
trace (window Trace). In this
window has a parameter Trace Call.
If it is enabled, the debugger will
to go "inside" the procedure for
Each command CALL
or RST (emulates "SS + Z"), and
If turned off - to perform it with
using a direct run from the resident ("SS + X"). I think that
would be a useful opportunity regardless of the Trace Call
disable tracing routines whose addresses are outside the
pre-defined boundaries. These borders must be made in
window Trace. For example, if the lower limit is # 4000 and the
top # FFFF, the debugger will not be to go "inside" of all
sub-ROMs. But since this possibility in the STS there remains
only hope that it will in one of the following versions.
*
(C) Ivan Roshchin, Moscow, 1997
Bugfix STS 5.1
In STS 5.1 there is a debugger
an issue which can not be
normally edit the contents of memory in symbolic form.
Consider this example: Suppose at # 8007 to put the code
symbol "P":
# 8000 00 00 00 00 00 00 00 00
# 8008 00 00 00 00 00 00 00 00
Enter into edit mode and
indicate the symbol "P":
# 8000 00 00 00 00 00 00 00 00 P
# 8008 00 00 00 00 00 00 00 00
But after clicking 'ENTER' expected results have not been ...
# 8000 50 00 00 00 00 00 00 00 P
# 8008 00 00 00 00 00 00 00 00
To correct this error
make the following changes to the file "sts5.1a":
140.
- Starting at address # DE1C
enter the command:
CALL # E681
NOP
NOP
NOP
- At # E67F place
Bytes # 2E, # 00;
- Starting at address # E681
enter the command:
JP Z, # E5BD
OR C
JP # E590
2
In this case, you have to sacrifice a part of a text message
"File exist, overwrite ...", from
which in the end will only
"File exist, over.".
*
Other articles:
Similar articles:
В этот день... 7 December