26

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

Интересные подробности!

Voldemar0 пишет:

Это куски руссифицированной проги FID (FIle Developer)

Да, я заметил русские и английские строчки вперемешку и подумал, что наверно это результат русификации.

Voldemar0 пишет:

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

Не знаю, в коде есть как нормальные обращения к динамику через BIT $C030, так и кривые. С клавиатурой похожая ерунда: где-то к $C010 обращение инструкцией BIT, где-то INC.

Voldemar0 пишет:

там вроде как была семёрка, но разогнанная едва ли не до 512 кб озу и ещё чего-то в ней было навёрнуто

Вот это загадка: что можно было делать тогда с таким объемом ОЗУ. Кроме электронных таблиц ничего в голову не приходит. Но ведь такой объем еще выгрузить куда-то надо. Если на тот момент 840К контроллер еще не был готов, то вообще жесть получается.

Voldemar0 пишет:

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

У меня тоже ощущение, что игрушка именно пытается казаться иностранной, а сделана или у нас или где-то в странах СЭВ. Может из-за опечатки (все таки правильно lives, а не lifes).

27

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

avivanov76 пишет:
Voldemar0 пишет:

там вроде как была семёрка, но разогнанная едва ли не до 512 кб озу и ещё чего-то в ней было навёрнуто

Вот это загадка: что можно было делать тогда с таким объемом ОЗУ. Кроме электронных таблиц ничего в голову не приходит. Но ведь такой объем еще выгрузить куда-то надо. Если на тот момент 840К контроллер еще не был готов, то вообще жесть получается.

1. "Что охраняешь - то имеешь"(с)Михал Михалыч. Если есть возможность сколотить себе домой такую машинку - почему бы ей не воспользоваться? Памяти много? А когда лишняя память была лишней? Кто знает, что будет потом? Нужно пользоваться моментом. "Пишите три, пусть портится!"(С)Карцев и Ильченко, "Склад"
2. Наверняка про электронный диск тогда понятие имели и такая память могла быть использована именно для него. Реализовано это или нет, но это чуть ли не основное применение большим объёмам памяти в то время, когда накопители были ещё недостаточно совершенны.

Может, я и ошибаюсь, но, думаю, обе версии имеют право на жизнь :)

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

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

Память могла быть либо концепцией нового компа либо потому что можно было либо электронный диск. Да, электронный диск вполне был в то время реализован в BTK. И, вероятно, не только там. Я писал свой электронный диск для Бейсика-60/семёрки, например. Работало нормально.

Но я могу предположить ещё один вариант: возможно, разработчики надеялись выбить рессурсы для переноса на агат какого нибудь языка высокого уровня, типа C, и тогда бы память очень даже пригодилась бы. 140кб всё таки на тот момент были не слишком большими флопиками, наверняка призрак 840ки уже маячил очень конкретно. А появись C - и написание здоровых, не сильно оптимизированных по объёму кода, программ наступило бы моментально.

29

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

Игрушка никак не отпускает :) Вот еще чего хотел добавить:

1) в версии 00010 - no fuel, slow.fil обнаружилась возможность перейти к следующему уровню, если в момент показа заставки нажать УПР+А (А - латинская). Я дощелкал до уровня 7.4, прошел его (с помощью отладчика) и игруха повисла на уровне 8.1 :)

2) нашел "дальнего родственника" этой игрушки - Space Maze (https://www.youtube.com/watch?v=KAzEWT20WSc) Внешний вид отличается, заправок нет, но суть та же: надо провести космический корабль по лабиринту, не касаясь стен за минимальное время. Игрушка 1978 года, образа диска нет, так как распространялась она на кассетах. Написана в основном на Бейсике, причем не Майкрософтовском, а Возняковском INTBASIC. Для вывода звука и рисования используются несколько процедур в машинном коде. Управление кораблем с пультов.

3) я выше писал, какая тут замороченная схема управления: коды клавиш преобразуются в команды и кладутся в очередь, причем одно нажатие генерирует аж 6 команд. Непонятно, зачем вообще тут очередь, зачем так сложно?

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

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

Но Space Maze меня натолкнула на другую мысль: а может, тут тоже первоначально было управление с пультов? Тогда очередь могла использоваться для сглаживания ввода. Я помню, как на Правце проходил Каратеку на пультах. Это песня была. Все помнят "шуршащие" регуляторы громкости на старой радиоаппаратуре?
Такой же "шорох" есть и на пультах: чуть-чуть сдвинешь ручку и герой внезапно начинает бежать на врага или выбирается не тот удар. Очень раздражает в момент боя. (Хотя в целом, играть было все же удобнее, чем с клавиатуры.)

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

В итоге, управление с пультов либо убрали, либо не доделали и заменили управлением с клавиатуры. А поскольку каждая команда по-прежнему меняет скорость на чуть-чуть, то каждое нажатие добавляет в очередь сразу 6 команд.

30 Отредактировано Voldemar0 (22-07-2019 19:04)

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

... а у эпла есть аппаратная защита от дребезга кнопок ?

У агата есть, но вот что интересно: Цикоза в Школьнице делал её зачем-то программную.
Если её убрать, в текстовом редакторе ДОК кнопки становятся несколько отзывчивее.
Опять призрак агата-4 ? :)

-=-

5A0C:A9 00 EA
- делает отскок ещё мягче.

-=-

И ещё один сложный патч:
0400 -   8D 4B 80
0403 -   4E 49 80
0406 -   4E 4B 80
0409 -   60
5A45 -   4C 00 04
Даёт частичное гашение горизонтальной скорости при столкновении.
Успокоитель :)

31

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

Voldemar0 пишет:

... а у эпла есть аппаратная защита от дребезга кнопок ?

Конечно есть. Там используется микросхема клавиатурного энкодера MM5740. Сам этот энкодер - это схема, сканирующая матрицу клавиатуры, плюс масочное ПЗУ для перевода скан-кодов в коды клавиш. Для защиты от дребезга в нем есть встроенный одновибратор, время задержки которого можно менять с помощью внешнего конденсатора. Кстати, задержка там выставлена 8 миллисекунд (в Агате - 40).

Voldemar0 пишет:

У агата есть, но вот что интересно: Цикоза в Школьнице делал её зачем-то программную.

Загадочно. Вообще, я не думаю, что клавиатуру к Агату могли сделать без аппаратной защиты от дребезга. Ей бы просто нельзя было пользоваться. Но возможно качество кнопок "превзошло" ожидания конструкторов и встроенной защиты не хватало.

32

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

В итоге можно сделать UNIверсию игры, что стартовала и на 7 и на 9, скажем из быстропускалки?

33

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

Можно. Версия в архиве PATCHED_FR.zip, который я на первой странице выкладывал. Там, правда, есть еще места, которые слегка по разному работают на семерке и на девятке. Например, на семерке клавиша РЕД действует как пауза.
Но поскольку там цикл опроса клавиатуры сделан через инструкцию BEQ, то на девятке конечно это не работает.

34

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

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

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

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

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

Например, в начале игры лежит картинка со словом WAY, но шириной 23 байта (смещение 12489 от начала .fil). Видимо, заставка сначала собиралась из отдельных картинок. А потом авторы решили, что проще весь экран сохранить.

По смещению 20460 лежит картинка со словом TIME=. Видимо, в начале авторы хотели выводить надписи картинками. Есть еще прикол с тем, что картинки для цифр 0-9 встречаются два раза. То есть, авторы сначала хотели обойтись картинками, потом добавили цифры, а в конце концов добавили полноценный знакогенератор, в котором есть все символы с ASCII кодами от $20 до $5F.

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

CODE_5CEE
        JSR    SUB_5676
        LDA    #$90
        STA    DATA_C0D0

CODE_5CF6
        LDA    KEYBOARD
        CMP    #$9B
        BEQ    CODE_5CF6
        STA    KBDSTROBE
        LDA    DATA_C0D3
        STA    DATA_8490

Интересен он тем, что из порта C0D3 читается некое значение и кладется в конец очереди команд ($8490). Клавиатура, как видно, тоже читается, но проверяется только клавиша РЕД. А в начале процедуры есть запись байта $90 в адрес $C0D0.

Что бы это могло значить? Если напрячь фантазию и предположить, что в 5 слоту у нас ячейка последовательного и параллельного интерфейса, а авторы перепутали местами $C0D0 и $C0D3, то тогда получается, что в начале процедуры ВВ55 программируется на ввод из порта A ($90 - это управляющее слово и его логично писать в $C0D3), а затем из порта  А ($C0D0) читается команда для управления кораблем.

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