PDA

Просмотр полной версии : Реверс Scuba Dive



nzeemin
12.07.2022, 21:32
Всем привет.
Неторопясь делаю реверс игрушки Scuba Dive для ZX Spectrum 48K, собственно уже есть некоторые результаты.

SkoolKit HTML: https://nzeemin.github.io/skoolkit-game-revs/scubadive-zx/scuba/asm.html
Репозиторий с ASM для компиляции через pasmo: https://github.com/nzeemin/spectrum-scubadive-rev

При компиляции получаются в точности такие же три блока, до байта, как и в исходном TAP-файле.

Блоки, загружаемые из TAP-файла:


Name Type Addr Size SizeHex RangeHex
"SCUBA " BASIC
"DIVE " CODE 16384, 7150 $1BEE $4000-$5BED
"S " CODE 24576, 25856 $6500 $6000-$C4FF
"D " CODE 55552, 6144 $1800 $D900-$F0FF


Использование памяти:


Начало $5B00 Переменные
Спрайты $6000
Начало кода $9C56
Конец кода $F000


На данный момент:
- Определено назначение многих переменных
- Разобрана часть процедур
- Раскопаны все спрайты

Лабиринт игры определяется в виде "свёртки": таблица AC5D ("мини-карта") содержит 32x32 = 256 индексов блоков, блоки по адресу A4DD состоят из 8x8 тайлов, тайлы по адресу 9134 это 8x8 ч/б пикселов. Итого, весь лабиринт это 256x256 тайлов = 2048x2048 пикселов. На экране мы всегда видим только 24x24 тайлов из этой карты (3x3 блока).
Карта, строится процедурно, изменением байтов в таблице AC5D. Глубина карты зависит от уровня игры (1..4).

Интересно сделано размещение осьминога, который сторожит проход вниз: ставятся подряд блоки $1C и $1D, с рисунком прохода -- и само наличие этих блоков как раз и означает, что тут должен быть размещён объект "осьминог".

nzeemin
15.07.2022, 22:44
Бейсик загрузчик выглядит так:


1 CLEAR 24575: INK 0: PAPER 0: BORDER 1: CLS : LOAD ""CODE: PRINT AT 2,0;: LOAD ""CODE: PRINT AT 2,0;: LOAD ""CODE
2 IF USR 60895THEN SAVE "S/D SCORE"CODE 59866,160: GO TO 2
3 LOAD "S/D SCORE"CODE : GO TO 2

Тут же код для запуска, тут же код для сохранения/загрузки таблицы рекордов.

Shadow Maker
16.07.2022, 15:54
А есть какие-то причины, почему pasmo, а не sjasmplus например? И в чем реально дизассемблируешь. не в skoolkit же (ну то есть я пробовал, в IDAPro скорость дизассма в десятки раз быстрее)?

nzeemin
16.07.2022, 17:01
А есть какие-то причины, почему pasmo, а не sjasmplus например? И в чем реально дизассемблируешь. не в skoolkit же (ну то есть я пробовал, в IDAPro скорость дизассма в десятки раз быстрее)?

pasmo мне интересен возможными дальнейшими портами на другие машинки.
Кому надо тот сам на sjasmplus переделает, там никаких особых трюков не используется.

И да, реально делаю используя skoolkit.
Я даже написал подсветку синтаксиса VSCode для SkoolKit .ctl файлов - https://github.com/nzeemin/skoolkit-ctl-syntax
Мне нравится результат в виде HTML, получаемый через SkoolKit - наглядно и удобно.
Медленно, это да, но я не особо тороплюсь.

Shadow Maker
16.07.2022, 17:53
pasmo мне интересен возможными дальнейшими портами на другие машинки.
Кому надо тот сам на sjasmplus переделает, там никаких особых трюков не используется.

И да, реально делаю используя skoolkit.
Я даже написал подсветку синтаксиса VSCode для SkoolKit .ctl файлов - https://github.com/nzeemin/skoolkit-ctl-syntax
Мне нравится результат в виде HTML, получаемый через SkoolKit - наглядно и удобно.
Медленно, это да, но я не особо тороплюсь.
Да, интересно. Я бы определенно из файла иды генерил бы
ctl :) а в чем разница у пасмо и sjasm в плане портов? Я посмотрел краем глаза, особо разницы и нет (кроме z80=>8086)

nzeemin
16.07.2022, 18:14
Да, интересно. Я бы определенно из файла иды генерил бы
ctl :) а в чем разница у пасмо и sjasm в плане портов? Я посмотрел краем глаза, особо разницы и нет (кроме z80=>8086)

У pasmo есть опция --w8080, генерирует варнинги на команды вне набора i8080, что довольно удобно при портировании на советские компы на основе КР580ВМ80А. При этом остаёмся в привычной нотации Z80.

CityAceE
16.07.2022, 21:50
У pasmo есть опция --w8080, генерирует варнинги на команды вне набора i8080, что довольно удобно при портировании на советские компы на основе КР580ВМ80А. При этом остаёмся в привычной нотации Z80.
У sjasmplus тоже есть! Я в своё время просил, уж не знаю по моей просьбе или нет, но сделали такой ключик.

nzeemin
23.07.2022, 22:19
Разобрался с тем как строится лабиринт. Пример карты можно увидеть тут: https://maps.speccy.cz/map.php?id=ScubaDive

Собственно, всё определяется блоками на мини-карте 32x32.
Верхние 7 рядов довольно стандартны - два горизонтальных прохода, объединённых по вертикали двумя проходами с осьминогами-сторожами над ними.
Положение обоих осьминогов выбирается случайно, колонка в диапазоне 7..22.
Далее, от нижней дыры (в 7-м ряду) вниз строится дерево проходов, основной проход идёт почти вертикально вниз, от него могут идти отростки влево/вправо.
Глубина дерева зависит от уровня игры - последний доступный ряд имеет номер 19 / 23 / 27 / 31 - в зависимости от выбранного игроком уровня игры 1..4.

nzeemin
29.08.2022, 21:40
Тред по портированию Scuba Dive на Вектор-06Ц: https://zx-pk.ru/threads/34605-portirovanie-scuba-dive-na-vektor-z80.html