8.1.2 ОПИСАНИЕ УРОВНЯ DOS.SYS
КАНАЛЫ
Канал - именованная (нумерованная от 0 до 255) непрерывная область памяти, предназначенная для временного
хранения или передачи данных от одной программы в другую. Каналы находятся в специально отведенном месте памя-
ти, так называемой "области каналов". Область каналов имеет фиксированную длину (обычно 2000 байт) и распола-
гается между кэшем блочных устройств и резидентами. Адреса области каналов: g_cnfg(#10)-HL'+32..37. При добав-
лении/удалении резидентных программ из памяти область каналов смещается. Доступ к каналам из программ возможен
только с помощью специальных обращений к ядру. Функции работы с каналами: #16..#19.
Структура канала
смещение имя длина комментарий
0 1 логическое имя (номер)
1 CHLEN 2 длина канала
3 CHLEN тело канала
В области каналов каналы лежат друг за другом по номерам головой к хвосту. Т.о. вся область каналов описыва-
ется всего тремя адресами: начала, конца и указателя (см. ПРИЛОЖЕНИЕ 3).
Каналы с определенными номерами имеют следующее жестко фиксированное предназначение:
00..07 - описывают каналы F0..FE блочных устройств
08..OF - E0..EF символьных устройств вывода
10..17 - D0.. символьных устройств ввода
18..D7 - каналы пользователя /newchn(#19)/
D8..E7 - описывают установленные резидентные задачи /fndev(#51)/
E8..EF - описывают драйверы символьных устройств ввода
F0..F7 - символьных устройств вывода
F8..FE - блочных устройств
FF - электронный диск (часть памяти компьютера, как правило дополнительная, используемая как быстрое
блочное устройство. Обычно с упаковкой).
Каналы 00..17 называют "каналами, описывающими устройства" или "каналами устройств" или "устройствами". Они
ссылаются на каналы, описывающие драйверы (E8..FE), называемые в свою очередь "каналами драйверов". Последние
содержат гораздо больше информации чем устройства. Так, на пример, их можно находить по именам /функция
fndev(#51)/. Структура (тел) каналов 00..17 приведена в ПРИЛОЖЕНИИ 7, а каналов E8..FE - в ПРИЛОЖЕНИИ 8.
Схема перемещения информации о тек. состоянии при работе с драйверами и устройствами:
ДРАЙВЕРЫ И РЕЗИДЕНТНЫЕ ПРОГРАММЫ
Резидентная задача - программа, обращение к которой явно состоит из двух (трех) этапов:
1. Установка (загрузка) в память с диска, настройка на адрес и инициализация.
2. Основная работа
3. Удаление задачи из памяти
1-ый и 3-ий этапы осуществляются процедурой SET.com. Она же создает 18-байтовый канал, описывающий резидента
(см. ПРИЛОЖЕНИЕ 8).
Структура резидентной задачи:
О 2 Адрес процедуры инициализации. Она вызывается при ее перемещении (на вход задачи подается A=FF) или удале-
нии (A=FE) программой SET.com. Если 0, то не вызывается. Эта программа должна подключать, если это необхо-
димо, резидента к цепочке прерываний (IM 2) или к другой программе, перехватывать рестарты и восстанавли-
вать их.
2 2 Адрес главного входа, т.е. процедуры запуска по имени /exbat(#44),run(#48)/ или по номеру канала /ехе-
res(#53)/ Если 0, то программа запускается с 4-го байта.
4 R Тело задачи (структура произвольная)
R+4 2 #FFFF - разделитель
R+6 2п таблица настраиваемых адресов - 1 (см. примеры программирования). Смещения от начала вычисляются по
LSA. Единица вычитается для пущей простоты настройки таких команд как: CALL, JP, LD HL, LD A,(nn), наи-
более часто встречающихся в программе.
ДРАЙВЕРЫ
Драйвер - это резидентная программа специального назначения. Он обслуживает физическое или логическое уст-
ройство одного из трех типов:
Установленный в систему драйвер имеет только 8-буквенное имя (тип в канале не хранится), typ от 1рг можно
отличить по 0-му биту в 13-ом байте драйвера (5-ый байт в g_typ(#12)).
В начале каждого драйвера располагается вектор стандартной структуры:
О 2 INST - Программа, вызываемая как и для всех резидентов программой SET.com, а также при каждом пере-
ключении устройства, обслуживаемого драйвером. (При этом А=номер устройства).
2 2 ENTRY-1
4 2 ENTRY-2
6 2 ENTRY-3
8 8 STATUS-VECTOR
КЭШ БЛОЧНЫХ УСТРОЙСТВ
Кэш представляет собой быстродоступную копию некоторых наиболее часто используемых блоков блочных уст-
ройств. Он размещается в памяти ниже области каналов и имеет следующую структуру:
О EDSIZ*4 каталог кэша, состоит из 4-байтовых описателей блоков:
О 4 описатель блока
4 4 описатель блока
8 4 описатель блока
EDSIZ*4 256 блок
256 блок
256 блок
EDSIZ - Размер кэша (количество блоков) задается в 0-м уровне ядра.
Описатель блока имеет следующую структуру:
Смещ. Кол.байт
0 1 регистр состояния блока, совмещенный с номером устройства. Биты:
7 - блок модифицирован (1) или нет (0);
6 - блок защищен (1) или нет (0);
5 - блок существует (1) или нет (0);
4 - резервный;
3..0 - номер устройства, которому принадлежит блок.
1 1 счетчик обращений к блоку;
2 2 (мл.,ст.) - номер блока на устройстве.
Минимальный размер Кэша равен 6 блокам. Кэш создается системой автоматически, т.к. он необходим для работы
файловой службы.
8.2.1 #20. ФАЙЛОВАЯ СЛУЖБА
= DUD.SYS =
32(20):open - Открытие уст-ва и главного каталога. Выход: с обр.оы.
33(21):openl - Открыть каталог по номеру начального блока каталога в DE.
34(22):empty - Не используется
35(23):crfil - Создание файла по имени. HL = адрес заполненного описателя. (Имя, тип, CSR, длина - обязатель-
но, по желанию: LSA и прочие) (см. ПРИЛОЖЕНИЯ 9,4.). Файл созд-ся непрерывный или односегмент-
ный (в зависимости от CSR ). Старший байт длины игнорируется. Проверяет наличие файла с таким
именем и типом.
36(24):erfil - Удаление файла по имени. HL - адрес описателя (имя, тип), отсутствие файла - не ошибка.
37(25):fopen - Поиск и открытие файла или каталога по имени и типу. HL - адрес описателя (имя, тип), (подката-
лог открывается, т.е. его описатель (19 байт) считываются в сис. область описателя каталога.
(Структуру описателей см. в ПРИЛОЖЕНИЯХ 9.) Выход: если ошибок нет: и если В1Т5=0, то файл отк-
рыт, в А - регистр состояния файла (FSTAT), в HL' - адрес 32-байтового описателя файла (FNAME)
если В1Т5=1, то функция F0PEN открыла внутренний подкаталог
38(26):opnum - Открытие файла по номеру в текущем каталоге. Номер файла - в регистре А. Выход: HL'=FNAME.
39(27):gname - Возвращает описатель файла, не открывая его на входе в рег.Е - номер файла. Выход: если O.K.,
то HL' - адрес описателя файла в электронном диске.
40(28):putf - Закрытие файла (сохраняет описатель текущего файла в каталоге). Необходима пользователю для за-
щиты файлов и инициализации резервных байтов в описателе. Номер в $FNUMB.
41(29):rpart - Чтение части файла. A,HL - указатель, IX - адрес в памяти, DE - длина в байтах. Пользуется
эл.диском. (Обращается к JMLTRD и JQRVBL)
42(2А):wpart - Запись части файла. A,HL - указатель, IX - адрес в памяти, DE - длина в байтах,выход: с обр.ош.
Пользуется эл.диском (обращается к JM0DWR или JWRITE, и JQRVBL,JM0D0)
43(2В):rifle - Чтение файла в блоках. В - количество блоков, DE - номер блока начала, HL - куда читать.
44(2С):wifle - Запись файла в блоках. В - количество блоков, DE - номер блока начала, HL - откуда записывать.
Эти 2 процедуры эл.диском не пользуются (обращаются к $DREAD и JWRITE)
45(2D):qrvbl - Возврат адреса виртуального блока на электронном диске. Вход: DE - номер блока в файле. Выход:
HL' - адрес блока в эл.диске, DE' - адрес заголовка блока в каталоге эл.диска, А = 0, если
блока не было на эл.диске (чтение с устройства); возвращается 1, если блок был.
46(2Е):тю6о - Модифицирование (квазизапись) блока, считанного в эл.диск процедурами qrvbl или quard. Вход: DE=
адрес заголовка блока в каталоге эл.диска (выдается процедурами quard и qrvbl в DE'). Рекоменду-
ется модифицировать только что считанный блок, т.к. любое обращение к вирт.диску может повлиять
на расположение блоков в нем.
47(2F):fadd - Добавление блоков к файлу. А - число блоков, DE - указатель в блоках. Выход: с обр.ош.
48(30):fcut - Удаление блоков из файла. А - число блоков, DE - указатель в блоках. Выход: с обр.ош.
49(31):еadd - Добавление к концу файла DE байт.
50(32):еcut - Удаление от конца файла DE байт.
51(33):gcat - Возврат номера 0-го блока текущего каталога в HL' и номера устройства в А, Е' - количество всех
файлов в каталоге (существующие + удаленные), D' - вложенность подкаталога, в ВС'- N начального
блока старшего каталога.
52(34):find - Поиск и открытие файла или каталога по имени и типу как файла. HL - адрес описателя (имя,
тип).HL'=FNAME.
53(35):bkfcb - Возврат адреса описателя файла в HL'(=FNAME) (см. ПРИЛОЖЕНИЕ 9)
54(36):pstat - Сохраняет в канале номер А(А<>0) текущее состояние системы. А=0: среда сохраняется по адресу
IX. Выход с обр. ош. Если O.K., то А(<>0) сохраняется, HL' - адрес канала.
55(37^:gstat - Восстановление среды из канала с номером в регистре А(А=0,А<>0: аналогично pstat). Выход: с
обр.ош. Состояние системы мо^ет иметь любую длину. Первые 4 байта инициализируются функцией
pstat: 0(1) номер канала устройства, 1(2) каталог, 3(1) номер файла в данном каталоге.
56(38j:distr - Захват блоков на устройстве .А = размер требуемой непрерывной области на устройстве. Выход: ВС'
= номер 1-го блока области ( с обр. ош. )
57(39):retrn - Перенастройка резидентной программы или драйвера. ВА = длина,HL = старый адрес ,DE = новый ад-
рес.
58(ЗА):empty - Не используется
59(ЗВ):erf_ - Создание файла по имени в HL без проверки на существование (с обр. ош)
60(3C):erf_ - Удаление открытого файла ( с обр. оы.)
61(3D):rvblk - Чтение блока номер DE (виртуального, т.е. от начала тек. открытого файла) в буфер по адресу HL
62(ЗЕ):wvblk - Запись виртуального блока номер DE из буфера по адресу HL.
63(3F):free - Открепить на текущем блочном устройстве А блоков начиная с DE-ro.