Буквально месяц назад сделал подобное. Только не искал "адаптированные исходники" (что за ламерство?), а за полчаса сделал проект для студии из последнего снапшота сорцов от 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.





Хотя кто знает...
Ответить с цитированием