Overview

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
как отрисовываются уровни
как описаны "активные" объекты
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.