Z80ライブラリは、Zilog Z80の高速で小さく、正確なエミュレータを実装しています。文書化されていない行動、MEMPTR、Q、特別なリセットなど、このCPUについてこれまで知られているすべてのものをエミュレートします。また、割り込みモード0の完全なエミュレーションを提供する最初のオープンソースプロジェクトであったことを称えます。
ソースコードは、最大限の移植性のためにANSI Cで記述され、広範囲にコメントされています。目的は、十分に構造化された、理解しやすいソフトウェアを書くことでした。大きな変化を必要とせずに時の試練に耐えることができる堅実でエレガントなもの。
このZ80 CPUエミュレーターには、T-Stateレベルまで精度を達成するための合理的な柔軟性を提供しながら、最高のパフォーマンスを提供する命令レベルの粒度を備えた古典的なデザインがあります。
命令レベルの粒度は、いくつかの明確に定義されたケースを除き、特定の命令の実行がすべての内部Mサイクルが処理されるまで停止できないことを意味します(つまり、命令はマイクロ操作に分割されません)。さらに、レジスタは命令ごとに1回のみ変更され、T-Stateカウンターは通常、完全な命令が実行された後に更新されます。
とはいえ、指示、フラグ、メモリアクセス、割り込み、クロックサイクルなどは、利用可能な技術文書、Z80および電子シミュレーションに関する数十年にわたる研究の後に行われた調査結果に従って正確にエミュレートされます。そして、もちろん、エミュレータは、3つの主要なテストスイートすべてを含む、これまでに書かれた最も徹底的なテストに合格します。
この一連のプログラムは、エミュレーターの著者がCPUエミュレーションの信頼性の望ましいレベルに到達するのを支援することを目的としています。含まれる各プログラムは、テストされた各Z80命令を使用して網羅的な計算を実行し、結果をZilog Z80 CPUで実際のSinclair ZXスペクトル48Kから得た値と比較し、検出された偏差を報告します。
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オペコード範囲のいくつかを簡単に実行します。プログラムのテスト結果は、NEC D780C-1 CPUの結果と比較されますが、Simon Conwayは他のいくつかのZ80クローンを親切にテストし、同じ結果を確認しました。
z80tests.tap | |
Frank CringleのZ80命令セットエクササイザーは、すべてのZ80オプコードを実行し、テストのサイクルを介してそれらを配置し、実際のZ80でコードを実行した結果と実際の結果を比較しようとします。エクササイザーには、フランクのYaze(さらに別のZ80エミュレータ)が付属しています。しばしば追跡するのは難しいので、ジョナサン・グラハム・ハーストンはここでそれをまとめ、いくつかの変換をしました。 Yazeの最新リリースは、Andreas GerlichのWebサイトで入手できます。
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 libz80Z80ライブラリを必要とするソフトウェアを構築する必要がある場合は、開発パッケージもインストールします。
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/z80Windows用の事前に構築されたバイナリは、ダウンロードページで利用できます。
パッケージを構築するには、cmake v3.14以降が必要になります。オプションでは、ドキュメントをコンパイルするには、doxygen、sphinx、呼吸の最近のバージョンが必要です。また、PDF形式でドキュメントを生成する場合は、システムにPDFサポートを備えたLATEXがインストールされていることを確認してください。
エミュレータには、Zetaに含まれるいくつかのタイプとマクロが必要です。これは、ほとんどのCコンパイラとの互換性を保持するために使用される依存関係のないヘッダーのみのライブラリです。 Zetaをインストールするか、ソースコードTarballをZ80プロジェクトまたはその親ディレクトリのルートディレクトリに抽出します。ゼータは唯一の依存関係です。エミュレータは自立型の実装であるため、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プラットフォームにダイナミックライブラリインストール名のディレクトリ部分を指定します(インストールされている共有ライブラリ用)。
デフォルトで定義されていません。
-DCMAKE_INSTALL_PREFIX="<path>"
インストールプレフィックスを指定します。
デフォルトは"/usr/local" (UNIXおよびUNIXのようなオペレーティングシステム)です。
パッケージ固有のオプションにはZ80_が付いており、2つのグループに分けることができます。最初のものは、ライブラリのソースコードとは関係のない側面を制御します。
-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形式のドキュメントのSphinxテーマを指定します。
デフォルトは""です(デフォルトのテーマを使用)。
-DZ80_WITH_CMAKE_SUPPORT=(YES|NO)
Cmake Config-Fileパッケージを生成してインストールします。
デフォルトはNOです。
-DZ80_WITH_HTML_DOCUMENTATION=(YES|NO)
HTML形式でドキュメントを構築してインストールします。
ドキシゲン、スフィンクス、呼吸が必要です。
デフォルトはNOです。
-DZ80_WITH_PDF_DOCUMENTATION=(YES|NO)
ドキュメントをPDF形式で構築してインストールします。
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です。
パッケージ固有のオプションの2番目のグループは、オプションの機能を有効にするマクロを事前に定義することにより、ライブラリのソースコードを構成します。
-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 retnの代わりにretiとして構成します。
デフォルトはNOです。
-DZ80_WITH_ZILOG_NMOS_LD_A_IR_BUG=(YES|NO)
Zilog Z80 NMOSに影響を与えるバグの実装を構築します。これにより、 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ジェネレーターにのみ必要です。使用--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
パッケージには、主要なテストスイートの最も関連性の高いCP/MおよびZXスペクトルバージョンを実行できるtest-Z80というツールが含まれています。 -DZ80_WITH_TESTS=YESでビルドシステムを構成して、そのコンパイルと-DZ80_FETCH_TEST_FILES=YES必要なファームウェアとソフトウェアをダウンロードします。また、Patrik Rakのテストに合格できるようにするには、Z80ライブラリを-DZ80_WITH_Q=YESで構築する必要があることに注意してください。
パッケージを構築したら、すべてのテストを実行するには、次のように入力してください。
./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)さまざまなCPUバリアントをエミュレートするtest-Z80によって生成された完全なログはこちらから入手できます。
注記
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 Releasebuild-and-test-z80.sh build-and-test-z80.bat
Z80ライブラリには、開発のためにインストールする必要があるCmakeベースのプロジェクトに統合するための構成パッケージが含まれています。 find_packageを使用して、 Z80パッケージを見つけます。これにより、 Z80インポートされたライブラリターゲットが作成されます。これにより、必要な推移的なリンク依存関係が搭載されます。オプションで、リンク方法は、 SharedコンポーネントまたはStaticコンポーネントのいずれかを指定することで選択できます。
例:
find_package (Z80 REQUIRED Shared)
target_link_libraries (your- target Z80)コンポーネントとして指定されていない場合、リンク方法はZ80_SHARED_LIBSに従って選択されます。このオプションが定義されていない場合、config-fileはシステムにインストールされているライブラリのタイプを使用し、共有バージョンと静的バージョンの両方を見つけた場合、 BUILD_SHARED_LIBSリンクするものを決定します。
Z80ライブラリをCmakeサブプロジェクトとして埋め込むには、ZetaとZ80のソースコードターボール(またはそれぞれのリポジトリのクローン)を別のプロジェクトのサブディレクトリに抽出します。次に、親プロジェクトで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両方が以下に説明した最初の2つに従います。残りのマクロは、 Z80.cをコンパイルするときにのみ関連します。
#define Z80_EXTERNAL_HEADER "header-name.h"
#includeに唯一の外部ヘッダーを指定し、他のすべてを交換します。
このマクロを事前に定義して、エミュレータが使用する外部タイプとマクロを定義するヘッダーファイルを提供するため、プロジェクトがゼータに依存しないようにします。 Z80.cプロジェクトの一部としてコンパイルするとき、または(タイプがバイナリ互換性を破らない場合) <Z80.h>を含めて事前に構築されたZ80ライブラリとのリンクの場合に使用できます。
#define Z80_STATIC
パブリックシンボルの可視性を制限します。
このマクロは、 Z80.c静的ライブラリとして構築したり、プロジェクトの一部として直接コンパイルしたり、Z80ライブラリの静的バージョンとリンクしたりする場合に必要です。これらのいずれの場合も、 "Z80.h"または<Z80.h>を含む前に、このマクロが定義されていることを確認してください。
#define Z80_WITH_LOCAL_HEADER
Z80.c <Z80.h>の代わりに#include "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 cmosで動作するかを発見するために。 16ccf/scf命令をテストするため。 12、23ccf/scf命令の不安定な行動に関する彼の研究。ccf/scf命令の不安定な動作を調査するのに役立ちました。ccf/scf命令の動作を解読するため。 15、30ccf/scf命令の不安定な行動に関する彼の研究。ccf/scf指示に関する彼の研究。 2、3reti/retn指示がマスク可能な割り込みの受け入れを延期することを発見するため。 34ccf/scf指示に関する彼の研究。 36Copyright©1999-2024 Manuel Sainz de Baranda YGoñi。
このライブラリはフリーソフトウェアです。フリーソフトウェア財団の条件、ライセンスのバージョン3、または(オプションで)後のバージョンのいずれかが公開しているように、GNU以下の一般公開ライセンスの条件の下で、再配布したり、変更したりできます。
このライブラリは、それが有用であることを期待して配布されますが、保証はありません。商品性や特定の目的に対するフィットネスの暗黙の保証さえありません。詳細については、GNU以下の一般公開ライセンスを参照してください。
このライブラリとともに、GNU Lesser一般公開ライセンスのコピーを受け取っているはずです。そうでない場合は、https://www.gnu.org/licenses/を参照してください。
GNU以下の一般公開ライセンスの条件がこのライブラリの使用を妨げるプロジェクト、または商用製品のソースコードの不要な公開を必要とするプロジェクトは、特別なライセンスを申請する場合があります。