Category: Goonies

30
Апр
2023

Доделан загрузчик

Сегодня доделал загрузчик — теперь игра сама читает с диска любой лабиринт без участия OS. Для пробы прогулялся по второму уровню (пока еще почти без нежити). Теперь надо сделать сам процесс перехода, со всеми этими дверями открытыми/закрытыми/исчезающими.

28
Апр
2023

Поиск файла в ANDOS, MKDOS, CSIDOS

Доделал «загрузчик-поисковик» для ANDOS, MKDOS, CSIDOS — трех живых дисковых систем БК. Часть файлов я гружу через ЕМТ 36, как и в Принце, т.к. при любом раскладе это работает, пока из памяти не выброшена сама система. Это заодно решает проблему возможной фрагментации файлов в ANDOS, т.к. при загрузке через ЕМТ 36 ANDOS сама ищет все блоки файла. Так что Принцу на фрагментацию плевать, хотя некоторые почему-то думают, что это не так.

Перед тем, как систему выбросить, нужно на диске найти первые блоки тех файлов, с которыми потребуется работать уже без средств операционки. В каждой системе есть свой способ поиска файлов на диске. Для ANDOS и MKDOS это просто вызовы процедур поиска с определенными параметрами, а вот в CSIDOS это ЕМТ 115, а это значит, что вектор обработчика ЕМТ уже другой, не «десяточный». К тому же, CSIDOS сидит в 7 странице ОЗУ, а остальные в 4-й. Да и имя файла каждой подавай в своем формате для поиска. Пришлось немного поизголяться. Загрузка первых файлов через ЕМТ 36 заодно заставляет системы уже держать каталог нужного диска в памяти, что упрощает (наверное) дело.

P.S. да, я в курсе, что есть «универсальный загрузчик для всех ОС», но так там исходники для новомодного pdpy с километровыми именами меток и прочими наворотами, так что для моей среды разработки (micro1103) переделывать его замаешься.

Вот исходник загрузчика, авось кому пригодится:

;определение среды запуска
;загрузка основных файлов

Setup:  mov  #6000,@#177716 ; 1-40k, 4-100k
        mov  #4000,r1
        mov  #fnmtab,r5
1l:     tst  (r5)
        beq  0e
        call @#lemt36 ;загрузка через емт36
        br   1l

0e:    ;определяем OS, пока не испорчена стр 7 (там csidos)
        clrb @#rundos ;0=Andos 1=MKDOS 377=CSIDOS
        mov  @#120000,r5
        cmp  r5,#517
        beq  0andos
        cmp  r5,#460
        bne  0csi
        incb @#rundos
        call @#mksrch ;поиск в mkdos
        br   0all
0csi:   comb @#rundos
        call @#cssrch ;поиск в csidos
        br   0all
0andos: call @#ansrch

0all:  ;r0=первый блок LEVELS.DAT
       ;вписываем начальные блоки всех лабиринтов
        mov  #filtab,r1
        mov  #5,r2
0fl:    mov  r0,(r1)+
        add  #12,r0
        sob  r2,0fl

;грузим на стр 7, теперь csidos можно портить
        mov  #fnmtb2,r5
        call @#lemt36
        ....
        ret

cssrch: ;ищем в CSIDOS
        mov  #54400,@#177716 ;7 в 40к, нужно для CSI
        call @#45010        ;init
        mov  #csidoz,r0
        emt  115
        bcc  0ok
        halt                ;не нашли
0ok:    mov  @#41524,r0      ;адр записи о файле
        mov  16(r0),r0       ;номер первого блока
        mov  #100113,@#30    ;восстанавливаем вектор ЕМТ БК0010
        ret

ansrch: ;поиск в каталоге ANDOS
        mov  #flevls,r1
        call @120216
        bcc 0ok
        halt
0ok:    ;вычисляем начальные блоки
        mov  32(r2),r0      ;нач кластер из каталога
        inc  r0
        asl  r0
        asl  r0             ;номер блока
        ret

mksrch: ;поиск в каталоге MKDOS
        mov  #mklvls,r3
        mov  #bemt36+6,r4
        mov  #17,r0
0m:     movb (r3)+,(r4)+ ;вписываем имя
        sob  r0,0m
        mov  #bemt36,@#306
        mov  @#120014,r3 ;адр буфера чтения каталога
        call @120026
        bcc  0ok
        halt
0ok:    mov  20(r3),r0
        ret

lemt36: mov  #40000,@#bemt36+2 ;адр загрузки
        cmp  (r5),#6000 ;lbhisub?
        bne  2l
        mov  #62000,@#bemt36+2 ;для lbhisub другой
2l:     mov  (r5)+,@#177716 ;стр памяти
        mov  #bemt36+6,r4 ;
        mov  #10,r0
0l:     mov  (r5)+,(r4)+ ;имя файла
        sob  r0,0l
        mov  #bemt36,r1
        emt  36
        ret

fnmtab: .#26000 ;2-40k, 4-100k
        .a:ANIMS.DAT
        .b:0 .#0.#0.#0

        .#36000 ;3-40k ELTS
        .a:WALLS.DAT
        .b:0 .#0.#0.#0

        .#16000 ;5-40k
        .a:MUSIC.DAT
        .b:0 .#0.#0.#0

        .#6000 ;1-40k
        .a:LBHISUB.DAT
        .b:0 .#0.#0
        .#0

fnmtb2: .#56000 ;7-40k
        .a:HISUB.DAT
        .b:0 .#0.#0.#0

flevls: .a:LEVELS DAT
        .b:0
mklvls: .a:LEVELS.DAT
        .b:40.b:40.b:40.b:40.b:0
        .e

rundos: .b:0
        .b:0 ;free

FILTAB: .#0 .#0 .#0 .#0 .#0 ;номера первых блоков файлов

bemt36: .#3 .#40000 .#0 .+60
csidoz: .b:2 .b:0 .#40000 .#220
        .a:LEVELS.DAT
        .+4 .#0 .#1000 .#0 .+22
END
27
Апр
2023

ANDOS, MKDOS,CSIDOS

Поразбирался сегодня с форматами каталогов и встроенными в эти системы командами поиска файлов. Написал пробный код поиска файла для каждой. Везде успешно нашелся начальный блок для файла LEVELS.DAT. Решил все-таки сделать поддержку всех трех систем.

 

 

26
Апр
2023

Общий файл лабиринтов готов

Сделал батник для упаковки/перевода в obj/линковки/сборки в единый файл всех лабиринтов. В итоге получается файлик LEVELS.DAT размером 25 килобайт, который расчитан на поблочное чтение в процессе работы игры. Теперь буду писать загрузчик для этого набора данных.

Вот как работает автоматическая сборка:

23
Апр
2023

Заработала нумерация сцен

Перевел на новую систему изменений лабиринта имеющиеся на данный момент случаи. Исправил обнаружение «мешков-бонусов», сломавшееся при переходе на динамический размер лабиринта. Сделал вывод нумерации сцен в правом верхнем углу.

22
Апр
2023

Заработала система упакованных лабиринтов

Итак, сегодня система работы с упакованными лабиринтами заработала в полную силу. Теперь не только распаковываются нужные сцены, но и сохраняются изменения в лабиринтах, внесенные игроком — собранные ключи, бонусы, эликсиры и т.д. Так как распаковка сцены меняются при переходе через телепорт (череп), то обратно упаковывать данные в сцену слишком долго. Поэтому просто создан список изменений для каждой сцены, который применяется после распаковки этой самой сцены. Пришлось изменить способ хранения в лабиринте «шкафов», чтобы не забивать список изменений ненужной инфой. теперь «шкаф» кодируется всего одним байтом. Заодно это сократило и словарь упаковщика, что тоже приятно.

Пока что в список изменений для теста вносятся только собранные ключи, так что надо прикрутить заполнение списка и к остальным вносимым изменениям. И можно будет делать переходы между уровнями. Там уже надо грузить с диска новый уровень целиком. А так как «DOS» уже прибита в памяти, то придется делать это прямым чтением блоков с диска. Чтобы не разгребать кучу вариантов хранения каталога диска в БКшных дисковых системах, поддерживаться будет только ANDOS.

 

19
Апр
2023

Продолжаем фиксить

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

15
Апр
2023

Потихоньку чиню сломанные механизмы

Чиню то, что поломалось при переходе на динамический размер сцены:

  • Шериф иногда стрелял «холостыми» — пули не летели. Потому что неправильно определялось смещение в лабиринте для пули. Было перепутано смещение на экране и в лабиринте.
  • Черепа иногда ходили по воздуху — древний баг, оказывается. В некоторых случаях некорректно искалась земля под черепом.
  • Прыгающий череп стукался о паровые трубы — ну, он впервые их увидел
  • Каменная глыба стирала сама себя — неправильно считалось смещение, опять же из-за смены формата

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

И просто для прикола: фоном слушал Quincy Jones и вдруг обратил внимание, что музыка как раз подходит под происходящее на экране 🙂

14
Апр
2023

Телепорты снова работают

Сегодня удалось-таки прицепить лабиринт в новом формате к игре и заставить его заработать. При переходе из сцены в сцену через телепорт нужная сцена распаковывается из сжатого вида и Балбес запускается в нее. Таким образом, весь уровень уже не занимает страницу 16К целиком. Теперь он занимает меньше 4 килобайт, из которых один килобайт — словарь. Но надо еще доработать напильником движок, а то местами стали черепа по воздуху летать и каменные глыбы ведут себя подозрительно. Все  это последствия перехода на динамические размеры сцен.

 

13
Апр
2023

Заработал новый упаковщик

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

P.S. Альбом Quincy Jones «Smackwater Jack»  1971 года просто шикарен.