PDA

Просмотр полной версии : Unreal Speccy с трассировкой кадра



Matador
15.08.2011, 11:09
Чего-то последнее время ностальгия замучила по демкам спектрума, решил глянуть. После просмотра очередного шедевра стала появляться мысль как сделан тот или иной эффект, копаться в недрах было лень и тут пришла мысль - так как большинство эффектов in one frame (или как раньше бы сказали "в один halt"), то можно просто делать дамп всех команд которые выполнились в этот момент. К сожалению ни один эмуль такой простой вещи не позволяет сделать. Пришлось искать исходники Unreal Speccy адаптированные для Visual Studio 2008 и делать фикс. Выкладываю это для общественности. Управление простое, нажатием F9 во время демки генерится файл с именем и директорией указанным в TraceFileName секции Misc, по умолчанию это tracefile.txt директории эмуля.

P.S. Забавная штука, например в Insult где очень крутой точечный эффект, Rst7 в строке пишет что там 3200 dots in one frame, а на самом деле из всего 800 ;)

В качестве примеров в архиве прилагается пару дампов - это вышеупомянутый dots из insult, а также intro dizzy 7 от titus'a.

Titus
15.08.2011, 11:14
P.S. Забавная штука, например в Insult где очень крутой точечный эффект, Rst7 в строке пишет что там 3200 dots in one frame, а на самом деле из всего 800 ;)

В качестве примеров в архиве прилагается пару дампов - это вышеупомянутый dots из insult, а также intro dizzy 7 от titus'a.

Про 800 точек - это нормальная практика в классе эффектов SineDots, которая пошла с Амиги. Правда, на Амиге обычно писали, допустим, 800*4 = 3200 sinedots. Это говорит о том, что 800 точек реальные, а остальные - это их след в том или ином виде.

А вот интро от Диззи-7 - поковыряйтесь. Там хитрая самогенерящаяся каждый кадр функция рисования скролла)

Screw
15.08.2011, 13:38
К сожалению ни один эмуль такой простой вещи не позволяет сделать. Пришлось искать исходники Unreal Speccy адаптированные для Visual Studio 2008 и делать фикс.

Буквально месяц назад сделал подобное. Только не искал "адаптированные исходники" (что за ламерство?), а за полчаса сделал проект для студии из последнего снапшота сорцов от Deathsoft.

Мой трассер больше предназначен для игр, и не привязан к фрейму. (Понятно, что добавить привязку к фрейму тривиально) Он трассирует всё. Какие ячейки писались, читались, исполнялись, обнулялись. Для этого пришлось серъёзно перепахать коллбеки из команд, т.к. там были события на чтение и запись, но не было на исполнение. То есть не отличить чтение от исполнения, Только m1_cycle можно было ловить, исполнение первого байта команды, что меня не устраивало.

Для каждой ячейки строится список команд, обращавшихся к ней. Запоминается какое именно было обращение, сколько раз. По этим данным нетрудно в динамике построить обратные таблицы - куда лазила какая команда.

Для начала записи лога в игре доходим до интересующего нас момента (как правило начало игрового процесса, когда управление выбрано, все стартовые мессаги завершились и т.д.). Жмём хоткей и сбор статистики начинается. В это время бегаем по уровню, делаем всё то, что хотелось бы потом проанализировать. Размер статистики растёт только до определённого момента, его рост всё время замедляется и в пределе останавливается, только счётчики продолжают накручиваться. В завершении жмём другой хоткей (всё настраивается в INI файле) и эмулятор сохраняет файл-лог.

Для всего этого дела написал вьювер. В котором можно быстро просматривать дамп. С подсветкой строк (например - жёлтые это исполнение, синие - самомодифицирующийся код, красные - запись в ячейку и т.д.). При выборе инструкции, если она писала в экран, это сразу же визуализируется в графическом виде, на битмапке в форме speccy-экрана, разлинованной по знакоместам. А также сделал функции автопоиска таблиц (отражения, автомаски, экранные адреса) и спрайтов. Плюс просмотрщик памяти, чтобы искать графику "вручную".

Немного интересных фактов, которые уже удалось нарыть:
- Mirror Table в играх Dave Thompson-а размещается в быстрой памяти, хотя хватило бы и медленной. Rafael Cecco размещает эту таблицу в медленной памяти.
- Saboteur2 и Satan размещают эту таблицу и обращаются к ней крайне по-идиотски.
- копирование бек-буфера на экран в играх Dave Thompson-a (Yogi Great Escape, Scooby&Scrappy Doo, Hong Kong Phooey, Potsworth&Co) абсолютно такое же, как и в более ранних играх Mike Lamb-а (Robocop, Batman-3). Видимо Dave утащил идею, когда 1988 работал на Ocean :) Хотя кто знает...
- отрисовка экрана в Wacky Races содержит баг: один байт не отрисовывается.


Вот пара примеров работы с дампом:

Поиск inner-loops:
Группируем байты по типу доступа Execute. Выбираем рассчёт частоты исполнения по доступу Execute. Сортируем созданные блоки по столбцу Frequence. Блоки кода будут отсортированы от наболее часто исполнявшихся к наименее.

Поиск самомодифицирущегося кода и кто этот код генерирует:
Группируем байты по типу доступа Execute & Write. Видим все самомодифицирующиеся блоки. Если надо, сортируем по частоте исполнения или модификации, по размеру. Выбирая блок, в соседнем списке видим все команды, к нему обращавшиеся. Двойной щелчок на команде делает прыжок на блок кода, в который входит данная команда (то есть на генератор самомодифицирующегося кода)

Пока играюсь с этим делом, обкатываю, дописываю функционал. Сейчас вот хочу дизассемблер прилепить, а то каждый раз переключаться в IDA неудобно. И переделать диалоговый UI на Docking Panes. Когда пойму что готово - выложу на http://omegahg.com.

Matador
16.08.2011, 10:25
А вот интро от Диззи-7 - поковыряйтесь. Там хитрая самогенерящаяся каждый кадр функция рисования скролла)

Ну интро Диззи 7 одно из самых крутых на спектруме, помню в 90х у нас "челюсть отвисла" когда увидели. Еще очень достоин внимание zoom scroll из Illulision demo от X-Trade, там похоже чистый realtime вообще (trace дамп прилагается).

Titus
16.08.2011, 10:43
Ну интро Диззи 7 одно из самых крутых на спектруме, помню в 90х у нас "челюсть отвисла" когда увидели. Еще очень достоин внимание zoom scroll из Illulision demo от X-Trade, там похоже чистый realtime вообще (trace дамп прилагается).

Думаю, что как раз в Illusion не совсем чистый реалтайм, а скорее всего имеются программные шаблоны для растяжения на заданную ширину. Тогда как в Диззи-7 полный реалтайм, без каких либо таблиц сжатия/растяжения. Причем, в Диззи-7 эффект занимает только половину прерывания.