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.

LD BC,0  clears the BC register, and

POP BC    takes the top book and puts it back in the BC register.

If  you now view the memory you can see what has happened. The SP
register was used as a pointer as to where the top of the pile of
books  was.  Thus  after  PUSH  BC,  503H contains 12  or  the  H
register,  and 502 contains 34 or the L register. The SP was 502.
POP  BC put 502 into the L register and 503 into the H  register,
and added 2 to SP to make 504 again.

     In fact the data in 502 and 503 could have been POP ed  into
any register. Try the dollowing to confirm this

PUSH BC:POP DE

Because  memory locations are used to store data you have to  set
where  you  wnat the stack to be before using PUSH and  POP.  The
stack  was  in  this  case set at 504 but  could  have  been  any
location.  The instruction LD SP,504 should occur before any PUSH
or  POP  instructions  are used and so usually appears  near  the
beginning of a program.  Most programs would use a maximum of  20
PUSH's before POP's so you need to make sure that about 40 memory
locations below the initial value of the SP are not used. The ORG
instruction is used to reserve this memory.

The  PUSH and POP instruction both work on double register  pairs
only.  Thus  for the purposes of this instruction the A  register
and  the  flag register are grouped together as an  AF  register,
with the F register being the least significant byte. The way the
individual  flags are grouped in the F register is  discussed  in
the chapter on the flags.





The stack commands

PUSH AF                  POP AF
PUSH BC                  POP BC
PUSH DE                  POP DE
PUSH HL                  POP HL
PUSH IX                  POP IX
PUSH IY                  POP IY

******************************************************************

                      Chapter 4 Arithmetic

     Arithmetic   in  machine  code  is  a  little  different  to
arithmetic  in a higher level language such as BASIC or  FORTRAN.
Registers  can  be  added,  subtracted,  but  multiplication  and
division  require  a short program.  Other instructions exist  to
compare two numbers and increment or decrement registers.

     When two numbers are added or subtracted there needs to be a
way  of  signalling a carry or borrow if this  has  occurred.  In
addition to a carry five other features of the operation, such as
=  to zero and negative or positive are signalled.  This is  done
using  the  flags,  which are shown in the  register  display  as
CZPSNH.  The  six flags are covered briefly below and are covered
in more detail in the chapter on the flags and on number basses.

The  C or carry flag is set if the result of an add is too  great
for the register to hold the value.  In subtraction it is set  if
the answer is less than 0, necessitating a borrow.

The Z or Zero flag,  which is set to 1 if the result is zero, and
reset to 0 if the result is not zero.

The  P flag is set when the parity is odd,  and reset when it  is
even.  It  is also used by some instructions to signify overflow,
and  thus is sometimes written as the P/V flag.

The  S  or  Sign  flag,  which is set to 1 if the  result  of  an
operation is between 0 and 127, and reset to 0 if between 128 and
255.

The  H  or half carry flag,  which is used  when  converting  hex
values to BCD.  The N flag indicates whether the last instruction
was  an  add  or  subtract.  These flags  are  used  by  the  DAA
instruction.

                             Adding

The following code shows how to add two numbers.

LD A,5:ADD A,3   will produce

A  CZPSNH  BC   DE   HL   IX   IY  A' CZPSNH' BC'  DE'  HL'  SP
08 000000 0000 0000 0000 0000 0000 00 000000 0000 0000 0000 0000

if you now type ADD A,255 then the result will be

A  CZPSNH  BC   DE   HL   IX   IY  A' CZPSNH' BC'  DE'  HL'  SP
07 100001 0000 0000 0000 0000 0000 00 000000 0000 0000 0000 0000

The  carry  flag  has been set to indicate that  the  answer  was
greater than 255.

If  you  now use ADD A,248 then the answer will be 0,  and the  Z
flag will be set.

The  8  bit  instructions all add either  a  number,  or  another
register  to  the A register.  The flags are set  on  the  result
contained in the A register as follows.

C or carry flag          1 if answer >255 else 0
Z or zero flag           1 if answer = 0 else 0
P flag                   1 if overflow in twos complement else 0
S or sign flag           1 if 127<answer<256 else 0
N flag                   0
H or half carry flag     1 if carry from bit 3 to bit 4 else 0

                        16 bit arithmetic

If  you want to add numbers that are more than the 0-255 that can
be stored in the A register,  then the HL, IX or IY registers can
be used. Thus LD HL,1000H:LD BC,2000H:ADD HL,BC will give

A  CZPSNH  BC   DE   HL   IX   IY  A' CZPSNH' BC'  DE'  HL'  SP
00 000000 2000 0000 3000 0000 0000 00 000000 0000 0000 0000 0000

The flags are set as follows.

C or carry flag          1 if answer >65535 else 0
Z or zero flag           not changed
P flag                   not changed
S or sign flag           not changed
N flag                   0
H or half carry flag     1 if carry from bit 11 to bit 12 else 0


                8 bit and 16 bit ADD instructions

ADD A,A      ADD A,(HL)        ADD HL,BC      ADD IY,BC
ADD A,B      ADD A,(IX+d)      ADD HL,DE      ADD IY,DE
ADD A,C      ADD A,(IY+d)      ADD HL,HL      ADD IY,IY
ADD A,D                        ADD HL,SP      ADD IY,SP
ADD A,E                        ADD IX,BC
ADD A,H                        ADD IX,DE
ADD A,L                        ADD IX,IX
ADD A,n                        ADD IX,SP


                         Add with carry

                           8 bit group

This set of instructions are essentially the same as the ADD set,
but add the carry flag as well. The instruction is ADC instead of
ADD.  Thus  LD A 4:ADC A 3 would give an answer of 7 if the carry
flag was 0, but an answer of 8 if the carry flag was 1 before the
instruction.

The  ADC instruction allows multiple precision adding.  The least
most significant bytes are added,  and the carry is propogated to
the next most significant bytes by using ADC.

For the 8 bit ADC's using th A register the flags are affected

C or carry flag          1 if answer >255 else 0
Z or zero flag           1 if result = 0 else 0
P flag                   1 if TC <-128 or >127 else 0
S or sign flag           1 if 127 < n < 256 else 0
N flag                   0
H or half carry flag     1 if carry from bit 3 to bit 4 else 0

                     8 bit ADC instructions

ADC A,A        ADC A,B        ADC A,C        ADC A,D
ADC A,E        ADC A,H        ADC A,L        ADC A,n
ADC A,(HL)     ADC A,(IX+d)   ADC A,(IY+d)

                        16 bit ADC group

The 16 bit ADC instructions use the HL register instead of the  A
register. The flags are affected as follows

C or carry flag          1 if answer >65536 else 0
Z or zero flag           1 if result = 0 else 0
P flag                   1 if TC <-32768 or >32767 else 0
S or sign flag           1 if 32767 < n < 65536 else 0
N flag                   0
H or half carry flag     1 if carry from bit 11 else 0

                        16 bit ADC group

ADC HL,BC      ADC HL,DE      ADC HL,HL      ADC HL,SP


                           Subtracting

                          The SUB group

There are two subtraction instructions, SUB which is the opposite
of ADD, and SBC which is subtract with borrow. Thus

LD A,6:SUB 2  gives A = 4.

SUB  is  used for 8 bit subtractions.  The number or register  is
subtracted  from  the A register and the result stored in  the  A
register.  One of the idiosyncracities of the Z80 instrcution set
is that the A register is not written as it is with ADD,  viz ADD
A C but SUB C.  In addition although there are 16 bit ADD's there
are  no 16 bit SUB's. (16 bit subtraction is done using  the  SBC
instruction.) The flags are set as follows

C or carry flag          1 if answer <0 else 0
Z or zero flag           1 if answer = 0 else 0
P flag                   1 if overflow in twos complement else 0
S or sign flag           1 if 127<answer<256 else 0
N flag                   1
H or half carry flag     1 if borrow from bit 4 else 0

                       SUB instruction set

SUB A      SUB B      SUB C      SUB D        SUB E        SUB H
SUB L      SUB n      SUB (HL)   SUB (IX+d)   SUB (IY+d)


                       Subtract with borrow

                           8 bit group

The  SBC instruction group is the opposite to the ADC group.  The
register or number is subvtracted from the A register, along with
the C flag, and the result stored in the A register. Thus

LD A,7:SBC A,3 gives A=4 if the carry flag was 0 and A=3 if  it
was 1 before the SBC.

The flags are affected as follows

C or carry flag          1 if <0 else 0
Z or zero flag           1 if result = 0 else 0
P flag                   1 if TC >127 or <-128 else 0
S or sign flag           1 if 127 < n <256 else 0
N flag                   1
H or half carry flag     1 if borrow from bit 12 else 0


SBC A,A        SBC A,B        SBC A,C        SBC A,D
SBC A,E        SBC A,H        SBC A,L        SBC A,n
SBC A,(HL)     SBC A,(IX+d)   SBC A,(IY+d)

                  16 bit subtracts with borrow

These  instructions subtract the designated register from the  HL
register pair and store the answer in the HL register  pair.  The
flags are affected as follows

C or carry flag          1 if answer < 0 else 0
Z or zero flag           1 if result = 0 else 0
P flag                   1 if TC >32767 or <-32768 else 0
S or sign flag           1 if 32767 < n < 65536 else 0
N flag                   1
H or half carry flag     1 if borrow from bit 12 else 0

                        16 bit SBC group

SBC HL,BC      SBC HL,DE      SBC HL,HL      SBC HL,SP


                            Compares

The  compare  instruction  can  be thought of as  an  8  bit  SUB
instruction  in  the way the flags are changed,  except that  the
contents of the A register remain unchanged. Thus

LD A,9:CP 9  gives

A  CZPSNH  BC   DE   HL   IX   IY  A' CZPSNH' BC'  DE'  HL'  SP
09 010010 0000 0000 0000 0000 0000 00 000000 0000 0000 0000 0000

where  for  example the zero flag has been set because 9  - 9  is
zero,  but the A register still contains the original 9.  The set
is

CP A      CP B      CP C      CP D        CP E        CP H
CP L      CP n      CP (HL)   CP (IX+d)   CP (IY+d)

                            Increment

Increments are the same as adding a 1.  Thus INC B is the same as
LD A,B:ADD A,1:LD B,A.  The results of all increments to  single
registers  affect  the  flags  as if an ADD  had  been  perfomed.
However for double register groups,  such as INC BC the registers
are  unaffected.  The first two columns are the 8 bit  increments
that  do  affect the flags,  and the last column is  the  16  bit
increments that leave the flags unchanged.


INC A      INC (HL)            INC BC
INC B      INC (IX+d)          INC DE
INC C      INC (IY+d)          INC HL
INC D                          INC IX
INC E                          INC IY
INC H                          INC SP
INC L

                            Decrement

These  are the opposite to the increment group,  the  subtract  1
from  the  register  in  question.   As  before  single  register
decrements  affect  the  flags as a subtract  would,  but  double
register decrements leave the flags as they are.


DEC A      DEC (HL)            DEC BC
DEC B      DEC (IX+d)          DEC DE
DEC C      DEC (IY+d)          DEC HL
DEC D                          DEC IX
DEC E                          DEC IY
DEC H                          DEC SP
DEC L

****************************************************************

                Chapter 5 Jumps Calls and Returns

     There  are  five instructions in this group.  JP and JR  are
like GOTO in basic,  and jump to the corresponding line.  CALL is
like  GOSUB,  and  calls  a  subroutine.  RET  returns  from  the
subroutine.

Jumps

The simplest type of jump is demonstrated by the following  short
program.

Line1:  LD A,5:JP Line 3
Line2:  end
line3:  LD B,6:END

Line2 is never encountered because the program jumps to Line3.

The next type of jump only occurs if the flag condition specified
by the jump is true.

Line1:  LD A,0:LD B,5
Line2:  ADD A,1:DEC B:JP NZ Line2
        END

Line1  loads B with 5.  The program now loops through line2
until  B is equal to 0.  This is because JP NZ only jumps if  the
result  of the last operation to affect the Z flag was not  zero.
Since  the zero flag is set to 0 by DEC B if B is not equal to  0
the program loops until B=0.

The following are the conditions that can be used with JP.

NZ        Jump if zero flag = 0. (last Z flag instr <>0)
Z         Jump if zero flag = 1. (last Z flag instr = 0)
NC        Jump if carry flag = 0. (last C instr = no carry)
C         Jump if carry flag = 1. (last C instr = carry)
PO        Jump if parity odd, parity flag = 0.
PE        Jump if parity even, parity flag = 1.
P         Jump if sign positive, sign flag = 0.
M         Jump if sign negative (minus), sign flag = 1.

Relative jumps

     In  the interpreter the JR instruction is the same as the JP
instruction. However there is a difference between the two in the
compiled  program.  The JR instruction,  instead of  storing  the
value  of  the  location  to  be  jumped  to,  instead  stores  a
displacement value,  which may be anything between +127 and -127.
A  displacement  value of say -3 says jump to the  instruction  3
bytes before this one.

     The  reasoning behind this is that relative jumps take  only
two  bytes  of memory wheras ordinary jumps take  three.  However
this memory saving is offset by the fact that ordinary jumps  are
quicker than relative jumps.  In addition conditional jumps PO PE
P and M are not allowed with JR.

     All this means that in practical terms it is probably better
to  ignore the JR instruction and to only use the JP  instuction.

DJNZ

The  third  type of jump is the DJNZ instruction.  The  following
program shows how it works.

Line1:  LD A,0:LD B,5
Line2:  ADD A,1:DJNZ Line2
        END

Line1 sets A to 0 and B to 5.  Line2 adds one to A.  The DJNZ
subtracts  one  from register B,  and if the result is  not  zero
jumps  to the location shown.  Thus the program loops through  20
until B is 0, and then ends.

                  Summary of Jump instructions

JP nn        JP Z,nn          JP PE,nn      JR NZ,nn
JP (HL)      JP NC,nn         JP P,nn       JR Z,nn
JP (IX)      JP C,nn          JP M,nn       JR NC,nn
JP (IY)      JP PO,nn         JR nn         JR C,nn
JP NZ,nn                                    DJNZ nn


Calls

Subroutines are called by a CALL and terminated by a RET.

Start:  LD A,5:CALL Subroutine
        END

Subroutine:LD B,4:ADD A,B:RET

The return location is stored in the stack.

CALL's  like  jumps can be conditional,  and the same  rules
apply. RET's can also be conditional.

     In addition there are two additional returns, RETI and RETN,
which   return   from  interupts  and  non  maskable   interrupts
respectively.   Since  interrupts  are  not  implemented  on  the
interpreter  these  two  instructions do  nothing.  They  can  be
included if they will be used in the final compiled program.

                             Summary

CALL nn                RET nn
CALL NZ,nn             RET NZ,nn
CALL Z,nn              RET Z,nn
CALL NC,nn             RET NC,nn
CALL C,nn              RET C,nn
CALL PO,nn             RET PO,nn
CALL PE,nn             RET PE,nn
CALL P,nn              RET P,nn
CALL M,nn              RET M,nn
                       RETI
                       RETN

**************************************************************

                       Chapter 6  AND OR and XOR

These  instructions all work on the A register and peform bit  by
bit comparisons with the appropriate register. For example

LD A,1010000B:LD B,0000001B:OR B gives

A  CZPSNH  BC   DE   HL   IX   IY  A' CZPSNH' BC'  DE'  HL'  SP
A1 000100 0100 0000 0000 0000 0000 00 000000 0000 0000 0000 0000


AND  OR and XOR perform bit by bit comparisons of the  designated
register and the A register according to the following rules.

         A register bit     other register bit     A bit set to

AND            0                    0                   0
               0                    1                   0
               1                    0                   0
               1                    1                   1

OR             0                    0                   0
               0                    1                   1
               1                    0                   1
               1                    1                   1

XOR            0                    0                   0
               0                    1                   1
               1                    0                   1
               1                    1                   0

The  flags  are also set by the result in  the  A  register,  the
details of which are in Ch 17.  Note that the AND command affects
the  H flag differently to the other two,  however all the  other
flags are affected the same way.

                        Instruction  set

(n  is  any  number or label that can be resolved into an  8  bit
number)

AND A         OR A         XOR A
AND B         OR B         XOR B
AND C         OR C         XOR C
AND D         OR D         XOR D
AND E         OR E         XOR E
AND H         OR H         XOR H
AND L         OR L         XOR L
AND n         OR n         XOR n

******************************************************************

                  Chapter 7 Bit set, reset and test

     The  instructions  in this group allow a specific bit  in  a
register or memory location to be set to 1,  reset to 0 or tested
to see if it is 1 or 0.

                               SET

LD C,0:SET 3,C

sets byte 3 of register 3 to 1.  The result is register C = 8  in
hexadecimal.

The following table shows how the bits are numbered in a byte.

                            01010101
                            76543210

Bit  7  on the left is the most significant bit and bit 0 on  the
right is the least significant.  For 16 bit numbers bit 15 is  on
the left and bit 0 is on the right.

The registers that can be set, reset or tested are

A   B  C  D  E  H  L  and the memory location pointed to by  (HL)
(IX+d) or (IY+d).

                               RES

The  RES instruction is the opposite of the SET  instruction,  it
changes the appropriate bit to 0. Thus

LD H,11111111B:RES 5,H

results in a value of 0DFH

Flags are not affected by either the SET or RES instructions.

                               BIT

The  BIT instruction is used to test whether a specific bit is  a
zero or a one.

LD D,10101010B:BIT 5,D  results in

A  CZPSNH  BC   DE   HL   IX   IY  A' CZPSNH' BC'  DE'  HL'  SP
00 000001 0000 0000 0000 0000 0000 00 000000 0000 0000 0000 0000

The  flags,  which  indicate the result of the test,  are set  as
follows.

C or carry flag          not affected
Z or zero flag           1 if bit is zero else 0
P or parity/overflow     may be anything
S or sign flag           may be anything
N or subtract flag       0
H or half carry flag     1

                     Summary of instructions

SET 0,A      SET 4,A      RES 0,A      RES 4,A      BIT 0,A      BIT 4,A
SET 0,B      SET 4,B      RES 0,B      RES 4,B      BIT 0,B      BIT 4,B
SET 0,C      SET 4,C      RES 0,C      RES 4,C      BIT 0,C      BIT 4,C
SET 0,D      SET 4,D      RES 0,D      RES 4,D      BIT 0,D      BIT 4,D
SET 0,E      SET 4,E      RES 0,E      RES 4,E      BIT 0,E      BIT 4,E
SET 0,H      SET 4,H      RES 0,H      RES 4,H      BIT 0,H      BIT 4,H
SET 0,L      SET 4,L      RES 0,L      RES 4,L      BIT 0,L      BIT 4,L
SET 0,(HL)   SET 4,(HL)   RES 0,(HL)   RES 4,(HL)   BIT 0,(HL)   BIT 4,(HL)
SET 0,(IX+d) SET 4,(IX+d) RES 0,(IX+d) RES 4,(IX+d) BIT 0,(IX+d) BIT 4,(IX+d)
SET 0,(IY+d) SET 4,(IY+d) RES 0,(IY+d) RES 4,(IY+d) BIT 0,(IY+d) BIT 4,(IY+d)
SET 1,A      SET 5,A      RES 1,A      RES 5,A      BIT 1,A      BIT 5,A
SET 1,B      SET 5,B      RES 1,B      RES 5,B      BIT 1,B      BIT 5,B
SET 1,C      SET 5,C      RES 1,C      RES 5,C      BIT 1,C      BIT 5,C
SET 1,D      SET 5,D      RES 1,D      RES 5,D      BIT 1,D      BIT 5,D
SET 1,E      SET 5,E      RES 1,E      RES 5,E      BIT 1,E      BIT 5,E
SET 1,H      SET 5,H      RES 1,H      RES 5,H      BIT 1,H      BIT 5,H
SET 1,L      SET 5,L      RES 1,L      RES 5,L      BIT 1,L      BIT 5,L
SET 1,(HL)   SET 5,(HL)   RES 1,(HL)   RES 5,(HL)   BIT 1,(HL)   BIT 5,(HL)
SET 1,(IX+d) SET 5,(IX+d) RES 1,(IX+d) RES 5,(IX+d) BIT 1,(IX+d) BIT 5,(IX+d)
SET 1,(IY+d) SET 5,(IY+d) RES 1,(IY+d) RES 5,(IY+d) BIT 1,(IY+d) BIT 5,(IY+d)
SET 2,A      SET 6,A      RES 2,A      RES 6,A      BIT 2,A      BIT 6,A
SET 2,B      SET 6,B      RES 2,B      RES 6,B      BIT 2,B      BIT 6,B
SET 2,C      SET 6,C      RES 2,C      RES 6,C      BIT 2,C      BIT 6,C
SET 2,D      SET 6,D      RES 2,D      RES 6,D      BIT 2,D      BIT 6,D
SET 2,E      SET 6,E      RES 2,E      RES 6,E      BIT 2,E      BIT 6,E
SET 2,H      SET 6,H      RES 2,H      RES 6,H      BIT 2,H      BIT 6,H
SET 2,L      SET 6,L      RES 2,L      RES 6,L      BIT 2,L      BIT 6,L
SET 2,(HL)   SET 6,(HL)   RES 2,(HL)   RES 6,(HL)   BIT 2,(HL)   BIT 6,(HL)
SET 2,(IX+d) SET 6,(IX+d) RES 2,(IX+d) RES 6,(IX+d) BIT 2,(IX+d) BIT 6,(IX+d)
SET 2,(IY+d) SET 6,(IY+d) RES 2,(IY+d) RES 6,(IY+d) BIT 2,(IY+d) BIT 6,(IY+d)
SET 3,A      SET 7,A      RES 3,A      RES 7,A      BIT 3,A      BIT 7,A
SET 3,B      SET 7,B      RES 3,B      RES 7,B      BIT 3,B      BIT 7,B
SET 3,C      SET 7,C      RES 3,C      RES 7,C      BIT 3,C      BIT 7,C
SET 3,D      SET 7,D      RES 3,D      RES 7,D      BIT 3,D      BIT 7,D
SET 3,E      SET 7,E      RES 3,E      RES 7,E      BIT 3,E      BIT 7,E
SET 3,H      SET 7,H      RES 3,H      RES 7,H      BIT 3,H      BIT 7,H
SET 3,L      SET 7,L      RES 3,L      RES 7,L      BIT 3,L      BIT 7,L
SET 3,(HL)   SET 7,(HL)   RES 3,(HL)   RES 7,(HL)   BIT 3,(HL)   BIT 7,(HL)
SET 3,(IX+d) SET 7,(IX+d) RES 3,(IX+d) RES 7,(IX+d) BIT 3,(IX+d) BIT 7,(IX+d)
SET 3,(IY+d) SET 7,(IY+d) RES 3,(IY+d) RES 7,(IY+d) BIT 3,(IY+d) BIT 7,(IY+d)

****************************************************************

                 Chapter 8 Rotate and shift group


The  instructions in this chapter are concerned with shifting  or
rotating the bits in a particular register. For example

10001000     shifted right becomes 01000100


                          Rotate group

There  are  four instructions that rotate the contents of  the  A
register only.

                              RLCA

RLCA rotates the A register to the left one place. The 7th bit is
put back into the 0 position.  The 7th bit also goes to the carry
flag.

LD A,10011000B:RLCA  gives

A  CZPSNH  BC   DE   HL   IX   IY  A' CZPSNH' BC'  DE'  HL'  SP
31 100000 0000 0000 0000 0000 0000 00 000000 0000 0000 0000 0000

Use View Registers to see the value of A in binary= 00110001B

The flags are affected as follows

C or carry flag          previous bit 7 value
Z or zero flag           not affected
P or parity/overflow     not affected
S or sign flag           not affected
N or subtract flag       0
H or half carry flag     0

The RLCA instruction can be represented symbolically as


C  <---   bbbbbbbb <-
       |             |
        -------------


                               RLA

The RLA instruction rotates left through the carry flag.

 --- C <---  bbbbbbbb  <--
|                         |
------------- > ----------

The  bits in the register are all rotated left,  the 7th bit goes
to the carry flag and the carry flag goes to bit 0.

LD A,1 then

RLA 9 times, looking at the value of A each time will clarify the
operation of this instruction.

Apart from the carry flag, the other flags are set as for RLCA.

                              RRCA

This  rotates  the  register  right in a  similar  way  to  RLCA.
Symbolically

 ---> bbbbbbbb ---> C
|              |
 ------ < -----

The  register is shifted right by one,  and the 0 bit goes to the
carry flag and to the 7th bit.  Flags apart from the carry are as
for RLCA.

                               RRA

The RRA rotates right through the  carry flag

 ---> bbbbbbbb ---> C --
|                       |
 ----------- < ---------

The register is shifted right by one, the 0 bit goes to the carry
flag,  and  the carry flag goes to bit 7.  Flags apart  from  the
carry flag are as for RLCA.


                 Rotates through other registers

The next set of instructions are similar to the above, but act on
any one of A B C D E H L (HL) (IX+d) or (IY+d).  They also affect
the flags differenty.

                               RLC x

The RLC instruction rotates the register left by one.  It can  be
represented symbolically as

C  <---   bbbbbbbb <-
       |             |
        -------------

To demonstrate this instruction type

LD D,1 and then

RLC D   until the 1 has gone all the way round.

The flags are affected as follows

C or carry flag          previous bit 7 value
Z or zero flag           1 if result is zero, else 0
P or parity/overflow     1 if parity even, else 0
S or sign flag           1 if 127<result<256, else 0
N or subtract flag       0
H or half carry flag     0



                               RL x

The RL instruction rotates the register through the carry flag.

                    --- C <---  bbbbbbbb  <--
                   |                         |
                   ------------- > ----------

The  register  is rotated left by one,  the 7th bit goes  to  the
carry  flag,  and the carry flag goes to the 0 bit.  Flags  apart
from  the  carry  flag  are as for RLC.  RL  works  on  the  same
registers as RLC.

                               RRC x

The RRC instruction rotates the register right.

                         ---> bbbbbbbb ---> C
                        |              |
                         ------ < -----

The register is rotated right by one, the 0 bit goes to bothe the
carry  flag and the 7th bit.  Flags apart from the carry flag are
as for RLC. RRC works on the same registers as RLC.

                              RR x

The  RR instruction rotates the register right through the  carry
flag.
                   ---> bbbbbbbb ---> C --
                  |                       |
                   ----------- < ---------

The register is rotated right by one, the 0 bit goes to the carry
flag and the carry flag goes to the 7th bit.


                    The four bit rotate group

There  are two instructions in this group that rotate  groups  of
bits  through the A register and a memory location pointed to  by
the (HL) register.

                               RLD

The  RLD  instruction takes groups of four bits and rotates  them
as shown symbolically.

 ----->-----                        -------->----------
12 ---<--- 34           or     1    2 -----<---- 3 <-- 4
           ^|
            -
A         (HL)                   A                 (HL)

     The register on the left is the A register and the  register
on  the right is a memory location pointed to by the HL register.
The 4 least significant bits of the A register are moved to the 4
least  significant  bits  of  the  (HL)  location.  The  4  least
significant  bits  of the (HL) location are moved to the  4  most
significant  bits of the (HL) location.  The 4  most  significant
bits  of  the (HL) location are moved to the 4 least  significant
bits  of  the A register.  The 4 most significant bits of  the  A
register remain unchanged.

LD  A,12H:LD HL,1000H:LD (HL),34H sets up the registers as  shown
above.

RLD  results in

A  CZPSNH  BC   DE   HL   IX   IY  A' CZPSNH' BC'  DE'  HL'  SP
13 000000 0000 0000 0000 0000 0000 00 000000 0000 0000 0000 0000

with View Memory giving address 1000H = to 42H.

     The flags are set as follows

C or carry flag          not affected
Z or zero flag           1 if result is zero, else 0
P or parity/overflow     1 if parity even, else 0
S or sign flag           1 if 127<result<256, else 0
N or subtract flag       0
H or half carry flag     0


                               RRD

The RRD instruction can be represented as follows.

                        ---------<--------------
                 1      2 ------->----- 3 -->-- 4
                    A                      (HL)

The  instruction does the reverse of RLD.  The flags are  as  for
RLD.



                         The Shift group


There are three instructions in this group,  that can work on the
following registers; A B C D E H L (HL) (IX+d) or (IY+d).


                              SLA x

This   instruction   shifts   the   designated   register   left.
Symbolically

                     C <--- bbbbbbbb <--- 0

The  register is shifted left one place.  The 7th bit goes to the
carry flag. The 0 bit has a 0 shifted in.

LD E,1 and then SLA E,9 times will demonstrate this instruction.

Flags are set as follows

C or carry flag          from bit 7
Z or zero flag           1 if result is zero, else 0
P or parity/overflow     1 if parity even, else 0
S or sign flag           1 if 127<result<256, else 0
N or subtract flag       0
H or half carry flag     0


                              SRA x

This  instruction shifts the designated register right one place.
Symbolically

                  --> bbbbbbbb ----> C
                  -<--

The bits are all shifted right one.  The 0 bit goes to the  carry
flag.  The  7th bit however stays the same,  although the 6th bit
equals the old 7th bit.  The flags apart from the carry flag  are
as for SLA.

LD C 10000000B and then SRA C   9 times will demonstrate this.


                              SRL x

This instruction shifts all the bits right. Symbolically

                0 ---> bbbbbbbb --->C

The  bits are all shifted right one.  The 0 bit goes to the carry
flag. The 7th bit is replaced with a 0. Flags are as for SLA.


                Summary of rotate and shift group

RLCA        RL A        RR A         SRA A
RLA         RL B        RR B         SRA B
RRCA        RL C        RR C         SRA C
RRA         RL D        RR D         SRA D
RLD         RL E        RR E         SRA E
RRD         RL H        RR H         SRA H
RLC A       RL L        RR L         SRA L
RLC B       RL (HL)     RR (HL)      SRA (HL)
RLC C       RL (IX+d)   RR (IX+d)    SRA (IX+d)
RLC D       RL (IY+d)   RR (IY+d)    SRA (IY+d)
RLC E       RRC A       SLA A        SRL A
RLC H       RRC B       SLA B        SRL B
RLC L       RRC C       SLA C        SRL C
RLC (HL)    RRC D       SLA D        SRL D
RLC (IX+d)  RRC E       SLA E        SRL E
RLC (IY+d)  RRC H       SLA H        SRL H
            RRC L       SLA L        SRL L
            RRC (HL)    SLA (HL)     SRL (HL)
            RRC (IX+d)  SLA (IX+d)   SRL (IX+d)
            RRC (IY+d)  SLA (IY+d)   SRL (IY+d)

************************************************************

                           Chapter 9

        General purpose arithmetic and CPU control group

                               NOP

This is the simplest Z80 instruction, and simply does nothing.

        NOP:NOP:NOP:END

NOP's are useful for creating delays.

                              HALT

This  instruction halts the CPU.  In the interpreter this returns
control to programmer,  and is equivalent to STOP in BASIC.
In the microprosessor this stops  program
execution until an interrupt is recieved.  The Z80 performs NOP's
to ensure proper memory refresh.


                               DI

DI disables the interrupts. Since interrupts are not supported by
the interpreter the interpreter ignores this instruction. To find
out  more  about how the various types of interrupts work on  the
Z80 consult one of the Z80 texts.

        LD A,4:DI:LD B,3:EI:END

                               EI

EI enables the interrupts. See DI

                              IM n

This  instruction  sets  the interrupt mode.  As with  EI  it  is
ignored by the interpreter. n can be one of 0 1 or 2. Thus

        IM 2:LD A,5:IM 0:END

                               SCF

SCF sets the carry flag to 1.

        LD A 5:SCF:END  gives

A  CZPSNH  BC   DE   HL   IX   IY  A' CZPSNH' BC'  DE'  HL'  SP
05 100000 0000 0000 0000 0000 0000 00 000000 0000 0000 0000 0000

The Z,  P and S flags are unaffected. The N and H flags are reset
to 0.

To set the carry flag to 0 use SCF then CCF.


                               CCF

CCF complements the carry flag. If the flag was 1 it is now 0 and
vice  versa.  The Z P and S flags are unaffected.  The N flag  is
reset to 0. The H flag may be anything.

                               NEG

NEG  negates  the  A register.  The  mathematical  equivalent  is
A = 0-A. Thus

LD A,5:NEG gives

A  CZPSNH  BC   DE   HL   IX   IY  A' CZPSNH' BC'  DE'  HL'  SP
FB 000111 0000 0000 0000 0000 0000 00 000000 0000 0000 0000 0000

Flags are set as follows

C or carry flag          1 if A=0 before operation, else 0
Z or zero flag           1 if result is zero, else 0
P or parity/overflow     1 if A=128 before operation, else 0
S or sign flag           1 if 127<result<256, else 0
N or subtract flag       1 if borrow from bit 4 else 0
H or half carry flag     1


                               CPL

CPL  complements the A register.  All 0's become 1's and all  1's
0's. The C, Z P and S flags are all unaffected. The N and H flags
are both set to 1.


                               DAA

DAA  decimally adjusts the accumulator.  This instruction  allows
decimal numbers to be added. For example let us add 11H and 22H

LD A,11H:ADD A,22H which gives A = 33H

However if we add 22H and 39H

LD A,22H:ADD A,39H we get A = 5BH

The  B is illegal in decimal,  or BCD,  and is corrected by using
DAA. Thus

LD A 22H:ADD A 39H:DAA gives A = 61H, which is correct.

Other examples

LD A,91H:ADD A,92H unadjusted gives 23H,  adjusted with DAA gives
83H and carry = 1 (use to get 183)

LD A,99H:ADD A,99H unadjusted gives 32H,  adjusted with DAA gives
98H and carry = 1.

DAA also can be used after subtraction

LD A,99H:SUB A,11H unadjusted gives 88H,  adjusted with DAA gives
88H.

LD A,91H:SUB A,19H unadjusted gives 78H,  adjusted with DAA gives
72H.

LD A,19H:SUB A,91H unadjusted gives 88H,  adjusted with DAA gives
28H and carry = 1. (carry is used as borrow in subtracts)

LD A,11H:SUB A,99H unadjusted gives 78H,  adjusted with DAA gives
12 and carry = 1.

The  way DAA works is to selectively add numbers according to the
value  in  A,  and to the C H and N flags.  In fact this  is  the
purpose  of the H and N flags as no other instruction uses  them.
The value added is given by the following table,  although it  is
not necessary to understand or even to have the table to use DAA.
DAA  should  always  be  used immediately after the  ADD  or  SUB
instruction  to avoid flags being changed.  DAA can also be  used
with ADC INC SBC DEC NEG etc.

N   C   Value of     H  Value of     Hex no   C flag after
        high nibble     low nibble   added    execution

0   0      0-9       0     0-9       00       0
0   0      0-8       0     A-F       06       0
0   0      0-9       1     0-3       06       0
0   0      A-F       0     0-9       60       1
0   0      9-F       0     A-F       66       1
0   0      A-F       1     0-3       66       1
0   1      0-2       0     0-9       60       1
0   1      0-2       0     A-F       66       1
0   1      0-3       1     0-3       66       1
1   0      0-9       0     0-9       00       0
1   0      0-8       1     6-F       FA       0
1   1      7-F       0     0-9       A0       1
1   1      6-F       1     6-F       9A       1


Flags are affected by DAA as follows

C or carry flag          as per table
Z or zero flag           1 if A=0 else 0
P or parity/overflow     1 if parity even else 0
S or sign flag           1 if msb A = 1 else 0
N or subtract flag       unaffected
H or half carry flag     may be anything
                           Chapter 11

                 Block transfer and search group

Four  instructions exist in the Z80 instruction set that are used
to  transfer blocks of data from one memory location to  another.
Another  set of four instructions allow searches through a set or
memory locations for a specific byte.

             Block transfer group; LDI LDD LDIR LDDR

LDI

LDI  moves a block of data. HL is the memory location to move
from, DE is the memory location to move to and BC is the
number of bytes to move.

memory contents (DE) = memory contents (HL)
DE = DE + 1
HL = HL + 1
BC = BC - 1

At the end of each loop the P flag indicates if BC is 0 (P=1
if <>0 and 0 if = to 0)

C, Z and S flags are not affected
H and N flags are reset to 0
P flag =1 if after LDI BC is not equal to 0, else P = 0


LDD

LDD  is the same as LDI except that the DE and HL  registers  are
decremented. Thus

(DE) = (HL)
DE = DE - 1
HL = HL - 1
BC = BC - 1

The  flags are the same as for LDI.  Thus the program above would
be rewritten

LDIR

This is the automatic version of LDI.  Set the HL, DE and BC
registers and then run LDIR. If BC is a high value the
instruction can take a while to execute.

LDIR does the following

(DE) = (HL)
DE = DE + 1
HL = HL + 1
BC = BC - 1 and repeats until BC = 0

Flags are a little different;

C, Z and S unchanged
H, N and P = 0

LDDR

This instruction is the automatic version of LDD. The summary is

(DE) = (HL)
DE = DE - 1
HL = HL - 1
BC = BC - 1 and repeat until BC = 0

Flags are as for LDIR.

The  question  may  be asked;  why use LDI  when  LDIR  does  the
operation automatically.  The reason is that the registers can be
changed when using LDI. For instance you can transfer every
alternate bytethis program transfers every
alternate byte between instructions by inserting say a INC
HL.

                            oooOOOooo

                       Block search group

The next four instructions are concerned with searching for bytes
in a block of data.

CPI

CPI searches starting at the memory location pointed to by the HL
register,  and  searches  for  BC number of bytes  for  the  byte
in register A.

A - (HL) and set flags on the result of this compare,  equivalent
         to CP (HL)
HL = HL + 1
BC = BC - 1

The flags are set as follows

C = no change
Z = 1 if A - (HL) = 0 else 0
P = 1 if BC <> 0 after instruction else 0
S = 1 if sign A - (HL) negative in two's comp, else 0
H = 1 if a half carry from A - (HL)
N = 1

CPD

CPD  is  the  same  as  CPI  except  that  the  HL  register   is
decremented;  HL = HL - 1. The flags are as for CPI.

CPIR

This  is  the automatic version of CPI.  The instruction  repeats
until either A = (HL) or BC = 0.  The flags are as for CPI.


CPDR

This is the automatic version of CPD.

Flags are as for CPI.

***************************************************************

               Chapter 11 Input and output

The  Z80  has several comands that input and output data  to  the
ports.  However  many of these are not very useful,  and only one
input and one output instruction are used in most Z80  computers.
These are the IN A (n) and OUT (n) A instructions, where n is the
port number between 0 and 255.
Inputs and outputs do nothing on the ZINT interpreter, as
these depend on the actual hardware used.


OTDR                            INDR
OTIR                            INIR
OUTD                            IND
OUTI                            INI
OUT (C),A                       IN A,(C)
OUT (C),B                       IN B,(C)
OUT (C),C                       IN C,(C)
OUT (C),D                       IN D,(C)
OUT (C),E                       IN E,(C)
OUT (C),H                       IN H,(C)
OUT (C),L                       IN L,(C)
OUT (n),A                       IN A,(n)

***************************************************************


                 Chapter 12  Addtional commands

Apart  from  the  instructions  that  generate  code,  there  are
additional  commands  which  are  needed  to  test  and  run  the
programs. These shall be looked at in alphabetical order.

                        The semicolon  ;

The semicolon is used to indicate a remark. These are ignored by
the program.

        LD A,5:; This loads the A register with 5:LD B,3:END

Instructions can be added after the remark, as is the LD B,3.


                               END

END  is used to indicate the end of a program.  It should  always
be  the last statement in a program,  otherwise an error  message
will appear.

                               EQU

EQU is used to set labels to particular values.

VARIABLE1 EQU 46H

Later  in the program,  instead of writing say LD A,46H,  we  can
write LD A,VARIABLE1.  This enables the way the program works to
be made a lot clearer.

The  label  used,  in this case VARIABLE1 can be any sequence  of
letters or numbers,  but should be 3 or more letters  long.  Thus
EQU X 5 is not allowed.  The number can be decimal, hex or binary
number.

To  see  what  the  current values of the labels  are  the
View Label command is used.

Labels  should be assigned values before they are encountered  in
the  program.  The value of a label cannot be changed once it has
been assigned.

                               ORG

ORG is used to set the origin of the program when it is compiled.
When  the program is finally dumped into a Z80 computer's memory,
some way of indicating where the program will start is needed. In
the  Z80  it  is customary to start the  program  not  in  memory
location 0 but at memory location 100H.  The first instruction in
the  program  is  a jump to location 100H.  This is  because  the
interrupts jump to locations between 5H and 100H. Thus a standard
way to start a program is

        ORG 0:JP 100H:ORG 100H
        LD A,5 etc...

the  interrupts  themselves  are usually  jumps  also.  Thus  the
interrupt at location 66H could be set by

        ORG 66H:JP Interrupt
Interrupt:LD A,5 etc program to service interrupt.

ORG  is  probably best ignored until you are  familiar  with  the
other  instructions,  as  it  is not necessary  to  write  simple
programs.

***************************************************************

                  Chapter 13 Number Bases

     This chapter explains the number bases that are used by  the
interpreter.  The appendix contains all the conversions from 0 to
255.  For  numbers larger than this the BASE command can be used.
The  bases  to  be cavered  are  binary,  hexadecimal  and  two's
complement.

                             Binary

     Binary  is  the system of counting used by computers  as  it
only has two digits,  0 and 1. A number in binary is written with
a B on the end to differentiate it from the other bases; 1011B

                           Hexadecimal

     Hexadecimal or Hex numbers use a base of 16,  rather than 10
used in the decimal system. The digits used are 0 1 2 3 4 5 6 7 8
9 A B C D E F
     Hex  numbers have a H on the end.  In addition all H numbers
should  start with a number from 0 to 9 to distinguish them  from
text. A 0 is usually added to the beginning for this reason. Some
examples of hex numbers are
0D3H    0FFH   012H  0ABCDH  28E6H  0H


                        Two's complement

     Two's complement is a number system that ranges from -128 to
+127.  The  result of the sum in two's complement is used to  set
one of the registers in the Z80;  the overflow register.  Numbers
from 0 to 127 in decimal are the same in twos complement. However
from 128 to 255 all two's complement numbers are negative.
     TC  numbers  are  calculated by  subtracting  256  from  the
dicimal  number  if  the decimal number is between  128  and  255
inclusive.  Thus 255 is -1 in TC, 128 is -128 and 45 is 45. There
is no special ending to distinguish TC numbers, the - sign is all
that is needed.

                           Other bases

Other bases such as octal are not used by the interpreter.  ASCII
symbols  may  be used providing they are in the range 32 to  127.
They are written in quotes,  thus LD A "s" results in A being  73
hex or 115 decimal, which is the ascii value for small s.

*****************************************************************

                     Chapter 14 The flags

This  chapter  discusses  the 6 flags used by the  Z80,  and  the
conditions  which affect them.  The flags are represented in  the
register display by the symbols CZPSNH.

                       The Z or zero flag

The Z flag is set to 1 of the result of an operation is 0. If the
result  is other than 0 then the Z flag is reset to 0.  The table
below summarizes the instructions that affect the Z flag.

Group             Instruction                   Action

8 bit               LD A I        Z = 1 if register = 0 else 0
load group          LD A R        Z = 1 if register = 0 else 0

Search group        CPI, CPIR,    Z = 1 if A = (HL) else 0
                    CPD, CPDR

                    ADD A x       Z = 1 if register = 0 else 0
                    ADC A x                  "
                    SUB x                    "
                    SBC A x                  "
                    AND x                    "
8 bit               OR x                     "
arithmetic          XOR x                    "
group               CP x                     "
                    INC x                    "
                    DEC x                    "

General purpose     DAA                      "
arithmetic group    NEG                      "

16 bit              ADC HL xx                "
arithmetic group    SBC HL xx                "

                    RLC x                    "
                    RL x                     "
                    RRC x                    "
Rotate and          RR x                     "
shift group         SLA x                    "
                    SRA x                    "
                    SRL x                    "
                    RLD                      "
                    RRD                      "

Bit test group      BIT n x       Z = 1 if bit = 0 else 0

Input and           INR (C)       Z = 1 if input data =0 else 0
output group        INI, IND,     Z = 1 if B-1=0 else 0
                    INIR, INDR,   Z = 1
                    OUTI, OUTD,   Z = 1 if B-1=0 else 0
                    OTIR, OTDR    Z = 1

                       The S or sign flag

The  sign  flag is used to indicate whether  in  twos  complement
notation  a number is negative or positive.  (see chapter 16  for
more  about two's complement) Thus if the number is  negative  (-
128 to -1)  then  the  sign flag is set to 1.  If the  number  is
positive (0 to 127) then the sign flag is reset to 0.

Group       Instruction                   Action

8 bit         LD A I         S = 1 if I register negative else 0
load group    LD A R         S = 1 if R register negative else 0

Search        CPI,CPIR,      S = 1 if result negative else 0
group         CPD,CPDR                       "

              ADD A x                        "
              ADC A x                        "
              SUB x                          "
8 bit         SBC A x                        "
arithmetic    AND x                          "
group         OR x                           "
              XOR x                          "
              CP x                           "
              INC x                          "
              DEC x                          "

General purp  DAA                            "
arithmetic    NEG                            "

16 bit        ADC HL xx                      "
arithmetic    SBC HL xx                      "

              RLC x                          "
              RL x                           "
              RRC x                          "
Rotate and    RR x                           "
shift group   SLA x                          "
              SRA x                          "
              SRL x                          "
              RLD x          S = 1 if A negative else 0
              RRD x          S = 1 if A negative else 0

Bit test gp   BIT n x        may be anything

            / IN R (C)       S = 1 if input data negative else 0

Input and     INI,INIR,
output        IND,INDR,      may be anything
group         OUTI,OTIR,
            \ OUTD,OTDR



                       The C or carry flag

The  carry  flag  is used to indicate whether the  result  of  an
operation (in decimal) was greater than 255 or less than 0.

LD A,150:ADD A,200

results in an answer of 350,  which is adjusted to 94 ( or 5EH in
hex  )  by  subtracting  256,  and the  carry  flag  is  set.  In
subtraction the carry flag is used as a borrow,  and is set to  1
if  the  answer was less then 0,  and so had to be  corrected  by
adding 256.

LD A,100:SUB 210

results in -110,  which is adjusted to 146 ( 92H ) by adding 256,
and the carry flag is set to 1.

Group       Instruction                   Action

          /   ADD A x       C = 1 if carry from bit 7 else 0
              ADC A x                        "
8 bit         SUB x         C = 1 if borrow else 0
arithmetic    SBC A x                        "
group         AND                          C = 0
              OR                           C = 0
              XOR                          C = 0
          \   CP            C = 1 if borrow else 0

General   /   DAA           C = 1 if bcd carry else 0
purpose       NEG           C = 1 if A not 0 before negate else 0
arithmetic    CCF           C = 1 if C = 0 before CCF else 0
group     \   SCF           C = 1

          /   ADD HL xx     C = 1 if carry from bit 15 else 0
16 bit        ADC HL xx                      "
arithmetic    ADD IX xx                      "
group         ADD IY xx                      "
          \   SBC HL xx     C = 1 if borrow else 0

          /   RLCA          C = previous A bit 7
              RLA                            "
              RRCA          C = previous A bit 0
Rotate        RRA                            "
and shift     RLC x         C = previous bit 7 of operand
group         RL x                           "
              RRC x         C = previous bit 0 of operand
              RR x                           "
              SLA x         C = previous bit 7 of operand
              SRA x         C = previous bit 0 of operand
          \   SRL x         C = previous bit 0 of operand




              The P or P/V parity or overflow flag

As  the  heading suggests this flag has more than  one  function.

Parity.  The  parity of a byte is the number of 1's the byte  has
when  it  is  represented  in binary.  43 decimal  in  binary  is
00101011,  which  has  4  1's.  If  the number  of  1's  is  even
(including 0) then the byte has even parity and the P flag is set
to  1.  59  in binary is 00111110 which has 5 1's and thus the  P
flag  is  set to 0.  The instructions which use the P flag  as  a
parity flag are indicated in the table.

Overflow. This is the other major use for the P flag. Most of the
arithmetic instructions use the P flag as an overflow  flag,  and
this is why the flag is sometimes written as P/V. Overflow occurs
when,  during  a  two's complement addition the result  in  two's
complement is >127 or <-128.  (see the chapter on bases for  more
about  two's  complement).  If this error condition occurs the  P
flag is set to 1, otherwise it is set to 0.

The P flag is also used by the block transfer  instructions,  and
is set to 1 if after the instruction the BC register is not equal
to 0.


Group       Instruction                   Action

8 bit         LD A I        P = contents of IFF2
load group    LD A R                         "

Block       / LDI, LDD,     P = 1 if BC - 1 <> 0 else 0
transfer      CPI, CPIR,                     "
and load      CPD, CPDR                      "
group       \ LDIR, LDDR                   P = 0

            / ADD A x       P = 1 if overflow else 0
              ADC A x                        "
              SUB x                          "
8 bit         SBC A x                        "
arithmetic    AND x         P = 1 if parity even else 0
group         OR x                           "
              XOR x                          "
              CP x          P = 1 if overflow else 0
              INC x         P = 1 if x=7FH before, else 0
            \ DEC x         P = 1 if x=80H before, else 0

Gen purp      DAA           P = 1 if A parity even
arithmetic    NEG           P = 1 if A = 80H before, else 0

16 bit        ADC HL xx     P = 1 if overflow else 0
arithmetic    SBC HL xx                      "

            / RLC x         P = 1 if perity even else 0
              RL x                           "
              RRC x                          "
Rotate and    RR x                           "
shift group   SLA x                          "
              SRA x                          "
              SRL x                          "
              RLD x                          "
            \ RRD x                          "

Bit test gp   BIT n x       may be anything

            / IN R (C)      P = 1 if parity even else 0
Input and     INI,INIR,              may be anything
output        IND,INDR,                      "
group         OUTI,OTIR,                     "
            \ OUTD,OTDR                      "

The  following  are a list of 8 bit  additions  and  subtractions
showing the calculation in decimal and in two's complement,  with
the  effect on the S C and P flags.  None of the answers are zero
so the Z flag is zero for all of these.

D  64 + 65 = 129                  C = 0
TC 64 + 65 = 129 -> -127          P = 1   S = 1

D  255 + 255 = 510 -> 254         C = 1
TC -1 + -1 = -2                   P = 0   S = 1

D  192 + 191 = 383 -> 127         C = 1
TC -64 + -65 = -129 -> 127        P = 1   S = 0

D  6 + 8 = 14                     C = 0
TC 6 + 8 = 14                     P = 0   S = 0

D  127 + 1 = 128                  C = 0
TC 127 + 1 = 128 -> -128          P = 1   S = 1

D  4 + 254 = 258 -> 2             C = 1
TC 4 + -2 = 2                     P = 0   S = 0

D  254 + 252 = 506 -> 250         C = 1
TC -2 + -4 = -6                   P = 0   S = 1

D  2 + 252 = 254                  C = 0
TC 2 + -4 = -2                    P = 0   S = 1

D  129 + 194 = 323 -> 67          C = 1
TC -127 + -62 = -189 -> 67        P = 1   S = 0

D  254 - 129 = 125                C = 0
TC -2 - -127 = 125                V = 0   S = 0

D  196 - 91 = 105                 C = 0
TC -60 - 91 = -151 -> 105         P = 1   S = 0

D  12 - 60 = -48 -> 208           C = 1
TC 12 - 60 = -48                  P = 0   S = 1

D  146 - 231 = -85 -> 171         C = 1
TC -110 - 231 = -341 -> -85       P = 1   S = 1


       The N or subtract flag and the H or half carry flag

These two flags are used for BCD adds and subtracts.  The DAA  is
the only instruction that uses these two flags, but the flags are
affected by most of the instruction groups.  The H flag indicates
a  carry  from  bit 3 in addition,  and a borrow from  bit  4  in
subtraction. The N flag is 0 after an add and 1 after a subtract.


Group       Instruction          H flag                 N flag

8 bit         LD A I     0                                0
load group    LD A R     0                                0

Block       / LDI, LDIR, 0                                0
transfer &    LDD, LDDR, 0                                0
Search        CPI, CPIR, 1 if borrow from bit 4 else 0    1
group       \ CPD, CPDR                  "

              ADD A x    1 if carry from bit 3 else 0     0
              ADC A x                    "                0
              SUB x      1 if borrow from bit 4 else 0    1
8 bit         SBC A x                    "                1
arithmetic    AND x          1                            0
group         OR x           0                            0
              XOR x          0                            0
              CP x       1 if borrow from bit 4 else 0    1
              INC x      1 if carry from bit 3 else 0     0
              DEC x      1 if borrow from bit 4 else 0    1

General purp  DAA            anything                  no change
arithmetic    NEG            1 if borrow bit 4 else 0     1
              CPL            1                            1
              CCF            no change                    0
              SCF            0                            1

16 bit        ADC HL xx  1 if carry from bit 11 else 0    0
arithmetic    ADD HL xx                  "                0
              ADD IX xx                  "                0
              ADD IY xx                  "                0
              SBC HL xx  1 if borrow from bit 12 else 0   1

              RLCA           0                            0
              RLA            0                            0
              RRCA           0                            0
              RRA            0                            0
              RLC x          0                            0
              RL x           0                            0
              RRC x          0                            0
Rotate and    RR x           0                            0
shift group   SLA x          0                            0
              SRA x          0                            0
              SRL x          0                            0
              RLD x          0                            0
              RRD x          0                            0

Bit test gp   BIT n x        1                            0

            / IN R (C)       0                            0

Input and     INI,INIR,      anything                     1
output        IND,INDR,      anything                     1
group         OUTI,OTIR,     anything                     1
            \ OUTD,OTDR      anything                     1


                      More about the flags

     The  6  flags  are sometimes grouped into the  so  called  F
register.  This register is combined with the A register to  form
the AF register, which is used in such instructions as EX AF AF',
PUSH AF and POP AF. The flags are assigned as follows.

Flag            S   Z   -   H   -   P   N   C

Binary bit      7   6   5   4   3   2   1   0

****************************************************************

                       Appendix

       Values and conversion of bases and ASCII characters

1 = value in decimal
2 = value in hexadecimal
3 = value in binary
4 = value in two's complement
5 = ASCII charater if valid

 1      2         3         4          5

 0      00     00000000     0     CONTROL SHIFT P, NULL
 1      01     00000001     1     CONTROL A
 2      02     00000010     2     CONTROL B
 3      03     00000011     3     CONTROL C
 4      04     00000100     4     CONTROL D
 5      05     00000101     5     CONTROL E
 6      06     00000110     6     CONTROL F
 7      07     00000111     7     CONTROL G, rings bell
 8      08     00001000     8     CONTROL H
 9      09     00001001     9     CONTROL I
 10     0A     00001010     10    CONTROL J, line feed
 11     0B     00001011     11    CONTROL K
 12     0C     00001100     12    CONTROL L
 13     0D     00001101     13    CONTROL M, carriage return
 14     0E     00001110     14    CONTROL N
 15     0F     00001111     15    CONTROL O
 16     10     00010000     16    CONTROL P
 17     11     00010001     17    CONTROL Q
 18     12     00010010     18    CONTROL R
 19     13     00010011     19    CONTROL S
 20     14     00010100     20    CONTROL T
 21     15     00010101     21    CONTROL U
 22     16     00010110     22    CONTROL V
 23     17     00010111     23    CONTROL W
 24     18     00011000     24    CONTROL X
 25     19     00011001     25    CONTROL Y
 26     1A     00011010     26    CONTROL Z
 27     1B     00011011     27    CONTROL SHIFT K, ESCAPE
 28     1C     00011100     28    CONTROL SHIFT L
 29     1D     00011101     29    CONTROL SHIFT M
 30     1E     00011110     30    CONTROL SHIFT N
 31     1F     00011111     31    CONTROL SHIFT O
 32     20     00100000     32    SPACE
 33     21     00100001     33    !
 34     22     00100010     34    "
 35     23     00100011     35    #
 36     24     00100100     36    $
 37     25     00100101     37    %
 38     26     00100110     38    &
 39     27     00100111     39    '
 40     28     00101000     40    (
 41     29     00101001     41    )
 42     2A     00101010     42    *
 43     2B     00101011     43    +
 44     2C     00101100     44    ,
 45     2D     00101101     45    -
 46     2E     00101110     46    .
 47     2F     00101111     47    /
 48     30     00110000     48    0
 49     31     00110001     49    1
 50     32     00110010     50    2
 51     33     00110011     51    3
 52     34     00110100     52    4
 53     35     00110101     53    5
 54     36     00110110     54    6
 55     37     00110111     55    7
 56     38     00111000     56    8
 57     39     00111001     57    9
 58     3A     00111010     58    :
 59     3B     00111011     59    ;
 60     3C     00111100     60    <
 61     3D     00111101     61    =
 62     3E     00111110     62    >
 63     3F     00111111     63    ?
 64     40     01000000     64    @
 65     41     01000001     65    A
 66     42     01000010     66    B
 67     43     01000011     67    C
 68     44     01000100     68    D
 69     45     01000101     69    E
 70     46     01000110     70    F
 71     47     01000111     71    G
 72     48     01001000     72    H
 73     49     01001001     73    I
 74     4A     01001010     74    J
 75     4B     01001011     75    K
 76     4C     01001100     76    L
 77     4D     01001101     77    M
 78     4E     01001110     78    N
 79     4F     01001111     79    O
 80     50     01010000     80    P
 81     51     01010001     81    Q
 82     52     01010010     82    R
 83     53     01010011     83    S
 84     54     01010100     84    T
 85     55     01010101     85    U
 86     56     01010110     86    V
 87     57     01010111     87    W
 88     58     01011000     88    X
 89     59     01011001     89    Y
 90     5A     01011010     90    Z
 91     5B     01011011     91    [
 92     5C     01011100     92    \
 93     5D     01011101     93    ]
 94     5E     01011110     94    ^
 95     5F     01011111     95    _
 96     60     01100000     96    `
 97     61     01100001     97    a
 98     62     01100010     98    b
 99     63     01100011     99    c
 100    64     01100100     100   d
 101    65     01100101     101   e
 102    66     01100110     102   f
 103    67     01100111     103   g
 104    68     01101000     104   h
 105    69     01101001     105   i
 106    6A     01101010     106   j
 107    6B     01101011     107   k
 108    6C     01101100     108   l
 109    6D     01101101     109   m
 110    6E     01101110     110   n
 111    6F     01101111     111   o
 112    70     01110000     112   p
 113    71     01110001     113   q
 114    72     01110010     114   r
 115    73     01110011     115   s
 116    74     01110100     116   t
 117    75     01110101     117   u
 118    76     01110110     118   v
 119    77     01110111     119   w
 120    78     01111000     120   x
 121    79     01111001     121   y
 122    7A     01111010     122   z
 123    7B     01111011     123   {
 124    7C     01111100     124   |
 125    7D     01111101     125   }
 126    7E     01111110     126   ~
 127    7F     01111111     127   DELETE
 128    80     10000000    -128
 129    81     10000001    -127
 130    82     10000010    -126
 131    83     10000011    -125
 132    84     10000100    -124
 133    85     10000101    -123
 134    86     10000110    -122
 135    87     10000111    -121
 136    88     10001000    -120
 137    89     10001001    -119
 138    8A     10001010    -118
 139    8B     10001011    -117
 140    8C     10001100    -116
 141    8D     10001101    -115
 142    8E     10001110    -114
 143    8F     10001111    -113
 144    90     10010000    -112
 145    91     10010001    -111
 146    92     10010010    -110
 147    93     10010011    -109
 148    94     10010100    -108
 149    95     10010101    -107
 150    96     10010110    -106
 151    97     10010111    -105
 152    98     10011000    -104
 153    99     10011001    -103
 154    9A     10011010    -102
 155    9B     10011011    -101
 156    9C     10011100    -100
 157    9D     10011101    -99
 158    9E     10011110    -98
 159    9F     10011111    -97
 160    A0     10100000    -96
 161    A1     10100001    -95
 162    A2     10100010    -94
 163    A3     10100011    -93
 164    A4     10100100    -92
 165    A5     10100101    -91
 166    A6     10100110    -90
 167    A7     10100111    -89
 168    A8     10101000    -88
 169    A9     10101001    -87
 170    AA     10101010    -86
 171    AB     10101011    -85
 172    AC     10101100    -84
 173    AD     10101101    -83
 174    AE     10101110    -82
 175    AF     10101111    -81
 176    B0     10110000    -80
 177    B1     10110001    -79
 178    B2     10110010    -78
 179    B3     10110011    -77
 180    B4     10110100    -76
 181    B5     10110101    -75
 182    B6     10110110    -74
 183    B7     10110111    -73
 184    B8     10111000    -72
 185    B9     10111001    -71
 186    BA     10111010    -70
 187    BB     10111011    -69
 188    BC     10111100    -68
 189    BD     10111101    -67
 190    BE     10111110    -66
 191    BF     10111111    -65
 192    C0     11000000    -64
 193    C1     11000001    -63
 194    C2     11000010    -62
 195    C3     11000011    -61
 196    C4     11000100    -60
 197    C5     11000101    -59
 198    C6     11000110    -58
 199    C7     11000111    -57
 200    C8     11001000    -56
 201    C9     11001001    -55
 202    CA     11001010    -54
 203    CB     11001011    -53
 204    CC     11001100    -52
 205    CD     11001101    -51
 206    CE     11001110    -50
 207    CF     11001111    -49
 208    D0     11010000    -48
 209    D1     11010001    -47
 210    D2     11010010    -46
 211    D3     11010011    -45
 212    D4     11010100    -44
 213    D5     11010101    -43
 214    D6     11010110    -42
 215    D7     11010111    -41
 216    D8     11011000    -40
 217    D9     11011001    -39
 218    DA     11011010    -38
 219    DB     11011011    -37
 220    DC     11011100    -36
 221    DD     11011101    -35
 222    DE     11011110    -34
 223    DF     11011111    -33
 224    E0     11100000    -32
 225    E1     11100001    -31
 226    E2     11100010    -30
 227    E3     11100011    -29
 228    E4     11100100    -28
 229    E5     11100101    -27
 230    E6     11100110    -26
 231    E7     11100111    -25
 232    E8     11101000    -24
 233    E9     11101001    -23
 234    EA     11101010    -22
 235    EB     11101011    -21
 236    EC     11101100    -20
 237    ED     11101101    -19
 238    EE     11101110    -18
 239    EF     11101111    -17
 240    F0     11110000    -16
 241    F1     11110001    -15
 242    F2     11110010    -14
 243    F3     11110011    -13
 244    F4     11110100    -12
 245    F5     11110101    -11
 246    F6     11110110    -10
 247    F7     11110111    -9
 248    F8     11111000    -8
 249    F9     11111001    -7
 250    FA     11111010    -6
 251    FB     11111011    -5
 252    FC     11111100    -4
 253    FD     11111101    -3
 254    FE     11111110    -2
 255    FF     11111111    -1