EN
shiru8bit
shiru8bit
51 subscribers
goals
8 of 8 paid subscribers
По достижению 8 платных подписок любого уровня сделаю небольшую демку для 8-битной NES, перечисляющую имена героев!
1 of 4

Вскрываю карты #1

Для одного из вялотекущих проектов понадобилось извлечь игровые карты из игры Renegade III в версии для Commodore 64.
Платформа эта древнейшая, с кучей поклонников и традиций. Но почему-то до сих пор никто не сделал ничего подобного Speccy Maps. Да и с инструментами для всего ситуация очень специфическая: эмуляторов мало, базовых возможностей не хватает, некоторые напротив, умопомрачительные, но их сложно использовать.
Например, местной традицией являются интерактивные отладчики в консольном режиме, где надо по буквам вводить различные команды, вместо нормального человеческого интерфейса с просмотром памяти и листинга. К тому же, значительно более сложное железо, и значительно более хитрые старые программы (загрузчики игр), очень требовательные к точности эмуляции этого железа.
Тем не менее, нужно было придумать простой и эффективный способ извлечения данных. Пободавшись с различными отладчиками, я нашёл ICU64, запускаемую отдельно утилиту, прицепляющуюся к процессу запущенного эмулятора (Frodo или VICE), и умеющую делать то, что в других эмуляторах реализовано в виде встроенного функционала: просмотр памяти, видеопамяти, и прочих регистров. Впрочем, некоторые местные возможности очень даже круты и не имеют аналогов. Но отладка по прежнему идёт через встроенный отладчик самого эмулятора.
С помощью ICU64 удалось понять общую ситуацию: карты отображаются в текстовом режиме, причём задействуют возможность смешивания символов низкого и высокого разрешения в одном экране. Также удалось посмотреть конфигурацию VIC и таким образом найти конкретное расположение набора символов и буфера экрана в памяти. Ещё получилось увидеть фрагменты игровых спрайтов.
Возникла идея сохранить снапшот и восстановить картинку по содержимому ОЗУ.
Потребовалось некоторое время на разбор формата снапшота эмулятора Frodo. Из документации на него только исходный код, и сохраняется снапшот непосредственно бинарными структурами в файл, то есть конкретных смещений нет. Собрать код, чтобы посмотреть смещения отладчиком, тоже так просто не получится.
В итоге я кое-как нашёл встроенным отладчиком место с игровым текстом в ОЗУ, потом нашёл его в снапшоте, сопоставил и понял, по какому смещению в файле находятся основные 64 килобайта памяти. По исходникам там также нашлись сохранённые регистры VIC-II и блок Color RAM.
Немного поковырявшись с собственный кодом, написанным в Turbo C++ 2006 (ex-Builder) удалось написать парсер содержимого видеопамяти и реконструировать из снапшота текущее изображение на экране. К слову, палитры в сети какие-то странные, изображение получилось темнее и насыщеннее, чем в любых эмуляторах. Ну и ладно, для моей задачи это непринципиально.
Следующая задача — вытащить карты.
avatar
Круто! Отличный прогресс с картами. Любопытно узнать сколько по времени примерно заняли описанные в статье действия?
avatar
Санёк Сушка | Саня, Тащи!, три с половиной часа от начала ковыряний до получения всех четырёх карт.

Subscription levels

Микро 16

$ 0,17 per month
Просто потому что нельзя 8. Даже самая малая поддержка важна. Спасибо!

База 128

$ 1,33 per month
Для тех, кто просто хочет поддержать. Спасибо!

Супер 256

$ 2,66 per month
Для тех, кто хочет поддержать. Спасибо!

Кило 320

$ 3,4 per month
Для тех, кто сильно хочет поддержать. Спасибо!

Мега 640

$ 6,7 per month
Для тех, кто очень хочет поддержать. Спасибо!

Гига 1024

$ 10,7 per month
Для тех, кто крайне хочет поддержать. Спасибо!
Go up