                 VI. Руководство программиста

          1. Дополнительные команды ЕМТ-перехватчику

     К перехватчику можно обращаться с рядом дополнительных ко-
дов команд в блоке параметров ЕМТ36 (для утилит). Это байты:

  2 - Запись файла;
  3 - Чтение файла;
  4 - Вывести каталог текущего диска;
200 - Удаление по запросу;
     202 - Запись файла с указанием адреса  для  каталога.  При
этом адрес в памяти помещается в ячейку по смещению 2 от начала
блока параметров, а адрес для помещения в каталог - по смещению
26 (ячейка адреса ответа блока параметров). Работает также и  с
магнитофоном;

204 - Показать каталог.

     Кроме того, можно устанавливать дополнительные биты в коде
команды, меняющие специфику выполнения данной команды:

10 - бит запрета остановки дисковода, для продолжения  дисковых
     операций, система перед операцией не инициализирует работу
     с дисководом (т.е. он должен быть ранее  инициализирован),
     и после окончания операции не останавливает  дисковод  (на
     раскрутку которого при каждой операции теряется  не  менее
     3-х секунд);
20 - бит "No RDDIR" перед операцией не читать каталог  с  диска
     (подразумевается, что он был ранее считан  и  находится  в
     буфере);
40 - бит "No SAVDIR" после окончания операции не записывать ка-
     талог (подразумевается, что файловые операции  будут  про-
     должаться и каталог будет записан в конце).

     При удачной загрузке файла, его номер блока на диске поме-
щается в ячейку @#314, а размер в блоках -  @#316.  При  записи
выполняются те же действия, но в @#316 помещается  размер  всей
бывшей свободной области. Если на диске нет места, то в @#314 -
номер первого свободного блока в конце диска, а в @#316 -  раз-
мер области. Это может быть полезным для организации произволь-
ного доступа к файлам.



                   2. Формат каталога MK-DOS

     Формат каталога представляет собой  тщательно  продуманный
каталог системы Micro DOS, ставший стандартным на БК, а  именно
формат нулевого блока дискеты:

Адрес:
 30 - Количество файлов в каталоге (НЕ ЗАПИСЕЙ!);
 32 - Суммарное количество  блоков в файлах (НЕ ЗАПИСЯХ!) ката-
      лога;
400 - Метка принадлежности к формату Micro DOS (123456);
402 - Метка формата каталога MK-DOS (51414);
466 - Размер диска в блоках, величина абсолютная для системы (в
      отличие от NORD, NORTON и т.п.) принимающая не два значе-
      ния под 40 или 80 дорожек, а, скажем, если  Ваш  дисковод
      понимает только 76 дорожек, то в этой ячейке  нужно  ука-
      зать соответствующее число блоков (это делается при  ини-
      циализации);
470 - Номер блока первого файла. Величина также изменяемая;
500 - Первая запись о файле.


                   3. Формат записи о файле
            
     Запись о файле имеет длину 30:

Смещение:

    0 - Статус файла;
    1 - Номер подкаталога (0 - корень);
    2 - Имя файла 14. символов ASCII KOI8;
   20 - Номер блока;
   22 - Длина в блоках;
   24 - Адрес;
   26 - Длина.


                        4. Статус файла

     Статус файла бывает:

  0 - обычный;
  1 - защищен;
  2 - логический диск;
200 - BAD-файл;
377 - удален.


     Если первый символ в имени файла имеет  код  177,  то  это
подкаталог. Тогда вместо статуса у  него  байтом  указан  номер
этого подкаталога, и все файлы (в  т.ч.  подкаталоги),  имеющие
эту цифру в ячейке номера подкаталога, лежат в этом  подкатало-
ге.


        5. Таблица ссылок, переменных и констант MK-DOS


     Операционная система MK-DOS имеет  неперемещаемую  таблицу
ссылок, переменных и констант, дающую неограниченные возможнос-
ти для написания утилит и других программ, используемых совмес-
тно с MK-DOS.

                Переменные, буфера и константы


┌────────┬────────┬───────────────────────────────┬───────────┐
│  ИМЯ   │ АДРЕС  │ НАЗНАЧЕНИЕ                    │ ЗНАЧЕНИЕ  │
│ МЕТКИ  │        │                               │           │
├────────┼────────┼───────────────────────────────┼───────────┤
│ VERS   │ 120004 │Версия Системы 3.15            │100000+315.│
│ BLK    │ 120006 │Адрес блока параметров диска   │  136712   │
│ SUBTEK │ 120010 │Номер подкаталога на тек. диске│     0     │
│ SUBOLD │ 120011 │Подкаталог в другой панели     │     0     │
│ DEVTEK │ 120012 │Номер текущего устройства      │     0     │
│ SUBDIR │ 120013 │Подкаталог для CREATE, временн.│     0     │
│ DIR    │ 120014 │Адрес буфера чтения каталога   │  126000   │
│ TSTEP  │ 120070 │Задержка шага головки дисковода│   2000    │
│ PANEL  │ 120072 │Байты устройств в панелях "MC" │ 400 (0,1) │
│ SCREEN │ 120074 │Ячейка перехвата вывода сообще-│     0     │
│        │        │ний системы, адрес подпрограммы│           │
│        │        │обращения вместо EMT16. Для за-│           │
│        │        │прета вывода - адрес ближайшей │           │
│        │        │команды RTS PC                 │           │
│ STEK   │ 120076 │Адрес стека перехватчика ЕМТ36 │  136712   │
│ USER   │ 120100 │Значение 1  Адреса  и  значения│     0     │
│        │ 120102 │Адрес 1     трех ячеек, восста-│     0     │
│        │ 120104 │Значение 2  навливаемых  систе-│     0     │
│        │ 120106 │Адрес 2     мой после  ЕМТ14  и│     0     │
│        │ 120110 │Значение 3  перезапуска        │     0     │
│        │ 120112 │Адрес 3                        │     0     │
│ USER2  │ 120114 │Адрес подпрограммы перед запу- │     0     │
│        │        │ском "MC" или 0                │           │
│ NONDOS │ 120116 │Адрес подпрограммы имитации    │     0     │
│        │        │ЕМТ36 для не DOS дисков, или 0 │           │
│        │        │(вывод сообщения Non DOS Disk) │           │
│ OVERWR │ 120124 │Признак AutoOwerwrite, 1-выкл. │     1     │
│ PRED   │ 120125 │Признак Predelete, 1-выкл.     │     0     │
│ FLOP   │ 120126 │Дисковод:  0 - 40, 1 - 80 track│     1     │
│ PALET  │ 120127 │Палитра БК11(М),оцветнение БК10│     0     │
│ SY     │ 120130 │Диск загрузки системы (@:)     │     -     │
│ DK     │ 120131 │Привод для оверлеев (!:)       │     -     │
│ SORTIR │ 120132 │Режимы сортировки на панелях MC│           │
│ LD0    │ 120134 │Смещение к логическому диску   │           │
│        │        │(в блоках), 0 - корень         │           │
│ LD1    │ 120136 │то же, но для текущей операции │           │
│ LD2    │ 120140 │Смещение для другой панели MC  │           │
│ NAM    │    306 │Адрес блока параметров EMT36   │     -     │
│ BLOK   │    314 │Номер блока загруженного файла │     -     │
│ SIZE   │    316 │Кол-во блоков в файле          │     -     │
└────────┴────────┴───────────────────────────────┴───────────┘

           6. Подпрограммы MK-DOS и обращения к ним

                   6.1. Подпрограммы MK-DOS

┌────────┬────────┬───────────────────────────────────────────┐
│ МЕТКА  │ АДРЕС  │ НАЗНАЧЕНИЕ                                │
├────────┼────────┼───────────────────────────────────────────┤
│ INIDRV │ 120016 │ Инициализация драйвера дисковода          │
│ EMT6   │ 120020 │ Команда EMT6 с автоповтором (исп. Rename) │
│ INOUT  │ 120022 │ Чтение/запись блока (160004 исп.буфер ДОС)│
│ RDDIR  │ 120024 │ Чтение каталога в буфер (@#DIR)           │
│ DIRFIN │ 120026 │ Поиск файла в каталоге                    │
│ DIRPRI │ 120030 │ Вывод каталога на экран                   │
│ FRFIN  │ 120032 │ Поиск свободного места в каталоге         │
│ CREAT  │ 120034 │ Создание записи о файле в каталоге        │
│ DELETE │ 120036 │ Удаление файла (с запросом или без него)  │
│ SAVDIR │ 120042 │ Запись каталога                           │
│ EMT20  │ 120044 │ Полная имитация EMT20 с исп. ячейки SCREEN│
│ PRINAM │ 120046 │ Вывод имени с без пробелов в конце        │
│ TXT    │ 120050 │ Перемещаемый вывод надписей               │
│ STROKA │ 120052 │ Редактор строки (исп. Rename)             │
│ OCTOUT │ 120056 │ Вывод восьмиричного числа                 │
│ DECOUT │ 120060 │ Вывод десятичного числа                   │
│ TST    │ 120062 │ Замена управляющих кодов в R0 на пробелы  │
│ TST2   │ 120064 │ Привести R0 к ЛАТ,ЗАГЛ регистру(корректно)│
│ ERROR  │ 120066 │ Расшифровка текстом No ошибки дисковода   │
│ FRFIN2 │ 120120 │ Поиск свободного места по длине в блоках  │
│ CREAT2 │ 120122 │ Создание записи о файле по длине в блоках │
└────────┴────────┴───────────────────────────────────────────┘

     Система имеет точку входа имитации EMT36, для совместимос-
ти с ANDOS выбран адрес 120002. Для обеспечения работы с диском
программ, использующих 30-й вектор для своих  нужд,  достаточно
вместо команды "EMT36"  использовать  "CALL  @#120002".  Ячейка
VERS предназначена для распознавания утилитами  версии  MK-DOS,
т.к. при неизменении адресов подпрограмм указанных в этом  опи-
сании, их список в последующих версиях будет  расширен,  и  для
обеспечения неработоспособности утилит, пользующихся возможнос-
тями ДОС, отсутствующими в предыдущих версиях.

     ВНИМАНИЮ ПРОГРАММИСТОВ, пишущих под MK-DOS. Ячейку  версии
следует проверять на "больше или  равно"  если  вы  пользуетесь
только стандартными запросами ДОС, и проверять "строго равно" -
если программа пользуется обращениями в тело MK-DOS, т.к. адре-
са не входящие в таблицу подпрограмм и переменных  в  следующих
версиях, а также при модификациях, могут изменяться.


             6.2. Обращение к подпрограммам MK-DOS

     INIDRV - инициализация блока параметров драйвера дисковода

Вызов: CALL @INIDRV
Выход: R3 - адрес блока параметров

Действия: Инициализация блока параметров пр аргументу R3, зане-
          сение длины сектора в словах (400) по 64(R3) и задер-
          жки перехода между дорожками из ячейки TSTEP.


     EMT6 - Полный аналог EMT6, реализованный с автоповтором

Вызов: CALL @EMT6


     INOUT - Чтение/запись блока

Вызов: CALL @INOUT
Вход:  R0 - номер блока
       R2 - адрес в памяти
       R1 - длина в СЛОВАХ
ВЫХОД: бит C при ошибке, в ячейке 52 код ошибки

Действия: Производится чтение с диска массива и  помещение  его
          по указанному адресу, если длина  в  команде  отрица-
          тельна - запись.
               В случае ДИСКОВОЙ ОШИБКИ делается ШАГ ВПЕРЕД/ШАГ
          НАЗАД головкой дисковода и ПОВТОР операции, что  поз-
          воляет исключить прерывание  работы  из-за  случайных
          ошибок.


     RDDIR - Чтение каталога диска в буфер MK-DOS (@DIR)

Вызов: CALL @RDDIR
Вход:  должен быть инициализирован блок параметров  подпрограм-
       мой INIDRV, входных регистров нет.
Выход: бит C при ошибке, адрес каталога в R3 (@#DIR).

Действия: Считывается каталог по адресу содержащемуся в  ячейке
          DIR, в  случае  безошибочного  считывания  происходит
          проверка размера диска (ячейка 466 нулевого блока)  и
          включение в случае необходимости режима пропуска  до-
          рожек.


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

Вызов: CALL @DIRFIN
Вход:  R3 - адрес буфера каталога
       @#NAM - адрес блока параметров EMT36
Выход: R3 - адрес записи о файле, или бит C если файл не найден

Действия: Поисходит поиск в каталоге файла, имя которого указа-
          но в блоке параметров EMT36,  управляющие  символы  в
          имени приравниваются к пробелу.


     DIRPRI - Вывод на экран каталога

Вызов: CALL @DIRPRI
Вход:  R3 - адрес буфера каталога

Действия: На экран выдается каталог диска, во время вывода воз-
          можна сортировка, нажатием  клавиши  -  первой  буквы
          имени, вывод можно  приостановить  нажав  пробел.  R3
          сохраняет свое значение.


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

Вызов: CALL @FRFIN
Вход:  R3    - адрес буфера каталога
       @#NAM - адрес блока параметров EMT36
Выход: R3 - адрес свободной записи
       бит C        - нет места на диске
       бит C и R3=0 - нет места в каталоге

Действия: Поисходит поиск в каталоге свободного места по разме-
          ру файла, имя которого  указано  в  блоке  параметров
          EMT36.


     FRFIN2 - Поиск свободного места для "длинного файла"

     Команда полностью аналогична FRFIN, но на вход в R1  нужно
подавать длину файла в блоках. Если R1=-1,  то  ищется  "дырка"
наибольшего размера. При выходе из п/п: R1-длина свободной  об-
ласти в блоках, R0-номер первого свободного блока.


     CREAT - Создание записи о файле

Вызов: CALL @CREAT
Вход:  R3    - адрес записи
       R4    - адрес буфера каталога
       @#NAM - адрес блока параметров EMT36

Действия: Производится создание записи о файле в указанном мес-
          те каталога, все управляющие символы в имени  прирав-
          ниваются к пробелу. Если "дырка" больше файла  проис-
          ходит раздвижка каталога и создание за файлом "дырки"
          меньшего размера. Исправляются ячейки 30 и  32  шапки
          директория.


     CREAT2 - Создание записи о "длинном" файле

     Команда полностью аналогична CREAT, но на вход в R1  нужно
подавать длину файла в блоках.


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

Вызов: CALL @DELETE
Вход:  R3    - адрес записи о файле
       бит C - удалять без подтверждения
Выход: бит C - файл защищен

Действия: Выдается запрос  на  удаление,  или  сообщение  "File
          protected!". При удалении  без  запроса  защищенность
          файла не анализируется. Удаляется запись о файле, ис-
          правляются ячейки 30 и 32 шапки директория, в  случае
          необходимости образовавшееся свобоное место  оъединя-
          ется с соседними "дырками" в одну общей длины.


     SAVDIR - Запись каталога на диск

Вызов: CALL @SAVDIR

     Работа с функцией полностью аналогична работе  с  подпрог-
раммой RDDIR.


     EMT20 - Аналог системного запроса EMT20

Вызов: CALL  @EMT20

     Работа с функцией полностью аналогична одноименному запро-
су EMT - диспетчера, но  текст  выводится  с  учетом  состояния
ячейки SCREEN.


     PRINAM - Вывод имени файла

Вызов: CALL @PRINAM
Вход:  R3 - адрес записи о файле в каталоге
Выход: R3 сохраняет свое значение

Действие: На экран выводится имя файла заявленное в команде,  с
          игнорированием конечных пробелов (выводится один про-
          бел). Используется при формировании  сообщений  типа:
          "?MKDOS - MONITOR Deleted?".


     TXT - Перемещаемый вывод надписей

Вызов: JSR    R1,@TXT
       .ASCIZ /СООБЩЕНИЕ/
       .EVEN

     Функция облегчает процедуру  вывода  сообщений  программам
пользователя.


     STROKA - Редактор строки

Вызов: CALL @STROKA
Вход:  R3 - адрес строки
       R2 - длина строки

Действие: Указанная строка символов вызывается на  редактирова-
          ние клавишей стрелка вправо можно возвращать по  сим-
          волам (с автоповтором) предидущее значение строки, по
          нажатию клавиши ВВОД "хвост" забивается пробелами.


     OCTOUT - Вывод восьмиричного числа

Вызов: CALL @OCTOUT
Вход:  R2 - число для вывода

Действие: Выводится пробел, затем число  в  восьмиричном  пред-
          ставлении с лидирующими нулями.

      DECOUT - Вывод десятичного числа

Вызов: CALL @DECOUT
Вход:  R0 - число для вывода

Действие: Выводится пробел, затем заявленное в команде число  в
          десятичном представлении без лидирующих нулей.

     TST - Замена пробелом управляющих кодов

Вызов: CALL @TST
Вход:  R0 - код символа
Выход: R0 - код сивола или пробел

     TST2 - Приведение к ЛАТ,ЗАГЛ регистру

Вызов: CALL @TST2
Вход:  R0 - код символа
Выход: R0 - код символа на ЛАТ,ЗАГЛ регистре

     ERROR - расшифровка номера ошибки дисковода

Вызов: CALL @ERROR
Вход:  @#NAM - адрес блока параметров EMT36
       @#52  - байт кода ошибки

Действие: В байт ответа блока параметров EMT36  помещается  код
          ошибки "4", далее анализируется байт  содержащийся  в
          ячейке @#52, при нулевом его значении происходит  вы-
          ход из подпрограммы, при всех остальных же  выводится
          на экран текстовая спецификация ошибки.

