Z80库实现了Zilog Z80的快速,小而精确的模拟器。它模拟了有关此CPU的所有已知的所有内容,包括无证件行为,MEMPTR,Q和特殊重置。它也很荣幸成为第一个提供中断模式0完全仿真的开源项目。
源代码以ANSI C编写,以实现最大的可移植性,并进行了广泛的评论。目的是编写结构良好,易于理解的软件。扎实而优雅的东西可以经受时间的考验,而无需重大变化。
这款Z80 CPU仿真器具有经典的设计,具有指令级粒度,可提供最佳性能,同时提供合理的灵活性,以将精度降至T-State水平。
指令级粒度意味着,除了少数明确的情况下,在处理所有内部M-Cycles之后,执行给定指令才能停止(即,指令未分为微型操作)。此外,每条指令仅修改一次寄存器,并且在执行完整说明后,通常会更新T-State计数器。
也就是说,根据可用的技术文档,数十年来研究Z80和电子模拟,根据可用的技术文档和电子模拟进行了数十年的研究结果,可以准确模拟说明,标志,内存访问,中断,时钟周期等。当然,模拟器通过迄今为止写的最详尽的测试,包括所有三个主要的测试套件:
这组程序旨在帮助模拟器作者达到所需的CPU仿真真实性。每个随附的程序都使用经过测试的Z80指令执行详尽的计算,将结果与从真实的Sinclair ZX Spectrum 48K获得的值与Zilog Z80 CPU进行了比较,并报告了检测到的任何偏差。
z80full.tap 测试所有标志和登记册。 | z80doc.tap 测试所有寄存器,但仅正式记录了旗帜。 |
z80flags.tap 测试所有标志,忽略寄存器。 | z80docflags.tap 测试仅记录了标志,忽略了寄存器。 |
z80ccf.tap 每次指令测试后执行 ccf后测试所有标志。 | z80memptr.tap 在执行 bit N,(hl)测试后,测试所有标志。 |
z80full.tap 测试所有标志和登记册。 | z80doc.tap 测试所有寄存器,但仅正式记录了旗帜。 |
z80flags.tap 测试所有标志,忽略寄存器。 | z80docflags.tap 测试仅记录了标志,忽略了寄存器。 |
z80ccf.tap 每次指令测试后执行 ccf后测试所有标志。 | z80memptr.tap 在执行 bit N,(hl)测试后,测试所有标志。 |
该套件执行了一系列测试,以验证MEMPTR文档(英语,俄语) ,并在几个CBh/DDh/FDh OpCode范围内进行了简短运行。将程序中的测试结果与NEC D780C-1 CPU的测试结果进行了比较,但是Simon Conway友善地测试了其他几个Z80克隆,证实了相同的结果。
z80tests.tap | |
弗兰克·克林格(Frank Cringle)的Z80指令集练习器试图执行每个Z80操作码,使它们通过测试周期,并将结果与实际Z80上运行代码的实际结果进行比较。练习者提供了弗兰克的Yaze(另一个Z80仿真器)。通常很难追踪,所以乔纳森·格雷厄姆·哈斯顿(Jonathan Graham Harston)将其放在这里,以及一些转换。 Yaze的最新版本可在Andreas Gerlich的网站上找到。
zexdoc.tap 测试正式记录了标志效应。 | zexall.tap 测试所有标志更改。 |
zexfix.tap 测试所有标志更改。 | zexbit.tap 测试 bit指令的所有标志更改。 |
zexall2.tap |
首先,添加zxe存储库并更新软件包索引:
sudo mkdir -pm700 /root/.gnupg
sudo mkdir -pm755 /etc/apt/keyrings
sudo gpg --no-default-keyring --keyring /etc/apt/keyrings/zxe-archive-keyring.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys FE214A38D6A0C01D9AF514EE841EA3BD3A7E1487
echo " deb [arch= $( dpkg --print-architecture ) signed-by=/etc/apt/keyrings/zxe-archive-keyring.gpg] https://zxe.io/repos/apt stable main " | sudo tee /etc/apt/sources.list.d/zxe.list
sudo apt update接下来,安装库包:
sudo apt install libz80如果您需要构建需要Z80库的软件,请安装开发包:
sudo apt install libz80-dev首先,添加并同步zxe覆盖:
eselect repository add zxe git https://github.com/redcode/zxe-gentoo-overlay.git
emaint sync --repo zxe然后安装库:
emerge emulation-libs/z80brew install redcode/zxe/z80下载页面上可用用于Windows的预构建二进制文件。
您将需要CMAKE v3.14或更高版本才能构建包装,并且可选地,最新版本的Doxygen,sphinx和呼吸以编译文档。另外,如果要以PDF格式生成文档,请确保您的系统上安装了PDF支持。
模拟器需要Zeta中包含的某些类型和宏,这是一个无依赖项的,仅限标头的库,用于保留与大多数C编译器的兼容性。安装Zeta或将其源代码TARBALL提取到Z80项目的根目录或其父目录的根目录。 Zeta是唯一的依赖性;模拟器是一个独立的实现,因此不取决于C标准库。
一旦满足先决条件,请创建一个目录并从那里运行cmake以准备构建系统:
mkdir build
cd build
cmake [options] < Z80-project-directory >可以通过将选项传递给cmake来配置所得的构建文件。要显示可用的列表及其当前设置的完整列表,请键入以下内容:
cmake -LAH -N -B .如有疑问,请阅读CMAKE文档以获取有关配置选项的更多信息。以下是CMAKE的一些最相关的标准选项:
生成共享库,而不是静态库。
默认值为NO 。
-DCMAKE_BUILD_TYPE=(Debug|Release|RelWithDebInfo|MinSizeRel)
选择要生成的构建类型(配置)。
默认值是Release 。
-DCMAKE_INSTALL_NAME_DIR="<path>"
在Apple平台上指定Dynamic Library安装名称的目录部分(适用于已安装的共享库)。
默认情况下未定义。
-DCMAKE_INSTALL_PREFIX="<path>"
指定安装前缀。
默认值为"/usr/local" (在UNIX和UNIX样操作系统上)。
特定于软件包的选项以Z80_前缀为前缀,可以分为两组。第一个控制与库源代码无关的方面:
-DZ80_DEPOT_LOCATION="<location>"
指定包含测试文件的仓库的目录或URL(即测试工具所需的固件和软件)。
默认值为"http://zxe.io/depot" 。
-DZ80_FETCH_TEST_FILES=(YES|NO)
将仓库的测试文件复制或下载到构建目录。
默认值为NO 。
-DZ80_INSTALL_CMAKEDIR="<path>"
指定要在其中安装CMAKE config-File软件包的目录。
默认值为"${CMAKE_INSTALL_LIBDIR}/cmake/Z80" 。
-DZ80_INSTALL_PKGCONFIGDIR="<path>"
指定要在其中安装pkg-config文件的目录。
默认值为"${CMAKE_INSTALL_LIBDIR}/pkgconfig" 。
-DZ80_NOSTDLIB_FLAGS=(Auto|"[<flag>[;<flag>...]]")
指定用于避免链接系统库的链接标志。
默认值为Auto (AutoConfigure标志)。如果收到链接器错误,请将此选项设置为"" 。
-DZ80_OBJECT_LIBS=(YES|NO)
将模拟器构建为对象库。
此选项优先于BUILD_SHARED_LIBS和Z80_SHARED_LIBS 。如果启用,则构建系统将忽略Z80_WITH_CMAKE_SUPPORT和Z80_WITH_PKGCONFIG_SUPPORT ,因为不会安装库或支持文件。
默认值为NO 。
将模拟器构建为共享库,而不是静态。
此选项优先于BUILD_SHARED_LIBS 。
默认情况下未定义。
-DZ80_SPHINX_HTML_THEME="[<name>]"
以HTML格式指定文档的狮身人面像主题。
默认值为"" (使用默认主题)。
-DZ80_WITH_CMAKE_SUPPORT=(YES|NO)
生成并安装Cmake Config-File软件包。
默认值为NO 。
-DZ80_WITH_HTML_DOCUMENTATION=(YES|NO)
以HTML格式构建并安装文档。
它需要Doxygen,狮身人面像和呼吸。
默认值为NO 。
-DZ80_WITH_PDF_DOCUMENTATION=(YES|NO)
以PDF格式构建并安装文档。
它需要doxygen,sphinx,呼吸和乳胶,并提供pdf支持。
默认值为NO 。
-DZ80_WITH_PKGCONFIG_SUPPORT=(YES|NO)
生成并安装pkg-config文件。
默认值为NO 。
-DZ80_WITH_STANDARD_DOCUMENTS=(YES|NO)
安装包含包装的标准文本文档: AUTHORS , COPYING , COPYING.LESSER , HISTORY , README和THANKS 。
默认值为NO 。
-DZ80_WITH_TESTS=(YES|NO)
构建测试工具。
默认值为NO 。
第二组包装特定的选项通过预定宏来配置库的源代码,该宏可以启用可选功能:
-DZ80_WITH_EXECUTE=(YES|NO)
构建z80_execute函数的实现。
默认值为NO 。
-DZ80_WITH_FULL_IM0=(YES|NO)
构建中断模式0的完整实现,而不是减少的模式。
默认值为NO 。
-DZ80_WITH_IM0_RETX_NOTIFICATIONS=(YES|NO)
在中断模式0响应中执行的任何reti或retn指令启用可选通知。
默认值为NO 。
-DZ80_WITH_Q=(YES|NO)
构建Q的实现。
默认值为NO 。
-DZ80_WITH_SPECIAL_RESET=(YES|NO)
建立特殊重置的实现。
默认值为NO 。
-DZ80_WITH_UNOFFICIAL_RETI=(YES|NO)
将无证指令ED5Dh , ED6Dh和ED7Dh配置为reti而不是retn 。
默认值为NO 。
-DZ80_WITH_ZILOG_NMOS_LD_A_IR_BUG=(YES|NO)
构建影响Zilog Z80 NMO的错误的实现,该错误在执行ld a,{i|r}指令期间接受掩模中断时会导致P/V标志重置。
默认值为NO 。
鼓励维护者至少在共享库中使用以下选项:
-DZ80_WITH_EXECUTE=YES
-DZ80_WITH_FULL_IM0=YES
-DZ80_WITH_IM0_RETX_NOTIFICATIONS=YES
-DZ80_WITH_Q=YES
-DZ80_WITH_ZILOG_NMOS_LD_A_IR_BUG=YES
最后,一旦根据您的需求配置了构建系统,请构建并安装软件包:
cmake --build . [--config (Debug | Release | RelWithDebInfo | MinSizeRel)]
cmake --install . [--config < configuration > ] [--strip] --config选项仅对于那些忽略CMAKE_BUILD_TYPE (例如,Xcode和Visual Studio)的CMake Generator所需。在安装共享库的非删除构建时,使用--strip以删除调试信息和非公共符号。
使用以下内容将模拟器构建为共享库,并将其与开发文件一起安装到$HOME/.local中:
mkdir work && cd work
git clone https://github.com/redcode/Zeta.git
git clone https://github.com/redcode/Z80.git
cd Zeta
mkdir build && cd build
cmake
-DCMAKE_BUILD_TYPE=Release
-DCMAKE_INSTALL_PREFIX= " $HOME /.local "
-DZeta_WITH_CMAKE_SUPPORT=YES
-DZeta_WITH_PKGCONFIG_SUPPORT=YES
..
cmake --install . --config Release
cd ../../Z80
mkdir build && cd build
cmake
-DBUILD_SHARED_LIBS=YES
-DCMAKE_BUILD_TYPE=Release
-DCMAKE_INSTALL_NAME_DIR= " $HOME /.local/lib "
-DCMAKE_INSTALL_PREFIX= " $HOME /.local "
-DZ80_WITH_CMAKE_SUPPORT=YES
-DZ80_WITH_PKGCONFIG_SUPPORT=YES
-DZ80_WITH_EXECUTE=YES
-DZ80_WITH_FULL_IM0=YES
-DZ80_WITH_IM0_RETX_NOTIFICATIONS=YES
-DZ80_WITH_Q=YES
-DZ80_WITH_ZILOG_NMOS_LD_A_IR_BUG=YES
..
cmake --build . --config Release
cmake --install . --config Release --stripbuild and-install-z80.sh
该软件包包括一个称为test-Z80的工具,能够运行主要测试套件的最相关的CP/M和ZX频谱版本。使用-DZ80_WITH_TESTS=YES启用其编译,并将-DZ80_FETCH_TEST_FILES=YES ,下载所需的固件和软件。另请注意,必须使用-DZ80_WITH_Q=YES构建Z80库,以便能够通过Patrik Rak的测试。
构建软件包后,输入以下所有测试:
./test-Z80 -p depot/firmware -p depot/software/POSIX -p " depot/software/ZX Spectrum " -a该工具支持选项,并可以单独运行测试(键入./test-Z80 -h以寻求帮助)。如果您希望通过CTEST运行所有测试,请使用此命令:
ctest --verbose --build-config (Debug | Release | RelWithDebInfo | MinSizeRel)通过test-Z80模拟不同CPU变体生成的完整日志可在此处提供:
笔记
NEC NMOS变体日志中的CRC错误是正常的,并匹配在实际硬件上获得的值。 ST CMOS变体目前正在研究中。
使用以下来构建和测试模拟器:
mkdir work && cd work
git clone https://github.com/redcode/Zeta.git
git clone https://github.com/redcode/Z80.git
cd Z80
mkdir build && cd build
cmake
-DCMAKE_BUILD_TYPE=Release
-DZ80_FETCH_TEST_FILES=YES
-DZ80_WITH_TESTS=YES
-DZ80_WITH_EXECUTE=YES
-DZ80_WITH_FULL_IM0=YES
-DZ80_WITH_IM0_RETX_NOTIFICATIONS=YES
-DZ80_WITH_Q=YES
-DZ80_WITH_ZILOG_NMOS_LD_A_IR_BUG=YES
..
cmake --build . --config Release
ctest --verbose --build-config Release构建测试-Z80.SH构建测试-Z80.BAT
Z80库包括一个配置文件软件包,以集成到基于CMAKE的项目中,必须安装用于开发的项目。使用find_package查找Z80包。这创建了Z80导入的库目标,该目标带有必要的传递链接依赖性。可选地,可以通过指定Shared或Static组件来选择链接方法。
例子:
find_package (Z80 REQUIRED Shared)
target_link_libraries (your- target Z80)如果未指定为组件,则根据Z80_SHARED_LIBS选择链接方法。如果未定义此选项,则配置文件使用系统上安装的库类型,如果同时找到共享版本和静态版本, BUILD_SHARED_LIBS确定要链接哪个。
要将Z80库作为CMAKE子标记嵌入,请将Zeta和Z80(或克隆其各自的存储库)的源代码TARBALL提取到另一个项目的子目录中。然后,在父项目中使用add_subdirectory将Z80源代码树添加到构建过程(NB,Z80子标记将自动找到Zeta并将其导入到接口库中)。
建议在父项目的CMakeLists.txt中配置Z80库。这将阻止用户在构建主项目时必须通过命令行指定Z80子标记的配置选项。
例子:
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)设置Z80_SHARED_LIBS选项很重要。否则,CMAKE将构建由BUILD_SHARED_LIBS指示的库类型,这可能不是所需的库。
模拟器的源代码可以在编译时间配置,通过预定一系列宏来配置。 Z80.h和Z80.c服从下面的前两个。其余的宏仅在编译Z80.c时才相关:
#define Z80_EXTERNAL_HEADER "header-name.h"
指定#include的唯一外部标头,替换所有其他标题。
预先定义此宏以提供定义模拟器使用的外部类型和宏的标头文件,从而阻止您的项目取决于Zeta。您可以在将Z80.c作为项目的一部分时使用此此功能,或者(如果您的类型不会破坏二进制兼容性),包括<Z80.h>并链接到预先构建的Z80库。
#define Z80_STATIC
限制公共符号的可见性。
如果您将Z80.c构建为静态库,将其直接作为项目的一部分进行编译,或将程序链接到Z80库的静态版本,则需要此宏。在这两种情况下,请确保在包含"Z80.h"或<Z80.h>之前定义此宏。
#define Z80_WITH_LOCAL_HEADER
告诉Z80.c #include "Z80.h"而不是<Z80.h> 。
默认情况下,“来自来源的安装”中提到的仿真器的可选功能。如果您将Z80.c作为项目的一部分进行编译,则可以通过预先定义其各自的激活宏来启用所需的功能。他们的名称与cmake等效物相同:
#define Z80_WITH_EXECUTE#define Z80_WITH_FULL_IM0#define Z80_WITH_IM0_RETX_NOTIFICATIONS#define Z80_WITH_Q#define Z80_WITH_SPECIAL_RESET#define Z80_WITH_UNOFFICIAL_RETI#define Z80_WITH_ZILOG_NMOS_LD_A_IR_BUG除Z80_EXTERNAL_HEADER外,上述宏可以为空;源代码仅检查是否定义它们。
笔记
由于各种因素,某些可选特征的激活会影响模拟器的速度(有关更多详细信息,请阅读文档)。
以下项目(按字母顺序列出)使用了该模拟器:
非常感谢以下个人(按字母顺序排列):
ccf/scf指令的不稳定行为。ccf/scf说明。 2,3ccf/scf指令的研究。 5,6ccf/scf指令的研究。 12out (c),0指令在Zilog Z80 CMO上的表现。 16ccf/scf说明。 12、23ccf/scf说明的不稳定行为的研究。ccf/scf说明的不稳定行为。ccf/scf指令的行为。 15、30ccf/scf说明的不稳定行为的研究。ccf/scf指令的研究。 2,3reti/retn指示会推迟接受掩盖的中断。 34ccf/scf指令的研究。 36版权所有©1999-2024 Manuel Sainz de Baranda YGoñi。
该库是免费软件:您可以根据自由软件基金会发布的GNU较少的通用公共许可条款对其进行重新分配和/或修改它,无论是许可证的版本3还是(在您的选项上)任何以后的版本。
该图书馆的分发是希望它将有用的,但没有任何保修;即使没有对特定目的的适销性或适合性的隐含保证。有关更多详细信息,请参见GNU较少的通用公共许可证。
您应该已经收到了GNU较少的通用公共许可证的副本以及此图书馆。如果没有,请参见https://www.gnu.org/licenses/。
GNU较小的通用公共许可条款的项目阻止了该图书馆的使用,或者需要不必要的商业产品源代码出版,可能会申请特殊许可。