В статье могут встречаться страшные картинки, не оптимальные схемы, неверные решения. Если вы к этому готовы и вам это интересно добро пожаловать под кат.
PS. я знаю про существование psio, и эмуляторы консолей, но мне был интересен процесс.
1. Попытка первая, изучение схемы
В общем двадцать лет назад там где я жил интернета, можно сказать не было. Найти в нем, что-то тоже было сложней. Но тогда были достаточно интересные книги. Одну, из которых мне и удалось раздобыть. А именно «Игровые приставки. Ремонт и обслуживание». Где и была найдена схема PS1. После изучения схемы, а ещё и под влиянием того, как она была разбита в этой книге, в голове созрела мысль, что проще всего «эмулировать» микросхему CXD2545.
Задача не казалась особо сложной и сигналов, которые надо было эмулировать, было не так и много около пятнадцати. Мне казалось, что приставка посылает управляющие команды, а этот чип выдает данные с нужного сектора компакт диска. В целом я был не очень далек от правды. Добравшись до интернета, я смог найти даташит на CXD2545. Правда, в очень ужасном качестве, в виде очень кривого скана с бумаги. Но в целом стало понятно для чего нужны все сигналы, и примерный протокол их работы. Потом я увидел список команд, которые понимает этот чип, и понял, что не осилю. Так как на тот момент помигать светодиодом на AVR был подвиг. Ну и у меня не было самой PS1, и мощной AVRки тоже не было. И так идея ложится в долгий ящик первый раз.
2. Попытка номер два, через много лет
Всё что описано дальше актуально для плат с низкой степенью интеграции SCPH-5XXX и ниже.
2.1 Что предстоит эмулировать
Прошло много лет, я успел поработать админом, обзавестись паяльной станцией, платой DE1 от Terasic, логическим анализатором и самой PS1. И время от времени на ней поигрывал, но во в ней таки додох лазер, так что FF IX я пройти смог, а финальную заставку смотрел уже на ютубе. Потому что, вот не могла она прочитать заставку финальную, хотя на PC диск читался идеально. И тут вспомнилась давняя идея. И после непродолжительных поисков в инете был найден уже в нормально качестве даташит на CXD2545. И также стало понятно, что именно надо делать со всеми(почти со всеми как я ошибался насчет SENS) управляющими сигналами. Все сигналы можно разделить на: передачу данных, передачу данных субканала, статусные и управляющие:
Передача данных:
Пин | Название | Предназначение |
---|---|---|
47 | CDBCLK | Тактирование данных |
45 | CDLRCK | Данные какого звукового канала передаются, левый/правый |
46 | CDDATA | Сами биты данных |
56 | С2PO | Указание на наличии ошибки в блоке данных |
72 | EMPH | Аудиоданные были подвержены предусилению/предискажению |
Передача данных субканала:
Пин | Название | Предназначение |
---|---|---|
78 | SQCK | Тактирование данных |
77 | SUBQ | Биты данных субканала |
74 | SCOR | Выдает импульс при поступлении новых субканальных данных(не совсем верно но об этом потом) |
Статусные сигналы:
Пин | Название | Предназначение |
---|---|---|
80 | SENS | Очень мудреный статусный пин, на которые выводится очень много сенсорной информации. |
83 | SCLK | Иногда работает в паре с SENS(реально не видел такого) |
— (SSTP) | CS(в книге) | Используется чтобы понимать что каретка привода пришла в нулевое положение |
Управляющие сигналы:
Пин | Название | Предназначение |
---|---|---|
88 | CLOK | Тактовый сигнал шины команд. |
86 | DATA | Биты данных для управляющий команд |
87 | XLAT | Защелкивание команды в регистре управления |
Есть ещё некоторые сигналы но они не особо интересны и нужны(ну по крайней мере сейчас).
2.2 Логический анализатор, и анализ полученных данных
2.2.1 Подготовка
Сигналы, которые нужно было поглядеть, были известны. Как они должны выглядеть было написано в даташите. Теперь оставалось проверить, как оно всё выглядит на самом деле и как приставка общается с этим контроллером. И тут надо сказать отдельное спасибо инженерам Sony. На плате приставки огромное количество тестовых точек. На которые выведены почти все интересующие сигналы. Покопавшись в интернете были, найдены фото в высоком разрешении верхней и нижней сторон платы. Которые сильно упростили поиск нужных тестпоинтов. Распаял кучу проводов, которые затем вывел на колодку типа IDC и приступил к изучению.
После всех приготовлений, было снято несколько образцов работы сигналов. Всё что было использовано выкладываю на здесь, открыть логи можно при помощи фирменной утилиты от анализатора DSLogic. Но надо учитывать, что по каким то причинам которые я уже не могу вспомнить, хотя анализатор и 16 канальный я не делал захват линий данных с сидирома. Возможно мне показалось что там в принципе нет ничего интересного. Поэтому смотрите аннотацию сигналов где что. Также следует учитывать что у меня оказался убит седьмой канал на анализаторе поэтому сигнал SCOR хватался не криво и через раз, но это не особо мешало.
2.2.2 Анализ
Для начала я захватил событие чтение оглавления диска(TOC) на двух дисках. И посмотрел что получилось.
Начнем с данных ибо тут никаких сюрпризов не было. Мы должны видеть вот такую картину:
Сигнал WDCK у нас не используется. А так имеется 24 бита сигнала, на каждый канал, записанные от старшего к младшему, при этом первые 9 бит одинаковы. Мне кажется что первые 8 бит вообще не используются дальше, но я не проверял. А вот так видим на анализаторе:
Пины 3,4,8 всё сходится с даташитом. Надо также учесть, что тактовая частота, и сигнал указания канала передаются даже если данных с сидирома не идёт.
Дальше данные субканала. Здесь по больше части тоже без сюрпризов.
На линии SCOR появляется импульс в момент когда привод встречает так называемую последовательность S0 или S1 при чтение фрейма с диска, что это я, возможно расскажу, но если говорить упрощенно это метка начала сектора. После этого сигнал SUBQ должен перейти в высокое состояние, это говорит о том, что есть готовые данные в буфере субканала. Дальше при помощи SQCK мы по одному биту вытаскиваем 96 бит данных, из них к субканалу относятся первые 80 бит, последние 16 это какой то PeakMeter скорей всего он имеет адекватные значения только для аудио-сд. Последние 16 бит могут иметь и другие значения, но я не видел вариантов, чтобы приставка переключалась в другой режим. Да я говорил почти без сюрпризов, но сюрпризы таки были:
Как видим здесь читается 18 бит, что очень странно, но в последствии мы разберемся, что это такое. И не мусор ли это вообще.
А вот тут начинается уже интересное а именно управляющие сигналы. По даташиту эту выглядит так:
То есть загоняем биты по одному от младшего к старшему, а сигнал XLAT защелкивает полученную комбинацию и отсылает на исполнение. Это позволяет делать переменную длину параметров команды,
Что видим на самом деле:
Вроде бы всё так, но мне совершенно непонятно было зачем ещё шлются байты 0x50 и 0xA0 но не защелкиваются(а надо внимательно даташит было читать, но это же, так скучно). В общем шлёт да и шлёт, с кем не бывает.
И остаются последние два сигнала SENS и SCLK:
По описанию в русскоязычных источниках SENS работает вместе с SCLK но SCLK ни разу не поменял свое состояние. По даташиту:
SENS output to CPU.
Причем я прочитал даже как оно работает без SCLK и всё равно не понял почему же оно так ведет. Почему меняет состояние когда вздумается. И в голове мелькнула шальная мысль, что нога болтается в HI-Z состоянии и просто ловит наводки от соседних пинов. Для теста подтянул пин к земле привод даже не стал раскручивать диск. Подтянул в VCC и всё отлично работало. Это была моя первая серьёзная ошибка которая в будущем потрепала нервы. Но об этом позже.
2.2.3 Выводы
После просмотра сигналов и чтения даташита. Было понятно, что это относительно низкоуровневая микросхема. Цель, которой управлять механикой привода, и выдавать данные, полученные с диска. Ни про какие сектора это чип знать не знает, за это отвечает внешний чип, также как и за указания, куда позиционировать лазер. Причем не указание точного места позиционирования, а по принципу левей/правей в поисках нужных данных, на основе полученных данных субканала.
Задача эмуляции это микросхемы выглядела не очень сложной. Принимать команды, и эмулировать на выходе данные субканала, и данные привода. Доверить всё это дело я решил плате DE1. Во-первых, она у меня была. Во-вторых, валялась без дела. Ну и третьих мне показалось, что FPGA просто идеально подходит для таких дел, это оказалось правдой. К тому же там уже есть слот для SD карты, откуда и собирался брать данные для эмуляции. В общем задачей номер один стало проэмулировать, чтение оглавление диска. А для этого нужно было понять как оно формируется,. но об этом поговорим в следующей части.
Комментарии (25)
akhalat
13.05.2022 18:10+2скорей всего он имеет адекватные значения только для аудио-сд
На PS1 очень много игр хранят музыку именно как аудио-сд.
А вообще для PS1 есть PSIO, не вы автор? ))VBKesha Автор
13.05.2022 18:13+1А вообще для PS1 есть PSIO, не вы автор? ))
Нет там автор не я и там другой принцип работы.
DrMefistO
13.05.2022 21:02Автор PSIO - Sybdyn. Это и на сайте указано
akhalat
14.05.2022 02:25+3Автор PSIO — Sybdyn. Это и на сайте указано
И, человек не может быть на хабре под другим ником?
Строго говоря, и так ясно было, что скорее всего псио не от автора статьи, спросил больше в шутку. Ну и как своеобразное признание, ибо масштаб задачи тот же.
shiru8bit
13.05.2022 18:11+3Странно, я всегда ожидал, что эмулятор привода на PS1 работал бы на уровне подмены дисковых процедур BIOS, а не на физическом уровне самого привода. Но так даже круче.
VBKesha Автор
13.05.2022 18:16+2Это тоже вариант, скорей всего его как раз и использует PSIO. Но когда я начинал делать всё это я про PSIO даже не слышал. Ну и плюс ко всему игры ведь могут и мимо биоса работать, дергая напрямую контроллер CD-Rom.
VelocidadAbsurda
13.05.2022 19:32+5Недавно автор Xstation (давно существующий эмулятор с идеей как в данной статье) продемонстрировал эмуляцию на ещё более низком уровне — эмулятор подключается вместо механической части, по сигналам на мотор/головку определяет желаемую приставкой позицию на диске и выдаёт поток как с фотоприёмника — вот это уже совсем сурово!
VBKesha Автор
13.05.2022 19:37+2Вообще эта идея давно и мной обдумывалась. И есть идея тоже такое реализовать. Но я никак не могу заставить себя сделать плату с CXD2545 и обвязкой для привода, чтобы всё это отлаживать. Хотя признаюсь хардкора там может быть предостаточно особенно в плане тайминга EFM потока.
Кстати а есть ссылка на демонстрацию?VelocidadAbsurda
13.05.2022 23:14+4Нашёл: https://mobile.twitter.com/_ramapcsx2/status/1508835394489655297
Одной из основных трудностей автор называет моделирование поведения привода для «угадывания» запрашиваемой позиции. Примерно представляю трудности - управление ориентируется на обратную связь, при промахе выдаёт воздействия пропорционально величине промаха, если модель откликается не так как родная механика - всё это запросто уйдёт в осцилляции.
VBKesha Автор
14.05.2022 00:42+3управление ориентируется на обратную связь, при промахе выдаёт воздействия пропорционально величине промаха
Вообще насколько я понял принципы позиционирования. То там всё немного не так. Учитывая что в механике грубого позиционирования стоит обычный коллекторный двигатель. То о точности речи не идёт, пылинка попала, смазка загустела итд. В целом это заслуживает отдельной статьи но надо таки изготовить плату с CXD2545 и обвязкой чтобы наглядно это показать.
Насколько я понял всё это. Если кратко, то на диске трек идёт по спирали, между дугами спирали, лежат куски равномерного отражающие(без разметки). Луч когда движется просто поперек диска, неминуемо натыкается на эти промежутки. И чип считает сколько их прошло, в зависимости от этого понимает нужно ехать дальше или нет. Там конечно есть обработка инерции головки(об этом наверно в 3 части) но она достаточно примитивна сделана.
Ну и по сути обратная связь это субканальные данные. Когда приводу надо сдвинуть головку далеко от текущей позиции, он двигает её на примерно нужное количество треков, потом пробует читать сектор, смотрит как точно попал, и потом уже к нужному сектору идет короткими шажками.
А вот то что по идее этому чипу нужно достаточно точная частота сигнала, и он как раз таки через PWM точно пытается подстроить скорость диска, может стать куда большей проблемой ИМХО. Чтобы сказать точней надо ставить много экспериментов.HardWrMan
14.05.2022 08:53+4Нет, не так. Мотор двигает голову грубо, линза вычитывает трек точно. Т.е., мелкие шаги делает линза, а не мотор. По идее, каждый "шаг" мотора это доступ к некоторой ширины кольца, спиральки которой выбирает уже линза. И это всё видно при наблюдении за работой привода.
Собственно, способность линзы выбирать несколько рядом лежащих колец спирали и позволяет применить достаточно дешёвую механику. Другое дело я видел музыкальный центр, где линза ходила строго вертикально, т.е. только для фокуса. А вот каретка приводилась в движение соленоидом, как в жёстких дисках. И этот привод позиционировал на новую песню меньше секунды, даже если она была через весь диск от текущей. Но такой привод в массы не выпустить, балалайка где он стоял была достаточно дорогой.
PS Я сам задумывался об ODE уровня механики, т.к. не хотел вторгаться в схему материнки приставки.
VBKesha Автор
14.05.2022 13:14+2Нет, не так. Мотор двигает голову грубо, линза вычитывает трек точно. Т.е., мелкие шаги делает линза, а не мотор. По идее, каждый «шаг» мотора это доступ к некоторой ширины кольца, спиральки которой выбирает уже линза. И это всё видно при наблюдении за работой привода.
Вообще я примерно это и хотел сказать. Но CXD2545 в любом случае использует ещё и TZC сигнал который генерируется при пересечении лазером двух треков. И при длинных перемещениях когда используется чисто траверс мотор, прошивка SUB-CPU мониторит сигнал COUT чтобы понимать сколько треков примерно уже пролетели.
А не просто полает что за такое то время мы пролетаем столько то треков.
engine9
14.05.2022 08:22+1Плюс в том, что останется теплое знакомое из детства жужжание привода и звук раскрутки шпинделя.
VelocidadAbsurda
15.05.2022 11:26Нет, эмулятор подключается взамен механики (её он и эмулирует по сути).
akhalat
14.05.2022 07:49+2Касательно PS1 ещё интересный вопрос: как именно была устроена защита дисков от копирования и проверка на лицензию. В зарубежных статьях, которые смотрел на данную тему, все до сих пор темнят и не раскрывают детали по полной, несмотря на то, что прошло почти 30 лет. Непонятно чего боятся, но факт есть фактом. Тогда как ещё в 90-е одна компания, эту защиту таки поломала, и использовала для выпуска дисков-взломщиков, не одобренных Сони. Детальный обзор на эту тему, с обилием тех. деталей, было бы очень интересно увидеть.
HardWrMan
14.05.2022 08:57+10Да там всё тупо - так называемый вобблинг. Это когда радиальное смещение дорожки модулируется сигналом, в данном случае ASСII последовательность одного из вариантов букв SCEE/SCEA/SCEU (что означает Sony Computer Entertainment Europe/Asia/USA) в модуляции манчестера. И вот по причине того, что линза отслеживает положение дороги то на соленоиде её поперечного смещения появляется сей сигнал, а модифицированный контроллер привода этот сигнал обнаруживает и выдаёт на особую ножку, которую считывает уже процессор. На эту ножку и цепляют этот самый модчип, который долбит туда все комбинации, пока процессор не примет свою.
PS Модулируется не весь диск, а только область рядом с TOC. И т.к. манчестер там около 1к бод, то этот код слышно, если придвинуть ухо к приводу в самом начале загрузки лицензионного диска. Слышно как гудок тональности сквозь остальные механические шумы привода.
Radisto
14.05.2022 09:05+1Хабр - торт! Спасибо!
HardWrMan
14.05.2022 09:26+4И, кстати, именно потому, что сначала проверяется защита, после проверки которой выводится соответствующая PS надпись (SCEE/SCEA/SCEU) а только затем вычитывается и запускается сам диск и появилась самая примитивная возможность "взлома": диск сваппинг. Это когда открываем крышку, фиксируем кнопку закрытия зубочисткой, вставляем оригинальный диск, (оригинальные демодиски были практически с каждой приставкой в комплекте), включаем, ждём надпись PS и быстренько меняем диск на ходу. Да это стресс для механики привода (останавливать мотор на ходу - стресс для него и для драйвера) и иногда для диска (привод на подушечках и особо азартные игроки при вставлении диска сильно нажимают на него, прижимая к корпусу приставки, и ещё толкают, помогая раскручиваться, что в итоге выливается в концентрические потёртости и царапины на рабочей стороне диска). Тем не менее, этот метод был в ходу до чиповки.
akhalat
14.05.2022 17:29Спасибо! Да, вспомнил что читал как раз про этот wobble. В частности на psx-scene был неплохой топик, но увы тот форум всё.
А про anti-modchip и lubcrypt, хотя бы в общих чертах, можете рассказать?
Любили устраивать такие подлянки на поздних годах жизни консоли, и особенно в PAL регионе. Притом самые интересные случаи были, не когда игра сразу показывала ошибку защиты от копирования и отказывалась запускаться, а когда сперва всё шло нормально, а где-то на середине защита срабатывала и ломала прохождение неявным образом: например, препятствуя получению ключевого предмета. Можно было часами мучаться, не зная в чём подвох.HardWrMan
14.05.2022 18:06+1Нет, ничего не могу сказать про антимодчип и libcrypt, хотя и читал и слышал что-то про это. PS это не моя стезя, я больше по FC/NES/Dendy да Sega Megadrive.
Pab10
Интересно, но читается с трудом :) Реквестирую редактуру!