- PVSM.RU - https://www.pvsm.ru -

Эмулятор CD-Rom для SonyPlaystation который я писал больше десяти лет. Часть 1

Эмулятор CD-Rom для SonyPlaystation который я писал больше десяти лет. Часть 1 - 1Давным-давно у нас городе был игровой клуб на несколько SonyPlaystation. Где я очень по многу зависал. Там я полюбил PS1 и игры на неё. Использования CD-Rom в качестве носителя позволила привнести в игры ошеломительные по тем временам видео вставки, CD музыку в качестве оформления игрового процесса, возможность делать игры многодисковыми(с картриджами такого вроде не проворачивали), что был несомненный плюс. Но и привнесло один минус, а именно деградация лазера привода. И если в домашних условиях, возможно, это была и не большая проблема, то в игровом салоне умирали они раз в 2-3 месяца. Вот ещё там у меня родилась идея сделать эмулятор CD-Rom. И через очень много лет я таки исполнил свою мечту.

В статье могут встречаться страшные картинки, не оптимальные схемы, неверные решения. Если вы к этому готовы и вам это интересно добро пожаловать под кат.

PS. я знаю про существование psio, и эмуляторы консолей, но мне был интересен процесс.

Эмулятор CD-Rom для SonyPlaystation который я писал больше десяти лет. Часть 1 - 2

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 Логический анализатор, и анализ полученных данных

Эмулятор CD-Rom для SonyPlaystation который я писал больше десяти лет. Часть 1 - 4

2.2.1 Подготовка

Сигналы, которые нужно было поглядеть, были известны. Как они должны выглядеть было написано в даташите. Теперь оставалось проверить, как оно всё выглядит на самом деле и как приставка общается с этим контроллером. И тут надо сказать отдельное спасибо инженерам Sony. На плате приставки огромное количество тестовых точек. На которые выведены почти все интересующие сигналы. Покопавшись в интернете были, найдены фото в высоком разрешении верхней и нижней сторон платы. Которые сильно упростили поиск нужных тестпоинтов. Распаял кучу проводов, которые затем вывел на колодку типа IDC и приступил к изучению.

Впечатлительным лучше не смотреть

Эмулятор CD-Rom для SonyPlaystation который я писал больше десяти лет. Часть 1 - 5

После всех приготовлений, было снято несколько образцов работы сигналов. Всё что было использовано выкладываю на здесь [1], открыть логи можно при помощи фирменной утилиты [2]от анализатора DSLogic. Но надо учитывать, что по каким то причинам которые я уже не могу вспомнить, хотя анализатор и 16 канальный я не делал захват линий данных с сидирома. Возможно мне показалось что там в принципе нет ничего интересного. Поэтому смотрите аннотацию сигналов где что. Также следует учитывать что у меня оказался убит седьмой канал на анализаторе поэтому сигнал SCOR хватался не криво и через раз, но это не особо мешало.

2.2.2 Анализ

Для начала я захватил событие чтение оглавления диска(TOC) на двух дисках. И посмотрел что получилось.

Начнем с данных ибо тут никаких сюрпризов не было. Мы должны видеть вот такую картину:

Эмулятор CD-Rom для SonyPlaystation который я писал больше десяти лет. Часть 1 - 6

Сигнала WDCK у нас не используется. А так имеется 24 бита сигнала, на каждый канал, записанные от старшего к младшему, при этом первые 9 бит одинаковы. Мне кажется что первые 8 бит вообще не используются дальше, но я не проверял. А вот так видим на анализаторе:

Эмулятор CD-Rom для SonyPlaystation который я писал больше десяти лет. Часть 1 - 7

Пины 3,4,8 всё сходится с даташитом. Надо также учесть, что тактовая частота, и сигнал указания канала передаются даже если данных с сидирома не идёт.

Дальше данные субканала. Здесь по больше части тоже без сюрпризов.

Эмулятор CD-Rom для SonyPlaystation который я писал больше десяти лет. Часть 1 - 8 [3]

На линии SCOR появляется импульс в момент когда привод встречает так называемую последовательность S0 или S1 при чтение фрейма с диска, что это я, возможно расскажу, но если говорить упрощенно это метка начала сектора. После этого сигнал SUBQ должен перейти в высокое состояние, это говорит о том, что есть готовые данные в буфере субканала. Дальше при помощи SQCK мы по одному биту вытаскиваем 96 бит данных, из них к субканалу относятся первые 80 бит, последние 16 это какой то PeakMeter скорей всего он имеет адекватные значения только для аудио-сд. Последние 16 бит могут иметь и другие значения, но я не видел вариантов, чтобы приставка переключалась в другой режим. Да я говорил почти без сюрпризов, но сюрпризы таки были:

Эмулятор CD-Rom для SonyPlaystation который я писал больше десяти лет. Часть 1 - 9

Как видим здесь читается 18 бит, что очень странно, но в последствии мы разберемся, что это такое. И не мусор ли это вообще.

А вот тут начинается уже интересное а именно управляющие сигналы. По даташиту эту выглядит так:

Эмулятор CD-Rom для SonyPlaystation который я писал больше десяти лет. Часть 1 - 10

То есть загоняем биты по одному от младшего к старшему, а сигнал XLAT защелкивает полученную комбинацию и отсылает на исполнение. Это позволяет делать переменную длину параметров команды,
Что видим на самом деле:

Эмулятор CD-Rom для SonyPlaystation который я писал больше десяти лет. Часть 1 - 11

Вроде бы всё так, но мне совершенно непонятно было зачем ещё шлются байты 0x50 и 0xA0 но не защелкиваются(а надо внимательно даташит было читать, но это же, так скучно). В общем шлёт да и шлёт, с кем не бывает.

И остаются последние два сигнала SENS и SCLK:

Эмулятор CD-Rom для SonyPlaystation который я писал больше десяти лет. Часть 1 - 12 [4]

По описанию в русскоязычных источниках SENS работает вместе с SCLK но SCLK ни разу не поменял свое состояние. По даташиту:

SENS output to CPU.

Причем я прочитал даже как оно работает без SCLK и всё равно не понял почему же оно так ведет. Почему меняет состояние когда вздумается. И в голове мелькнула шальная мысль, что нога болтается в HI-Z состоянии и просто ловит наводки от соседних пинов. Для теста подтянул пин к земле привод даже не стал раскручивать диск. Подтянул в VCC и всё отлично работало. Это была моя первая серьёзная ошибка которая в будущем потрепала нервы. Но об этом позже.

2.2.3 Выводы

После просмотра сигналов и чтения даташита. Было понятно, что это относительно низкоуровневая микросхема. Цель, которой управлять механикой привода, и выдавать данные, полученные с диска. Ни про какие сектора это чип знать не знает, за это отвечает внешний чип, также как и за указания, куда позиционировать лазер. Причем не указание точного места позиционирования, а по принципу левей/правей в поисках нужных данных, на основе полученных данных субканала.

Задача эмуляции это микросхемы выглядела не очень сложной. Принимать команды, и эмулировать на выходе данные субканала, и данные привода. Доверить всё это дело я решил плате DE1 [5]. Во-первых, она у меня была. Во-вторых, валялась без дела. Ну и третьих мне показалось, что FPGA просто идеально подходит для таких дел, это оказалось правдой. К тому же там уже есть слот для SD карты, откуда и собирался брать данные для эмуляции. В общем задачей номер один стало проэмулировать, чтение оглавление диска. А для этого нужно было понять как оно формируется,. но об этом поговорим в следующей части.

Автор:
VBKesha

Источник [6]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/diy-ili-sdelaj-sam/375072

Ссылки в тексте:

[1] здесь: https://github.com/VBKesha/PSX_CDEMU_1/tree/main/research

[2] утилиты : https://www.dreamsourcelab.com/download/

[3] Image: https://habrastorage.org/webt/fv/zg/kn/fvzgkn4o_knrv8m2dt_jkkre5-k.png

[4] Image: https://habrastorage.org/webt/j1/00/9v/j1009v49fsy-utsvcyu7t4nf1zc.png

[5] DE1: https://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&CategoryNo=53&No=83&PartNo=1#contents

[6] Источник: https://habr.com/ru/post/653507/?utm_source=habrahabr&utm_medium=rss&utm_campaign=653507