
By James Moxham
ZINT Z80 INTERPRETER
Copyright 1996 James Moxham
Chapter 1 LD group of instructions
Chapter 2 Exchange group
Chapter 3 The stack, POP and PUSH
Chapter 4 Arithmetic
Chapter 5 Jumps calls and returns
Chapter 6 And or and xor
Chapter 7 Bit set reset and test
Chapter 8 Rotate and shift
Chapter 9 General arithmetic and control
Chapter 10 Block transfer and search
Chapter 11 Input and Output instructions
Chapter 12 Additional useful commands
Chapter 13 Number bases
Chapter 14 The flags
Appendix 1 Binary, hex ascii decimal TC conversion
*****************************************************************
CHAPTER 1 The LD instruction
The LD instruction is perhaps the most useful instruction in
the Z80. It is used to transfer data between registers, and to
and from memory. The most simple type of LD instruction is to
fill a register with a number: (Use F1)
LD A,6
This loads the A register with the number 6, so the register
display now appears as
A CZPSNH BC DE HL IX IY A' CZPSNH' BC' DE' HL' SP
06 000000 0000 0000 0000 0000 0000 00 000000 0000 0000 0000 0000
You can transfer this data to other registers
LD H,A
A CZPSNH BC DE HL IX IY A' CZPSNH' BC' DE' HL' SP
06 000000 0000 0000 0600 0000 0000 00 000000 0000 0000 0000 0000
copies the data in the A register to the H register. In fact H
could have been any one of A B C D E H or L. The data in the A
register remaines unchanged.
Transferring data: Number bases
As most programmers of BASIC will know numbers can be
represented in several forms, binary octal and hexadecimal being
common bases. The registers in the above example display the data
in hexadecimal form. Thus
LD A,255 gives
A CZPSNH BC DE HL IX IY A' CZPSNH' BC' DE' HL' SP
FF 000000 0000 0000 0000 0000 0000 00 000000 0000 0000 0000 0000
FF is 255 in hexadecimal. The equivalent statement using
hexadecimal directly is
LD A,0FFH
The H at the end signifies that the number is a hex number.
The 0 at the front is necessary because the first digit in any
number should always be between 0 and 9.
You can also use binary
LD A,11111111B
where the B at the end specifies the number is a binary
number.
The reason for using all three bases is because some
instructions are much easier to understand in one base.
Two other bases are supported, two's complement and direct ascii
characters and are discussed in detail in ch16. The following
instructions all do the same thing.
LD B,073H
LD B,01110011B
LD B,65
LD B,"s"
Double register LD's
As you notice from the register display some registers have
been grouped together. For example the H and L registers are
displayed together as HL. You can treat these pairs as if they
were one
LD HL,1000 returns
A CZPSNH BC DE HL IX IY A' CZPSNH' BC' DE' HL' SP
00 000000 0000 0000 03E8 0000 0000 00 000000 0000 0000 0000 0000
We can alse transfer this data from one double register pair to
another
LD BC,HL gives
A CZPSNH BC DE HL IX IY A' CZPSNH' BC' DE' HL' SP
00 000000 03E8 0000 03E8 0000 0000 00 000000 0000 0000 0000 0000
The double registers can be any one of BC DE HL IX IY or SP.
Transfers to and from memory
The above instructions all transfer data within the
microprocessor. The following sequence transfers a data to the
memory (Use F1 or write as a program and then type F5)
LD A,255:LD HL,1000:LD,(HL) A
Here we are using more than one statement in a line. The
first two statements load the registers as we have seen before.
The last statement loads memory location 1000 with 255. To
retrieve this data we can use
LD D,(HL)
which transfers 255 from the memory to register D.
To see what is in the memory at any one time use the view
memory command.
In general the memory location is usually given by the HL
register pair. The BC and DE regsters can be used as the memory
location but the data can only be transferred to and from
register A eg LD (BC),A is allowed but LD B,(DE) is not.
A second way to transfer data to and from memory is to use a
number instead of a register pair. Thus
LD E,(38C1H) transfers to register E the data in memory 1000
LD (HL),34 transfers to the location stored in HL the no 34
A third way is to use the IX and IY registers. Say for example we
want to store the word HELLO in memory. First we would look up
the ASCII values for the letters, which are 72 69 76 76 79. We
will store the word starting at memory location 500. First we
load IX or IY with 500
LD IX,500
Next the data is transferred
LD (IX),72:LD (IX+1),69:LD (IX+2),76:LD (IX+3),76:LD (IX+4),79
Use the view memory command to see where this data is.
The final way LD can be used is to transfer double registers to
and from memory. For example
LD (500),BC
transfers the contents of C to the memory location 500 and the
contents of B to location 501. We can load this data from memory
to register pair DE with a
LD DE,(500)
The register can be BC DE HL IX IY or SP.
What follows now is a list of all the possible LD instructions
sorted alphabetically. The letter n is used to indicate a number
between 0 and 255 (0 and 0FFH). nn represents a number between 0
and 65535 (0 and 0FFFFH). d is any number between -127 and +127
(the +d can be -d; LD (IX-23) A
LD (BC),A LD B,(HL) LD H,(IX+d)
LD (DE),A LD B,(IX+d) LD H,(IY+d)
LD (HL),A LD B,(IY+d) LD H,A
LD (HL),B LD B,A LD H,B
LD (HL),C LD B,B LD H,C
LD (HL),D LD B,C LD H,D
LD (HL),E LD B,D LD H,E
LD (HL),H LD B,E LD H,H
LD (HL),L LD B,H LD H,L
LD (HL),n LD B,L LD H,n
LD (IX+d),A LD B,n LD HL,(nn)
LD (IX+d),B LD BC,(nn) LD HL,nn
LD (IX+d),C LD BC,nn LD I,A
LD (IX+d),D LD C,(HL) LD IX,(nn)
LD (IX+d),E LD C,(IX+d) LD IX,nn
LD (IX+d),H LD C,(IY+d) LD IY,(nn)
LD (IX+d),L LD C,A LD IY,nn
LD (IX+d),n LD C,B LD L,(HL)
LD (IY+d),A LD C,C LD L,(IX+d)
LD (IY+d),B LD C,D LD L,(IY+d)
LD (IY+d),C LD C,E LD L,A
LD (IY+d),D LD C,H LD L,B
LD (IY+d),E LD C,L LD L,C
LD (IY+d),H LD C,n LD L,D
LD (IY+d),L LD D,(HL) LD L,E
LD (IY+d),n LD D,(IX+d) LD L,H
LD (nn),A LD D,(IY+d) LD L,L
LD (nn),BC LD D,A LD L,n
LD (nn),DE LD D,B LD R,A
LD (nn),HL LD D,C LD SP,(nn)
LD (nn),IX LD D,D LD SP,HL
LD (nn),IY LD D,E LD SP,IX
LD (nn),SP LD D,H LD SP,IY
LD A,(BC) LD D,L LD SP,nn
LD A,(DE) LD D,n
LD A,(HL) LD DE,(nn)
LD A,(IX+d) LD DE,nn
LD A,(IY+d) LD E,(HL)
LD A,(nn) LD E,(IX+d)
LD A,A LD E,(IY+d)
LD A,B LD E,A
LD A,C LD E,B
LD A,D LD E,C
LD A,E LD E,D
LD A,H LD E,E
LD A,L LD E,H
LD A,n LD E,L
LD A,R LD E,n
LD A,I LD H,(HL)
****************************************************************
CHAPTER 2 The EX instructions
In addition to the registers we have mentioned so far the
Z80 has several additional registers. The most important of these
are the so called prime registers, which are designated A' BC'
DE' and HL'. You cannot access these registers directly, but you
can swap them with the ordinary registers. If you type in the
following code
LD BC,1234H:LD DE,5678H:LD HL,9ABCH the registers will appear
A CZPSNH BC DE HL IX IY A' CZPSNH' BC' DE' HL' SP
00 000000 1234 5678 9ABC 0000 0000 00 000000 0000 0000 0000 0000
Now type in
EXX which swaps BC DE and HL with the prime registers
A CZPSNH BC DE HL IX IY A' CZPSNH' BC' DE' HL' SP
00 000000 0000 0000 0000 0000 0000 00 000000 1234 5678 9ABC 0000
You can now work on the normal registers, eg
LD BC,1111H
When you want to swap the registers back again use EXX
The EXX statement is very useful for storing variables you are
working on without having to save them in memory. The equivalent
store to memory for these three registers would take 3 LD
statements.
Other EX commands
Several other commands exist that swap registers.
EX AF,AF'
swaps the A register and the flags with the corresponding prime
registers. It is commonly used with EXX.
EX DE,HL
swaps the DE register and the HL register.
EX (SP),HL
EX (SP),IX
EX (SP),IY
all swap the memory contents pointed to by the SP register with
the corresponding register. The equivalent code for EX
(SP),HL could be
LD HL,1234H:LD BC,5678H:LD (1000H),BC:LD SP,1000H then
LD BC,(1000H):LD (1000H),HL:LD HL,BC
Thus in the case of EX (SP),HL the L register is swapped with the
data at the memory location pointed to by the SP register, and
the H register is swapped with the memory location + 1 pointed to
by the SP register. Type MEMORY to check this.
Exchange Commands
EXX EX (SP),HL
EX AF,AF' EX (SP),IX
EX DE,HL EX (SP),IY
****************************************************************
Chapter 3 The Stack
The memory of a computer can be thought of as a library,
with each book representing a memory location. LD BC,(350) is
like finding the 350th book. The stack on the other hand is like
a pile of books. Instead of storing the BC register in memory
location 350 and then retrieving it later we can put it on top of
a pile of books, and take it off later.
The following code shows how the stack works
LD BC,1234:LD SP,504H initialises the registers
PUSH BC takes the BC register and puts it on top of the pile
of books