Perpustakaan Z80 mengimplementasikan emulator Zilog Z80 yang cepat, kecil dan akurat. Ini meniru semua yang diketahui hingga saat ini tentang CPU ini, termasuk perilaku tidak berdokumen, MEMPTR, Q dan reset khusus. Ini juga memiliki kehormatan menjadi proyek sumber terbuka pertama yang memberikan emulasi penuh dari mode interupsi 0.
Kode sumber ditulis dalam ANSI C untuk portabilitas maksimum dan dikomentari secara luas. Tujuannya adalah untuk menulis perangkat lunak yang terstruktur dengan baik dan mudah dipahami; Sesuatu yang solid dan elegan yang dapat bertahan dalam ujian waktu tanpa perlu perubahan besar.
Emulator CPU Z80 ini memiliki desain klasik dengan granularitas tingkat instruksi yang memberikan kinerja terbaik, sementara menawarkan fleksibilitas yang wajar untuk mencapai presisi ke tingkat T-state.
Granularitas tingkat instruksi menyiratkan bahwa, kecuali dalam beberapa kasus yang terdefinisi dengan baik, pelaksanaan instruksi yang diberikan tidak dapat dihentikan sampai semua siklus M internalnya telah diproses (yaitu, instruksi tidak dibagi menjadi operasi mikro). Selain itu, register dimodifikasi hanya sekali per instruksi dan penghitung T-state biasanya diperbarui setelah instruksi lengkap dieksekusi.
Yang mengatakan, instruksi, bendera, akses memori, interupsi, siklus jam, dll., Secara akurat ditiru sesuai dengan dokumentasi teknis yang tersedia, temuan yang dibuat setelah beberapa dekade penelitian tentang Z80 dan simulasi elektronik. Dan, tentu saja, emulator lulus tes paling lengkap yang ditulis hingga saat ini, termasuk ketiga suite tes utama:
Rangkaian program ini dimaksudkan untuk membantu penulis emulator mencapai tingkat keaslian emulasi CPU yang diinginkan. Masing -masing program yang disertakan melakukan perhitungan lengkap dengan menggunakan masing -masing instruksi Z80 yang diuji, membandingkan hasil dengan nilai yang diperoleh dari Sinclair ZX Spectrum 48K nyata dengan Zilog Z80 CPU, dan melaporkan setiap penyimpangan yang terdeteksi.
z80full.tap Menguji semua bendera dan register. | z80doc.tap Menguji semua register, tetapi hanya bendera yang didokumentasikan secara resmi. |
z80flags.tap Menguji semua bendera, mengabaikan register. | Z80Docflags.tap Tes hanya didokumentasikan bendera, mengabaikan register. |
z80ccf.tap Menguji semua bendera setelah menjalankan ccf setelah setiap instruksi diuji. | Z80MEMPTR.TAP Menguji semua bendera setelah mengeksekusi bit N,(hl) setelah setiap instruksi diuji. |
z80full.tap Menguji semua bendera dan register. | z80doc.tap Menguji semua register, tetapi hanya bendera yang didokumentasikan secara resmi. |
z80flags.tap Menguji semua bendera, mengabaikan register. | Z80Docflags.tap Tes hanya didokumentasikan bendera, mengabaikan register. |
z80ccf.tap Menguji semua bendera setelah menjalankan ccf setelah setiap instruksi diuji. | Z80MEMPTR.TAP Menguji semua bendera setelah mengeksekusi bit N,(hl) setelah setiap instruksi diuji. |
Suite ini melakukan serangkaian tes untuk memverifikasi dokumen MEMPTR (Inggris, Rusia) , yang tepat, serta menjalankan singkat melalui beberapa rentang opcode CBh/DDh/FDh . Hasil tes dalam program ini dibandingkan dengan yang dari CPU NEC D780C-1, tetapi Simon Conway dengan ramah menguji beberapa klon Z80 lainnya, yang mengkonfirmasi hasil yang sama.
z80tests.tap | |
Instruksi Instruksi Z80 Frank Cringle yang ditetapkan berolahraga berupaya untuk menjalankan setiap opcode Z80, menempatkannya melalui siklus tes dan membandingkan hasil dengan hasil aktual dari menjalankan kode pada Z80 nyata. Latihan ini disediakan dengan Frank's Yaze (emulator Z80 lainnya). Seringkali sulit untuk dilacak, jadi Jonathan Graham Harston menggabungkannya di sini, serta beberapa konversi. Rilis terbaru Yaze tersedia di situs web Andreas Gerlich.
zexdoc.tap Tes efek bendera yang didokumentasikan secara resmi. | zexall.tap Menguji semua perubahan bendera. |
zexfix.tap Menguji semua perubahan bendera. | zexbit.tap Menguji semua perubahan bendera dari instruksi bit . |
zexall2.tap |
Pertama, tambahkan repositori zxe dan perbarui indeks paket:
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 updateSelanjutnya, instal paket perpustakaan:
sudo apt install libz80Jika Anda perlu membangun perangkat lunak yang memerlukan perpustakaan Z80, instal paket pengembangan juga:
sudo apt install libz80-dev Pertama, tambahkan dan sinkronkan overlay zxe :
eselect repository add zxe git https://github.com/redcode/zxe-gentoo-overlay.git
emaint sync --repo zxeKemudian instal perpustakaan:
emerge emulation-libs/z80brew install redcode/zxe/z80Binari pra-dibangun untuk Windows tersedia di halaman unduhan.
Anda akan membutuhkan CMake v3.14 atau lebih baru untuk membangun paket dan, secara opsional, versi terbaru dari Doxygen, Sphinx dan bernafas untuk menyusun dokumentasi. Juga, pastikan Anda memiliki lateks dengan dukungan PDF yang diinstal pada sistem Anda jika Anda ingin menghasilkan dokumentasi dalam format PDF.
Emulator memerlukan beberapa jenis dan makro yang termasuk dalam Zeta, perpustakaan hanya header yang bebas ketergantungan yang digunakan untuk mempertahankan kompatibilitas dengan sebagian besar kompiler C. Instal Zeta atau ekstrak Tarball kode sumbernya ke direktori root proyek Z80 atau direktori induknya. Zeta adalah satu -satunya ketergantungan; Emulator adalah implementasi berdiri bebas dan karena itu tidak tergantung pada perpustakaan standar C.
Setelah prasyarat terpenuhi, buat direktori dan jalankan cmake dari sana untuk menyiapkan sistem pembuatan:
mkdir build
cd build
cmake [options] < Z80-project-directory > File build yang dihasilkan dapat dikonfigurasi dengan menyampaikan opsi ke cmake . Untuk menampilkan daftar lengkap yang tersedia bersama dengan pengaturan mereka saat ini, ketik yang berikut:
cmake -LAH -N -B .Jika ragu, baca dokumentasi CMake untuk informasi lebih lanjut tentang opsi konfigurasi. Berikut ini adalah beberapa opsi standar CMake yang paling relevan:
Menghasilkan perpustakaan bersama daripada perpustakaan statis.
Standarnya adalah NO .
-DCMAKE_BUILD_TYPE=(Debug|Release|RelWithDebInfo|MinSizeRel)
Pilih jenis build (konfigurasi) untuk menghasilkan.
Standarnya adalah Release .
-DCMAKE_INSTALL_NAME_DIR="<path>"
Tentukan bagian direktori dari nama instalasi pustaka dinamis pada platform Apple (untuk pustaka bersama yang diinstal).
Tidak ditentukan secara default.
-DCMAKE_INSTALL_PREFIX="<path>"
Tentukan awalan instalasi.
Standarnya adalah "/usr/local" (pada sistem operasi Unix dan Unix).
Opsi khusus paket diawali dengan Z80_ dan dapat dibagi menjadi dua kelompok. Yang pertama mengontrol aspek yang tidak terkait dengan kode sumber perpustakaan:
-DZ80_DEPOT_LOCATION="<location>"
Tentukan direktori atau URL dari depot yang berisi file uji (yaitu, firmware dan perangkat lunak yang diperlukan oleh alat pengujian).
Standarnya adalah "http://zxe.io/depot" .
-DZ80_FETCH_TEST_FILES=(YES|NO)
Salin atau unduh file uji dari depot ke direktori build.
Standarnya adalah NO .
-DZ80_INSTALL_CMAKEDIR="<path>"
Tentukan direktori untuk menginstal paket CMake Config-File.
Standarnya adalah "${CMAKE_INSTALL_LIBDIR}/cmake/Z80" .
-DZ80_INSTALL_PKGCONFIGDIR="<path>"
Tentukan direktori untuk menginstal file pkg-config.
Standarnya adalah "${CMAKE_INSTALL_LIBDIR}/pkgconfig" .
-DZ80_NOSTDLIB_FLAGS=(Auto|"[<flag>[;<flag>...]]")
Tentukan bendera linker yang digunakan untuk menghindari tautan terhadap perpustakaan sistem.
Standarnya adalah Auto (bendera autoconfigure). Jika Anda mendapatkan kesalahan linker, atur opsi ini ke "" .
-DZ80_OBJECT_LIBS=(YES|NO)
Bangun emulator sebagai pustaka objek.
Opsi ini lebih diutamakan daripada BUILD_SHARED_LIBS dan Z80_SHARED_LIBS . Jika diaktifkan, sistem build akan mengabaikan Z80_WITH_CMAKE_SUPPORT dan Z80_WITH_PKGCONFIG_SUPPORT , karena tidak ada pustaka atau file dukungan yang akan diinstal.
Standarnya adalah NO .
Bangun emulator sebagai perpustakaan bersama, bukan statis.
Opsi ini lebih diutamakan daripada BUILD_SHARED_LIBS .
Tidak ditentukan secara default.
-DZ80_SPHINX_HTML_THEME="[<name>]"
Tentukan tema Sphinx untuk dokumentasi dalam format HTML.
Standarnya adalah "" (gunakan tema default).
-DZ80_WITH_CMAKE_SUPPORT=(YES|NO)
Hasilkan dan instal paket CMake Config-File.
Standarnya adalah NO .
-DZ80_WITH_HTML_DOCUMENTATION=(YES|NO)
Bangun dan instal dokumentasi dalam format HTML.
Dibutuhkan doxygen, sphinx, dan bernafas.
Standarnya adalah NO .
-DZ80_WITH_PDF_DOCUMENTATION=(YES|NO)
Bangun dan instal dokumentasi dalam format PDF.
Dibutuhkan doxygen, sphinx, napas, dan lateks dengan dukungan PDF.
Standarnya adalah NO .
-DZ80_WITH_PKGCONFIG_SUPPORT=(YES|NO)
Hasilkan dan instal file PKG-Config.
Standarnya adalah NO .
-DZ80_WITH_STANDARD_DOCUMENTS=(YES|NO)
Instal dokumen teks standar yang didistribusikan dengan paket: AUTHORS , COPYING , COPYING.LESSER , HISTORY , README dan THANKS .
Standarnya adalah NO .
-DZ80_WITH_TESTS=(YES|NO)
Bangun Alat Pengujian.
Standarnya adalah NO .
Grup kedua opsi khusus paket mengkonfigurasi kode sumber perpustakaan dengan mendahului makro yang memungkinkan fitur opsional:
-DZ80_WITH_EXECUTE=(YES|NO)
Bangun implementasi fungsi z80_execute .
Standarnya adalah NO .
-DZ80_WITH_FULL_IM0=(YES|NO)
Bangun implementasi penuh dari mode interupsi 0 daripada yang dikurangi.
Standarnya adalah NO .
-DZ80_WITH_IM0_RETX_NOTIFICATIONS=(YES|NO)
Aktifkan pemberitahuan opsional untuk setiap instruksi reti atau retn yang dieksekusi selama respons mode 0 interupsi.
Standarnya adalah NO .
-DZ80_WITH_Q=(YES|NO)
Bangun implementasi Q.
Standarnya adalah NO .
-DZ80_WITH_SPECIAL_RESET=(YES|NO)
Bangun implementasi reset khusus.
Standarnya adalah NO .
-DZ80_WITH_UNOFFICIAL_RETI=(YES|NO)
Konfigurasikan instruksi tidak berdokumen ED5Dh , ED6Dh dan ED7Dh sebagai reti , bukan retn .
Standarnya adalah NO .
-DZ80_WITH_ZILOG_NMOS_LD_A_IR_BUG=(YES|NO)
Bangun implementasi bug yang mempengaruhi Zilog Z80 NMOS, yang menyebabkan bendera P/V diatur ulang ketika interupsi yang dapat disembunyikan diterima selama pelaksanaan instruksi ld a,{i|r} .
Standarnya adalah NO .
Pemelihara paket didorong untuk menggunakan setidaknya opsi berikut untuk perpustakaan bersama:
-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
Akhirnya, setelah sistem build dikonfigurasi sesuai dengan kebutuhan Anda, membangun dan menginstal paket:
cmake --build . [--config (Debug | Release | RelWithDebInfo | MinSizeRel)]
cmake --install . [--config < configuration > ] [--strip] Opsi --config hanya diperlukan untuk generator cmake yang mengabaikan CMAKE_BUILD_TYPE (misalnya, Xcode dan Visual Studio). Gunakan --strip untuk menghapus informasi debugging dan simbol non-publik saat menginstal build non-debug dari perpustakaan bersama.
Gunakan yang berikut untuk membangun emulator sebagai perpustakaan bersama dan menginstalnya bersama dengan file pengembangan menjadi $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-in-z80.sh
Paket ini mencakup alat yang disebut test-Z80 yang mampu menjalankan versi spektrum CP/M dan ZX yang paling relevan dari suite uji utama. Konfigurasikan sistem build dengan -DZ80_WITH_TESTS=YES untuk mengaktifkan kompilasi dan -DZ80_FETCH_TEST_FILES=YES untuk mengunduh firmware dan perangkat lunak yang diperlukan. Perhatikan juga bahwa perpustakaan Z80 harus dibangun dengan -DZ80_WITH_Q=YES untuk dapat lulus tes Patrik Rak.
Setelah Anda membangun paket, ketik yang berikut untuk menjalankan semua tes:
./test-Z80 -p depot/firmware -p depot/software/POSIX -p " depot/software/ZX Spectrum " -a Alat ini mendukung opsi dan dapat menjalankan tes secara individual (tipe ./test-Z80 -h untuk bantuan). Jika Anda lebih suka menjalankan semua tes melalui CTEST, gunakan perintah ini:
ctest --verbose --build-config (Debug | Release | RelWithDebInfo | MinSizeRel) Log lengkap yang dihasilkan oleh test-Z80 meniru berbagai varian CPU tersedia di sini:
Catatan
Kesalahan CRC dalam log varian NEC NMOS adalah normal dan cocok dengan nilai yang diperoleh pada perangkat keras nyata. Varian ST CMOS saat ini sedang diselidiki.
Gunakan yang berikut untuk membangun dan menguji emulator:
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
Perpustakaan Z80 mencakup paket konfigurasi file untuk integrasi ke dalam proyek berbasis CMAKE yang harus diinstal untuk pengembangan. Gunakan find_package untuk menemukan paket Z80 . Ini menciptakan target perpustakaan impor Z80 , yang membawa dependensi tautan transitif yang diperlukan. Secara opsional, metode tautan dapat dipilih dengan menentukan komponen Shared atau Static .
Contoh:
find_package (Z80 REQUIRED Shared)
target_link_libraries (your- target Z80) Ketika tidak ditentukan sebagai komponen, metode tautan dipilih sesuai dengan Z80_SHARED_LIBS . Jika opsi ini tidak didefinisikan, file konfigurasi menggunakan jenis pustaka yang diinstal pada sistem dan, jika ia menemukan versi yang dibagikan dan statis, BUILD_SHARED_LIBS menentukan mana yang dihubungkan.
Untuk menyematkan pustaka Z80 sebagai subproyik CMake, ekstrak tarball kode sumber Zeta dan Z80 (atau klon repositori masing -masing) ke dalam subdirektori proyek lain. Kemudian gunakan add_subdirectory dalam proyek induk untuk menambahkan pohon kode sumber Z80 ke proses build (NB, subproject Z80 akan secara otomatis menemukan Zeta dan mengimpornya sebagai perpustakaan antarmuka).
Dianjurkan untuk mengkonfigurasi pustaka Z80 di CMakeLists.txt dari proyek induk. Ini akan mencegah pengguna dari harus menentukan opsi konfigurasi untuk subproject Z80 melalui baris perintah saat membangun proyek utama.
Contoh:
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) Penting untuk mengatur opsi Z80_SHARED_LIBS . Jika tidak, CMake akan membangun jenis perpustakaan yang ditunjukkan oleh BUILD_SHARED_LIBS , yang mungkin bukan yang diinginkan.
Kode sumber emulator dapat dikonfigurasi pada waktu kompilasi dengan mendefinisikan serangkaian makro. Baik Z80.h dan Z80.c mematuhi dua yang pertama dijelaskan di bawah ini. Sisa makro hanya relevan saat menyusun Z80.c :
#define Z80_EXTERNAL_HEADER "header-name.h"
Menentukan satu -satunya header eksternal untuk #include , mengganti semua yang lain.
Predefine makro ini untuk menyediakan file header yang mendefinisikan tipe eksternal dan makro yang digunakan oleh emulator, sehingga mencegah proyek Anda tergantung pada zeta. Anda dapat menggunakan ini saat mengkompilasi Z80.c sebagai bagian dari proyek Anda atau (jika tipe Anda tidak merusak kompatibilitas biner) saat memasukkan <Z80.h> dan menghubungkan dengan perpustakaan Z80 yang sudah dibangun.
#define Z80_STATIC
Membatasi visibilitas simbol publik.
Makro ini diperlukan jika Anda membangun Z80.c sebagai perpustakaan statis, menyusunnya secara langsung sebagai bagian dari proyek Anda, atau menghubungkan program Anda dengan versi statis perpustakaan Z80. Dalam salah satu dari kasus ini, pastikan makro ini didefinisikan sebelum memasukkan "Z80.h" atau <Z80.h> .
#define Z80_WITH_LOCAL_HEADER
Beri tahu Z80.c ke #include "Z80.h" bukan <Z80.h> .
Fitur opsional dari emulator yang disebutkan dalam "Instalasi dari Sumber" dinonaktifkan secara default. Jika Anda mengkompilasi Z80.c sebagai bagian dari proyek Anda, aktifkan fitur -fitur yang Anda butuhkan dengan mendefinisikan makro aktivasi masing -masing. Mereka memiliki nama yang sama dengan yang setara dengan cmake mereka:
#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 Kecuali Z80_EXTERNAL_HEADER , makro di atas bisa kosong; Kode sumber hanya memeriksa apakah mereka didefinisikan.
Catatan
Aktivasi beberapa fitur opsional mempengaruhi kecepatan emulator karena berbagai faktor (baca dokumentasi untuk detail lebih lanjut).
Emulator ini telah digunakan oleh proyek -proyek berikut (tercantum dalam urutan abjad):
Terima kasih banyak kepada individu -individu berikut (dalam urutan abjad):
ccf/scf .ccf/scf pada perangkat keras nyata. 2, 3ccf/scf . 5, 6ccf/scf . 12out (c),0 instruksi berperilaku pada Zilog Z80 CMOS. 16ccf/scf pada perangkat keras nyata. 12, 23ccf/scf .ccf/scf .ccf/scf . 15, 30ccf/scf .ccf/scf . 2, 3reti/retn menunda penerimaan interupsi yang dapat disembunyikan. 34ccf/scf . 36Hak Cipta © 1999-2024 Manuel Sainz de Baranda y Goñi.
Perpustakaan ini adalah perangkat lunak gratis: Anda dapat mendistribusikannya kembali dan/atau memodifikasinya berdasarkan ketentuan Lisensi Publik Umum GNU yang lebih rendah seperti yang diterbitkan oleh Yayasan Perangkat Lunak Gratis, baik versi 3 lisensi, atau (di opsi Anda) versi selanjutnya.
Perpustakaan ini didistribusikan dengan harapan akan bermanfaat, tetapi tanpa jaminan apa pun; bahkan tanpa jaminan tersirat dari dapat diperjualbelikan atau kebugaran untuk tujuan tertentu . Lihat Lisensi Publik Umum GNU yang lebih rendah untuk lebih jelasnya.
Anda seharusnya menerima salinan Lisensi Publik Umum GNU yang lebih rendah bersama dengan perpustakaan ini. Jika tidak, lihat https://www.gnu.org/licenses/.
Proyek -proyek di mana ketentuan GNU Lesser General Public License mencegah penggunaan perpustakaan ini, atau memerlukan publikasi Sumber Kode Produk Komersial yang tidak diinginkan, dapat berlaku untuk Lisensi Khusus.