Zenki – Tenchi Meidou, последняя часть серии игр по одноименному малоизвестному японскому аниме 90-х, представляет собой виртуальную настольную игру со сложной карточной системой боя. Однако в процессе разработки эмуляторов для Super Famicom эта игра выявила уникальную проблему – при запуске она зависала на черном экране и никогда не доходила до основного игрового процесса. Это оказалось очень ярким примером того, как особенности аппаратной реализации SNES могут привести к неожиданным трудностям для эмуляторов, особенно в части взаимодействия двух центральных процессоров — основного 65816 и встроенного звукового SPC700. Причина такого затруднения кроется в уникальной архитектуре SNES и особенностях работы аудиоподсистемы, тщательно спроектированной Sony в 1990-х с использованием процессора SPC700 под руководством Кена Кутараги. АПУ (Audio Processing Unit) в SNES – это самостоятельный субсистемный блок с собственным процессором и памятью, который взаимодействует с основным CPU исключительно через специальный набор коммуникационных портов.
Эта двухпроцессорная система общается по четырём портам в каждом направлении, где записи и чтения должны строго синхронизироваться, чтобы избежать расхождений, которые могли бы привести к сбоям в работе игры. В случае Zenki – Tenchi Meidou главный процессор 65816 отправляет определённые команды на SPC700 через записи в порты памяти по адресам $2140-$2143, и в ответ ожидает конкретных данных. Проблема в том, что игра содержит код, который в цикле бесконечно ожидает появления на порте определённого значения (0xAA), отправляя при этом данные (0x10) на другой порт. SPC700, со своей стороны, находится в аналогичном цикле, пытаясь очистить и проверить состояние портов, но вычитает другое значение с портов, которые тем временем постоянно заняты значениями, отправленными основным CPU. Такая ситуация приводит к состоянию «живой блокировки» (livelock) — оба процессора бесконечно повторяют циклы ожидания и передачи без реального прогресса.
Что интереснее, при детальном анализе ассемблерных команд с обеих сторон становится очевидно, что тайминги исполнения команд на обоих процессорах чрезвычайно важны. Они работают на разных тактовых частотах – основной CPU на частоте около 3.58 МГц и SPC700 на примерно 1.02 МГц. Эмуляция пыталась симулировать работу этих процессоров с точностью до целых тактов, однако реальный аппарат ведёт себя тоньше: чтения и записи на SPC700 происходят с разной фазой внутри тактового цикла, что приводит к тому, что некоторые операции чтения предшествуют операциям записи на доли цикла.
Именно эта тонкая разница в моменте обращения к портам позволяет избежать коллизий на аппаратном уровне и корректно обрабатывать коммуникацию. Попытки исправить ошибку заняли много времени и пришли к выводу, что именно корректное моделирование временных отношений операций чтения и записи между двумя процессорами на уровне частичных тактовых циклов решает проблему. Одна из реализованных автором эмулятора русская уловка заключалась в том, чтобы при очистке портов SPC700 игнорировать некоторые записи основного CPU, тем самым создавая условие, при котором коммуникационные линии освобождаются достаточно быстро для корректного взаимодействия. Такой подход, хоть и не самый точный, позволил добиться стабильного запуска игры без негативного влияния на другие игры, требовательные к точным временам исполнения. При этом наиболее продвинутые эмуляторы SNES, такие как ares и bsnes, изначально учитывали эти особенности таймингов и вводили в свою реализацию смещение операций чтения относительно записи примерно на полтактового цикла для портов связи APU, что дало им значительно лучшее аппаратное сходство и отсутствие подобных проблем с Zenki – Tenchi Meidou.
Интересно, что подобная особенность тайминга была зафиксирована именно из-за этого случая и внесена на основании реальных замеров аппаратного поведения. В итоге рассмотрение конкретного бага в Zenki – Tenchi Meidou – это не просто описание проблемной игры, а ключ к пониманию более широкой задачи эмуляции SNES и необходимости моделирования даже мельчайших деталей аппаратной синхронизации. В двухпроцессорных системах, таких как SNES, неверные предположения о том, что операции на разных процессорах идут чередуясь просто построчно, приводят к серьезным ошибкам, которые мешают воспроизведению игр, где разработчики целенаправленно и неизбежно опирались на аппаратное поведение с тонкой синхронизацией. Полученные знания полезны не только любителям Zenki и энтузиастам ретро-игр, но и всем, кто занимается разработкой или совершенствованием эмуляторов, особенно тех, что стремятся к максимальной точности. Они служат напоминанием о том, что помимо инструкции и кода, важнейшую роль в стабильности работы игр играют аппаратные нюансы, которые нужно учитывать вплоть до субциклового уровня при правильном моделировании.
Таким образом, разбор конкретного случая в Zenki – Tenchi Meidou – это визуализация глубины исследований, необходимых для точной эмуляции классических консолей, и доказательство, что даже относительно простые коммуникационные механизмы могут стать серьёзным вызовом и заставляют разработчиков искать инновационные решения. Работа с такими проблемами приносит огромную пользу сообществу ретро-геймеров и помогает поддерживать в живых редкие проекты и системы, раскрывая всю красоту и сложность эпохи классических 16-битных консолей.