Передовица » Software » Игры » Как устроена Алиса

Как устроена Алиса

Итак:

* * *

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

Оригинальная версия для 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) с фразами для зазеркалья.

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

Файл "GAME"

Файл "GAME" - его похоже, раза три записывали на диск (разработчики в США), может версии какие-то при отладке пробовали, не знаю - но там брошенные TSL со вполне корректным содержимым. Их бы, вероятно, переписали, если бы там что-то было. А может быть эти области не вычистили намеренно - ведь игра всеми способами пытается запутать загрузку (об этом позже).

* * *

Карта второго диска 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" и по очереди падают на одно и тоже место в ОЗУ. За всю игру таких переходов требуется только два.

Информацию которую удалось накопать на данный момент - весьма прозрачна и оставляет много вопросов.
Игра требует наличие Language Card (+16Кб), и реально использует все 64кб.
Вот конкретный кусок кода, именно кода алисы, который мутит с управлением Language Card:

                         Memset1:
5599 -   AD 08 C0   "-.@"   LDA   C008
559C -   AD 8B C0   "-.@"   LDA   C08B
559F -   AD 8B C0   "-.@"   LDA   C08B
55A2 -   60 .. ..   "ю"     RTS   

                         MemSet2:
55A3 -   AD 08 C0   "-.@"   LDA   C008   
55A6 -   AD 83 C0   "-.@"   LDA   C083
55A9 -   AD 83 C0   "-.@"   LDA   C083
55AC -   60 .. ..   "ю"     RTS   

                         MemSet3:
55AD -   AD 08 C0   "-.@"   LDA   C008       <==
55B0 -   AD 82 C0   "-.@"   LDA   C082
55B3 -   60 .. ..   "ю"     RTS


c008 - адрес мне не знакомый, возможно, на каких-то моделях эпла актуален,
а вот c08x - это однозначное управление Language Card, игра щёлкает его по ходу игры, возможно, 
что-то использует из ПЗУшного кода. 
Похоже, что архив фраз хрантся в Language Card, но что-то она хочет взять из ПЗУ, поэтому щёлкает банками.
Например только стоит подойти к кролику (первому же встретившемуся персонажу) и началось щелканье...

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

Загрузка:

Вставляем первый диск и включаем питание.

Загружается ДОС с первых дорожек диска на 9800-bfff. 

hello - как и любой бейсиковский файл, в адреса от 800. она мелкая, так что 800..900

windham - картинка, грузится сразу в видеоозу 400-7ff

game - 4000..8730

Потом с треков 25-29 (текстовый блок) читает информацию в ОЗУ (заливает в сегмент один (memset1))

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

сперва по адресам от Dxxx до DExx 
потом с 91xx..b5xx (это она dos сносит, но после b6xx идёт драйвер дисковода досовский - его она не трогает)
потом возвращется на  exxx..ffxx

9100 - меню (start game)...
в 96xx лежат общие фразы из рекламы, до начала игры. "Бегай, прыгай" и т.д.

Дальше клянчит второй диск......


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

Второй диск:

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


------- Фаза 1 -------

Что-то копируется 0200 -> 0c00, 1 блок
Вероятно, что-то прочитанное ещё с первого диска

читаются как есть
3/9 - 0800

И теперь обратно: 0c00 -> 0200

Такое ощущение, что это некий каталог диска.

------ Фаза 2 ------- 

Читает от 3/$d группами по три сектора с каждого трека. 
3/$d 3/$e 3/$f 4/$d 4/$e .................... 11/$f 
Заполняет регион $0D00 .. $1Bxx, при этом выполняя какое-то преобразование, вроде бы два байта в один. 
Преобразование выполняется на каждый второй прочитанный сектор 
(т.е. два сектора читаются, затем преобразуются в один блок, затем ещё 2...). 
После чтения и преобразования копирует 5 блоков с $0d00 на $1b00. 


------ Фаза 3 ------- 
переключила банк в нулевой (memset2)

Читает 19/0..19/A -> D000 

Здесь декодирование делается перестановкой бит в байтах в обратном порядке. 
Затем на него накладывается ещё какой-то дикий алгоритм, который тасует какие-то биты в соседних байтах, 
причем он берет данные из D000..D800, микширует с DA80 и там сохраняет результат. 


------ Фаза 4 -------

Читает от 33/8 .. один сектор ?
После чтения сразу появляется заставка (она уже где-то ждёт)
Эту же фазу вызывают после заставки во время смены экранов

------ Фаза 5 -------

Читает ещё раз 3/9 (повторяется вызов фазы 1)
но это не прямой повтор, там какие-то ещё действия выполняются (не с диском).


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

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

* * *

Версия для АГАТ (вариант 1992 года)

Изложение здесь, подразумевает предварительное прочтение раздела "Оригинальная версия для 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.

* * *

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *