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