![](https://habrastorage.org/webt/os/oo/j1/osooj1ijs-ygibnyqhm-rffbtys.jpeg)
В детстве у меня была 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, спроектированного западным инженером, работавшим в китайской компании.
Сегодня сообщество использует три основных модчипа:
Каждый из них имеет свои плюсы и минусы, но в целом их можно описать так:
- 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.
![](https://habrastorage.org/getpro/habr/post_images/84d/972/252/84d9722524b3651cdac938ab505b67df.jpg)
Это 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)
![](https://habrastorage.org/getpro/habr/post_images/3c6/5b1/98b/3c65b198b17b6f3531f688eceac3a949.jpg)
PICKit 3 слева, PIC12F508 справа.
После подсоединения чипа подключите PICKit к компьютеру и запустите MPLAB IPE. В разделе
Device
выберите PIC12F508
.Перейдите в
Settings > Advanced Mode
. По умолчанию в Advanced Mode
используется пароль microchip
. Не рекомендую его менять, даже не знаю, зачем вообще есть такая возможность.Перейдите во вкладку
Power
слева и включите Power Target Circuit from Tool
.![](https://habrastorage.org/getpro/habr/post_images/fe7/c2f/5cc/fe7c2f5cc6513df61af445adb65c0622.png)
Вернитесь на вкладку
Operate
и нажмите Connect
.![](https://habrastorage.org/getpro/habr/post_images/825/d8b/fc4/825d8bfc443f3827f147a0de50b8b8b9.png)
Скачайте соответствующий HEX-код для вашего чипа и консоли. Для каждого региона консоли он свой.
Также при желании можно использовать Mayumi v4 на PIC12F508.
В файле
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.
![](https://habrastorage.org/getpro/habr/post_images/6c5/b5c/0ea/6c5b5c0eacbb6d0535c1a7aad7b185f6.jpg)
По сути, это самая первая 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, и такой современный способ оказался довольно удобным.
![](https://habrastorage.org/getpro/habr/post_images/b4b/825/a5e/b4b825a5e19bfaaa61570b17c6572a43.png)
Удалённое управление модчипом.
Спасибо анонимному другу за мою PS1, Sharan за ремонт моей PS1, Уильяму Куэду за превосходные схемы, AssemblerGames за качественную информацию, хоть они и не приняли меня на свой форум, а также PSXDEV за ответы на мои вопросы.
ZekaVasch
Надмозг стайл — "применён встроенный генератор, который может рассинхронизоваться с генератором колебаний, находящимся в CD-приводе"
Так и ощущаю вибрации сидирома о встроенного генератора колебаний
PatientZero Автор
А, допустим, колебательный контур — это такая механически трясущаяся штука?
EvilMan
Можно использовать либо кальку "осциллятор", либо более официальный вариант "тактовый генератор".