PDA

Просмотр полной версии : Модификация RZX файлов



JeRrS
04.09.2019, 04:47
Приветствую, меня давно преследует мысль оперативно проверить релиз на играбельность и прочее, особенно если одна игра была выпущена различными релизерами (хакерами) и я вспомнил про формат прохождении RZX, но вот беда, стоит загрузить RZX файл через Spectaculator и "подсунуть" ему дамп памяти с другого релиза как прохождение мгновенно останавливается. Хотя если вызвать Poke то он на это спокойно реагирует и не сбрасывает прохождение. В общем меня интересует возможно ли адаптировать RZX под другой релиз?

Bedazzle
04.09.2019, 07:02
Если смотреть описание (http://www.worldofspectrum.org/RZXformat.html) формата, то там не просто дамп памяти, а снапшот внутри. Т.е. регистры тоже учавствуют.
И т.к. разные релизы могут использовать вполне даже разные адреса в памяти, что-то будет рушиться.

Reobne
04.09.2019, 07:55
Интересный вопрос!
Теоретически это возможно. Если релизы не сильно разнятся, то можно добиться синхронности. Например если просто сделан свой загрузчик. Может, если подправлена немного графика, без изменения размеров и количества спрайтов. Если подправлены тексты и шрифт, если не изменены размеры слов, не подправлена процедура печати, не перенесён шрифт в медленную память...

Для этого, оба релиза нужно остановить в одной и той-же точке.(Поставить в отладчике точку останова, и дождаться пока прога на ней стопорнётся) Но, и чтобы фаза работы программы была одинакова, и чтобы состояние стека совпадало, и на остальные регистры тоже разумно глянуть.

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

Естественно, что если игра оптимизирована, или наоборот замедлена вставленной музыкой; если изменено управление, логика работы, карты и так далее, то синхронизации скорее всего не будет.

Spectramine
04.09.2019, 08:25
Приветствую, меня давно преследует мысль оперативно проверить релиз на играбельность и прочее, особенно если одна игра была выпущена различными релизерами (хакерами) и я вспомнил про формат прохождении RZX, но вот беда, стоит загрузить RZX файл через Spectaculator и "подсунуть" ему дамп памяти с другого релиза как прохождение мгновенно останавливается. Хотя если вызвать Poke то он на это спокойно реагирует и не сбрасывает прохождение. В общем меня интересует возможно ли адаптировать RZX под другой релиз?

Не всё так просто. Если в релизе изменен код логики работы игры, или управляющие данные, плывет RZX-синхронизация - количество выполненных команд и количество чтений портов на фрейм. Это может прокатить только для релизов без изменения исполняемого кода Z80 - с изменённой графикой по старым адресам, или вообще без изменений, не считая загрузчика.

Если соблюдается последовательность чтения портов в старом/новом релизе, теоретически можно попробовать отключить RZX-синхронизацию, читать состояние портов из RZX без неё. Но это может прокатить только если порты читаются строго в основном коде, а не в прерываниях. Если и там и там - последовательность чтения портов быстро нарушится. А для чтения строго в прерываниях прохождение скорее всего тоже поплывет, но несколько позже. Как результат - персонаж не проскочит очередное препятствие, потеряет жизнь, и дальше логика прохождения рухнет.

- - - Добавлено - - -

А дамп для подсовывания надо снимать/подставлять в одной и той же точке кода в обоих релизах, при этом желательно в цикле меню игры, чтобы состояние стека и используемых в данный момент программных переменных было одинаковым. Т.е. надо ставить точку останова на один и тот же адрес в обоих релизах, снимать дамп (можно даже и простой снапшот типа .sna) в одном релизе и подсовывать его в другом в этой точке останова.