Поиск файла в 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