1

Тема: Novarob

Хотел на сайт выложить эту игруху, стал проверять и ужаснулся.  Не могу понять под какой её ДОС писали.

http://agatcomp.ru/agat/Software/Game/L … arob.shtml

Дело в том, что она под разными досами ведет себя по разному, а именно: агрессивность врагов, частота их выстрелов и прочее. Мало того, еще зависит есть бейсик в памяти или нет....  Буду рад если кто-то поможет разобраться.

В архиве FIL файлы, чуть разные, в чем отличия пока не понял, но ведут себя все одинаково.
Если требуется, приложу заготовки образов, Икп, Алв, б60.

Post's attachments

Attachment icon kms.rar 2.12 kb, 107 downloads since 2022-01-30 

2

Re: Novarob

Тут есть вызовы процедуры задержки из Монитора по адресу $FB94.
В ИКП-шных Бейсиках семерки и девятки такая процедура есть и вроде бы все должно работать одинаково.

3

Re: Novarob

А это в каком файле? Просто я их пробовал - под ИКП себя ведут странно, даже под АЛВ лучше.
И вот Володя говорит что игра очень старая - еще до ИКП.

4

Re: Novarob

Я покопался в дизассемблере - тут два основых варианта: один использует вызов $FB94, другой $FB2B.
В ALV действительно процедура задержки находится по адресу $FB2B и наверно сначала игру делали под нее, а потом кто-то адаптировал ее под ИКП.

Файлы под ALV
KOSM.FIL - файл явно испорчен - кто-то поменял часть вызовов подпрограмм на вызов $6000, и часть кода игры никогда не вызывается. Кроме того, похоже, что это более ранняя версия - нет инициализации блока переменных по адресам $2274, $228C, $2288, графический режим включается раньше.

KOSM_.FIL - отличаются какие-то параметры

KMS.FIL - изменены клавиши управления со стрелок на ROTL

KOSMOS.FIL - отличаются какие-то параметры

Файлы под ИКП
9_10.FIL - отличаются какие-то параметры
NOVAROB.FIL - отличаются какие-то параметры

Понять, какой из файлов является оригиналом - я не могу. По адресу $24B0 лежит текущий счет и он нигде не равен 0. Такое ощущение, что в каждую из версий немного поиграли, прежде чем сохранять. Но в KOSMOS.FIL кажется поиграли меньше - там одна патченная инструкция осталась в исходном состоянии :) Хотя может быть просто так совпало.

5 Отредактировано avivanov76 (01-02-2022 00:41)

Re: Novarob

Ха, нашел интересное: пока ковырялся в листинге - заметил процедуру рисования здорового спрайта 32x32.
Попробовал запустить игру, но оказалось, что спрайт такого размера никогда не рисуется. Стал разбираться.

Опытным путем выяснилось, что спрайт должен рисоваться при попадании в центральную башню и есть 4 позиции на экране, где он должен рисоваться. Вот только адреса этих позиций все равны $FFFF. То есть, он по факту в нулевую страницу рисуется, где у игрушки часть рабочих переменных.

Я записал туда подходящие цифры - и на экране стал рисоваться какой-то синий QR-код :) Посмотрел на него в дебагере - оказалось, вместо картинки там действительно какой-то код, причем с вызовами процедур Бейсика. Код даже можно запустить, но никаких видимых результатов он не выдает, просто возвращается в Монитор. Не знаю, что там с этой игрушкой делали, но этот код явно не от нее.

Я сравнил 128 байт, содержащих этот спрайт, между разными версиями игрушки. Везде все оказалось одинаковым, кроме файла KOSM.FIL. Там лежит точно не код, а что-то похожее на спрайт. И координаты не $FFFF. Хотя сама игрушка в этом файле убита.

Так что теперь думаю, как сделать пересадку спрайта :)

6 Отредактировано Voldemar0 (01-02-2022 06:11)

Re: Novarob

Может этот кусок просто не завершен автором?
Спрайта нет, вызова нет.

Там не попадался какой нибудь random-генератор? (который инициализируется из неинициализированной памяти)

Я пробовал эту игрушку на пустом компе (без операционки) - мне не показалось, что она работает как-то странно. Вроде вполне играбельна.

7 Отредактировано avivanov76 (01-02-2022 16:48)

Re: Novarob

Voldemar0 пишет:

Может этот кусок просто не завершен автором?
Спрайта нет, вызова нет.

В том то и дело, что вызов процедуры есть во всех вариантах, кроме KOSM.FIL.
Процедура получает на входе число от 0 до 3, обозначающее направление, откуда прилетел снаряд. Есть табличка с 4 адресами, где должен рисоваться спрайт. Нужный адрес загружается в рабочие ячейки и спрайт рисуется.

Но во всех вариантах, кроме KOSM.FIL эта табличка содержит 4 штуки $FFFF. Поэтому спрайт рисуется в адреса $FFFF - $07FE. Поскольку процедура считает, что выводит спрайт на экран, то затирается не все подряд, а только 16 байт из каждой строки длиной 64 байта. И видимо это так удачно совпадает, что нужные для выживания программы адреса в нулевой странице и стеке не портятся.

Я не думаю, что это автор так убрал вывод спрайта. Он то должен был представлять, чем чреват вывод спрайтов в нулевую страницу и стек. Если у него был исходный код, то проще было бы просто убрать вызов самой процедуры. Похоже, это делал кто-то другой.

===

Вообще, у меня предположение, что эта игрушка подверглась восстановлению. То есть, когда-то давно, диск, на котором была записана игрушка, затерся. Игрушка практически перестала читаться. Владелец диска каким-то чудом загрузил игру в память, но, поскольку алгоритм подсчета контрольных сумм секторов слишком примитивный и 1/8 ошибок он просто не может увидеть, то местами прочиталось совсем не то, что должно было. Владелец диска оказался программистом и смог заставить работать то, что удалось прочитать. Дальше эта пропатченная версия широко разошлась.

Есть места, которые на это указывают. Например, начало программы - это 256 байт, из которых используется примерно 70. Похоже, кто-то просто приделал "запускатель", который чистит экран и дальше делает переход куда-то вглубь программы.
Спрашивается, зачем автору программы делать начало в одном месте, а продолжение  - совсем в другом?
Еще странный ход: "запускатель" создает процедуру в памяти.

        LDX    #$05

CODE_1F27
        LDA    DATA_1F45, X
        STA    SUB_6000, X
        DEX
        BPL    CODE_1F27

DATA_1F45
        .byte    $A9, $00, $20, $94, $FB, $60

Получается такой код:

SUB_6000
        LDA    #$00
        JSR    SUB_FB94
        RTS

И по всему коду стоят вызовы SUB_6000. Спрашивается, зачем создавать процедуру в памяти? Почему сразу не поставить вызов $FB94?
Могу предположить, что просто кусок с адреса $6000 не прочелся и автор "запускателя" так "заделал" отсутствующий кусок кода.

Еще странный момент - это подсчет очков. Во-первых, при запуске игрушки он просто не выводится, пока не убьешь одного из роботов. Во-вторых, он идет не с нуля, а со значения, хранящегося в памяти. И никогда не обнуляется.
Очень странно, что башня неуязвимая. В чем тогда игра, если враги тебя победить не могут?

В общем, нет у меня уверенности, что игрушка именно так и задумывалась.

8

Re: Novarob

Нда. Всё не то, чем кажется :) Пересадил спрайт из KOSM.FIL в KOSMOS.FIL. (Код не трогал!) Запустил в эмуляторе. Офигел.
Вот скришнот после трёх попаданий. Причём, судя по неиспользованному куску кода, перед началом игры делалась расстановка этих горшков с мёдом по всему полю. А поскольку спрайты горшков нарисованы EOR-ом, то после каждого попадания в башню они должны были исчезать...

Я то думал, игра про каких-то роботов, а игрок сидит в башне и лазером их пиу-пиу.
А получается, это какая-то оборона пасеки :) Нас атакуют недружественные насекомые и воруют мёд. А мы сидим в улье. Надо отбиваться. Лазером. Что курили эти школьники?

Post's attachments

novarob3.png, 3.13 kb, 512 x 512
novarob3.png 3.13 kb, 108 downloads since 2022-02-03 

9 Отредактировано garnizon (03-02-2022 23:16)

Re: Novarob

Переводчик говорит что ROB c воровством связано....

Вот какие штуки всплывают, я то всегда думал что это какие то новые роботы :)
А тут ульи с возможностью вести стрельбу.

По замыслу получается что после 4 попаданий игра оканчивается?

10 Отредактировано avivanov76 (04-02-2022 01:06)

Re: Novarob

Возможно, игра и должна была оканчиваться после 4 попаданий, но сейчас это понять нельзя. Нужной проверки просто нет. Хотя есть куски кода, которые могли бы быть частью такой проверки.

Самое логичное место - внутри обработчика попадания в башню (улей). Есть две версии этого кода, но проверки там нет. Похоже, код изначально был другой, потому что в конце его сейчас лишние инструкции RTS. То есть, бинарник пропатчили.

Версия 1:

CODE_23A0
        JSR    SUB_6000
        JSR    SUB_6000
        LDA    #$10
        STA    ZP_09

CODE_23AA
        JSR    SUB_2140    ; рисование башни
        JSR    SUB_207C    ; рисование пушки
        JSR    SUB_6000
        DEC    ZP_09
        BNE    CODE_23AA   ; повторить 16 раз (?)
        JSR    SUB_2230    ; рисование снаряда
        RTS

; $23BB no reference
        .byte    $60        ; лишняя RTS

Версия 2:

CODE_23A0
        LDA    ZP_02
        PHA
        INC    ZP_0E
        LDA    ZP_0E
        AND    #$03
        STA    ZP_0E
        STA    ZP_02
        JSR    SUB_2580    ; звук попадания
        JSR    SUB_2290    ; рисование/стирание горшка с медом
        PLA
        STA    ZP_02
        JSR    SUB_2230
        RTS

; $23BA no reference
        .byte    $60, $60    ; две лишних RTS

Внутри процедуры увеличения счета есть сравнение с числом 3, после которого идет ветвление. Проблема в том, что обе части ветвления выполняются одинаково - там стоит заглушка с вызовом задержки.

CODE_256E
        LDA    #$00
        STA    DATA_24B6
        CPX    #$03
        BMI    CODE_257A
        JSR    SUB_6000

CODE_257A
        JSR    SUB_6000

Начало игры - вообще песня:

CODE_2500
        LDA    DATA_C721
        JSR    SUB_6000    ; задержка
        JSR    SUB_6000
        JSR    SUB_6000
        JSR    SUB_6000
        JSR    SUB_6000

CODE_2512
        LDA    #$20
        STA    ZP_08

CODE_2516
        JSR    SUB_2408    ; опрос клавиатуры, рисование лазеров
        LDA    #$20
        JSR    SUB_FB94    ; а это тоже задержка, но процедура Монитора вызвана напрямую
        DEC    ZP_08
        BNE    CODE_2516

Что бы ни случилось - вызывай SUB_6000 :)
Мне кажется, что все эти SUB_6000 связаны с тем, что часть бинарника была потеряна. Наверное, один из этих вызовов чистил экран, другой показывал заставку или инструкцию, третий инициализировал переменные.
Хотя игру могли переделать целенаправленно. Например, кому-то не понравились горшки с медом и он спрайт испортил, а координаты поменял на $FFFF. Но в любом случае, кусок игры утерян.

11

Re: Novarob

Игорь, а у тебя же есть возможность поискать по коллекции последовательность байт?
В этой игрушке довольно хитрый способ упаковки картинок. Например, цифры для счета хранятся как картинки, но с разрешением 1 бит на пиксель и с необычным порядком пикселей. Поэтому вряд ли в других игрушках эти цифры будут упакованы точно также. А если другие игрушки и найдутся, то велика вероятность, что они от того же автора (ну, либо авторы друг друга знали). Было бы любопытно поискать вот такой массив:

C4 04 C4 C4 C0 C4 C4 C4
C4 C4 C0 44 C0 80 C0 40
40 80 C0 C0 C0 04 80 84
C4 C4 C4 80 C4 C4

12 Отредактировано Voldemar0 (05-02-2022 06:50)

Re: Novarob

Такая последовательность есть только в kms, но в закоулках базы нашёлся один неопознанный файл,
вероятно, ещё одна версия.

$ Fgrep -rb 'C4 04 C4 C4 C0 C4 C4 C4 C4 C4 C0 44 C0 80 C0 40 40 80 C0 C0 C0 04 80 84 C4 C4 C4 80 C4 C4'
HEX substring: C4 04 C4 C4 C0 C4 C4 C4 C4 C4 C0 44 C0 80 C0 40 40 80 C0 C0 C0 04 80 84 C4 C4 C4 80 C4 C4
                          ./Gamez/Эти точно для Агата/KMS - Космос/9b/KOSMOS.FIL: $05C2
                              ./Gamez/Эти точно для Агата/KMS - Космос/KOSM_.FIL: $05C2
                               ./Gamez/Эти точно для Агата/KMS - Космос/KOSM.FIL: $05C2
                          ./Gamez/Эти точно для Агата/KMS - Космос/   9   10.FIL: $05C2
                            ./Gamez/Эти точно для Агата/KMS - Космос/NOVAROB.FIL: $05C2
                             ./Gamez/Эти точно для Агата/KMS - Космос/9a/KMS.FIL: $05C2
                                            ./Частные коллекции/Nippel/Q/KMS.FIL: $05C2

При сравнении с другими kms выяснилось, что она является увеличенной копией уже известной версии:
# ./9a/KMS.FIL:1 <<< ./KMS.FIL:1 => 150 %

см аттач, мож там что полезное есть, хотя больше похоже на лишний мусор.

Post's attachments

Attachment icon KMS.FIL 3.04 kb, 127 downloads since 2022-02-05 

13

Re: Novarob

Да, к сожалению там просто мусор в конце файла. Без учета мусора это точная копия "./9a/KMS.FIL".

14 Отредактировано garnizon (05-02-2022 17:08)

Re: Novarob

Вот это  да. А можно создать хоть какой-то рабочий вариант? Чтоб баночки меда были и под ИКП?
Хотя возможно это надо в раздел "недоделки\сильно битые" отправить, сомневаюсь что мы когда-то найдем оригинал.