HOT Z-II
USER’S NOTES
Copyright 1983, Ray Kingsley
SINWARE
Box 8032
Santa Fe, NM 87504
HOT Z-II COMMANDS
READ mode commands are listed at the top of the keys in the
top of the two layouts below. Single-step commands are listed
on the same layout below the corresponding keys.
WRITE mode commands are listed on the lower layout. FUNCTION
key commands are not listed. Refer to your command list for
those.
type address to set cursor. Commands are SHIFTED.
INSRT SPON DEC FPFLG
1 2 3 4 5 6 7 8 9 0
BACK BPTS BPT2 BPT1
BASIC FPOFF HEXED RESET NTOP PRSC
Q W E R T Y U I O P
QUIT WNDOW RUN TWIN PRSC
ASEM 1STEP DATA FIXDF ALNAM
A S D F G H J K L N/L
SET GO
SHIFT Z X C V B N M . SPACE
A,E: goto WRITE modes D – Back to data mode
very useful in Edit or Assembly -> INSRT 1
Single-stepper -> 1 BACK
back to BASIC -> 3 QUIT
3 – enter decimal address to se
Set regs. in Single-step mode
NEW LINE – Enter: page through memory
H – swap name files
R – back to BASIC or exit single-step
LOAD DENAM END
1 2 3 4 5 6 7 8 9 0
HEX+/- SAVE HEXED RUN TRAN LLIST
Q W E R T Y U I O P
ASEM 1STEP DATA FIND NAME ZAPP
A S D F G H J K L N/L
SHIFT Z X C V B N M . SPACE
A,E toggle between modes
T transfer cursor to END to DEST
Y Copy screen (dis-assem mode) or to END (write modes)
G Assign a name (must be in ASSEM mode!)
3 Zap a name ” ” ” ” “
4 Set END (very important command in Hot Z!)
The enclosed cassette contains the following:
16K HOT Z followed by Big REM followed by a NAME list. These are named HOT Z, BIGREM, and NAMEs. The NAME list requires more than 16K. Load it from 2EB2 to 4000 or from BEB2 to A000, for example. Then enter values at ALNA: 82-2E-B2-2E-FE-3F; hit shift-H. 64K HOT Z followed by a NAME list for that version. These are named HOT Z and NAMEs. A printed annotation or the NAME list will be available at nominal cost in the near future. LOAD the NAME list from E000 to F184 or any comparable memory space; values to set at FEE0 would then be 00-E0-06-E0-B2-F1; then press shift H.
See the notes on loading for loading and backing up the tape.
In “Hi-Z”, names table already included. You have
room for a few additional names (temporary),
but for more names you should set up alternate names file
THIS IS HOT Z-II
The enclosed tape holds versions of HOT Z-II for 16K and for
64K machines. However. HOT Z-II allows you to create your
own, customized version from the original: The only difference
between The two copies on the tape is their memory occupation;
the 16K tape has all of the commands available to the 64K
user. but of course much less workspace. If your projects
with HOT Z ere always cramped, then you should consider
expanding your memory end installing one of the modifications
that allows you to run code above the 32K boundary. (Use the
16K version as the simplest starting point for the relocations
described in the later section on Relocating HOT Z.)
Those of you with 16K can only run the 16K version from the
tape. However, you can test-load the 64K side to be sure that
the cover comes un undistorted, which indicates a good load.
(After you hit a key, the 64K version will crash in 16K.) With
64K you use either version or create your own version to
give you access to memory currently occupied by HOT Z.
We will assist those of you who have loading problems by
exchanging your tape for an alternative dubbing. However,
please do not make things difficult for all of us by using the
Oldest cassette machine in the house and sticking with it.
They need constant cleaning end occasional adjustment of the
head. Irv borrowing another recorder before returning the tape.
It is true that irregularities in tape and cassette
cases do make some tapes unloadable, and we ask for no
apologies when you return a tape. We have exchanged tapes
widely and throughout the world, and about all we can say of
the medium is that anything can happen.
HOT Z-II combines a line-by-line assembler, a labelling
disassembler, a single-stepper and a simple editor. The
purpose of HOT Z is to give you a reasonable degree of direct
control of your computer, as well as to assist you in writing
assembly language programs to extend your control.
HOT Z will cohabit with a BASIC program, although BASIC is a
foreign language to HOT Z and must be read as data when HOT Z
is in command. Standard versions of HOT Z reside in high
memory but below RAMTOP. so if you plan to work extensively
with both HOT Z end BASIC you should use the command provided
by HOT Z to move RAMTOP below HOT Z.
A minimum requirement far running HOT Z is some knowledge of
the hexadecimal (hex) number system, which uses the characters
0-9 and A-F as its 16 digits, These instructions were written
with the assumption that you know the fundamentals of Z80
machine code. If you do mot, you should acquire a Z80
programming book. The one by Zaks (from Sybex) is useful, but
those written specifically for the ZX are generally more
simple. If you ere learning, then use HOT Z as a blackboard
to work out the exercises.
LOADING AND CASSETTE CARE
It is possible to ruin a data cassette in the same way as a
floppy disk can be ruined. A low-quality or poorly maintained
cassette player can impose glitches on a tape and make it
unloadable. Dirty cassette players will eat tape. Don’t take
the chance. Make a back-up copy first and save this original
for the day when the back-up fails.
LOAD your original tape with LOAD “”, (LOAD “HOT Z” will work
too.) With the 16K version, when the cover comes up and asks
you to “PRESS ANY KEY TO REGIN”, you can make a copy by
starting a fresh cassette on RECORD and pressing the S key.
Your computer will output a backup copy to tape if you have it
running. Any other key will start the program.
In more than 16K. you should be aware of the following method
for duplicating any ZX tape that loads according to the ROM’s
BASIC protocol. That protocol requires that the data segment
(as opposed to the name header) begin loading at address 4009
(VERS) and load as far as the address that comes up in 4014-5
(ELIN). With that knowledge., you can LOAD any tape as data,
provided you LOAD to an offset from the intended area of the
ROM’s system variables (4009—407C).
For duplicating HOT Z or any long program, you need an extra
16K, that is at least 32K of RAM. Then get HOT Z running and
learn how to use its commands. LOAD the original HOT Z tape
via the HOT Z LOAD command with the cursor set at address 8009
and with END set to, say 8080H just for practice, then stop
your recorder with the PAUSE key if you have one, but stop it,
and rewind it immediately so that you don’t forget and start it
in the middle, which is one way to ruin a tape.
Now your memory should read out an an offset set of system
variables, the ones that will be coming in from the tape, and
the address at 8014-5 (lo-hi) will give you one more than the
last address to be loaded from the tape. Take that value, add
the offset, and enter it as prescribed to set END (the TO key,
as in TO the END), then start recording the tape from its
beginning again. This time you will load a full copy, as
data. of the tapes contents. If you just SAVE the same
memory contents to another tape, then you have a backup tape
that will LOAD in the normal manner from BASIC. You have also
become a copier, and if you persist in that wantonly you will
cause the extinction of programmers in your species of
computer, which might foreshadow the ultimate disaster of
model extinction.
The more important thing you can do with this technique is to
change the program you have loaded and to save the new
version. If you learn how to manipulate the system variables,
you can create self-loading tapes of great variety. For
example. you can direct where the ROM looks for its first
BASIC line by setting the start address of that BASIC line
into 4029-8 (NXLN). If you are writing machine code for a USR
call and if your routine sets NXLN before it does its RET to
BASIC. then your reentry to BASIC will begin with the line
whose address is in NXLN. Self-starting tapes also begin
with the line that NXLN points to.
If NXLN points to VARS memory space, then the BASIC
interpreter asks no questions but jumps up among the VARS and
tries to read what is there as tokenized BASIC code. If you
oblige it with a properly formatted BASIC line, then it does
what you ask (e.g. RAND USR etc.) The important thing about
introducing a machine routine from the variables block is that
you can wipe away all your initialization code by a call to
CLEAR, which is 149A in hex. HOT Z’s initializer jumps into
the memory space in the printer buffer (403C) to do that
CLEAR, and then starts the program.
We are frequently asked how to get a copy of HOT Z onto a disk
Or a fast~-load format. The ZXLR8 fast-load program has a data
mode, which is ideal for saving HOT Z. You can even hook up
the USR call that enters the ZXLR8 command mode as a HOT Z
command, so that there is no need to go back to BASIC to use
it. However, ZXLR8 returns in FAST and HOT Z requires SLOW,
so wheat you need is an intermediate routine like CALL ZXLR,.
CALL SLOW, RET. (SLOW is 0F2B.) Then put the address of this
routine into a dead key slot in the command file and use the
corresponding key for the command.
With a data SAVE, you should save the entire HOT Z program.
excluding the variables block, and then start HOT Z with its
USR cell after reloading. With the 64K version, you would
have to save the HOT Z program and file blocks separately, so
you would be better off loading the tape to 8009H, as
described above, and data saving that block, and then trick
your system into reloading to 4009 when you want to use it.
We regret that we have not had the opportunity to experiment
with the variety of systems that are now available for the
ZXLR8, but if your system lacks a data SAVE, then you should
stamp your feet at the door of the producer of that system.
MEMORY MAPS
Brief memory maps of the versions on tape are as follows:
16K Version
4009 407D 4396 4400 4E00 504B 517B 5B00 7F20 7FB0 8000
+——–+———+———-+—————+——-+———+———+———–+——+—————+
System Display Calculator Your Work Area NAMEs HI Jump HZ Files HZ Program Stack HZ Variables
Variables File Stack Tables
64K Version
4009 407D 4396 4400 5B00 7F20 F3A0 F64B F77B FE00 FE60 FF00
+——–+———-+———-+—————+————+———-+——+———+——+——+——–+
System Display Calculator Your Work Area HZ Program Work area NAMEs HZ Jump Files Stack HZ Vars
Variables File Stack Tables
In 64K, the last 256 bytes above FF00 are unused.
RUNNING HOT Z-II
The following section provides an introductory tour of HOT Z.
The experienced and the adventurous among you may want to
plunge right in. If so, arm yourself with the short command
lists and the keyboard map and try your luck. Details of the
various commands are available in the later sections of these
notes.
If you use HOT Z-II to best advantage, you will discover that
it gives you a personal command of the machine (the Z80)
itself, with a few exceptions that stem from your hardware.
If those exceptions bother you then you might find it
advantageous to improve your hardware. The most interesting
hardware add-ons that we know of are currently coming from
John Oliger, 10115 Nassau Lane, Indianapolis, IN 46229.
These include a display board that turns your ZX/TS into
a conventional Z80 computer with use of a full 64K memory.
RAMTOP 80A8 81DC BF20-C000
\ | | |free space| | |
stack |vars|JP table|files|for names |names|pgm code|blank
——| | | | | | BF?F |
8000-809F 81F? 885F 9552 97FE C000-FFFF not used
\ /
2000-7F00 resident
your work area (!) NAMEs “HI-Z” map
AN INTRODUCTORY TOUR
The cover occupies the initial display file and evaporates
when you press a key. Then you should see the first screen
“page” of disassembled ROM. Down the left side of the screen,
you will see the memory-address column, to which everything in
HOT Z is keyed. These addresses are in hexadecimal and in the
format accepted as input by the program. In other words, all
addresses are four hex digits and include leading zeroes but
no identifying symbols either before or after. The format is
always there for you to consult as you make entries to HOT Z.
The address system runs from 0000 to FFFF, although the 16K
memory goes only to 7FFF. In a standard 16K memory. you may
find various parts of memory reflected into unused address
areas, as for example a repeat of the ROM code at 2000, 8000,
and/or at A000. This is hardware-caused, the result of
incomplete address decoding. In 64K, you are liable to find
that unused addresses above 8000 are cluttered with initial
garbage, which HOT Z can clean up for you.
The second column of the disassembly display lists the
contents of each memory byte, again in hexadecimal, two digits
per byte, packed together with no spaces between. These
numbers occur strictly in the order they occur in memory,
which is not necessarily an easy order for reading. This
column is raw data, as it were, against which any
“interpretation” can be checked. Z80 instructions can be from
one to four bytes in length. A HOT Z routine gets the length
of any instruction and parses the bytes into instruction-
length clusters, but it cannot decide whether those bytes hold
true Z80 code, as here, or simply numbers used as data. That
decision in the end is up to the reader. On this first page
of ROM, the first instruction is two bytes long, the second
three, etc.
The next column. the NAME column. will hold user-entered
labels for the corresponding address, along with a few labels
provided in a permanent file on your original tape. After
you have annotated a program with these labels, you can SAVE a
NAME file separately from HOT Z, to be loaded again with
whatever program the labels pertain to.
The fourth column presents those particles of electronic
poetry known es assembly mnemonics. Relative jumps (JR’s) are
listed, as in the sixth line, with their destination address
(or NAME) rather than the single displacement byte with which
they are coded. System variables for the ROM are listed by
an abbreviated name, as in lines 4 and 5.
You are probably familiar with these first bytes of ROM
through various PEEKs or publications. The first three
instructions turn off the nonmaskable interrupt that makes
SLOW mode work, load BC to count up to 16K of memory, and jump
to the initialization routine at 03CB. .The fact that only 16K
is cleared by initialization is very useful if you have a
larger memory and a reset button.
The rest of the screen is taken up by RST routines. RST 10
prints the character whose code is in A,RST 08 handles BASIC
error reports, RST 18 and 20 help with interpreting BASIC, and
RST 28 is the entry to floating-point operations, which are a
separate sub-language in the ZX. RST 08 and 28 are always
followed by one or more (for 28) bytes that serve as data
rather than as machine code. The meaning of such bytes is
listed in the mnemonics column.
The current HOT Z display is referred to in these notes as
READ mode or disassembly. The commands in this mode are
mainly for moving the display around to give access to
different parts of memory. The page flip, for example, is the
ENTER key: hit it to continue the disassembly with the
instruction following the one at the bottom of the screen.
For distant moves. you can enter a four-digit hex address to
the ADDR cursor at the upper-left screen corner. For example,
try 03CB to see the memory count and the initial loading of
RAMTOP.
During address entry, you can backspace to correct an error by
using the DELETE key. which works about the same way as it
does in BASIC. The difference is that DELETE doesn’t blank
out the entry and that you can’t back out of the whole entry
routine that way. To back out, use the ENTER (NEWLINE) key,
which works as an escape key in this situation. ENTER is not
needed after the last hex address digit.
In READ mode, you can also get to a named routine by entering
the four letters of an assigned NAME. Try KEYB. You will see
that the NAMEs appear in both the NAME column (referring to
the current address) and in the mnemonics column (referring to
the target address of CALLS or jumps).
In general, you can use a NAME in the file as a proxy for its
address in the READ, WRITE, or One-Step modes of operation.
Now try the shift-D command from READ mode. This is the
display switch, and successive strokes of the the same key
will take you back and forth between the data and the
disassembly displays. The data display is for examining those
parts of memory that are used as files of data rather than for
ZB0 code. The first and second columns contain the single
address and its content in hex, values that are reflected in
decimal in columns four and five. (Use it as a conversion table.) The far right column gives the CHR$ of the contents of
the address and will turn up any BASIC programming or message
files. Enter. for example, the address 007E to see the
keyboard file. Flip through using ENTER to see how the
keywords are stored, with their final characters in inverse.
Switch beck to disassembly while you’re still looking at the
keyboard file for a taste of what disassembled data (sometimes
called nonsense) looks like. It’s up to you to distinguish
sense from nonsense when reading a strange program: the
display switch is there to help you do it.
The NAME column in the data display functions differently from
the column with the same heading in the disassembly. The
NAMEs in the data display are those that correspond to any two
successive byes, taken in lo-hi order, in the second column.
(The disassembly displays NAMEs assigned to the addresses in
the first column.) Some NAMEs in the data display can crop up
by chance: for example, two NAMEs immediately together mean
that at least one is spurious.
Use the T command in READ mode to go to the beginning of the
NAME file. The NAME file grows downward like a stack, which
it is not, as you add new NAMEs to memory addresses. Turn on
the data display to see the structure of the NAME file. Each
NAME takes six bytes: the first two hold the address to which
the NAME is assigned, hence the listing in the NAME column,
and the next four hold the NAME itself, which shows in the
CHR$ column. Other odd CHR$ symbols will appear at random for
some of the address bytes, signifying nothing.
The data display is also useful for looking at or creating
display files.
You can enter decimal addresses to the ADDR cursor, but these
must be prefixed by the shift-3 (THEN) command, which
will put up a D after ADDR. Try it with 16384, which may be
familiar. Check the conversion with the data display. If you
enter a decimal address of less than five digits, then you
have to press ENTER to tell HOT Z that you’ve finished. If
you enter a decimal higher than 64K, the program will subtract
64K end give you what’s left.
Now get into disassembly and go to 1CAA, which is where the
ROM begins the BASIC function LN. Hit shift-W to turn on
the floating-point interpreter. You will see here and
on succeeding page flips some of the floating-point calculator
language. which is described in another section of these
notes, At 1CAF you will see a rendition of a BASIC error
report after RST 08, in this case for a negative argument to
the logarithm. You can switch off the f-p interpreter by
hitting shift-W again, but you will have a more accurate
rendition of the ROM if you leave it on.
The last display on the tour is the Z80 register display or
Single-Stepper. It is one of the quirks of bilinguality that
this display must be entered from an area where the floating-
point interpreter is not switched on, so first enter an
address above 4000, say. Then use the shift-S command from
the disassembly.
The register display occupies the top three quarters of the
screen. The left column lists the various Z80 registers;
please refer io a good Z80 reference book if you need an
explanation of the register names. The double prime, or quote
sign, is the only symbol available in the ZX character set to
denote the exchange registers. The exchange flags are listed
es EXFLAGS.
The second column lists the hex values of the registers’
contents., Values for the accumulator (A) are listed at the
left of the column to remind you that A is the high half of
the AF register pair, along with H, D and B. The third column
either converts the second column value to signed-decimal
according to the two’s complement convention, or, if the
second column holds an address that has been NAMEd, then that
NAME is listed in the third column. The fourth column, headed
by the open parentheses, dives the hex value of the byte
contained in the address formed by the register-pair values.
(E.g. across from HL you will find the byte (HL).) The right
column gives the CHR$ of the byte in the fourth column (for
the register pairs) or of the byte in A.
The box below the one containing the exchange registers holds
details on the one-step user’s stack and the state of the
flags registers. The user’s stack is separate from the main
machine stack so that the system can absorb a few stack errors
without crashing the program. The top four pairs of bytes on
the user’s stack are shown at the right, along with the NAMEs
for any addresses they might hold, so that you can check to
see whether your test routines leave anything behind. The
main flags are listed below the exchange flags for easier
visual association with the conditionals in the program steps
below. Standard conditional mnemonics are given for the four
programmer’s bits.
The inverse-printed address at the left in line 18 serves both
as a cursor and to mark the address of the next step set up to
be executed by the single-stepper. You can enter any address
into that cursor just as you would in READ mode, or you may
also use a NAME. The ENTER key still serves as an escape
during address or NAME entry. but it has another more
important function as well, which is to run the next single
step.
If it’s not already there, enter 0808 to the NEXT slot, and
then notice the contents of the A and D registers just before
end after you press the ENTER. This is a fairly safe area and
you can experiment with a few more steps. (The things you
must be careful about are loading into some system variables,
either ROM’s or HOT Z’s, and some flag sets. LD (DF_CC),HL is
usually program hari-kari, for example. The SPACE key allows
you io skip the step at NEXT. The top line of Z80
instructions represents the previous step executed, and the
three steps following the one in NEXT are those that will be
reached if there is no branching. A branched-to step appears
directly in the NEXT slot; a skipped step disappears from the
display.
For faster debugging. you can set breakpoints (shift-4 and
shift-3 commands) end use the shift-G command to step through
the code as far as the first breakpoint encountered. Two
breakpoints are provided so that your can cover both sides of
a conditional branch. You must take care to set breakpoint
addresses that the code will actually encounter, since
stopping depends on finding a breakpoint exactly. The BREAK
key will stop the shift-G command if used quickly enough. You
can display the current breakpoints with the shift-2 command.
Learners might consider mastering the use of the Single-Step
first and then using it to see how the various instructions
and a few resident routines work. A lot of bugs can be
avoided by testing every routine you write with this device.
Hit shift-Q (Quit) to get back to the main READ display. You
will arrive at a screen page that starts with the address that
was in the NEXT slot of the Single-Stepper. If you spot an
error coming up at the bottom of the Single-Step display, you
can quit the display, EDIT the error on the disassembly
display, and get back to where you were in the Single-Step by
using the shift-S command from READ mode.
Writing and Editing Z80 Code
The READ mode is a essentially passive, allowing you to page
through the memory and examine its contents. The WRITE or
EDIT modes are there to let you make chances in the memory
content, provided that memory is RAM.
There ere essentially three WRITE/EDIT modes. With the
disassembly display, you can press shift-A and a cursor will
appear at the top line of the edge of the right column. This
is the assembly mode. Once you turn on the cursor, you change
the entire command system of HOT Z. The commands available to
you with the cursor on are listed as the WRITE-mode commands
on the command lists. Hitting ENTER with the cursor in its
“home” column will quit the WRITE mode and return you to READ,
where you can readjust the screen to another part of memory.
In addition to the command set, the up and down cursor
controls allow you to move the cursor to a given line or to
scroll the display page one line up or down by moving the
cursor up from its top position or down from its lowest
position. Up scrolling is automatic when you ENTER a line
that is third from the screen bottom.
You may also enter a new Z80 instruction to replace the one
listed on the cursor line. Just start typing and the existing
line will disappear. As you type, the delete key and the left
and right cursor controls will function as you expect them to.
If the cursor is over the top of a character, your next
keystroke will replace that character. If you want to insert
a character, press the EDIT key (shift-1) and a space will be
created at the cursor position, with all characters to the
right of the cursor being shifted one space right. The
rightmost character in the line (usually a blank) is destroyed
by this insert command. You cannot jump to another line with
the up or down cursor command while you are in the middle of
editing a given line.
When you have entered the intended Z80 instruction, hit the
ENTER key to put the proper code into memory. If your entry
is in the proper format, the cursor will return to the left
edge of the column and move one line down, ready to edit the
next line. If the cursor stays put in the line you are
working on, then it indicates a format error in the mnemonic
entry.
HOT Z-1I follows the format of the mnemonics listed in the
Zilog Z80 technical manual. This format is essentially the
same as that listed with the character set in your computers
instruction manual, with the following exceptions: the RST’s
are followed by a hex byte (08,10,18,20,28,30,38) rather than
decimal and the OUT (N).A and IN A, (N) use the parentheses
shown here. (N is always a two-digit hex byte.) As a general
rule, the open parenthesis is always preceded by either a
space or a comma, and spaces are always important.
When HOT Z fails to accepts your entry, it locates the line
cursor at the first position that does not match its template
for a proper instruction. Sometimes, however, as with an
omitted space or an unassigned label, the cursor may appear
earlier than your particular format error. (For example, it
will flag the first letter of a label even if only the fourth
letter is “wrong”. )
If you get stuck and can’t get HOT Z to accept what you’ve
entered, you can abandon ship and restore the original
mnemonic by hitting the FUNCTION key. Your recourse then is
to look elsewhere in the disassembly for the format of the
instruction you have been trying to enter, or to look up the
hex code for that instruction and to enter that in the hex
column (See below.) to discover how HOT Z lists the mnemonic.
If you try to back out of a line with the cursor-left key, HOT
Z will act as if you have tried to ENTER the line. If you
write all the way to the end of the line an ENTER will also be
automatically appended. This occurs with some of the IY+N
instructions. which just fit in the alloted space.
You can use a preassigned NAME in an instruction anywhere that
a l6-bit (four hex digits) number occurs. For example,
LD HL. (RMTP) is equivalent to LD HL, (4004). You must give a
NAME to a particular address (shift-G command in WRITE) before
you attempt to use it in an instruction.
Relative jumps (JRs and DJNZ) are normally entered with the
destination address or NAME. However, for the JRs only (not
DJNZ) a second form is available for short forward jumps where
you haven’t yet assigned a NAME but know how far forward you
want to jump. JR +5 will jump ahead over five bytes. The
plus sign is required and the displacement is in decimal
with a range from 0 to 127. Backward jumps are not catered
for in this way: it is easier to look back for the address you
want to get to.
Provided you do not want one of the last four conditional
expressions (M, P, PO, or PE), you can use relative jumps all
the time, and if the destination address is too far away HOT Z
will convert your JRs to JPs (absolute jumps) rather than
report an error. The reverse is not true: if you enter a
very short absolute jump, HOT Z will take your word for it.
This conversion works well for entry of new code, but you must
beware when editing in the middle of an existing routine,
because if a two-byte JR is edited and becomes a three-byte
JP, then the first byte of the following instruction will be
overwritten.
There is no ORG command because you are doing the ORG yourself
with HOT Z. However, direct data entry is possible in the
assembly-edit mode through use of the DB pseudo-op. DB may be
followed by a quoted string (DB “ABCDE”) or by an even number
of hex digits (Db 090F 0D3A). Spaces are ignored in reading
the hex digits, except for the required space after the DE.
Each pair of hex digits is read as one byte, and a single
digit left over will be ignored. You can write a string or
series of digits all the way to the end of the line.
When you hit the end, HOT Z will add the quote if necessary
end enter the line. Upon entry, the editor enters one
character (for a string in quotes) or two hex digits per byte
startling with the cursor address for as many bytes as it takes,
then resets the screen layout so the next cursor address is at
the top of the screen. The reason for this is that the data you
have enter ed would be disassembled by HOT Z, producing a
nonsensical listing. You can look back with the data display to
assure yourself that what you have entered is indeed there.
The DB is simply a means of entering data without leaving the
assembly-edit mode. You should still assign NAMEs to your
strings or variables and use them in referencing the data.
The insert command is recommended when you enter data into an
existing code block.
If you want to use the RELOCATE command (described below),
then you should not mingle small blocks of code and data.
Keep them in large blocks and keep track of what is where.
In addition to string entry with DB, you may also enter quoted
non-inverse characters for direct eight-bit register loads or
for direct arithmetic/logic operations. LD A,”A” will
assemble as LD 6,26 and CP “Z” as CF SF. Sixteen-bit (double)
register loads are not treated in this way.
Hex Edit Modes
Hit the shift-E key with the disassembly display to get into
the main hex edit mode. The “home” column for the cursor in
this case is between the address and hexcode columns at the
left of your screen. Cursor controls work as with the
assembly-language editor.
To change the hex content of memory, you may either move the
cursor over with the cursor-right key or retype the line,
using the keys from 0 to F. With the disassembly display,
each line holds the correct number of bytes for a single Z80
instruction. If you write a one-byte instruction, the cursor
will jump to the next line immediately: for multi-byte
instructions, the cursor waits on the line until the required
number of bytes have been entered, then jumps automatically.
The purpose of this feature is to allow you to copy hex
listings from printouts or magazines. You can just type away
without worrying about hitting ENTER at every line, and the
screen will scroll along with your entries.
With the edit mode, what you see in the hex column is what you
get when you make an entry, byte for byte. Edit does not use
NAMEs and you have to calculate the displacements for any
relative jumps you enter.
All of the WRITE-mode commands are available with the hex-edit
cursor on screen. There is, however, no character insert
while you are editing a line, and the escape key in the middle
of a line is ENTER rather than FUNCTION. If you need to
change the first byte of a line after you have started editing
it, you should escape by hitting ENTER and start over.
You can hit the shift-D (display switch) key either before or
after you have gone to the hex-edit mode in order to obtain
the data-edit mode. This mode lets you change one byte at a
time by writing a new value over the top. This is the mode
that you would use for entering hex data files, addresses and
the like. (Use the DB command from the assembly mode for
entering text files.) All write commands are available from
this mode as well. except the NAME (shift-G) command functions
differently than it does with the disassembly display.
Shift-G will no longer assign a new NAME, but can be used to
write a preassigned NAME to the NAME column, and the address
to which that NAME belongs will then appear at the cursor
address and the byte following. The intended use is for
creating address files (jump tables).
Inserting end Deleting Lines (All WRITE/Edit Modes)
What happens when you press ENTER after writing an instruction
is that HOT Z reads the address of the line you are working
on. looks up the the numeric code of the instruction. and
enters that code into as many bytes as it takes. Then control
goes back to the disassembler, which reads back your code into
Z80 mnemonics and revises the screen page accordingly. An
important consequence of this is that when you are editing an
existing block Of code you must be careful not to overwrite
more lines than you intend to (by entering a four-byte
instruction over a two-byte instruction, say) and to watch out
for new instructions that crop up when you overwrite a long
instruction with a short one (one-byte over a three-byte
instruction. for example).
If you don*t know the byte length of Z80 instructions. the way
around the above problem is to use the line-insert (shift-1
or EDIT) and line-delete (shift-H) commands whenever you are
editing an existing block of code.
When you insert or delete a line, a block of code is moved
either to make room or to close up the empty space. One end
of that block of code is datamined by the cursor: the other
end must be datamined by you before you start your editing
session. Whenever the WRITE cursor is on. a variable called
END is displayed in the upper right corner of your screen.
END marks the other end of the active memory block for an
insertion or a deletion or indeed for any block operation,
such as a clear, a fill, a SAVE, or a transfer. END is set
with the TO key (as in TO the END) followed by four hex digits
or a NAME. On some types of entry errors, you may be asked
twice for the proper value.
You should set END whenever you begin an editing session. END
Should be within your workspace and not overlap with the HOT Z
program, lest you move sections of HOT Z around and lose
control of your computer. For the insert-line and delete-line
commands, a special restriction has been. added to the value of
END. For those operations, END must be within 256 bytes of
the cursor address, or else you will be asked (automatically)
to enter a new value of END when you give the insert or delete
command. At that point, HOT Z will accept any value you enter
for END and perform the operation. The purpose of this
behavior is io catch those times when you have forgotten to
set END. and io save you from a possible crash.
For insertions end deletions, END can be either above or below
the cursor address. The “usual” value would be for END to
point to an address higher than the cursor address, in which
case an insertion would push all values to higher addresses to
make room for the new instruction. For example. if you insert
a two-byte instruction at 4C10 with END set to 4C80, then all
instructions from 4C10 will be moved two bytes higher until
4C7E. which will go into 4080, and the original contents of
4C7F and 4C80 will be destroyed. A deletion of a two-byte
instruction would move all instructions to lower addresses,
and the contents of 4C7F and 4C80 would be duplicated in 4C7D
end 4C7E.
Oi the other hand, if the address in END is lower than the
cursor address, then an insertion will leave the following
addresses undisturbed but will push the contents of preceding
addresses to lower addresses as far as END. For example, with
END set to 4C00 and the cursor at 4C10, insertion of a
three-byte instruction would destroy the contents of 4C00,
4C04 and 4C05 by overwriting them with the contents of 4C00,
4C04 and 4C05, respectively. Analogously, a deletion would
duplicate the first three (or N) bytes in the next three. The
insertion itself will in this case go into the address
preceding the cursor address. This feature is useful when
you are editing in a constricted memory block with blanks that
may be either above or below.
After insertions or deletions. the cursor position may have to
be adjusted for your next entry. (The preceding discussion
uses “above” and “below” to refer to numerical values of
addresses, not to screen position, where addresses get higher
as you go down the screen.)
When a NAME is assigned within a block where you are inserting
at deleting lines, the NAME will move with the instruction to
which it is assigned. The displacement assigned to relative
jumps is not adjusted, so JR TARG may read JR 4C22 after an
insertion that pushes TARG from 4C22 to 4C23. Be sure and
label all JR destinations and then check that the labels are
still correct after an editing session. If you use labels all
the time. then an error will stand out clearly.
When you are editing the data displav, all insertions and
deletions affect one byte at a time.
Using WRITE Commands
Many of the WRITE commands affect a block of memory and
require that the END variable be set first to a proper value.
Use the TO key to set it. Aside from its use for insertions
end deletions of lines, END is generally set to denote the end
Of a block of code. whereas the cursor marks the beginning.
If END is less than the cursor address, the block is generally
taken to be null. though sometimes the operation will still
affect the very first byte. Most operations include the END
address; the exceptions are SAVE and LOAD, which finish one
byte before. (This makes it effectively impossible to LOAD or
SAVE address FFFFH, since the next address is 0000, which is
less then any cursor address.)
The block commands are LOAD, SAVE, FIND, transfer, clear,
fill. print, readdress and relocate, in addition to the line
insert and delete described above. The simpler commands are
shift-A and shift-E. which toggle the cursor across the screen
between assembly-edit and hex-edit; shift-D, which toggles the
display between disassembly and data and works only in
hex-edit because you can’t assemble data; shift-G and THEN,
which allow you to assign or delete a NAME at the cursor
address: shift-S, which takes you to the single stepper;
shift-R, which transfers control to the program beginning at
the cursor (Novices beware!); and FUNCTION followed by the
2-kev. which moves RAMTOP and the stack to the cursor address
and those below.
The two cassette commands (LOAD and SAVE) allow you to move
the contents of individual blocks of memory back and forth to
end from tape. Such tapes will only be loadable by the
corresponding BASIC command if the bytes of memory are in the
form of a BASIC program, as explained in the earlier section
on copying tapes. However, you can Save your machine-code
program drafts and your NAME files with HOT Z, and then load
them again to continue working on or testing them. The LOAD
and SAVE addresses do not have to correspond, but you must
have the same block length from cursor to END if you want to
preserve the whole tape. (This is why you can load BASIC
tapes at an offset.) If you LOAD a tape that is too long for
the assigned block. the extra part is cut off; if you attempt
to LOAD a tape that is too short for the assigned block, you
will get the familiar “searching” pattern on screen when the
live part of the tape ends: hit BREAK to restore HOT Z and the
portion of memory loaded. If you BREAK during the active
portion of a SAVE, HOT Z will restart itself, losing the value
assigned to END and initializing the stack, the NAME file, and
any values held in the register display. (Your NAME file can
be recovered. See the section on NAMing.)
LOAD and SAVE both take tape names, which are entered without
quotes after you give the command and before you press ENTER.
Maximum length for such tape names is the length of the
command line (top) on which they appear: If you exceed that
length, HOT Z reads an ENTER and begins to execute the
command.
The TRANSFER command allows you to move the contents of one
block of memory io another block. The first thing to do is to
make sure that your destination block will hold the source
block without overwriting something you want to keep (or HOT
Z). You have the option of copying just the code (shift-T) or
of copying the code and moving the NAMEs assigned to it as
well (FUNCTION-6). The original o* the code will not be
erased by this command. You can copy from ROM but of course
not into it.
To use the transfer command, set END and hit the appropriate
command keys, This will bring up a DEST cursor at the upper
left, which asks you for the destination address of the block.
HOT Z will wait for you to hit ENTER after that address, and
if you change your mind or find you’ve entered it incorrectly
you can bail out by hitting the SPACE key instead of ENTER.
After the command has executed, the display will move to the
address you gave to DEST.
The FIND command has a similar protocol to that of transfer.
In this case. set the cursor to the beginning of a block of
memory for which you want to find a match. Set END to the
last byte of your template. Hit shift-F. An address cursor
labelled LOOK will come up at the upper left. Enter the
address at which the search should begin; hit ENTER to proceed
or SPACE io back out. HOT Z will search 16K (4000H) bytes for
a match to the memory from cursor to END: if a match is found,
the display moves to it: if there is no match, the display
remains et your template in READ mode. If you find one match
and want to search for another, set the cursor again (shift-A
or shift-E), move the cursor down a line or two so it doesn’t
point to the beginning of the found match, and use the
FUNCTION-F command. If a second match is found, the display
will move to its if not, the display stays put. (NOTE: If you
ere searching for a block of 8 zeroes, say. and you find a
block of 12, then io continue the search you should move the
cursor down so that there are 7 zeroes or less below it, or
else you will find the same string all over again.
The CLEAR command (FUNCTION-0) will put zeroes in all bytes
from cursor io END. The FILL command will first ask you for a
keystroke and then fill the block with the code for the
character assigned to that key. If you clear or fill a block
of HOT Z or the stack, you are likely to crash.
The PRINT-SCREEN command in WRITE will send the contents of
the screen, starting with the cursor line, to your 2040
printer or to the Memotech parallel interface. Printing will
continue, interrupted by page flips of the display, until the
bottom of the screen that contains the END address. If you
forget to set END, you can BREAK to save paper.
There is also a hex-arithmetic command, which, though not a
block command, uses both the cursor address and END. The
Command is shift-D, and the result is the hex sum and
difference (END minus cursor address) of the two values, which
ere displayed in the command (top) line.
The Readdress (for jump tables) and Relocate (for programs)
commands are described in a later section of these notes, due
to their complexity.
A detailed description of all the HOT Z commands is also
included as a later section intended for occasional reference.
For normal use. you may want to detach the brief command lists
and the keyboard map included at the beginning of these notes.
Other sections will give you details on naming and NAME files,
the floating-point language interpreter, and the program
relocator. If there are specific commands which you find
absolutely opaque or unusable, please write to us for details.
HOT Z’s Flags
HOT Z uses the byte at 4021 in the ROM’s system variable space
as 8 bit-flags, so you could crash the system if you try to
load that byte. The significance of the bits is as follows:
0 Set for disassembly of RST 08h
1 Set for disassembly of RST 28h
2 Set for an INSERT in progress
3 Set by an input NAME, reset by an ADDR
4 Set for data display
5 Set for EDIT, reset for WRITE
6 Set for a scroll
7 Set for window in register display
HOT Z also uses 4078 and 407C to hold a restart address in
case you fall into a BASIC error trap (RST 08). Occasional
use is made of the system variables PPC, OLDPFC and STRLEN,
but this use does not, to our knowledge, affect the operation
of a co-resident BASIC program.
DISASSEMBLER FEATURES
The HOT Z disassembler has been specially programmed for the
ZX 8K ROM. The special features that are catered for are the
system variables, the BASIC error reports, and the floating-
point operations. which make up the ‘calculator language” of
the ZX.
Abbreviations of system variable names are included in the
permanent NAME file that loads with the program. The HOT Z
disassembler always uses the name for a system variable
whether it is referred to by absolute address (e.g. 400C) or
by a displacement from IY (IY+0C). However, if you want the
IY form from the assembler, you must write it out, since the
assembler will always substitute an address (two bytes) for an
entered NAME. We have added DBNC (debounce) for 4027 (decimal
16423) and HZFG for 4021 (16417), which is used as a flag byte
by HOT Z. Since these system variable names are part of a
NAME file, you can change the abbreviations to suit your own
taste by entering a new NAME over the top of the old one
(shift-G command in WRITE).
HOT Z-II also uses the system variables PPC, OLDPPC and
STRLEN, but this should have no serious on a BASIC program in
memory with HOT Z. CALLs you make to ROM routines should not
fail for incorrect system pointers. If you use the floating-
point routines, you should load HL’ with 10D2 before making
the CALL.
When an RST 08H is executed, the byte following the RST is not
code but is used as data to generate the BASIC error report.
HOT Z reads these bytes as ERROR 9, etc., rather than
generating Z89g mnemonics for them. If you are running the
disassembler over a block of data, you may see some queer
results, like ERROR Z.
An RST 28 is the ZX ROM’s entry into the floating-point
language, which is normally disassembled by HOT Z. If you
find this second language distracting, you can switch off the
f-p language interpreter with the shift-W command (READ).
If you want to know what is really going on in the floating-
point routines, then consult appendix A of these notes.
THE COMMAND SET
All commands are on shifted keys in order to allow all of the
alphabet for assembly editing. Following is a description of
each command. Remember to use the shift key with all commands
except ENTER and SPACE.
READ Mode
Key Description
A Sets the cursor to the top line and switches to the
assembly-edit mode. The same keystrokes will get you
from hex-edit to assembly edit. This command works
only when the disassembly display is on.
AND (Shift 2) Switches on or off a display of the stack-
pointer address in the upper right screen corner. The
default is Off, because it isn’t pretty. but you
should turn it on when you are test running your own
routines. There is a small amount of shock absorption
in the HOT Z stack, but if you should see it changing,
you should reset it with the R command (Read) and then
look very carefully at what you are doing to the stack
with the routine you are testing.
D The display switch from disassembly to data display or
back again. The same command works with the hex-edit
cursor on but not from assembly-edit.
E Sets the cursor to the top line and switches to the
hex-edit mode. This command also works from assembly-
edit mode without resetting the cursor line.
F Fix display file. Combs the display file and sets all
the line endings. Use it when one of your experiments
messes up the display. If you are in READ mode, This
command should work even without an ADDR cursor.
H NAME file switch. If you are using only one file, the
NAMEs are switched off or on. If you have two files
in memory, the command will switch from one file to
the other. The point of the double NAME file is for
revising a program under development, so that you can
use the same NAMEs at two different addresses.
Q Quit HOT Z for BASIC. HOT Z remains resident and can
be recalled with RAND USR 22528. If you want to
protect HOT Z, move RAMTOP first with FUNCTION-2 (Write).
R Restarts HOT Z. Reinitializes variables and resets the
stack. Purpose is to clear clutter from the stack.
S Switch to single-stepper. The address in the NEXT and
LAST slots will be last ones used there. Use this
command to get back after you have spotted and
repaired an error in the upcoming code. All old
single-step register values are preserved.
T Move the display to the start of the NAME file and
switch to the data display. Use this command as
preparation for SAVing a NAME file. (Turn on the
cursor, set END, and SAVE.)
THEN (Shift-3) Indicates decimal address to follow. The
command will add another inverse block to the ADDR
cursor. If the decimal address is less than five
digits long. hit ENTER after the last.
TO (Shift-4) Floating-point disassembler switch. This
is a flag switch (NOT an on-off switch) which
switches interpretation of a byte from Z80 language
to floating-point language. This command is necessary
for certain embedded sections of floating-point code
that are mot preceded by an RST 28 but are jumped to
from some other portion of floating-point code. This
command will not function if the W switch has been set
to off. If it doesn’t work, hit shift-W and try
again.
W Switch the on-off state of the floating-point dis-
assembler. If turned off, then the TO (Shift-4)
command will have no effect. If on, then every EF
(RST 28) will switch to the floating-point disassem-
bly and every 34H will switch off the floating-point
disassembly. If you have a stray EF on screen while
you are in an edit mode, you may get a messed up
display when you enter code. If so, exit (ENTER) from
edit mode. use this shift-W command, and go back into
the active mode without fear. Default state is ON.
Y Prints the screen. Useful for small routines. Gives
you headings and all. Consider using the same command
from an edit mode for no headings and variable length.
WRITE Mode Commands
A Switch to assembly-edit mode. Works only when dis-
assembly display and edit mode are on. Moves the
cursor horizontally.
AND LOAD from cursor to END. Works exactly like the HOT
Z-1 command. If you enter a tape name (no quotes),
then the tape is searched for a header with that name.
If no name is entered, then the first band on the tape
is loaded. The first byte after the tape name is
loaded to the cursor address and the rest follows.
Loading stops at the byte before END. if the tape
does not contain sufficient data to fill memory to
END, then the familiar “waiting” pattern comes up on
screen. You may BREAK from this command. BASIC tapes
begin at 4009H and will load from HOT Z if there is
space in memory.
D Display switch, data/disassembly. Works only from
hex-edit mode.
E Switch to hex-edit mode from assembly edit. Moves the
cursor horizontally.
EDIT Sets the Insert mode for the next instruction (only)
to be entered. If END is less than the cursor
address, then instructions are pushed to lower
addresses (up the screen) as far as END: if END is
greater than the cursor address, then instructions are
moved to higher addresses (down the screen) as far as
END. Any NAMEs assigned to shifted memory area will
also be shifted so that they stay with the instruction
to which they were assigned. Relative jumps to or
from the shifted area are not corrected and may
require a fix-up. If END is 256 bytes or more from
the cursor. address. you will be required to confirm
the END value before the operation proceeds.
ENTER Quit to READ mode when cursor is in “home” column.
During hex entry, ENTER escapes and leaves the
original memory contents intact. During mnemonics
entry, ENTER sends the line contents to the assembler
for entry into memory.
F Find the string marked by the cursor (first byte) and
END (last byte). Sets the display to start with the
found string. If no match is found, then the display
remains et the template string. To find the next
match without going back to the template, use
FUNCTION-F. Do not use other commands between
the F command and FUNCTION-F.
FUNCTION During mnemonics entry, escapes and leaves the
original memory contents intact. When cursor is in
the “home” column, FUNCTION changes the cursor to
inverse F and acts as a prefix to the FUNCTION
commands listed below.
G NAME command, This command has two separate effects,
depending upon whether it is used with the disassembly
display or the data display. With the disassembly
display, the effect is to christen that instruction
with the NAME that you enter to the screen following
the command. As with HOT Z-1, a NAME is four letters
with at least one beyond F in the alphabet.
With the data display, the NAME you enter following
the command must already be assigned to some address.
HOT Z then looks up the address for that NAME and
pokes that address to the byte at the cursor address
end the byte following. then moves the cursor down two
bytes. Use this form for entering tables of
addresses.
H Deletes the instruction at the cursor and closes up
the code between the cursor and END. END may be
either lower or higher than the cursor address. If
END is less than the cursor address, then code is
moved from lower addresses to close the spaces; if END
is greater than the cursor address, then code is move
from higher addresses to close the space. Code at the
END address and beyond (moving away from the cursor)
is preserved. If END is 256 or more bytes away from
the cursor, then you will be asked each time to verify
the END value before the command is executed. The
purpose of this is to prevent your messing up the
entire memory by forgetting to set END properly.
Q Does hex arithmetic. Takes the cursor address (K) and
END (E) and displays on the top line the sum (E+K) and
difference (E-K) in hexadecimal.
R Runs code beginning at the cursor address. Returns to
HOT Z with the first RET. If you do an extra FOF and
destroy the return address, then you are on your own.
(This command differs from the similar one in HOT 2-1,
which requires a JF back to HOT Z.) Recommended pro-
cedure is to test your routines first with the single-
stepper before attempting the R command.
S Single-steps the instruction at the cursor address and
switches to the single-step display with the result of
of that instruction in the register values and the
following instruction in the NEXT slot.
T Transfers code between the cursor address and END
(inclusive) to a destination (DEST) that you enter
following the command. ENTER after DEST executes the
Command: SPACE after DEST cancels the command: TO
(shift 4) after DEST lets you reset END before the
command is executed. Does not transfer NAMEs. To do
that, use the FUNCTION-6 command. which is otherwise
identical} to this one.
THEN (Shift 3) Deletes the NAME at the cursor address from
the current NAME file. This command will only affect
the NAME that you see on screen with the disassembly
display, so it is best not to use it with the data
display.
TO Brings up the END? cursor that allows you to reset the
END variable. Whenever a block of code needs to be
marked, it is generally delineated by the cursor
address and the address assigned to END. Always use
it to block out a segment of memory for Insert and
Delete commands before beginning to edit. END should
be set within 256 bytes of the cursor for editing. but
that restriction can be overridden in any particular
case. (See Insert and Delete instructions.)
W SAVEs code from cursor to END-1. Enter a tape name
without quotes. This is a data SAVE. If you want to
reload such tapes from BASIC, they must begin with a
proper set of system variables. (First byte loads to
4009H in BASIC.) If you load in a BASIC tape anywhere
in memory and change it judiciously, then SAVE the
same block with this command. you should be able to
reload the result from BASIC.
Y Outputs the screen without headings from the cursor
address to END to your ZX printer or Memotech I/F.
Will print slightly beyond END to fill out the screen
on which END occurs. A variant of the COPY command.
FUNCTION Commands: Hit FUNCTION first. then the second charac-
ter listed below. (F stands for FUNCTION. )
F-1 Clears memory from cursor address to END. Take care
not to erase HOT Z or your own programs.
F-2 Fills memory from cursor address to END with the code
for a key that you specify in response to the KEY?
prompt.
F-3 Moves RAMTOP to the cursor address and moves the
machine stack to the addresses just below. Be sure
there is enough clear memory in the new location
before moving the stack. (Turn on the SP display from
READ (AND key) and look at RAMTOP (4004-5): subtract
for the stack size and allow an extra 40 bytes for
stack excursions,)
F-4 Dead key.
F-6 Transfer memory contents and assigned NAMEs from a
memory block (cursor address to END, inclusive) to an
area beginning with an address entered in response to
the DEST prompt. (See shift T command. )
F-7 Readdress a jump table (address file) between the
cursor address and END by a 16-bit displacement value
entered in response to the DISP prompt. Takes the
address (lo-hi order) at each pair of memory locations,
adds the displacement, and re-enters the sum to the
same locations.
F-8 Relocates 78% code between the cursor address and END.
Readdresses all CALLS or JRs. Allows a three-way par-
tition of code, variables and (constant) files.
Requires nine addresses to be first entered at TEM1
through TEM9. See the special instruction sheet on
this command.
F-9 Initializes display window for single stepper. Set
the cursor to a block of 768 bytes of clear memory and
give this command. Then go to Single-Step mode and
use the shift-W switch to see the result of those
steps that put a character on the screen.
F-F Continues the search for the string specified in the F
command. Starts searching from the current cursor
position. (If, for example, you are searching for a
block of six empty spaces and you find a block of
nine, then you should move the cursor down four spaces
or more, so you don’t refind the last eight spaces,
then the last seven, etc., of the same block.) Uses
temporary variables that could be overwritten if you
stop in between for other operations.
SINGLE-STEP MODE
Key Function
AND Display breakpoints. Lists the current setting of the
two breakpoints on the line below the flags display.
EDIT Backs up. On its first use, this command takes the
instruction from the LAST slot at the top of the
disassembly listing and puts it in the NEXT slot
(second line). Repeated use with no intervening
commands will back up one more byte for each keypress.
Intended use is just to get the last step back.
ENTER Runs the instruction in the NEXT slot and reports the
resulting register values.
G Go (run) to breakpoint. Causes the test routine to run
from the address in the NEXT slot to either of the two
breakpoints, which must be set in advance of this
command. Breakpoints must be set to an address that
starts a command and not to a byte embedded in a
command. The GO routine checks the BREAK key after
executing each line of code, SO you can recover from
endless loops and sometimes from runaway routines (if
you’re quick) by hitting BREAK. If you are using the
window, it should be switched off for this command.
Q Quit single-step and return to READ. Return address
is the address in the NEXT slot of the single stepper.
Register values will be preserved if you reenter from
READ mode.
R Run a CALL or RST 18. It is your responsibility to
know that the called routine will not crash and not to
send RST 10 any unprintable characters. The purpose
of this command is to shorten the time needed to step
through complex routines.
S Set register value. The response to this command will
be REG? in the NEXT cursor. You should respond as
follows for the various registers:
A for the A register
B for the BC pair
D for the DE pair
F for the Flags register
H for the HL pair
S for the user's Stack Pointer
X for the IX pointer
Y for the IY pointer
(S) Note that all settings are 16 bits (two bytes) except
for the one hex byte for A and the mnemonic setting
for F. The specific flag bits are set or reset
with the same mnemonics as are reported (M, P, Z, NZ,
PO, PE. C, NC). Use this command to set up initial
conditions for testing your routines.
SPACE Skip the step in the NEXT slot and advance to the next
instruction. Skipped instructions are not listed in
the LAST slot at the top of the disassembly segment.
T Twin the breakpoints. Sets Breakpoint2 = Breakpoint1.
THEN Set Breakpoint2. Breakpoints are set just as register
pairs are, with a NAME or address entry into the NEXT
cursor. You must set the breakpoints precisely to the
beginning of the instruction at which you want the
single-step to stop, because the stop depends on the
address of the next step being exactly equal to the
breakpoint. If the breakpoint points to the second
byte of a two-or-three-byte instruction, you routine
will never stop until you crash or hit BREAK.
TO Set Breakpoint1. Breakpoints are set just as register
pairs are, with a NAME or address entry into the NEXT
cursor , You must set the breakpoints precisely to the
beginning of the instruction at which you want the
single-step to stop, because the stop depends on the
address of the next step being exactly equal to the
breakpoint. If the breakpoint points to the second
byte of a two-or-three-byte instruction, you routine
will never stop until you crash or hit BREAK.
W Window switch. Switches the optional full-screen
display after each step. The first time you hit
shift-W switches the display in, the second time
switches it out, etc. Before you use this command,
you must first have used the FUNCTION-9 command in
write mode to set up an alternate display file.
Y Print screen. Copies current screen to printer.
ON NAMES AND NAMING
HOT Z labelling or NAMing system is intended to make the
programs you are reading or writing more comprehensible when
they are listed. The four-letter limit is imposed by the
32-column ZX display. A space is not a legal character in a
HOT Z NAME, so use a dash or other punctuation if you want
fewer than four letters.
The NAMEs themselves and the addresses they assigned to are
contained in a special file. referred to as the NAME file. A
NAME file is an ordered list beginning with the highest
address to which a NAME is assigned (two bytes), then the four
letters of that NAME, then the next highest address, etc.
After the last NAME in a file. there must be two zero bytes.
HOT Z takes care of ordering the NAMEs for you.
A small NAME file is loaded every time HOT Z is loaded. and
that file contains four-letter abbreviations of the system
variables as well as HOT Z’s variables. You will find a few
extras in the crowd from 4000 to 407D. LINK, TADD, and ASIM
are used by the single stepper. TEM1 through TEM9 are slots
for temporary 16-bit variables for various HOT Z routines.
(You may use them for any of your own routines for values that
are not required once the routine is over, provided your
routine does not call the floating-point calculator.) HZET
(407B-C) holds HOT Z’s restart address for those cases when
you (or HOT Z) are using ROM routines and stumble into one of
the BASIC error traps.
The permanent NAME file that loads with HOT Z can be expanded
to hold any NAMEs you add in a session of using HOT Z, or you
have the option of starting a new file from scratch. In the
Standard 16 and 64K versions, the permanent NAME file is
located just above a large work area. and as you add NAMEs the
file expands downwards in memory (to lower addresses).
Add a NAME to the file with the shift-G command in WRITE mode
with a disassembly (not data) on screen. The command will
give you a cursor in the NAME column and allow you to enter
or replace the NAME for that address. A legal NAME is made up
of any four single non-inverse characters with the restriction
that at least one character must be beyond F in the alphabet.
If you forget that rule, HOT Z will refuse to accept your new
NAME and will ask you for another. A space in a NAME will be
accepted and the disassembler will list the NAME, but you will
not be able to use such NAMEs when working with the assembler,
which parses according to spaces and punctuation. Take care
that your NAMEs are unique, or HOT Z will always find only the
one at the higher address when you refer to it. (If you enter
a NAME to the ADDR cursor before you assign it, then the NAME
file will be searched and the display will move to that NAME
if it is already there; otherwise the display stays put.)
The THEN key (WRITE) will delete a NAME at the cursor address
from the screen and from the NAME file.
The shift-T command (READ) is there to let you find the start
Of your current NAME file. You may want to check up on it if
your are working under crowded memory conditions to be sure
the file doesn’t overwrite some valuable code. This command
switches the display to data and moves to the lowest address
of the NAME file. Since the NAME column in the data display
lists NAMEs assigned to addresses formed by pairs of bytes in
the hex column, the NAME appears horizontally across from the
first address byte and then vertically opposite the last four
data bytes. (Be aware that chance occurrences of data can
look like addresses and cause spurious listings in the NAME
column of the data display.)
You should also use the shift-T command when it comes time to
SAVE the NAMEs you have entered in a session. However, you
will also need to know the end address of your file in order
to SAVE it. You can call up that end address by entering NEND
io the ADDR cursor; the end address of the NAME file is listed
lo-hi there. You can either add 2 to that address to include
the two zero bytes that act as a terminator, or you can
remember to zero those two bytes after you reload the tape.
If you choose the first option, hit shift-T, turn on the
edit cursor, set END to NEND+2, and SAVE. Record the
addresses for use when you reload.
When you reload a NAME file, you must install the start and
end addresses so that HOT Z will know where to look for that
file. This is done at the six-byte block labelled ALNA
(alternate NAMEs) in the permanent NAME file. With the data
display and the edit mode, write the start address twice
(1o-hi) followed by the NEND address: don’t forget to subtract
2 if you have included the terminating zeroes. (If you have
not included them, make sure they are there first.) If
you don’t do these settings correctly, you will hang up the
program when you try to switch the new file on.
The NAME-file switch command is shift-H in READ. It will
switch from the permanent NAME file to the one you have
loaded. after you have installed the file parameters at ALNA.
If you use shift-H without installing the new parameters, the
effect will be to switch off the NAMEs entirely and you will
not be able to add new ones.
You can amalgamate NAME files only if they pertain to separate
blocks of memory, with the addresses in one block all higher
than those in the other. Then just load the two files end to
end in the proper order and save them as a single file.
HOT Z NAMES IN PERMANENT FILE
AFEX 7FD0 Store for AF’ register pair in single-stepper
BERG 7FDC Store for AF register pair in single-stepper
ALNA 7FF0 Alternate NAME file descriptors. Six bytes.
ASIM 4076 Single-step simulation area. Five bytes.
BCEX 7FCE Store for BC’ register pair in single-stepper
BCRG 7FDA Store for BC register pair in single-stepper
BPT2 7FBC Breakpoint #1 address
BPT2 7FBE Breakpoint #2 address
CADR 7FFE Current address for disassembly
CBFL 7FF5 Flag for a bit-op prefix (CB)
CHOO 6AB9 Selects and updates Read mode display
COUN 7FB6 Counter for printing register values
DEEX 7FCC Store for DE” register pair in single-stepper
DERG 7FD8 Store for DE register pair in single-stepper
EDDQ 7FF4 Flag for ED prefix
EOPA 7FEA The END address
FCBQ 7FF3 Flag for prefixed bit ops
FENS 7F9E Single-step window switch: holds CRUN if off
FILC 7FB4 Fill character, normally zero for screen clear
HLEX 7FCA Store for HL’ register pair in single-stepper
HLRG 7FD6 Store for HL register pair in single-stepper
IXRG 7FD4 Store for IX register pair in single-stepper
IYRG 7FD2 Store for IY register pair in single-stepper
KADD 7FFE Address pointed to by the cursor
KEYB 737E Gets code of keystroke into A: preserves other
KLIN 7FF2 Line number with cursor
KPOS 7FF0 Screen address of the cursor
KRED 7DE3 Puts cursor address into HL and KADD
LENI 7FE6 Length of current instruction in disassembly
LFPO 7FB0 Stores address for floating-point interpreter
LOSI 7FC4 Last one-step instruction
NADD 7FFC Next address for disassembly
NASW 7FF8 Switch for NAME lookup
NEND 7FFA End of NAME list
NOSI 7FC6 Next one-step instruction
NTOP 7FF6 Most recent leading (low) address of NAME file
OSDF 7FC2 One-step display file for extra window
OSDF 7FC0 one-step—display point for window, as DFCF
OVER 7EF0 Overflow warning for User’s stack
7F82
POIN 7FBA Pointer used in building register-value display
PRIM 7FBB Space or prime for register display
SPBI 7FDE Stack-pointer storage bin for stack switches
UNDR 7F98 Underflow warning for User’s stack
7F9C
USRS 7FCB Single-step user’s stack pointer. Sets with S.
NOTE: The high byte of variables for the 64K version
is FE rather than 7F. Low byte is the same.
All other addresses are identical.
THE BIG REM
There is a REM generating program that was published in
a back issue of SYNTAX, and those of you who have it may want
to install it and use that to create a BASIC line to hold your
machine code routines. However, you may find the following
approach more instructive on how to manipulate BASIC from the
machine level. We have taped Big REM and included it after
the 16K version of HOT Z on your master tape. Big REM fills
all of the available workspace in a 16K memory.
Big REM can be used with either version of HOT Z-II, although
it can only be joined together on a single tape with the 16K
version. First LOAD HOT Z. You can LOAD Big REM without
exiting HOT Z by setting END to 4DC0, putting the cursor at
4009, and giving the LOAD command. You can also exit HOT Z
with the Q command, LOAD Big REM from BASIC, and return to HOT
Z with the appropriate RAND USR command. One thing you cannot
do (with 16K) after loading Big REM is to add BASIC lines in
the conventional way, because your memory is essentially full
and you will start overwriting parts of the HOT Z files.
With Big REM loaded, you can start writing your machine-code
routines at 4082, which contains the character zero (1C) as a
marker. as does the last usable byte (4AA4). When you finish.
then you will want to cut off the REM statement so that your
code just fits. The necessary information to do that is
contained in the chapter on BASIC line formats in your BASIC
manual. If you look at 407D and following with Big REM
loaded, you will see the line number in high-low order (0001H)
end then the line length in low-high order in addresses
407F-80, That length is 0A25H, If you add that value to the
next address, 4081 (the address of the token for REM (EA))
then the sum equals the location of the display file (0A25 +
4081 = 4AA6).
You should use this relationship to “clip off” the BASIC REM
with your routine in it. If, for example, your last byte of
code is at address 4400, then you will need a line ending
(76H) at 4401, and a line number at 4402 and 4403. If you
want that line number to be a 2, then put 00 at 4402 and 02 at
- (For higher line numbers, remember that this is a hex
value, not decimal.) Now you need a line length at 4484-5 and
e REM token (EA) at 4496. The line length will be the
difference between this address (4406) and the display file
address (4AA6 – 4006 = 06A0). so put the low byte (A0) into
4404 and the high byte (06) into 4405. That will create a
second BASIC lines however, the first line is still specified
as being the full length, so you must go back and change the
length of the first line.
In this case, the line length plus the address of the first
token (here REM) must sum to the address of the first byte of
the next line number, which is 4402 in our example. Since
4402 – 4081 = 03B1, put B1 in 407F and 03 in 4080. You can
now switch into BASIC with the Q command and delete line 2 in
the normal way, then SAVE line 1 for later merging with your
BASIC program.
Using HOT Z NAMEs with Big REM requires one of two approaches.
You could start by shortening the REM statement before you
write your code in order to leave room for the resident NAME
list to expand. Just clip off a suitable portion as described
above and come beck to HOT Z with the USR call. A more
convenient approach would probably be to locate the NAME file
for your routine et the high end of the big REM statement.
(See the notes on NAMEs and Naming.)
You can do that by just writing the address 4AA2 into the
three address slots at ALNA, then using the H command (Read)
to switch to the empty NAME file. Or you might want to
transfer all or part of the permanent list into the REM before
you do the switch. (Re careful not to transfer over the end
of the REM statement. which would destroy the line end and the
beginning of the display file.)
if you put the NAMEs for your routine in the top of the REM,
then after you split the REM you will have your routine in
line 1 and the NAMEs in line 2. You should then SAVE both
lines as & working copy for future revisions, then delete the
second line end SAVE again for merging with a BASIC program.
Combining Big REM and the 16K HOT Z
You can combine the 16K version with Big REM so that they LOAD
as a single program. LOAD the two programs as described
above. Write an 80H at 7F1F to indicate the end of a
variables area, then go to the systems variables area and
charge ELINE, STKBOT, and STKEND so that each holds 7F20
(low-high order !). Then SAVE the whole thing from BASIC.
When you reLOAD, you will have to start HOT Z with a direct
RAND USR call. You cannot write any BASIC or declare any
BASIC variables with this version, and you should decouple the
two parts after starting HOT Z by restoring ELINE, STKBOT, and
STKEND io hold 4DCO. What this linking does is to make HOT Z
look like the variables area of a BASIC program.
If you own Z-TOOLS co a comparable utility program. you can
merge the 1 REM’s created in this wav with BASIC programs that
lack a line 1.
If you are not using Big REM, or if you have completed the
line-chopping described above, and want to write a BASIC
program of some size with HOT Z still resident, then you
should move RAMTOP and the stack below HOT Z before you use
shift-Q to go off and write BASIC. In 64K, put RAMTOP below
5800H to protect HOT Z; in 16K, put it below 4E00.
USING THE RELOCATE COMMANDS (F-8,F-9)
The Relocate command is rather complex in order to provide you
a degree of flexibility in relocating your routines. A set of
nine addresses must be entered before using the F-8 command,
and a certain amount of planning and knowledge of the subject
program is required to derive the correct addresses. Simple
programs with one or two calls or absolute jumps are best
labelled, moved with the Transfer-with-NAMEs (F-6) command,
and then fixed up by hand.
A program of reasonable complexity will have a block of code,
a block of data (which may include address lists or jump
tables), and a block of variables. Good programming form
would recommend that you keep these blocks separate and
distinct rather than, say, mingle data and variable storage
in the crannies between your subroutines. If you are
programming with HOT Z, you can separate the blocks generously
as you develop your program and then use the Relocate command
to close the gaps when you finish. Separation of code and
data also allows you to make efficient use of the ZX memory
architecture, since there is generally some block of memory
that can be used far data or variables but not to run code.
(Above 8000H in unmodified machines. above C000H with the
Oliqer modification and the standard screen driver.) So don’t
clutter up you active memory with data files if you have more
than l6K of RAM.
HOT Z’s Relocate command will work on program blocks where
code, data and variables are separate and distinct. If you
have embedded patches of data, the command may still work, but
you should check the data after the relocation to make sure
that it has not been changed under the guise of readdressing
code. Programs such as the 8K ROM, where jump tables lie
around like empty beer cans, would have to be broken up into
segments and relocated piecemeal.
The Relocate routine readdresses and moves Z80 code. However,
the command does not take account of overlapping segments
between source and destination blocks. so you cannot directly
relocate a program to addresses already occupied by that
program. (In such cases, you should use the transfer command
first and then readdress in place with the relocate command.)
Jump tables have to be revised with the F-7 command, which
first asks you for a displacement and then adds that
displacement to each address in the file, starting at the
cursor and ending at the END address. (If you moved your code
from 4100H to 4400H then the displacement would be 0300H: from
4400H to 4100H would be a displacement of FD00H.) Jump tables
end data blocks should be moved with the Transfer command
prior to using the relocate command.
The F-8 command (Relocate) allows you to move the code block
by one displacement, the data block by another, and the
variables block by a third displacement. (Any other three-way
separation should also work.)
ADDRESS ENTRY FOR RELOCATING
The variables TEM1 through TEM9 are used to set the nine
address parameters for relocation. The nine addresses are
three sets of three addresses. Each set of three addresses
indicates the start and end of an address range to be changed
and the start address of the new address range. For example,
suppose your program to be relocated fit the following memory
map:
44D0-44EB Variables
44F0-44FF Data
4500-4680 Program
Suppose you heave 32K and want to put the variables and data
at 8100H and the program at 4C40. First. transfer the
variables block to 8100H: it will run to 8118, so transfer the
data block to 8119-8128. You want to move the program from
4500 up to 4C40, so any addresses of jumps or calls that lie
between 4500 and 4680 should be changed to lie between 4C40
and 4DC0. (You don’t need that last number.) So enter the
original range in TEM1 and TEM2 and the first address of the
new block in TEM3, thus:
TEM1 4500
TEM2 4680
TEM3 4C40
These first three TEM values always hold the parameters
relating to the program (code) block. Variables and data
parameters can go interchangeably into TEM4-TEM6 or TEM7-TEM9.
Addresses of variables, which were at 44D0-44E8. must be
changed to start at 8100, and addresses of data, formerly at
44F0—44FF, must be changed to begin at 8119, so fill in the
remaining TEM slots as follows:
Variables Data
TEM4 44D0 TEM7 44F0
TEM5 44EB TEM8 44FF
TEM6 8100 TEM9 8119
TEM4-6 are one block, TEM7-9 the other. Now set the cursor at
4500 (start of the code segment) and set END to 4680, then
give the FUNCTION-8 command. The code will be copied to the
new location and readdressed to run with the new variables,
new data block, and any relocated subroutines in the code
block. The original code will remain unchanged at its
original location.
You may also use the Relocate command to split a code block
into two or more separate blocks, but you must apply it
repeatedly. once for each of the end-product blocks, and
readdress for the blocks that are not being moved as if those
blocks were variables or data.
If you lack variables or data blocks, then use a single
non-zero dummy value for all three of the second or third set
of TEM values, i.e., make them all three the same.
The relocator leaves unchanged any ROM calls or any loads to
or from the systems variables area (4000-407C).
RELOCATING HOT Z
In 1óK
Relocating the program that does the relocating is a special
case of using the Relocate command. Lack of space in 16K
prevents any useful relocation of the entire program. You
could, however, clear away some of high RAM by moving the
part of HOT Z that occupy those addresses into the work space
below 4E00. This would allow you to write and debug a routine
intended to run above RAMTOP with a BASIC program.
To do that. begin by moving the stack with the FUNCTION-2
command. Set the cursor to 4D80 and give the command. (There
will be no visible on-screen effect unless you have set the SP
display (shift-2 in READ)). Next move the HOT Z variables,
which occupy 7FB0-7FFF, by using the Transfer-with-NAMEs
command (FUNCTION-6). Set the cursor to 7F80, set END to 7FFF
and give the command, followed by 4D80 as DEST. This copies
the variables to 4D89-4DFF, but it does not yet readdress the
HOT Z code to use variables at the new location. To do that,
set the following TEM values:
Code Data Variables
TEM1 5800, TEM4 4400, TEM7 7FB0
TEM2 7EFF, TEM5 4400, TEM8 7FFF
TEM3 5800, TEM6 4400, TEM9 4D80
The data entries are dummy values intended to have no effect,
since the data tables stay put. Finally, set the cursor to
5800, set END to 7F20 and give the FUNCTION-8 command. After
that. you may clear 7F20-7FFF with the FUNCTION-0 command and
use it as workspace.
If you are more ambitious still and hungry for high memory, it is possible to move a part of HOT Z from the high addresses to your low workspace, (If not, skip the next few paragraphs.) You need to pick a point in the code across which there are no relative jumps: 7870 is one such. Since this is not a simple relocation but a splitting up of the program. several extra steps are necessary. Assuming you have already moved stack and variables, as described above, first relocate the code from 7870-7F20 to 4670. Next. we will readdress code left behind (5800-786F) to send its calls and jumps to the transferred block: finally, a small fix to the jump tables is necessary.
For the initial relocation, set the following TEM values:
TEM1 7870, TEM4 4400, TEM7 4400
TEM2 7F20, TEM5 4400, TEM8 4400
TEM3 4670, TEM6 4400, TEM9 4400
Sei the cursor to 5800, END to 786F, and give the FUNCTION-8
command. The first column leaves the original code in place
and produces a relocated and readdressed version at the new
location (4670-4D20). The remaining columns hold dummy values
and produce No effect. The original section of the code will
still make its calls and jumps to 7870 and above, so it is
necessary to readdress that block too.
Again, set the TEM values:
TEM1 5800, TEM4 4400, TEM7 7870
TEM2 786F, TEMS 4400, TEM8 7F20
TEM3 5800, TEM6 4400, TEM9 4670
Set the cursor to 5800, END to 786F and give the FUNCTION-8
command. The first column leaves the code in place and the
third changes any references to the high addresses to the new
code block. The jump tables still contain a pair of
references to the moved code, however. Change the two 78’s at
50EB and 50ED to 46’s. (1f you moved a bigger chunk, you
would have to search through the jump tables and change each
reference to the moved block.) Now you can clear memory from
7870 to 7FFF and use that as work space.
Since the above relocation hems in the NAME file, you must
either forego using labels or relocate the NAME file into your
new workspace, which is relatively simple.
Larger Memories
If you should expand your RAM or install one of the
modifications that allow you to program parts of high RAM,
then the following relocations may be useful.
From 16K to 32K (unmodified computer): This case allows you
to move files and variables to high RAM, but the program must
still be located below 8000H in order to run. The files of
the l6K version are located at 5048-57FF; let’s move them to
B748-BEFF, leaving BF00-BFFF for variables, which are
currently at 7F00-7FFF. Set the following TEM values:
- 35 –
Code Data Variables TEM1 5800, TEM4 504B, TEM7 7F70 TEM2 7EFF, TEM5 57FF, TEM8 7FFF TEM3 5800, TEM6 B748, TEM9 BF00
It is important first to copy the files and variables up to
their new locations. so first transfer the data and variables
blocks to their respective new locations, leaving the old
copies temporarily intact. Transfer the variables
(7F00-7FFF) first, using the Transfer-with-NAMEs command
(FUNCTION-6). This will change the NAME file for the new
version. Then use the shift-T command to get to the start of
the NAME file (4E0C). Turn on the cursor, set END to S7FF,
and transfer to B50C. (That puts 504B into B748, etc.)
Now set the cursor to 5B80, set END to 7EFF, and give the
FUNCTION-8 command. After the return from that command, you
may erase the original data and variables areas for your own
use.
This relocation requires no readdressing of jump tables
because the code is left in place, but there is one
small block of single-step code which is embedded in the data
end copied out whenever the single-stepper is used. This
block originates et 570F-572B and will have to be readdressed
by hand if the code block had been moved. Details of this fix
are in the next example.
There is just one change to be made in the data section to
initialize to the new NAME file location on loading or
restarting. The initial file location is set from the six
bytes at BEF4 and following. Change BEF5 and BEF7 from 4E to
B6 and BEF9 from 50 to B7.
Having done this readdressing. it is useful to make yourself a
loader, so that you can load in the new version directly and
don’t have to relocate every time. The easiest way to make a
loader is to modify the existing one by loading the entire HOT
Z-II tape into memory and modifying it. For the example
relocation., you can load the HOT Z-II tape as a data tape from
8009H to B4E5. The code that loads HOT Z to the proper
addresses will be at 83AB and will have to be modified.
First, however, the readdressed program segment from 5800 to
7EFF should be copied into the loader with the transfer
command. Set the cursor and END to these two addresses and
transfer to 8DC4. Next, set the cursor to B50C and END to
BEFF and transfer to 83D0. This moves the files into place.
Now modify the code at 83AB to read as follows:
LD HL,43D0
LD DE,B50C
LD BC,09F4
LDIR
LD HL,74E3
LD DE,7F1F
LD BC,2720
LDDR
CALL 0F23
JR 403C
1f you use the insert command (EDIT) before each of the first
four instructions, you can preserve and use what is already
there, but change the LD BC to 2720.
Ready at last. SAVE from 8009 to B4E5 and the resulting tape
should load normally and initialize the relocated version.
One of the hazards of loading a large program such as this is
the possibility of writing over the machine stack when you
copy up the program. In this case, the stack is in the
eventual workspace (7F00-7FFF) and is safe. However, if you
engage in non-standard addressing or have a revised ROM in
your machine, then be sure the stack is in a sate place before
loading HOT Z.
Moving HOT Z to High RAM
If you have a suitable memory for the project (Oliger or
Memotech or possibly another: not a Byte-Back M-64 or a Super
Z.) and make the Oliger modification to your computer (See SQ
v2.n2.), you can run machine code in the 32-48K block
(8000H-BFFF), or if you have a separate display board, you may
be able to use the entire 64K for programs. In that case, you
should convert HOT Z to run entirely in another block of
memory. Here’s how to move the 64K version to 9B00H, keeping
the variables and files in the top 16K of a 64K memory.
(You ought to test your modification first by using HOT Z to
write a simple little routine like CALL 0A2A, CALL 737E, RET
somewhere in the newly opened-up memory area. This just
clears the screen, waits for a keystroke, and comes back to
HOT Z. but you can’t normally run it at, say, 8100H. Set the
cursor to the first instruction and give the shift-R command
to Run it. If it doesn’t work, then either your mod is
incorrect or your memory has some prevent circuit in it.)
Load the 64K version. Set the following TEM variables:
Code Data Variables
TEM1 5B00, TEM4 5000, TEM7 5000
TEM2 7F1F, TEM5 5000, TEM8 5000
TEM3 9800, TEM6 5000, TEM9 5000
This will cause the program code to be rewritten at 9800 and
following addresses with all calls and jumps readjusted but
with the same variable and file addresses. (Values in TEM4
through TEM5 are dummy values that prevent anything from
happening. Use any one non-zero value for these, but keep
them all the same.)
Set the cursor to 5800 and END to 7F1F and give the FUNCTION-8
command. If you have done things correctly to here, you will
find the readdressed program beginning at 9800. Don’t try to
run it yet. Unlike the earlier example, the jump tables must
be readdressed because the program itself has been moved.
The jump tables for the standard 64K version begin at F648 and
end at F76D. Since both copies of the program ere in memory,
vou can just readdress the labels in place. Use the
FUNCTION-7 COMMAND to change the jump tables. (Cursor at
F648, set END to F76D, hit FUNCTION, then 7, set DISP to 4000,
because the move from 5800 to 9800 is a displacement by that
amount, ENTER.) Now check the address at F754 and change it
back io 4076; since that address is in the systems variables
area, it does not change.
At this point, you are running commands in one version and
control in the other, Now switch to the new version by
setting the cursor to 9800 and giving the shift-R (Run)
command. That should bring up the 0000 address as the program
restarts in the new version.
The single-stepper requires one more set of changes. There is
e small patch of code embedded in the data section that is
copied out for single stepping. You will find it at FD0E to
FD2B (FD2C isn’t!) There are seven JP’s and one CALL in that
area. It is generally quicker to revise those eight addresses
than to use the FUNCTION-8 command, though you could use it by
setting TEM1 = FD0E, 2 = FD2B, 3 = FD0E, 4 = 5800, 5 = 7F1F,
6 = 9800, and the other three with a dummy, say 5000. If you
revise the addresses by hand, just add 4000 to each.
Don’t change the JR. (The new addresses will all begin
with either A9 or AA.) You should now have a fully converted
version that runs in the 32-48K block of your modified
computer’s memory.
To make a loader for this new version, load in the original
tape from 4409 to 794F. (You may first want to erase the old
version at .5800-7F20 with the FUNCTION-0 command.) Now all
you have to do is to copy the various blocks into the
appropriate spots in the loader, change a few loading
addresses, and resave the same block to make a loadable tape.
(Addresses 4409-447C will contain the system variables that
normally load to 4009-407C.)
At 47Bó, change the LD DE,7F1F to LD DE,BF1F. That will load
the program to its new memory residence. At 443F, change the
CALL 737E to CALL B37E. That calls the relocated keyboard
scan while the cover is on screen. At 4442. change the LD
BC,146B to LD BC,3B6B. That clears away the loader after it
has done its job. Change the JP at 444F to JP 9900. That
starts the program.
Now set the cursor at 9800, END to BF1F, and Transfer
(shift-T) to 47D0. Next. cursor at F3A0, END set to FDFE, and
Transfer to 6F00. If you want to change the version number
end memory-occupation listing on the cover, look at 466F and
following with the data display and make the changes in the
Edit mode. Finally. record over the initial address space
(4409-794F). The resulting tape should load from BASIC,
install HOT Z, and jump to the cover, just as your original
version does.
THE ONE-STEP WINDOW
The Single-Step display. window requires a second full display
file for the cumulative screen print of the routine you are
stepping through. Since such a display file takes up 768
bytes of memory that you might otherwise use for programming,
the program requires you to specify where you want to put the
second display file. Such a file can be anywhere in memory
since it is moved into the proper location at each step. Just
assure that the following 768 bytes contain nothing you want
to keep. Then set a cursor to the start of this area and give
the FUuUNCTION-9 command to initialize the file and hook the
window into the single-step routine.
After you have initialized the second display file. you can
switch the single-step display window in or out with the shift
kd command ingle-Step). If the window is “on”, the screen
will come up with a pause tor a keystroke at every step.
Since only a few steps will actually print to the screen, you
may want to keep the window off and refer to it only
occasionally. Restart HOT Z (shift R in READ) to get rid of
the window entirely and reclaim the memory space.
The window will normally flash on screen for each step, but
there will be no pause unless you first give the W command,
then hit ENTER to run a step. Any key will take you back to
the register display, but note that the V key is also a CLS
command for your window display. A CLS puts the print
position back to the top left screen corner.
If you use RST 18 to print to the display window, you can run
the whole RST 10 routine in the same way you would a CALL to a
subroutine, by hitting shift-R in single-step mode.
NOTES ON MAKING EPROMS
At the moment, the only possibility of putting HOT Z-II on
EPROM is to use two 2764’s (or a 27128) or the equivalent with
some kind of modified memory system. This means you will have
Some extra space for your own routines as well, and you may
want to hook up some of them to HOT Z.
The commend lists have two kinds of user-slots for extra
commands, marked as “Dead keys” and “User hookups”. If you
work entirely in RAM, then treat both categories as equal.
Just replace the current address in that jump-table slot with
the address of the routine you want to run as a command for
the corresponding key.
If you make your own EFROMs of HOT Z, then you have to treat
Dead keys and User Hookups as quite separate opportunities.
Dead keys will be truly dead in EFROM unless you enter an
address before you burn an EFROM. If you have space for your
favorite routines on the same EPROM with part of HOT Z, then
you should book up those addresses before you burn the
EPROM. User hookups are still available atter you burn the
EPROM because they allow you to hook in routines you have just
written into address slots in the variables area. Addresses
for these slots ere listed on the command sheets. it is often
handy to look new routines of any sort into HOT Z and to run
them as commands.
Most available slots have been left among the Write commands
because those commands allow the greatest flexibility. If you
want to add to that flexibility, write your own command
processor and make the entry into that a HOT Z command. That
is roughly how HOT Z ties together the Read command mode with
the Write modes and the single-step. I use a jump table for
all command-processing loops and advise anyone using HOT Z to
take the same approach because there is a lot there that you
can borrow. (For example, a CALL to this versions KEYBoard
routing will preserve all register values except for the
accumulator, which comes back with the code of the first key
pressed. It does use the EXX registers.)
With a Write command. you should have the cursor address
available to you as well as the END address. The END address
is always available by loading from the HOT Z variable E0FA.
which is included in the permanent NAME list. The cursor
address should be read at the start of a routine with a CALL
ERED (cursor-address read), which brings back the cursor
address in HL and updates it in the HOT Z variable KADD.
(cursor address). ERED is the address in the first CALL for
the H kev routine. tor example, which is listed on your
Command Sheet, KRED puts the cursor address in HL and into
the HOT Z variable KADD.
If you have a routine that you want to make into a Write
command. then you should decide what mode of HOT Z you want to
return to. even if only eventually. A routine that ends in a
RET must not destroy the existing screen, or it will have no
context to return to. (It will come back, though, to an
anonymous address and in Write mode but with no cursor, at
which point you should press ENTER.) If you want to use the
screen then you should choose to return to Read mode, which is
the “home base” of HOT Z. To do that, you should POP the
first RETurn address and dispose of it, then load HL with the
address CHOO and do an EX (SP),HL. If you do that, you can
even control the address to which the HOT Z display returns by
loading CADR before you RETurn.
In other words, if you want to use the screen, and to know the
address et which the command was issued. prefix your routines
with:
POP HL
LD HL. CHOO
EX (SP),HL
and end them with a RET.
Commands that do not use the screen can restore the cursor
position with a CALL KRES. You can move the cursor one line
down with CALL KDWN or move it up with CALL K-UP, either just
before the RET.
Commands appended io the single step may need to use the
address in the NEXT slot, which is stored in the variable NOSI
(next one-step instruction).
THE FLOATING-FOINT INTERPRETER
RST 28H is the entry into the ROM’s floating-point operations,
which are coded in the bytes between an RST 28 and the
following 34H. There is a good explanation of this second
language (Or is it third?) of the ZX in Dr Logan’s article in
SYNC 2.2. (But beware of the two sign tests, which aren’t
jumps, as labelled in SYNC.)
HOT Z will read this floating-point language, but only after
you turn on the floating-point interpreter (shift-W in READ).
If you leave the floating-point interpreter turned on, you
will get a true reading of the ROM, but problems can arise
elsewhere in memory when you encounter an EF that functions as
date rather than an RST 28. You may get locked into the
floating-point interpreter mode, without a 34H. the END
Character, in sight. The way out from this barrage of
gibberish is the shift-W command again, which switches out the
floating-point interpreter entirely. Other times you may want
to read it, because this extra language is really one of the
treats of the Sinclair-calculator heritage.
The f-p interpreter is also turned off by entry of a numerical
address, but not by a page flip or a NAME, so use the last two
when you’re working with f-p. In addition, there is a special
key command, TO in READ mode, which switches the flag that
tells the disassembler which language it’s in.
The TO command (READ) has a dual purpose. It will get you out
of floating-point mode (without turning off the interpreter)
if you need to and can’t, or it will get you in when you want
to be but aren’t. You may get stuck in that mode through
addressing yourself into the middle of a Z80 instruction, for
example. Since floating-point operations include jumps and
loops, there are also inclusions of f-p code that do not begin
with am RST 28, branches of jumps. The TO command will get
you into those branches. However, the command is just a bit
switch and it doesn’t function when the screen page itself
switches from one language at the top to the other at the
bottom. The cure, when the TO command doesn’t function is the
cute trick of hitting the shift-D key twice. This picks up
the language mode from the bottom of the page to the top and
reverses the reading of any bytes from one language to the
other.
You will also encounter some queer behavior if there is f-p
code at the bottom of the screen and you try to write or go to
the One-Step. This is not generally fatal and can be cured by
going back to disassembly and setting the screen so that it
ends in Z80 disassembly. If you want to write f-p code, the
only manageable way is to go into EDIT mode (shift-E).
Another consequence of jumps in the f-p language is that an
RST 28 may be embedded in a run of f-p language as a second
entry point. In these cases, EF gets misread as GET F, which
is a particle of nonsense, but it really is an RST 28. and
would reed as such if you called it by address to the top of
the screen.
Floating-point operations are FORTH-like stack manipulations
and easy to follow if you know something about that language.
They use the MEM area of the systems variables as storage
slots for six floating-point numbers. (Each is five bytes.)
The f-p operations that transfer between the calculator stack
and MEM are called GET and STOR and are followed by a single
digit from 0 to 5 to indicate the slot used. Numbers or
letters higher than 5 generally indicate a patch of nonsense
with GET, STOR and STAK as well.
Many of the possible f-p operators do not occur in the coding
of the ROM, where you are likely to encounter them with HOT Z.
They occur instead during the ROM’s reading of BASIC programs,
and they ere generally identical with a BASIC instruction.
You could learn to write floating-point code with these and
the purely machine-code f-p operators if you wanted to; it
would be similar to BASIC and a little faster. The ‘entry
point’ of these BASIC f-p operators into the real machine
world is through the operation labelled RAFF (Run A as
Floating-Point). However, you need only use the command
numbers listed as the first column of the instruction list to
perform those BASIC functions on whatever floating-point
numbers are on the calculator stack. From the perspective of
a HOT Z user, RAFF would be used only to run an operation that
resulted from some calculation, whose result was a code in A.
Two of the f-p operations deliver data directly from the code
listing to the calculator stack. They generally do this in an
efficient way, using fewer than five bytes, if possible, to
encode the five-byte floating-point number. HOT Z prints the
encoded floating-point number in the NAME and mnemonics
columns of the disassembly listing. Since the interpreter
doesn’t know where any number will end, it is necessary to
begin all of them slightly out of column, or the longest would
poke out the line-ends in the display file. The f-p
interpreter also reads the full five hex bytes that go onto
the f-p stack, rather than the condensed version that actually
occur in the ROM. The ADDR column keeps accurate track, and
you can work out the extra bytes, which are generally trailing
zeroes, from that column.
HOT Z prints floating-point data by using the same ROM
routines that handle that data, so the disassembly slows down
and becomes jerky when it has to print those huge numbers, or
their single-digit versions.
The two data-stacking operations are labelled STFP (stack
floating point) and SAPP (successive approximator: we’ve ail
met one). The first of these puts one five-byte number on the
calculator stack, the second a series of one to 31 (whatever
is left when you AND the low nibble of the instruction byte
with 0F) five-byte f-p constants. (That’s 5 to 155 bytes.)
When either of these operations gets stuck near the bottom of
the screen without enough space to display all its floating
points, then that same operation will begin again after the
next page flip (F command) and boringly redisplay its whole
repertorv of numbers. The successive approximator in the ROM
uses anything from six to a dozen floating point constants to
get to a value for Chebyshev polynomials to approximate the
transcendental BASIC functions.
FLOATING FOINT OPERATIONS
Code Op Addr Description
00 JRT 1C2F Jumps if stack top holds a true
01 SWOP 1A72 Exchanges the top and second 5-bvte stack entry
02 DROP 19E3 Throws away top stack entry
03 SUB 174C Subtracts top stack from second stack entry
04 MULT 17C6 Multiplies top two stack entries and leaves product on stack
05 DIV 1882 Divides second entry by top stack and leaves quotient on stack
06 PWR 1DE2 Raises 2nd on stack to power of stack top
07 OR 1AED Performs BASIC OR on two top stack entries and leaves result
08 AND 1AF3 Performs BASIC AND on two top stack entries. leaves result
09 N<=M 1B03 Numeric inequality test 0A N>=M 1B03 Numeric inequality test
0B N<>M 1B03 Numeric inequality test
0C N>M 1B03 Numeric inequality test
0D N= 1B03 String inequality test
13 $<> 1B03 String inequality test
14 $> 1B03 String inequality test
15 $< 1B03 String inequality test
16 $= 1B03 String equality test
17 $TR+ 1B62 Concatenates the strings addressed by the two top stack entries
18 NEG 1AA0 Changes the sign of top stack entry
19 CODE 1C06 Replaces top stack entry with its Sinclair CODE
1A VAL 1BA4 BASIC function
1B LEN 1C11 BASIC function
1C SIN 1D49 BASIC function
1D COS 1D3E BASIC function
1E TAN 1D6E BASIC function
1F ASN 1DC4 BASIC function
20 ACS 1DD4 BASIC function
21 ATN 1D76 BASIC function
22 LN 1CA9 BASIC function
23 EXP 1C5B BASIC function
24 INT 1C46 BASIC function
25 SQR 1DDB BASIC function
26 SGN 1AAF BASIC function
27 ABS 1AAA BASIC function
28 PEEK 1ABE BASIC function
29 USR 1AC5 BASIC function
2A STR$ 1BD5 BASIC function
2B CHR$ 1B8F BASIC function
2C NOT 1AD5 BASIC function
2D DUP 19F6 Duplicates top of stack (5 bytes)
2E QREM 1937 Replaces number pair with quotient on stack top, remainder below
2F JRU 1D23 Unconditional relative jump
30 STFP 19FD Composes and stacks number from following data bytes
31 LONZ 1C17 Loop jump as DJNZ with BERG as counter
32 N<00 1ADB Tests sign of stack top and replaces with true if negative 33 N>00 1ACE Tests sign of stack top and replaces with true if positive
34 END 002B Ends and RST 28 routine
35 ADDJ 1D18 Adjusts angle values modulo 2 pi for trig functions
36 ROUN 1BE4 Rounds down to integer
37 RAFP 19E4 Uses byte in A as f-p op code and runs it; for BASIC functions
38 DEXP 155A Decimal exponent processor
BA SAPP 1A7F Successive approximator; stacks and processes constants
A0 STAK 1A51 Stacks 0.1,0.5,PI/2,or 10 depending on 2nd nibble
C0 STOR 1A63 Recalls stored entry from calculator MEM slot in 2nd nibble
E0 GET 1A45 Stores entry in calculator MEM slot given by 2nd nibble
READ Mode Command File
File Key Routine Function
(64K) (16K) (Shift)
F65E 505E A 7E30 Turn on assembly editor
F64C 504C AND 63DE Stack pointer display switch
F660 5060 D 6A74 Switch to data display
F65B 5058 E 60C5 Switch to edit
F662 5062 F 63C4 Fix display file
F65C 505C G Dead key
F648 5048 H 5D53 Switch NAME file
F664 5064 Q 5D68 Quit to Basic
F64E 404E R 5800 Restart HOT Z (also RAND USR 22528)
F65A 505A S 65E4 Switch to Single-Stepper
F652 5052 T 5C5F Display top of NAME list
F654 5054 THEN 5BC1 Decimal address to follow
F656 5056 TO 63E7 Switch floating-point display
F64A 504A W 5CEC Switch off floating-point interpreter
F650 5050 Y 63F0 Print screen
F666 5066 F-1 Dead key
F668 506B F-2 “
F66A 506A F-3 5D71 User hookup (Routine addr at 7FA9/FEA0)
F66C 506C F-4 6088 User hookup (Routine addr at 7FA2/FEA2)
Single-Step Command File
File Key Routine Function
(64K) (16K) (Shift)
F6DA 50DA A Dead key
F6CB 50CB AND Display breakpoints
F6DC 50DC D User hookup (Routine addr at 7FAA/FEAA)
F6D4 50D4 E Dead key
EDIT Back up one byte
ENTER Run one step
F6DE 50DE F User hookup (Routine addr at 7FAC/FEAC)
F6D8 50D8 G Go to breakpoint
F6C4 50C4 H Dead key
Q Quit single-step for disassembly
F6CA 50CA R Run CALL or RST
F6D0 50D6 S Set register value
SPACE Skip step
F6CE 50CE T Twin breakpoints
F6D0 50D0 THEN Set breakpoint 2
F6D2 50D2 TO Set breakpoint 1
F6C6 50C6 W Window switch
F6CC 50CC Y Print screen
WRITE Command File
File Key Routine Function
(64K) (16K) (Shift) Addr
F684 5084 A 5F5A Assembly mode
F672 5672 AND 5A61 LOAD from cursor to END
F686 5086 D 5EZ7 Display switch to DATA
F67E 507E E 5F63 Edit mode
F688 5088 D 5C64 FIND string marked by cursor and END
F682 5082 G 5B4B Christen with NAME
F66E 506E H 5F7D Delete instruction at cursor
F6BA 508A Q 5B1E Hex sum and difference of cursor and END
F674 5074 R 5D47 RUN code at cursor (RET to READ)
F680 50B0 S 65E0 Single step instruction at cursor
F67B 5078 T 5847 Transfer
F67A 507B THEN 5DD6 Delete NAME
F67C 507A TO 6076 Set END variable
F670 5079 W 5A62 SAVE from cursor to END
F676 5076 Y 5D04 Print from cursor to END
EDIT Set INSERT cursor ENTER Quit to READ mode
F68C 50BC F-0 5EC4 Clear memory from cursor to END
F68E 50BE F-1 5EB1 Fill memory with specified character
F690 5090 F-2 5CCA Move RAMTOP to cursor, stack just below
F692 5092 F-3 Dead key
F694 5094 F-4 “
F696 5096 F-5 “
F698 5098 F-6 584D Transfer code and NAMEs to DEST
F69A 509A F-7 5937 Readdress a jump table by displacement
F69C 559C F-8 5980 Relocate code from cursor to END
F69E 569E F-9 63AF Initialize window for single-stepper
F6A0 56A0 F-A Dead key
F6A2 56A2 F-B “
F6A4 56A4 F-C “
F6A6 56A6 F-D “
F6A8 56A8 F-E “
F6AC 506B F-F 5C56 Find next occurrence of string
F6AC 50AC F-G Dead key
FCAE 50AE F-H “
F6B0 50B0 F-I “
F6B2 50B2 F-J “
F6B4 50B4 F-K “
F6B6 50B6 F-L “
F6B8 50B8 F-M “
F6BA 50BA F-N “
F6BC 50BC F-O “
F6BE 50BE F-P 61A3 User hookup (Routine addr at 7FA4/FEA4)
F6C0 50C0 F-Q A3F5 ” 7FA6/FEA6)
F6C2 50C2 F-R A66D ” 7FAB/FEAB)
handwritten page, pasted in back of Hot Z-II USER’S NOTES
Hot Z-II Commands:
-----------------
Read mode command are listed at the top of the keys in the top of the two layouts below.
Single-step command are listed on the same layout below the corresponding keys.
Write mode commands are listed on the lower layout. Function key commands are not listed.
Refer to separate list for those.
+—————————————————————————————-+
| |
| INSRT SPON DEC FPFLG <- L ^ -> GRAPH Rubout |
| +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ |
| | 1 | | 2 | | 3 | | 4 | | 5 | 6 | | 7 | | 8 | | 9 | | 0 | |
| +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ |
| BACK BPTS BPT2 BPT1 | Read
| |
| BASIC FPOFF HEXED RESET NTOP PRSC | and
| +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ |
| | Q | | W | | E | | R | | T | Y | | U | | I | | O | | P | | single-step mode
| +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ |
| QUIT WNDOW RUN TWIN PRSC | commands –
| | —————-
| ASEM 1STEP DATA FIXDF ALNAM FUNC |
| +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ |
| | A | | S | | D | | F | | G | H | | J | | K | | L | ENTER |
| +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ |
| SET GO |
| | |
| +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ |
| SHIFT | Z | | X | | C | | V | B | | N | | M | | . | SPACE |
| +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ |
| Skip |
| |
+—————————————————————————————-+
+—————————————————————————————-+
| |
| INSRT LOAD DENAM END <- L ^ -> GRAPH Rubout |
| +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ |
| | 1 | | 2 | | 3 | | 4 | | 5 | 6 | | 7 | | 8 | | 9 | | 0 | |
| +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ |
| |
| |
| NEXT SAVE HEXED RUN TRAN LLIST | Write
| +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ |
| | Q | | W | | E | | R | | T | Y | | U | | I | | O | | P | | mode
| +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ |
| | commands –
| | —————-
| ASEM 1STEP DATA FIND NAME ZAPP FUNC |
| +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ |
| | A | | S | | D | | F | | G | H | | J | | K | | L | ENTER |
| +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ |
| |
| | |
| +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ |
| SHIFT | Z | | X | | C | | V | B | | N | | M | | . | SPACE |
| +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ +—+ |
| Skip |
| |
+—————————————————————————————-+
FUNCTION KEY COMMANDS:
---------------------
Read mode – +———————————————————–
———- | ADDITIONAL INFORMATION
F-3 ZX-File interrupt | ———————-
driver routine | Version 2*2I-1
| memory use $4E00-$7FFF (19968-32767)
F-4 ZX=FILE entry | Rand USR 22528 (5200H) restarts HOT Z (also SHIFT+R
| in READ mode)
| Ramtop = 32640 ($7F80)
Write mode – | ZX-FILE dependent version
———– | Set Ramtop to 19968 + load as data
F-0 Clear | HOT Z-II is 12800 bytes long (12-5 to) ($3200)
F-1 Fill |
F-2 Set ramtop | ZX-FILE – free from 13690 – 16383 (35A7H – 3FFFH)
F-6 Transfer with names | = 2694 (0A86H) bytes free
F-7 Re-address | REM – 4082 – 4AA4 (useable)
F-8 Relocate |
F-9 Initialise window | Name file (start)=SHIFT+T(read) END=NEND(lo-hi)+2
F-F Next find | ALNA start(lo-hi)+2 and NEND address, then SHIFT+H(read)
F-P user hookup (7FA4) |
F-Q user hookup (7FA6) | VOL. FOR ZX-FILE = 100% (FULL)
F-R user hookup (7FA8) |