В детстве у меня была крутейшая книга кодов и паролей для консолей того времени — Dendy, Sega, Super Nintendo. Мама мне тогда периодически покупала всякие энциклопедии и справочники в книжном, и вот однажды ей на глаза попалась эта брошюрка: «Игры для видеоприставок. Выпуск 1». Зная о моем увлечении видеоиграми, она решила устроить мне сюрприз, не подозревая какой артефакт достанется мне в подарок. Да, был журнал «Великий Дракон», в котором публиковались пароли на уровни и разнообразные секреты прохождения. Да, выпускались разные книжечки-сборники с подобным содержимым. Но вот эта, «Игры для видеоприставок», была поистине шедевральной; и ценной, как сундук золота. Blaster Master, Gun-Nac, Castlevania 2 — все эти игры я прошел благодаря советам из этой книги.
Помимо всего прочего, в этой книге встречались странные записи вида «Коды типа Genie». Я понятия не имел, что это за коды такие и как их вводить. Порой игра вообще не имела какой-то парольной системы, но, тем не менее, Genie-коды предлагались для применения.
Загадкой это оставалось для меня и в ту эпоху, когда появились эмуляторы. Нет, я конечно уже начал догадываться, что это какой-то особый способ взлома, по типу ArtMoney, о котором я уже знал. Но как эти Genie-коды внедрялись в игру в те времена, когда игры были на картриджах – все еще было непонятным.
Развязка наступила уже в наши дни. Буквально несколько месяцев назад мне в руки попалось устройство, внешне похожее на картридж, на лицевой наклейке которого большими красными буквами было написано «GAME GENIE», а внизу подпись «video game enhancer», и еще ниже логотип Sega Genesis. Взгляните:
Как водится, за подробной информацией я полез в вики. Но, к сожалению, русскоязычный раздел меня совершенно не порадовал, и тогда я решил обратиться к англоязычной части. Вот здесь уже было что почитать. Спешу поделиться беглым переводом.
Что такое Game Genie
Game Genie — линейка чит-устройств, разработанных компанией Codemasters, и выпускавшихся компаниями Camerica и Galoob. Первое устройство сошло с конвейера в 1990-м году и было предназначено для приставки NES. Чуть позднее подобная продукция появилась для SNES, GameBoy, Sega Genesis и Sega Game Gear. Принцип действия устройства заключался во временной модификации игровых данных, позволявший игроку читерить, манипулируя различными аспектами игры, а так же иногда предоставляя доступ к неиспользуемому контенту и функциям игры. За все время было продано около 5 миллионов устройств Game Genie. В наше время почти каждый эмулятор старых консолей имеет поддержку Game Genie кодов. К слову, в эмуляторах количество одновременно применяемых кодов чаще всего не ограничено, тогда как оригинальное устройство позволяло ввести от трех до шести кодов.
В середине 1993-го Codemasters приступили к разработке Game Genie 2, выбрав тот же Galoob для дистрибуции в Северной Америке, но в конечном счете для консолей пятого поколения так ничего и не выпустили. При этом, на рынке появились девайсы с похожими функциями — Code Breaker и GameShark, производимые другими компаниями. Бренд Game Genie в последствии был возрожден компанией Hyperkin, реализовавшей систему читов на своих консолях Retron.
Дизайн и эксплуатация
Система Game Genie представляло собой устройство, подключавшееся между картриджем и приставкой. Включив консоль, игрок попадал в меню, позволявшее ввести последовательность символов, условно называемую как «код», который служил ссылкой на адрес в ПЗУ игрового картриджа. Каждый код содержит целочисленное значение, которое считывает система вместо данных по аналогичному адресу из картриджа. Game Genie защищено патентом 5112051 «устройство сопряжения для компьютерных игровых систем», выданным 30 мая 1990 года. Срок действия патента истек 30 мая 2010, согласно текущему патентному законодательству США.
Поскольку Game Genie изменяет программный код игры, читы Genie иногда еще называют патч-кодами. Последствия применения данных кодов весьма разнообразны. В большинстве своем они дают какую-то форму неуязвимости, бесконечный боезапас, пропуск уровней и другие модификации, которые наделяют игрока большей властью, чем это задумывалось разработчиками. В редких случаях коды могут сделать игру более сложной, или даже открыть какие-то дополнительные возможности и контент, который был выброшен разработчиками и сделан недоступным в обычной игре.
Game Genie продавался со специальным буклетом-справочником, который содержал в себе известные на тот момент коды для системы. Конечно, со временем открывались новые читы и выходили новые игры, что привело компанию Galoob к созданию платной подписки, по которой абоненты ежеквартально получали обновление базы кодов. Плюс, в некоторых геймерских журналах, например GamePro, появились небольшие спонсорские колонки, публиковавшие читы для новых игр.
Создать новый код можно путем случайного перебора. Этот эволюционный подход эквивалентен использованию случайных операций POKE. Чаще всего такие сгенерированные случайным образом коды либо никак не влияют на игру, либо ведут к зависанию геймплея, либо могут привести к повреждению сохранений. Но если повторять процесс много-много раз полезные изменения все же могут обнаружиться. Каждый придуманный код перед вводом в Game Genie необходимо где-то записать, так как само устройство не позволяет посмотреть во время игры что же за код был введен. Найдя таким образом какой-нибудь полезный чит, путем небольших изменений из него можно получить массу других читов, так же положительно влияющих на геймплей. С эрой эмуляторов, ROM-файлов и декомпиляторов стал возможен процесс реверс-инжиниринга игр для поиска конкретных данных для модификации. Полученную информацию можно уже непосредственно переводить в Game Genie коды.
Правовые вопросы
Появление Game Genie для консоли NES было встречено компанией Nintendo достаточно жестко. Она подала на Galoob в суд, утверждая, что та нарушает закон об авторском праве. В тот же момент продажи Game Genie были приостановлены в США…но не в Канаде! Во многих игровых журналах того времени Galoob размещала рекламные баннеры своей продукции со слоганом «Спасибо, Канада!» Однако, спустя какое-то время, суд разобрался и вынес решение — работа Game Genie никакого авторского права не нарушает. После чего Nintendo уже никак не могла воспрепятствовать продажам Game Genie в США. Интересный факт: перед тем как Nintendo подала иск, Galoob предлагала компании официально лицензировать ее продукт, но японская корпорация отказалась от этого предложения.
Примерно в то же время, когда шло разбирательство по делу, Nintendo пыталась иными путями помешать работе Game Genie. В частности, в поздних играх применялась проверка контрольных сумм, позволявшая определить действия читов. Данная проверка работала, но не всегда. А в дальнейшем новые ревизии устройств Game Genie и вовсе научились скрывать от подобных проверок модификации кода игры.
С другой стороны, компания Sega официально поддерживала использование Game Genie. Правда, с небольшими условиями. Устройство не должно было работать с играми, имевшими функцию сохранения (батарейку): Phantasy Star или серия Shining Force, например.
Принцип работы
Как уже говорилось, устройство Game Genie позволяет применять к играм различные чит-коды, которые приводят к изменениям, не задуманных разработчиками – больше жизней, больше предметов, изменение геймплея и прочее. Game Genie для NES в качестве кода позволяет ввести последовательность только из букв. Коды могут быть двух типов: 6-символьные и 8-символьные. Коды переводятся в адреса данных игры (верхняя половина адресного пространства 0x8000-0xFFFF), что позволяет Game Genie обманывать центральный процессор, подменяя ожидаемые байты на свои. Подобный процесс делает бесконечным количество возможных кодов, которые можно открыть.
Коды из 6 символов
Шестисимвольный код переводится в 15-разрядный (не 16!) адрес и 8-битный байт данных. Адрес 15-ти разрядный по той причине, что 15-й бит всегда выставлен как единица, для того чтобы ссылаться на верхнюю часть адресного пространства процессора. Когда CPU пытается считать адрес памяти, указанный в чит-коде, Game Genie перехватывает процесс и подставляет байт из кода, вместо фактического байта из ПЗУ картриджа.
Чтобы расшифровать Game Genie код для NES, для начала переведем каждый символ в его шестнадцатеричный эквивалент, используя вот эту таблицу:
A 0x0
P 0x1
Z 0x2
L 0x3
G 0x4
I 0x5
T 0x6
Y 0x7
E 0x8
O 0x9
X 0xA
U 0xB
K 0xC
S 0xD
V 0xE
N 0xF
Дальше наступает сложная часть. Существует большое число «связанных» битов, сдвигая которые мы можем получить адрес и данные из Game Genie. Возможно, это и делает подобные чит-коды более магическими. Например, имея два кода, один из которых дает 5 жизней на старте игры, а второй 9 жизней, и видя разницу между ними только в одном символе кода, даже неопытный геймер догадается поменять этот символ на любой другой из доступных, чтобы получить в итоге количество жизней в диапазоне от 1-й до 16-ти.
Итак, представим каждый из переведенных в шестнадцатеричную систему символов чит-кода в виде переменных от n0 до n5. Затем используем следующий псевдокод (подразумеваю, что вы в курсе битовых операций AND (&) и OR (|), а также операций сдвига << и >>):
address = 0x8000 +
((n3 & 7) << 12)
| ((n5 & 7) << 8) | ((n4 & 8) << 8)
| ((n2 & 7) << 4) | ((n1 & 8) << 4)
| (n4 & 7) | (n3 & 8);
Алгоритм просто объединяет в себе нижние 3 бита одного полубайта (4 бита) и берет верхний бит из другого полубайта. В результате получаются другие 4 бита (3+1), которые помещаются куда-то еще. Ниже алгоритм для данных:
data =
((n1 & 7) << 4) | ((n0 & 8) << 4)
| (n0 & 7) | (n5 & 8);
Пример. Возьмем код GOSSIP (удивительно, ведь это еще и обычное слово в английском языке). Он работает в игре Ghosts’n Goblins и дает персонажу на старте игры необычное оружие. Разберем алгоритм, чтобы понять как это работает:
n0 n1 n2 n3 n4 n5
G O S S I P
0x4 0x9 0xD 0xD 0x5 0x1
0100 1001 1101 1101 0101 0001
address = 0xD1DD, data = 0x14
Мы видим, что когда CPU пытается считать данные из адреса 0xD1DD, Game Genie перехватывает процесс и возвращает байт 0x14.
Коды из 8 символов
Эти коды похожи на 6-символьные, с той лишь разницей, что существует еще значение байта сравнения, которое тоже необходимо декодировать. Скорее всего, это связано с тем, что многие игры используют мапперы памяти, которые позволяют увеличить объем данных доступных для использования. Так как игра может свопить входящие и выходящие программные банки (PRG) из адресного пространства центрального процессора, Game Genie не может просто вернуть значение данных из чит-кода, когда процессор считывает из определенного адреса. Вместо этого, когда процессор осуществляет процесс чтения с картриджа, Game Genie проверяет, равен ли адрес из картриджа значению переменной сравнения и возвращает данные из чит-кода, если это так. В противном случае возвращаются реальные данные из картриджа.
Алгоритм декодирования адрес для 8-символьного чит-кода такой же, как и для 6-ти. А вот алгоритм декодирования данных немного иной:
data =
((n1 & 7) << 4) | ((n0 & 8) << 4)
| (n0 & 7) | (n7 & 8);
И ниже алгоритм декодирования переменной сравнения:
compare =
((n7 & 7) << 4) | ((n6 & 8) << 4)
| (n6 & 7) | (n5 & 8);
Пример: чит-код ZEXPYGLA. Этот код позволяет в игре очищать ряд или колонку при совпадении трех цветов в линию, вместо изначально положенных четырех. Разберем по алгоритму:
n0 n1 n2 n3 n4 n5 n6 n7
Z E X P Y G L A
0x2 0x8 0xA 0x1 0x7 0x4 0x3 0x0
0010 1000 1010 0001 0111 0100 0011 0000
address = 0x94A7, data = 0x02, compare = 0x03
Здесь, во время считывания центральным процессором из адреса 0x94A7, проверяется наличие реального байта данных 0x03. Если все совпадает, Game Genie возвращает значение 0x02.
ЗАКЛЮЧЕНИЕ
Надеюсь, я не сильно утомил читателя своим лонгридом и информация оказалось полезной. В ближайшем будущем, на основе этой статьи я хочу сделать видеоролик, в котором с помощью более простой подачи попытаюсь рассказать об истории устройства, и о его принципах работы.