Now having got the program in using the ‘M’ command, go and read up the ‘S’
command. Notice how the register display is presented when using single step. It might
help if you stuck a piece of masking tape across the top of the monitor screen, with
the registers written in order across it, saves continually refering to the book. Away
we go!! Type S 0C80, and provided you did it all right, then a register display will
appear on the screen. Whats more, the ‘A’ register will contain 10H and the ‘PC’ will
be pointing at the next instruction (0C82H). Hit ‘Enter’ again, and the ‘PC’ will
advance one, pointing to the next instruction, and the ‘A’ register will be
decremented by 1. Also at this point the flags may have changed (they were in an
indeterminate state when we started), now they definitely show the result of the
decrement. Hit ‘Enter’ again, and the ‘PC’ will have skipped back to the address of
the decrement instruction ready for the next time round. Keep hitting the ‘Enter’ key,
watching the ‘A’ register and the flags. When the ‘A’ register goes to zero, notice
the flags change, the ‘Z’ flag comes on. Take one more step, and notice nothing
happens, but this time the ‘PC’ instead of pointing to the decrement instruction, now
points to the next instruction, the load ‘A’ with 22H. Nothing happened because the
processor still has to perform the test on the flags. You know they’ve changed, but
the processor still has to test them and jump (or not jump as the case may be). One
more step, and lo, the ‘A’ register contains 22H. There you are, your first assembler
program. It didn’t do much, and it’s only safe to single step the program, as it
doesn’t stop when its finished, but you must have learned something. If you didn’t
understand what happened, perhaps a Basic analogy will help.
Having manipulated one register and seen the effects. Two things remain to be
explained in this episode. The first, a brief explanation of some of the other
registers, and secondly, how the processor knows what to do.
The other main registers of the Z80 are the ‘B’, ‘C’, ‘D’, ‘E’, ‘H’ and ‘L’
registers. As mentioned previously these 8 bit registers are also organised so that
they may also be loaded as pairs so that each of the 8 bit registers paired together
give the following 16 bit registers, ‘BC’, ‘DE’ and ‘HL’. The ‘A’ and ‘F’ registers
are also paired together, although because of the special nature of the ‘F’ register,
the ‘AF’ pair can not be treated as a single 16 bit register. Presumably there is no
‘G’ register because the name of the other of the pair has already been allotted to
the ‘F’ register.
When treated as 8 bit registers, the registers act as temporary storage places
for data or can be used as counters. They also have limited arithmetic capability,
they may be incremented and decremented, and major changes of status will affect the
‘F’ register just like the ‘A’ register. There are perhaps more 8 bit registers than
would be really necessary, (memory locations could be used in place of registers), but
as it takes the processor markedly less time to get frequently used data from an
internal register, using them speeds things up.
Perhaps more important is the 16 bit capability. Now addresses are 16 bits
wide, and the 16 bit register pairs have access to the address bus. The ‘HL’ pair acts
rather like the ‘A’ register, in that limited arithmetic can be performed using it as
a 16 bit accumulator and the results affect the flags accordingly. This means that
addresses can be calculated directly which saves a lot of time and effort. The
remaining registers, the ‘SP’, ‘IX’ and ‘IY’, ‘I’ and ‘R’ all perform special
functions and we’ll make use of them as we come to them.
Just in case the above set of registers aren’t enough for you, there is also a
complete duplicate set of the main registers which may be switched in at will. Phewww !!!