На этом этапе начинается самое сложное.
Написание каждой инструкции ядра Z80 не так сложно; это в основном скучно.

Понимание того, почему программа не запускается, дает сбой или зависает, является настоящей проблемой. И в текущем состоянии у меня много ромов, которые не запускаются, вылетают или зависают. И у нас 335 диких опкодов.

Еще одно замечание: при реализации кодов операций я заметил, что некоторые фрагменты кода некоторых ромов часто используют «семейство» кодов операций (0xfd, 0xcb и т. д.). Так же, как кодеры обнаружили этот тип кода операции и захотели использовать их все.

Хорошо, вернемся к работе.
Одна из наиболее очевидных проблем эмулятора (и, возможно, «легко» решаемая) заключается в том, что некоторые ромы отображают мусор на экране в качестве фона. Например, «Шпион против шпиона»:

Возможно, я могу попробовать отладить ром «ColorCheck.sms», который имеет похожее поведение.

Хорошо, я ошибочно инициализировал vram серповидным узором (не нулями). Проклятые кодеры, которые не чистят vram.
Теперь стало намного лучше:

Хорошо, 411 опкодов позже, и все еще некоторые ромы зависают / вылетают. Действительно, это не точно. Большинство ромов перестали жаловаться на нереализованные коды операций (ну, 411 кодов операций должно быть достаточно для любой программы), а вместо этого застряли на черном экране.

Реализован бит прерывания флага состояния, и некоторые игры, которые показывали черный экран, начали работать:

(Я, очевидно, еще не реализовал переворачивание плитки, как вы можете видеть).

Наконец, после 449 опкодов загружается один из первых отлаживаемых мной ромов, SMS Test Suite:

Теперь самое время реализовать оставшиеся входы (порт AB).
После реализации только «стрелки вниз» (потому что мне лень) я могу протестировать несколько аспектов эмулятора с этим ромом (видео, аудио в будущем):

(все же вы можете заметить некоторые глюки/неперевернутые плитки).

Сейчас 00.00, и я внедрил 467 опкодов, но Z80 хочет больше.

Некоторые соображения о состоянии эмулятора на данный момент: во-первых, даже если блит идет со скоростью 60 кадров в секунду (59,922743), эмуляция медленнее, чем обычно. Моя гипотеза по этой проблеме заключается в том, что я по большей лени не стал эмулировать переменный счетчик циклов для кучи инструкций в ядре Z80. Посмотрим, устранит ли это исправление медлительность.

Кроме того, соображение по коду: даже если я планировал структуру ядра Z80 в начале, все равно остается много дублированного кода. Кроме того, на данный момент я думаю, что инструкции DDCB и FFCB следует рассматривать с уникальной функцией, потому что они кажутся совершенно зеркальными.

Хорошо, я поправил недостающие такты в некоторых инструкциях, но это не было причиной медлительности. Я просто увеличиваю счетчик H в VDP примерно в 10 раз медленнее. Я должен снова увидеть документацию о том, сколько часов Z80 использует каждая строка сканирования. Но установка этого значения на 311 (на данный момент) кажется хорошим улучшением.

Я реализовал оставшиеся кнопки пэда, так что я могу начать играть в маленькие игры:

Только сейчас заметил, что спрайты уменьшились вдвое. Проверим это позже.

Дополнительная информация о ромах «черный экран»: я заметил, переключившись на фиксированную палитру, что ромы работают и выполняют правильную программу, но плитки повреждены, и палитра остается черной, если я не форсирую ее. Может в опкодах есть ошибки, несмотря на прохождение тестов? (ответ: нет. См. последующие мысли)

Я также проверяю количество циклов в ядре Z80, поэтому исправляю кучу ошибочных подсчетов циклов. Мы на 531 реализованном опкоде.

Да, и об игре «Спасение на подводной лодке» раньше:

Теперь спрайты правильные. Спрайты были 8x16, поэтому 2-я (нижняя) половина — это верхний индекс тайла спрайта плюс один.