Доделал «загрузчик-поисковик» для 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
Свежие комментарии