Super Game Boy позволяет играть в игры Game Boy на Super Nintendo. Это впечатляет, учитывая, что эти две консоли не имеют практически ничего общего. Сегодня мы рассмотрим гибридное устройство, создающее многопроцессорную машину, в которой два CPU совершенно непохожи друг на друга. А возможно, мы заставим Super Game Boy работать действительно быстро.


Это птица? Это самолёт?


Итак, Super Game Boy. Кристин Лав уже рассказала о нём довольно подробно. И мне кажется, с точки зрения эстетики, а также с точки зрения использования этого устройства разработчиками, это вполне может быть правдой. Так что прочитайте её серию статей. Мой пост от вас никуда не денется.

Вы уже вернулись? Отлично. Среди прочего, Кристин Лав рассказывает и об игре World Heroes 2 Jet. Она отмечает, что в игре использовались хитрые трюки с палитрой, благодаря которым она выглядела красиво. Здорово. К сожалению, она всё равно остаётся файтингом для Game Boy.


О, это снова Takara, та же компания, которая портировала Fatal Fury на SNES. Она выложилась на максимум с портом World Heroes 2 Jet; как писали The Cutting Room Floor, она даже добавила в игру милое сообщение «4 Mega Shock», но в финальной версии его удалили, и чтобы его посмотреть, потребуется код Game Genie.


Но мы поговорим о ROM-хаке игры, созданном участником TCRF nensondubois. По его замыслу, World Heroes 2 Jet True SGB Turbo Mode должен разогнать Super Game Boy. Возможно, вы уже слышали об этом «турбо-режиме», но для меня он оказался совершенно новым. Давайте разбираться.

Альтернатива


Ещё одно устройство, которое, как утверждается, способно изменить скорость Super Game Boy — это Super Game Boy Commander стороннего производителя контроллеров Hori. Компания Hori участвовала в разработке Super Game Boy, поэтому логично, что она хорошо в нём разбиралась. К сожалению, мой SGB выглядит так:


Предыдущий владелец контроллера пользовался им так агрессивно, что микроконтроллер с поверхностным монтажом ободрал все прокладки с одной стороны; с той же стороны нажимаются все кнопки, поэтому это довольно сложно починить, хоть я и пыталась. Так что пока он остаётся лежать в сумке. Таков риск покупки «непроверенных» товаров. Мы все знаем, что они сломаны, только не знаем, как конкретно.

Тактовые частоты


У меня Super Game Boy, выпущенный для рынка США. Он известен тем, что и так работает достаточно быстро. Послушайте этот фрагмент из The Castlevania Adventure на Super Game Boy:


А вот он на Game Boy Player для Nintendo GameCube, не имевшем проблем со скоростью. (Если вам любопытно, в нём используется популярный homebrew Game Boy Interface.)


Это может показаться неважным, но из-за разницы в скоростях не работает link cable. Но чем вызвана разница в скорости? Nintendo думала, что первые игры для Game Boy наподобие The Castlevania Adventure были слишком тормозными? Возможно, но, скорее всего, нет. Есть техническая причина.


Вот контакт 1 на плате Super Game Boy. Знатоки SNES отметят, что этот боковой сегмент обычно на большинстве игр не занят; он содержит сигналы, которые обычно не нужны. Здесь находится сигнал MASTER_CLOCK — главная тактовая частота 21,477 МГц Super Nintendo, генерируемая кварцевым генератором.

Почему 21,477 МГц? Ну, потому что это частота цветовой несущей композитного видео! А конкретно, это шестикратная частота color burst, что довольно удобно. Все остальные частоты Super Nintendo получаются из неё. Помните эти три тактовые частоты?

Частота Коэффициент Применение
21,48 МГц 1 Основной генератор, контакт 1
3,58 МГц 1/6 S-CPU Fast ROM, аппаратные регистры, color burst
2,68 МГц 1/8 S-CPU Slow ROM, RAM
1,79 МГц 1/12 Доступ к контроллерам

Кроме того, 1,79 МГц — это ещё и тактовая частота CPU NES. А, да, и всё это, в том числе скорость консоли и частота color burst, взято из стандарта NTSC и относится к Super Nintendo, продававшимся в Северной Америке и Японии. Остальной мир остался сам по себе.

Получение всех остальных частот из главной тактовой частоты имеет несколько важных преимуществ. Самое важное — нужен только один кварцевый генератор. Кроме того, благодаря этому все элементы работают прогнозируемым синхронизованным образом; каждый генератор имеет колебания, поэтому если на одной плате есть несколько тактовых частот, начинают возникать проблемы с детерминированностью.

Можно заметить, что все эти значения кратны чётным числам. Это логично, когда имеешь дело с делением тактовых частот; легко поделить тактовую частоту пополам и получить красивую целую частоту. Однако при делении на три можно получить ассиметричный тактовый импульс. В общем случае нужно сделать так, чтобы каждая фаза «вверх» и «вниз» имела одинаквую ширину, поэтому дроби 1/2, 1/4 и 1/6 предпочтительнее, чем 1/3.


Однако недостаток заключается в том, что тогда не получится делить параметры на странные дроби. То есть, конечно, можно, но это будет странно и сложно, а результаты, вероятно, окажутся не самыми лучшими. И это проблема, поскольку CPU Z80 консоли Nintendo Game Boy работает с тактовой частотой 4,19 МГц.

Почему 4,19 МГц? Ну, если точнее, то 4,194304 МГц; а 222 — это 4194304. Мы знаем, что компьютеры любят степени двойки; в Википедии утверждается, что это распространённая частота для часов реального времени, требующих больше, чем 32,768 кГц, которые использовались в Game & Watch и их советском клоне.

Вам может показаться странным, что его частота выше, чем у версии 65C816 SNES, но стоит помнить о том, что CPU наподобие 6502 обычно имеют меньшую тактовую частоту, чем CPU наподобие Z80, потому что выполняют больше действий за тактовый сигнал и разделяют его на две фазы.

Поэтому Super Game Boy должен сильно хитрить с числами.


Конкретно хитростями с числами занимается ICD2. Стандартный делитель частоты Super Game Boy делится на 5, что даёт 4,296 МГц. Можно заметить, что это неудобное чётное число для деления; не знаю, может ли выровнять это делитель частоты, или это неважно для Game Boy.

Важнее то, что делитель частоты может управляться двумя самыми младшими битами регистра на стороне S-CPU, 0x6003. Я получила значения из эмулятора byuu/ares, который считаю золотым стандартом для документации SNES.

Делитель Тактовый сигнал CPU Отличие от DMG
00 1 / 4 5,12 МГц +22%
01 1 / 5 4,30 МГц +2,5%
10 1 / 7 3,07 МГц -27%
11 1 / 9 2,39 МГц -43%

В этом посте я не буду особо рассказывать об этом, только вкратце упомяну, что в Японии Nintendo выпустила «Super Game Boy 2» — вариант с портом link cable; следовательно, он должен гораздо точнее аппроксимировать тайминг реального Game Boy. Однако Super Game Boy 2 имеет все те же возможности модификации тактовой частоты, что и оригинал. Как это получилось? Согласно информации qwertymodo, у которого есть мод для Super Game Boy, на самом деле Nintendo производила специальные генераторы, частота которых в пять раз больше частоты DMG в 4,19 МГц.

Что изменилось, почему внезапно стал важен link cable, а потому и тайминг? Появился Pokemon.

Возвращаемся к быстрому режиму


Итак, давайте рассмотрим хак nensondubois.


Возможно, вы не играли в World Heroes 2 Jet, поэтому не поймёте, что она работает быстрее, поэтому вот ещё раз аудио из Castlevania.


А теперь снова посмотрите на видео World Heroes 2 Jet. Да, она определённо работает быстрее. Но почему столько глитчей? И это справедливо практически для всех устройств. Так как у меня нет работающего SGB Commander, я сделала этот скриншот при помощи Everdrive. Так как у The Castlevania Adventure нет функциональности Super Game Boy, граница сохранилась.


Как мы видели, по умолчанию CPU Game Boy работает с частотой 4,19 МГц. Его частота кадров составляет 59,73 Гц. Частота кадров Super Nintendo равна 60,09 Гц; это немного быстрее, как и у её предшественницы. В реальности они достаточно близки; ICD2 предназначен для того, чтобы сгладить разрыв. Но работая быстрее, ICD2 и прошивка Super Game Boy работают на медленном S-CPU, поэтому не могут поспевать. Поэтому мы начинаем видеть поломанные кадры, где считываются неправильные биты, области, предназначенные для других частей экрана.

При более медленных режимах обратная проблема, похоже, не так уж важна.

Как это работает?


А что, если бы вы захотели сделать с этим что-то самостоятельно? Похоже, Nintendo не очень хотела, чтобы этим режимом пользовались. Во-первых, он доступен в системе только со стороны Super Nintendo; он не раскрыт Super Game Boy BIOS на стороне Game Boy. Но это не особо страшно; игра Game Boy, знающая о существовании Super Game Boy, может загружать код на Super Nintendo точно так же, как она может загружать графические данные, которые нужно использовать в качестве рамки. Но по сравнению с регистрами это ещё один дополнительный этап.

На самом деле, у нас есть документация, которую Nintendo предоставляла разработчикам в 1990-х. В ней регистр 0x6003 задокументирован следующим образом:


Обратите внимание, что последние два бита, управляющие делителем частоты, постоянно имеют значение 01; так как функции изменения скорости не задокументированы, я думаю, Nintendo забраковала бы любую игру для Game Boy, которая бы попыталась использовать их. (Как уже говорилось, Hori участвовала в разработке SGB.) И, разумеется, из-за глитчей самой высокой скоростью особо не воспользуешься.

Тем не менее, это отличная функция, с которой можно экспериментировать сегодня, а до недавнего времени я даже не знала о её существовании. Надеюсь, я заставлю работать свой SGB Commander; хотя кого я обманываю, скорее всего, просто придётся купить ещё один.

Комментарии (0)