MENU
Главная » Статьи » Гайды по хакингу Sonic 1

Как в Sonic1 записать собственный демонстрационный ролик.

Как в Sonic1 записать собственный демонстрационный ролик.
К счастью, в оригинальном роме уже есть подпрограмма записи демо-роликов (MoveDemo_Record).
Нужно всего лишь слегка подправить уже имеющийся код.

1. Первым делом переходим к MoveSonicInDemo и комментируем команду "rts" таким образом:

MoveSonicInDemo:
 tst.w ($FFFFFFF0).w ; is demo mode on?
 bne.s MoveDemo_On ; if yes, branch
 ;rts

Теперь если демо-режим не включён, выхода из подпрограммы не будет, процессор перейдёт в секцию MoveDemo_Record;

2. Первую же команду секции MoveDemo_Record "lea ($80000).l,a1" меняем на "lea ($FFFFA000).l,a1"
Здесь мы устанавливаем адрес, куда будет записываться наш ролик. Адрес $80000 указывает на то, что запись будет производиться в РОМ, однако это невозможно, поскольку само понятие ROM'а (Read Only Memory) говорит о невозможности проведения такой акции.
Выбора нет - остаётся ОЗУ. Самое подходящее место для этого, я считаю, - блок памяти $FFFFA000-$FFFFA3FF. Места размером в $400 байт нам вполне достаточно.
Это место зарезервировано для двух последних чанков (под номерами $51 и $52), которые традиционно пусты и не используются. Временно пожертвуем ими.

3. Теперь переходим в подпрограмму Joypad_Read и сразу после "or.b d1,d0" вставляем четыре строчки:

 move.b d0,d2
 rol.b #1,d2
 and.b ($FFFFFFF1).l, d2
 bne.b Joypad_Read_Rts

Шестью строчками ниже прямо перед "rts" вставляем вот это:

Joypad_Read_Rts:

Это необходимо для подключения обработки события Joypad|Press в демо-режиме.
Отныне JumpDash, HomingAttack и другие функции, использующее это событие, будут записываться корректно.

Код готов. Переходим непосредственно к тому, для чего и создавалась данная статья, - к записи видео.
Для начала скачиваем эмулятор Gens KMod: http://www.romhackin.../utilities/301/
Компилируем наш хак и запускаем в эмуляторе. Переходим к первому уровню (Green Hill Zone, Act 1), начинаем играть. Как только начнётся отсчёт времени и активизируется управление Соником, программа автоматически начнёт запись нашего демо-ролика в оперативную память. Не спешите зажимать клавиши раньше времени, иначе видео рассинхронизируется. У нас в запасе имеется 30 секунд, после чего demo-режим отключится, и включится режим SegaScreen. За полминуты можно пройти чуть ли не весь первый уровень. По истечении 30 секунд ставим игру на паузу.

Теперь нам необходимо вырезать получившееся видео и вставить в наш хак. Для этого в эмуляторе переходим по команде CPU => Debug => Genesis => Genesis - 68K, и в появившемся окне нажимаем кнопку DUMP RAM.
Сохраняем дамп (s1built_68K.ram) на диск и открываем его с помощью любого Hex-редактора, например WinHex. Параллельно в том же редакторе открываем файл demodata/i_ghz.bin.
В файле s1built_68K.ram переходим по смещению 0000A000. Начиная с этого оффсета, записан нужный нам ролик.

Опубликованное фото

Формат данных таков: 1 байт на состояние зажатых кнопок, 1 байт на задержку (в кадрах), т.е. на любое одно изменение состояния джойстика требуется 2 байта.
Вначале будут идти шестнадцатеричные числа, отличные от нуля, но изредка включающие нули. Чуть ниже будут идти уже сплошные нули. Так вот, нам нужен участок данных от 0000A000 до начала появления сплошных нулей. Выделяем этот блок и копируем в буфер обмена. Будет лучше, если мы заденем лишние нули, но последнюю строку выделим целиком. Например, на рисунке выше лучше выделить участок от 0000A000 до 0000A08F.
Открываем i_ghz.bin и перезаписываем его, вставив из буфера новые данные (в WinHex: устанавливаем курсор на позицию 0 и Ctrl+B или Правка -> Данные буфера -> Запись).
Ничего страшного, если вписываемые данные по объёму будут больше, чем исходный файл: если программа спросит разрешение на расширение места, согласитесь.
Сохраните i_ghz.bin. Снова откомпилируйте ром, запустите и наслаждайтесь проделанной работой.

Этот трюк можно проделать и с уровнями Marble Zone, Spring Yard Zone, Special Stage (демо-записи хранятся в файлах i_mz.bini_syz.bin,i_ss.bin соответственно). Для быстрого перехода к этим уровням воспользуйтесь кодом выбора уровня.
Если вы хотите записать, к примеру зону Star Light, то можно отредактировать список воспроизводимых уровней (файл misc\dm_ord1.bin).
Количество воспроизводимых уровней задаётся в секции loc_33E4: в инструкции "cmpi.w #4,($FFFFFFF2).w" поменяйте четвёрку, если необходимо.
Время воспроизведения задаётся в секции Level_Demo: в инструкции "move.w #1800,($FFFFF614).w" число 1800 показывает количество кадров (1800 кадров - 30 секунд).
Отключить запись demo можно, раскомментировав команду "rts" в MoveSonicInDemo.

Категория: Гайды по хакингу Sonic 1 | Добавил: tntheromhacker (18.08.2016)
Просмотров: 621 | Комментарии: 1 | Рейтинг: 0.0/0
Всего комментариев: 1
avatar
0 Spam
1 sana20001jas • 15:37, 27.01.2018
как сДЕЛАТЬ ТАК ЧТОБЫ ИГРА ПОМИНЯЛА ЗВУКОВОЙ ДРЭЙВЕР НА БОЛЕЕ КЛАСНЫЙ
avatar