Код
Дисковая операционная система для БК0010, БК0011, БК0011М
##м ###м ###м ########м ######м ######м
####м ###| ###| ###---####м ####--####м ####--####м
######м ####м ###| ###| ###| ###-- ###| ###-- ###|
###--###м #####м ###| ###| ###| ###| ###| ####м L---
###-- ###м ###|##м###| ###| ###| ###| ###| L-######м
###| ###| ###| #####| ###| ###| ###| ###| L---####м
##########| ###| ####| ###| ###| ###| ###| ###м ###|
###----###| ###| ###| ###| ####| ####м ####| ####м ####|
###| ###| ###| ###| ########--- L-######--- L-######---
L--- L--- L--- L--- L-------- L------ L------
Версия 3.30
Техническое руководство
=====================(C) 1997 А.М.Надежин =====================
Введение
В этом документе описывается структура операционной систе-
мы ANDOS V3.30, ее программный интерфейс, формат диска, а также
программный интерфейс контроллера дисководов.
Эта информация может использоваться для разработки прог-
рамм, работающих в среде ANDOS (за исключением вирусов и прог-
рамм, назначение которых - причинять какой-либо вред кому-либо)
и не должна использоваться в других целях.
Использование в программах пользователя фрагментов ANDOS,
ее утилит и оболочки возможно только с согласия авторов.
1. Загрузка ANDOS
Первоначальная загрузка производится программой начальной
загрузки, размещенной в ПЗУ контроллера дисковода, и вызываемой
обращением по адресу 160000. На БК0010 вызов осуществляется из
монитора вводом команды S160000; на БК0011М монитор обращается
к этому адресу автоматически, на БК0011 из монитора дается ко-
манда 160000G или команда B, при которой монитор читает с диска
нулевой блок, не пользуясь драйвером дисковода.
В программе начальной загрузки ПЗУ 1801РЕ2-253, использую-
щейся в контроллере от БК0011 (БЛОК КНГМД 3.059.001) применена
команда EMT112, поэтому для запуска начального загрузчика на
БК0010 необходимо предварительно поместить код команды возврата
из подпрограммы 207 по адресу 10546 (по случайному стечению
обстоятельств команда EMT112 на БК0010 приводит к обращению по
этому адресу).
Программа начальной загрузки считывает нулевой блок нуле-
вого диска с адреса 1000, после чего проверяет соответствие
первого слова считанного блока коду 240 (команда NOP), несоот-
ветствие второго слова коду 5 (команда RESET) и запускает прог-
рамму загрузки с адреса 1000. Если по каким-либо причинам счи-
тать 0 блок с нулевого привода не удалось, первое слово в счи-
танном блоке отличается от 240 или второе слово равно 5, - на-
чальный загрузчик пытается считать 0 блок с первого привода
(загрузчик в ПЗУ 1801РЕ2-253 производит также чтение со 2 и 3
привода). Если и в этом случае загрузка оказалась неудачной,
начальный загрузчик возвращает управление в вызвавшую его прог-
рамму (монитор БК). Загрузчик из ПЗУ 1801РЕ2-253 при возврате
после неудачной загрузки дает команду EMT0, приводящую на
БК0010 и БК0011М к зависанию.
В нулевом блоке системного диска размещается програм-
ма-загрузчик, позволяющая производить загрузку на компьютерах
БК0011, БК0011М и БК0010 с дополнительным ОЗУ 4-16Кбайт.
Первые 100 байт загрузчика занимает таблица параметров
диска, описанная в разделе "Таблица параметров диска" приложе-
ния "Структура диска ANDOS". С сотого байта начинается собс-
твенно загрузчик.
Загрузчик ANDOS работает следующим образом: проверяется тип
компьютера (на БК0011 и БК0011М устанавливается 4 страница ОЗУ
в нижнее окно и 6 страница в верхнее окно, выключается и сбра-
сывается таймер, устанавливается пятая палитра), очищается эк-
ран и выводится сообщение "Идет загрузка ANDOS". Далее происхо-
дит определение области, читаемой из файла ANDOS.SYS (на самом
деле чтение происходит по физическим номерам блоков, при этом
предполагается, что файл ANDOS.SYS последователен, и записан в
начале диска). На БК0011 и БК0011М файл ANDOS.SYS читается це-
ликом с самого начала (первые 16. блоков файла ANDOS.SYS -
стандартный монитор БК), на БК0010 начиная с шестнадцатого бло-
ка, при этом размер читаемой области определяется доступным
ОЗУ: при отсутствии ОЗУ по адресу 120000 в основное ОЗУ загру-
жаются 48-63 блоки ANDOS.SYS (60-75 блоки диска), содержащие
модуль заставки, после чего ему передается управление. При на-
личии ОЗУ 4Кбайт читается ядро ANDOS (10000 байт) по адресу
120000 и заставка в основное ОЗУ. При наличии ОЗУ 8Кбайт чита-
ется ядро ANDOS, файлер, эмулятор MicroDOS (20000 байт) и зас-
тавка. При ОЗУ 16Кбайт (только с таким ОЗУ возможна полноценная
работа на БК0010) читается ядро, файлер, эмулятор, оболочка
Disk MASTER и заставка (40000 байт).
При ошибке чтения на экран выводится сообщение "Ошибка
загрузки #n, повторить" (n - номер ошибки контроллера) и разда-
ется звуковой сигнал. При нажатии любой клавиши происходит пов-
торная попытка чтения.
Когда чтение успешно завершено: на БК0010 управление сразу
передается заставке; на БК0011 и БК0011М оверлейная часть обо-
лочки из первой половины шестой страницы пересылается во вторую
половину седьмой страницы, а заставка из второй части шестой
страницы пересылается в основное ОЗУ; кроме того на БК0011 про-
исходит модификация монитора для обеспечения работы звука нажа-
той клавиши, затем управление передается заставке.
Модуль заставки, находящийся в основном ОЗУ определяет на-
личие ДОЗУ, и если его нет, блокирует клавиатуру и выводит зас-
тавку с бегущей строкой, содержащей сообщение о невозможности
работы ANDOS на БК0010 без дополнительного ОЗУ. Если дополни-
тельное ОЗУ обнаружено, происходит обращение к модулю начальной
инициализации, находящемуся в буфере ANDOS по адресу 125000.
Модуль начальной инициализации подключает файлер, эмулятор
MicroDOS, и оболочку Disk MASTER при наличии ОЗУ, необходимого
для работы каждого из них. На БК0011(М) подключается виртуаль-
ный диск (если ячейка VD$ON содержит не 0) и анализируется его
содержимое: если таблица параметров в нулевом блоке виртуально-
го диска не отвечает требованиям ANDOS происходит форматирова-
ние и инициализация виртуального диска.
Затем управление возвращается в модуль заставки и на экран
выводится динамическая заставка ANDOS, при этом модуль началь-
ной инициализации ожидает нажатия управляющих клавиш для изме-
нения даты, выхода в ANDOS или запуска ключа.
При нажатии клавиши ПРОБЕЛ устанавливается нулевая дата
(00.00.80), которая в оболочке индицируется, как пустая. При
выходе в монитор по клавише КТ, запуске ключей по клавишам 0-9
или вызове стартовой функции по алфавитным клавишам вызов обо-
лочки отключается (очищается ячейка MASTER). Вызов стартовой
функции представляет собой запуск программы, размещенной с ад-
реса 137000 (первой командой подпрограммы должен быть NOP). Эта
возможность предусмотрена для реализации стартового командного
файла.
Если дата была изменена (за исключением сброса даты по
ПРОБЕЛу) при любом выходе из заставки происходит сохранение
даты на диске, при этом анализируется диск, и, если он был за-
менен, дата не сохраняется. При сохранении даты дисковые ошиб-
ки не анализируются. Это позволяет отказаться от сохранения
даты, открыв дисковод, а также решает проблемы с заклеенными
дисками.
2. Распределение памяти, структура ANDOS
ANDOS практически не использует память пользователя
(0-77777), и все свои переменные, буфер и стек хранит в ОЗУ,
расположенном по адресу 120000. Это позволяет повысить качест-
во перехвата EMT36 и соответственно повысить процент магнито-
фонных программ, нормально работающих с диском (именно поэтому
невозможна работа ANDOS в ПЗУ). Единственные ячейки ОЗУ поль-
зователя, изменяемые ANDOS - это стандартные ячейки драйвера
магнитофона 264 , 266, 301 и ячейки блока параметров магнито-
фона (обычно 320-371). Кроме того ANDOS использует ячейки
126-151 для установки ключей при инициализации или EMT14, байт
105 для сброса клавиатуры после нажатия клавиш, вектора 30
(только на БК0010) и 4. Кроме того драйвер дисковода заносит
код ошибки в байт с адресом 52.
Функционально ANDOS состоит из модуля инициализации, дис-
петчера EMT, модуля дисковой эмуляции EMT36 и модуля связи с
программой пользователя. Эти модули занимают адреса
120000-124777. Далее в адресах 125000-126177 располагается бу-
фер. Адреса 126200-126352 занимают тексты программируемых клю-
чей. Адреса 126352-126477 занимает внутренний стек ANDOS. Ад-
реса 126500-136777 занимает резидентный модуль оболочки Disk
MASTER, и входящие в него файлер, эмулятор MicroDOS и драйвер
принтера. Адреса 140000-147777 на БК0010 и вторую половину
седьмой страницы на БК0011(М) занимает вторая часть оболочки.
Система и оболочка (а также файлер, эмулятор MicroDOS и
драйвер принтера) полностью независимы, поэтому наличие оболоч-
ки и остальных модулей необязательно (вместо них на этих адре-
сах может, к примеру, находиться ассемблер).
Структура файла ANDOS.SYS
На рисунке показана структура ANDOS.SYS. Цифры слева - фи-
зические номера блоков диска, с которых начинаются соответству-
ющие области. Справа от таблицы показывается, какие части файла
загружаются на каких компьютерах, а также адреса их загрузки.
БК10+0 10+4 10+8 10+16 11,11M
ANDOS.SYS
14/12.---------------м- - - - - - - - - - -м 100000
|Монитор БК0010| |
34/28.+--------------+- - - м - -м- - м | 120000
|ANDOS,буф,стек| | | | |
+--------------+- - - - | | | 126500
|MASTER (резид)| | | |
53/43.+--------------+ | | | 137000
|Функкц. польз.| | | |
54/44.+--------------+- - - - - -- | | 40000/140000
|MASTER (оверл)| | |
74/60.+--------------+-м- - м - -м- - | |
|Заставка ANDOS| | | | | |
114/76.+--------------+--- - - - --- - - - --
|Подгр. MASTERa|
150/104.L---------------
3. Назначение и содержание модулей и областей ANDOS
3.1. Модуль инициализации
Модуль инициализации запускается при обращении по адресу
120000 (например при перезапуске БК) и выполняет следующие
функции: сбрасывает регистр состояния контроллера дисковода
(останавливает дисководы); очищает ячейки SCREEN и USRERR (опи-
сание этих ячеек см. далее); проверяет контрольную сумму ANDOS,
и если она не совпадает с эталоном выходит в монитор БК; прове-
ряет ячейку монитора 100036 - если ее содержимое отличается от
120002 (монитор в ПЗУ) происходит перехват вектора 30; проверя-
ет ячейку CONFIG, и, если значение в ней положительно, (компь-
ютер БК0011(М) устанавливается палитра, указанная в ячейке
PALET. Затем происходит установка ячеек пользователя (см. да-
лее) и ключей клавиатуры, после чего анализируется ячейка
MASTER: если в ней не 0, ее содержимое воспринимается, как ад-
рес оболочки Disk MASTER, запускаемой со следующего адреса, ес-
ли первым ее словом идет 104130. Если оболочка отключена (0 в
ячейке SCREEN) или испорчена (первое слово оболочки не 104130),
происходит вывод на экран приглашения "ANDOS V3.30" и выход в
монитор БК0010 по команде HALT.
3.2. Диспетчер EMT
Диспетчер EMT обрабатывает EMT-прерывания. При возникнове-
нии прерывания происходит сохранение значения 30 вектора. Если
возникло прерывание EMT36, диспетчер запускает модуль дисковой
эмуляции EMT36, при любом другом EMT происходит вызов из мони-
тора БК0010 подпрограммы, выполняющей соответствующее EMT (при
этом после каждого EMT14 происходит установка ячеек пользовате-
ля (см. далее) и ключей клавиатуры), после чего в 30 вектор за-
писывается сохраненное значение.
3.3. Модуль дисковой эмуляции EMT36
Модуль эмулирует работу EMT-прерывания чтения/записи на
магнитофон для работы с диском и позволяет: считывать и записы-
вать файлы на диске и магнитофоне, удалять файлы и просматри-
вать на экране каталог диска, переходить с устройства на уст-
ройство. Основной стек при работе эмулятора не используется
(эмулятор использует стековую область ANDOS).
Обращение к эмулятору осуществляется командой EMT36 или
CALL @#120002 (в последнем случае работа с диском возможна даже
в том случае, когда вектор 30 испорчен программой пользовате-
ля). При любом обращении эмулятор выполняет следующие действия:
3.3.1. Обработка имени.
При обработке имени происходит отслеживание команд в име-
ни, а также преобразование шестнадцатисимвольного имени БК в
восьмисимвольное имя с трехсимвольным расширением в стандарте
MS-DOS (IBM).
Перепаковка имени осуществляется по следующим принципам:
первая точка имени является границей между именем и расширением
(если точки в имени нет, расширение отсутствует), остальные
точки являются обычными символами расширения. Если имя превыша-
ет 8 символов берутся первые семь символов и последний, то же
происходит, когда расширение превышает 3 символа (берутся пер-
вые 2 и последний). Такой механизм упаковки позволяет в автома-
тическом режиме копировать на диски ANDOS файлы с магнитофона и
из других дисковых систем, не заботясь о переименовании файлов
с длинными именами. Необходимо понимать, что все преобразования
имени осуществляются внутри ANDOS, имя-же в блоке параметров
магнитофона остается без изменений. Таким образом программа,
пытающаяся считать файл с длинным именем получает после считы-
вания в блоке параметров то имя, которое сама там и указала
(хотя на диске имя перепаковано).
3.3.2. Настройка на тип диска
После перепаковки имени осуществляется инициализация драй-
вера дисковода и считывание таблицы параметров диска из его ну-
левого блока.
В случае, если формат используемого диска не соответствует
формату ANDOS, происходит определение наличия в памяти эмулято-
ра формата "MicroDOS" и передача ему управления. Для этого про-
веряется ячейка MDOSEM, содержащая адрес эмулятора (определение
наличия и целостности эмулятора происходит также, как и при за-
пуске оболочки). Если эмулятор неработоспособен выдается сооб-
щение "ANDOS - Non-DOS disk". Это же сообщение выводится при
выходе из эмулятора "MicroDOS" по команде "RET" (RTS PC).
Если диск соответствует формату ANDOS происходит установка
размера диска, количества сторон, и определение состояния режи-
ма пропуска дорожек. Более подробно настройка параметров описа-
на далее (см. п.3.4.2. описание функции INIDRV).
3.3.3. Выполнение операции
Основной входной информацией для эмулятора является стан-
дартный блок параметров магнитофона, адрес которого помещается
программой пользователя или монитором БК в R1.
Формат блока параметров:
-------T----------------------------м
| Смещ.| Параметр. |
+------+----------------------------+
| 0 |.BYTE Команда |
| 1 |.BYTE Ответ |
| 2 |.WORD Адрес |
| 4 |.WORD Длина |
| 6 |.ASCII /Имя (16. символов)/ |
| 26 |.WORD Адрес текущего файла |
| 30 |.WORD Длина текущего файла |
| 32 |.ASCII /Имя текущего файла/ |
L------+-----------------------------
В байт команды помещается один из кодов команд:
Коды команд
------------T-----------------------T-------------------------м
|Код команды| Стандартное назначение| Назначение в ANDOS |
+-----------+-----------------------+-------------------------+
| 0 | Выкл. двигателя магн. |мПерепаковка имени, вы- |
| 1 | Вкл. двигателя магн. |-кл. двигателя дисковода |
| 2 | Запись файла | Запись файла |
| 3 | Чтение файла | Чтение файла |
| 4 | Фиктивное чтение | Не отрабатывается |
| 200 | - | Удаление файла |
| 203 | - | Быстрое чтение файла |
| 202 | - | Запись по друг. адресу |
| 204 | - | Вывод каталога на экран |
L-----------+-----------------------+--------------------------
Как видно из таблицы, ANDOS имеет четыре дополнительных
кода команд.
По коду 200 происходит удаление файла с запросом (как и
при использовании команды ANDOS "-").
По коду 202 происходит запись по другому адресу, т.е. в
блоке параметров магнитофона указывается реальный адрес файла,
а в ячейку ADRDIR (120152), описанную в разделе "Модуль связи с
программой пользователя", помещается адрес для занесения в ка-
талог.
Код 203 используется оболочкой (и может использоваться
другими программами) для быстрого чтения файла в случаях: если
драйвер дисковода настроен, дисковод включен, нужный блок ката-
лога загружен в память, и уже известно, где находится запись о
нужном файле (ее адрес должен быть помещен в R2). Если при этом
блок каталога находится вне буфера ANDOS, а в буфер загружен
FAT, и номер блока FAT на диске (1) помещен в ячейку TEKBLK,
чтение FAT также не будет производиться.
По коду 204 на экран выводится каталог (как и при исполь-
зовании команды ANDOS ":".
Через год после выпуска в свет первой версии ANDOS была
обнаружена новая возможность, связанная с тем, что коды опера-
ций 0 или 1 могут использоваться для перепаковки имени. При вы-
полнении этих операций происходит перепаковка имени в буфер
NAMBUF с логической обработкой. При этом команды смены устройс-
тва и режима записи будут отрабатываться сразу, а при командах
удаления файла и вывода каталога их коды будут помещены в ячей-
ку COMAND. Эти операции могут использоваться в программах, са-
мостоятельно (не пользуясь EMT 36) читающих или записывающих
файлы.
В поля адреса, длины и имени помещаются соответствующие
величины, причем при чтении длина не указывается, а адрес может
быть нулевым, в этом случае файл читается по адресу, записанно-
му в каталоге.
При выполнении большинства операций происходит поиск файла
в каталоге, при этом по пустому имени вызывается файлер (вызов
файлера происходит по ячейке FILER аналогично вызову оболочки и
эмулятора MicroDOS по ячейкам MASTER и MDOSEM). После выбора
файла с помощью файлера имя выбранного файла заносится в буфер
имени NAMBUF и в поле имени блока параметров EMT36.
3.3.4. Завершение операции
После выполнения операции в байт ответа (а также в ячейку
301) помещается код ошибки. При работе с диском используются
только два кода: "0" - операция завершена без ошибок, и "4" при
любых ошибках и выполнении нестандартных операций (например та-
ких как удаление или вывод каталога на экран). Именно из-за ко-
да ошибки "4" после просмотра каталога и других дисковых опера-
ций, вызываемых из монитора БК0010, выдается сообщение "ОШИБКА"
(выход из нестандартных операций без ошибки недопустим, так
как, например, в этом случае во многих текстовых редакторах
после чтения каталога уничтожался-бы текст, находящийся в памя-
ти).
После чтения файла в поле имени текущего массива переписы-
вается имя из поля имени, в поля адреса и длины текущего мас-
сива помещаются соответствующие данные, взятые из каталога дис-
ка (т.е. даже, когда явно указан адрес, в поле адреса текущего
массива помещается адрес из каталога), в ячейку 264 помещается
реальный адрес загрузки файла, а в ячейку 266 - его длина.
3.4. Модуль связи с программой пользователя
Модуль состоит из рабочих ячеек ANDOS и ячеек, содержащих
адреса подпрограмм, используемых самой ANDOS, ее утилитами, и,
возможно, программами пользователя. Гарантируется неизменение в
последующих версиях ANDOS адресов в модуле связи.
3.4.1. Рабочие ячейки ANDOS
-------T--T------T-T------------------------------------------м
|Адрес |Дл|Метка |Т| Назначение ячейки или массива |
+------+--+------+-+------------------------------------------+
|120004|6 |DRV$A |S|Таблица параметров дисковода A: |
| | | | | .WORD Задержка опускания головки |
| | | | | .WORD Задержка шага |
| | | | | .BYTE Дорожка прекоррекции |
| | | | | .BYTE Тип дисковода. Единица в старшем|
| | | | | бите - 80 дорожек, в 7 бите - 1 сторона).|
+------+--+------+-+------------------------------------------+
|120012|6 |DRV$B |S|Таблица параметров остальных дисководов. |
+------+--+------+-+------------------------------------------+
|120020|66|DRVTAB|S|Рабочая область драйвера НГМД (описание|
| | | | |см. в приложении "Контроллер дисковода"). |
+------+--+------+-+------------------------------------------+
|120106| 2|DRIVER|S|Адрес входа "чтение/запись блока " драйве-|
| | | | |ра НГМД (160004). Может использоваться для|
| | | | |обслуживания нестандартных устройств, на-|
| | | | |пример виртуального диска). |
+------+--+------+-+------------------------------------------+
|120110| 2|IOBUFF|S|Адрес буфера ANDOS (125000). |
+------+--+------+-+------------------------------------------+
|120112| 2|E36STK|S|Адрес вершины стека ANDOS (126476). |
+------+--+------+-+------------------------------------------+
|120114|11|NAMBUF|B|Буфер имени. |
+------+--+------+-+------------------------------------------+
|120150| 2|SCREEN|I|Ячейка перехвата вывода на экран сообщений|
| | | | |ANDOS (Значение по умолчанию 0). При нену-|
| | | | |левом значении этой ячейки при выводе со-|
| | | | |общений вместо EMT 16 выполняется вызов|
| | | | |подпрограммы, адрес которой находится в|
| | | | |этой ячейке. Для запрета вывода на экран|
| | | | |достаточно поместить в SCREEN адрес любого|
| | | | |кода 207, например 100256 . При перезапус-|
| | | | |ке ANDOS ячейка SCREEN очищается. |
+------+--+------+-+------------------------------------------+
|120152| 2|ADRDIR|I|Адрес, помещаемый в каталог. Используется|
| | | | |при исполнении EMT36 с кодом операции 202 |
+------+--+------+-+------------------------------------------+
|120154| 1|DEVICE|P|Текущее устройство (0-@:, 1-32 - A:-Z:). |
+------+--+------+-+------------------------------------------+
|120155| 1|DEVTEK|P|Временное текущее устройство. Совпадает с|
| | | | |DEVICE при запуске операции, изменяется|
| | | | |при явном указании устройства в имени. |
+------+--+------+-+------------------------------------------+
|120156| 1|DEVSYS|P|Устройство с которого произведена загрузка|
| | | | |ANDOS (0 - A, 1 - B ...) |
+------+--+------+-+------------------------------------------+
|120157| 1|DEVMAS|P|Устройство, с которого Disk MASTER подгру-|
| | | | |жает необходимые модули оболочки. Совпада-|
| | | | |ет с системным до запуска OVL.M, после ко-|
| | | | |торого становится виртуальным диском "E" |
| | | | |При повреждении или отключении V-diska |
| | | | |снова становится системным. |
+------+--+------+-+------------------------------------------+
|120162| 2|SIZE |O|Общее количество кластеров на диске. Опре-|
| | | | |деляется подпрограммой INIDRV после считы-|
| | | | |вания таблицы параметров из загрузчика. |
+------+--+------+-+------------------------------------------+
|120166| 2|TEKBLK|O|Номер блока диска, находящегося в буфере. |
+------+--+------+-+------------------------------------------+
|120170| 2|VERS |K|Версия ANDOS (для V3.1 - 100466) |
+------+--+------+-+------------------------------------------+
|120127| 1|ATTRIB|I|Аттрибут файла, присваиваемый при записи. |
+------+--+------+-+------------------------------------------+
|120130| 1|SUBDIR|I|Номер катал., в котор. будет помещен файл.|
+------+--+------+-+------------------------------------------+
|120132| 2|DATE |S|Системная дата (присв. файлу при записи). |
+------+--+------+-+------------------------------------------+
|120134| 2|PALET |S|Палитра, уст. на БК11(М) при перезапуске. |
+------+--+------+-+------------------------------------------+
|120140| 1|WREGIM|P|Режим записи (код буквы "П" на любом реги-|
| | | | |стре (120) - перезапись, "Д" (104) -дубль,|
| | | | |другой код - вывод запроса). |
+------+--+------+-+------------------------------------------+
|120141| 1|TEKREG|P|Текущий режим записи. Эти две ячейки очень|
| | | | |похожи по своей работе на DEVICE и DEVTEK.|
+------+--+------+-+------------------------------------------+
|120142| 2|CONFIG|K|Конфигурация ЭВМ (60000 - БК11(М), 140000-|
| | | | |БК10+16, 140002 - БК10+8, 0 - БК10+4). |
+------+--+------+-+------------------------------------------+
|120146| 2|USRERR|I|Ячейка перехвата сообщений об ошибках. См.|
| | | | |раздел "Обработка ошибок". |
+------+--+------+-+------------------------------------------+
|120155| 1|VD$ON |S|Ненулевое значение в этой ячейке разрешает|
| | | | |подключение виртуального диска при загруз-|
| | | | |ке на БК11(М). Адрес VD$ON совп. с DEVTEK.|
+------+--+------+-+------------------------------------------+
|120164| 1|COMAND|P|Команда EMT36. В эту ячейку заносится код|
| | | | |команды из первого байта блока пар. EMT36,|
| | | | |он может изменятся командами ANDOS. |
+------+--+------+-+------------------------------------------+
|120172| 2|MASTER|K|Признак включения/адрес оболочки. |
+------+--+------+-+------------------------------------------+
|120174| 2|FILER |K|Признак включения/адрес файлера. |
+------+--+------+-+------------------------------------------+
|120176| 2|MDOSEM|K|Признак включения/адрес эмулятора MicroDOS|
+------+--+------+-+------------------------------------------+
|120244|12|USER |I|Ячейки, восстанавливаемые при перезапуске|
| | | | |или EMT14. Значение первой ячейки записы-|
| | | | |вается по адресу из второй, 3->@4, 5->@6. |
+------+--+------+-+------------------------------------------+
|120314| 2|INIPRN|K|Адрес подп. инициализации принтера. Вызов:|
| | | | |CALL @120312 .WORD 120314 . Бит C означает|
| | | | |отсутствие драйвера принтера. Рег.не сохр.|
+------+--+------+-+------------------------------------------+
|120316| 2|OUTPRN|K|Адрес п/п вывода на принтер байта из R0 с|
| | | | |перекодировкой в соотв. с тек. кодовой та-| |
| | | | |блицей. Перед LF (12) авт. вывод. CR (15).|
+------+--+------+-+------------------------------------------+
|120320| 2|GRFPRN|K|Адрес п/п выв. на принтер байта из R0 без|
| | | | |перекодировки (напр. для печати графики). |
+------+--+------+-+------------------------------------------+
|120322| 1|XY$FIL|S|(Кол-во столбцов)X(кол-во строк в файлере)|
+------+--+------+-+------------------------------------------+
|120323| 1|ST$FIL|S|Количество текстовых строк файлера. |
+------+--+------+-+------------------------------------------+
|120324| 1|W$FIL |S|Ширина окна файлера в байтах. |
+------+--+------+-+------------------------------------------+
|120325| 1|H$FIL |S|Высота окна файлера в строках. |
+------+--+------+-+------------------------------------------+
|120326| 2|AD$FIL|S|Смещение левого верхнего угла файлера, от |
| | | | |начала экрана (в байтах). |
L------+--+------+-+-------------------------------------------
Типы ячеек, указанные в графе "Т": S - параметр, устанав-
ливаемый пользователем или утилитой ANSETUP, и неизменяемый AN-
DOS, B - буфер, К - неизменяемая константа, P - переменная, I -
входной параметр, О - выходные данные (и переменная).
3.4.2. Ячейки адресов подпрограмм
В ячейках 120200-120236 и 120260-120312 расположены адреса
подпрограмм ANDOS, которые используются утилитами ANDOS и могут
быть использованы программами пользователя. Самой ANDOS эти
ячейки не используются. В следующих версиях ANDOS список ячеек
будет расширен, однако адреса ячеек, приведенных в этом описа-
нии, останутся без изменений.
---------T--------T-------------------------------------------м
| INIDRV | 120204 | Инициализация работы с диском |
| INIT1 | 120206 | Инициализ. рабочей области драйвера КНГМД |
| RWBLOK | 120226 | Чтение/запись |
| RWBUF | 120222 | Чтение/запись в буфер ANDOS с кэшированием|
| RWBUF1 | 120224 | Чтение в буфер без кэширования |
| DIRENT | 120212 | Поиск элементов каталога |
| DIREN2 | 120214 | Поиск заполненных элементов каталога |
| DIRFIN | 120216 | Поиск файла в каталоге |
| DIRFRE | 120220 | Поиск свободного элемента каталога |
| RDFAT | 120230 | Чтение FAT с диска |
| WRFAT | 120232 | Запись FAT на диск |
| GETFAT | 120234 | Распаковка ячейки FAT |
| SETFAT | 120236 | Запись в ячейку FAT |
| ERASE1 | 120210 | Удаление файла |
| FRCLAS | 120202 | Поиск пустого кластера |
| RWCLAS | 120200 | Чтение/запись кластера |
+--------+--------+-------------------------------------------+
| RUNNER | 120312 | Вызов подпрограммы с проверкой целостности|
| EXIST | 120270 | Открытие файла для записи (Перезап./Дубль)|
| DOUBLE | 120264 | Переименование файла в .BAK |
| ENDWRT | 120266 | Закрытие файла |
| ERASE2 | 120310 | Удаление цепочки из FAT. |
| DIRFI1 | 120302 | Поиск файла в каталоге (с файлером) |
| DIRFI2 | 120260 | Поиск файла в каталоге по имени из NAMBUF |
| FIND | 120300 | Поиск файла в каталоге с выдачей сообщения|
| CONNAM | 120274 | Перепаковка и логическая обработка имени |
| DONAME | 120272 | Поиск команд и перепаковка имени |
| ENAME | 120262 | Поиск конца строки и точки |
| FRCLA1 | 120276 | Поиск пустого кластера, нач. от указанного|
| RDBLOK | 120304 | Чтение блока в буфер |
| WRBLOK | 120306 | Запись блока из буфера |
L--------+--------+--------------------------------------------
INIDRV - инициализация работы с диском
Вызов: CALL @120204
Результат: Кол-во кластеров -> SIZE,
бит "C" - диск не в формате ANDOS.
Процедура используется в начале любой дисковой операции и
выполняет следующие действия: инициализирует рабочую область
драйвера КНГМД, устанавливает, в соответствии с ячейкой DEVTEK,
параметры дисковода по одной из таблиц: DRV$A (для A:) или
DRV$B (для остальных устройств), считывает таблицу параметров
диска из загрузчика, проверяет соответствие некоторых ячеек
этой таблицы эталону, и если его нет (диск не в формате ANDOS)
выходит с установленным битом "C", устанавливает режимы "1/2
стороны" и "вкл/выкл пропуска дорожек" (пропуск дорожек включа-
ется только в случае если на 80-дорожечном дисководе читается
диск, размер которого не превышает 860. блоков на двухсторон-
нем, и 430. на одностороннем диске). Необходимо отметить, что
некоторые параметры (количество повторов при ошибке, количество
секторов на дорожке, размер сектора) в DRVTAB являются констан-
тами и не изменяются ANDOS, поэтому и программа пользователя не
должна изменять их (а в случае изменения должна потом их восс-
танавливать). После выполнения операции в буфере находится ну-
левой блок диска, при этом ячейка количества сторон (IOBUFF+32)
уменьшена в два раза.
INIT1 - Инициализация рабочей области драйвера НГМД.
Вызов: CALL @120206
Портит: R2
Функция вызывается из INIDRV и выполняет действия, анало-
гичные функции "Инициализация рабочей области" драйвера НГМД
(очищаются регистр 177130 и поля CSRW, TRKTAB, FLAGS). Назначе-
ние полей рабочей области см. в приложении "Контроллер дисково-
да".
RWBLOK - Чтение/запись
Вызов: CALL @120226
Параметры: R0 - Номер блока на диске, R2 - Адрес,
R1 - Длина в словах
Подпрограмма производит чтение с диска или запись информа-
ции на диск. Если длина, записанная в R1, отрицательна - проис-
ходит запись (длина берется по модулю). Если во время операции
произошла ошибка, происходит перепозиционирование головки
(только для устройств 0-3); если ошибка не устранилась, на эк-
ран выводится сообщение "ANDOS - Disk error #<номер ошибки>" и
ожидается нажатие любой клавиши, после которого операция повто-
ряется. Функция используется при любом обмене с диском.
RWBUF - Чтение/запись в буфер ANDOS с кэшированием
Вызов: CALL @120222
Параметры: R0 - Номер блока на диске, R1 - Длина в словах
Портит: R2
Подпрограмма производит чтение с диска в буфер ANDOS с кэ-
шированием (если читаемый блок был прочитан в буфер ранее (но-
мер блока в буфере хранится в ячейке TEKBLK) чтение не произво-
дится), и запись информации из буфера на диск. Если длина, за-
писанная в R1, отрицательна происходит запись (длина берется по
модулю, а номер блока переписывается в TEKBLK). Длина никогда
не должна превышать размера буфера (500 слов).
RWBUF1 - Чтение в буфер без кэширования
Вызов: CALL @120224
Параметры: R0 - Номер блока на диске, R1 - Длина в словах
Портит: R2
Операция отличается от RWBUF тем, что в ячейку TEKBLK на-
сильственно заносится номер читаемого блока, независимо от ее
старого содержания, и чтение производится всегда. Эта функция
нужна при смене диска. Допустимо применение функции для записи.
RDBLOK - Чтение блока в буфер
Вызов: CALL @120304
Параметры: R0 - Номер блока на диске
Подпрограмма читает с кэшированием указанный блок в буфер.
WRBLOK - Запись блока из буфера
Вызов: CALL @120306
Параметры: R0 - номер блока на диске
Подпрограмма записывает содержимое буфера ANDOS в указан-
ный блок диска.
DIRENT - Поиск элементов каталога
Вызов: CALL @120212
Параметры: Перед первым запуском очистить R0
Результат: R4 - Адрес начала элемента (R4=0 - конец каталога)
бит "Z" - конец каталога
Не портить R0, R4
Перед запуском функции должна быть выполнена операция
INIDRV. Функция позволяет поэлементно считывать каталог диска.
Перед первым запуском R0 должен быть очищен. При первом запуске
DIRENT считывает в буфер первый блок каталога (далее она авто-
матически будет подчитывать блоки каталога). В R4 возвращается
адрес первого элемента каталога в буфере. При втором запуске в
R4 будет возвращен адрес второго элемента, и так далее пока ка-
талог не кончится - в этом случае R4 будет очищен и установлен
бит "Z". Функция не различает элементы каталога (заполненные,
стертые и пустые). С первого до последнего вызова функции ре-
гистры R0 и R4 не должны портится. В R0 хранится номер текущего
блока каталога.
DIREN2 - Поиск заполненных элементов каталога
Вызов: CALL @120214
Параметры: Перед первым запуском очистить R0
Результат: R4 - Адрес начала элемента
бит "Z" - конец каталога
Не портить R0, R4
Функция отличается от DIRENT тем, что она не выдает адреса
удаленных элементов каталога и подкаталогов, а при первом пус-
том элементе останавливается, устанавливая бит "Z". DIREN2 ис-
пользуется при поиске файла и выводе каталога на экран.
DIRFIN - Поиск файла в каталоге
Вызов: CALL @120216
Параметры: R1 - Адрес буфера имени
Результат: R2 - Адрес начала элемента (бит "C" - файла нет),
R0 - Номер блока в буфере (блок каталога).
Портит: R0, R2, R5
Перед запуском функции должна быть выполнена операция
INIDRV. Подпрограмма ищет в каталоге файл с именем, адрес ко-
торого записан в R1 (имя в формате: 8 байт имени, 3 байта рас-
ширения). Адрес элемента каталога в буфере помещается в R2.
Если в каталоге нет файла с таким именем происходит выход с
установленным битом "C". В R0 помещается номер блока, находя-
щегося в буфере (один из блоков каталога).
DIRFI2 - Поиск файла в каталоге по имени из NAMBUF
Вызов: CALL @120260
Параметры: Имя в NAMBUF
Результат: R2 - Адрес начала элемента (бит "C" - файла нет),
R0 - Номер блока в буфере (блок каталога).
Портит: R0, R1, R2, R5
От DIRFIN отличается тем, что имя берется из NAMBUF.
DIRFI1 - Поиск файла в каталоге (с файлером)
Вызов: CALL @120302
Параметры: Имя в NAMBUF
R3 - Адрес блока параметров EMT36 (для файлера)
Результат: R2 - Адрес начала элемента (бит "C" - файла нет),
R0 - Номер блока в буфере (блок каталога).
Портит: R0, R1, R2, R5
От DIRFI2 отличается тем, что когда имя (первые 8 символов
буфера NAMBUF) содержит одни пробелы, вызывается файлер. Если
файлер отключен или испорчен, вызывается функция вывода катало-
га на экран.
FIND - Поиск файла в каталоге с выдачей сообщения
Вызов: CALL @120300
Параметры: Имя в NAMBUF
R3 - Адрес блока параметров EMT36 (для файлера)
Результат: R2 - Адрес начала элемента (бит "C" - файла нет),
R0 - Номер блока в буфере (блок каталога).
Портит: R0, R1, R2, R5
От DIRFI1 отличается тем, что в случае, если файл не най-
ден, - на экран выдается сообщение "{имя файла} not found" (имя
берется из NAMBUF).
DIRFRE - Поиск свободного элемента каталога
Вызов: CALL @120220
Результат: R2 - Адрес начала элемента (бит "C" - нет эл-та).
Портит: R0
Перед запуском функции должна быть выполнена операция
INIDRV. Подпрограмма ищет в каталоге первый свободный (удален-
ный или пустой) элемент и помещает его адрес в буфере в R2. Ес-
ли каталог заполнен полностью (112 имен файлов и подкаталогов),
происходит выход с установленным битом "C". В R0 - номер блока
в буфере.
RDFAT - Чтение FAT с диска
Вызов: CALL @120230
Подпрограмма читает с диска в буфер ANDOS таблицу FAT.
WRFAT - Запись FAT на диск
Вызов: CALL @120232
Подпрограмма записывает на диск две копии FAT из буфера
ANDOS. Сначала записывается вторая, а потом первая копия FAT.
GETFAT - Распаковка ячейки FAT
Вызов: CALL @120234
Параметры: R0 - Номер ячейки FAT
Результат: R0 - Содержимое ячейки
Перед вызовом подпрограммы должна быть выполнена операция
чтения FAT - RDFAT. Функция распаковывает содержимое 12-битной
ячейки FAT, номер которой указан в R0 и помещает его в тот же
регистр.
SETFAT - Запись в ячейку FAT
Вызов: CALL @120236
Параметры: R0 - номер ячейки, R1 - содержимое
Результат: R0 - старое содержимое ячейки
Перед запуском функции должна быть выполнена операция
RDFAT. Подпрограмма запаковывает содержимое R1 в 12-битную
ячейку FAT, номер которой записан в R0. Старое значение ячейки
помещается в R0. Подпрограмма используется при записи и удале-
нии файла.
ERASE2 - Удаление цепочки из FAT.
Вызов: CALL @120310
Параметры: R0 - кластер начала цепочки
Портит: R0, R1
Перед запуском функции должна быть выполнена процедура
INIDRV. Функция считывает FAT с диска, удаляет цепочку и запи-
сывает на диск две копии FAT.
ERASE1 - Удаление файла
Вызов: CALL @120210
Параметры: R0 - номер блока в буфере,
R2 - адрес записи о файле (в буфере)
Портит: R0, R1, R2
Перед выполнением ERASE1 должны быть выполнены функции
INIDRV и DIRFIN. Функция удаляет файл, адрес записи о котором
помещен в R2 (запись о файле должна быть найдена в каталоге и
соответствующий блок каталога загружен в буфер функцией
DIRFIN). После выполнения операции в буфере - FAT.
FRCLAS - поиск пустого кластера.
Вызов: CALL @120202
Результат: Номер пустого кластера -> R0 (бит "C" - нет)
Перед вызовом процедуры должны быть выполнены подпрограммы
INIDRV и RDFAT. Процедура ищет первый свободный кластер и поме-
щает в R0 его номер. Если свободных кластеров на диске нет, ус-
танавливается бит "C".
FRCLA1 - Поиск пустого кластера, начиная от указанного
Вызов: CALL @120276
Параметры: R4 - кластер начала поиска
Результат: Номер пустого кластера -> R0 (бит "C" - нет)
В отличие от FRCLAS ищет пустой кластер не с начала, а от
указанного кластера.
RWCLAS - чтение/запись кластера.
Вызов: CALL @120200
Параметры: R4 - номер первого обрабатываемого кластера
R0 - признак чтения/записи (R0=0 - чтение)
R2 - адрес начала обрабатываемого участка.
R5 - сумма длин обрабатываемых кластеров
R1 - ограничитель (остаток) длины
Результат: R1 - длина остатка файла (R1<=0 - файл кончился)
R2 - адрес остатка файла в памяти
Портит: R0, R4
Подпрограмма предназначена для чтения/записи одного или
нескольких кластеров. RWCLAS позволяет обрабатывать за одну
операцию несколько последовательных кластеров файла. В R0 дол-
жен быть указан тип операции (R0=0 - чтение, иначе запись). В
R4 указывается номер первого, участвующего в операции кластера.
В R2 указывается адрес в памяти информации из первого обрабаты-
ваемого кластера. В R5 - суммарная длина обрабатываемых класте-
ров. В R1 - ограничитель длины, необходимый для того, чтобы
последний кластер файла читался или записывался не целиком, а в
соответствии с реальной длиной файла. После выполнения операции
в R1 помещается длина оставшейся необработанной части файла
(если она оказывается меньшей или равной нулю - файл обрабо-
тан), в R2 записывается адрес в памяти оставшейся части файла.
ENAME - Поиск конца строки и точки
Вызов: CALL @120262
Параметры: R3 - начало строки, R1+22. - конец
Результат: Адрес последнего символа строки -> R0
Адрес символа после "точки" -> R4
Адрес последнего символа перед точкой -> R2
бит "C" - нет имени и расширения
бит "Z" - нет имени, есть расширение
R4 > R0 - есть имя, нет расширения
Портит: R0, R2, R4
Подпрограмма используется при обработке имени. Пробелы и
недопустимые символы (0-37, 200-237) не учитываются как в конце
всей строки, так и в конце имени (перед точкой).
CONNAM - Перепаковка и логическая обработка имени
Вызов: CALL @120274
Параметры: R3 - начало строки, R1+22. - конец
Результат: Имя -> NAMBUF
Портит: R0, R2, R3, R4, R5
Имя перепаковывается, логически обрабатывается (если имя
содержит более 8 символов, берутся первые семь и последний,
аналогично если расширение содержит более 3 символов, берутся
первые два и последний) и помещается в буфер имени NAMBUF. Не-
допустимые символы (0-37, 200-237) в конце имени или расширения
не учитываются, а в середине заменяются на пробелы. Русская
заглавная буква "Е" в начале имени заменяется на аналогичную по
начертанию латинскую "E".
DONAME - Поиск команд и перепаковка имени
Вызов: CALL @120272
Параметры: R1 - адрес блока параметров EMT36
Результат: Имя -> NAMBUF
Бит "С" - операция с магнитофоном
Портит: R0, R2, R3, R4, R5
Производится поиск команд в строке имени, при этом может
изменяться устройство текущей операции (DEVTEK) и устройство по
умолчанию (DEVICE), текущий режим записи (TEKWRT) и режим запи-
си по умолчанию (WREGIM), а также текущий код команды (COMAND),
который может принимать значение 200 при удалении, и значение 0
при выводе каталога на экран. Далее производится перепаковка
имени (вызывается функция CONNAM).
EXIST - Открытие файла для записи (Перезапись/Дубль)
Вызов: CALL @120270
Параметры: Имя в NAMBUF
Результат: Бит "C" - файла нет
Портит: R0 - R5
Перед вызовом функции должна быть выполнена процедура
INIDRV. Функция ищет в каталоге указанный файл, и если он обна-
ружен, выдает на экран запрос "{имя файла} exist P/D:" (если в
ячейке TEKREG значение, отличное от кода букв "P" и "D" на лю-
бом регистре) или выполняет действие, соответствующее коду в
этой ячейке ("P" на любом регистре - файл удаляется, "D" на лю-
бом регистре - расширение файла заменяется на ".BAK", причем
старый .BAK файл, если он конечно был, удаляется). То же проис-
ходит и при вводе соответствующего символа с клавиатуры.
DOUBLE - Переименование файла в .BAK
Вызов: CALL @120264
Параметры: Имя в NAMBUF
Портит: R0, R1, R2, R5
Фрагмент предыдущей функции, меняющий расширение указанно-
го файла на ".BAK" с удалением старого BAK-файла (если он был).
ENDWRT - Закрытие файла
Вызов: CALL @120266
Параметры: Имя в NAMBUF
ATTRIB - аттрибут
SUBDIR - номер родительского подкаталога
ADRDIR - адрес
R1 - младшая часть 32-битной длины
R3 - старшая часть длины (обычно 0)
R2 - дата
R4 - стартовый кластер
Портит: R0 - R5
Функция применяется при завершении записи файла. Происхо-
дит запись FAT на диск, поиск места в каталоге (если место не
найдено, - из FAT удаляется цепочка и выдается сообщение "DIR
full"), создание записи о файле (дополнительные поля очищаются)
и запись каталога на диск.
RUNNER - Вызов подпрограммы с проверкой целостности
Вызов: JSR R5,@120312 .WORD {адрес ячейки с адресом подпр.}
Результат: Бит "C" - подпрограмма отключена или уничтожена
Портит: R0, R5
Функция проверяет содержимое ячейки, адрес которой указан
после вызова, и если там не 0, - сравнивает первое слово вызы-
ваемой подпрограммы, адрес которой и лежит в этой ячейке, с
константой 104130, и, если они равны, вызывает подпрограмму со
следующего адреса. В противном случае происходит выход с уста-
новленным битом "C".
3.4.3. Обработка ошибок
В ANDOS предусмотрена обработка всех ошибок программой
пользователя, для этого имеется ячейка USRERR (120146). Пока в
этой ячейке 0 система сама обрабатывает ошибки, выдавая на эк-
ран сообщения и принимая коды с клавиатуры. Если в ячейку
USRERR записать адрес пользовательской подпрограммы, при любой
ошибке (здесь и далее запросы на перезапись/дубль и удаление
так же называются ошибками), - происходит вызов подпрограммы
пользователя, при этом в R3 передается код ошибки, а в R4 адрес
текстового сообщения об ошибке. Если ошибка предполагает ввод
кода с клавиатуры, он должен помещаться пользовательской подп-
рограммой обработки ошибок в (SP). Выход из подпрограммы осу-
ществляется командой RTS R5.
Коды ошибок
------T--------------------------м
| 1 | Non-DOS disk |
| 2 | Disk full |
| 3 | DIR full |
| 4 | {имя файла} not found |
| 5 | Disk error #n |
| 6 | {имя файла} exist P/D: |
| 7 | {имя файла}, delete? |
L-----+---------------------------
3.5. Системный буфер ANDOS
Системный буфер ANDOS используется: для хранения загрузчи-
ка, таблицы размещения файлов и частей каталога при выполнении
дисковых операций. В принципе область буфера может быть исполь-
зована программами пользователя для хранения каких-либо данных,
необходимо только учитывать, что при любом обращении к диску
информация пользователя, находящаяся в буфере, будет потеряна.
Кроме того, начиная с версии ANDOS V3.1, стала возможна
загрузка файлов в буфер (естественно при этом нужно учитывать,
чтобы файлы не превышали размер буфера - 1200 байт). Это может
пригодиться, например, для подгрузки оверлея резидентной прог-
раммой.
3.6. Область ключей
Область ключей предназначена для хранения текстов прог-
раммируемых ключей ANDOS. Для хранения текстов ключей исполь-
зуется следующий формат:
.BYTE <количество символов в ключе 0>
.ASCII /Символы ключа 0/
.BYTE <количество символов в ключе 1>
.ASCII /Символы ключа 1/
. . .
.BYTE <количество символов в ключе 9>
.ASCII /Символы ключа 9/
Например, если в области ключей размещены байты:
0,0,0,2,101,12,0,0,0,0,0,0
запуск третьего ключа будет приводить к вводу буквы "A" и кода
возврата каретки.
Назначение ключей по умолчанию описано в соответствующем
приложении.
3.7. Стековая область ANDOS
При работе ANDOS не использует основной стек, а пользуется
собственной стековой областью. Так же, как и системный буфер,
стековая область может использоваться программами пользователя,
однако необходимо принять во внимание ограничения, описанные в
пункте 3.5.
Приложение 1.
Контроллер дисковода. Программный интерфейс.
1. Регистры контроллера
Регистр состояния: 177130
---T--T--T--T--T--T--T--T--T--T--T--T--T--T--T--м
|15|14|13|12|11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0|
L--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+---
---T---------------------------T------------------------------м
|Р.| Назначение по записи | Назначение по чтению |
+--+---------------------------+------------------------------+
|0 | выбор накопителя 0 | признак "0 ДОРОЖКА" |
|1 | выбор накопителя 1 | признак готовности (не исп.) |
|2 | | запрет (защита) записи |
|3 | | |
|4 | включение двигателя | |
|5 | выбор стороны (0-низ) | |
|6 | напр. шага (0-от центра) | |
|7 | шаг | готовность регистра данных |
|8 | признак "НАЧАЛО ЧТЕНИЯ" | |
|9 | признак "ЗАПИСЬ МАРКЕРА" | |
|10| включение прекоррекции | |
|11| | |
|12| | |
|13| | |
|14| |признак записи CRC на диск |
|15| |признак "0 СЕКТОР" |
L--+---------------------------+-------------------------------
Разряды, назначение которых не указано не используются.
Появление "1" в 7 разряде означает требование съема информации
с регистра данных или записи в него новой информации.
Регистр данных: 177132
---T--T--T--T--T--T--T--T--T--T--T--T--T--T--T--м
|15|14|13|12|11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0|
L--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+---
Все разряды регистра доступны по записи и чтению.
2. Программный интерфейс драйвера НГМД
Драйвер НГМД размещен в ПЗУ, находящемся в контроллере
дисковода, и имеет насколько точек входа:
---------T----------------------------------------м
| Адрес: | Функция: |
+--------+----------------------------------------+
| 160000 | Автоматическая загрузка |
| 160002 | Загрузка с выбранного привода |
| 160004 | Чтение-запись по номеру блока |
| 160006 | Чтение запись по номеру сектора |
| 160010 | Инициализация рабочей области драйвера |
| 160012 | Форматирование дорожки |
L--------+-----------------------------------------
Для работы драйвера необходима область ОЗУ размером 66
байт для размещения параметров и рабочих ячеек.
Формат рабочей области:
---T--T------T-------------T----------------------------------м
|См|Дл| Имя | Нач.значение| Назначение |
+--+--+------+-------------+----------------------------------+
|0 |2 |CSRW | 0 |Копия по записи регистра состояния|
|2 |2 |CURTRK| - |Адрес текущей дорожки |
|4 |4 |TRKTAB|177777,177777|Таблица текущих дорожек |
|10|2 |TDOWN | 10000. |Время опускания головки |
|12|2 |TSTEP | 10000. |Время перехода с дор. на дорожку |
|14|1 |TRKCOR| 32. |Номер дор. вкл. прекоррекции |
|15|1 |BRETRY| 20. |Число повторов при ошибках |
|16|1 |FLAGS | 0 |Рабочая ячейка драйвера |
|17|1 |FILLB |вх. параметр |Код заполнения при форматировании |
|20|2 |FLGPTR| - |Указатель на байт признаков |
|22|4 |FLGTAB| 0 |Таблица признаков (см ниже) |
|26|2 |ADDR |вх. параметр |Адрес буфера ОЗУ |
|30|2 |WCNT |вх. параметр |Число слов для пересылки |
|32|1 |SIDE |вх. параметр |Номер стороны диска |
|33|1 |TRK |вх. параметр |Номер дорожки |
|34|1 |UNIT |вх. параметр |Номер привода |
|35|1 |SECTOR|вх. параметр |Номер сектора |
|36|22| | - |Рабочие ячейки драйвера |
|60|2 |MAXSEC| 10. |Число секторов на дорожке |
|62|2 | | - |Рабочая ячейка драйвера |
|64|2 |BYTSEC| 400 |Число байт в секторе |
L--+--+------+-------------+-----------------------------------
Таблица FLGTAB содержит по одному байту на привод и ис-
пользуется для обработки нестандартных дисков. В каждом байте
используется три бита для указания параметров операции.
Бит 0 - при установке в 1 драйвер производит пропуск доро-
жек при поиске, т.е. фактически обрабатываются только четные
дорожки. Эта возможность используется для обработки на 80-доро-
жечном дисководе, дискет, размеченных на 40-дорожечном дисково-
де.
Бит 1 - при установке в 1 драйвер производит обращение
только к нижней стороне дискеты. Эта возможность используется
при подключении дисководов, имеющих только одну головку, а так-
же при обработке дискет, записанных на таком дисководе, на
двустороннем дисководе.
Бит 2 - при равенстве 0 драйвер обрабатывает сектора дли-
ной 512. байт, иначе длиной 1024. байта (из-за ошибки, допущен-
ной в драйвере, данный режим не работает).
2.1. Автоматическая загрузка
Вызов: CALL @#160000
Производится попытка загрузить операционную систему с при-
вода 0. Если попытка загрузки была неудачной, то драйвер пыта-
ется загрузить систему с 1 привода.
Если обе попытки оказались неудачными, драйвер возвращает
управление вызвавшей его программе командой "RTS PC".
При загрузке сначала инициализируется рабочая область
драйвера с адреса 2000, затем считывается 1 сектор 0 дорожки,
начиная с адреса 1000. При удачной загрузке драйвер передает
управление по адресу 1000, при этом в R0 помещается номер при-
вода, откуда произошла загрузка. Неудачной загрузка считается
если произошла ошибка чтения, первое слово считанного сектора
отличается от 240 или второе слово равно 5 .
2.2. Загрузка с выбранного привода
Вызов: CALL @#160002
Параметры: R0 - Номер привода
Действие аналогично автоматической загрузке, однако заг-
рузка начинается сразу с выбранного привода и при неудачной
загрузке попытки загрузиться с другого привода не производится.
2.3. Чтение/запись по номеру блока
Вызов: CALL @#160004
Параметры: R0 - номер блока на диске,
R1 - длина пересылаемого массива данных,
R2 - начальный адрес массива данных,
R3 - базовый адрес рабочей области драйвера,
Поле UNIT в рабочей области - номер привода.
Блок является логической единицей информации на внешних
носителях и равен 512 байтам. В используемом формате записи на
диск размер блока совпадает с размером сектора. Первый сектор
нижней стороны нулевой дорожки соответствует блоку 0. Вычисле-
ние номера сектора и дорожки по номеру блока производится с
учетом установленных признаков в таблице FLGTAB.
Длина массива данных, записанная в R1 задает число слов,
подлежащих пересылке, а также тип операции: если длина положи-
тельна - чтение, отрицательна - запись. При записи пересылаемое
число слов равно абсолютному значению длины. Если заданное чис-
ло слов превышает размер сектора, осуществляется автоматический
переход к следующему сектору, а если необходимо, то и на другую
сторону и дорожку. Если при записи число слов не кратно размеру
сектора, то остаток последнего сектора заполняется нулями.
Перед самым первым вызовом драйвера поля CSRW, TRKTAB,
FLAGS в рабочей области должны быть заполнены значениями, ука-
занными в таблице, и не должны изменяться программой пользова-
теля.
Поля TDOWN, TSTEP, TRKCOR, BRETRY, FLGTAB могут быть изме-
нены в зависимости от конкретных условий.
Возврат из драйвера осуществляется командой RTS PC. Содер-
жимое регистров R0, R1, R2, R4, R5 не сохраняется. При возник-
новении ошибки устанавливается бит "С", и в байт 52 помещается
код ошибки:
----T--------------------------------------------------м
|Код| Причина ошибки |
+---+--------------------------------------------------+
| 1 | При чтении - ошибка CRC в зоне данных |
| | При записи - установлена защита записи |
| 2 | Ошибка CRC в зоне заголовка |
| 3 | Нет позиционирования на нулевую дорожку |
| 4 | Ошибка позиционирования |
| 5 | Не найден сектор |
| 6 | Нет диска или диск не вращается |
| 7 | Прерывание по вектору 4 при операции |
| 8 | Не найден адресный маркер |
| 9 | Не найден маркер данных |
| 10| Недопустимые параметры команды или нестандартный |
| | формат диска |
L---+---------------------------------------------------
Возникновение прерывания по вектору 4 (нажатие клавиши
СТОП) во время записи на диск может привести к появлению сбоя в
секторе, в который осуществляется запись. Сбой может быть уст-
ранен при повторной записи в этот сектор.
После завершения операции драйвер оставляет двигатель дис-
ковода включенным. Для остановки двигателя программа пользова-
теля должна записать 0 по адресу 177130, а также в ячейку CSRW
рабочей области.
2.4. Чтение-запись по номеру сектора и дорожки
Вызов: CALL @#160006
Параметры: R3 - адрес рабочей области
ADDR - начальный адрес массива данных
WCNT - длина массива данных
SIDE - сторона (0-нижняя, 1-верхняя)
TRK - номер дорожки
UNIT - номер привода (0-1)
SECTOR - номер сектора (1-10.)
Действие аналогично чтению-записи логического блока.
2.5. Инициализация рабочей области
Вызов: CALL @#160010
Параметры: R3 - адрес рабочей области.
Эта точка входа является вспомогательной и служит для об-
легчения написания программ, использующих драйвер НГМД.
Заполняются поля рабочей области:
---------T----------------м
| CSRW | 0 |
| TRKTAB | 177777, 177777 |
| TDOWN | 10000. |
| TSTEP | 10000. |
| TRKCOR | 32. |
| BRETRY | 20. |
| FLAGS | 0 |
| FLGTAB | 0,0 |
| MAXSEC | 10. |
L--------+-----------------
2.6. Форматирование дорожки
Вызов: CALL @#160012
Параметры: R3 - базовый адрес рабочей области
FILLB - код, которым будет заполнено поле данных
при форматировании
SIDE - номер стороны,
TRK - номер дорожки,
UNIT - номер привода.
Форматируется указанная дорожка с указанной стороны, поле
данных всех секторов заполняется кодом FILLB
Приложение 2
Структура диска ANDOS
1. Распределение диска
Физически диск состоит из блоков (секторов), имеющих раз-
мер 512. байт.
Для размещения файлов используется кластерная структура
диска (кластер - минимальное количество информации, записывае-
мое на диск. В ANDOS - 4000 байт). Кластеры, содержащие файл
могут располагаться в разных участках диска. В этом случае
(когда файл расположен в нескольких кластерах, не идущих друг
за другом) файл называется фрагментированным. Необходимо отме-
тить, что последующие кластеры файла всегда располагаются на
диске дальше предыдущих. Таблица размещения файлов (FAT) связы-
вает кластеры одного файла в цепочку. Кластерная структура поз-
воляет оптимизировать процесс записи после удаления старых фай-
лов, и позволяет отказаться от сжатия диска ("сборки мусора"),
которое необходимо в операционных системах с последовательной
записью файлов (RT-11, MicroDOS, NORTON-БК, NORD, MKDOS).
Логичская структура диска соответствует стандарту операци-
онной системы MS-DOS, применяющейся на IBM-совместимых компь-
ютерах. Однако в отличие от MS-DOS, где размеры каталога, коли-
чество и размеры FAT, а также количество секторов на кластер
могут изменяться, в ANDOS эти параметры жестко зафиксированы:
-------------------T------------------------------м
| Размер каталога: | 7 блоков (MAX 112 файлов) |
| Размер FAT: | 1200 байт (MAX 424 кластера) |
| Количество FAT: | 2 |
| Размер кластера: | 4 блока |
L------------------+-------------------------------
Дисковое пространство в ANDOS распределяется следующим об-
разом:
--------------T------------------м
|Номера блоков| Назначение |
+-------------+------------------+
| 0 | Загрузчик |
| 1-2 | Первая копия FAT |
| 3-4 | Вторая копия FAT |
| 5-11. | Каталог |
| 12.-15. | 2 кластер |
| 16.-19. | 3 кластер |
| 20.-23. | 4 кластер |
. . . . .
| 1596.-1599. | 398 кластер |
L-------------+-------------------
2. Формат загрузчика
Загрузочный сектор (BOOT-сектор) включает в себя таблицу
параметров диска и собственно загрузчик.
2.1. Формат таблицы параметров:
----T---T---------------T-------------------------------------м
|См.|Дл.| Значение | Назначение |
+---+---+---------------+-------------------------------------+
| 0 | 2 | *** |Признак загружаемости дискеты |
| 2 | 2 | *** |Команда перехода на загрузчик |
| 4 | 7 | ASCII/ANDOS /|Название DOS (OEM ID) |
| 13| 2 | 512. |Число байт в секторе |
| 15| 1 | 4 |Количество блоков на кластер |
| 16| 2 | 1 |Число блоков в загрузчике |
| 20| 1 | 2 |Число FAT |
| 21| 2 | 112. |Максимальное число файлов в каталоге |
| 23| 2 | *** |Общее число блоков на диске |
| 25| 1 | 371 |Media Discriptor (байт парам. диска) |
| 26| 2 | 2 |Число блоков в одной FAT |
| 30| 2 | 10. |Число секторов (блоков) на дорожке |
| 32| 2 | *** |Число головок |
| 34|15.| 0 |Не используются |
| 53|11.| 11 пробелов |Метка тома |
| 66| 8.|ASCII/FAT12 /|Идентификатор файловой системы |
| 76| 2 | 0 |Не используется |
L---+---+---------------+--------------------------------------
Необходимо обратить внимание, что многие словные перемен-
ные располагаются в таблице по нечетным адресам (это связано с
тем, что в IBM нет принципиальной разницы при обращении к слову
по четному и нечетному адресу).
Первые два слова таблицы могут принимать два различных
значения в зависимости от того, является ли диск загрузочным. В
случае если диск загрузочный - первое слово 240 (признак загру-
жаемости дискеты), второе слово 436 (команда перехода на прог-
рамму загрузки BR BOOT). Если дискета незагружаемая (только та-
кие дискеты могут обрабатываться на IBM в среде MS-DOS) первые
два слова - 753 и 20220 (псевдокоманды перехода на загрузчик
IBM, проверяемые MS-DOS при обращении к диску).
Общее число блоков на диске (смещение 23) устанавливается
при форматировании и зависит от числа дорожек на диске. Для
80-дорожечного диска это число 1600.
Число головок (смещение 32) устанавливается при форматиро-
вании и зависит от типа дисковода (односторонний или двусторон-
ний).
2.2. Загрузчик
Загрузчик располагается в нулевом блоке, начиная со смеще-
ния 100. Работа загрузчика подробно описана в начале настоящего
руководства.
3. Формат каталога
Длина элемента каталога равна 32. байтам (в одном блоке
помещается 16. элементов). Элемент каталога имеет следующий
формат (смещения десятичные):
-----T----T---------------------------------------------------м
|Смещ|Длин| Назначение |
+----+----+---------------------------------------------------+
| 0 | 8 | Имя файла. Первый элемент имени имеет специальное |
| | | назначение: 0 - Элемент никогда не использовался, |
| | | 345 - Файл удален. Любой другой символ считается |
| | | первой буквой имени файла. |
| 8 | 3 | Расширение имени файла. |
| 11 | 1 | Атрибуты файла (в ANDOS обычно не используются) |
| 12 | 8 | Зарезервированы |
| 20 | 1 | Признак подкаталога и одновременно его номер |
| 21 | 1 | Номер родительского подкаталога |
| 22 | 2 | Адрес файла/имя диска для ссылки (В MS-DOS время) |
| 24 | 2 | Дата создания файла |
| 26 | 2 | Номер начального кластера. Первый кластер в обла- |
| | | сти данных имеет номер 2. |
| 28 | 2 | Длина файла |
| 30 | 2 | Расширение длины. (Для файлов > 64 Кбайт.) |
L----+----+----------------------------------------------------
Адрес файла в ANDOS хранится в поле времени MS-DOS. Хране-
ние адреса в зарезервированных ячейках элемента каталога недо-
пустимо, т.к. MS-DOS при копировании очищает эти ячейки.
Подкаталоги ANDOS представляют собой фиктивные записи о
файле с нулевыми значениями адреса, длины и стартового класте-
ра. В байте атрибута у них записана константа 10, являющаяся
для MS-DOS меткой диска (благодаря этому подкаталоги ANDOS не
показываются на IBM).
Ссылки отличаются от подкаталогов тем, что у них в поле
адреса содержится байт с именем диска (в ASCII), на который
происходит ссылка.
4. Структура FAT
ANDOS использует таблицу размещения файлов (FAT) для вы-
числения номеров блоков по номеру кластера. Для каждого класте-
ра FAT содержит 12-битный (1.5 байта) элемент. Первые два эле-
мента FAT (три байта) соответствуют каталогу. Первый байт со-
держит Media Discriptor (такой-же, как и в таблице параметров
диска - 371), второй и третий байты содержат код 377 .
Элементы FAT начиная со второго (счет от 0) соответствуют
области данных.
Элемент FAT может содержать следующие значения:
------------T-----------------------------------м
| Код | Значение |
+-----------+-----------------------------------+
| 0 | Неиспользуемый кластер. |
| 7777 | Последний кластер файла |
| 7760-7766 | Зарезервированный кластер |
| 7767 | Плохой кластер |
| XXX | Любые другие цифры означают, что |
| | кластер занят файлом и указывают |
| | на следующий кластер файла. Номер |
| | первого кластера файла хранится в |
| | каталоге. |
L-----------+------------------------------------
4.1. Правила распаковки FAT
Для того, чтобы распаковать 12-битную ячейку FAT нужно ум-
ножить номер кластера на 1.5 (т.е. на длину элемента FAT). Це-
лая часть произведения равна смещению в FAT, по которому нахо-
дится элемент, соответствующий данному кластеру. Если номер
кластера четный - взять младшие 12. бит, иначе старшие 12. бит.
Для распаковки FAT рекомендуется применять подпрограммы ANDOS -
GETFAT и SETFAT.
4.2. Формирование цепочки
Для того, чтобы найти по FAT цепочку кластеров какого-либо
файла, нужно взять из каталога (с помощью функции DIRFIN) номер
начального кластера файла, затем распаковать эту ячейку FAT
функцией GETFAT. Если результат, полученный в R0 отличается от
7777, распаковать той же функцией следующую ячейку цепочки. И
так, пока не будет найдена последняя ячейка цепочки - код 7777.
4.3. Преобразование номера кластера в номер блока
Для того, чтобы преобразовать номер кластера в номер блока
на диске нужно прибавить 1 к номеру кластера, и получившийся
результат умножить на 4 с помощью двух команд ASL.
Приложение 3
Назначение ключей по умолчанию
--T---------------------------------T-------------------------м
|N| Содержимое ключа | Назначение ключа |
+-+---------------------------------+-------------------------+
|0| M<12>RUNME<12> | Запуск описания |
|1| M<12>ANFORM<12> | Запуск ANFORM |
|2| S126500<12> | Перезапуск оболочки |
|3| | |
|4| | |
|5| | |
|6| | |
|7| | |
|8| | |
|9| M<12>MASTER<12> | Восстановление MASTER'а |
L-+---------------------------------+--------------------------
5. Заключение
Автор надеется, что информация приведенная в этом докумен-
те поможет Вам создавать программы, работающие в среде ANDOS и
новые утилиты.
Если Вы обнаружите какие-либо ошибки, неточности, или от-
сутствие какой-либо важной информации - обращайтесь к автору по
телефону: (095)180-3002, Алексей.
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
27.11.92, 8.3.1993, 22.4.93, 28.8.93, 12.9.93, 11.6.94, 24.5.97
(C) Алексей М. Надежин