Программирование под DNA_OS
ZET-9
29.05.2005
Отсюда вы узнаете,как можно будет испо─
льзовать функции системы DNA в ваших прог─
раммах. Этот файл постепенно будет допол─
няться.Пока что это просто сборник текстов
с описанием структуры системы DNA и прог─
рамм, использующих её функции.
Система предоставляет программам внеш─
нюю (долговременную) память в виде диско─
вых накопителей. Работа с различными нако─
пителями осуществляется одинаково.П-мам не
требуется знание о том, каков тип накопи─
теля (гибкие либо жесткие магнитные диски,
оптические диски либо микросхемы динамиче─
ской/статической памяти), какая файловая
система на том или ином накопителе.Все за─
боты о существующем многообразии у-в внеш─
ней памяти берёт на себя система.
Работа с файлами сводится к вызову фун─
кций системы с указанием номера устройст─
ва, имени (под)каталога,в котором располо─
жен файл/(под)каталог,имени нужного файла/
(под)каталога и типа операции,которую нео─
бходимо выполнить с файлом/(под)каталогом:
чтение/запись/создание/удаление.
Режимы распределения памяти
Система работает в 1-м режиме, 2-й пока
не используется - в резерве:
1 - однозадачный режим
В памяти находится ядро системы и п-ма.
П-ма может использовать различные режимы
прерываний (в том числе IM 2), переустана─
вливать стек и т. п. В этом режиме работа
п-мы почти не отличается от работы обычной
TR-DOS п-мы,но для вызова дисковых функций
используется вызов функций системы (через
резидент системы), и вместо прямого перек─
лючения страниц через порты п-ма использу─
ет драйвер страничной памяти.Драйвер нахо─
дится в резиденте системы, а резидент сис─
темы расположен в нижней памяти (сейчас
23296-23551). Система также использует об─
ласть #5d40..#5fff. Таким образом, п-ме
доступна экранная область (16384-22527),
область от 24576 по 65535 и страничная па─
мять,за исключением системной страницы.При
вызове дисковых функций система по своему
усмотрению может включать режим прерываний
IM 1 (если будет обращение к TR-DOS) и ос─
тавлять его. П-ма должна это учитывать.
В случае нехватки нижней памяти п-ма
может использовать область 23296-24575,
предварительно сохранив её в свободной об─
ласти и восстанавливая 23296-24575 перед
обращением к резиденту системы.Перед запу─
ском п-мы в этом режиме включается 0-я
страница.
2 - режим "переключение задач"
Доступен при наличии верхней памяти
(>128k), реально д/б 512k (если не исполь─
зуется RAM-диск) или 1024k.Отличается тем,
что в верхней памяти могут находиться дру─
гие п-мы. Поэтому перед тем, как использо─
вать страницу верхней памяти в этом режи─
ме, надо проверить, свободна ли она.
Страница считается свободной, если пос─
ледний байт в странице равен 0. Иначе там
находится другая п-ма,и использовать стра─
ницу нельзя.
В этом режиме возможен временный выход
из п-мы с сохранением текущего состояния
("сворачивание").Для этого п-ма должна по─
местить ненулевой байт во все страницы, в
которых будет сохранять код/данные, и сох─
ранить экран и 24576-49151 в страницах.По─
сле этого управление передаётся в рези─
дент,в процедуру выхода в оболочку.В даль─
нейшем можно будет вернуться в п-му, при
этом передаётся управление по адресу 49152
в основную страницу п-мы - ту, которая ре─
зервируется для п-мы осью. Она включается
при загрузке файла с п-мой.
П-мы для ОСи имеют расширение .SEP и
загружаются с адреса 24576 до 65535. Если
файл п-мы длиннее,чем 40960, грузятся пер─
вые 40960 байт.
Перед выходом п-ма должна САМА освобо─
дить все страницы, которые использовала,
иначе эти страницы будут недоступны другим
п-мам (надо поместить 0 по адресу #FFFF в
каждой странице, в том числе в основной).
Первый вход в программу
После загрузки с адреса #6000 управле─
ние передаётся п-ме. IX указывает на таб─
лицу с данными.П-ма должна взять из табли─
цы нужные ей данные для дальнейшего испо─
льзования. Подробно см. "Блок данных,пере─
даваемых программе при запуске".
При получении сообщения #0001 п-ма дол─
жна взять имя открываемого файла и про─
вести с ним операцию согласно назначению
п-мы. (Загрузить файл и "показать" его,на─
пример: музыку играть,картинку,текст - вы─
вести на экран, архив - распаковать...)
Повторные входы в программу
Если п-ма была "свёрнута", в неё можно
вернуться. Возврат осуществляется либо из
оболочки, либо из другой запущенной п-мы.
Включается основная страница данной
п-мы,передаётся управление на адрес 49152.
Регистровая пара IX указывает на таблицу
параметров. Имеют значение байты IX-2,IX-1
(2 байта) - сообщение для п-мы. Может при─
нимать значения:
#0001 - открыть файл (см. выше);
#0002 - завершить работу п-мы (это со─
общение означает, что пользователь хочет
удалить п-му из памяти);
#0003 - п-ма стала текущей (пользова─
тель переключился на эту п-му).
Резидент системы
Все вызовы функций осуществляются через
резидент системы (его адрес передаётся
п-ме при первом запуске).
Резидент имеет 3 точки входа (пока):
1-я точка входа
Адрес резидента+0: вызов драйвера стра─
ничной памяти для переключения страниц. В
регистровой паре DE передаётся номер стра─
ницы. Если в компьютере есть страница с
данным номером,она будет включена,при этом
устанавливается флаг Z. Если в компьютере
нет страницы с таким номером, сбрасывается
флаг Z, а в рег.паре HL будет максимальный
номер страницы для данного компа (для 128k
- 7,для 256k - 15, для 512k - 31,для 1024k
- 63 и т.д.).
Дополнительные функции вызываются при
DE=2, при этом используется регистр C:
C=0: включить страницу с номером 2 (т.е.
область 32768-49151 будет подключена в об─
ласть 49152)
C=1: включить 1-й экран (станет видимым
экран с адреса 16384);
C=2: включить 2-й экран (станет видимым
экран с адреса 49152 в странице 7);
C=3: включить ПЗУ BASIC 48;
C=4: включить ПЗУ BASIC 128;
C=5: получить информацию о включенной
странице, экране и ПЗУ. Возвращает:
DE=номер последней включенной стр.;
B=bit 3=0 включен 1-й экран;
B=bit 3=1 включен 2-й экран;
B=bit 4=0 включено ПЗУ BASIC128;
B=bit 4=1 включено ПЗУ BASIC48;
HL=макс.номер стр.для данного компа.
2-я точка входа
Адрес резидента+2: выход в оболочку.
Сюда п-ма должна передавать управление
при завершении работы,либо при "сворачива─
нии".
Происходит запуск подпрограммы пользо─
вателя,расположенной здесь же,в резиденте.
В зависимости от этой подп-мы будет осуще─
ствлён переход в ПЗУ BASIC128, либо в ПЗУ
TR-DOS с запуском boot'а, либо переход в
CACHE, либо поиск в памяти п-мы-оболочки и
передача управления ей, либо выход в опре─
делённую страницу, в STS, в ALASM (зависит
от содержимого подпрограммы).
3-я точка входа
Адрес резидента+4: вызов ф-ций системы.
Сюда надо передавать управление, чтобы
вызвать любую из функций системы. При этом
в рег. паре IX должен быть адрес таблицы
ПАРАМЕТРОВ ВЫЗОВА (см. "Функции системы").
А сама таблица должна быть расположена в
нижней памяти (последний байт таблицы дол─
жен иметь адрес ниже 49152,система за этим
не следит, так что МОЙТЕ РУКИ ПЕРЕД ЕДОЙ).
Загрузка системы
1. Сначала в память должен быть помещён
загрузчик оси (приветствуются любые вариа─
нты):
а) загрузчик копируется из ПЗУ в ОЗУ
при выборе пункта меню (как в KAY-1024
пункт "HDD Boot");
б) загружается с внешнего носителя (в
виде отдельной п-мы, либо как подп-ма дру─
гой п-мы - напр.,плагин к Real_Commander);
в) ваш вариант (перекидыв-ся из Cache,
загружается с магнитофонной кассеты :) ).
Загрузчик системы - это подп-ма,предна─
значенная для загрузки ядра с КОНКРЕТНОГО
физического у-ва. Примеры: загрузка с HDD,
CD-ROM, из конкретной страницы верхней па─
мяти, из кэша,из 4-й страницы ПЗУ (у неко─
торых там драйвер принтера, у кого-то Gluk
Service ). Ядро будет загружено на адрес
#BE00, и ему передаётся управление.
2. Ядро устанавливает стек,далее опраши─
вает клавишу "Space". Если не нажата,прои─
зводится попытка загрузить файлы конфигу─
рации с ЗАГРУЗОЧНОГО у-ва из корневого ка─
талога:
а) файл HIMEMORY.DNA - драйвер страни─
чной памяти для компьютера пользователя.
После успешной загрузки он устанавливается
в систему,дальнейшая работа ведётся с ним.
б) SYSTEM.DNA - файл системных пере─
менных (в нём описание логических у-в, но─
мера загрузочного, системного,быстрого,те─
кущего и у-ва для свопа,страница,в которой
должно располагаться ядро при работе, и
т.д. Подробнее далее). После успешной заг─
рузки ядро будет перенесено в указанную
страницу и далее будет работать там. Вни─
мание!Теперь номер загрузочного у-ва может
измениться,и дальнейшие файлы будут загру─
жены с него.
в) CONFIG.DNA - файл с именами авто─
стартующей п-мы и с именами эл-тов,которые
должны быть установлены в систему. После
успешной загрузки из файла берётся имя ав─
тостартующей п-мы (т.е. п-мы,которая будет
загружена первой):это первые 8 байт файла.
Загруженный файл перекидывается на #8000.
3. Загружается п-ма CONFIG.SEP. Она бе─
рёт имена элеметов,начиная с адреса #8009,
первые 8 байт из каждой строки (конец
строки - байт 13 ), конец файла - байт 3.
П-ма ищет в корневом каталоге ЗАГРУЗОЧ─
НОГО у-ва эл-ты с указанными именами (фай─
лы .DNK ), загружает их в системную стра─
ницу, устанавливает в цепочку, настраивает
на адрес загрузки - и теперь элементы ста─
новятся частью ОСи.
Все эти файлы конфигурации загружаются
на адрес #6000.Если файлы отсутствуют,либо
не удаётся их загрузить (ошибка чтения и
т.д.),то они НЕ БУДУТ установлены в систе─
му.
Eсли нажата клавиша "Space", пропускае─
тся загрузка всех файлов конфигурации.
4. Далее будет загружена п-ма с именем
SHELL.SEP (либо с другим именем, взятым из
файла CONFIG.DNA ) из корневого каталога
ЗАГРУЗОЧНОГО у-ва. При этом этой п-ме пре─
доставляется страница с номером 0. После
успешной загрузки управление передаётся
п-ме. Иначе в 7-ю страницу в STS, на адрес
56064 (если STS'а там нет - зависон).
Теоретически предполагается, что загру─
женная п-ма - это оболочка, а практически
может быть любая п-ма.
Программа-оболочка
П-ма-оболочка может быть любой (это мо─
жет быть даже Real Commander 2.6 с соотве─
тствующими плагинами).Она должна обеспечи─
вать следующие функции:
- Предоставлять пользователю информацию
о п-мах, находящихся в страницах памяти, а
также возможность выбрать и переключиться
на одну из них.
- Предоставить пользователю каталоги у-в
и возможность запуска п-м (файлы SEP),
а также возможность открывать файлы соот─
ветствующими п-мами.Для последнего оболоч─
ка загружает файл EXTEND.TXT, который дол─
жен располагаться на у-ве с открываемым
файлом, берёт из него имя п-мы и у-во, на
котором эта программа расположена (номер
0-9, либо S,W,T,Q,L - т.е.: системное, для
свопа,текущее,быстрое,загрузочное) и вызы─
вает систему для запуска этой п-мы (из ко─
рневого каталога). Если файла EXTEND.TXT
нет, оболочка ищет его на СИСТЕМНОМ у-ве.
(Пример: пользователь нажал на файле *.SCR
- это картинка, в файле указано имя п-мы
OPEN_SCR.SEP, будет загружена эта п-ма, и
она сама загрузит файл *.SCR и выведет его
на экран.)
В эту оболочку будет производиться пе─
реход из других п-м (но не обязательно,за─
висит от подпрограммы в резиденте).
Блок данных,
передаваемый программе при запуске
Максимальная длина блока 768 байт, сей─
час блок располагается начиная с адреса
#5d00.
Когда запускаемая п-ма получает управ─
ление, регистр IX указывает на адрес блока
данных + 15.
Содержимое блока данных следующее:
IX-15 defw X ;длина данных про открываемый
файл
IX-13 defw Y ;длина данных про параметры
запуска (ключи)
IX-12 defw Z ;длина данных про запущенную
п-му
IX-10 defb 0 ;расположение системы в памя─
ти компьютера:0 - в странице
IX-9 defb 0 ;режим работы системы:
0 - однозадачный
IX-8 defw 0 ;номер страницы,где система
и буфер для каталогов
IX-6 defw 0 ;длина резидента системы
IX-4 defw 0 ;адрес резидента системы
(сейчас #5b00)
IX-2 defw 0 ;сообщ-е для п-мы от системы:
0=первый запуск;
1=первый запуск+открыть файл;
остальные сообщения пока
не используются (см. выше)
IX+0 defs Z ;здесь Z байт - данные про
запущенную п-му.
(max=352 байта)
IX+Z defs Y ;здесь Y байт - данные про
параметры запуска (ключи)
(max=49 байт,
если IX-13 не равен 0)
IX+Z+Y defs X ;здесь X байт - данные про
открываемый файл.
(max=352 байта)
Итого 15+352+49+352=768 байт.
Первым делом п-ма должна взять адрес
резидента (IX-4), потом проверяет сообще─
ние от системы (IX-2) - нужно ли открыть
файл (т.е. пользователь запускает файл, а
оболочка запускает эту п-му),или пользова─
тель сам запустил эту п-му.
Данные про запущенную п-му нужны п-ме,
если:
- она состоит из нескольких файлов, в
этом случае п-ма берёт эти данные и вызы─
вает элемент DOS,чтобы загрузить остальные
файлы;
- или п-ма хочет сохранить свои настрой─
ки в файл *.ini, тогда она сохраняет этот
файл туда, где расположена сама;
- и т.д.
Функции системы DNA версии 0.431
Элементы выбираются по имени (8 байт по
адресу IX ).
Элемент SYSTEM
Входные данные: IX+8 (1 байт) - номер
функции.
Функция 0
(получить системные переменные)
IX+9 (2 байта) - адрес,куда положить ко─
пию системных переменных.Потом п-ма должна
прибавить 5 к адресу и использовать их.
Системные переменные имеют свойство из─
меняться :),поэтому необходимо получать их
непосредственно перед использованием.
Функция 1
(установить режим работы ОС)
IX+9 (1 байт) - нужный режим работы:
0 - однозадачный режим
1 - режим переключения задач
2,3 - многозадачный режим
5 - восстановить предыдущий режим работы
Элемент RUNEXE
Запускает программы (файлы с расширени─
ем SEP ). Если п-ма хочет запустить другую
п-му, она должна подготовить блок данных и
вызвать элемент RUN_EXE.
Блок данных,передаваемый эл-ту RUN_EXE:
IX-2 defw 0 ;здесь будет сообщение от
эл-та RUN_EXE о результате
выполнения в случае
каких-либо ошибок
IX+0 defb "RUNEXE " ;имя эл-та 8 байт
IX+8 defb 0 ;резерв
IX+9 defb 1 ;0-первый запуск
1-запуск с открытием файла
IX+10 defb X ;длина имени п-мы X
IX+11 defw XX ;смещение до начала имени
п-мы XX от IX+0
IX+13 defw YY ;смещение до начала имени
открываемого файла от IX+0
IX+15 defb Y ;длина пути к п-ме
IX+16 defb Z ;дл.пути к открываемому файлу
IX+17 defb W ;дл.имени открываемого файла
IX+18 defb V ;длина параметров запуска
(количество ключей)
IX+19 defb 0 ;номер у-ва,где файл
IX+20 defb 0 ;длина подкаталога, где файл
(в блоках по 256 байт)
IX+21 defw 0,0 ;начало подкат., где файл:
0 - в корневом каталоге
IX+25 defb 0 ;номер у-ва, где п-ма
IX+26 defb 0 ;длина подкаталога, где п-ма
IX+27 defw 0,0 ;начало подкат., где п-ма
IX+31 defs X ;имя п-мы
IX+31+X defs Y ;данные про путь к п-ме
IX+31+X+Y defs W ;имя открываемого файла
IX+31+X+Y+W defs Z ;данные про путь к
открываемому файлу
IX+31+X+Y+W+Z defs V ;параметры запуска
п-мы (ключи)
Элемент DOS
Дисковые функции. Входные данные: IX+8
(1 байт) - номер функции.
Функция 0
(инициализация логич.у-ва)
IX+30 (1 байт) - номер логич. у-ва.
Будет вызван драйвер блочного ввода-вы─
вода для данного у-ва с функцией 0 - ини─
циализация.
Функция 1
(вызов драйвера файловой системы)
Для работы с файлами необходимо вызы─
вать именно эту функцию.
IX+28,29 (2 байта) - номер ф-ции и под─
функции драйвера файловой системы:
0 - инициализация файловой системы. По
смещению IX+30 будет помещено имя файловой
системы, 11 байт (например: TR-DOS ).
1 - установка каталога (сделать текущим
этот каталог). Номер подфункции:
* 0 - корневой
1 - с именем в буфере
* 2 - вверх на уровень (выход из теку─
щего подкаталога)
* 3 - имя+полный путь в буфере
2 - создать. Номер подфункции:
0 - файл
* 1 - подкаталог
3 - удалить. Номер подфункции:
0 - файл
* 1 - подкаталог
4 - загрузить. Номер подфункции:
0 - файл
1 - подкаталог
5 - записать. Номер подфункции:
0 - файл
1 - подкаталог
* 6 - переименовать. Номер подфункции:
0 - файл
1 - подкаталог
* Функция отсутствует (ещё нет в системе)
Для функций 2-6 имя файла/подкаталога
должно быть указано в буфере. Эти операции
выполняются в текущем подкаталоге.
Блок данных, передаваемый эл-ту DOS:
DEFW 0 ;IX-23;контр.сумма переменных ДОС
DEFB 0 ;-21;длина блока данных
;в секторах по 256 байт
DEFB 0 ;-20;длина пути к файлу
DEFB 0 ;-19;смещ.до начала имени файла
DEFB 0 ;-18;длина имени файла
DEFB 0 ;-17;БАЙТОВ В КОНЕЧ.БЛОКЕ ФАЙЛА
DEFW 0,0 ;-16;ДЛИНА ФАЙЛА В БЛОКАХ
DEFB 0 ;-12;ДЛИНА ТЕКУЩЕГО КАТАЛОГА
DEFW 0,0 ;-11;НАЧ.БЛОК ТЕКУЩЕГО КАТАЛОГА
DEFB 0 ;-7;смещение внутри кластера
;(в блоках по 256 байт)
DEFW 0,0 ;-6;НАЧАЛЬНЫЙ НОМЕР БЛОКА ФАЙЛА
DEFW 0 ;-2;АДРЕС БУДEТ
PARAMETR
DEFB "DOS " ;+0;ИМЯ ЭЛЕМЕНТА DOS
DEFB 1 ;+8;ФУНКЦИЯ ЭЛЕМЕНТА DOS
DEFB "TR_DFS " ;+9;БУДЕТ ИМЯ ЭЛЕМЕНТА DFS
;DEFB"PAGE_DRV";+17;ИМЯ ФАЙЛА 8,если длина
;имени =0. Если длина имени не 0 (байт из
;-18), то здесь следующие данные:
DEFB 0 ;+17;резерв,не используется
DEFW XX ;+18;смещение до начала пути
;к файлу от +17
DEFB X ;+20;длина пути к файлу
DEFB Y ;+21;длина имени файла
DEFW YY ;+22;смещение до начала имени
;файла от +17
DEFB 0 ;+23;резерв
DEFB "DNA" ;+25;расширение файла,при длине
;имени 255 байт
DEFB 4,0 ;+28;НОМЕР Ф-ЦИИ И ПОДФУНКЦИИ DFS
DEFB 0 ;+30;НОМЕР ТЕКУЩЕГО УСТРОЙСТВА
DEFB 1 ;+31;ФЛАГ ЗАГРУЗКИ:
;bit0:0-В АДР.ИЗ КАТ.;1-В УКАЗАННЫЙ АДР
;bit1:0-ВЕСЬ ФАЙЛ;1-УКАЗАННОЙ ДЛИННЫ
;bit2:0-С НАЧАЛА ФАЙЛА;1-С УКАЗ.СМЕЩ-Я
;bit4:0-нач.работу с файлом;1-продолж.
;bit5:1-преобр.каталог в универс.форму
DEFW #6000,0 ;+32;АДРЕС ЗАГРУЗКИ,
;ЕСЛИ ФЛАГ=%xx1
DEFB 0,0,0,0 ;+36;ДЛИНА ЗАГРУЗКИ,
;ЕСЛИ ФЛАГ=%x1x
DEFB 0,0,0,0 ;+40;СМЕЩЕНИЕ ЗАГРУЗКИ,
;ЕСЛИ ФЛАГ=%1xx
DEFB "FDD_DRV " ;+44;ЗДЕСЬ БУДЕТ ИМЯ ЭЛ-ТА
;DRV
DEFB 0 ;+52;НОМЕР ФУНКЦИИ DRV
DEFW 0,0 ;+53;НАЧАЛЬНЫЙ НОМЕР БЛОКА 0...N
DEFW 0,0 ;+57;КОЛ-ВО БЛОКОВ
DEFW 0,0 ;+61;АДРЕС КУДА/ОТКУДА LOAD/SAVE
DEFB 0 ;+65;НОМЕР ВИРТ.ДИСКА
KUS_AUTO1
DEFS 256 ;+66;здесь путь и имя файла
;(если длина имени не равна 0
;и длина пути не 0)
ЭЛЕМЕНТ DOS УСТАНОВИТ ИМЕНА ДРАЙВЕРА ФАЙ─
ЛОВОЙ СИСТЕМЫ И БЛОЧНОГО ВВОДА-ВЫВОДА (DFS
И DRV) САМОСТОЯТЕЛЬНО.
Практически нужно изменять только флаг
операции, адрес LOAD или SAVE, смещение от
начала файла (если установлен флаг "гру─
зить с указанного смещения) и длину куска
для LOAD/SAVE (если установлен флаг "гру─
зить указанной длины").
П-ма берёт данные, получаемые при запу─
ске,копирует в своё адресное пространство,
изменяет несколько параметров и вызывает
эл-т DOS. Регистр IX должен указывать на
имя эл-та DOS.
Эл-т DOS контролирует целостность дан─
ных про файл,с которым работает п-ма. Под─
считывается контрольная сумма (CRC16), от
начала области данных DOS берёт 53 байта.
Если открываемый файл не был загружен
(записан) за один раз,то при следующих об─
ращениях надо устанавливать флаг "продол─
жить работу с файлом".Иначе при каждом об─
ращении драйвер будет загружать каталог и
искать файл там,а потом уже читать/записы─
вать.
Если загружать/записывать данные ука─
занной длины, а флаг "грузить с указанного
смещения" не устанавливать, то смещение
внутри файла изменяется автоматически.Т.е.
если 3 раза вызвать DOS и каждый раз заг─
ружать 1 кб, то первый килобайт будет заг─
ружен с начала файла, следующий килобайт
будет загружен со смещением 4 (4 блока по
256 байт),а третий килобайт будет загружен
со смещения 8 (8 блоков по 256 байт от на─
чала файла).
Флаг "грузить с указанного смещения"
нужен,чтобы обеспечить произвольный доступ
к данным внутри файла,а при последователь─
ном доступе (например,при копировании) его
устанавливать не надо.
Коды ошибок
Передаются приложению в виде сообщения
длиной 2 байта. Если оба байта равны нулю,
то ошибок нет.
1-й байт - условный номер эл-та (IX-1);
2-й байт - номер ошибки (IX-2).
Для всех эл-тов общими номерами ошибок
являются:
0 - нет вызываемой функции (подфункции)
(после такой ошибки приложение может вы─
дать сообщение пользователю типа "обновите
элемент").
1 - ошибочные параметры команды (провер─
ка на правильность параметров идёт только
в тех эл-тах,где запуск функции c неправи─
льными параметрами может повредить систе─
ме).
2 - испорчены данные в таблице данных
(имеется в виду, что испорчены некоторые
переменные вызываемого элемента).
Условные номера элементов:
0. Элемент FINDER (ищет эл-т в цепочке и
вызывает его).
0 - в цепочке эл-тов нет эл-та с ука─
занным именем.
1. Элемент SYSTEM (менеджер системных
ресурсов).
5. Элемент DFS (драйвер файловой систе─
мы).
3 - нет файла с указанным именем (при
чтении/удалении файла/каталога);
4 - файл с таким именем уже есть (при
создании файла/каталога);
5 - нет места в каталоге (при создании
файла/каталога);
6 - нет места на диске (при создании
файла/каталога);
7 - конец файла (при попытках чтения/
записи за концом файла/каталога).
6. Элемент DRV (драйвер блочного ввода-
вывода).
3 - нет виртуального диска с указанным
номером;
4 - у-во не готово;
5 - ошибки ввода-вывода. Потом будут
введены ошибки для каждой операции отдель─
но (чтение/запись).
14. Элемент RUNEXE (запускает файлы).
15. Элемент DOS (менеджер дисковых у-в).
3 - нет у-ва с заданным номером.
Формат (под)каталога
(универсальная форма)
2 байта - количество файлов в загружен─
ной части каталога (M);
2 байта - количество файлов всего в ка─
талоге (N).
Далее для каждого из M файлов по X+16
байт:
смещение длина описание
+0 1 длина имени файла (X)
Значение 1-го байта,равное 0, воспринимае─
тся как 8 (т.е. длина имени файла 8 байт),
расширение файла 3 байта.
+1 5 длина файла в байтах
+6 2 атрибуты файла
1-й байт (из FATx):
bit0: только чтение;
bit1: невидимый;
bit2: системный;
bit3: метка тома;
bit4: подкаталог;
bit5: архив;
bit6-7: резерв.
2-й байт - резерв.
+8 4 время создания файла
1-й байт: bit0-5 - минуты (0..59);
1-й:6-7 и 2-й:0-2 - часы (0..23);
2-й:3-7 - число (1..31);
3-й:0-3 - месяц (1..12);
3-й:4-7 - ст.часть года минус 1982;
4-й: мл.часть года минус 1982.
Пример: дата создания файла 26 марта 2003
года, 9 часов 30 минут - получаем
30+9*64+26*2048, 1-й и 2-й байты.
2003-1982=21 год (значит, старшие 4 бита
года равны 0). 3-й байт равен 3+0*16=3.
4-й байт равен 21.
+12 X имя файла
+12+X 4 расширение файла
Пример: пусть в подкаталоге Raznoe 4
файла, все файлы имеют разную длину имени:
HIMEMORY.DNA
spectrum_os_history.text
The Best Games for ZX-SPECTRUM.hlp
Ну прямо очень длинное сверхимя для
файла,которое не помещается ни в одну
файловую систему,кроме универсальной формы
каталога,предоставляемой операционной
системой DNA.joke
После вызова функции "загрузить подка─
талог с именем Raznoe, начиная с адреса
ADRESS и преобразовать его в универсаль─
ную форму" (должен быть установлен бит 5
флага операции),получаем по адресу ADRESS:
4,0 ;2 байта - кол-во файлов
;в загруженной части каталога
4,0 ;2 байта - всего файлов в кат.
;первый файл
+0 0 ;длина имени: 0 -> 8 байт имя
;и 3 байта расширение
+1 255,0,0,0,0 ;длина файла 255 байт
+6 4,0 ;2 байта атрибуты файла
;установлен бит 2 - системный
+8 0,0,0,0 ;4 байта:время создания файла
+12 "HIMEMORY" ;8 байт имя файла
+20 "DNA " ;4 байта расширение файла
;второй файл
+0 19 ;длина имени файла 19 символов
+1 0,100,0,0,0 ;длина файла 25600 байт
+6 2,0 ;атрибуты файла: бит1 - read only
+8 0,0,0,0 ;время создания файла
+12 "spectrum_os_history" ;19 байт имя
+31 "text" ;4 байта расширение
;третий файл
+0 30 ;длина имени файла 30 символов
+1 0,100,0,0,0 ;длина файла 25600 байт
+6 2,0 ;атрибуты файла: бит1 - read only
+8 0,0,0,0 ;время создания файла
+12 "The Best Games for ZX-SPECTRUM"
;30 байт имя
+42 "hlp " ;4 байта расширение
;четвёртый файл
+0 167 ;длина имени файла 167 символов
+1 0,100,0,0,0 ;длина файла 25600 байт
+6 2,0 ;атрибуты файла: бит1 - read only
+8 0,0,0,0 ;время создания файла
+12 "Ну прямо очень длинное сверхимя для
файла,которое не помещается ни в одну
файловую систему,кроме универсальной формы
каталога,предоставляемой операционной
системой DNA" ;167 байт имя
+189 "joke" ;4 байта расширение
Разработанный формат каталога позволяет
представить любую известную (мне) (TR-DOS,
NEOS,iS-DOS,FAT12,FAT16,FAT32,VFAT,CDFS и
др.) файловую систему в универсальной фор─
ме без потерь информации о файлах. Как бу─
дет предоставляться каталог других файло─
вых систем (NTFS,UFS и подобные),неизвест─
но :(
Выяснилось, что надо ещё где-то хранить
длину бейсик-файла,когда он моноблок с ко─
довым блоком, и потом, при копировании на
у-во с файловой системой TR-DOS, ставить
эту длину. А на данный момент ставится об─
щая длина моноблока.