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較小的通用公共許可條款的項目阻止了該圖書館的使用,或者需要不必要的商業產品源代碼出版,可能會申請特殊許可。