Важная информация

User Tag List

Показано с 1 по 9 из 9

Тема: Дизассемблирование River Raid

  1. #1
    Member Аватар для morozov
    Регистрация
    19.04.2019
    Адрес
    г. Сан-Хосе, США
    Сообщений
    41
    Спасибо Благодарностей отдано 
    13
    Спасибо Благодарностей получено 
    15
    Поблагодарили
    4 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Дизассемблирование River Raid

    Привет!

    С полгода назад поначитался форма и других интернетов, и на ностальгической новогодней волне решил попробовать дизассемблировать River Raid. В отличие от автора подобного проекта о The Great Escape, полную документацию со всеми картинками я вряд ли когда-то осилю. И в отличие от Batty ни на какую другую ретро-платформу портировать тоже не планирую, т.к. не умею.

    Хотел довести проект до такого состояния, когда достаточно подробно смогу понимать логику движка, и переписать игру на чём-нибудь типа Ebiten. С одной стороны, можно было бы играть без эмулятора на всём, что движется; с другой, можно было бы устранить клешинг. Уж больно он противный в этой игре.

    Пытаясь описывать логику отрисовки уровней, понял, что описанине словами будет недостаточно понятно, и стал прототипировать отрисовку на PHP. Сравнивал с картами с maps.speccy.cz: не считая мостов (руки не дошли), вроде похоже и без клешинга!

    Что сделано:
    1. Файл ассемблера, который собирается с любого стартового адреса (значит Skookit всё расставил правильно).
    2. Описаны все спрайты.
    3. Описаны данные и логика построения уровней.
    4. Описана логика выбора управления и начального уровня, переключения между игроками, некоторые структуры данных.
    5. Мелкие исправления в инструкциях. Без нех некоторые переходы и метки указывали на один байт раньше, код работал на удачу и не переносился.
    6. Мелкие исправления в спрайтах. У самолёта в одной из позиций по-прежнему отгрызен кусок левого крыла.


    Более-менее интересное из того, что узнал по коду:
    1. Логику второго игрока явно дописывали в последнюю очередь задней левой ногой. Куча дублирования кода, который по-хорошему нужно было бы обобщить.
    2. Логика отрисовки островов и берегов сильно продублирована, хотя она абсолютно одинаковая. Может писали на каком-то высокоуровневом языке, и это компилятор так скомпилировал?
    3. Данные об уровнях хранятся крайне неэкономно. Подробностей сейчас не вспомню.
    4. Цвет корабля и цвет второго игрока (голубой) задаётся в одном и том же месте.
    5. В коде есть несколько указателей, которые нигде не используются
    6. Все спрайты продублированы в четырёх позициях со смещением в два пикселя, чтобы проще было отрисовывать, но истребители летят с такой скоростью, что используются только один или два спрайта.
    7. За 10.000 очков дают бонусную жизнь. Сколько ни играл, не замечал (или не набирал столько).
    8. Определение столкновения с объектом происходит прямо по данным на экране. Т.е. если поставить игру на паузу, нарисовать что-нибудь на экране с помощью POKE, в это что-то можно врезаться. Это приводит к багу, что если заправляться и стрельнуть в заправку, иногда можно себя взорвать (а точнее, врезаться во взрыв), хотя в основном такого не происходит.
    9. По адресу #8561 есть экран с выбором управления, который нигде не выводится (см. ниже).
    10. Счёт хранится прямо в виде ASCII-символов, и вся арифметика (например, добавление очков) выполняется вручную над символами, прямо как в школе столбиком.
    11. Когда танк подъезжает к берегу, то на каждом шаге его координату нужно увеличить или уменьшить в зависимости от того, на каком он берегу. Так вот сначала она всегда увеличивается, а потом, если танк на правом берегу, уменьшается на вдвое большее значение. Может на низком уровне оно так и принято, но выглядит диковато.


    По ходу работы предложил улучшение в Skoolkit, чтобы в снапшоте, который он делает из образа ленты, можно было инициализировать системные переменные. Наверное в этом плане River Raid – исключение, раз никому до меня такое раньше не требовалось.

    Что не сделано? Куча всего. Более-менее подробно описана логика полёта снаряда танка на берегу, но поведение всех других объектов не описано. У многих меток временные названия типа "something", а добрая треть так и не названы.

    В последние несколько попыток продолжить разбор натыкался на то, что не понимаю, что дальше делать. От этого весь запал иссяк. Решил оставить наработки здесь – вдруг кто-то захочет продолжить или хотя бы подскажет, куда дальше копать.

    Спасибо за внимание.

    Ссылки:
    1. Репозиторий с разбором: https://github.com/morozov/river-raid-disasm
    2. Репозиторий с отрисованными уровнями: https://github.com/morozov/river-raid-php


    Неиспользуемый экран выбора управления:
    Нажмите на изображение для увеличения. 

Название:	controls.png 
Просмотров:	118 
Размер:	2.7 Кб 
ID:	75829
    Последний раз редактировалось morozov; 16.07.2021 в 09:18.

  2. Эти 7 пользователя(ей) поблагодарили morozov за это полезное сообщение:

    Bedazzle (16.07.2021), CityAceE (16.07.2021), Digitizer (24.07.2021), ivagor (16.07.2021), Lethargeek (16.07.2021), mastermind (25.07.2021), svofski (16.07.2021)

  3. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  4. #2
    Guru Аватар для Lethargeek
    Регистрация
    08.09.2005
    Адрес
    Воронеж
    Сообщений
    4,591
    Записей в дневнике
    3
    Спасибо Благодарностей отдано 
    285
    Спасибо Благодарностей получено 
    238
    Поблагодарили
    187 сообщений
    Mentioned
    11 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от morozov Посмотреть сообщение
    Счёт хранится прямо в виде ASCII-символов, и вся арифметика (например, добавление очков) выполняется вручную над символами, прямо как в школе столбиком.
    так это для старых восьмибиток дело обычное, получается быстрее вместе с отображением, чем считать в двоичной, а потом каждый раз переводить для вывода в десятичную
    Прихожу без разрешения, сею смерть и разрушение...

  5. #3
    Veteran Аватар для Bedazzle
    Регистрация
    02.05.2015
    Адрес
    г. Таллин, Эстония
    Сообщений
    1,495
    Спасибо Благодарностей отдано 
    227
    Спасибо Благодарностей получено 
    150
    Поблагодарили
    116 сообщений
    Mentioned
    9 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от morozov Посмотреть сообщение
    В последние несколько попыток продолжить разбор натыкался на то, что не понимаю, что дальше делать. От этого весь запал иссяк.
    Что дальше делать в том смысле, что застрял перед непонятной стеной, или что не знаешь, куда улучшать?
    Heavy on the disasm
    Eric and the disasm
    Mask 3: Venom strikes disasm
    Bard's disasm

  6. #4
    Member Аватар для morozov
    Регистрация
    19.04.2019
    Адрес
    г. Сан-Хосе, США
    Сообщений
    41
    Спасибо Благодарностей отдано 
    13
    Спасибо Благодарностей получено 
    15
    Поблагодарили
    4 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Bedazzle Посмотреть сообщение
    Что дальше делать в том смысле, что застрял перед непонятной стеной, или что не знаешь, куда улучшать?
    Застрял. В коде осталось порядка 150 меток с автосгенерированными названиями типа L1234 и неописанным назначением. Ну и куча логики не описана. Но всякий раз, когда берусь за какую-то неописанную процедуру, начинаю разбираться, перехожу по вызовам, а картина не вырисовывается. Какая-то каша вызывает какую-то другую кашу.

    Порядок в существующем коде тоже есть куда наводить: позаменять значения цветов и прочие вещи константами, но это пониманию логики не поможет.

  7. #5
    Veteran Аватар для Bedazzle
    Регистрация
    02.05.2015
    Адрес
    г. Таллин, Эстония
    Сообщений
    1,495
    Спасибо Благодарностей отдано 
    227
    Спасибо Благодарностей получено 
    150
    Поблагодарили
    116 сообщений
    Mentioned
    9 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от morozov Посмотреть сообщение
    берусь за какую-то неописанную процедуру, начинаю разбираться, перехожу по вызовам, а картина не вырисовывается. Какая-то каша вызывает какую-то другую кашу.
    Мне пока везло: всё, за что брался оказалось достаточно неплохо структурировано внутри.
    Я отказался от скулкита, режу на кучу мелких исходников, где по возможности одна функция. Заодно что-то и в макросы засовываю. Компилю бинарник, который сверяется с эталоном. Если что-то поломал, сразу вылезает. Ну и в отладчик метки подсосать полезно.
    Heavy on the disasm
    Eric and the disasm
    Mask 3: Venom strikes disasm
    Bard's disasm

  8. #6
    Member Аватар для morozov
    Регистрация
    19.04.2019
    Адрес
    г. Сан-Хосе, США
    Сообщений
    41
    Спасибо Благодарностей отдано 
    13
    Спасибо Благодарностей получено 
    15
    Поблагодарили
    4 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Bedazzle Посмотреть сообщение
    Я отказался от скулкита, режу на кучу мелких исходников, где по возможности одна функция.
    Почему отказался? Чтобы резать? Мне сама идея управления файлом с аннтотациями очень нравится. Хотя, гигантский исходник на выходе слегка напрягает. Вполне возможно, что Скулкит и резать умеет, ну или можно попросить сделать. Я как-то подумывал.

    Цитата Сообщение от Bedazzle Посмотреть сообщение
    Заодно что-то и в макросы засовываю.
    Я бы это ближе к финалу делал, на стадии наведения порядка.

    Цитата Сообщение от Bedazzle Посмотреть сообщение
    Компилю бинарник, который сверяется с эталоном. Если что-то поломал, сразу вылезает.
    Это я тоже делаю. Бывает, не понятно, за что какое-то значение отвечает, меняю, собираю, смотрю, что поменялось.

    Цитата Сообщение от Bedazzle Посмотреть сообщение
    Ну и в отладчик метки подсосать полезно.
    Это как? Я пользуюсь Fuse, там никаких меток нету. Каким отладчиком стоит попробовать попользоваться?

    Цитата Сообщение от Bedazzle Посмотреть сообщение
    Heavy on the disasm
    Eric and the disasm
    Mask 3: Venom strikes disasm
    Bard's disasm
    Можно где-то на все эти проекты посмотреть? Я как-то пытался искать, но вроде не нашёл.

  9. #7
    Member Аватар для morozov
    Регистрация
    19.04.2019
    Адрес
    г. Сан-Хосе, США
    Сообщений
    41
    Спасибо Благодарностей отдано 
    13
    Спасибо Благодарностей получено 
    15
    Поблагодарили
    4 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Ещё интересную штуку вспомнил: значение счёта в игре всегда кратно десяти, причём в коде все значения очков прописаны сразу десятками, и в счёте ноль в первой позиции приписан по сути просто для красоты. Наверняка, так во многих играх делается. Интересно, есть ли у этого феномена какое-то название. Что-нибудь из области экономики или психологии (инфляция счёта?).

  10. #8
    Veteran Аватар для Bedazzle
    Регистрация
    02.05.2015
    Адрес
    г. Таллин, Эстония
    Сообщений
    1,495
    Спасибо Благодарностей отдано 
    227
    Спасибо Благодарностей получено 
    150
    Поблагодарили
    116 сообщений
    Mentioned
    9 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от morozov Посмотреть сообщение
    Почему отказался? Чтобы резать?
    Да, чтобы удобно работать над маленьким кусочком, который при желании можно инклудить в другой проект.
    Скулкит для документации планировал делать на финальном этапе, но до него пока не осилил.

    Цитата Сообщение от morozov Посмотреть сообщение
    Это как? Я пользуюсь Fuse, там никаких меток нету. Каким отладчиком стоит попробовать попользоваться?
    В основном делаю в EmuzWin, если нужен трейс, то в SpecEmu.
    Народ я так понял, делает в Unreal, но мне он не зашёл по многим причинам. Сейчас пробую перелезть в Xpeccy.

    Цитата Сообщение от morozov Посмотреть сообщение
    Можно где-то на все эти проекты посмотреть?
    Из выложенного только Эрик.
    HOTM разобран до потрохов, Mask 3 пока на половине (перекинулся на Bards tale - первый уровень где-то на 3/4 разобран), и Lode runner на 3/4.
    Heavy on the disasm
    Eric and the disasm
    Mask 3: Venom strikes disasm
    Bard's disasm

  11. #9
    Сибирский антропоморфн Аватар для Black Cat / Era CG
    Регистрация
    06.05.2010
    Адрес
    Бердск, НСО
    Сообщений
    4,590
    Спасибо Благодарностей отдано 
    949
    Спасибо Благодарностей получено 
    912
    Поблагодарили
    675 сообщений
    Mentioned
    5 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от morozov Посмотреть сообщение
    Наверняка, так во многих играх делается
    В контре на НЕС дописывают 00, максимум очков 6553500.
    Личка заполнена! И чистить я ее не буду! Пользуйтесь адекватными средствами связи! Спасибо.

    Seamos realistas y hagamos lo imposible!

    Ernesto Che Guevara
    Переехал сюда: SteinBlume (ex ATM CP/M Explorer)
    http://era-cg.su

    Скрытый текст

    Speccy2010 r2 (Спасибо m.d. & xlat),
    Sinclair ZX Spectrum + (Спасибо stepmotor),
    ZX Evolution rev.C + 5'25 FDD Epson SD-700AA + NedoPC PAL-Coder (Спасибо m.d. & xlat)
    [свернуть]

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. River Raid на УКНЦ
    от BlaireCas в разделе ДВК, УКНЦ
    Ответов: 15
    Последнее: 06.02.2021, 02:15
  2. River raid
    от Ванек в разделе Игры
    Ответов: 6
    Последнее: 29.08.2011, 14:38
  3. river raid on flash
    от daniel в разделе PC Remakes
    Ответов: 4
    Последнее: 01.03.2011, 21:01
  4. River Raid
    от Egal в разделе Игры
    Ответов: 9
    Последнее: 30.09.2007, 21:33

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •