1 Отредактировано garnizon (24-01-2021 02:36)

Тема: Pusher

Как-то обсуждали с Володей почему в версии PUSHERа 93 года нет звука при раздвигающихся полосках, оказалось что обращение к динамику там выполняется записью:

Мне неоднократно попадались проги, которые имели почему-то звук именно через запись, а не чтение.
В доках (специально вчера порылся) везде говорится одно и то же: "любое обращение к ячейкам C03x". Но я помню по себе, что звук был нормальный только при чтении. Вчера - так же специально - порылся по схеме девятки: там отчетливо видно, что группа портов Cxxx обслуживается одной группой микросхем, которая ведёт себя, предположительно, так: при любом возникновении на шине адреса заданного порта & определённой фазе тактового сигнала.

1 МГц мерцает сначала сигнал групп третьего разряда (CnXX), потом, если n = 0, второго разряда (C0mX), потом, если m = 6 - первого (C06X). Это цепочка, действующая по одному и тому же правилу. Почти все переключатели этих групп, по смыслу, могут срабатывать как один так и несколько раз подряд, без ущерба для функционирования устройств. Например: если строб клавиатуры (C01X) приходит не один раз, а дважды - это ничего не меняет: нет разницы, сбросить порт один раз или два подряд. Или даже три.

Но звук (как и запись на магнитофон), построены так, что им важно количество обращений. Звук формируется триггером, который перебрасывается в противоположное текущему состояние, на каждое обращение. Соответственно, диффузор динамика на каждое, например, LDA $C030 будет дёргаться в разные стороны.

Но с командами записи, например, STA $C030, всё немного сложнее: процессор формирует два обращения (или 4?) на один и тот же адрес. Получается, что диффузор в начале команды дёргается в одну сторону, а в конце - сразу - в другую. Команда длится около 4, что ли, тактов, т.е. время между рывками составляет 2-4 мкс. Из -за механической инерционности, он, скорее всего, почти не сдвинется с места за столь короткий промежуток времени. Реально, мне так вспоминается, звук при этом можно было услышать, но очень тихий, и, наверное, неправильной тональности. Тут важно: если звуковой канал имеет хоть какую -то фильтрацию высоких частот (в УНЧ, например), то этот импульс до динамика вообще не дойдёт из-за очень короткого периода.

Эту идею я вчера проверил на девятке, не с реальным динамиком, а вольтметром и она вполне подтвердилась.

Почему, тем не менее, некоторые разработчики писали именно команду записи?

Может быть:

1) они получали очень тихий звук, но не догадывались, что это их ошибка.
2) может быть некоторые платы имели какую-то особенность, из -за которой  звук на команды записи формировался правильно.
3) может быть разные версии CPU имели разные графики выдачи данных на шину (это мало вероятно, т.к. есть риск того, что неправильно бы заработал контроллер 140ки).

Кроме того, я точно не знаю, что было в семёрке. Вроде бы также? но мало ли....
Могли ведь взять семёрочные процедуры и не проверить их на девятке?

В вложении две версии PUSHERа, оба диска запускаются на любой системе (7 или 9).

Звук когда раздвигаются полоски есть только в старой версии.
Шаги озвучиваются во всех версиях, как и момент постановки ящика на место.
Свистящий звук о окончании уровня есть только в новой версии.

Post's attachments

Attachment icon PUSHERnew.DSK 840 kb, 324 downloads since 2018-01-06 

Attachment icon PUSHERold.DSK 840 kb, 310 downloads since 2018-01-06 

2

Re: Pusher

garnizon пишет:

Но звук (как и запись на магнитофон), построены так, что им важно количество обращений. Звук формируется триггером, который перебрасывается в противоположное текущему состояние, на каждое обращение.

А как в Мониторе и в Васике при записи на мафон идет обращение к триггеру: LDA или STA? И какой адресацией?


garnizon пишет:

Но с командами записи, например, STA $C030, всё немного сложнее: процессор формирует два обращения (или 4?) на один и тот же адрес.

Не-не-не-не! Мы уже с Владимиром спорим об этом.
Вот пруфы:
http://forum.6502.org/download/file.php … ;mode=view (отсюда - http://forum.6502.org/viewtopic.php?f=4 … hilit=sta) - здесь прекрасно видно одно обращение (при STA $0D00)
http://www.emuverse.ru/wiki/MOS_Technol … ема_команд
http://www.defence-force.org/computing/ … /annexe_2/
http://www.westerndesigncenter.com/wdc/ … 5c816s.pdf

Абсолютная адресация, 4 такта, что LDA, что STA. Один такт - выборка опкода. Два такта - два байта-операнда - выборка адреса аргумента. Из общих 4 тактов остался один - выборка аргумента.


garnizon пишет:

Почему, тем не менее, некоторые разработчики писали именно команду записи?

Каюсь - раньше тикал спикером записью, уже давно тикаю BIT $C030.


garnizon пишет:

2) может быть некоторые платы имели какую-то особенность, из -за которой  звук на команды записи формировался правильно.

Дас ист фантастиш!


garnizon пишет:

3) может быть разные версии CPU имели разные графики выдачи данных на шину (это мало вероятно, т.к. есть риск того, что неправильно бы заработал контроллер 140ки).

Дас ист фантастиш!

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

3

Re: Pusher

> В вложении две версии PUSHERа, оба диска запускаются на любой системе (7 или 9).
И например на девятке в новой версии нет звука когда раздвигаются полоски, когда человечек ходит звук шагов есть. И еще есть звук когда ставишь все ящики на место, такой свистящий (а вот свист есть только в новой версии).


Я вот че-то от этой фразы вовсе запутался: мне так помнится, что вопрос у тебя изначально (ещё когда мы в аське обсуждали) был о том, почему звук есть на семёрке, но нет на девятке.
Ну, допустим у меня склероз и вопрос задан как-то по другому.

Но вот тут (сейчас) не ясно: одна версия имеет звук , другая - нет. А почему не предположить, что его просто нет там (ну то есть в новой версии) ?

4 Отредактировано garnizon (07-01-2018 12:18)

Re: Pusher

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

Теория с тем что просто приглушить звук хотелось - маловероятна. Ведь у него скорее всего Московская девятка была, а у них тумблер звука на задней стенке.

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

5 Отредактировано garnizon (07-01-2018 12:43)

Re: Pusher

Т.е. конечно могу предположить что моя девятка глючит, но вроде обычно все работало.

Но что-то подсказывает что у семерки и девятки есть разница неочевидная.
Я не про те случаи как Shamus, там для звука таймер используется, соответственно, он вектора неправильно ставил для девятки.

А вот например STAR BLAZER , проверено на реалах - в девятке звук есть, а в семерке нет.

6 Отредактировано LeoN (08-01-2018 03:02)

Re: Pusher

Voldemar0 пишет:
LeoN пишет:
Voldemar0 пишет:

Проверял, смотрел, как осцилографом на своём устройстве так и на триггере звука вольтметром.

Какая адресация была для STA?

понял, там была какая-то из индексных.
На прямой (8D), действительно, один импульс

ЧИТД!


Voldemar0 пишет:

я проверил сейчас: звук на одной конкретной плате работает именно по regsel: т.е. lda , похоже даже индексная:
FE18- B1 3C .. LDA (3C), Y
при обращении даёт один переход триггера звука

Пруф говорит, что "LDA (zp),Y" - 5* тактов: 1 такт - выборка опкода, 1 такт - выборка байта-операнда 0-й страницы, 2 такта - выборка абсолютного адреса из 0-й страницы, 1 такт - выборка аргумента по эффективному адресу (абсолютный + индекс). То есть одно обращение в последнем такте. * - если же индекс пересекает страницу (в эффективном адресе), то добавляется предпоследний такт с невалидным адресом - получаем 2 обращения.


Voldemar0 пишет:

но sta:
FE46- 91 40 .. STA (40), Y
даёт два перехода

В этом пруфе (стр. 43, 13 метод адресации) сказано, что "STA (zp),Y" - 6 тактов: 1 такт - выборка опкода, 1 такт - выборка байта-операнда 0-й страницы, 2 такта - выборка абсолютного адреса из 0-й страницы, 1 такт - невалидное чтение (потому что запись STA), 1 такт - выборка аргумента по эффективному адресу (абсолютный + индекс). Итого - два обращения в последних двух тактах.


Voldemar0 пишет:

при этом :
3000- 8D 30 C0 STA C030
даёт один переход

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


PS. Как говорится, одна голова - хорошо, а Змей-Горыныч - лучше! ;)  "Адназначна!!!" (C)

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

7

Re: Pusher

garnizon пишет:

Мне неоднократно попадались проги, которые имели почему-то звук именно через запись, а не чтение.

Основная польза звука через запись - аккумулятор не забивается мусором и никакие флаги процессора не меняются. На сам звук это никак влиять не должно (если используется абсолютная адресация).

garnizon пишет:

В вложении две версии PUSHERа, оба диска запускаются на любой системе (7 или 9).
И например на девятке в новой версии нет звука когда раздвигаются полоски, когда человечек ходит звук шагов есть. И еще есть звук когда ставишь все ящики на место, такой свистящий (а вот свист есть только в новой версии).

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

В этом есть свои резоны:
1) звуковой эффект в конце уровня гораздо логичнее. Типа, такая награда за успешное решение головоломки. Это намного лучше, чем тупой переход в меню в старой версии. Из-за этого старая версия выглядит недоделанной.
2) эти полоски раздвигаются сразу при загрузке игры - это же палево. Если учитель информатики ушел к директору, а ученики решили воспользоваться моментом и поиграть, то об этом весь этаж узнает :)
3) звук в старой версии не особо музыкальный, может и хорошо, что Бадер его убрал?

Интересно, что обе версии позволяют выключить звук. Старая при нажатии 4 на функциональной клавиатуре, новая - при нажатии F2. Еще прикол, как это сделано: в процедуре генерации звука адрес $C030 патчится на $C020. То есть, при выключенном звуке он все равно генерируется, но идет в магнитофонный порт :)

Еще из интересных находок. Старая версия содержит вот такой код:

SUB_2BA3
        LDX    #$50
        BIT    ZP_F4
        BMI    CODE_2BBE
        LDA    #$89
        STA    DATA_C083, X
        LDA    #$BF
        STA    DATA_C081, X
        JSR    SUB_2BEC
        LDA    #$FF
        STA    DATA_C081, X
        SEC
        ROR    ZP_F4

CODE_2BBE
        LDA    #$60
        STA    ZP_A1
        LDA    #$00
        STA    ZP_A0
        LDA    #$80
        STA    ZP_F1
        STA    KBDSTROBE
        JMP    CODE_2C20

Это обработчик сочетания клавиш УПР+О. Сначала я подумал, что тут какая-то игра с фазами на контроллере НГМД, но потом понял, что просто у Бадера в пятом слоте стоял модуль последовательного и параллельного интерфейса. К нему был подключен принтер и по нажатию клавиш УПР+О печаталась какая-то отладочная информация.

Так что старая версия, скорее всего, вообще была для внутреннего пользования. В новой этого всего уже нет, как и обработки УПР+О. Зато в новой обрабатываются клавиши F1 - перейти к предыдущему уровню, и F3 - перейти к следующему уровню.

8

Re: Pusher

А в новую версию никак нельзя добавить этот звук при раздвижении экрана?

9

Re: Pusher

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

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

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

10

Re: Pusher

Согласен с avivanov76 - что, в данном случае, даст это изменение игры? Исправить то, что мешает программе нормально работать - необходимость. Добавление звука туда, где его не было - совершенно неоправданное изменение программы. Тем более, как я считаю, это будет не совсем корректно по отношению к автору программы.

11 Отредактировано garnizon (08-12-2020 09:20)

Re: Pusher

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

Да, на сайте надо по возможности ближе к оригиналу выкладывать, я в соседней теме про ЛОДЕ так и писал.
На сайте надо положить новую версию ч\б и цветную они ждут в файле 170 комнат и могут пользоваться общим файлом с уровнями. А старую версию просто на другом диске или как-то еще подумать.

12

Re: Pusher

Нашёл ошибка в игрухе с чтением файла уровней:
Уровень в файле занимает 1.5 сектора.
У ранних версий игры файл уровней занимал: 80 уровней * 1.5 + 1 пустой сектор в начале файла = 121 сектор, у более поздних 170 уровней * 1.5 + 1 пустой = 256. Должно быть 256, реально 255.

Игруха использует досовский драйвер или btk'шный для доступа к дисководу, но файл ищет и читает сама.
Она его находит в каталоге, затем считывает все его TSL, собирая две таблицы адресов: номера треков всех блоков файла и номера секторов всех блоков файла.

Вероятно, из-за переполнения счётчика, если файл содержит 256 секторов, то игра считает его пустым - не даёт прочитать никакой уровень.

Но секторов 255. Поэтому читаются почти все уровни. Но последний - 170-й уровень попадает на 255й сектор файла и на 256й. 255й читается успешно, но 256-го нет, и игруха пытается читать диск в любом мусорном месте (ячейка таблицы не инициализирована). В эмуляторе это может быть и сектор 0/0 и 255/255 - как повезёт с загрузчиком и с мусором в памяти. Что было на реале - понятно.

Простое лечение: урезать файл на один сектор. В этом случае игрушка правильно понимает, что секторов 168. При этом 169 и 170й просто не пытается читать.

--

Но есть ещё один странный баг: если игрушка всё таки лезет на 255й трек (т.е. на 127 цилиндр) то олеговский эмуль почему-то у меня это схавывает (где-то по полминуты или больше напряженно думая), а у Игоря почему -то виртуальная машина зависает совсем. Если кому не лень - попробуйте у себя: pushernew из первого сообщения, ИГРА -> 170.

13 Отредактировано AlexBel (23-01-2021 08:30)

Re: Pusher

Voldemar0 пишет:

Но есть ещё один странный баг: если игрушка всё таки лезет на 255й трек (т.е. на 127 цилиндр) то олеговский эмуль почему-то у меня это схавывает (где-то по полминуты или больше напряженно думая), а у Игоря почему -то виртуальная машина зависает совсем. Если кому не лень - попробуйте у себя: pushernew из первого сообщения, ИГРА -> 170.

Опробовал PUSHERnew из первого сообщения на эмуляторе Олега, версия 1.29, Windows 10. При выборе уровня 170 система мусолит дисковод и ничего не происходит. Ждал больше двух минут, потом надоело. Попробовал загрузить уровень 010 - загрузка занимает около секунды. Всё это опробовал в конфигурациях 7 и 9.

14

Re: Pusher

У меня версия 1.29.2. При выборе уровня 170 сначала минуту непрерывно идет звук чтения секторов, потом пять минут тишина, но редко редко раздается звук чтения сектора. Потом игра снова предлагает выбрать номер уровня (вроде ничего не ломается). Семерка и девятка ведут себя одинаково.

15 Отредактировано garnizon (24-01-2021 02:11)

Re: Pusher

У меня долго тюкает чтением секторов, минут 10 ждал.

На сайте положил подправленные версии (там 168 уровней).
http://agatcomp.ru/agat/Software/Game/A … sher.shtml

Но с ходу игра не заработала в быстропускалке:
там в пушере есть проверка типа операционной системы
она по косвенным признакам проверяет, является ли система ИКП-base или BTK-base
быстропускалка ей кажется похожей на BTK, хотя она должна быть похожа на DOS3.3

Это тоже подправлено (давно).

Кстати, на диске с "Клондайк" есть цветная версия ПУШЕРА аж 1994 года, но чем отличается от 93 я не знаю и сравнить их в лоб не получается. Поздняя на абсолютных адресах диска.
http://agatcomp.ru/agat/Software/Game/A … dike.shtml


avivanov76 пишет:

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

Похоже что примерно так и есть, я думаю что это ранняя отладочная версия в графике.
Известно что первые версии (88год) были в текстовом режиме Т32. Собственно и графические имеют клетку 32х32 тайла (32х30 сетка игры и две горизонтальные строки с инфой (Рекорд, уровень, ходы...) )

16 Отредактировано Voldemar0 (24-01-2021 18:55)

Re: Pusher

Ещё докидаю заметки про пушер, раз уж начали его полоскать:

==

В некоторых версиях есть проверка типа операционной системы.
По косвенным признакам проверяет, является ли система ИКП-base или BTK-base.
Быстропускалка ей кажется похожей на BTK, хотя, на самом деле, она больше похожа на DOS3.3.
В зависимости от результата pusher использует разные обращения к RWTS.

If $03E3^ == $A9 && $03E5^ == $A0 && $03E7 == $60 then IKP

В ИКП по этим адресам стоит загрузка адреса таблицы управления RWTS:
03E3 -   A9 05 ..   ")."    LDA   #05
03E5 -   A0 57 ..   " w"    LDY   #57
03E7 -   60 .. ..   "ю"     RTS

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

Исправленные версии для Быстропускалки:

If $03E3^ == $A9 then IKP (т.е. обращения к RWTS будут через $3E3 и $3D9)
else BTK (обращения к RWTS по правилам BTK)

==

Файл уровней ищется собственным файловым менеджером, он использует две ДОСовких процедуры:
$3E3 и $3D9.

Имя файла уровней ищется в каталоге примерно здесь:

24B2 -   B1 D4 ..   "1T"    LDA   (D4), Y
24B4 -   F0 22 ..   "П."    BEQ   24D8
24B6 -   C9 FF ..   "IЪ"    CMP   #FF
24B8 -   F0 13 ..   "П."    BEQ   24CD
24BA -   A0 03 ..   " ."    LDY   #03
24BC -   A2 00 ..   ""."    LDX   #00
24BE -   B1 D4 ..   "1T"    LDA   (D4), Y
24C0 -   DD 0D 26   "].."   CMP   260D, X
24C3 -   D0 08 ..   "P."    BNE   24CD
24C5 -   E8 .. ..   "Х"     INX   
24C6 -   C8 .. ..   "H"     INY   
24C7 -   C0 21 ..   "@."    CPY   #21
24C9 -   D0 F3 ..   "PС"    BNE   24BE
24CB -   F0 0D ..   "П."    BEQ   24DA
24CD -   A5 D4 ..   "%T"    LDA   D4
24CF -   18 .. ..   "."     CLC   
24D0 -   69 23 ..   "иё"    ADC   #23
24D2 -   85 D4 ..   ".T"    STA   D4
24D4 -   90 DA ..   ".Z"    BCC   24B0
24D6 -   B0 BF ..   "0?"    BCS   2497
24D8 -   18 .. ..   "."     CLC   
24D9 -   60 .. ..   "ю"     RTS   

==

Ещё есть не бадеровский цветной пушер, для режима 128x128.

==

В разных версиях игры рабочие буфера расположены в совершенно разных местах.
При этом они объявлены в исходнике статически. Предполагаю это из того, что,
например, буфера таблицы расположения секторов PUSHER.LEVELS всегда выровнены по краю страницы (XX00).

Игруха категорически не предназначена для запуска под dos33, так как использует кучу памяти в регионе > $9000. В некоторых версиях прямо залезает на $BXXX.

==

Файл уровней - 121 блок (теперь выяснилось, что игруля сама понимает размер файла и он может быть произвольным в некоторых пределах).

Нулевой блок не используется, вероятно. Во всяком случае первые 256 байт.
В них входят первые 4 байта размера и длинны, но т.к. pusher читает файл своими процедурами,
эти байты не относятся к формату.

Уровни нумеруются от 1 до 80.
01й уровень находится в 1 и 2 блоках (пропуская 0-й блок)
80й уровень находится в предпоследнем и последнем блоке.

Чтение уровня происходит в буфер $9400..95FF.

Размер уровня (предположительно) - 32x30 элементов
Описание каждого уровня - $180 байт
Зашифрованы несколькими EOR

Первые $18 байт имеют различное назначение, в остальных закодирована карта уровня, по 3 бита на элемент.

  // нач поз    - buf[$00..$01]                                                                                     
  // контрольки - buf[$02..$03]                                                                                     
  // рекорд     - buf[$04..$08]                                                                                     
  // имя        - buf[$09..$17]                                                                                     

Кому надо - есть исходник на C, который умеет парсить файл уровней (генерирует PNG с картинками всех уровней). Для сборки нужна imlib2.

==

Заметки про сборник Пушер+Клондайк.

Привет от Бадера

Внутри следующие штуки:

- Загрузчик: представляет собой что-то вроде BTK, но с отключенной заставкой. Не знаю, сколько
там от реальной BTK, но по объёму и виду кода - там полноценная операционка, вроде
даже есть системный монитор, но так же и I/O для 140 и 800к дисков, и, похоже, виртуальный
диск.

- Где-то перед чтением VTOC физического диска ищется нечто, которое должно быть расположено
на 17-й дорожке, где-то после 8...9 сектора. Должно представлять собой сбой синхро,
байт $95 и ещё примерно 3 байта. Первая встретившаяся фигня пропускается, вторая
используется в дальнейшем как ключ для расшифровки файлов-игр (см метку LoadSel).

- На оригинале (полученном физическом диске) каталог был убит нахрен. CRC в порядке, но сектора заполнены мусором.
Следствие показало, что всё таки там ожидается именно обычный каталог. В образах
видны три T/S-листа, как раз соответствующие файлам klondike, pusher и pusher.levels.
Возможно, при загрузке будет игнорироваться точка загрузки, указанная внутри файлов,
но это не факт. Причем точка, заданная снаружи, кажется, совпадает с той, что указана
в файлах.

- После расшифровки ищется небольшая сигнатура внутри файлов и управление передаётся
почти на неё (а не на начала образов!). Если сигнатура не найдена до $8000-го адреса
- управление уходит примерно на него, в результате чего имеем BRK/HLT - по вкусу.

- Ошибка чтения файла-игры также не смущает декодер (он просто не проверяет флаг
результата) и дальше всё идёт по прежнему сценарию.

- Один из байт ключа копируется в адрес $200 (== $CA), но пока не обнаружено, чтобы он
где-то использовался. Его контроль происходит в теле игр.
Также могут проверяться $265 (== $A2), $266 (== $19) и $800 (== $0E) - это всё относится к локам.

- Ещё одна ячейка - $3A - там слот с парпортом с навешанной мышью. Если он есть,
например, во втором слоте, в $3A будет $20.

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

===============

В system\binstall есть инсталятор ключа, там же подробный разбор его логики.
Помимо описанных выше фенечек есть ещё ряд других, которые, вероятно, проверяются
уже внутри тел игр.


===============

AK:

Вроде то же самое, но, кажется, другие версии. Защита аналогична или неизвестно чем отличается.

===============

При очередном анализе выявился также следующий косяк:

Процедура "Bload??" (чтение B-файла в память) имеет ряд аргументов,
которые указывают точку загрузки. Точка вычисляет по различным алгоритмам,
выбор алгоритма определяется содержимым ячейки $61 (это вполне стандартное поведение
BTK-подобных систем, на основе которой сделан лоадер). Но Бадер где-то забыл
добавить инициализацию этой ячейки. Там должен быть 0, но в случае некоторого мусора
возможны варианты...

===============

KLONDIKE.FIL - дешифрованный, с инициализацей всех нужных ключей. Возможно, хвост
имело смысл обрезать - получилось бы на сектор короче.

===============

Образы в UnTested/ имеют не совпадающие файлы, но изучения их не проводилось.
Вроде бы ключ защиты фиксирован, но, быть может, существовали другие версии инсталяторов
с другими ключами - тогда и зашифрованные файлы будут отличаться даже при совпадении
кода программ.

17

Re: Pusher

avivanov76 пишет:

Интересно, что обе версии позволяют выключить звук. Старая при нажатии 4 на функциональной клавиатуре, новая - при нажатии F2. Еще прикол, как это сделано: в процедуре генерации звука адрес $C030 патчится на $C020. То есть, при выключенном звуке он все равно генерируется, но идет в магнитофонный порт :)


А вот что интересно: такое часто попадается в играх.

Я помню да, про подключение внешнего динамика через "МАГ" у поздних ЛЭМЗ. Но дело наверное не совсем в этом.
Вот что написал один из авторов:

"Всё просто.
Играть звук - это время, это синхронизация.
Если просто не играть звук - то графика начинает работать быстрее,
значит игра без звука будет бегать быстрее.
Чтобы таково не было надо звук играть всегда.
Значит надо перенаправить его куда-то. С020 самое безопасное место."