Библиотека Z80 реализует быстрый, маленький и точный эмулятор Zilog Z80. Он эмулирует все, что известно на сегодняшний день об этом процессоре, включая незарегистрированное поведение, MEMPTR, Q и Special Reset. Он также имеет честь быть первым проектом с открытым исходным кодом, который обеспечил полную эмуляцию режима прерывания 0.
Исходный код написан в ANSI C для максимальной переносимости и широко прокомментируется. Цель состояла в том, чтобы написать хорошо структурированную, простой для понимания программного обеспечения; Что -то солидное и элегантное, что может выдержать испытание временем без необходимости серьезных изменений.
Этот эмулятор процессора Z80 имеет классический дизайн с гранулярностью на уровне инструкций, который обеспечивает наилучшую производительность, в то же время предлагая разумную гибкость для достижения точности до уровня Т-состояния.
Гранулярность уровня инструкции подразумевает, что, за исключением нескольких четко определенных случаев, выполнение данной инструкции не может остановиться, пока не будут обработаны все его внутренние М-циклы (т.е. инструкции не разделены на микрооперации). Более того, регистры изменяются только один раз на инструкцию, а счетчик Т-состояния обычно обновляется после выполнения полной инструкции.
Тем не менее, инструкции, флаги, доступ к памяти, прерывания, тактовые циклы и т. Д. Точно эмулируются в соответствии с доступной технической документацией, результатами, сделанными после десятилетий исследований по Z80 и электронным симуляциям. И, конечно же, эмулятор проходит наиболее исчерпывающие тесты, написанные на сегодняшний день, включая все три основных тестовых люкса:
Этот набор программ предназначен для того, чтобы помочь авторам эмулятора достичь желаемого уровня подлинности эмуляции ЦП. Каждая из включенных программ выполняет исчерпывающее вычисление, используя каждую из протестированных инструкций Z80, сравнивает результаты со значениями, полученными из реального Sinclair ZX Spectrum 48K с ЦП Zilog Z80, и сообщает о любых обнаруженных отклонениях.
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 (английский, русский) , которые находятся на месте, а также краткий пробег через несколько диапазонов OpCode CBh/DDh/FDh . Результаты теста в программе сравниваются с результатами из процессора NEC D780C-1, но Саймон Конвей любезно протестировал несколько других клонов Z80, подтверждая те же результаты.
z80tests.tap | |
Набор инструкций Фрэнка Крингла «Набор инструкций Z80» пытается выполнить каждый Z80 Opcode, проведя их через цикл тестов и сравнивая результаты с фактическими результатами, выполняя код на реальном Z80. Упражнение поставляется с Язе Фрэнка (еще один эмулятор Z80). Часто трудно отследить, поэтому Джонатан Грэм Харстон собрал его здесь, а также некоторые обращения. Последний релиз 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 и Breathe, чтобы скомпилировать документацию. Кроме того, убедитесь, что у вас есть латекс с поддержкой PDF, установленной в вашей системе, если вы хотите создать документацию в формате PDF.
Эмулятор требует некоторых типов и макросов, включенных в Zeta, библиотеку, содержащую только заголовки, используемая для сохранения совместимости с большинством компиляторов C. Установите Zeta или извлеките его исходный код в корневой каталог проекта 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_ и могут быть разделены на две группы. Первый контролирует аспекты, не связанные с исходным кодом библиотеки:
-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 (флаги автоконфигурации). Если вы получите ошибки линкера, установите эту опцию на "" .
-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>]"
Укажите тему SPHINX для документации в формате HTML.
По умолчанию "" (используйте тему по умолчанию).
-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)
Установите стандартные текстовые README HISTORY распространяемые с помощью пакета: AUTHORS , COPYING , COPYING.LESSER 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)
Включите дополнительные уведомления для любой инструкции reti или retn , выполненной во время ответа режима прерывания 0.
По умолчанию 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 NMOS, что приводит к сбросу флага P/V при принятии маскируемого прерывания во время выполнения инструкций ld a,{i|r} .
По умолчанию 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, которые игнорируют CMAKE_BUILD_TYPE (например, Xcode и Visual Studio). Используйте --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 --stripBuilding-and-install-Z80.sh
Пакет включает в себя инструмент под названием test-Z80 , способный выполнять наиболее соответствующие версии спектра CP/M и ZX основных испытательных люксов. Настройте систему сборки с помощью -DZ80_WITH_TESTS=YES , чтобы включить его компиляцию и -DZ80_FETCH_TEST_FILES=YES для загрузки необходимого прошивки и программного обеспечения. Также обратите внимание, что библиотека 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) Полные журналы, сгенерированные test-Z80 , эмулирующие различные варианты процессора, доступны здесь:
Примечание
Ошибки CRC в журналах варианта NEC NMOS являются нормальными и соответствуют значениям, полученным на реальном оборудовании. Вариант 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 и 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 . Если эта опция не определена, конфигурация использует тип библиотеки, которая установлена в системе, и, если он находит как общие, так и статические версии, BUILD_SHARED_LIBS определяет, с каким из них связан.
Чтобы встроить библиотеку Z80 в качестве подпроекта CMAKE, извлеките тарболы исходного кода Zeta и Z80 (или клонировать свои соответствующие репозитории) в подкаталог другого проекта. Затем используйте add_subdirectory в родительском проекте, чтобы добавить дерево исходного кода Z80 в процесс сборки (NB, подпроект Z80 автоматически найдет Zeta и импортирует его в виде библиотеки интерфейсов).
Желательно настроить библиотеку Z80 в CMakeLists.txt родительского проекта. Это не позволит пользователю указать параметры конфигурации для подпроекта 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 Инструкция ведет себя на CMO Zilog Z80. 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 y Goñi.
Эта библиотека - это бесплатное программное обеспечение: вы можете перераспределить его и/или изменить ее в соответствии с условиями GNU меньшей общедоступной лицензии, опубликованной Фондом Free Software Foundation, либо версией 3 лицензии, либо (по варианту) любой более поздней версии.
Эта библиотека распространяется в надежде, что она будет полезна, но без каких -либо гарантий; даже без подразумеваемой гарантии торговой точки зрения или пригодности для определенной цели . Смотрите GNU меньшую общую публичную лицензию для получения более подробной информации.
Вы должны были получить копию GNU меньшей общей публичной лицензии вместе с этой библиотекой. Если нет, см. Https://www.gnu.org/licenses/.
Проекты, в которых условия GNU меньшей общей публичной лицензии предотвращают использование этой библиотеки или требуют нежелательной публикации исходного кода коммерческих продуктов, могут подавать заявку на специальную лицензию.