Pushed to
esl/EXOLON-ZX
Overview
Atlassian SourceTree is a free Git and Mercurial client for Windows.
Atlassian SourceTree is a free Git and Mercurial client for Mac.
ZX EXOLON - описание дизасма. Сергей Ерохин aka ESL (с) 2013+
EXOLON - яркая игрушка, таких не сильно много, красочная, огромные спрайты.
Мне нужны были исходники для портирование его на другую платформу ;)
А тут еще автор EXOLON официально разрешил дизассемблировать.
В общем совпали звёзды.
основной адресс проекта - https://bitbucket.org/esl/exolon-zx
там mercurial репозиторий.
Для портирования мне не нужно знать ВСЕХ деталей.
Собственно исходники уже это обеспечивают и можно остановиться.
Но теперь стало интересно уже разобраться в деталях.
то что плохо разобрано - graphics_sprites_code_*.asm
был бы благодарен за их разбор
в общих деталях я представляю как работают все блоки игры, задавайте вопросы.
eslreg at@at gmail.com
или приходите на форум - http://zx-pk.ru/showthread.php?t=24083
Preconditions:
для сборки используется ZMAC - http://members.shaw.ca/gp2000/zmac.html
для проверки работоспособности FUSE
работы идут под линуксом ;)
Структура директорий.
asm - рабочие исходники
asm.src - оставленный для истрии почти первый исходник, в отдельные файлы вырезаны только данные
ida - база для иды и мелкие сервисные скрипты для нее (разбираться в иде в разы удобнее чем просто в исходниках)
tools -
bin - разные рабочие бинарники
html - html версия игры, тут скорее для истории.
img - разные картинки, полная карта там (с WOS), остальное мое - родилось в процессе
rb -
/*.rb - скрпиты которые строят картинки из бинарника EXOLON
активно ковырялся в процессе начального разбора
/png
/blk - "строительные блоки" из которых строятся уровни 0..61
красный прямоугольник - старторвый блок с которого начинает рисоваться
синий крест - в этом месте есть "активный эллемент"
/enemy_strategy - траектории по которым летают враги
/font - "шрифты" которыми рисуются блоки, в процессе рисования оно переключает разные шрифты.
/sprites - 3 группы спрайтов,
16x8 пресдвинутые 8x8 (ракеты, шарики, пули, взрывы), они летят поверх картинки
16x16 в основном враги
16x24 спрайты игрока и "помпы"
/zone - собственно уровни составленные из "блоков"
дополнительно отрисованы:
красные полупрозрачные квадраты - "непрозрачные блоки" под которыми проходят спрайты
синие полупрозрачные квадраты - зона куда должна попасть ракета чтобы уничтожить блок
заодно оно и выделяет уничтожаемые объекты
зелёные полупрозрачные квадраты - пока не понятно.
- если на экране есть летающие враги то отрисована их траектория и спрайт который летает.
Коментарии по исходникам:
компилится всё в .SNA - это снапшот памяти, и подходит для наших целей
заголовк живёт в sna_header.asm
Главный файл - exmenu7991.asm (имя такое исторически)
вначале идут буфера под таблицы, они строятся в начале игры.
0x6400:bitSwapTab - табличка используется для разворота спрайта игрока
0x6500:Y2SCR_HI - старший байт экранного адресса, используется в преобразовании X,Y -> SCRADDR
0x6600:Y2SCR_LO - младший байт
0x6700:scr_addr_8 - табличка не используется....
0x6D60:START - адрес старта как и оригинала.
тут игра стартует и рестартует, и выходит сюда при нажатии "7890" во время игры
готови таблички
и всё меню тут.
тут же буфера связанные со спрайтами, пока было лень разбирать что они точно делают ;)
ну собственно тут инклюдятся все остальные файлы.
оснавная игра в файле game.asm
game.asm - реально это один большой инклуд, всех функций.
сам код главного цикла игры в файле game_loop.asm
в игре нет вообще никакой синхронизации !!!!!
зато есть некая забавная тормозилка
подсчитывает сколько на экране мелких спрайтов и если их <16 то отрисовываем недостающие пустым спрайтом ;)
есть и вызывается такая же радость для больших спрайтов если их <6 НО увеличение счётчика вставить забыли и оно тормозит всегда !
или я провтыкал увеличивалку
2014-12-07 -------------
одна из причин торможения - постоянные проверки по таблицам
например
цикл по таблице допустим красных шариков
для каждого вызываем продуедуру которая провреяет не попал ли каждый из летящих патронов
в него, и если попал - то уничтожаем.
и такая радость для ВСЕХ уничтожаемых объектов.
плюс к этому все таблицы терминированы символом 0xff
и цикл обычно идет до этого символа.
т.е. довольно часто перебираем все ячейки таблицы
для таблицы частиц взрыва это 100 записей
анимаций уничтожения - 20
как понимаю есть что оптимизировать
---
все в работе, сюда буду дописывать ...
как отрисовываются блоки xMSG
как отрисовываются уровни
как описаны "активные" объекты