К существующим функциям дискового интерпретатора (BIOS)
добавлены подпрограммы, работающие с файловой системой TR–DOS. После их вызова
установленный флаг CY обычно указывает на ошибку, при этом в Akk передаётся код
ошибки (заметьте, только для файловых функций!). В случае, если значение Akk
равно 80h, это указывает на физическую ошибку, её код, в свою очередь, доступен
через функцию RST 8, код 82, DE=04, BC=+1eh.
Для каждого файла в памяти должна быть отведена
специальная 28-ми байтная область — дескриптор управления файлом (fcb) и
буфер как минимум на один сектор (256 байт). Все операции по поддержанию
записей в дескрипторе управления обеспечивают подпрограммы монитора.
«Открывает» файл и создает управляющие структуры
подфункция f_open (20). Входными параметрами являются: адрес строки
спецификации файла (HL), адреса буфера управления (IX) и буфера обмена (DE).
Файл может быть открыт в двух различных режимах (по содержимому регистра B) —
байтового и блочного (секторного) обмена. Можно указать вид допустимых операций
с файлом: чтение/модификация/запись.
В зависимости от режима открытия файла для передачи данных
можно воспользоваться следующими подпрограммами. Подфункции f_read (22) и
f_save (23) предназначены для считывания или записи одного байта, при этом
файл рассматривается как файл последовательного доступа. Позиционирование
внутри файла осуществляется с помощью подфункций putpos (32) и
getpos (33), позволяющих соответственно задать и считать текущую позицию в
файле. Подпрограммы монитора следят за достоверностью данных в буфере обмена,
который выступает здесь как кеш-память на один сектор (256 байт). Для файлов
блочного обмена предназначены подфункции r_sec (28) и w_sec (29),
которые соответственно считывают и записывают один очередной целый сектор, либо
подфункции r_ms (30) и w_ms (31) — для работы с несколькими
последовательно расположенными секторами за одну операцию. Байтовые и блочные
подфункции обмена данными, в принципе, можно совмещать. Для операций чтения и
записи сектора, если предварительно был обработан байт (т. е. счётчик текущей позиции
находится не на границе целого сектора) будет «пересчитан» текущий сектор.
Закрывает файл и освобождает буфер обмена (с дозаписью
файла в случае необходимости) подфункция f_close (21).
Предусмотрены подфункции для поддержания файловой системы
TR-DOS. fcbint (27) позволяет построить управляющую структуру файла без
его открытия. Эта структура может использоваться для подфункций
fndname (25) — поиск файла, и fndnext (26) — поиск следующего совпадающего
файла. В имени файла, помещенного в fcb, символы ‘?’ рассматриваются как
«заменители», что позволяет подфункции «поиск следующего» искать файлы по
получившемуся шаблону. Наконец, для удаления файла с диска может быть применена
подфункция delfil (24).
Следующие функции доступны с версии 2.70 (код 8 от
09.02.94)
Параметры:
вх.: С=20;
ix — адрес буфера для fcb;
hl — адрес строки, содержащей имя и тип файла в
asciz;
de — адрес буфера dma;
b — способ открытия:
2 — «физический» файл (если сброшен —
«логический»);
1 — файл для записи;
0 — файл для чтения;
установка 0 и 1 бит указывает файл для
модификации.
вых.: CY=1, если были ошибки, код ошибки возвращается в аккумуляторе:
Akk=71 файл существует;
72 файл не существует;
73 нет места для создания нового файла;
+ все ошибки создания fcb и поиска файла;
bc — длина файла в байтах.
Действие: открыть файл для последующих операций с ним.
Для открытия необходимо задать местоположение файла,
которое в общем виде выглядит следующим образом:
[Drive:]filename[.type]
Отсутствие указания имени устройства (Drive) приводит к
поиску файла на текущем дисководе. Тип файла по умолчанию <C>. Строка
спецификации должна заканчиваться нулевым байтом. Режим работы с файлом
определяется содержимым регистра B: 2-й бит определяет буферезацию, и должен
быть установлен если предполагается обмен целыми секторами («физический» файл),
и сброшен, если обмен будет вестись байтами («логический» файл). Кроме этого
биты 0 и 1 задают режим доступа к данным, установка обоих бит открывает файл
для модификации, то есть, как для записи, так и для чтения.
В случае, если указанный файл не найден и режим доступа
задан «для записи» или «для модификации» — файл будет создан.
Параметры:
вх.: C=21;
ix — адрес буфера fcb;
вых.: CY=1, если были ошибки, код ошибки возвращается в аккумуляторе:
см. коды ошибок функции f_save (23).
Действие: закрыть файл, открытый функциями f_open (20).
При закрытии файла происходит дозапись (при необходимости)
информации из открытых буферов.
Параметры:
вх.: C=22;
ix — адрес буфера fcb;
вых.: CY=1, если были ошибки, код ошибки возвращается в аккумуляторе:
Akk=74 неверный тип операции (попытка читать из файла
«только для записи»);
70 конец файла (end of file);
Akk (при CY=0) очередной считанный байт.
Действие: чтение очередного байта из файла.
Файл должен быть открыт как «логический».
Параметры:
вх.: C=23;
ix — адрес буфера fcb;
Akk — байт для записи в файл;
вых.: CY=1, если были ошибки, код ошибки возвращается в аккумуляторе:
Akk=73 попытка записи после конца файла;
74 неверный тип операции (попытка записать в файла
«только для чтения»);
Действие: запись байта в файл.
Файл должен быть открыт как «логический».
Параметры:
вх.: C=24;
ix — адрес буфера для fcb;
hl -- имя и тип в asciz;
вых.: CY=1, если были ошибки, код ошибки возвращается в аккумуляторе:
Akk=72 файл не найден
Действие: удаление файла, адрес спецификации которого
задан в регистрах HL.
Следующие функции доступны из ПЗУ Теневого монитора,
начиная с версии 3.0c, код 64 от 05.11.94
Параметры:
вх.: C=25;
ix — адрес буфера fcb (в имени файла допустимы
заменители '?');
вых.: CY=1, если были ошибки, код ошибки возвращается в
аккумуляторе или флаге Z:
Akk=63 дискета не TR-DOS;
Z=1 — файл не найден.
Действие: физический поиск файла, указанного в fcb, в
каталоге диска, параметры файла возвращаются в полях fcb.
Буфер fcb должен быть построен подфункцией fcbint (27). В
имени файла допустимы заменители — '?', вместо них при поиске файла
подставляется «любой символ», таким образом подфункция fndname возвращает в fcb
параметры для первого из найденных файлов.
Параметры:
вх.: С=26;
остальные параметры и выход те же, что и у подфункции
fndname (25).
Действие: продолжает поиск файла, указанного в fcb.
Эта подфункция может использоваться при поиске следующего,
совпадающего с «маской» файла. Под «маской» подразумевается наличие в имени
файла (при создании fcb подфункцией fcbint (27)) заменителей ‘?’.
ВНИМАНИЕ! Подфункция fndnext использует внутренние ячейки
монитора, поэтому, скажем, между вызовами функции нельзя смотреть каталог из
монитора.
Параметры:
вх.: C=27;
hl — адрес строки имени файла в asciz;
ix — адрес буфера создаваемого fcb;
de — адрес буфера dma;
b — способ открытия;
вых.: CY=1, если были ошибки, код ошибки возвращается в аккумуляторе:
Akk=74 неверный тип файла;
68 несуществующий номер устройства;
69 ошибка в имени файла;
ix — адрес буфера fcb.
Действие: разбор спецификации файла и построение на ее
основе блока управления (fcb).
Спецификация файла и способ открытия задаются так же, как
и для подфункции f_open (20).
Параметры:
вх.: C=28;
ix — адрес буфера fcb;
вых.: CY=1, если были ошибки, коды ошибок, возвращаемые в
аккумуляторе, такие же, как для функций f_read (22) и f_save (23).
Действие: последовательное чтение очередного сектора из
файла, содержимое сектора размещается в памяти с адреса, указанного полем dma в
блоке управления файлом (fcb).
Для обеспечения максимальной скорости выполнения операции
Файл должен быть открыт как «физический». Если файл был в режиме «логический» и
если предварительно был считан байт (т. е. счетчик указывает не на границу
целого сектора) подфункцией будет «пересчитан» текущий сектор. Максимальный
номер сектора — 254.
Параметры:
вх.: C=29;
ix — адрес буфера fcb;
вых.: CY=1, если были ошибки, коды ошибок, возвращаемые в
аккумуляторе, такие же, как для функций f_read (22) и f_save (23).
Действие: последовательная запись одного сектора из памяти
с адреса, указанного полем dma в блоке управления файлом (fcb), в файл.
Параметры:
вх.: C=30;
ix — адрес буфера fcb;
b — число считываемых секторов;
вых.: CY=1, если были ошибки, коды ошибок, возвращаемые в
аккумуляторе, такие же, как для функций f_read (22) и f_save (23).
Действие: последовательное считывание заданного количества
целых секторов.
Подфункция r_ms подобна многократному выполнению
подфункции r_sec (28), с той лишь разницей, что значение, указанное в поле dma
не изменяется. В случае ошибки полагается, что все сектора не считались.
Параметры:
вх.: C=31;
ix — адрес буфера fcb;
b — число записываемых секторов;
вых.: CY=1, если были ошибки, коды ошибок, возвращаемые в
аккумуляторе, такие же, как для функций f_read (22) и f_save (23).
Действие: последовательная запись заданного количества
секторов.
Подфункция w_ms подобна многократному выполнению
подфункции w_sec (29), с той лишь разницей, что значение, указанное в поле dma
не изменяется. В случае ошибки полагается, что все сектора, принимавшие участие
в операции получили случайные значения.
Параметры:
вх.: C=32;
ix — адрес буфера fcb;
de — новое значение указателя;
вых.: CY=1, если были ошибки, коды ошибок, возвращаемые в
аккумуляторе, такие же, как для функций f_read (22) и f_save (23).
Действие: устанавливается новое значение указателя в
файле.
Параметры:
вх.: C=33;
ix — адрес буфера fcb;
вых.: CY=1, если были ошибки, коды ошибок, возвращаемые в
аккумуляторе, такие же, как для функций f_read (22) и f_save (23).
bc — текущее значение указателя.
Действие: возвращение текущего указателя.