ПЭВМ Агат » Игротека » Том 23 » Алиса в стране чудес » Вопросы

Алиса в стране чудес

С чего всё началось

Итак:

* * *

Образы дисков с различными версиями игры

Оригинальная версия для Apple

Игра использует для работы три диска, точнее две стороны рабочего диска ( А и B), и одну сторону любого чистого диска для сохранений. Вероятно работа с двумя дисководами сразу не предусмотрена.

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

* * *

Карта первого диска 140Кб (GAME DISK A)

Диск имеет файловую систему, с каталогом как положено. В первых треках (0,1,2) модифицированная ДОС3.3. Подробности всех отличий от обычной ДОС3.3. не выяснял пока, но например на 2-м треке странная штука: там сектора 2/1 2/2 как бы пустые, но в реально d33 там, обычно, что нибудь есть.
С одной стороны эти треки как-то завязаны на защиту, ибо версии от разных взломщиков отличаются именно в этих треках. Возможно смогут внести ясность тексты, расположенные на STORAGE-диске в версии "4amCrack" , там, похоже,
конспект его действий по взлому.
С другой стороны, игру (уже вскрытую) можно запустить из под любой ДОС, в т.ч. где есть счетчик загрузки.

Вообще, ДОС и Бейсик нужны игре только для загрузки трёх файлов через BLOAD/BRUN. Всей дальнейшей работой с диском, обращаясь к драйверу rwts, управляет файл "GAME". В т.ч. затирает ДОС/Бейсик, освобождая место под свои нужды.

Файл "HELLO" (tr 18/15) - обычный бейсик файл для загрузки последующих файлов.
Файл "WINDHAM" (tr 19/10 - 19/14) - заставка "Windham Classics" в формате 40х48.
Файл "GAME" (tr 6/7 - 10/14) - главный блок.

Еще на диске есть два крупных блока: (tr 25-29) c фразами для страны чудес, и (tr 30-34) с фразами для зазеркалья.

Кроме вышеперечисленного игре от первого диска ничего не надо.

Спойлер (кликните для показа/скрытия)

* * *

Карта второго диска 140Кб (GAME DISK B)

Комната -- это таблица номеров тайлов. 40 в ширину, 20 в высоту. Совпадают у С64 и A2.

00 78 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 79 00
78 7B 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 7A 79
7D 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 7D
7A 79 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 78 7B
00 7A 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7C 7B 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1C 1C 1C 1C 1C 1C 1C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 00 00 00
00 00 00 7E 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 77 7E 00 00 00
00 00 00 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 00 00 00
00 00 00 00 00 00 00 00 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 00 00 00 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 00 00 00 00 00 00 00 00
00 00 00 00 00 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 4C 55 55 55 4C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 00 00 00 00 00
00 00 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 00 55 55 55 55 55 00 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 00 00
00 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 00 00 55 55 55 55 55 00 00 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 1C 00
1C 1C 1C 10 11 11 11 11 11 12 1C 1C 1C 1C 00 00 00 57 55 55 55 55 55 5B 00 00 00 1C 1C 1C 10 11 11 11 11 11 12 1C 1C 1C
1C 1C 1C 0F 0C 0C 0C 0C 0C 0E 1C 00 00 00 00 00 00 69 6A 6B 6B 6B 6C 69 00 00 00 00 00 1C 0F 0C 0C 0D 0D 0D 0E 1C 1C 1C
1C 1C 1C 57 59 59 59 59 59 5B 08 09 00 00 00 00 00 68 00 00 00 00 00 68 00 00 00 00 08 09 57 59 59 59 59 59 5B 1C 1C 1C
1C 1C 1C 56 31 31 31 31 31 5C 18 19 00 00 00 00 00 68 67 66 1F 66 67 68 00 00 00 00 58 5A 56 31 31 31 31 31 5C 1C 1C 1C
61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61

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

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

Диск не имеет файловой системы. Весь забит спрайтами вперемешку с таблицами. 0 и 1 дорожки свободны.

Таблицы это описатели комнат, они расположены подряд на секторах с 0 по 8. с 2 по 15 треки - комнаты для старны чудес, с 21 по 34 - комнаты для зазеркалья и демонстрации, кроме того тут несколько комнат из страны чудес (которые так же используются в зазеркалье. На картинке есть 3 комнаты перечеркнутые красным крестом, там тоже не комнаты, а что-то другое.

Версия для С64

Насколько можно понять, спрайтов два типа: шириной 24 пикселя и шириной 8 пикселей. Те, что 24 пикселя, обычно из двух частей: голова и туловище с ногами. 8 пикселей -- буквы и видимо спрайты, чтобы в тексте рисовать картинки персонажей. Не знаю, есть ли какая-то система, по которой можно автоматически вытащить все спрайты. С форматом таблиц я не разбирался. Возможно, блоки 8х8 -- это как раз графика для отрисовки комнаты. На первом тоже есть куски, похожие на блоки на 2-м диске 8х8, возможно тоже для текста.

Спрайты начинаются по смещению 77859. Большие спрайты, похоже, всегда 24х21 (это формат аппаратных спрайтов комодора), перед каждым идёт какой-то байт. Поэтому кажется, что голова отдельно. На самом деле просто персонаж занимает два таких спрайта в высоту.

* * *

Карта третьего диска 140Кб (STORAGE DISK)

Вообще этот диск создается самой игрой, функцией "CREATE DISK". Она вызывает форматирование из драйвера rwts, просто в сектора данных пишутся нули и всё.

Предусмотрено 5 слотов для сохранения. Для первого состояния использует сектора 0-3 дорожки 0, для второго состояния сектора 0-3 дорожки 1 и т.д. Перед сохранением игра просит вставить STORAGE-диск, но есть особенность: если этого не сделать и произвести запись на "GAME DISK B" - то 1-е и 2-е состояния запишутся безболезненно, а вот начиная с дорожки 2 уже есть какие-то данные.

Примечательно что в сохранении учитывается буквально всё: время, дни, какой предмет и в какой комнате был оставлен и т.д.

Эти 4 сектора лежат в памяти на $800, $900, $A00, $B00. При сохранение игры $b00 содержит копию зерропейдж.

* * *

Карта ОЗУ и процесс загрузки

Кратко: при включении питания, с "GAME DISK A" считывается много информации (ДОС, все файлы и напрямую с треков 25-29 еще). Потом загрузчик клянчит "GAME DISK B". С него считывается еще некоторое кол-во информации и стартует игра. В процессе игры "GAME DISK B" должен оставаться в приводе - к нему будут постоянные обращения. Каждый экран требует подзагрузки: один сектор - графическое описание комнаты и еще два сектора - спрайт персонажа (если он есть в этой комнате).

При переходе в зазеркалье, игра клянчит на "секундочку" дать ей "GAME DISK A" и вернуть "GAME DISK B", тоже самое при возвращении в страну чудес. Это происходит потому-что в игре имеются два текстовых блока (tr25-29 и tr30-34), оба находятся на "GAME DISK A" и по очереди падают на одно и тоже место в ОЗУ. За всю игру таких переходов требуется только два.

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

Спойлер (кликните для показа/скрытия)

Если с первым диском всё более или менее ясно, то на втором диске логика расположения и чтения данных просто дикая.
1) Возможно это всё затеяно ради сложности проги, видны отдельные процедуры перетасовки бит и байт, причем в разных фазах чтения они разные. И это уже явно какое-никакое шифрование. Так что автор, конечно, прятал ресурсы. Не удивлюсь, если сам порядок чтения задан не в проге, а как бы очередной сектор содержит какую-то ссылку на следующий ну и/или содержит адрес, в которую он будет загружен. Может вообще свою файловую микросистему?
2) Возможно также, что последовательность данных (описание игровых комнат) на диске, соответствует расположению комнат на карте игрового пространства. Ведь каждый новый экран требует обращения к диску, и желательно чтоб головка дисковода была где-то рядом с ожидаемым участком.
3) И еще одно, уже совсем фантастическое, предположение есть. Ведь игра вышла не только на apple][, но и на Сommodore64 (тоже 6502 и тоже две стороны FM диска по 170Кб). Может быть изначально был какой-то общий "стержень" адаптированный на различные системы. В таком случае всякие нелогичные моменты могут запросто быть.

* * *

Текстовый блок Apple-версии

Речь идет о блоках фраз с треков 25-29, 30-34 на GAME DISK A.
Вот тут какая штука. Текст не просто зашифрованный, он там запакованный и распаковывается на ходу. т.е. прямо во время вывода текста.
Например, диалог с кроликом (первый персонаж):

D007 - отсюда движок его начинает читать, но там в каждом байте - от 1 до 3 букв.

D000-  00 00 00 00 00 FF 4E CC  D0 30 35 2F 80 04 EC CD   .....ЪnLP.....ЛM 
D010-  05 4B 39 A4 4C D0 18 1A  97 C0 02 76 66 F4 89 A0   .k.$lP...@.жфТ. 
D020-  69 59 C2 D4 66 80 C0 D4  BE 00 20 8D D0 02 B5 40   иyBTф.@T>...P.5
D030-  9D 99 A0 AC 21 DD 42 CE  38 2B 00 08 A0 08 22 14   .. ,.]bN.... ...
D040-  CC 10 30 0A 19 81 B6 31  A9 E0 00 FF 0B 12 32 EE   L.....6.)Ю.Ъ...Н
D050-  80 D4 2C 06 14 D5 06 A1  69 82 21 98 69 06 01 2E   .T...U.!и...и...
D060-  03 75 D1 40 35 F0 00 FF  1C 1A 5D D0 01 62 46 5F   .уQ.П.Ъ..}P.бf.
D070-  00 00 8C C2 3A A4 65 06  A1 69 80 D3 2B 86 8F 00   ...B.$е.!и.S....

1байт: = "I'"
2байт: = "M"
3байт: = "L"
4байт: = "A"
5байт: = "TE"
В общем , где-то 1-2 знака в байте, иногда вроде бы до 3-х, ну это включая пробелы

Скачать дамп памяти

Дамп снят во время выполнения команды по адресу 4372.
В дампе нет региона Cxxx - это порты ввода-вывода (в дампе заполнен NOP)

Сейчас известны следующие метки:

0076      DepackCnt  
0077         pBuf_L  
0078         pBuf_H  
0079            Acc  
007A          SaveY  
00A5          CursH  Координата курсора по горизонтали
00A6        pSLineL  
00A7        pSLineH
00A8           Attr  Аттрибут текстового знакоместа
00DE        pBufX_L
00DF        pBufX_H  

41F8          CursY  Координата курсора по вертикали
4201     EncoderTab  Таблицы декодера  
4221    EncoderTab2
4311      CallPrint  Отсюда начинается вывод фразы. A содержит номер фразы
4328          Print  Y - счётчик бит восстановленного байта?
432F           Loop  
4362         Byte1B  Байт, следующий за 1B, декодируется по отдельной таблице
436F          COut1  
4375             CR  Перевод строки ?
438F           COut  C=0 на обычные символы и C=1 на FF
43A8         COut.1  C=0 на выходе
43BA        ByteFF2  
43CF     Init_Print  Вызывается перед обращением к Print
43F8         Encode  
441F        EncLoop  

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

5599        MemSet1  Включает банк 1 на Dxxx (сегмент F)
55A3        MemSet2  Включает банк 0 на Dxxx (сегмент E)
55AD        MemSet3  Включает ПЗУ (сегмент 6-7)

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

Данные для разных фраз могут браться из разных частей памяти, например, наблюдалась выборка из Dxxx.
Возможно, байты фразы идут не подряд!
Итоговый результат (код символа) передаётся процедуре COut для вывода в видеоозу.
 

* * *

* * *

Версия для АГАТ

Изложение здесь, подразумевает предварительное прочтение раздела "Оригинальная версия для Apple"

Версия для Агат русифицирована. Код с обоих оригинальных дисков, храниться на одном, формата 840Кб.

* * *

Карта диска 840Кб

!Для записи данных используются дорожки целиком (21 трек).

0 дорожка содержит первичный загрузчик с заставкой. 

0/0-0/3 - rwts начальной загрузки с таблицей дальнейших действий.
Так же на 0 дорожке находится русские заставка и инструкция (цветные).

1/0-3/5 - образ ПЗУ Apple, игре он зачем-то необходим. 

3/6-3/15 - драйвер rwts, размером как родной, но для НГМД 840 и дополнительными плюшками (см. "карта озу и загрузка").

3/16-3/19 - картинка в Apple mode "во избежании"  

4/0-7/8 - Главный блок игры - это информация из файла "GAME", только забитая прямо посекторно. 
Т.е. содержимое файла, без 4 первых байт (точка загрузки и длинна).   

!Дальнейшие данные записаны по 16 секторов на дорожке (как у 140Кб привода).

Дальше идут два блока с фразами. Расположены на тех же Track/Sector что и в оригинале, 
но с иной информацией, так как игра русифицирована.

25-29 - блок с фразами для страны чудес.

30-34 - блоки с фразами для зазеркалья. В этом блоке одни нули (см. "Текстовый блок АГАТ-версии")

51-85 - здесь находится вторая сторона оригинального диска. 
Т.е. нулевой трек второй стороны 140-ки(GAME DISK B) приходится на 51-й трек, первый приходится на 52-й трек и т.д.

На поверхности не предусмотрен "эмулятор" третьего диска, игра как и оригинальная версия предлагает вставить отдельный диск. Если этого не сделать, то как и в оригинале на рабочий диск можно безболезненно сохранять только первые два состояния. Становиться понятен резон надписи перед запуском русской версии: "Внимание! во избежании порчи игры записывайте на игровой диск только 1 и 2 состояния игры, состояния 3,4 и 5 храните на отдельном диске" Почему авторы так поступили? ведь на 840 хватило бы на все места. Боялись что пользователь заездит защищенный игровой диск? С другой стороны полезно отгрузить свое состояние именно на отдельный диск, и например пойти к приятелю показать достижения в игре.

* * *

Карта ОЗУ и загузка с диска 840Кб

Загружается дорожка 0, на экране заставка "г-да"
От сектора 1/0 в регион D0xx 48 секторов
ленивое чтение
От сектора 3/6 в регион B6xx 10 секторов 
От сектора 3/16 в регион $04xx 4 сектора
От сектора 4/0 в регион $40xx ещё 72 сектора

Появляется цветная инструкция (это буквально через секунду после включения ЭВМ), и ждет нажатия клавиши.
Что-то инициализируется, возможно, в драйвере rwts, который потом будет использоваться игрой
и передача управления на $4000 - это как бы BRUN GAME.

На экране заставка в Apple mode "во избежании"

25/0 читается в d000 - также как на 140Кб

Дальше, оригинальная версия выдала бы сообщение с просьбой вставить второй диск. Но эта процедура заменена на автоматическое обращение к RWTS, который теперь к запросам будет плюсовать 51. В итоге, игра работает с дорожками 51-85 как с диском В. Если игра опять захочет первый диск, снова вместо сообщения будет обращение к RWTS и он перестанет прибавлять 51. Т.е. здесь не используется 4-х томная система, а все красиво решается заточеным под конкретную игру драйвер RWTS.

И еще, русская версия не использует переход в режим Applesoft. Контроллер памяти работает в режиме "Агат", а контроллер дисплея переводится в режим совместимости с Apple ][. Таким образом доступно в два раза больше (128Кб) ОЗУ чем у Apple. За один раз в ОЗУ загружается несколько игровых экранов (в оригинале каждый экран требовал обращения к диску).
Интересно что сама игра на этот счет не модифицировалась. Просто, вышеупомянутый драйвер RWTS, снабдили кешированием треков в старших сегментах виртуального ОЗУ Агат-9. Для каждого сегмета от 10 до 32 игровых экранов. А игра так и думает что получает экраны от НГМД.

* * *

Текстовый блок АГАТ-версии

Воспоминания авторов перевода:

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

* * *

Что еще меняли авторы русификации

1) Перемещение по меню, в английской версии, выделяется инверсией. С кириллицей этого сделать невозможно, так как в кириллическом знакогенераторе Apple нет инверсных русских букв. Поэтому в Агатовской версии используется курсор в виде галочки.

2) Русская версия не использует переход в режим Applesoft. Контроллер памяти работает в режиме "Агат", а контроллер дисплея переводился в режим совместимости с Apple ][. Вероятно это было сделано для использования дополнительной памяти Агата. За один раз в ОЗУ загружается несколько игровых экранов (в оригинале каждый экран требовал обращения к диску).

Интересно что сама игра на этот счет не модифицировалась. Использовался оптимизированный для неё драйвер RWTS 840, c кешированием треков в старших сегментах виртуального ОЗУ Агат-9. Для каждого сегмета от 10 до 32 игровых экранов, а игра так и думала что получает всё от НГМД.

Что вспомнил на этот счет Сергей Дударев:

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

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

Управление джойстиком и клавиатурой несколько различается:

Джой:

Рукоятка влево\вправо - один шаг в соответствующую сторону, удерживание рукоятки - постоянное движение в соответствующую сторону. 
Триггер + рукоятка вправо или влево - прыжок в соответствующую сторону. 
Вверх\вниз - лазать по лестницам
Триггер + рукоятка вниз - вызов меню
Триггер - зайти в дверь


Клавиатура:

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

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

Apple версия:

     R               I
   D   F    или    J   K
     C               M 

Агат версия:

     f2                      Стр.вверх
   f4  f6   или    Стр.Влево           Стр.Вправо
     F5                      Стр.Вниз 

4) Видимо что-то ещё.

* * *

Глюки Агатовской версии

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

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

- отсутствует персонаж "её светлость Алиса" правее "POLL OF TEARS", перед горкой. 

Эти два глюка явно вызваны тем, что у авторов был испорчен второй диск. 
Отличия от оригинала в секторах (по 140Кб счету): 18/10, 33/0, 34/2, 34/9, 34/10, 34/11 
и почему-то есть информация на секторах (в оригинале там пусто): 0/4, 0/6, 1/13 - возможно просто мусор.
Если на Агатовский диск, в соответствующие сектора, записать оригинальные данные, то вышеуказанные особенности пропадают, 
возможно и другие, которые не были замечены, тоже. 

- Герцогиня (левее  LYLY POND) не отвечает на вопрос "где я", на "проси" пишет какие-то обрывки фраз, 
и кажется перепутаны местами варианты реагирования в диалогах. В оригинальной версии этого глюка нет, 
тут похоже косяк блока русского текста. Возможно есть еще такое по игре, с другими персонажами, но замечено было только это. 

- Королева (QUEEN OF HEARTS), правей которой тюрьма, не отвечает на вопросы - это именно так и в Apple версии. 

- В бесконечном водоёме (правее PIER) остается след спрайта Алисы - это именно так и в Apple версии.   

- 50 дней вместо 65, но возможно это не глюк а так задумано в русской версии. 

* * *

Автор раздела: Garnizon