Epsxe не сохраняет на карту памяти

Обновлено: 07.07.2024

Переназначить кнопки на другие или на геймпад можно в Config > Game Pad > Port 1 > Pad 1. Если вы настроили геймпад и аналоги, то поменяйте в правом верхнем углу вид контроллера с Digital на DualShock (переключение режимов: F5). Там же можно поставить вибрацию (Rumble): Type: DX Joy1 (для первого геймпада в ОС).

Для того что бы кнопки переназначились, удалите действующую кнопку, а затем нажмите необходимую кнопку на джостике. После того как управление настроено, просто нажмите "ОК".

Чтобы запустить игру, в ePSXe нажмите File > Run ISO* (или нажмите на иконку в Wrapper) и выберите образ игры или File > Run CDROM (или нажмите на иконку в Wrapper) для запуска с диска.


Для смены диска нажмите File > Change Disc > ISO (CDROM).

Хоть эмулятор и предлагает выбрать образ в mds/mdf формате, большинство из них он не читает. Переконвертируйте образ в cue/bin. Или монтируйте образ в виртуальный привод.

Прекратить эмуляцию Esc
Быстрое сохранение* F1
Быстрая загрузка* F3
Сменить слот F2
Быстрая прокрутка ** +
Полноэкранный / Alt+Enter
оконный режим

Быстрое сохранение/загрузка не работают с играми "несколько на одном диске". И на некоторых кривых пиратских русификациях.
Для работы "быстрой прокрутки" сначала, возможно, потребуется нажать F4. Также она не работает в плагине OpenGL1.
Из файла Read me -
F1 - "Быстрое сохранение" в выбранный слот.
F2 - Выбор слота. Максимум 5 таких слотов.
F3 - "Быстрая загрузка" из выбранного слота.
F4 - Включение/отключение ограничителя кадров.
F5 - Переключение между обыкновенным геймпадом (стандартным) и любым другим устройством, будь то Dual Shock, мышь, Gankon, и т.д.
F6 - Переключение между портами геймпадов, для которых будет применяться F5 для изменения типа устройства.
F7 - Переключение на встроенный програмный плагин.
F8 - Снимок экрана, другими словами - скриншот. Сохраняется в папку snap в папке эмулятора.

Если вы не используете ePSXe Wrapper, то вам нужно запускать спецнастройки для некоторых игр самостоятельно.

В папке _Configs также находятся настройки для игр, имеющих некоторые проблемы с эмуляцией со стандартными настройками. Просто запустите файл с названием игры и действуйте как обычно. По окончании игры просто закройте ePSXe, консольное окно закроется автоматически. Не закрывайте консольное окно самостоятельно! Это приведет к тому, что настройки от конкретной игры останутся по умолчанию.

Пояснения для некоторых настроек:
2D games - уменьшает болчность для двухмерных игр.
Если позволяют ресурсы, лучше использовать видеоплагин OGL2 и шейдер 4xMSAL.
Примеры игр: Oddworld, Castlevania: SOTN, многие RPG.
Устанавливается самый совместимый софтовый плагин, так что если игра не пойдет с этой настройкой, вряд ли она вообще пойдет. Вы также можете переключиться на софтовый плагин в любой момент клавишей F7 и не использовать эту настройку.

CDDA Music - устанавливает аудиоплагин SPU core (используемый по умолчанию в сборке). Для игр с музыкой в виде аудиотреков. Открывайте cue/ccd!
Примеры игр: Dead or Alive, Tomb Raider, Twisted Metal.
Дополнительная информация. Если вы не хотите использовать в качестве аудиоплагина SPU Core в таких играх, то нужно либо монтировать образ в эмуляторе привода (Alhohol 120% или Daemon Tools) и запускать как диск, либо использовать Mooby2 CD Disc Image Driver в качестве CD-ROM плагина (в окне выбора образа - на уровень вверх - ../, выбор диска - Alt+F).

3D с 2D фоном - лучше всего подходит для 3D игр с 2D фоном: может повысить читабельность текста, убрать обводку спрайтов (в некоторых играх), уменьшить блочность фона, но увеличивает его [фона] пикселизацию.
Примеры игр: Parasite Eve.

GunCon - устанавливает первым контроллером GunCon/Digital, можно сменить на Digital pad с помощью F5. Работает только в играх, поддерживающих его!
Примеры игр: Resident Evil: Survivor, серия Point Blank.

Mouse - устанавливает первым контроллером Мышь/Digital, можно сменить на Digital pad с помощью F5. Работает только в играх, поддерживающих её!
Примеры игр: Quake 2. Мышь на 2 порту должна быть. переключение на режим мыши - F6 потом F5.

NetPlay - альтернатива NetPlay.exe

Final Fantasy 7 - убирает зеленый обвод текстур.
Настройку следует применять при всех видах установки (стандартный (D3D, OGL1), High (OGL2), Ultra High (OGL2)).

Final Fantasy 8 - убирает обводку текстур.

Final Fantasy 9 - убирает обводку текстур.

Legend of Dragoon - убирает обводку текстур.

Xenogears - небольшие поправки изображения. Действует для всех установок.

Чтобы использовать читы в игре, выберите в качеcтве видеоплагина (Config > Video) psx emulation cheater. При игре нажмите Ctrl+G: откроется PEC. Выберите игру текущую эмулируемую игру из списка (региона игры) и коды для неё. Нажмите Send Cheats to Plugin. Чтобы убрать коды откройте PEC (Ctrl+G) и нажмите Deactivate Cheating.

ePSXe Wrapper - это "обертка" для ePSXe с быcтрым доступом к основным функциям: запуск образа, запуск с диска, выбор карты памяти, продолжение эмуляции. Также в Wrapper можно создать список игр и запускать из него, каждый раз не выбирая File > Run ISO в ePSXe. Для запуска новой игры не нужно перезапускать Wrapper.


В списке можно искать игры в поле внизу. Напишите часть имени игры и нажмите иконку поиска или Enter.
Для запуска игры из списка щелните по ней 2 раза или выберите игру и нажмите Shift+Enter.

В Wrapper также есть автоматическая загрузка необходимых настроек для игры. Можно вписать игры в cmn настройки. Для этого откройте список настроек, выберите игру, настройку и щелкните на иконку сохранения. Чтобы посмотреть как игра выглядит с той или иной настройкой, выберите игру и нажмите 2 раза по настройке с которой вы хотите запустить игру.

Удаление, копирование сейвов с карт памяти
Используйте утилиту MemcardRex в папке memcards. Или в ePSXe запустите BIOS (File > Run BIOS).

Как убрать растягивание на широкоформатном мониторе
Выберите видеоплагин OpenGL2 в Config > Video. Нажмите Configure. В полях Window size и выберите нужное разрешение 4:3 (которое равно вертикальное_разрешение_монитора*4/3 в первом поле и вертикальное_разрешение_монитора во втором. Для полноэкранного разрешения (Desktop resolution) 1920x1080 там должно быть 1440x1080, для 1680x1050 - 1400x1050, 1440x900 - 1200x900, 1366x768 - 1024x768, 1920x1200 - 1600x1200, 2560x1440 - 1920x1440, 3840x2160 - 2880x2160. И поставьте галочку Use Window size in Fullscreen (Widescreen fix). Убедитесь что переключатель (точка, radiobutton) стоит в положении Fullscreen mode.

Нет музыки
Некоторые игры используют музыку, записанную в виде аудиотреков (например Tomb Raider). Используйте аудиоплагин ePSXe SPU core или используйте настройку CDDA Music (который автоматически поставит этот плагин и при выходе из эмулятора вернет прежний), и открывайте образ только через cue/ccd!

Подключение 2 контроллеров
Настройте в Config > Game Pad > Port 2 > Pad1 - это и есть второй контроллер. Убедитесь при настройке, что в верхнем правом углу стоит Digital либо DualShock контроллер, а не Disabled.

Подключение более 2 контроллеров
В Config > Game Pad > Port 1 поставьте внизу галочку Multitap и настройте контроллеры на 1 порту. Убедитесь при настройке, что в верхнем правом углу стоит Digital либо DualShock контроллер, а не Disabled.

Не работает контроллер
Убедитесь, что у вас не стоит Multitap (Config > Game Pad > Port 1). Большинство игр его не поддерживают. Некоторые игры не поддерживают DualShock. Если вы используете геймпад с аналогами и поставили тип контроллера на DualShock, переключитесь в цифровой режим кнопкой F5. Если это не решает проблему, убедитесь, что ни одно другое окно не заслоняет окно игры, и оно находится в фокусе.

Эмулятор выдает ошибку при запуске
Скорее всего это из-за включенного DEP для всех программ. Войдите в Пуск –> Панель управления –> Система;
В открывшемся окне Свойства системы откройте вкладку Дополнительно –> Быстродействие –> Параметры…;
В окне "Параметры быстродействия" откройте вкладку "Предотвращение выполнения данных" и включите DEP только для основных программ и служб Windows или внесите ePSXe в список исключений.

Если у вас сохранились диски от соньки, то можете записать с них образ, и вам не придется вставлять каждый раз диск в дисковод. К тому-же вы можете загрузить образ к примеру на Яндекс Диск и поделится ссылочкой с другими пользователями.

Образ такого диска обычно создают с незащищенных от копирования дисков. Например, диски с MP3 файлами, диски с документами и пр. Для этого нет нужды копировать "структуру" дорожек диска и всякую служебную информацию, а значит образ такого диска будет меньше занимать места, чем образ защищенного диска. Обычно для таких целей используют образ формата ISO.

CDBurnerXP - бесплатная программа для записи CD, DVD, Blu-Ray и HD-DVD дисков, с помощью которой можно создавать загрузочные, мультисессионные диски и аудио-CD, а также записывать и создавать ISO-образы. Приложение работает со всеми видами носителей и большинством IDE, USB, Firewire и SCSI приводов.

Основные возможности программы:

  • Запись любых данных на CD-R/CD-RW/DVD+R/DVD-R/DVD+RW/DVD-RW/DVD-RAM/BD/HD-DVD, включая двухслойные носители;
  • Запись аудио-дисков из mp3, wav, ogg, flac и wma файлов;
  • Копирование дисков с данными;
  • Создание и запись ISO-файлов;
  • Преобразование nrg и bin файлов в ISO;
  • Создание загрузочных дисков;
  • Автоматическая проверка данных после записи;
  • Запись на лету с встроенной защитой опустошения буфера;
  • Создание загрузочных дисков;
  • Информация о приводе и диске;
  • Печать обложек для аудио-дисков и дисков с данными;
  • Интеграция LightScribe;
  • Поддержка командной строки;
  • Поддержка большинства IDE, USB, Firewire и SCSI приводов;
  • Мультиязычный интерфейс.

Windows 10, 8.1, 8, 7, Vista, XP

Английский, Русский, Украинский

Запись - Копирование - Образы дисков

1) Сначала в главном окне программы нужно выбрать опцию "Копировать диск".


2) Далее в настройках копирования необходимо задать несколько параметров:

  • привод: CD-Rom куда был вставлен CD/DVD диск;
  • место для сохранения образа;
  • тип образа (в нашем случае ISO).

3) Собственно осталось только подождать, пока образ ISO не будет создан. Время копирования зависит от скорости вашего привода, размера копируемого диска и его качества (если диск поцарапан - скорость копирования будет ниже).

Запись образа на диск.
Если у вас сохранилась рабочая сонька, а диски в плохом состоянии и не грузятся, то можете записать образ на диск.
1) Запускаем CDBurnerXP. Дважды кликаем на Записать ISO-образ (или выделяем Записать ISO-образ и нажимаем ОК).

2) Нажимаем на Browse… для выбора файла образа.

Указываем нужный файл.
3)Поле ISO-образ для записи заполнено, можно начинать прожиг. В этом окне вы также можете выбрать устройство записи (каким дисководом будете производить запись – если у вас их больше одного), скорость записи: 8x, 4x, 2.4x и т.д., метод и дополнительные опции
записи. Затем нажимаем Записать диск.


Дожидаемся окончания записи и извлекаем из дисковода готовый диск.

Alcohol 120%: Файл > Создание образов. Выберите привод и нажмите Далее. На следующей вкладке выберите расположение образа и его название, в качестве формата образа выберите cue и нажмите Старт.

IsoBuster: Щелкните правой кнопкой мыши на CD, выберите Извлечь CD > Raw, выберите имя образа, место для его сохранения и тип файла - bin.

UltraISO: Файл > Открыть CD/DVD. Выберите привод. Потом нажмите Файл > Сохранить как, выберите имя образа, место для его сохранения и тип файла - bin.

Не сохраняется в epsxe (не карта памяти)
Проблема с эмулем не сохраняется и не загружается по нажатии F1 F3 в игре Tomb Raider 4 (Last Revelatoin) перевод "Paradox", эмулятор epsxe 1.5.2 на 1.7.0 таже проблема.В других играх всё нормально. Система ХР SP3. Ответ: Не сохраняется в epsxe (не карта памяти)
посмотри есть ли на диске SLUS_008.85 это NTSC U/C версия, для PAL SLES_. или что-то похожее, без них, запись работать не будет. Ответ: Не сохраняется в epsxe (не карта памяти)
Такие файлы есть, в чем еще может быть причина? Может дело в кривой "локализации"? А может можно заменить эти sles и slus что бы заработало? Ответ: Не сохраняется в epsxe (не карта памяти)

хм, странно, может фикс какой мешает, у меня НТСЦ англиц, записывает.

обнаружил странную весчь, у меня теперь те игры которые не записывались, теперь записывают, правда не все, глюки что ли.

не думаю что дело в переводе, заменить можно, только потом собрать это всё, сложно может быть, и будет ли работать, а возни сколько будет.

можешь закинуть? можно по частям.

Ответ: Не сохраняется в epsxe (не карта памяти)
К сожалению выложить не могу, интернета нету (через телефон выхожу,сотовый) но на этом же сайте в разделе с русским переводом вроде такая же есть, 2 в 1 4и5 части Лары Ответ: Не сохраняется в epsxe (не карта памяти)
А и еще, почему некоторые записи на ф1 и ф3 подходят на другие диски? Ну например ставлю диск xenogears, а загружаются сохранения из legend of mana, весело конечно, но неиграбельно. Ответ: Не сохраняется в epsxe (не карта памяти)
вроде нашёл, Paradox версия.
часа через два, три, напишу, если скачается. Ответ: Не сохраняется в epsxe (не карта памяти)
У тебя образы и эмулятор должны быть расположены на одном и том же жёстком диске. Ответ: Не сохраняется в epsxe (не карта памяти)

вообще эмулятор делает дамп памяти при записи, и называет его по имени этого файла SLUS_008.85, если его нет то запись не работает, я столкнулся с этим когда играл в Томб Райдер, долго не мог понять в чём дело, потом дошло, когда заглянул в папку записи, а потом на диск.
но, очевидно, что в версии 1.7.0 применили что-то новое, скорее просто дамп, только куда, не известно, в папке sstates появляется файл DROM, только он пустой, вообщем сплошные загадки.
а нет, в 1.6.0 тоже можно записать, только обнаружил особенность, на FAT32 не сохраняется, нужен NTFS, странно это всё.



1: Во время игры жмём "Esc" затем на рабочем столе в окне "ePSXe" жмём:, "Эмуляция" наводим курсор на "Сохранить(F1)/Save(F1)" и выбераем любой слот.


2: Сохранили, жмём "Закрыть".


3: Включаем эмулятор "ePSXe".


4: В поевивщемся окне "ePSXe" жмём:, "Файл" затем "Запустить ISO/Run ISO"


5: Находим игру, жмём "Открыть".


6: Ждём 15-20секунд пока игра загрузится, после чего жмём "Esc". На рабочем столе в окне "ePSXe" жмём:, "Эмуляция" наводим курсор на "Загрузить(F3)/Load(F3)" и выбераем слот на который до этого сохранились.


7: Игра загружена с того момента где вы остановились в прошлый раз.

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



Также можно прямо во время игры нажджимать F1 для быстрого сохранения и F3 для загрузки.
Кнопка F2 служит для смены слота сохранения


а не проще-ли отфарматировать виртуальную карту памяти, и после этого при включении игры сохранять свои достижения на эту виртуалку, и играть как на настоящей консоли?

Не во всех играх можно сразу сохранится. Я предложил это как второй более быстрый способ. К тому же говорят что во время игры на эмуляторе в некоторых играх не возможно сохранится по нормальному. Поэтому я и описал этот вариант! К тому же, не все проходят игру сразу до конца. Большинство людей сохраняется и начинает играть в другие игры, и чтобы сохранится там тоже потребуется место на карте памяти, но если его там не окажется (к примеру после Diablo) то не будут же люди выходить в из игры заходить в Bios, и потеряв все свои достижения чистить КП. Поэтому всё так

Я разве что знаю, что в первом краше можно сохранятся только пройдя бонус-уровень. Других таких я не знаю))))



PS1 (она же PSX, она же PS One) это первое поколение игровых консолей PlayStation от Sony и относится к пятому поколению игровых консолей вообще. Она использует 2х скоростной привод для чтения CD. Такой большой объём данных по меркам актуального для приставки времени позволял игроделам особо не оглядываться на ограничения при создании контента для игр, что делало последние более качественными, по сравнению с играми предыдущего поколения приставок. А ещё, игры теперь могут быть длинными. И если любая игра, за редким исключением, на консолях предыдущих поколений вполне себе могла быть пройдена за одну игровую сессию, то с играми PS1 всё обстояло иначе. Для сохранения прогресса у PlayStation предусмотрены карты памяти: маленькие сменные модули энергонезависимой памяти.

Если вам интересно, как именно устроена карта памяти PlayStation 1, как она работает и как можно создать свою — добро пожаловать под кат.

Итак, карта памяти PS1 является стандартным периферийным устройством, как и весь зоопарк джойпадов, джойстиков и прочих аксессуаров. Чтобы понять, как именно она работает, нужно для начала посмотреть, что у неё внутри.



Фотография печатной платы стандартной карты памяти на 15 блоков

Как видно из фото, устройство карты очень простое: контроллер, который обслуживает запросы системы, и, собственно, энергонезависимая память, которая представлена стандартной NOR FLASH. Логически, карта памяти разбита на 15 блоков, которые могут использовать игры. Может показаться, что 15 не логично для двоичной системы, но тут противоречия нет: один блок отдан под файловую систему, там хранятся имена файлов и даже анимированные иконки, прям как потоки у NTFS. Каждый блок имеет размер 8 КиБ, 16 блоков в сумме это 128 КиБ, что и видно по маркировке FLASH памяти на фото выше.

На первых порах этого хватало всем, но потом стали появляться игры, которые использовали более одного блока за раз. Например, некоторые симуляторы, вроде Sega GT, используют 4-5 блоков, а Constructor так вообще всю карту памяти на 15 блоков. Это вынуждало покупать больше карт и ситуация грозила стать как с дискетами или картриджами. Но потом подтянулись пираты и стали выпускать карты на 2, 4 или 8 страниц разом. И переключались страницы либо по хитрой комбинации на джойпаде, либо явной кнопкой на самой карте памяти. Правда, в картах более 2х страниц применялось сжатие, и фактическое число страниц было значительно меньше, а некоторые карты могли тупо заблокироваться. И вывести их из этого состояния было очень трудно, но на что только не шли игроки ради своих сохранений. Вот типичные представители многостраничных карт памяти:



Слева карта памяти на 2 страницы, справа на 8. У правой есть аппаратная кнопка перелистывания страниц и индикатор, отображающий число от 1 до 8, который скрыт за тёмным стеклом

Небольшое лирическое отступление

Всё началось в 2001м году, когда я купил чудо диск для ПК под названием «Все эмуляторы», на котором были эмуляторы PS1 в том числе: это были Bleem! и ранний ePSXe. И мой тогдашний комп даже смог играбельно запускать мои диски от PS1! А чуть позже у меня появился модем и я узнал про DirectPad Pro. Подключение родного джойстика к компьютеру (пусть и через LPT) многого стоит. И работала эта система как на 9х так и на XP! А ещё чуть позже, уже в 2002м я узнал про Memory Card Capture Sakura! Эта программа позволяла работать с настоящими картами памяти, используя всё ту же схему подключения DirectPad Pro. Именно тогда у меня появилась идея сделать «бесконечную» карту памяти, которая бы позволяла обмениваться информацией с компьютером без необходимости дополнительных устройств. Но на тот момент у меня не было достаточно информации и доступной элементной базы, и идея оставалась лишь идеей, теплясь где-то на задворках сознания.

Прошло почти 9 лет как я осознал, что уже знаю достаточно и имею возможность, чтобы реализовать хоть какой-то вариант бесконечной карты памяти. Однако тут вступил уже другой фактор – возраст и всё что с этим связано. Времени на хобби всё меньше, забот всё больше. И вот только сейчас я могу предоставить общественности хоть какой-то результат, полноценный Proof of Concept.

Физический интерфейс

Итак, карта памяти и джойпады работают через общий интерфейс. Количество сигналов в нём 6, вот их названия и назначения:

  • SEL0 – Сигнал выбора первого порта, активный уровень низкий
  • SEL1 – Сигнал выбора второго порта, активный уровень низкий;
  • CLK – Тактовый сигнал интерфейса, пассивное состояние высокий уровень, по спаду сдвиг, по фронту защёлкивание;
  • CMD – Сигнал данных от консоли к периферии;
  • DAT – Сигнал данных от периферии к консоли;
  • ACK – Аппаратный хэндшейк, активный уровень низкий.



Отремонтированная карта памяти с 5ти вольтовой FLASH

Технические характеристики интерфейса такие:


Измеренная частота сигнала CLK является 250 кГц, что составляет 4 мкс на период.

С физическими параметрами интерфейса разобрались, теперь транспортный уровень. Опытный инженер уже заметил, что джойпад и карта памяти подключены полностью параллельно и могут конфликтовать между собой. Так и есть, для этого присутствует программный арбитраж. После активации сигнала SELn периферия продолжает молчать, но слушает первый присланный байт. Если этот байт равен 0x01, то далее активируется джойпад, а карта памяти продолжает молчать до деактивации сигнала выбора. А если байт был 0x81, то всё наоборот: карта памяти активируется, а джойпад молчит. Естественно, что хост ждёт сигнала ACK на этот байт арбитража и ждёт недолго. Это нужно для того, чтобы успеть опросить остальную периферию, если часть этой периферии отсутствует. Дело в том, что операционная система опрашивает контроллеры и карты памяти строго по сигналу обратного хода луча, или более известного как VBlank. Так принято, что игры в приставках до 5-го поколения завязаны на этот тайминг, который равен частоте кадров. А частота кадров строго стабильна и нормирована: 50 Гц для PAL и 60 Гц для NTSC. То есть период опроса джойстиков и карт памяти равен 20 мс для PAL или 16 мс для NTSC.

Итак, с арбитражем разобрались, теперь собственно верхний уровень. Какие команды понимает стандартная карта памяти PS1? Да собственно, их всего три.

  • R – 0x52 или Read. Чтение сектора карты памяти;
  • W – 0x57 или Write. Запись сектора карты памяти;
  • S – 0x53 или Status. Чтение статуса карты памяти.

Протокол работы с картой памяти


Порядок передаваемых данных в каждой команде выглядит вот так:

CMD — Данные, которые хост посылает карте.
DAT — Данные, которые карта посылает хосту.
FLAG — Текущие флаги состояния карты и результат предыдущей команды.
PRV — Предыдущие принятые данные, результат упрощения схемы в карте.
MSB — Старший байт номера сектора.
LSB — Младший байт номера сектора.
DATA — Полезные данные.
CHK — Контрольная сумма блока.
ACK — Флаг подтверждения.

Байт флагов FLAG использует следующие биты:

  • D5 – Устанавливается некоторыми картами памяти не от Sony. Назначение неизвестно.
  • D3 – Устанавливается при подаче питания и сбрасывается при любой записи. Используется для обнаружения смены карты памяти.
  • D2 – Устанавливается при ошибках записи, актуален на следующее обращение после самой операции.

Реализация своей карты памяти

Итак, это вся информация, которая необходима для создания своей карты памяти для PS1. Потенциальные узкие места следующие:

  1. При чтении необходимо время на актуализацию данных. Между номером сектора и фактической передачей данных у нас есть четыре байта, у которых мы можем немного растянуть ACK. К слову, у оригинальной карты памяти на NOR FLASH все ACK идут равномерно, у карт памяти с SPI FLASH после передачи LSB происходит задержка ACK, во время которой контроллер выставляет команду в SPI FLASH и вычитывает первый байт, а остальные он вычитывает по ходу обмена.
  2. При записи после передачи всего пакета и начала самой записи в массив требуется время, но тут система сама даёт необходимую задержку.

Первый вариант я собрал на STM32F407VG, который питается от 3,3 В, имеет SPI для PSIO, быстрый SDIO и достаточно памяти, чтобы хранить весь образ внутри себя, решая вышеупомянутые проблемы. Фотография готового устройства:



Первая версия моей карты памяти на STM32F407

Получилось быстро, надежно, но дорого. А можно сделать дешевле? Ну, что-ж, вызов принят. Учитывая специфику задачи, я выбрал STM32F042F6. Вот что получилось:



Вторая версия моей карты памяти на STM32F042

Карта у нас ведомая, поэтому стабилизация частоты внешним кварцевым резонатором не нужна, достаточно внутреннего генератора. Аппаратный SPI у этого контроллера один, поэтому я его отдал SD карте, чтобы снизить задержки на транспорт. PSIO тут будет программный.

Программная реализация

Первое, что надо сделать, это работу с SD картой в режиме SPI. Я не буду особо останавливаться на этом, это уже давно разжёвано и растаскано по интернету. Код инита, чтения и записи сектора приведён ниже.

Карта инициализируется на скорости 375 кГц (PCLK/128), а работает на 24 МГц (PCLK/2). При таких скоростях замеры показали, что SDv1 и SDHC отдают сектор в рамках 2,8 мс на всю транзакцию полностью. Это следует запомнить, т.к. важно для операции чтения PSIO.

Теперь посмотрим на PSIO. Как было уже сказано выше, он у нас в любом случае программный. Отслеживать надо только два сигнала: SEL и CLK. Первый мы будем отслеживать по обоим фронтам и делать приготовления к обмену данными:

Сигнал CLK будем ловить только по фронту. Дело в том, что STM32F042 работает всего лишь на 48 МГц и его производительность маловата для нашей задачи. И если делать прерывание по обоим фронтам, то во время пересылки байта он практически не вылезает из обработчика прерывания и всё работает прямо на грани возможности, иногда давая сбои. А если реагировать только на фронт, а ту работу, что должна быть сделана по спаду сделать в конце прерывания, то всё отлично успевает меньше, чем за 55% от периода CLK, ведь несколько проверок при этом можно выкинуть. Уверен, что если этот обработчик написать на ассемблере максимально оптимально, то он смог бы работать даже по обоим перепадам. Вот код обработчика:


Таймер TIM3 будет отвечать за генерацию ACK. Это нужно для того, чтобы во время этой задержки ядро было свободно для работы с SD картой. Обработчик прерывания от таймера вот такой:

Код достаточно комментирован и я думаю, что в особом разборе не нуждается. Отмечу лишь тот момент, что после получения второго байта номера сектора в команде чтения мы устанавливаем флаг для операции чтения с SD карты для кода, который крутится в вечном цикле функции main(). И сразу после этого четыре следующих ACK выдаются с удлинённым временем. В интерфейсе это выглядит вот так:



Скриншот из программы логического анализатора, выделяются 4 большие задержки в транзакции

В сумме набирается порядка 3,5 мс и этого с запасом хватает, чтобы алгоритм в основном коде успел считать сектор. Более того, тот код может работать только когда нет прерывания, т.е. как раз в эти большие паузы. Во время записи флаг устанавливается в самом конце и из-за того, что система даёт карте памяти отработать запись, основной код работает без помех со стороны прерываний. А теперь глянем в код основного цикла.

В вечном цикле постоянно анализируется сигнал вставления SD карты. Если её вытащить на ходу, то код отключит PSIO и PS1 «потеряет» карту. Если же карту вставить обратно (или просто подать питание со вставленной картой), то сначала будет попытка инициализировать карту функцией Card_Init(), которая вернёт тип обнаруженной карты. Это важно, потому что у SDv1 и остальных SDHC/SDXC адресация идёт различными методами. Сам код инициализации никаких секретов не несёт и подсмотрен в куче доступных в интернете примеров про FatFS и подобных проектов.

Следом за инициализацией карты вызывается хитрая функция Card_FSInit(). Это – самая главная фишка данного проекта. Дело в том, что STM32F042 скромный по возможностям и потянуть полную поддержку FatFS на необходимой скорости не сможет. Поэтому, я придумал такой метод: файл образа у нас всегда 128 КиБ, поэтому, необходимо знать только 256 секторов по 512 байт, в каждом из которых будет ровно 4 сектора нашей карты памяти PS1. Таким образом, мы делаем следующее:

  1. Анализируем сектор с адресом LBA равным нулю на предмет MBR. Если это действительно MBR, то получаем новый сектор, где находится MBS.
  2. Получив адрес предполагаемого MBS (это может быть 0, если нет MBR или какое-то число, если MBR есть), мы начинаем его анализ на предмет принадлежности одной из FAT: FAT12, FAT16, FAT32 или vFAT.
  3. Если сектор прошёл проверку, то мы забираем из него информацию о структуре и в корневом каталоге ищем элемент с именем файла. В данном случае это ‘MEMCRD00.BIN’.
  4. Если такой файл находится, то проверяем его размер – он должен быть строго фиксирован 0x20000 байт. Если всё так – получаем номер первого кластера.
  5. Если мы дошли до этого пункта, то у нас уже есть вся необходимая информации для построения списка физических LBA секторов, где расположен наш образ. Пробегая по цепочке FAT и используя информацию о структуре из MBS, заполняем таблицу из 256 номеров LBA секторов.

Скажу честно, так как это всего лишь PoC, то здесь реализован поиск только у FAT16. FAT12, наверное, и не надо поддерживать – microSD таких малых объёмов не бывает. А вот FAT32 или vFAT добавить возможно, если это кому-нибудь понадобится в будущем.

Имя образа ‘MEMCRD00.BIN’ выбрано не случайно. Дело в том, что в будущем я планирую добавить выбор образа через стандартную для многостраничных карт памяти комбинацию кнопок на джойпаде: при зажатом SELECT следует однократное нажатие на L1/R1. И меняя последние 2 символа можно поддержать 100 образов в корневой директории, от ‘MEMCRD00.BIN’ до ‘MEMCRD99.BIN’. Для этого есть задел в обработчике прерывания по SCK в интерфейса PSIO, ветка где анализируется обращение к джойпаду. Сделать сниффер проблем нет, но периферия контроллеров у PS1 богатая и придётся практически всех их поддерживать.

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

Читайте также: