1 Отредактировано Voldemar0 (27-01-2019 11:10)

Тема: way in hell : идёт на девятке ?

Привет!

Непонятнка вылезла: есть игрушка way in hell, почему-то она идёт в эмуляторе и на семёрке  и на девятке,
но на реальной девятке (три платы разных проверил) зависает после построения игрового поля.
Т.е. после того, как поле нарисовано, в FUEL должен появится счётчик топлива, а Time начнёт отсчёт.
Но на реале этого не происходит (Time висит в значении 0000, а FUEL рисует пустой прямоугольник).

Если есть возможность, проверьте в реале и можете погонять в эмуляторе, расскажите, у кого как пошло.

Образ загрузочного диска в аттаче. Можно пробовать оба образа на любой архитектуре.

(Есть сообщения, что fr1_0 не стартует на семёрке, мне будет интересен ваш опыт)

PS Аппаратный таймер игра не использует, это я проверил. Тест Лисина на всех трёх платах проходит.

Post's attachments

Attachment icon fr.rar 186.94 kb, 312 downloads since 2019-01-27 

2

Re: way in hell : идёт на девятке ?

Попробовал сейчас оба образа на эмуляторе Олега (версия 1.29.1). Использовал предустановленную конфигурацию "девятки" - IKP-9. Загрузил Бейсик с ИКП, потом менял диск и запускал игру. С обоих образов игра запускается и работает нормально. Во всяком случае, до старта доходит и полететь получается. Приземлиться, правда, не выходит. Но, насколько я помню, в этой игре я первый уровень никогда не проходил :) Повторил эксперимент с предустановленной конфигурации "семёрки - (1a) A7 - Games, результат аналогичный, игра работает. Вышеописанное повторил с загрузкой из образов "Быстрозапускалкой" - игра работает в обоих конфигурациях.
Вечером постараюсь проверить оба образа на "семёрке" с эмулятором дисковода, если успею.

3

Re: way in hell : идёт на девятке ?

С запозданием - сегодня проверил на реале девятки. Игру взял отсюда: http://agatcomp.ru/Gamez/Wayinhell.shtml, предварительно проверив на эмуляторе девятки (через ИКП-бейсик) и убедившись, что работает нормально. Запустил на реальной девятке - всё, как в первом сообщении. Нарисовался игровой экран, появился пепелац и завис в воздухе, не коснувшись платформы. После этого игра ни на что не реагировала, в том числе и на сброс.

4

Re: way in hell : идёт на девятке ?

Давным-давно я в неё именно на девятке и гонял.

Турбо АГАТ-9/16 (ЦП 65C802, 5 Махов, dual-port SRAM).

5

Re: way in hell : идёт на девятке ?

LeoN пишет:

Давным-давно я в неё именно на девятке и гонял.

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

6

Re: way in hell : идёт на девятке ?

Тоже попробовал на реальном железе.
На семерке:
FR1 - работает, игра загружается и можно управлять кораблем как в эмуляторе. Но это какой-то адский хардкор, я даже не смог спуститься в первый проход вниз. Суровые были раньше игры ;).
FR2 - зависает на экране "быстропускалки" с такими сообщениями:

...... СЕГМЕНТ 1/2
2015 ......
17< 46< D9< 5C< 20< 61< 60< 0A<
СЕМЕРКА
МОДУЛИ ЭМПЗУ/ДОПОЗУ
В СЛОТАХ 2/4

На нажатие УПР+СБР реагирует но выводит мусор.

На девятке:

Оба образа зависают с одним и темже результатом. Картинку приложил.
Сброс работает и возвращает в меню выбора игры.

Post's attachments

Attachment icon 190707-173307-963.JPG 84.94 kb, 288 downloads since 2019-07-07 

7

Re: way in hell : идёт на девятке ?

Нда, прикольно. Тупил в листинг два дня и кажется понял, в чем тут дело.
Вообще, тут много странных вещей - какой-то мертвый код, который никогда не вызывается, какие-то остатки утилит для копирования, даже копирайт Apple, правда непонятно к чему он относится, явно не к игре.
Очень странно выглядят обращения к устройствам ввода-вывода. Например, такие:

        LDX    #$80
        STX    ZP_E3
        STX    DATA_C40A

CODE_5011
        LDA    (ZP_E0), Y
        STA    (ZP_E2), Y
        INY
        BNE    CODE_5011

Казалось бы, причем тут ячейка принтера? Я думаю не причем, видимо, STX должен был произойти в какую-то рабочую переменную, но файл, похоже, в этом месте битый.

Но основные грабли зарылись в обращении к динамику. Во-первых, адрес используется $C03A. Я перекопал кучу карт памяти самых разных машин (atari, bbc micro, commodore) - ни у кого динамика в этом месте нет.
Но это полбеды. Основная беда тут:

CODE_4261
        LDA    ZP_00
        INC    DATA_C03A
        BNE    CODE_4261
        INC    DATA_C03A
        RTS

Команда INC прочитает данные из $C03A и прибавит к ним 1. На семерке она прочитает $FF, получится 0 и управление провалится через BNE. Но на девятке, по причине, которую, наверно надо в отдельной теме объяснить, она прочитает $C0. Прибавит 1, получится $C1 и цикл станет крутиться вечно. Эмулятор же девятки возвращает при чтении $FF.

Я сделал пропатченную версию, в которой все INC заменены на STA, а BNE CODE_4261 заменено на два NOP.
Проверьте (заодно оцените изменения в звуковом оформлении). К сожалению, это точно не все баги (как минимум, в коде прописано, что жизней 9, а при старте идут они с 0), так что наверно, надо продолжать искать оригинал.

Post's attachments

Attachment icon PATCHED_FR.zip 139.88 kb, 258 downloads since 2019-07-09 

8

Re: way in hell : идёт на девятке ?

Патченая запустилась на девятке.
Со счетчиком жизней и правда глюки.
Звук вроде особо не изменился.

Post's attachments

Attachment icon 190709-150830-450.JPG 84.28 kb, 258 downloads since 2019-07-09 

9

Re: way in hell : идёт на девятке ?

sintech пишет:

Звук вроде особо не изменился.

У меня в эмуляторе просто не было звука при столкновении корабля со стенами, а после патча появился.

10

Re: way in hell : идёт на девятке ?

Тут вся интрига не в том, почему она не идёт в реале, а почему она идёт на эмуляторе девятки, но не идёт на реальной девятке.

Т.е.  что именно эмулятор делает неправильно.

Но я изучу версию про порты динамика. Хотя в эмуле там возвращается именно C0.
Кстати, если кто знает, расскажите, почему так происходит у девяток ?
FF на семерке понятна - на запрос по шине никто не откликается, а висящий в воздухе ТТЛ-вход тянется к единице. Но откуда у девятки в неиспользуемых портах читается старший байт адреса ?

11

Re: way in hell : идёт на девятке ?

Voldemar0 пишет:

Но откуда у девятки в неиспользуемых портах читается старший байт адреса ?

Меня тоже это давно интересует.

Турбо АГАТ-9/16 (ЦП 65C802, 5 Махов, dual-port SRAM).

12

Re: way in hell : идёт на девятке ?

Voldemar0 пишет:

Хотя в эмуле там возвращается именно C0.

А мы про один и тот же эмулятор говорим? Я проверял на эмуляторе Олега Одинцова 1.29, у меня из C030 читается FF.

Voldemar0 пишет:

Но откуда у девятки в неиспользуемых портах читается старший байт адреса ?

LeoN пишет:

Меня тоже это давно интересует.

Ответил тут http://forum.agatcomp.ru//viewtopic.php?id=252

13 Отредактировано Voldemar0 (11-07-2019 07:35)

Re: way in hell : идёт на девятке ?

Нет, я про юниховый эмулятор говорю. Там именно Cx на девятке читаются.
Но, судя по находкам, велми вероятно, что всё равно разгадка где-то недалеко.

Спасибо за "старший байт"!

14 Отредактировано Voldemar0 (14-07-2019 16:33)

Re: way in hell : идёт на девятке ?

:(( проверил юниховый эмулятор - там ошибка, реально возвращается FF, хотя даже процедура-заглушка есть возврата несуществующих значений и , но , похоже, я её в некоторые места забыл воткнуть :(

Забил себе в ToDo исправить безобразия.

Как ты нашел этот кусочек глючного кода  (я про игрушку) ?!


(!! даже если ваша программа работает, хотя вы знаете, что вроде бы и не должна - проверяйте - почему ?
Нередко это вытягивает за собой целую гирлянду открытий !!)

15

Re: way in hell : идёт на девятке ?

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


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

Нашел, как мне показалось, удачное место: процедура проверки площадок сразу ставит флаг "было столкновение", а потом, если координаты корабля совпали с одной из площадок, его сбрасывает. Сделал так, чтобы флаг не ставился. Стало возможно летать, сталкиваясь со стенами.

Так вот, я часа два убил, чтобы добраться до последней площадки :) Инерция то ого-го, а топлива мало. А когда сел на последнюю, то понял, что пропатчил неудачно: я думал, процедура проверяет все площадки, а оказалось, что все кроме последней, поэтому проверка окончания уровня перестала работать.

Ладно, пропатчил по другому. В ресурсах заодно увидел, что должно быть минимум 4 уровня. После уровня 1.1 начался уровень 1.2, потом 1.3, потом 1.4.

Интересно, думаю, все приличные игрушки как-то игрока вознаграждают. Ну там, какая-то надпись одобрительная, какой-то мультик, ну хотя бы строчка в таблице рекордов. Здесь же, судя по сложности, вознаграждение должно быть просто каким-то заоблачным. Ну, либо я не понял жанр игры и это просто симулятор управления космическим аппаратом. Тогда, может быть и нет никакого вознаграждения: типа посадил корабль и молодец.

После уровня 1.4 начался уровень 2.1. Внешне копия самого первого. Тут мне в голову закралась мысль, что здесь, как во всяком порядочном аду, наверно семь кругов...
Потом я обнаружил, что ад обитаем :-/

После уровня 2.4 начался уровень 3.1, чертей с щупальцами стало больше. Спустя несколько уровней черти пропали, но корабль стал управляться как-то более резко. А на уровне 5.3 игрушка нарисовала какую-то кашу вместо уровня и повисла (запускал под эмулятором семерки). Злая игруха :))

Post's attachments

level2.1.png, 5.72 kb, 512 x 512
level2.1.png 5.72 kb, 270 downloads since 2019-07-14 

16

Re: way in hell : идёт на девятке ?

А счётчик топлива остановить можно? Интересно поиграть с читами, не боясь стен и сухого бензобака :)

17

Re: way in hell : идёт на девятке ?

AlexBel пишет:

А счётчик топлива остановить можно? Интересно поиграть с читами, не боясь стен и сухого бензобака :)

Забей :

588E:ea ea ea

и ни в чём себе не отказывай :)

18

Re: way in hell : идёт на девятке ?

Спасибо! :)

19

Re: way in hell : идёт на девятке ?

Так это пинг-понг какой-то получается :) Уровень 1.2 так сложновато будет пройти и сквозь чертей не пролететь.
Надо хотя бы вот так сделать:
4161:ED
Правда ускоряться сильно нельзя (отскока нет, но скорость сохраняется и гасится довольно медленно).

20 Отредактировано Voldemar0 (16-07-2019 21:21)

Re: way in hell : идёт на девятке ?

5c2e:50 - накинуть топлива на первой заправке

Насколько удалось понять: по простому уменьшить силу отскока нельзя, так как столкновение приводит к инвертированию скоростей, причем рост скоростей постоянный, но он перекручивается через разрядность, за счёт чего скорость не растёт бесконечно и даже может уменьшаться. Т.е. нужно вводить некую процедуру сглаживания скоростей (уменьшения по модулю).

21

Re: way in hell : идёт на девятке ?

Здесь уже столько по этой игре... Может, добавить в информацию о ней на сайте? Есть же читы для других игр.
Кстати, здорово - POKEs для "Агата"! На "Спектруме" этому посвящены целые книжки, чем "Агат" хуже? ;)

22

Re: way in hell : идёт на девятке ?

А в коде игры, может где-то попадался хоть намек на то, кто автор?

23 Отредактировано avivanov76 (17-07-2019 15:51)

Re: way in hell : идёт на девятке ?

Voldemar0 пишет:

Насколько удалось понять: по простому уменьшить силу отскока нельзя, так как столкновение приводит к инвертированию скоростей, причем рост скоростей постоянный, но он перекручивается через разрядность, за счёт чего скорость не растёт бесконечно и даже может уменьшаться. Т.е. нужно вводить некую процедуру сглаживания скоростей (уменьшения по модулю).

Расскажу, как я понимаю схему управления: есть 4 16-разрядных счетчика. То, что лежит в счетчиках, мне кажется, физического смысла не имеет. Можно назвать эти числа "скоростями", но в реальном мире у предмета не может быть одновременно скорости вверх, скорости вниз, скорости влево и скорости вправо.

Есть очередь команд, в которой изначально нули. Стрелка вниз записывает в эту очередь 6 единичек, стрелка влево - 6 двоек, стрелка вправо - 6 троек. Есть процедура, которая эту очередь читает и сдвигает ее на 1 позицию, при этом в хвост очереди записывается нуль. Каждая из цифр (0..3) инкрементит свой счетчик.

Настоящая вертикальная скорость получается после вычитания из "скорости вниз" "скорости вверх", а горизонтальная - после вычитания из "скорости вправо" "скорости влево". Настоящие скорости складываются с текущей вертикальной позицией корабля ($8043, $8042) и горизонтальной ($8041, $8040).

То есть, чтобы убрать движение, нужно приравнять "скорость влево" к "скорости вправо", а "скорость вверх" к "скорости вниз".

Но тут есть засада: корабль-то бьется каким-то одним боком, а скорости придется гасить обе. Это будет странно выглядеть. Кстати, отскок с изменением скоростей, который сейчас есть, тоже выглядит странно: вот корабль летит слева направо, медленно теряя высоту. Он бьется об пол и начинает лететь назад. Но если в реальности мяч так кинуть, он ведь после отскока продолжит лететь вперед, у него только вертикальная скорость изменится.

Чтобы это исправить, нужно знать, с какой стороны корабля было столкновение. Но в игре сделана простейшая проверка, которая возвращает только признак "было столкновение/не было столкновения". Без переделки этой проверки управление не улучшить.

garnizon пишет:

А в коде игры, может где-то попадался хоть намек на то, кто автор?

Я даже на более простой вопрос: адаптация это или нет, и то не могу ответить :) Игрушка очень хочет казаться иностранной: все надписи и заставка по-английски, даже клавиши называются SPACE и ESC. Но гугление пока ничего не дало.

В коде есть две интересных строчки: "РАБОТА С ФАЙЛАМИ        АГАТ (7-9)      wolvskij1986 Г." и
"COPYRIGHT 1979 APPLE COMPUTER INC.  ". Есть даже кусок каталога диска. Но как это относится к игре - не знаю. Скорее всего, в коде просто было пустое место и эти строчки - исходное содержимое памяти, то есть к игре они не относятся никак.

С другой стороны, в коде много следов экспериментов: есть вариант кода, использующий прерывания, в процедурах явно все патчено-перепатчено еще до нас :)

И вот еще какая догадка: тут кусок каталога, в нем имена программ UNPACKMOD, UNPACK', UNPACKMODIT. Так могли бы называться программы для распаковки. Так вот, я думаю, что глючный код, типа INC $C03A, мог появиться при распаковке битого архива. А куча патчей в коде - это могла быть попытка заставить работать неправильно распакованную программу.

24 Отредактировано Voldemar0 (18-07-2019 06:16)

Re: way in hell : идёт на девятке ?

Да, интересно. Я дошел до "скорость влево" и "скорость вправо" и на этом бросил. Когда увидел, что стрелки вправо-влево увеличивают каждая свою скорость, понял, что дальше логика будет уже совсем не прозрачная.

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

Интересно, почему автор ввёл такое количество переменных, вместо того, чтобы использовать обычные физические величины:
unsigned int x, y; int velocityX, velocityY.... ?

25 Отредактировано Voldemar0 (18-07-2019 20:14)

Re: way in hell : идёт на девятке ?

> АБОТА С ФАЙЛАМИ        АГАТ (7-9)      wolvskij1986

Это куски руссифицированной проги FID (FIle Developer)
Она с эпла, отсюда копирайт.
Адаптировали её, скорее всего, на ЛЭМЗ, потому что она входила в комплект ранних семёрок.
В "заводских" версиях FID был такой лейбл:
"РАБОТА С ФАЙЛАМИ   АГАТ  (7-9)  МОСКВА  1986"
Именно так, большими буквами.
Это потом уже кто-то с шаловливыми ручками копирайты перебивал, вероятно, по приколу или, в надежде, что всё это когда нибудь где-нибудь выводится игрушкой, хотя это был просто мусор.
Перебивал именно внутри самой way in hell, так как в коллекции
есть её копии, в которых "МОСКВА" на месте.

С выходом ИКП её заменил копировщик из состава ИКП.
Так что, во всяком случае, Way in Hell - очень ранняя прога.

Кусок встречается во многих её экзмеплярах.

-==

Кстати, стиль оформления руссифицированного FID очень напоминал проги некоего
Лёвина - автора шахматных прог и крупных агатовских баз данных.
И годы те же. И ещё игрушка SABOTAGE/ДИВЕРСАНТ в некоторых агатовских версиях имела шапку в точно таком
же стиле.

И вот ещё: попадались нам когда-то известные проги, но якобы в версии для агат-4. У них была такая интересная особенность: там явно что-то было с портом клавиатуры. Не то его побитно читали, не то
не с c000, а с типа вроде c003... И вот я думаю - может WIH тоже писали изначально под 4-ку ?

И ещё: где-то в чьей-то переписке попадалось мне упоминание некоего компьютера на базе агата,
вроде как принадлежащего не-то генконструктору, не то ещё кому-то из тех людей: там вроде как была
семёрка, но разогнанная едва ли не до 512 кб озу и ещё чего-то в ней было навёрнуто. Кажется, её называли "крокодил". То есть в те годы, когда софта ещё было
мало, вполне возможно, что приближенные к цеху могли строить себе какие нибудь не очень совместимые
с семёркой или девяткой версии. Вроде экспериментальных или просто для себя, домой...

Это может быть объяснением хитрого доступа к звуку.

--=-

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

-=-=

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

Post's attachments

Attachment icon 00010 - no fuel, slow.fil 22.54 kb, 279 downloads since 2019-07-18