В детстве у меня была PlayStation 1 (PS1). Одна из первых, если не самая первая моя консоль, сильно повлиявшая на моё будущее.
Я увлёкся компьютерами благодаря тому, что играл в видеоигры и занимался их моддингом. Хотя в детстве я не был достаточно умён, чтобы модифицировать игровые консоли, мой отец с этим неплохо справлялся. Он модифицировал мою PS1, добавив на заднюю панель небольшой переключатель, позволявший запускать записанные на болванки игры. Как говорится, яблоко от яблони недалеко падает.
Перенесёмся в день сегодняшний: у меня уже нет моей первой PS1. Припоминаю, что некоторые игры перестали загружаться и я купил себе PS2. Поэтому зачем хранить старую консоль? Оказалось, это нужно из-за ностальгии и воспоминаний. Мы скучаем о том, чего больше нет.
Недавно друг подарил мне PS1. И так началось моё приключение: как мне модифицировать эту штуку?
DRM консоли Playstation 1
Если упростить, то принципы работы DRM консоли PS1 таковы:
- Sony «запекла» в официальные игры PS1 строки (например,
SCEA
,SCEI
,SCEE
, или, в редких случаях,SCEW
); они находятся на дорожках, которые не может воссоздать обычное устройство считывания. В этом видео и этом посте подробно рассказывается о процессе. - Контроллер CD-привода ищет эти строки, чтобы подтвердить официальность диска. Когда контроллер принимает решение о том, является ли диск официальным, основной процессор считывает это решение и действует соответствующим образом.
- Если строка не найдена или повреждена, то PS1 понимает, что диск не является подлинной игрой для PS1. Однако поскольку PS1 должна учитывать ошибки считывания с диска, есть значительный коридор возможностей для того, чтобы пройти проверку подлинности.
- Поскольку регион (A — Америка, I — Япония, E — Европа и W — комплект разработки Net Yaroze), а также подлинность записаны в одну строку, Sony убила одним выстрелом двух зайцев, реализовав разделение по регионам вместе с защитой от копирования.
Если вам нужно подробное исследование, то можно почитать посты The Old Crow, страницу документации No$PSX или этот Modchip FAQ
Принцип работы модчипов PSX заключается в электрическом препятствовании выходному сигналу, сгенерированному находящимся в приводе CD, и инъекции нового, фальшивого сигнала в микроконтроллер CD. Благодаря этому PS1 начинает верить, что любой вставленный диск является подлинным, и продолжает загрузку.
Позже Sony добавила более сложные проверки, например:
- Проверка магических строк во время самой игры, а не при запуске
- Изменение всего процесса, чтобы его было сложнее обойти простой передачей правильных строк.
Однако современные модчипы способны с этим справляться. Модчипы, работающие в условиях такой обновлённой защиты, называют «stealth modchips», потому что консоль вообще не может их обнаружить.
Существующие типы модчипов
Первый модчип, ставший, так сказать, «open source», был получен реверс-инжинирингом человеком по имени «The Old Crow». Любопытно, что The Old Crow специализируется в электронных музыкальных синтезаторах, а не хакинге видеоигровых консолей. В каком-то смысле, от этого модчипа пошло большинство остальных модчипов. Изначально он выполнил реверс-инжиниринг коммерческого модчипа PS1, спроектированного западным инженером, работавшим в китайской компании.
Сегодня сообщество использует три основных модчипа:
- Multimode 3 (MM3)
- Mayumi v4
- PSNee
Каждый из них имеет свои плюсы и минусы, но в целом их можно описать так:
- MM3 — самый распространённый модчип PS1, используемый сегодня. Его единственный недостаток заключается в том, что в нём применён встроенный генератор, который может рассинхронизоваться с генератором колебаний, находящимся в CD-приводе. В таком случае достаточно просто перезагрузить консоль, чтобы попробовать считывание заново.
- Mayumi v4 пытается использовать генератор колебаний самого CD-привода. Это снижает вероятность возникновения рассинхронизации; однако считается, что Mayumi v4 довольно сложно устанавливать.
- PSNee — это модчип с открытым исходным кодом, первым автором которого был TheFrietMan. Его разработка позже была продолжена другими людьми. Похоже, он довольно неплохо работает на всех моделях Playstation 1/PSOne. Судя по коду, могу предположить, что он пытается определить, на каком этапе процесса загрузки находится PS1, чтобы начать инъекции фальшивых строк
SCEX
. К сожалению, PSNee сложен в установке. Схемы его установки ужасны и рядом не стоят со схемами для MM3 и Mayumi. Я создал разводку выводов Attiny45, но в конечном итоге решил работать с MM3 и Mayumi, потому что это проще.
Создание модчипа
[Прим. пер.: здесь в оригинале статьи была ссылка на страницу продажи модчипа автора на Ebay, но торговая площадка, похоже, не любит товаров такого рода, и страница уже закрыта.]
При наличии нужных инструментов создать модчип PS1 довольно просто. В этом туториале мы сосредоточимся на создании модчипов MM3 или Mayumi v4.
Хотя у меня есть Arduino, я предпочитаю использовать чипы MM3 и Mayumi, а не PSNee. Если вы хотите создать модчип PSNee, то можете воспользоваться инструкциями по прошивке файла .ino в Attiny.
Вам потребуются:
- Микрочип PIC12F508
- PICkit 3
- Также скачать и установить MPLAB IPE из пакета MPLAB X IDE.
- Какие-нибудь провода и монтажная плата (breadboard) для соединения PIC с PICkit.
- HEX-коды для выбранного вами модчипа (представлены ниже).
Во многих туториалах рекомендуется PIC12C508. Это старая модель, и если у вас нет её запасов, то продолжать её использовать необязательно. HEX-коды, работающие с 12C, подходят и для 12F.
Для начала можно взглянуть на ИС и определить, какая нога за что отвечает. Нога рядом с вдавленным кружком — это Pin 1. Противоположная нога — это Pin 8.
Это DIP-чип. Я случайно приобрёл SOIC-8 (т.е. чип с поверхностным монтажом), поэтому мне пришлось припаять его к монтажной плате, но обычно этого можно избежать.
Можно подключить его к монтажной плате, а затем соединить с Pickit в соответствии со схемами ниже. Нужно обеспечить следующее соединение (остальные контакты пока не используются):
- PICKit 1 ⟷ IC 4 (VPP)
- PICKit 2 ⟷ IC 1 (VDD)
- PICKit 3 ⟷ IC 8 (VSS)
- PICKit 4 ⟷ IC 7 (ICSPDAT)
- PICKit 5 ⟷ IC 6 (ICSPCLK)
PICKit 3 слева, PIC12F508 справа.
После подсоединения чипа подключите PICKit к компьютеру и запустите MPLAB IPE. В разделе
Device
выберите PIC12F508
.Перейдите в
Settings > Advanced Mode
. По умолчанию в Advanced Mode
используется пароль microchip
. Не рекомендую его менять, даже не знаю, зачем вообще есть такая возможность.Перейдите во вкладку
Power
слева и включите Power Target Circuit from Tool
.Вернитесь на вкладку
Operate
и нажмите Connect
.Скачайте соответствующий HEX-код для вашего чипа и консоли. Для каждого региона консоли он свой.
- MM3 для американских консолей
- MM3 для европейских консолей
- MM3 для японских консолей
Также при желании можно использовать Mayumi v4 на PIC12F508.
- MayumiV4 для американских консолей
- MayumiV4 для европейских консолей
- MayumiV4 для японских консолей
В файле
Source
выберите своей HEX-код.Нажмите большую кнопку
Program
.Вы должны увидеть нечто подобное:
2018-06-20 20:48:02 -0400 - Loading hex file. Please wait...
Loading code from /Users/kchung/Repositories/PsNeePy.wiki/hexcodes/mm3/MM3USA.HEX...
2018-06-20 20:48:03 -0400 - Hex file loaded successfully.
2018-06-20 20:48:20 -0400 - Programming...
Device Erased...
Programming...
The following memory area(s) will be programmed:
program memory: start address = 0x0, end address = 0x1e7
configuration memory
Programming/Verify complete
2018-06-20 20:48:25 -0400 - Programming complete
При желании можно нажать на кнопку
Verify
, чтобы убедиться в правильности прошивки. Вывод должен выглядеть примерно так:2018-06-20 20:50:10 -0400 - Verifying...
Verifying...
The following memory areas(s) will be verified:
program memory: start address = 0x0, end address = 0x1ff
configuration memory
User Id Memory
Verification successful.
2018-06-20 20:50:13 -0400 - Verify complete
Далее можно припаять чип к вашей PSX в соответствии со схемами из Интернета. Лично я пользовался превосходными схемами Уильями Куэда и рекомендую их вам.
Создание нового модчипа PS1
Изучая все эти модчипы, я подумал, что было бы здорово читать код на Python вместо ассемблера и C, поэтому приступил к портированию PSNee на Python.
При помощи MicroPython и ESP8266 мы можем создать модчип, который способен дистанционно обновляться и модифицироваться через WiFi чипа ESP8266.
По сути, это самая первая PS1 с функцией WiFi!
На фотографии выше (SCPH-7501) ESP8266 находится в верхнем левом углу, его разъёмы направлены вверх. Провода подключены к разъёмам и идут под CD-приводом к монтажной плате в нижнем правом углу.
К монтажной плате подключены провода, припаянные к нужным точкам MM3 и помеченные соответствующими номерами контактов. Благодаря использованию этой монтажной платы я могу тестировать создаваемые мной модчипы. Это гораздо быстрее, чем каждый раз припаиваться к плате.
Мой модчип (названный PsNeePy) выложен на Github: https://github.com/ColdHeat/PsNeePy.
Хотя моя тестовая консоль довольно плохо читает диски и редко загружает игры, модчип работает.
Чаще всего можно понять, что модчип работает (если не считать функций сокрытия от консоли), если он доходит до чёрного экрана с логотипом Playstation, поскольку это означает, что процессор посчитал игру подлинной.
Однако поскольку код основан на старой версии PSNee, «стелс»-функции, похоже, не работают на некоторых более новых версиях PS1.
В первую очередь я создал этот модчип как proof of concept и, скорее всего, не буду особо его поддерживать. Хоть я и не рекомендую его использовать, надеюсь, он понравится сообществу, и оно поможет совершенствовать его. Несмотря на то, что PSX уже мертва, её сообщество довольно активно.
С помощью PsNeePy можно удалённо обновлять ESP8266 по WiFi, выполнять удалённую отладку, а также производить сброс чипа. Раньше я много работал с PS1, и такой современный способ оказался довольно удобным.
Удалённое управление модчипом.
Спасибо анонимному другу за мою PS1, Sharan за ремонт моей PS1, Уильяму Куэду за превосходные схемы, AssemblerGames за качественную информацию, хоть они и не приняли меня на свой форум, а также PSXDEV за ответы на мои вопросы.