
             ________________   ________________ _________________
            |               /\ |                ||                |
            |_______       / / |      ____      ||      ____      |
             \_____/      / /  |     |____|     ||     |___/|     |
                  /      / /   |                ||     |  | |     |
                 /      / /    |      ____      ||     |  | |     |
                /      /_/_____|     |____|     ||     |__|_|     |
               /              ||                ||                |
              /_______________||________________||________________|
              \________________\\______________//________________/

 ______________________________________________________________________________
|                                                                              |
|                            Zilog Z80 CPU Emulator                            |
|                                  version 0.2                                 |
|                                                                              |
|            Copyright (C) 1999-2022 Manuel Sainz de Baranda y Goñi            |
|     Released under the terms of the GNU Lesser General Public License v3     |
|                                                                              |
|                         https://zxe.io/software/Z80                          |
|                                                                              |
'=============================================================================='


1.  Introduction
================

The Z80 library implements a fast, small and accurate emulator of the Zilog Z80.
It emulates all that is known to date about this CPU, including the undocumented
behaviors, MEMPTR, Q and the special RESET. It also has the honor of having been
the first open source project to provide full emulation of the interrupt mode 0.

The source code is written in ANSI C for maximum portability and is extensively
commented. The aim has been to write a well-structured, easy to understand piece
of software; something solid and elegant that can stand the test of time with no
need for major changes.


2.  Accuracy
============

The Zilog Z80 emulator has a classic design with instruction-level granularity.
This provides the best performance while still offering a reasonable flexibility
to achieve precision down to the T-state level.

Instruction-level granularity means that, except in a few well-defined cases,
the execution of a given instruction cannot stop until all its internal M-cycles
are processed. In addition, this type of emulation has been optimized for speed,
which implies that the registers are modified only once per instruction and the
T-state counter is normally updated only after a full instruction has been
executed.

That said, instructions, flags, memory accesses, interrupt and reset responses,
clock cycles, etc., are accurately emulated as far as is known, according to the
technical documentation available, the findings made after decades of research
on the Z80 and electronic simulations. And, of course, the emulator passes the
most exhaustive tests written to date such as Patrik Rak's "Zilog Z80 CPU Test
Suite", Frank D. Cringle's "Z80 Instruction Set Exerciser", Mark Woodmass' "Z80
Test Suite" and Peter Helcmanovsky's "Z80 Block Flags Test", to name a few.


3.  Installation
================

You will need CMake v3.14 or later to build the package and, optionally, recent
versions of Doxygen, Sphinx and Breathe to compile the documentation. Also make
sure you have LaTeX with PDF support installed on your system if you want to
generate the documentation in PDF format.

The emulator requires some types and macros included in Zeta (https://zeta.st),
a dependency-free, header-only library used to retain compatibility with most C
compilers. Install Zeta or extract its official source code package to the same
directory of this README or its parent directory. Zeta is the sole dependency;
the emulator is a freestanding implementation and as such does not depend on the
C standard library.

Once the prerequisites are met, create a directory and run cmake from there to
prepare the build system:

    $ mkdir build
    $ cd build
    $ cmake <directory of this README> [options]

The resulting build files can be configured by passing options to cmake. To show
a complete list of those available along with their current settings, type the
following:

    $ cmake -LAH

If in doubt, read the CMake documentation for more information on configuration
options. The following are some of the most relevant standard options of CMake:

    -DBUILD_SHARED_LIBS=(YES|NO)
        Build the emulator as a shared library, rather than static.
        The default is `NO`.

    -DCMAKE_BUILD_TYPE=(Debug|Release|RelWithDebInfo|MinSizeRel)
        Choose the type of build (configuration) to generate.
        The default is `Release`.

    -DCMAKE_INSTALL_PREFIX="<path>"
        Specify the installation prefix on UNIX and UNIX-like operating systems.
        The default is `/usr/local`.

Package-specific options are prefixed with `Z80_` and can be divided into two
groups. The first one controls aspects not related to the source code of the
library:

    -DZ80_DOWNLOAD_TEST_FILES=(YES|NO)
        Download the firmware and software used by the testing tool.
        The default is `NO`.

    -DZ80_INSTALL_CMAKEDIR="<path>"
        Specify the directory in which to install the CMake config-file package.
        The default is `"${CMAKE_INSTALL_LIBDIR}/cmake/Z80"`.

    -DZ80_INSTALL_PKGCONFIGDIR="<path>"
        Specify the directory in which to install the pkg-config file.
        The default is `"${CMAKE_INSTALL_LIBDIR}/pkgconfig"`.

    -DZ80_NOSTDLIB_FLAGS=(Auto|[<flag>[;<flag>...]])
        Specify the linker flags used to avoid linking against system libraries.
        The default is Auto (autoconfigure flags). If you get linker errors, set
        this option to `""`.

    -DZ80_OBJECT_LIBS=(YES|NO)
        Build the emulator as an object library.
        This option takes precedence over `BUILD_SHARED_LIBS` and
        `Z80_SHARED_LIBS`. If enabled, the build system will ignore
        `Z80_WITH_CMAKE_SUPPORT` and `Z80_WITH_PKGCONFIG_SUPPORT`, as no
        libraries or support files will be installed.
        The default is `NO`.

    -DZ80_SHARED_LIBS=(YES|NO)
        Build the emulator as a shared library, rather than static.
        This option takes precedence over `BUILD_SHARED_LIBS`.
        Not defined by default.

    -DZ80_SPHINX_HTML_THEME="[<name>]"
        Specify the Sphinx theme for the documentation in HTML format.
        The default is `""` (use the default theme).

    -DZ80_WITH_CMAKE_SUPPORT=(YES|NO)
        Generate and install the CMake config-file package.
        The default is `NO`.

    -DZ80_WITH_HTML_DOCUMENTATION=(YES|NO)
        Build and install the documentation in HTML format.
        It requires Doxygen, Sphinx and Breathe.
        The default is `NO`.

    -DZ80_WITH_PDF_DOCUMENTATION=(YES|NO)
        Build and install the documentation in PDF format.
        It requires Doxygen, Sphinx, Breathe and LaTeX with PDF support.
        The default is `NO`.

    -DZ80_WITH_PKGCONFIG_SUPPORT=(YES|NO)
        Generate and install the pkg-config file.
        The default is `NO`.

    -DZ80_WITH_STANDARD_DOCUMENTS=(YES|NO)
        Install the standard text documents distributed with the package:
        AUTHORS, COPYING, COPYING.LESSER, HISTORY, README and THANKS.
        The default is `NO`.

    -DZ80_WITH_TESTS=(YES|NO)
        Build the testing tool.
        The default is `NO`.

The second group of package-specific options configures the source code of the
library by predefining macros that enable optional features:

    -DZ80_WITH_EXECUTE=(YES|NO)
        Build the implementation of the `z80_execute` function.
        The default is `NO`.

    -DZ80_WITH_FULL_IM0=(YES|NO)
        Build the full implementation of the interrupt mode 0 rather than the
        reduced one.
        The default is `NO`.

    -DZ80_WITH_Q=(YES|NO)
        Build the implementation of Q.
        The default is `NO`.

    -DZ80_WITH_RETX_NOTIFICATIONS_IN_IM0=(YES|NO)
        Enable optional notifications for any `reti` or `retn` instruction
        executed during the interrupt mode 0 response.
        The default is `NO`.

    -DZ80_WITH_SPECIAL_RESET=(YES|NO)
        Build the implementation of the special RESET.
        The default is `NO`.

    -DZ80_WITH_UNOFFICIAL_RETI=(YES|NO)
        Configure the ED5Dh, ED6Dh and ED7Dh undocumented instructions as `reti`
        instead of `retn`.
        The default is `NO`.

    -DZ80_WITH_ZILOG_NMOS_LD_A_IR_BUG=(YES|NO)
        Build the implementation of the bug affecting the Zilog Z80 NMOS, which
        causes the P/V flag to be reset when a maskable interrupt is accepted
        during the execution of the `ld a,{i|r}` instructions.
        The default is `NO`.

Package maintainers are encouraged to use at least the following options for the
shared library:

    -DZ80_WITH_EXECUTE=YES
    -DZ80_WITH_FULL_IM0=YES
    -DZ80_WITH_Q=YES
    -DZ80_WITH_ZILOG_NMOS_LD_A_IR_BUG=YES

Finally, once the build system is configured according to your needs, build and
install the package:

    $ cmake --build .
    # cmake --install . [--strip]

It is advisable to use the `--strip` option when installing non-debug builds of
the shared library.


4.  Integration
===============

4.1.  As an external dependency in CMake-based projects

The Z80 library includes a config-file package for integration into CMake-based
projects, which should be installed for development. Use `find_package` to find
the `Z80` package. This creates the `Z80` imported library target that carries
the necessary transitive link dependencies. The linking method can optionally be
selected by specifying either the `Shared` component or the `Static` component.

Example:

    find_package(Z80 REQUIRED Shared)
    target_link_libraries(your-target Z80)

When not specified as a component, the linking method is selected according to
`Z80_SHARED_LIBS`. If this option is not defined, the config-file uses the type
of library that is installed on the system and, if it finds both the shared and
the static versions, `BUILD_SHARED_LIBS` determines which one to link against.

4.2.  As a CMake subproject

To embed the Z80 library as a CMake subproject, extract the source code packages
of Zeta (https://zeta.st) and Z80 (or clone their respective repositories) into
a subdirectory of another project. Then use `add_subdirectory` in the parent
project to add the Z80 source code tree to the build process (N.B., the Z80
subproject will automatically find Zeta and import it as an interface library).

It is advisable to configure the Z80 library in the CMakeLists.txt of the parent
project. This will prevent the user from having to specify configuration options
for the Z80 subproject through the command line when building the main project.

Example:

    set(Z80_SHARED_LIBS                 NO  CACHE BOOL "")
    set(Z80_WITH_Q                      YES CACHE BOOL "")
    set(Z80_WITH_ZILOG_NMOS_LD_A_IR_BUG YES CACHE BOOL "")

    add_subdirectory(dependencies/Z80)
    target_link_libraries(your-target Z80)

It is important to set the `Z80_SHARED_LIBS` option. Otherwise CMake will build
the library type indicated by `BUILD_SHARED_LIBS`, which may not be the desired
one.

4.3.  Integrating the source code

There are several macros that can be used to configure the source code of the
library. You can define those you need in your build system or at the beginning
of the Z80.c file. The following ones allow you to configure the integration of
Z80.h and Z80.c into the project:

    #define Z80_DEPENDENCIES_HEADER "header name.h"
        Specifies the only external header to `#include`, replacing those of
        Zeta. If you compile Z80.c with this macro defined, you must also define
        it before including `"Z80.h"` or `<Z80.h>`.

    #define Z80_STATIC
        Required to compile and/or use the emulator as a static library or as an
        internal part of another project. If you compile Z80.c with this macro
        defined, you must also define it before including `"Z80.h"` or
        `<Z80.h>`.

    #define Z80_WITH_LOCAL_HEADER
        Tells Z80.c to `#include "Z80.h"` instead of `<Z80.h>`.

The second group of package-specific options, explained in section 3 of this
document, activates various optional features in the source code by predefining
the following macros:

    #define Z80_WITH_EXECUTE
    #define Z80_WITH_FULL_IM0
    #define Z80_WITH_Q
    #define Z80_WITH_SPECIAL_RESET
    #define Z80_WITH_UNOFFICIAL_RETI
    #define Z80_WITH_ZILOG_NMOS_LD_A_IR_BUG

Except for `Z80_DEPENDENCIES_HEADER`, the above macros do not need to be defined
as any value; the source code only checks whether or not they are defined.

Please note that the activation of some of the optional features affects the
speed of the emulator due to various factors (read the documentation for more
details).


5.  License
===========

This library is free software: you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the Free
Software Foundation, either version 3 of the License, or (at your option) any
later version.

This library is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License along
with this library. If not, see <http://www.gnu.org/licenses/>.

________________________________________________________________________________
Last update: 2022-12-05                                               README EOF
