   Дисковая операционная система для БК0010, БК0011, БК0011М



       [][]     []    []   [][][]       [][]       [][]
     []    []   []    []   []    []   []    []   []    []
     []    []   [][]  []   []    []   []    []   [][]
     [][][][]   []  [][]   []    []   []    []       [][]
     []    []   []    []   []    []   []    []   []    []
     []    []   []    []   [][][]       [][]       [][]


                         Версия 2.50$


                    Техническое руководство




=======(C) 1990-1992 ANCO Systems. All rights reserved.=======



                           Введение

     В этом документе описывается структура операционной  сис-
темы ANDOS V2.50$, ее программный интерфейс, формат  диска,  а
также программный интерфейс контроллера дисководов.
     Автор предоставляет эту  информацию  пользователям  своей
системы прекрасно понимая, какую она может представлять  опас-
ность, и подчеркивает, что эта информация может использоваться
для разработки программ, работающих в среде ANDOS и не  должна
использоваться в других целях.
     Использование в программах пользователя фрагментов  ANDOS
и ее утилит возможно только по согласованию с автором.


     Версии ANDOS V2.50, V2.30 и V2.23 имеют практически  оди-
наковый резидентный модуль, отличаются лишь номера версий, вы-
водимые на экран, и способы запуска эмулятора MicroDOS.


                      1. Загрузчик ANDOS

     Первоначальная загрузка производится программой начальной
загрузки, размещенной в ПЗУ контроллера дисковода,  и  вызыва-
емой обращением по адресу 160000. На БК0010 вызов  осуществля-
ется из монитора, вводом команды S160000, на  БК0011М  монитор
обращается к этому адресу автоматически, на БК0011 из монитора
дается команда 160000G (применение  команды  "B"  недопустимо,
так как при этом монитор БК0011 сам  читает  с  диска  нулевой
блок и неправильно размещает таблицу параметров дисковода).  В
программе начальной загрузки ПЗУ 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М к зависанию.
     Загрузку ANDOS с диска осуществляет  программа-загрузчик,
размещенная в 0 блоке системного диска ANDOS, считываемая  при
начальной загрузке с адреса 1000.  Загрузчик  ANDOS  позволяет
производить загрузку на компьютерах БК0011, БК0011М и БК0010 с
дополнительным ОЗУ 4-16Кбайт или расширенным ОЗУ "ПР2".
     Первые 100 байт загрузчика  занимает  таблица  параметров
диска, описанная в разделе "Таблица параметров диска" приложе-
ния "Структура  диска ANDOS".  С сотого байта начинается собс-
твенно загрузчик.
     Загрузчик ANDOS работает следующим образом: Делается  по-
пытка инициализации расширенного ОЗУ ПР2, для этого по  адресу
177616 помещается константа 7376. Проверяется тип  компьютера:
на БК0011 и БК0011М устанавливается 5 страница  ОЗУ  в  нижнее
окно и 4 страница в верхнее окно, выключается таймер, устанав-
ливается нулевая палитра; на компьютерах БК0010 и БК0011М про-
исходит инициализация экрана и вывод  надписи  "Идет  загрузка
ANDOS". Далее происходит определение области, читаемой из фай-
ла ANDOS.SYS (на самом деле чтение  происходит  по  физическим
номерам блоков, при этом предполагается,  что  файл  ANDOS.SYS
последователен, и записан в начале диска). На БК0011 и БК0011М
файл ANDOS.SYS читается с самого  начала  (первые  16.  блоков
файла ANDOS.SYS - стандартный монитор БК), на БК0010 начиная с
шестнадцатого блока. Размер читаемой области определяется раз-
мером доступного ОЗУ: при отсутствии ОЗУ по  адресу  120000  с
адреса 3000 загружаются последние 4 блока файла  ANDOS.SYS,  в
которых располагается программа, выводящая на экран информацию
о невозможности работы ANDOS на БК0010 без дополнительного ОЗУ
и ей передается управление, при наличии  ОЗУ  4Кбайт  читается
только сама ANDOS (10000 байт). При наличии ОЗУ 8Кбайт и более
файл ANDOS.SYS читается до конца. Если  при  чтении  случается
ошибка на экран выводится сообщение "Ошибка загрузки,  нажмите
клавишу" и происходит переход по адресу 160000  для  повторной
загрузки. Когда чтение успешно завершено на БК0010  управление
передается монитору по адресу 100000, на БК0011  и  БК0011М  в
ячейку 100036 загруженного монитора БК0010 (ячейка адреса под-
программы, исполняющей EMT36)  записывается  константа  120002
(адрес эмулятора EMT36), кроме того на БК0011 происходит моди-
фикация монитора для обеспечения работы звука нажатой  клавиши
и записи на магнитофон, затем управление  передается  монитору
БК0010 по адресу 100000, который в свою очередь, после  иници-
ализации, обращается по адресу 120000 и запускает ANDOS.


           2. Распределение памяти, структура ANDOS

     ANDOS  практически  не  использует  память   пользователя
(0-77777), и все свои переменные, буфер и стек хранит  в  ОЗУ,
расположенном по адресу 120000. Это позволяет повысить  качес-
тво перехвата EMT36 и соответственно повысить процент магнито-
фонных программ, нормально работающих с диском (именно поэтому
невозможна работа ANDOS в ПЗУ). Единственные ячейки ОЗУ  поль-
зователя, изменяемые ANDOS - это стандартные  ячейки  драйвера
магнитофона 264 , 266 и 301, а также ячейки  блока  параметров
магнитофона (обычно  320-371).  Кроме  того  ANDOS  использует
ячейки 126-151 для установки ключей при инициализации, вектора
30(только на БК0010) и 4. Функционально ANDOS состоит из моду-
ля инициализации, диспетчера  EMT,  модуля  дисковой  эмуляции
EMT36 и модуля связи с программой пользователя. Эти модули за-
нимают адреса 120000-124777.  Далее  в  адресах  125000-126177
располагается  буфер.  Адреса  126200-126352  занимают  тексты
программируемых ключей. Адреса 126352-126477 занимает внутрен-
ний стек ANDOS. Адреса 126500-137777 занимает  основной  рези-
дентный модуль оболочки MASTER, и  входящий  в  него  эмулятор
формата MicroDOS.
     Необходимо заметить что система и оболочка полностью  не-
зависимы, поэтому наличие оболочки необязательно  (вместо  нее
на этих адресах может, к примеру, находиться ассемблер).


     3. Назначение и содержание модулей и областей ANDOS

                  3.1. Модуль инициализации

     Модуль инициализации запускается при обращении по  адресу
120000 (например при перезапуске  БК)  и  выполняет  следующие
функции: проверяет контрольную сумму ANDOS, и если она не сов-
падает с эталоном выходит в монитор БК, если-же все  нормально
- выводит на экран приглашение "ANDOS V2.50$"  (проверка  кон-
трольной суммы нужна в первую очередь для БК0010 со  статичес-
ким ОЗУ, снабженным подхватом питания); проверяет ячейку мони-
тора 100036 - если ее содержимое 120002  (монитор  загружен  в
ОЗУ на БК0011 или БК0011М) происходит установка нулевой палит-
ры, если же содержимое ячейки 100036 отличается от 120002 (мо-
нитор в ПЗУ) происходит перехват вектора 30, в который записы-
вается адрес внутреннего диспетчера  EMT;  затем  производится
установка ключей клавиатуры и выход в монитор БК0010 по коман-
де HALT.

                      3.2. Диспетчер EMT

     Диспетчер EMT обрабатывает EMT-прерывания. При  возникно-
вении прерывания EMT36  диспетчер  запускает  модуль  дисковой
эмуляции EMT36, при любом другом EMT происходит вызов из мони-
тора БК0010  подпрограммы,  выполняющей  соответствующее  EMT,
после чего в 30 вектор записывается начальный адрес диспетчера
(это необходимо для сохранения работоспособности системы после
EMT14).

             3.3. Модуль дисковой эмуляции EMT36

     Модуль эмулирует работу EMT-прерывания  чтения/записи  на
магнитофон для работы с диском и позволяет: считывать и  запи-
сывать файлы на диске и магнитофоне, удалять файлы и  просмат-
ривать на экране каталог диска, переходить с устройства на ус-
тройство. Основной стек при работе эмулятора  не  используется
(эмулятор использует стековую область ANDOS).

     Обращение к эмулятору осуществляется командой  EMT36  или
CALL @#120002 (в последнем случае работа с диском возможна да-
же в том случае, когда вектор 30 испорчен программой пользова-
теля). При любом обращении эмулятор выполняет  следующие  дей-
ствия:
                   3.3.1. Обработка имени.

     При обработке имени происходит отслеживание команд в име-
ни, а также преобразование шестнадцатисимвольного имени  БК  в
восьмисимвольное с расширением имя в стандарте IBM.  Если  имя
состоит из символов "A:" "B:" или  "M:"  происходит  изменение
текущего устройства и выход из  эмулятора  по  коду  ошибки  4
(прерывание по клавише СТОП), если вышеупомянутые символы сто-
ят перед именем -  переход  на  другое  устройство  происходит
только на время операции (при  этом  для  магнитофона  символы
"M:" удаляются, и имя сдвигается, далее, после выполнения опе-
рации с магнитофоном, имя будет восстановлено).
     Если перед именем стоит символ "-" текущая команда в бло-
ке параметров магнитофона заменяется на команду  удаления  200
(необходимо заметить, что приоритет команды "-" ниже чем у ко-
манд обращения к другому устройству, поэтому для удаления фай-
ла "AAA.TXT" с диска B: необходимо дать команду B:-AAA.TXT).
     Если имя начинается с русской заглавной буквы  "Е"  выво-
дится сообщение об ошибке "ANDOS - Имя на Е" и происходит  вы-
ход по коду 4.
     Eсли имя состоит из символа ".", или  из  одних  пробелов
или нулей (символы "пробел" и "0" в конце имени в  ANDOS  рав-
нозначны) текущая команда в блоке параметров магнитофона заме-
няется на команду вывода каталога на экран - 204.
     Перепаковка имени осуществляется по следующим  принципам:
первая точка имени является границей между именем и расширени-
ем (если точки в имени нет, расширение отсутствует), остальные
точки являются обычными символами расширения. Если имя  превы-
шает 8 символов берутся первые семь символов и  последний,  то
же происходит, когда расширение превышает 3  символа  (берутся
первые 2 и последний). Такой механизм упаковки позволяет в ав-
томатическом режиме копировать на диски ANDOS файлы с магнито-
фона и из других дисковых систем, не заботясь о переименовании
файлов с длинными именами. Необходимо понимать, что все преоб-
разования имени осуществляются внутри ANDOS,  имя-же  в  блоке
параметров магнитофона остается без изменений.  Таким  образом
программа, пытающаяся считать файл с длинным  именем  получает
после считывания в блоке параметров то имя, которое сама там и
указала (хотя на диске имя перепаковано).


                3.3.2. Настройка на тип диска

     После  перепаковки  имени  осуществляется   инициализация
драйвера дисковода и считывание таблицы  параметров  диска  из
его нулевого блока.
     В случае, если формат используемого диска не соответству-
ет формату ANDOS, происходит определение наличия в памяти эму-
лятора формата "MicroDOS" и передача ему управления. Для этого
проверяется ячейка 136312, и,  если  в  ней  содержится  число
5000, происходит вызов подпрограммы по этому-же  адресу,  если
же нет - выводится сообщение "ANDOS - Чужой диск". Это же  со-
общение выводится при выходе из эмулятора "MicroDOS" по коман-
де "RET" (RTS PC).
     Если диск соответствует формату ANDOS происходит установ-
ка размера диска, количества сторон, и  определение  состояния
режима пропуска дорожек. Более подробно  настройка  параметров
описана далее (см. п.3.4.2. описание функции INIDRV).


                  3.3.3. Выполнение операции

     Основной входной информацией для эмулятора является стан-
дартный блок параметров магнитофона, адрес которого помещается
программой пользователя или монитором БК в R1.

                   Формат блока параметров:
            ┌──────┬────────────────────────────┐
            │ Смещ.│         Параметр.          │
            ├──────┼────────────────────────────┤
            │  0   │.BYTE Команда               │
            │  1   │.BYTE Ответ                 │
            │  2   │.WORD Адрес                 │
            │  4   │.WORD Длина                 │
            │  6   │.ASCII /Имя (16. символов)/ │
            │  26  │.WORD Адрес текущего файла  │
            │  30  │.WORD Длина текущего файла  │
            │  32  │.ASCII /Имя текущего файла/ │
            └──────┴────────────────────────────┘

     В байт команды помещается один из кодов команд:

                         Коды команд
┌───────────┬───────────────────────┬─────────────────────────┐
│Код команды│ Стандартное назначение│    Назначение в ANDOS   │
├───────────┼───────────────────────┼─────────────────────────┤
│     0     │ Выкл. двигателя магн. │┐Перепаковка имени,  вы- │
│     1     │ Вкл. двигателя магн.  │┘кл. двигателя дисковода │
│     2     │ Запись файла          │ Запись файла            │
│     3     │ Чтение файла          │ Чтение файла            │
│     4     │ Фиктивное чтение      │ Не отрабатывается       │
│    200    │         -             │ Удаление файла          │
│    202    │         -             │ Запись по друг. адресу  │
│    204    │         -             │ Вывод каталога на экран │
└───────────┴───────────────────────┴─────────────────────────┘
     Как видно из таблицы, ANDOS имеет три дополнительных кода
команд. По коду 202 происходит запись по другому адресу,  т.е.
в блоке параметров магнитофона указывается реальный адрес фай-
ла, а в ячейку ADRDIR (120152), описанную  в  разделе  "Модуль
связи с программой пользователя" помещается адрес для  занесе-
ния в каталог.

     Через год после выпуска в свет ANDOS была обнаружена  но-
вая возможность, связанная с тем, что коды операций  0  или  1
могут использоваться для  перепаковки  имени.  При  выполнении
этих операций происходит перепаковка имени в  буфер  NAMBUF  с
логической обработкой. При этом все команды ANDOS  (переход  с
устройства на устройство, удаление файла, вывод каталога) так-
же будут отрабатываться. Эти операции могут  использоваться  в
программах, самостоятельно (не пользуясь EMT 36) читающих  или
записывающих файлы.

     В поля адреса, длины и имени  помещаются  соответствующие
величины, причем при чтении длина не указывается, а адрес  мо-
жет быть нулевым, в этом случае файл читается по адресу, запи-
санному в каталоге.

                  3.3.4. Завершение операции

     После выполнения операции в байт ответа (а также в ячейку
301) помещается код ошибки. При работе с  диском  используются
только два кода: "0" - операция завершена без  ошибок,  и  "4"
при любых ошибках и выполнении нестандартных операций  (напри-
мер таких как удаление или вывод каталога  на  экран).  Именно
из-за кода ошибки "4" после просмотра каталога и других диско-
вых операций монитор БК0010 выдает сообщение  "ОШИБКА"  (Выход
из нестандартных операций без ошибки недопустим, так как, нап-
ример, в этом случае во многих текстовых редакторах после чте-
ния каталога уничтожался-бы текст, находящийся в памяти).
     После чтения файла в поле имени текущего массива  перепи-
сывается имя из поля имени, в поля адреса  и  длинны  текущего
массива помещаются соответствующие данные, взятые из  каталога
диска (т.е. даже, когда явно указан адрес, в поле адреса теку-
щего массива помещается адрес из каталога), в ячейку 264 поме-
щается реальный адрес загрузки файла, а в  ячейку  266  -  его
длина.
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

         3.4. Модуль связи с программой пользователя

     Модуль состоит из рабочих ячеек ANDOS и адресов  подпрог-
рамм, используемых самой ANDOS,  ее  утилитами,  и,  возможно,
программами пользователя. Гарантируется неизменение в последу-
ющих версиях ANDOS адресов в модуле связи.

                  3.4.1. Рабочие ячейки ANDOS

┌──────┬──┬──────┬─┬──────────────────────────────────────────┐
│Адрес │Дл│Метка │Т│       Назначение ячейки или массива      │
├──────┼──┼──────┼─┼──────────────────────────────────────────┤
│120004│6 │DRV$A │S│Таблица параметров дисковода A:           │
│      │  │      │ │ .WORD Задержка опускания головки         │
│      │  │      │ │ .WORD Задержка шага                      │
│      │  │      │ │ .BYTE Дорожка прекоррекции               │
│      │  │      │ │ .BYTE Тип дисковода (0-40 дорожек, 1-80) │
├──────┼──┼──────┼─┼──────────────────────────────────────────┤
│120012│6 │DRV$B │S│Таблица параметров дисковода B: (см.DRV$A)│
├──────┼──┼──────┼─┼──────────────────────────────────────────┤
│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- M:, 1- A:, 2- B:). │
├──────┼──┼──────┼─┼──────────────────────────────────────────┤
│120155│ 1│DEVTEK│P│Временное текущее устройство. Совпадает  с│
│      │  │      │ │DEVICE при  запуске  операции,  изменяется│
│      │  │      │ │при явном указании устройства в имени.    │
├──────┼──┼──────┼─┼──────────────────────────────────────────┤
│120162│ 2│SIZE  │O│Общее количество кластеров на диске. Опре-│
│      │  │      │ │деляется подпрограммой INIDRV после считы-│
│      │  │      │ │вания таблицы параметров из загрузчика.   │
├──────┼──┼──────┼─┼──────────────────────────────────────────┤
│120166│ 2│TEKBLK│O│Номер блока диска, находящегося в буфере. │
├──────┼──┼──────┼─┼──────────────────────────────────────────┤
│120170│ 2│VERS  │K│Версия ANDOS (для V2.23 - V2.50 - 100337) │
└──────┴──┴──────┴─┴──────────────────────────────────────────┘
     Типы ячеек, указанные в графе "Т": S - параметр, устанав-
ливаемый пользователем или утилитой ANSETUP, и  не  изменяемый
ANDOS, B - буфер, К - неизменяемая константа, P -  переменная,
I - входной параметр, О - выходные данные (и переменная).

              3.4.2. Ячейки адресов подпрограмм

     В ячейках 120200-120236  расположены  адреса  подпрограмм
ANDOS, которые используются утилитами ANDOS и могут  быть  ис-
пользованы программами пользователя. Самой ANDOS эти ячейки не
используются. В следующих версиях  ANDOS  список  ячеек  будет
расширен, однако адреса ячеек, приведенных в этом описании ос-
танутся без изменений.

            INIDRV - инициализация работы с диском

 Вызов:     CALL @120204
 Результат: Кол-во кластеров -> SIZE,
            бит "C" - диск не в формате ANDOS.

     Процедура используется в начале любой дисковой операции и
выполняет следующие действия: инициализирует  рабочую  область
драйвера КНГМД, устанавливает параметры дисковода  в  соответ-
ствии с одной из таблиц: DRV$A или  DRV$B  (в  зависимости  от
ячейки DEVTEK), считывает таблицу параметров диска из  загруз-
чика, проверяет соответствие некоторых ячеек этой таблицы эта-
лону, и если его нет (диск не в формате ANDOS) выходит с уста-
новленным битом "C", устанавливает режимы 1/2 стороны вкл/выкл
пропуска дорожек (пропуск дорожек включается только  в  случае
если на 80-дорожечном дисководе читается диск, размер которого
не превышает 860. блоков на двухстороннем, и 430. на  односто-
роннем диске). Необходимо отметить,  что  некоторые  параметры
(количество повторов при ошибке, количество секторов на дорож-
ке, размер сектора) в DRVTAB являются константами и не изменя-
ются ANDOS, поэтому и программа пользователя не  должна  изме-
нять их (а в случае изменения  должна  потом  их  восстанавли-
вать).



     INIT1 - Инициализация рабочей области драйвера НГМД.

 Вызов:     CALL @120206
 Портит:    R2

     Функция вызывается из INIDRV и выполняет действия, анало-
гичные функции "Инициализация рабочей области"  драйвера  НГМД
(очищаются регистр 177130 и поля CSRW, TRKTAB, FLAGS).  Назна-
чение полей рабочей области см. в приложении "Контроллер  дис-
ковода".


                     RWBLOK - Чтение/запись

 Вызов:     CALL @120226
 Параметры: R0 - Номер блока на диске, R2 - Адрес,
            R1 - Длина в словах

     Подпрограмма производит чтение с диска или запись  инфор-
мации на диск. Если длина, записанная  в  R1,  отрицательна  -
происходит запись (длина берется по  модулю).  Если  во  время
операции произошла ошибка на экран выводится сообщение  "ANDOS
- Ошибка чтения/записи #<номер ошибки>"  и  ожидается  нажатие
любой клавиши, после которого  операция  повторяется.  Функция
используется при любом обмене с диском.


      RWBUF - Чтение/запись в буфер ANDOS с кэшированием

 Вызов:     CALL @120222
 Параметры: R0 - Номер блока на диске, R1 - Длина в словах
 Портит:    R2

     Подпрограмма производит чтение с диска в  буфер  ANDOS  с
кэшированием (если читаемый блок был прочитан  в  буфер  ранее
(номер блока в буфере хранится в ячейке TEKBLK) чтение не про-
изводится), и запись информации из буфера на диск. Если длина,
записанная в R1, отрицательна происходит запись (длина берется
по модулю, а номер блока переписывается в TEKBLK).  Длина  ни-
когда не должна превышать размера буфера (500  слов).  Функция
использует подпрограмму RWBLOK.  RWBUF используется при чтении
загрузчика, каталога и FAT.


           RWBUF1 - Чтение в буфер без кэширования

 Вызов:     CALL @120224
 Параметры: R0 - Номер блока на диске, R1 - Длина в словах
 Портит:    R2

     Операция отличается от RWBUF тем, что в ячейку TEKBLK на-
сильственно заносится номер читаемого блока, независимо от  ее
старого содержания, и чтение производится всегда. Эта  функция
нужна при смене диска. Допустимо применение функции для  запи-
си.


              DIRENT - Поиск элементов каталога

 Вызов:     CALL @120212
 Параметры: Перед первым запуском очистить R0
 Результат: R4 - Адрес начала элемента (R4=0 - конец каталога).
 Не портить R0, R4

     Перед запуском функции  должна  быть  выполнена  операция
INIDRV. Функция позволяет поэлементно считывать каталог диска.
Перед первым запуском R0 должен быть очищен. При первом запус-
ке DIRENT считывает в буфер первый блок  каталога  (далее  она
автоматически будет подчитывать блоки каталога). В R4  возвра-
щается адрес первого элемента каталога в  буфере.  При  втором
запуске в R4 будет возвращен адрес второго элемента, и так да-
лее пока каталог не кончится - в этом случае R4 будет очищен и
установлен бит "Z". Функция  не  различает  элементы  каталога
(заполненные, стертые и пустые). С первого до последнего вызо-
ва функции регистры R0 и R4 не должны портится. В R0  хранится
текущий блок каталога.


        DIREN2 - Поиск заполненных элементов каталога

 Вызов:     CALL @120214
 Параметры: Перед первым запуском очистить R0
 Результат: R4 - Адрес начала элемента (R4=0 - конец каталога).
 Не портить R0, R4

     Функция отличается от DIRENT тем, что она не выдает адре-
са удаленных элементов каталога, а при первом пустом  элементе
останавливается, устанавливая бит "Z". Функция использует под-
программу DIRENT. DIREN2 используется при поиске файла и выво-
де каталога на экран.


               DIRFIN - Поиск файла в каталоге

 Вызов:     CALL @120216
 Параметры: R1 - Адрес буфера имени
 Результат: R2 - Адрес начала элемента (бит "C" - файла нет),
            R0 - Номер блока в буфере (блок каталога).
 Портит:    R0, R2, R5

     Перед запуском функции  должна  быть  выполнена  операция
INIDRV. Подпрограмма ищет в каталоге файл с именем, адрес  ко-
торого записан в R1 (имя в формате: 8 байт имени, 3 байта рас-
ширения). Адрес элемента каталога в буфере  помещается  в  R2.
Если в каталоге нет файла с таким именем  происходит  выход  с
установленным битом "C". В R0 помещается номер блока,  находя-
щегося в буфере (один из блоков каталога). Функция  использует
подпрограмму DIREN2. DIRFIN используется при чтении и удалении
файла.


         DIRFRE - Поиск свободного элемента каталога

 Вызов:     CALL @120220
 Результат: R2 - Адрес начала элемента (бит "C" - нет эл-та).
 Портит:    R0

     Перед запуском функции  должна  быть  выполнена  операция
INIDRV. Подпрограмма ищет в каталоге первый свободный (удален-
ный или пустой) элемент и помещает его адрес в  буфере  в  R2.
Если каталог полностью заполнен происходит выход с установлен-
ным битом "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. Подпрограмма используется при записи и удале-
нии файла.


                    ERASE1 - Удаление файла

 Вызов:     CALL @120210
 Параметры: R0 - номер блока в буфере,
            R2 - адрес записи о файле (в буфере)
 Портит:    R0, R1, R2

     Перед выполнением ERASE1 должны  быть  выполнены  функции
INIDRV и DIRFIN. Функция удаляет файл, адрес записи о  котором
помещен в R2 (запись о файле должна быть найдена в каталоге  и
соответствующий  блок  каталога  загружен  в  буфер   функцией
DIRFIN). После выполнения операции в буфере - FAT.


               FRCLAS - поиск пустого кластера.

 Вызов:     CALL @120202
 Результат: Номер пустого кластера -> R0 (бит "C" - нет)

     Перед вызовом процедуры должны быть выполнены подпрограм-
мы INIDRV и RDFAT.  Процедура ищет первый свободный кластер, и
помещает в R0 его номер. Если свободных кластеров на диске нет
по выходу из FRCLAS устанавливается бит "C". Функция использу-
ет подпрограмму GETFAT.  FRCLAS используется при записи  файла
для поиска свободного места на диске.


               RWCLAS - чтение/запись кластера.

 Вызов:     CALL @120200
 Параметры: R4 - номер первого обрабатываемого кластера
            R0 - признак чтения/записи (R0=0 - чтение)
            R2 - адрес начала обрабатываемого участка.
            R5 - длина читаемой информации
            R1 - ограничитель длины
 Результат: R1 - длина остатка файла (R1<=0 - файл кончился)
            R2 - адрес остатка файла в памяти
 Портит:    R0, R4

     Подпрограмма предназначена для чтения/записи  одного  или
нескольких кластеров. Особенностью подпрограммы  является  то,
что в случае, если несколько кластеров файла последовательны -
они обрабатываются за одну операцию. В R0 должен  быть  указан
тип операции (R0=0 - чтение, иначе запись). В  R4  указывается
номер первого, участвующего в операции кластера. В R2 указыва-
ется адрес в  памяти  информации  из  первого  обрабатываемого
кластера. В R5 - суммарная длина обрабатываемых  кластеров.  В
R1 - ограничитель длины, необходимый для того, чтобы последний
кластер файла читался или записывался не целиком, а в соответ-
ствии с реальной длиной файла. После выполнения операции в  R1
помещается длина оставшейся необработанной части  файла  (если
она оказывается меньшей или равной нулю - файл  обработан),  в
R2 записывается адрес в памяти оставшейся части  файла.
     Из-за сложности понимания работы подпрограммы не рекомен-
дуется ее применение в программах пользователя.


                   3.5. Системный буфер ANDOS

     Системный буфер ANDOS используется для хранения загрузчи-
ка, таблицы размещения файлов и частей каталога при выполнении
дисковых операций. В принципе область буфера  может  быть  ис-
пользована программами пользователя  для  хранения  каких-либо
данных, необходимо только учитывать, что при любом обращении к
диску информация пользователя, находящаяся в буфере будет  по-
теряна.


                      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


       ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
       │15│14│13│12│11│10│ 9│ 8│ 7│ 6│ 5│ 4│ 3│ 2│ 1│ 0│
       └──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘

┌──┬───────────────────────────┬──────────────────────────────┐
│Р.│   Назначение по записи    │     Назначение по чтению     │
├──┼───────────────────────────┼──────────────────────────────┤
│0 │ выбор накопителя 0        │ признак "0 ДОРОЖКА"          │
│1 │ выбор накопителя 1        │ признак готовности (не исп.) │
│2 │                           │ запрет (защита) записи       │
│3 │                           │                              │
│4 │ включение двигателя       │                              │
│5 │ выбор стороны (0-низ)     │                              │
│6 │ напр. шага (0-от центра)  │                              │
│7 │ шаг                       │ готовность регистра данных   │
│8 │ признак "НАЧАЛО ЧТЕНИЯ"   │                              │
│9 │ признак "ЗАПИСЬ МАРКЕРА"  │                              │
│10│ включение прекоррекции    │                              │
│11│                           │                              │
│12│                           │                              │
│13│                           │                              │
│14│                           │признак записи CRC на диск    │
│15│                           │признак "0 СЕКТОР"            │
└──┴───────────────────────────┴──────────────────────────────┘
     Разряды, назначение которых не указано  не  используются.
Появление "1" в 7 разряде означает требование съема информации
с регистра данных или записи в него новой информации.

Регистр данных: 177132


       ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
       │15│14│13│12│11│10│ 9│ 8│ 7│ 6│ 5│ 4│ 3│ 2│ 1│ 0│
       └──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘
     Все разряды регистра доступны по записи и чтению.


            2. Программный интерфейс драйвера НГМД

     Драйвер НГМД размещен в ПЗУ,  находящемся  к  контроллере
дисковода и имеет насколько точек входа:

     ┌────────┬────────────────────────────────────────┐
     │ Адрес: │               Функция:                 │
     ├────────┼────────────────────────────────────────┤
     │ 160000 │ Автоматическая загрузка                │
     │ 160002 │ Загрузка с выбранного привода          │
     │ 160004 │ Чтение-запись по номеру блока          │
     │ 160006 │ Чтение запись по номеру сектора        │
     │ 160010 │ Инициализация рабочей области драйвера │
     │ 160012 │ Форматирование дорожки                 │
     └────────┴────────────────────────────────────────┘

     Для работы драйвера необходима область  ОЗУ  размером  66
байт для размещения параметров и рабочих ячеек.

                    Формат рабочей области:
┌──┬──┬──────┬─────────────┬──────────────────────────────────┐
│См│Дл│  Имя │ Нач.значение│          Назначение              │
├──┼──┼──────┼─────────────┼──────────────────────────────────┤
│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     │Число байт в секторе              │
└──┴──┴──────┴─────────────┴──────────────────────────────────┘

     Таблица 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 помеща-
ется код ошибки:
   ┌───┬──────────────────────────────────────────────────┐
   │Код│                   Причина ошибки                 │
   ├───┼──────────────────────────────────────────────────┤
   │ 1 │ При чтении - ошибка CRC в зоне данных            │
   │   │ При записи - установлена защита записи           │
   │ 2 │ Ошибка CRC в зоне заголовка                      │
   │ 3 │ Нет позиционирования на нулевую дорожку          │
   │ 4 │ Ошибка позиционирования                          │
   │ 5 │ Не найден сектор                                 │
   │ 6 │ Нет диска или диск не вращается                  │
   │ 7 │ Прерывание по вектору 4 при операции             │
   │ 8 │ Не найден адресный маркер                        │
   │ 9 │ Не найден маркер данных                          │
   │ 10│ Недопустимые параметры команды или нестандартный │
   │   │ формат диска                                     │
   └───┴──────────────────────────────────────────────────┘
     Возникновение прерывание по вектору  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 - адрес рабочей области.

     Эта точка входа является вспомогательной и служит для об-
легчения написания программ, использующих драйвер НГМД.

     Заполняются поля рабочей области:

                  ┌────────┬────────────────┐
                  │ CSRW   │ 0              │
                  │ TRKTAB │ 177777, 177777 │
                  │ TDOWN  │ 10000.         │
                  │ TSTEP  │ 10000.         │
                  │ TRKCOR │ 32.            │
                  │ BRETRY │ 20.            │
                  │ FLAGS  │ 0              │
                  │ FLGTAB │ 0,0            │
                  │ MAXSEC │ 10.            │
                  └────────┴────────────────┘

                  2.6. Форматирование дорожки

Вызов:     CALL @#160012
Параметры: R3 - базовый адрес рабочей области
           FILLB - код, которым будет заполнено поле данных
           при форматировании
           SIDE  - номер стороны,
           TRK   - номер дорожки,
           UNIT  - номер привода.

     Форматируется указанная дорожка с указанной стороны, поле
данных всех секторов заполняется кодом FILLB

Приложение 2

                     Структура диска  ANDOS

                     1. Распределение диска

     Физически диск состоит из блоков (секторов), имеющих раз-
мер 512. байт.
     Для размещения файлов используется  кластерная  структура
диска (кластер - минимальное количество информации,  записыва-
емое на диск. В ANDOS - 4000 байт). Кластеры, содержащие  файл
могут располагаться в разных участках  диска.  В  этом  случае
(когда файл расположен в нескольких кластерах, не идущих  друг
за другом) файл называется фрагментированным.  Необходимо  от-
метить, что последующие кластеры файла всегда располагаются на
диске дальше предыдущих. Таблица размещения файлов (FAT)  свя-
зывает кластеры одного файла в цепочку.  Кластерная  структура
позволяет оптимизировать процесс записи после удаления  старых
файлов, и позволяет отказаться от сжатия диска ("сборки  мусо-
ра"), которое необходимо в операционных системах с  последова-
тельной записью файлов (RT-11, MicroDOS, NORTON-БК, NORD).
     Логичская структура диска соответствует стандарту  опера-
ционной  системы  MS-DOS,  применяющейся  на   IBM-совместимых
компьютерах. Однако в отличие от MS-DOS, где размеры каталога,
количество и размеры FAT, а также количество секторов на клас-
тер могут изменяться, в ANDOS эти параметры жестко  зафиксиро-
ваны:

     ┌──────────────────┬──────────────────────────────┐
     │ Размер каталога: │ 7 блоков (MAX 112 файлов)    │
     │ Размер FAT:      │ 1200 байт (MAX 424 кластера) │
     │ Количество FAT:  │ 2                            │
     │ Размер кластера: │ 4 блока                      │
     └──────────────────┴──────────────────────────────┘

     Дисковое пространство в  ANDOS  распределяется  следующим
образом:

              ┌─────────────┬──────────────────┐
              │Номера блоков│    Назначение    │
              ├─────────────┼──────────────────┤
              │ 0           │ Загрузчик        │
              │ 1-2         │ Первая копия FAT │
              │ 3-4         │ Вторая копия FAT │
              │ 5-11.       │ Каталог          │
              │ 12.-15.     │ 2 кластер        │
              │ 16.-19.     │ 3 кластер        │
              │ 20.-23.     │ 4 кластер        │

              .           . . .                .

              │ 1596.-1599. │ 398 кластер      │
              └─────────────┴──────────────────┘

                      2. Формат загрузчика

     Загрузочный сектор (BOOT-сектор) включает в себя  таблицу
параметров диска и собственно загрузчик.

               2.1. Формат таблицы параметров:

┌───┬───┬───────────────┬─────────────────────────────────────┐
│См.│Дл.│   Значение    │ Назначение                          │
├───┼───┼───────────────┼─────────────────────────────────────┤
│ 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             │Не используется                      │
└───┴───┴───────────────┴─────────────────────────────────────┘
     Необходимо обратить внимание, что многие словные перемен-
ные располагаются в таблице по нечетным адресам (это связано с
тем, что в IBM нет принципиальной разницы при обращении к сло-
ву по четному и нечетному адресу).
     Первые два  слова  таблицы  могут принимать два различных
значения в зависимости от того,  является-ли диск загрузочным.
В  случае  если  диск  загрузочный - первое слово 240 (признак
загружаемости дискеты),  второе слово 436 (команда перехода на
программу загрузки BR BOOT). Если дискета незагружаемая (толь-
ко такие дискеты могут обрабатываться на IBM в  среде  MS-DOS)
первые два слова - 753 и 20220 (псевдокоманды перехода на заг-
рузчик IBM, проверяемые MS-DOS при обращении к диску).
     Общее число блоков на диске (смещение 23) устанавливается
при форматировании и зависит от числа дорожек  на  диске.  Для
80-дорожечного диска это число 1600. .
     Число головок (смещение 32) устанавливается при  формати-
ровании и зависит от типа дисковода (односторонний или двусто-
ронний).

                         2.2. Загрузчик

     Загрузчик располагается в нулевом блоке начиная со смеще-
ния 100. Работа загрузчика подробно описана в начале настояще-
го руководства.


                       3. Формат каталога

     Длина элемента каталога равна 32. байтам (в  одном  блоке
помещается 16. элементов). Элемент  каталога  имеет  следующий
формат (смещения десятичные):

┌────┬────┬───────────────────────────────────────────────────┐
│Смещ│Длин│                    Назначение                     │
├────┼────┼───────────────────────────────────────────────────┤
│ 0  │ 8  │ Имя файла. Первый элемент имени имеет специальное │
│    │    │ назначение: 0 - Элемент никогда не использовался, │
│    │    │ 345 - Файл удален. Любой другой  символ считается │
│    │    │ первой буквой имени файла.                        │
│ 8  │ 3  │ Расширение имени файла.                           │
│ 11 │ 1  │ Атрибуты файла (в ANDOS не используются)          │
│ 12 │ 10 │ Зарезервированы                                   │
│ 22 │ 2  │ Адрес файла (В MS-DOS время создания файла)       │
│ 24 │ 2  │ Дата создания файла (В ANDOS не используется)     │
│ 26 │ 2  │ Номер начального кластера. Первый кластер в обла- │
│    │    │ сти данных имеет номер 2.                         │
│ 28 │ 2  │ Длина файла                                       │
│ 30 │ 2  │ Расширение длины. (Для файлов > 64 Кбайт.)        │
└────┴────┴───────────────────────────────────────────────────┘
     Адрес файла в ANDOS хранится в поле времени MS-DOS.  Хра-
нение адреса в зарезервированных ячейках элемента каталога не-
допустимо, т.к. MS-DOS при копировании очищает эти ячейки.


                        4. Структура FAT

     ANDOS использует таблицу размещения файлов (FAT) для  вы-
числения номеров блоков по номеру кластера. Для каждого  клас-
тера FAT содержит 12-битный (1.5 байта)  элемент.  Первые  два
элемента FAT (три байта) соответствуют каталогу.  Первый  байт
содержит Media Discriptor (такой-же, как и в таблице  парамет-
ров диска - 371), второй и третий байты  содержат  код  377  .
     Элементы FAT начиная со второго (счет от 0) соответствуют
области данных.
     Элемент FAT может содержать следующие значения:

      ┌───────────┬───────────────────────────────────┐
      │   Код     │       Значение                    │
      ├───────────┼───────────────────────────────────┤
      │ 0         │ Неиспользуемый кластер.           │
      │ 7777      │ Последний кластер файла           │
      │ 7760-7766 │ Зарезервированный кластер         │
      │ 7767      │ Плохой кластер                    │
      │ XXX       │ Любые другие  цифры означают, что │
      │           │ кластер занят файлом  и указывают │
      │           │ на следующий кластер файла. Номер │
      │           │ первого кластера файла хранится в │
      │           │ каталоге.                         │
      └───────────┴───────────────────────────────────┘

                  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.


    Примеры написания программ, использующих функции ANDOS

     В данном приложении даются несколько  примеров фрагментов
программ, использующих функции и ячейки ANDOS.


       3.1. Программа преобразования формата загрузчика

IOBUFF=120110           ;Ячейка с адресом буфера ANDOS
DEVTEK=120155           ;Байт с номером тек. устройства
INIDRV=120204           ;Подпрограмма иниц. работы с диском
RWBUF1=120224           ;Подпрограмма чтения/записи в буфер

START:  .PRINT /Введите имя дисковода [A,B]: /
20$:    EMT 6           ;Прием символа с клавиатуры
        BIC #177640,R0  ;Приведение символа к ЛАТ ЗАГЛ
        CMP R0,#101     ;Введена буква "A"?
        BEQ 21$         ;Да
        CMP R0,#102     ;Введена буква "B"?
        BNE 20$         ;Если нет,  повторить ввод
21$:    EMT 16          ;Вывести введенную букву на экран
        SUB #100,R0     ;Получить в R0 номер дисковода

        MOVB R0,DEVTEK  ;Указать ANDOS номер дисковода
        CALL @INIDRV    ;Считать загрузчик, настроить драйвер
        BCC 22$         ;Диск ANDOS, продолжить обработку
        .PRINT /Диск не в формате ANDOS/
        BR START
22$:    CLR R0          ;Номер блока - 0
        MOV #256.,R1    ;256. слов - 1блок
        CALL @RWBUF1    ;Прочитать в буфер ANDOS 0 блок
4$:     MOV IOBUFF,R1   ;В R1 записывается адрес буфера ANDOS
        CMP @R1,#240    ;Загружаемый диск?
        BNE 1$
        .PRINT /Дискета, загружаемая на БК./
        MOV #753,(R1)+  ;Пересылка признаков диска IBM
        MOV #20220,(R1)
        BR 1QUE
1$:     .PRINT /Дискета, читаемая на БК и IBM./
        TST 100(R1)     ;Загрузчик есть?
        BNE 2$
        .PRINT /Нет загрузчика, преобразование невозможно/
        BR START
2$:     MOV (PC)+,(R1)+  NOP      ;Пересылка команды "NOP"
        MOV (PC)+,(R1)   BR .+74  ;Пересылка команды "BR BOOT"
1QUE:   CLR R0          ;Запись буфера в нулевой блок диска
        MOV #-256.,R1
        CALL @RWBUF1
        .PRINT /Загрузчик преобразован/
        .EXIT
        .END


     3.2. Подпрограмма чтения файла с текущего диска


BYTCLS=4000             ;Количество байт в кластере
EOF=7777                ;Признак конца цепочки в FAT
INIDRV=120204           ;Подпрограмма иниц. работы с диском
DIRFIN=120216           ;Подпрограмма поиска файла в каталоге
RWBLOK=120226           ;Подпрограмма чтения/записи
GETFAT=120234           ;Подпрограмма распаковки FAT

        CALL @INIDRV    ;Считать загрузчик, настроить драйвер
        BCC 1$
        .PRINT /Диск не в формате ANDOS/
        BR 1EXIT
1$:     MOV #NAME,R1
        CALL @DIRFIN    ;Поиск имени в каталоге
        BCC 2$
        .PRINT /Файл не найден/
        BR 1EXIT
2$:     MOV 26.(R2),R0  ;Номер первого кластера
        MOV 28.(R2),R1  ;Длина файла
        MOV 22.(R2),R2  ;Адрес файла

3$:     CALL RCLAST     ;Чтение кластера
        BCC 3$          ;Есть еще кластеры?
        BR 4$           ;Нет -> выход
1EXIT:  SEC             ;Выход по ошибке
4$:     RET

RCLAST: ;Подпрограмма чтения 1 кластера
        ;R0 - номер кластера
        ;R2 - адрес буфера
        ;R1 - длина

        ;после операции длина уменьшается на размер кластера,
        ;к адресу прибавляется длина кластера, а в R0 помеща-
        ;ется номер следующего кластера. Если устанавливается
        ;бит "C" - цепочка кластеров кончилась.

        MOV R0,-(SP)    ;Сохранение номера кластера
        INC R0          ;Преобраз. N кластера в номер блока
        ASL R0
        ASL R0
        MOV R1,-(SP)    ;Сохранение длины
        MOV #BYTCLS,R1  ;Длина читаемой области - 1 кластер
        CMP R1,(SP)     ;Остаток файла меньше кластера?
        BHIS 3$         ;Нет - читается кластер
        MOV (SP),R1     ;Да - читается остаток
3$:     ASR R1          ;Преобраз. байтовой длины в словную
        CALL @RWBLOK    ;Чтение кластера

        MOV (SP)+,R0    ;Восстановление номера кластера
        ADD #BYTCLS,R2  ;Увеличение адреса на длину кластера
        MOV (SP)+,R1    ;Восстановление длины
        SUB #BYTCLS,R1  ;Уменьшение длины на длину кластера
        BLT 4$          ;По длине файл прочитан целиком
        CALL @GETFAT    ;Извлечение из FAT ном. след. кластера
        CMP R0,#EOF     ;Конец файла по FAT?
        BNE 1$
4$:     SEC             ;Да, бит "C" установлен
        BR 2$
1$:     CLC             ;Нет, бит "C" очищен
2$:     RET             ;Выход

NAME:   .ASCII /ANDOS   SYS/

        .END


                3.3. Программа удаления файла

INIDRV=120204           ;Подпрограмма иниц. работы с диском
DIRFIN=120216           ;Подпрограмма поиска файла в каталоге
ERASE1=120210           ;Подпрограмма удаления файла

        CALL @INIDRV    ;Считать загрузчик, настроить драйвер
        BCC 1$
        .PRINT /Диск не в формате ANDOS/
        BR EXIT
1$:     MOV #NAME,R1
        CALL @DIRFIN    ;Поиск имени в каталоге
        BCC 2$
        .PRINT /Файл не найден/
        BR EXIT
2$:     CALL @ERASE1    ;Удаление файла
        .EXIT

NAME:   .ASCII /ANFORMAT   /    ;Имя удаляемого файла


Приложение 4

                Назначение ключей по умолчанию

┌─┬─────────────────────────────────┬─────────────────────────┐
│N│       Содержимое ключа          │     Назначение ключа    │
├─┼─────────────────────────────────┼─────────────────────────┤
│0│ M<12>RUNME.DOC<12>              │ Запуск описания         │
│1│ M<12>ANFORMAT<12>               │ Запуск ANFORMAT         │
│2│ S126500<12>                     │ Перезапуск оболочки     │
│3│ M<12>EDALT3M<12>                │ Запуск редактора EDALT3 │
│4│ M<12>CONTXT<12>                 │ Запуск конвертера CONTXT│
│5│                                 │                         │
│6│                                 │                         │
│7│                                 │                         │
│8│                                 │                         │
│9│ M<12>MASTER<12>                 │ Запуск инсталлятора     │
└─┴─────────────────────────────────┴─────────────────────────┘


                         4. Заключение

     Автор надеется, что информация приведенная в  этом  доку-
менте поможет Вам  создавать  программы,  работающие  в  среде
ANDOS и новые утилиты.
     Если Вы обнаружите какие-либо ошибки, неточности, или от-
сутствие какой-либо важной информации - обращайтесь  к  автору
по телефону: (095)180-3002, Алексей.
     Если Вы, пользуясь этим  документом,  создадите  что-либо
стоящее, фирма ANCO и Центр БК "Altec" готовы заключить автор-
ские договоры на распространение Ваших программных продуктов.

     Автор выражает благодарность Д.Романову, автору издатель-
ской  системы  VorteX!,  в которой создавался и форматировался
этот документ.
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""





(C) 27.11.92, 8.3.1993, 22.4.93, 28.8.93, 12.9.93  А.М.Надежин

