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