# БК-0011М - Руководство системного программиста

Набил 13.08.1992 В. Усович. Подготовил к печати и перевёл из RT-11 в MKDOS 31.07.1993 Чурин Д.М. (Asfalt software).

УТВЕРЖДЕН
00015-01.32.01-ЛУ

ПЕРСОНАЛЬНАЯ ЭВМ 'ЭЛЕКТРОНИКА МС 0513'
('ЭЛЕКТРОНИКА БК-0011М')
ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ
БАЗОВАЯ ОПЕРАЦИОННАЯ СИСТЕМА
РУКОВОДСТВО СИСТЕМНОГО ПРОГРАММИСТА
00015 - 01.32.01
1 9 9 0

# Аннотация

Настоящее руководство рассчитано на пользователей микроЭВМ "Электроника МС 0513" ("Электроника БК-0011М", далее ЭВМ), программирующих на уровне языка Ассемблера.

В руководстве описаны состав и функции базовой операционной системы ЭВМ (далее БОС) и способы обращения к ним из пользовательских программ.

Описаны также команды монитора БОС, позволяющие пользователю работать с ЭВМ в интерактивном режиме, вводить, отлаживать в кодах и запускать программы, считывать и записывать программы на магнитную ленту и т.д.

# 1. Краткое описание микроЭВМ БК-0011

## 1.1. Архитектура ЭВМ

ЭВМ построена на основе микропроцессорного комплекта серии К1801 и включает в себя:

- однокристальный 16-разрядный микропроцессор К1801ВМ1;
- оперативное запоминающее устройство (ОЗУ) ёмкостью 128К байт со страничной организацией, выполненное на микросхемах К565РУ5;
- системное ПЗУ ёмкостью 16К байт;
- контроллер клавиатуры на базе БИС К1801ВП1-014;
- контроллер ОЗУ и телевизионного графического дисплея на базе БИС К1801ВП1-037;
- контроллер накопителя на бытовом кассетном магнитофоне;
- 16-разрядный параллельный программируемый интерфейс.

Отдельные функциональные узлы ЭВМ соединены с помощью межмодульного параллельного интерфейса МПИ ОСТ 11.305.903-80.

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

### 1.1.1. Распределение адресного пространства ЭВМ

Виртуальное адресное пространство ЭВМ определяется возможностями процессора К1801ВМ1 и составляет 64К байт. Распределение адресного пространства показано на рис.1.

|  | Переключаемые страницы ОЗУ и ПЗУ |  |  |
|  |  | / | \ |  |  |  |  |
Стр. ОЗУ 0 | . . . . . | . . . . . | СИСТ. ПЗУ | РЕГИСТРЫ ВУ
0 | 40000 | 100000 | 140000 | 160000 | 177777
|  | Стр. ОЗУ 0...7 | Стр. ОЗУ 0...7 | ПЗУ контроллера НГМД |
|  |  |  | или | или |  |
|  |  |  | ПЗУ | ПЗУ блока МСТД |
|  |  |  | или |  |  |  |
|  |  |  | Сменный блок ПЗУ |  |  |  |

Рис.1.

Переключение страниц ОЗУ/ПЗУ осуществляется программно с использованием системного регистра ЭВМ.

Следует обратить внимание, что каждая страница ОЗУ может быть одновременно подключена к двум окнам виртуального адресного пространства, а статическая страница (адреса 0 - 40000) - даже к 3-м. Переключение страниц из пользовательской программы может осуществляться только с помощью запросов базовой операционной системы.

Две страницы ОЗУ являются буферами экрана графического дисплея. Один из буферов постоянно отображается на экране телевизионного приёмника. Управление отображением того или иного буфера экрана также возложено на базовую операционную систему, причём имеется возможность "скрытого" вывода на экран, т.е. формирование изображения из программы пользователя в одном буфере в то время,как на экран выводится другой.

Одна из страниц ОЗУ является служебной страницей базовой операционной системы ЭВМ и недоступна пользователям. Однако часть ее, не используемая базовой операционной системой, доступна для чтения-записи с помощью запросов драйвера ОЗУ/ПЗУ.

## 1.2. Регистры внешних устройств ЭВМ

Работа ЭВМ с периферийными (внешними) устройствами выполняется через регистры внешних устройств, для которых выделен диапазон 170000 - 177777 адресного пространства. Ниже описаны регистры стандартных периферийных устройств.

### 1.2.1. Регистр состояния клавиатуры

Адрес регистра - 177660

Формат регистра:

Разряд 7

  - "1" в этом разряде означает, что в регистре данных клавиатуры находится код нажатой клавиши. Устанавливается при нажатии на клавишу, сбрасывается при чтении регистра данных клавиатуры. При нулевом состоянии 6-го разряда установка в "1" вызывает прерывание. Доступен только по чтению.

Разряд 6

  - "0" в этом разряде разрешает выработку сигнала требования прерывания по единичному значению разряда 7.

Остальные разряды регистра не используются, читаются как 0. По сигналу сброса магистрали разряд 6 устанавливается в "1", разряд 7 обнуляется.

ПРИМЕЧАНИЕ. См.также информацию о бите 6 системного регистра ЭВМ.

### 1.2.2. Регистр данных клавиатуры

Адрес регистра - 177662

Формат регистра:

Разряды 0 - 6 содержат код нажатой клавиши. Разряды 7 - 15 не используются, читаются нулями.

Регистр доступен только по чтению. Данные сохраняются в регистре до нажатия следующей клавиши клавиатуры. При установленном в "1" 7-м разряде регистра состояния запись в регистр данных блокируется и нажатия клавиш игнорируются.

### 1.2.3. Регистр управления палитрами

Адрес регистра - 177662

Формат регистра:

Регистр доступен только по записи.

Разряд 15

  - управляет отображением буферов экрана. При значении 0 отображается буфер 0 (страница 5), при 1 - буфер 1 (страница 6).

Разряд 14

  - управляет включением системного таймера. При значении 0 таймер выключен, при 1 - включен.

Разряды 11 - 8

  - в эти разряды записывается код палитры, которая задаёт кодировку цветов на экране в режиме 256 точек/строка.

Текущее состояние регистра можно определить с помощью запросов БОС.

### 1.2.4. Регистр смещения

Регистр смещения предназначен для управления "рулонным" сдвигом информации на экране по вертикали путём задания адреса в буфере экрана, с которого должна начинаться регенерация изображения.

Адрес регистра - 177664

Формат регистра:

Разряд 9

  - при записи "1" в этот разряд на экране отображается весь буфер экрана (256 телевизионных строк). При нулевом значении в верхней части растра отображается 1/4 часть (старшие адреса) экранного ОЗУ, нижняя часть экрана не отображается. Данный режим не используется базовой операционной системой.

Разряды 7 - 0

  - в этом поле задаётся адрес строки экранного ОЗУ, с которой начинается отображение экрана.

ОЗУ буфера экрана считается "замкнутым в кольцо". Экран состоит из 256 строк по 64 байта в каждой. Строки начинаются с адресов, кратных 100 (восьмеричное). Первый байт строки расположен в левом конце строки, байты отображаются, начиная с младшего бита. Смещение задаётся в строках, т.е. изменение кода смещения на 1 приводит к кольцевому сдвигу информации на экране на одну строку растра. Исходному состоянию (первый байт буфера экрана отображается в самой верхней строке растра) соответствует значение смещения 330 восьмеричное. Увеличение значения соответствует сдвигу информации вверх, уменьшение - вниз.

Остальные разряды не используются. Регистр доступен по записи и чтению.

### 1.2.5. Регистр параллельного программируемого интерфейса

Этот 16-разрядный регистр предназначен для записи информации в выходной порт и чтения информации с входного порта.

Адрес регистра - 177714

Возможность прочитать состояние выходного порта отсутствует. Фактически в ЭВМ реализованы два независимых регистра,имеющие один и тот же адрес:

- доступный только по записи регистр выходного порта;
- доступный только по чтению регистр входного порта.

### 1.2.6. Системный регистр

Используется при начальном запуске процессора, для переключения страниц ОЗУ/ПЗУ, управления внешними устройствами ЭВМ.

Адрес регистра - 177716

Фактически по указанному адресу расположены три регистра:

1. регистр, доступный только по чтению;
2. два регистра, доступных только по записи (регистр управления памятью и регистр управления магнитофоном).

#### 1.2.6.1. Регистр чтения

Формат регистра:

Разряды 15 - 8

  - определяют адрес начального пуска ЭВМ по включению питания (140000);

Разряд 7

  - должен быть равен "1";

Разряд 6

  - установлен в "0", если нажата любая клавиша клавиатуры ЭВМ. Устанавливается в "1" по отпускании клавиши;

Разряд 5

  - разряд данных контроллера магнитофона;

Разряд 2

  - этот разряд устанавливается в "1" по любой операции записи в системный регистр. Сбрасывается в "0" по окончанию операции чтения системного регистра. Об использовании этого разряда см. в разделе, посвящённом особенностям выполнения некоторых команд ЭВМ.

Остальные разряды не используются и читаются нулями.

#### 1.2.6.2. Регистр управления памятью

Формат регистра:

Разряды 14 - 12

  - определяют номер страницы ОЗУ, подключаемой на адреса 40000 - 100000 (см. ниже).

Разряд 11

  - должен содержать 1.

Разряды 10 - 8

  - определяют номер страницы ОЗУ, подключаемой на адреса 100000 - 140000.

Разряд 4

  - разрешает подключение к адресному пространству 100000 - 140000 страницы ПЗУ номер 3, отключает страницу ОЗУ с соответствующих адресов.

Разряд 3

  - разрешает подключение к адресному пространству 100000 - 140000 страницы ПЗУ номер 2, отключает страницу ОЗУ.

Разряд 1

  - разрешает подключение к адресному пространству 100000 - 140000 страницы ПЗУ номер 1, отключает страницу ОЗУ.

Разряд 0

  - разрешает подключение к адресному пространству 100000 - 140000 страницы ПЗУ номер 0, отключает страницу ОЗУ.

Кодировка переключаемых страниц ОЗУ:

Бит | 14 | 13 | 12 |
--- | --- | --- | --- | ---
| (10 | 9 | 8) |
| 1 | 1 | 0 | страница 0 (постоянно отображена 0...40000)
| 0 | 0 | 0 | страница 1
| 0 | 1 | 0 | страница 2
| 0 | 1 | 1 | страница 3
| 1 | 0 | 0 | страница 4
| 0 | 0 | 1 | страница 5 (буфер экрана 0)
| 1 | 1 | 1 | страница 6 (буфер экрана 1)
| 1 | 0 | 1 | страница 7 (системная страница)

ПРИМЕЧАНИЕ. Запись в регистр возможна только при установленном 11-м бите, только по командам, работающим с регистром, как с целым словом.

Страницы 0, 1 и 2 ПЗУ зарезервированы:

  страница 0 и адресное пространство 100000 - 117777 страницы 1 предназначены для ПЗУ языка программирования BASIC. В адресах 120000 - 137777 страницы 1 расположены программы БОС. Адреса 100000 - 117777 страницы 2 предназначены для ПЗУ драйвера локальной сети. Страница 3 ПЗУ предназначена для подключения внешних блоков ПЗУ к магистрали ЭВМ.

#### 1.2.6.3. Регистр управления магнитофоном

Формат регистра:

Регистр доступен только по записи при значении разряда 11 равном "0".

## 1.3. Особенности выполнения команд

Система команд микроЭВМ соответствует системе команд ЭВМ "ЭЛЕКТРОНИКА - 60" и определяется применяемым процессором 1801ВМ1.

Однако в связи с рядом особенностей архитектуры существуют некоторые отличия от ЭВМ семейств СМ ЭВМ, ЭЛЕКТРОНИКА-60, ЭЛЕКТРОНИКА-85 и ДВК.

Команда HALT (код 000000) вызывает прерывание выполнения программы и переход по вектору прерывания 4, причём при этом устанавливается бит - признак записи в системный регистр. БОС различает обычное прерывание по 4 вектору и останов. Программа пользователя имеет возможность перехватить только обычное прерывание по 4 вектору. При останове произойдёт переход в монитор БОС с выводом на экран содержимого счётчика команд ЭВМ. Следует заметить, что правильная обработка клавиши "стоп" возможна только при корректном значении указателя стека. Кроме этого, из-за особенностей аппаратуры может выдаваться неправильное значение счётчика команд. В некоторых случаях (нажатие "стоп" во время выполнения запроса БОС) невозможно продолжение программы по команде "P". Исходя из сказанного, клавишей "стоп" следует пользоваться очень осторожно.

## 1.4. Вектора прерываний и зарезервированные ячейки БОС

Обработка прерываний в ЭВМ производится по векторам, размещённым в области 0 - 376. Некоторые ячейки этой области используются БОС для внутренних целей.

4, 6

  - вектор прерывания по ошибке обращения к каналу, команде HALT и клавише "стоп";

10, 12

  - вектор прерывания по несуществующей команде (в БОС не используется);

14, 16

  - вектор прерывания по команде BPT и Т-БИТУ (используется при нажатии клавиши "ШАГ");

20, 22

  - вектор прерывания по команде IOT (не используется);

24, 26

  - вектор прерывания по аварии питания (не используется);

30, 32

  - вектор прерывания по команде EMT;

34, 36

  - вектор прерывания по команде TRAP (не используется);

40

  - адрес пуска по команде монитора "G" (используется при операциях с магнитофоном);

52 (младший байт)

  код возврата системных вызовов;

60, 62

  - вектор прерывания клавиатуры (алфавитно-цифровые и управляющие коды);

100, 102

  - вектор прерывания таймера;

110, 112

  - программный вектор клавиатуры (адрес пользовательской программы завершения);

114

  - копия по записи системного регистра (управление памятью);

116

  - копия по записи системного регистра (управление магнитофоном);

150-156, 164, 250, 252

  - используются для внутренних нужд БОС;

166

  - используется в качестве псевдовектора EMT для перехвата пользовательской программой команд EMT, не обработанных БОС;

270, 272

  - вектор прерывания параллельного порта;

274, 276

  - вектор прерывания клавиатуры (регистр АР2 и функциональные клавиши).

# 2. Функции базовой операционной системы

БОС состоит из следующих программ:

1. программа начального пуска;
2. клавиатурный монитор;
3. таблица системных вызовов;
4. обработчик команд EMT;
5. драйвер ОЗУ/ПЗУ;
6. драйвер клавиатуры;
7. драйвер экрана;
8. драйвер кассетного магнитофона;
9. драйвер принтера;
10. драйвер накопителя на ГМД.

## 2.1 Программа начального пуска

Программа начального пуска предназначена для инициализации БОС при включении ЭВМ, определения конфигурации ЭВМ и запуска других программ.

При включении ЭВМ программа определяет наличие дополнительных блоков ПЗУ, устанавливая соответствующие флаги. Если в момент пуска нажата и удерживается какая-либо клавиша на клавиатуре, программа начального пуска передаёт управление клавиатурному монитору. Если ни одна клавиша не нажата,производятся следующие действия: если к ЭВМ подключён контроллер НГМД, программа начального пуска вызывает дисковый загрузчик,расположенный в контроллере НГМД по адресу 160000. Дисковый загрузчик поочерёдно пытается загрузить операционную систему (ОС) с 0, 1 привода. Если все попытки оказались неудачными (в дисковод не вставлена дискета с ОС, дискета запорчена и т.д.), загрузчик возвращает управление программе начального пуска. Затем программа поочерёдно пытается запустить блоки ПЗУ, начиная с блока с наибольшим номером. Первое слово программы в ПЗУ должно быть командой NOP (код 240). Вызов ПЗУ производится командой JSR PC, поэтому программа в ПЗУ может вернуть управление программе начального пуска командой RTS PC для продолжения загрузки. Если программ в ПЗУ нет или они вернули управление, производится переход в клавиатурный монитор.

## 2.2 Клавиатурный монитор

Клавиатурный монитор является программой,работающей в диалоге с пользователем ЭВМ, и позволяет ему загружать программы с магнитной ленты, запускать программы на выполнение, просматривать и корректировать содержимое ячеек ОЗУ, регистров процессора и внешних устройств, записывать участки ОЗУ на магнитную ленту, загружать операционную систему с диска и т.д.

Все эти функции выполняются пользователем при помощи команд монитора.

Язык команд монитора максимально приближен ко входному языку режима пультового терминала ЭВМ "ЭЛЕКТРОНИКА-60" и "ДВК".

### 2.2.1. Команды монитора

Признаком готовности монитора к приёму очередной команды оператора является символ "@" в первой позиции строки экрана. Числа вводятся в восьмеричной системе счисления. Набирать незначащие нули необязательно.

XXXXXX/

  - открыть ячейку с восьмеричным адресом XXXXXX.

По этой команде на экран выводится восьмеричное содержимое ячейки ОЗУ, ПЗУ или регистра внешнего устройства с адресом XXXXXX. Если такой регистр отсутствует или страница ОЗУ не подключена к заданному адресу, выводится сообщение об ошибке - символ "?" и команда игнорируется.

XXXXXX\

  - открыть байт с адресом XXXXXX.

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

RX/

  - открыть регистр X, где X = 0...7 или "S". Открывает регистр общего назначения процессора (R0 - R7) или регистр состояния процессора (RS).

Команды "/" и "\" без аргумента открывают "текущую", то есть последнюю открывавшуюся ячейку.

"ВВОД" ()

  - закрыть слово, байт или регистр. Если пользователем было введено новое содержимое, оно будет записано.

""

  - закрыть слово, байт или регистр (если надо, модифицировать содержимое как по команде "ВВОД") и открыть следующее слово, байт или регистр (при этом печатается адрес открываемой ячейки). После ячейки с адресом 177777 открывается ячейка 000000, после R7 - R0, после RS - команда работает, как команда "ВВОД".

""

  - закрыть (с модификацией) и открыть предыдущее слово, байт, регистр.

""

  - закрыть (с модификацией) ячейку, вычислить адрес по формуле:

  АДРЕС = < АДРЕС ТЕКУЩЕЙ ЯЧЕЙКИ > + её новое содержимое + 2

  и открыть (как слово) ячейку с соответствующим адресом. Эта команда используется для открытия аргумента команды ЭВМ, использующей метод адресации "67".

""

  - закрыть (с модификацией) ячейку, вычислить адрес по формуле:

  АДРЕС = < АДРЕС ЯЧЕЙКИ > + < СОДЕРЖИМОЕ МЛАДШЕГО БАЙТА > * 2 + 2

  и открыть (как слово) ячейку с соответствующим адресом.

Содержимое байта рассматривается как число со знаком. Команда используется для открытия ячейки, на которую выполняется переход по команде типа "BR".

"@"

  - закрыть (с модификацией) ячейку, открыть ячейку по адресу, равному (новому) содержимому закрытой ячейки.

N;MC

  -отобразить страницу номер "N" с адреса, задаваемого аргументом "M". Страницы с восьмеричными номерами 10, 11, 12, 13 относятся к страницам ПЗУ 0, 1, 2, и 3 соответственно. Значение "M", равное нулю, означает адреса 40000-100000, равное "1" - адреса 100000-140000.

XXXB

  - загрузить операционную систему с НГМД номер XXX и запустить ее. Если номер не задан, производится загрузка с автоматическим поиском системного диска.

XXXXXXL

  - загрузить с адреса XXXXXX двоичный файл с магнитной ленты. Если адрес не задан, загрузка осуществляется с адреса, заданного в заголовке файла.

Базовая операционная система поддерживает формат записи на магнитной ленте, совместимый с ЭВМ БК - 0010.

После выдачи этой команды на экран выдаётся вопрос "имя файла?". Оператор должен ввести имя файла на магнитной ленте длиной до 16 символов.

Если необходимо просмотреть каталог ленты,необходимо ввести "?" вместо имени файла. Если нажать клавишу "ВВОД" без ввода имени, будет загружен первый встретившийся файл.

<ОБЛАСТЬ>;U

  - вывести в файл информацию из ОЗУ. <ОБЛАСТЬ> - конструкция вида "XXXXXX-YYYYYY", где XXXXXX и YYYYYY - начальный и конечный (включительно) адреса записываемой области ОЗУ, или вида "XXXXXX+YYYYYY", где XXXXXX - начальный адрес записываемой области ОЗУ, а YYYYYY - длина в байтах. После выдачи команды задаётся вопрос "имя?", на который оператор должен ввести имя файла, который он хочет записать на ленту.

XXXXXXM

  - включить/выключить двигатель магнитофона (используется при перемотке). Если XXXXXX не равно 0, двигатель включается, иначе выключается. Отсутствие аргумента соответствует нулевому.

XXXXXXG

  - запустить программу с адреса XXXXXX. При отсутствии аргумента запуск производится со стартового адреса программы, который должен содержаться в ячейке USERPC (адрес 000040).

P

  - продолжить выполнение программы с адреса, на котором оно было прервано командой "HALT" или клавишей "стоп".

"ШАГ"

  - выполнить одну команду программы и вернуться в монитор.

"" (забой)

  - аннулировать последнюю введённую цифру. Другие символы не аннулируются. Команда не выполняется, если вводимое число = 0.

"СУ/E"

  - переход в непосредственный режим. Используется для настройки драйвера экрана. В драйвер экрана передаётся символ ESC (код 33), после чего монитор все вводимые символы передаёт драйверу экрана. Монитор остаётся в непосредственном режиме до ввода комбинации "СУ/@". ESC - последовательности, воспринимаемые драйвером экрана, см. в приложении 2.

Пример:

- СУ/E 0 СУ/@ - установка цветного режима.
- СУ/E ; 2 1 СУ/@ - установка цвета фона 2 и цвета символов 1.

## 2.3. Таблица системных вызовов

Таблица системных вызовов располагается в ПЗУ, начиная с адреса 140010 и является массивом адресов программ - обработчиков системных вызовов. Вызов функции БОС производится командой:

          JSR PC , @ADDR

где ADDR - адрес одного из слов таблицы, например

          JSR PC , @140010

Для передачи параметров используется R0 процессора, а в некоторых случаях и R1. При возврате из БОС содержимое регистров процессора сохраняется, за исключением особо оговорённых случаев.Содержимое таблицы рассматривается ниже.

## 2.4. Диспетчер EMT

Диспетчер EMT позволяет наряду со способом вызова по JSR использовать команды EMT. Способ передачи параметров совпадает с вызовами JSR.При обработке команды EMT с номером, превышающим допустимый, диспетчер проверяет содержимое ячейки 166. Если оно не равно нулю, управление передаётся по адресу, находящемуся в этой ячейке. Регистр PS процессора устанавливается в соответствии с содержимым 32 ячейки. Возврат из пользовательского обработчика производится непосредственно в вызвавшую программу командой RTI.

Достоинства использования EMT:

- позиционная независимость;
- меньший объем кода;

Недостатки:

- пользовательская программа не может использовать EMT с младшими номерами для своих нужд;
- вызовы по EMT выполняются медленнее;
- при некоторых условиях, возникающих при выполнении EMT и вызывающих переход в монитор (клавиша "СТОП", неверный вызов .BJMP и .BJSR), выводится адрес, принадлежащий не программе, а диспетчеру EMT.

## 2.5. Драйвер ОЗУ/ПЗУ

Драйвер ОЗУ/ПЗУ позволяет подключать по запросу пользовательской программы заданные страницы ОЗУ/ПЗУ, определять состояние памяти и страниц, читать и записывать слова, байты и массивы слов в скрытые страницы, обращаться к подпрограммам, находящимся в скрытых страницах, а также обеспечивает защиту системной страницы.

## 2.6. Драйвер клавиатуры

Драйвер клавиатуры обеспечивает приём символов с клавиатуры, перекодировку символов в соответствии с таблицами КОИ-8, КОИ-7Н0, КОИ-7Н1, КОИ-7Н2, запись символов во внутренний буфер, выдачу по запросу и по прерыванию символов в программу пользователя с ожиданием и без, программирование и подстановку функциональных клавиш, автоповтор последнего символа, редактирование вводимой и существующей строки, акустическую обратную связь при нажатии на клавиши. Драйвер может работать в двух режимах: прямом, когда коды функциональных клавиш передаются в программу без изменений, и режиме перекодировки, в котором некоторые функциональные клавиши выдают другие коды (см. приложение 1).

## 2.7. Драйвер экрана

Драйвер экрана обеспечивает вывод на экран символьной, псевдографической и графической информации, стирание экрана, сдвиг вверх и вниз, управление цветами и палитрами, переключение буферов экрана, управление курсором.

Вывод символьной и графической информации возможен в трех режимах:

- 256 точек в строке, 4 цвета, 32 символа в строке,
- 512 точек в строке, 2 цвета, 64 символа в строке,
- 512 точек в строке, 2 цвета, 80 символов в строке.

Вывод алфавитно-цифровой информации производится в соответствии с одной из таблиц: КОИ-8,КОИ-7Н0, КОИ-7Н1, КОИ-7Н2. Знакогенератор символов располагается в системной странице ОЗУ, начиная со смещения 10000. Хотя системная страница не может быть подключена, область знакогенератора доступна по чтению и записи с помощью запросов драйвера ОЗУ/ПЗУ. Описание каждого символа состоит из 10 байт, соответствующих телевизионным строкам. Байт с младшим адресом соответствует верхней строке символа, младший бит байта -левой точке в строке. Таблица начинается с изображения символа с восьмеричным кодом 040.Далее подряд идут изображения символов с кодами от 041 до 377. При начальном пуске ЭВМ в ОЗУ переписывается стандартный знакогенератор из ПЗУ. Программа пользователя может заменить любую часть знакогенератора.

В режиме 80 символов в строке на экран выводятся первые 6 бит каждого байта.

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

При выводе в последней строке символа ПС (код 12) или ПФ (код 14) сдвиг экрана вверх может производиться либо скачком либо плавно.

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

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

## 2.8. Драйвер кассетного магнитофона

Драйвер кассетного магнитофона обеспечивает поиск, запись и считывание файлов с бытового кассетного магнитофона в формате, совместимом с БК - 0010.

## 2.9. Драйвер принтера

Драйвер принтера обеспечивает вывод на печатающее устройство алфавитно-цифровой информации с перекодировкой по таблицам КОИ-8, КОИ-7Н0, КОИ-7Н1, КОИ-7Н2, определение готовности ПУ, отслеживание позиции печатающей головки.

## 2.10. Драйвер НГМД

Драйвер НГМД обеспечивает запись и считывание информации с гибких магнитных дисков в формате, совместимом с контроллером КМД от ДВК-3, а также форматирование дискет.

# 3. Описание системных запросов БОС

В этой главе содержится краткое и подробное описание запросов БОС БК-0011М. Для облегчения программирования на языке Ассемблера под управлением операционной системы ОС БК-11, поставляется макробиблиотека, содержащая макроопределения системных вызов. При описании функций БОС приводится 2 формата вызовов: макрокоманда и макрорасширение, которое может использоваться при программировании без макробиблиотеки. По умолчанию используются команды JSR. Для использования EMT следует присвоить служебной переменной ...EMT значение, отличное от нуля.

БОС поддерживает следующие вызовы:

Имя | Вызов через JSR | Вызов через EMT | Адрес | Описание
--- | --- | --- | --- | ---
.BINIT | JSR PC,@140010 | EMT 0 | 150414 | инициализация БОС;
.BEXIT | JSR PC,@140012 | EMT 1 | 147712 | выход в клавиатурный монитор;
.BTRPS | JSR PC,@140014 | EMT 2 | 147742 | перехват 4 вектора;
.BTIM | JSR PC,@140016 | EMT 3 | 150070 | управление таймером;
.BEMT | JSR PC,@140020 | EMT 4 | 152202 | управление обработкой EMT;
| JSR PC,@140022 |  | 150164 | зарезервировано
| JSR PC,@140024 |  | 150164 | зарезервировано
| JSR PC,@140026 |  | 150164 | зарезервировано
.BMEM | JSR PC,@140030 | EMT 10 | 150474 | чтение состояния памяти;
.BTEST | JSR PC,@140032 | EMT 11 | 150504 | чтение статуса страницы;
.BPAGE | JSR PC,@140034 | EMT 12 | 150514 | подключение страницы ОЗУ/ПЗУ;
.BWORK | JSR PC,@140036 | EMT 13 | 150530 | назначение/чтение рабочей страницы;
.BGETW | JSR PC,@140040 | EMT 14 | 150540 | чтение слова из рабочей страницы;
.BGETB | JSR PC,@140042 | EMT 15 | 150564 | чтение байта из рабочей страницы;
.BPUTW | JSR PC,@140044 | EMT 16 | 150612 | запись слова в рабочую страницу;
.BPUTB | JSR PC,@140046 | EMT 17 | 150654 | запись байта в рабочую страницу;
.BMOVE | JSR PC,@140050 | EMT 20 | 151140 | пересылка массива слов;
.BMOVB | JSR PC,@140052 | EMT 21 | 151156 | пересылка массива байтов;
.BJSR | JSR PC,@140054 |  | 151006 | вызов подпрограммы из рабочей страницы;
.BJMP | JSR PC,@140056 | EMT 23 | 151114 | переход в рабочую страницу без возврата;
.BKINI | JSR PC,@140070 | EMT 30 | 146704 | инициализация драйвера клавиатуры;
.BKSET | JSR PC,@140072 | EMT 31 | 146752 | установка режима драйвера клавиатуры;
.BKGET | JSR PC,@140074 | EMT 32 | 146764 | чтение режима драйвера клавиатуры;
.BTTIN | JSR PC,@140076 | EMT 33 | 147550 | ввод символа с ожиданием;
.BINKEY | JSR PC,@140100 | EMT 34 | 147406 | ввод символа без ожидания;
.BGLIN | JSR PC,@140102 | EMT 35 | 151336 | ввод строки с редактированием;
.BEDIT | JSR PC,@140104 | EMT 36 | 151266 | редактирование существующей строки;
.BKRES | JSR PC,@140106 | EMT 37 | 147636 | сброс буфера клавиатуры;
.BSFUN | JSR PC,@140110 | EMT 40 | 147672 | установка функциональных клавиш;
.BGFUN | JSR PC,@140112 | EMT 41 | 147702 | чтение функциональных клавиш;
| JSR PC,@140114 |  | 150164 | зарезервировано
| JSR PC,@140116 |  | 150164 | зарезервировано
| JSR PC,@140120 |  | 150164 | зарезервировано
| JSR PC,@140122 |  | 150164 | зарезервировано
| JSR PC,@140124 |  | 150164 | зарезервировано
| JSR PC,@140126 |  | 150164 | зарезервировано
.BTINI | JSR PC,@140130 | EMT 50 | 143456 | инициализация драйвера экрана;
.BTSET | JSR PC,@140132 | EMT 51 | 143446 | установка режима драйвера экрана;
.BTGET | JSR PC,@140134 | EMT 52 | 143434 | чтение режима драйвера экрана;
.BSCOL | JSR PC,@140136 | EMT 53 | 143274 | установка цветов;
.BGCOL | JSR PC,@140140 | EMT 54 | 143414 | чтение цветов;
.BPAL | JSR PC,@140142 | EMT 55 | 150000 | установка/чтение палитры;
.BBUF | JSR PC,@140144 | EMT 56 | 143466 | переключение буферов экрана;
.BSPOS | JSR PC,@140146 | EMT 57 | 143476 | установка координат Алфавитно-цифрового курсора;
.BGPOS | JSR PC,@140150 | EMT 60 | 143560 | чтение координат Алфавитно-цифрового курсора;
.BSCRL | JSR PC,@140152 | EMT 61 | 143572 | сдвиг экрана;
.BCLS | JSR PC,@140154 | EMT 62 | 143622 | очистка экрана;
.BTOUT | JSR PC,@140156 | EMT 63 | 143070 | вывод символа;
.BPRIN | JSR PC,@140160 | EMT 64 | 143142 | вывод строки символов, (формат RT - 11);
.BSTR | JSR PC,@140162 | EMT 65 | 143130 | вывод строки символов;
.BSGRF | JSR PC,@140164 | EMT 66 | 152470 | установка текущих графических координат;
.BGGRF | JSR PC,@140166 | EMT 67 | 152506 | чтение текущих графических координат;
.BSCGR | JSR PC,@140170 | EMT 70 | 152524 | установка графического цвета;
.BGCGR | JSR PC,@140172 | EMT 71 | 152546 | чтение графического цвета;
.BSMOD | JSR PC,@140174 | EMT 72 | 152564 | установка/чтение режима рисования;
.BSPNT | JSR PC,@140176 | EMT 73 | 152230 | вывод графической точки;
.BGPNT | JSR PC,@140200 | EMT 74 | 152372 | чтение цвета графической точки;
.BVECT | JSR PC,@140202 | EMT 75 | 152460 | вывод вектора;
.BRECT | JSR PC,@140204 | EMT 76 | 153424 | вывод закрашенного прямоугольника;
.BCIRC | JSR PC,@140206 | EMT 77 | 152722 | вывод дуги или окружности;
.BFILL | JSR PC,@140210 | EMT 100 | 154202 | закраска гранично - определённой области;
.BSOUN | JSR PC,@140212 | EMT 101 | 143636 | выдача звука;
.BSWIN | JSR PC,@140214 | EMT 102 | 153000 | установка графического окна;
.BGWIN | JSR PC,@140216 | EMT 103 | 153134 | чтение графического окна;
| JSR PC,@140220 |  | 146404 | - секретный вызов
.BSTYP | JSR PC,@140222 | EMT 105 | 152614 | установка типа вектора;
.BGTYP | JSR PC,@140224 | EMT 106 | 152660 | чтение типа вектора;
.BGOSET | JSR PC,@140226 | EMT 107 | 153166 | установка/чтение ориентации графических символов;
.BGOUT | JSR PC,@140230 | EMT 110 | 153226 | графический вывод символа;
| JSR PC,@140232 |  | 150164 | зарезервировано
| JSR PC,@140234 |  | 150164 | зарезервировано
| JSR PC,@140236 |  | 150164 | зарезервировано
.BMOT | JSR PC,@140240 | EMT 114 | 154550 | управление двигателем магнитофона;
.BMB10 | JSR PC,@140242 | EMT 115 | 154614 | вызов формата БК-0010;
| JSR PC,@140244 |  | 150164 | зарезервировано
| JSR PC,@140246 |  | 150164 | зарезервировано
| JSR PC,@140250 |  | 150164 | зарезервировано
| JSR PC,@140252 |  | 150164 | зарезервировано
| JSR PC,@140254 |  | 150164 | зарезервировано
| JSR PC,@140256 |  | 150164 | зарезервировано
.BPINI | JSR PC,@140260 | EMT 124 | 156560 | инициализация драйвера принтера;
.BPSET | JSR PC,@140262 | EMT 125 | 156612 | установка режима печати;
.BPGET | JSR PC,@140264 | EMT 126 | 156664 | чтение режима печати;
.BPOUT | JSR PC,@140266 | EMT 127 | 156736 | вывод символа на печать;
.BPRDY | JSR PC,@140270 | EMT 130 | 156676 | определение готовности принтера;
.BPPOS | JSR PC,@140272 | EMT 131 | 156724 | определение позиции печатающей головки;
| JSR PC,@140274 |  | 150164 | зарезервировано
| JSR PC,@140276 |  | 150164 | зарезервировано
.BABOOT | JSR PC,@#160000 |  |  | автоматическая загрузка с НГМД;
.BBOOT | JSR PC,@#160002 |  |  | загрузка с выбранного привода НГМД;
.BBLCK | JSR PC,@#160004 |  |  | чтение/запись по номеру блока;
.BSECT | JSR PC,@#160006 |  |  | чтение/запись по номерам сектора и дорожки;
.BDINI | JSR PC,@#160010 |  |  | инициализация драйвера НГМД;
.BFORM | JSR PC,@#160012 |  |  | форматирование дорожки НГМД.

## 3.1. Общесистемные запросы

### 3.1.1. Инициализация базовой операционной системы .BINIT

Макрокоманда: | .BINIT
Расширение: |
    JSR PC,@140010 (EMT 0)

Производится инициализация драйверов БОС.

Драйвер клавиатуры:

- настраиваются вектора прерывания клавиатуры;
- сбрасывается пользовательский вектор обработки клавиатуры;
- разрешаются прерывания от клавиатуры;
- разрешается щелчок при нажатии клавиш;
- сбрасывается буфер ввода с клавиатуры;
- сбрасываются значения функциональных клавиш;
- запрещается перекодировка клавиш;
- устанавливается режим ввода в коде КОИ-8;

Драйвер экрана:

- устанавливается режим 32 символа в строке, палитра 15, белые символы на чёрном фоне;
- в ОЗУ знакогенератора копируется стандартный из ПЗУ;
- очищаются оба буфера экрана;
- включается запись и отображение буфера 0;
- выключается режим двойной ширины и двойной высоты символов;
- выключается режим инверсии и подчёркивания символов;
- выключается режим плавного сдвига экрана;
- включается отображение курсора в виде прямоугольника;
- включается режим нормальной обработки управляющих символов;

Драйвер магнитофона:

- выключается мотор магнитофона;

Драйвер принтера:

- на принтер (в случае готовности) посылается символ возврата каретки;
- обнуляется счётчик позиции печатающей головки;
- устанавливается режим вывода в КОИ-8;

Драйвер НГМД:

- Выключается двигатель накопителя.

### 3.1.2. Выход в клавиатурный монитор .BEXIT

Макрокоманда: | .BEXIT
Расширение: |
    JSR PC,@140012 (EMT 1)

Производится выход из программы пользователя в клавиатурный монитор. Настраиваются вектора клавиатуры, при этом возможен возврат в программу пользователя по команде "P".

### 3.1.3. Перехват вектора 4 .BTRPS

Макрокоманда: | .BTRPS ADDR
Расширение: |
    MOV ADDR,R0
    JSR PC,@140014 (EMT 2)

Устанавливается адрес пользовательской программы для обработки 4 вектора. Состояние останова (команда HALT и клавиша "СТОП") не перехватывается, в этом случае всегда происходит выход в монитор. Программа обработки должна заканчиваться командой RTI. Вызов с нулевым значением аргумента ADDR отменяет обработку 4 вектора в пользовательской программе. В обоих случаях вектор 4 настраивается на обработчик БОС.

### 3.1.4. Управление таймером .BTIM

Макрокоманда: | .BTIM ARG
Расширение: |
    MOV ARG,R0
    JSR PC,@140016 (EMT 3)

Если бит 15 ARG равен 1, то в R0 возвращается признак: 0 - таймер выключен, 1 - таймер включен, если бит 15 ARG равен 0, то при нулевом значении ARG происходит выключение таймера, при ненулевом - включение. Перед включением таймера следует подготовить вектор 100.

### 3.1.5. Управление обработкой EMT .BEMT

Макрокоманда имеет две формы запроса. Первая:

Макрокоманда: | .BEMT ON
Расширение: |
    JSR PC,@140020

    ...EMT = 1

Содержимое вектора EMT (если оно не равно адресу диспетчера EMT) помещается в ячейку 166 (настраивается пользовательский обработчик EMT). Макробиблиотека настраивается на использование команд EMT (ниже по тексту программы).

Вторая:

Макрокоманда: | .BEMT OFF
Расширение: |
    MOV @#166,@#30

    ...EMT = 0

Восстанавливается прямая обработка EMT пользовательской программой. Макробиблиотека настраивается на использование команд JSR (ниже по тексту программы).

## 3.2 Запросы драйвера ОЗУ/ПЗУ

### 3.2.1. Чтение состояния памяти .BMEM

Макрокоманда: | .BMEM
Расширение: |
    JSR PC,@140030 (EMT 10)

В младший байт R0 помещается номер страницы, подключенной к адресу 40000, в старший - номер страницы, подключенной к адресу 100000. Номера страниц 0 - 7 относятся к ОЗУ, страницы 10 - 13 (восьмеричное) относится к страницам ПЗУ с номерами 0, 1, 2 и 3 соответственно.

### 3.2.2. Чтение статуса страницы ОЗУ/ПЗУ .BTEST

Макрокоманда: | .BTEST PAGE
Расширение: |
    MOV PAGE,R0
    JSR PC,@140032 (EMT 11)

Выдаётся состояние страницы ОЗУ/ПЗУ. В R0 помещается код:

- бит 0 - страница подключена по адресу 40000,
- бит 1 - страница подключена по адресу 100000,
- бит 2 - страница ОЗУ используется БОС или страница ПЗУ не подключена,
- бит 3 - страница является рабочей.

Примечание. Страница ПЗУ считается подключенной, если в ней присутствует хотя бы одна микросхема ПЗУ.

### 3.2.3. Подключение страницы ОЗУ/ПЗУ .BPAGE

Макрокоманда: | .BPAGE PAGE,ADDR
Расширение: |
    MOV #<ADDR * 400> + PAGE,R0
    JSR PC,@140034 (EMT 12)

В младший байт R0 помещается номер подключаемой страницы. Код адреса подключения страницы помещается в старший байт R0. Нулевое значение означает область адресов 40000 - 100000, любое ненулевое значение - область 100000 - 140000.

Возможно нормальное завершение запроса и завершение запроса с ошибкой. В случае нормального завершения бит "C" в слове состояния процессора сброшен, по ошибке - установлен в 1. В этом случае в байт с адресом 52 (восьмеричное) помещается код ошибки:

- 1 - страница отсутствует;
- 2 - страница не может быть подключена по заданному адресу (попытка подключить страницу ПЗУ по адресу 40000 - 100000);
- 3 - страница используется БОС для своих внутренних целей и запрещена для подключения.

### 3.2.4. Назначение рабочей страницы .BWORK

Макрокоманда: | .BWORK ARG
Расширение: |
    MOV ARG,R0
    JSR PC,@140036 (EMT 13)

Если бит 15 аргумента равен 0, то происходит назначение рабочей страницы: если бит 7 равен 0,то страница с номером в младшем байте аргумента назначается в качестве рабочей для записи/чтения. Если бит 7 равен 1, то страница назначается в качестве рабочей для макрокоманд .BJSR и .BJMP. Если бит 15 аргумента равен 1, то в R0 помещается код рабочих страниц: в младшем байте номер рабочей страницы чтения-записи, в старшем - номер страницы вызовов (со старшим битом, равным 0).

### 3.2.5. Чтение слова из рабочей страницы .BGETW

Макрокоманда: | .BGETW ADDR
Расширение: |
    MOV ADDR,R0
    JSR PC,@140040 (EMT 14)

Из рабочей страницы по указанному адресу читается слово и помещается в R0. При попытке прочесть слово из несуществующей страницы R0 не изменяется, а бит "C" слова состояния процессора устанавливается в 1.

Старшие два бита адреса игнорируются.

### 3.2.6. Чтение байта из рабочей страницы .BGETB

Макрокоманда: | .BGETB ADDR
Расширение: |
    MOV ADDR,R0
    JSR PC,@140042 (EMT 15)

Из рабочей страницы по указанному адресу читается байт и помещается в младший байт R0. Старший байт R0 обнуляется. При попытке прочесть байт из несуществующей страницы R0 не изменяется, а бит "C" слова состояния процессора устанавливается в 1.

### 3.2.7. Запись слова в рабочую страницу .BPUTW

Макрокоманда: | .BPUTW ADDR,DATA
Расширение: |
    MOV ADDR,R1
    MOV DATA,R0
    JSR PC,@140044 (EMT 16)

В рабочую страницу по указанному адресу записывается слово. При попытке записи в ПЗУ, несуществующую страницу или системную область ОЗУ устанавливается бит "C". Системной областью считается область системной страницы с относительными адресами 0 - 7777.

### 3.2.8. Запись байта в рабочую страницу .BPUTB

Макрокоманда: | .BPUT ADDR,DATA
Расширение: |
    MOV ADDR,R1
    MOVB DATA,R0
    JSR PC,@140046 (EMT 17)

В рабочую страницу по указанному адресу записывается байт. При попытке записи в ПЗУ, несуществующую страницу, системную область ОЗУ устанавливается бит "C".

### 3.2.9. Пересылка массива слов .BMOVE

Макрокоманда: | .BMOVE AREA
Расширение: |
    MOV AREA,R0
    JSR PC,@140050 (EMT 20)

Производится пересылка массива слов между текущим адресным пространством пользователя и заданным скрытым пространством. В R0 помещается адрес области параметров.

Формат области:

    .WORD MEMADR   ; начальный адрес в памяти
    .WORD HIDADR   ; начальный адрес в скрытой памяти
    .BYTE LOW,HIGH ; номера страниц скрытой памяти
    .WORD BCOUNT   ; счётчик слов

Начальные адреса в памяти должны лежать выше адреса 400, конечные адреса (начальный адрес + счётчик) в памяти не должны превышать 160000. Параметры LOW и HIGH задают номера страниц, подключаемых к адресам 40000 и 100000 соответственно. Выходной массив (в который осуществляется запись) не должен лежать в ПЗУ или системной области ОЗУ. Положительное значение счётчика слов задаёт пересылку из рабочей страницы в память (чтение),отрицательное (при этом используется абсолютное значение счётчика) - обратную операцию (запись). При правильно заданных параметрах и успешной пересылке бит "C" слова состояния процессора и байт 52 обнуляются. Возможны следующие случаи неуспешного завершения (при этом бит "C" устанавливается в 1 и в байт 52 помещается соответствующий код):

1. неверно задан начальный адрес (код 1) - пересылка не производится;
2. неверно задан конечный адрес (код 2) -пересылка производится до достижения допустимого конечного адреса, в R0 помещается число непереданных слов;
3. при пересылке возникло прерывание по 4 вектору (попытка записи в ПЗУ или несуществующую область) (код 3) - пересылка прекращается, в R0 помещается число непереданных слов.

### 3.2.10. Пересылка массива байтов .BMOVB

Макрокоманда: | .BMOVB AREA
Расширение: |
    MOV AREA,R0
    JSR PC,@140052 (EMT 21)

Производится пересылка массива байтов между текущим адресным пространством пользователя и заданным скрытым пространством. Параметры аналогичны пересылке слов (вместо "слов" читай "байтов").

### 3.2.11. Вызов подпрограммы из рабочей страницы .BJSR

Макрокоманда: | .BJSR ADDR
Расширение: |
    MOV ADDR,-(SP)
    JSR PC,@140054

Рабочая страница подключается по адресу, определённому аргументом ADDR (если он находится в диапазоне 40000 - 47776, то к 40000, если в диапазоне 100000 - 140000, то к 100000) и производится вызов командой JSR PC,ADDR.

Регистры общего назначения и слово состояния процессора (кроме бита "C") при выполнении вызова не изменяются. Стек не должен находиться в переключаемой странице. В стек помещается следующая информация:

SP до вызова ———— |
| адрес перехода
адрес возврата 1
старая карта
SP после перехода — | адрес возврата 2

При выходе из подпрограммы регистры общего назначения и слово состояния программы сохраняются.

При попытке обращения к подпрограмме в несуществующей странице или системной странице ОЗУ обращение к подпрограмме выполняться не будет и выполнится выход в монитор с соответствующей диагностикой.

После выхода из подпрограммы восстанавливается старое подключение обеих страниц ОЗУ/ПЗУ, даже если подпрограмма переключала одну или обе страницы. Допускается вложенное использование макрокоманды ".BJSR". Параметр вызова из стека удаляется.

### 3.2.12. Переход в рабочую страницу без возврата .BJMP

Макрокоманда: | .BJMP ADDR
Расширение: |
    MOV ADDR,-(SP)
    JSR PC,@140056 (EMT 23)

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

ПРИМЕЧАНИЯ:

1. В диагностических сообщениях, выдаваемых по .BJMP, .BJSR и прерыванию по 4 вектору выдаётся содержимое PC после выполнения запроса, т.е. адрес следующей за JSR или недопустимой командой ячейки.
2. В связи с использованием стека для передачи параметра для вызова следует использовать только команды JSR, а не EMT.

## 3.3. Запросы драйвера клавиатуры

### 3.3.1. Инициализация драйвера клавиатуры .BKINI

Макрокоманда: | .BKINI
Расширение: |
    JSR PC,@140070 (EMT 30)

Выполняется инициализация драйвера клавиатуры, описанная в макрокоманде .BINIT.

### 3.3.2 Установка режима драйвера клавиатуры .BKSET

Макрокоманда: | .BKSET MODE
Расширение: |
    MOV MODE,R0
    JSR PC,@140072 (EMT 31)

Устанавливается режим драйвера клавиатуры в соответствии со словом MODE. Назначение разрядов слова:

Разряд | Значение
--- | ---
0 | 0 - КОИ-8, 1 - КОИ-7
1 | для КОИ-7: 1 - КОИ7-Н2
6 | 0 - "щелчок" клавиатуры разрешён, 1 - запрещён
7 | 0 - прямая передача кодов, 1 - перекодировка (см. приложение 1)

Кроме этого, программа пользователя имеет возможность задать подпрограмму завершения при нажатии каждой клавиши. Программным вектором считаются ячейки 110 и 112. При нулевом содержимом 110 ячейки считается, что подпрограмма завершения отсутствует. В ячейку 112 записывается значение регистра управления памятью для подпрограммы завершения или 0 для текущего распределения. При вызове подпрограммы завершения в R0 передаётся код нажатой клавиши. Выход из подпрограммы выполняется командой "RTS PC". В подпрограмме завершения можно использовать все регистры общего назначения.

Если при выходе из подпрограммы завершения бит "C" установлен в 1, драйвер считает, что символ с клавиатуры не обработан и передаст его программе пользователя по .BTTIN.

Если при выходе из подпрограммы завершения бит "C" установлен в 0, то символ считается обработанным и в буфер не записывается.

### 3.3.3. Чтение режима работы клавиатуры .BKGET

Макрокоманда: | .BKGET
Расширение: |
    JSR PC,@140074 (EMT 32)

Текущий режим клавиатуры помещается в R0. Формат слова режима см. макро .BKSET.

### 3.3.4. Ввод символа с ожиданием .BTTIN

Макрокоманда: | .BTTIN
Расширение: |
    JSR PC,@140076 (EMT 33)

В младший байт R0 помещается очередной символ из буфера ввода клавиатуры, старший байт R0 обнуляется.

### 3.3.5. Ввод символа без ожидания .BINKEY

Макрокоманда: | .BINKEY
Расширение: |
    JSR PC,@140100 (EMT 34)

В случае отсутствия символов в буфере, R0 обнуляется, бит "C" устанавливается в 1, в противном случае бит "C" сброшен, в R0 передаётся код очередного символа.

### 3.3.6. Ввод строки с редактированием .BGLIN

Макрокоманда: | .BGLIN ADDR,LENGTH
Расширение: |
    MOV ADDR,R0
    MOV LENGTH,R1
    JSR PC,@140102 (EMT 35)

Осуществляется ввод с клавиатуры строки символов с редактированием. Ввод строки заканчивается при нажатии клавиши "ВВОД", необязательно в конце строки. Код клавиши "ВВОД" в буфер не помещается, в конце строки добавляется нулевой байт. Параметр ADDR задаёт адрес буфера, куда помещается строка, параметр LENGTH задаёт максимальную длину вводимой строки. При длине, равной 0, длина принимается равной максимально возможной длине - 128 символов. При вводе строки отрабатывается клавиша "забой". После возврата из функции в R0 находится адрес байта, следующего за нулевым, а в R1 - длина введённой строки.

### 3.3.7. Редактирование существующей строки .BEDIT

Макрокоманда: | .BEDIT ADDR,LENGTH
Расширение: |
    MOV ADDR,R0
    MOV LENGTH,R1
    JSR PC,@140104 (EMT 36)

Строка, находящаяся по адресу ADDR и заканчивающаяся нулевым байтом, выводится на экран, курсор помещается в конец выведенной строки, после чего осуществляется ее редактирование, аналогичное .BGLIN. Отредактированная строка помещается на место исходной.

### 3.3.8. Сброс буфера клавиатуры .BKRES

Макрокоманда: | .BKRES
Расширение: |
    JSR PC,@140106 (EMT 37)

Осуществляется инициализация кольцевого буфера клавиатуры.

### 3.3.9. Установка функциональных клавиш .BSFUN

Макрокоманда: | .BSFUN KEY,ADDR
Расширение: |
    MOV KEY,R0
    MOV ADDR,R1
    JSR PC,@140110 (EMT 40)

Макрокоманда позволяет присвоить 10 функциональным клавишам (аргумент KEY [1...10] - номер клавиши) текстовые строки, которые будут вводиться при нажатиях этих клавиш.Функциональные клавиши вводятся при одновременном нажатии клавиши АР2 и соответствующей цифровой клавиши (номеру 10 соответствует клавиша 0). Аргумент KEY, равный 0, вызывает сброс всех функциональных клавиш. Аргумент ADDR задаёт адрес строки, которая должна заканчиваться нулевым байтом. Максимальная длина присваиваемой строки - 64.

### 3.3.10. Чтение функциональных клавиш .BGFUN

Макрокоманда: | .BGFUN KEY,ADDR
Расширение: |
    MOV KEY,R0
    MOV ADDR,R1
    JSR PC,@140112 (EMT 41)

Производится пересылка строки, соответствующей клавише с номером KEY, в пользовательскую область по адресу ADDR.

## 3.4. Запросы драйвера экрана

### 3.4.1. Инициализация драйвера экрана .BTINI

Макрокоманда: | .BTINI
Расширение: |
    JSR PC,@140130 (EMT 50)

Производится инициализация драйвера экрана, описанная в макрокоманде .BINIT.

### 3.4.2. Установка режима драйвера экрана .BTSET

Макрокоманда: | .BTSET MODE
Расширение: |
    MOV MODE,R0
    JSR PC,@140132 (EMT 51)

Устанавливается режим работы экрана, соответствующий слову MODE. Формат слова приведён в приложении 3.

### 3.4.3. Чтение режима драйвера экрана .BTGET

Макрокоманда: | .BTGET
Расширение: |
    JSR PC,@140134 (EMT 52)

В R0 помещается слово управления режимом драйвера экрана.

### 3.4.4. Установка цветов .BSCOL

Макрокоманда: | .BSCOL FORE,BACK
Расширение: |
    MOV #<BACK * 400>+FORE,R0
    JSR PC,@140136 (EMT 53)

Задаются цвета для символьного вывода на экран. Аргумент FORE задаёт код цвета для символов и помещается в младший байт R0, аргумент BACK - код цветов фона и помещается в старший байт R0. Код, больший 200 (восьмеричное), означает сохранение текущего цвета. В зависимости от режима рассматриваются младшие 1 или 2 бита кода.

### 3.4.5. Чтение цветов .BGCOL

Макрокоманда: | .BGCOL
Расширение: |
    JSR PC,@140140 (EMT 54)

В R0 помещается код текущих цветов, как описано в макрокоманде .BSCOL.

### 3.4.6. Установка/чтение палитры .BPAL

Макрокоманда: | .BPAL PALET
Расширение: |
    MOVB PALET,R0
    JSR PC,@140142 (EMT 55)

Устанавливается палитра, соответствующая аргументу PALET (0...15). Если PALET >200 (восьм.), то палитра не изменяется, а в R0 помещается код текущей палитры.

### 3.4.7. Переключение буферов экрана .BBUF

Макрокоманда: | .BBUF WRITE,VIDEO
Расширение: |
    MOV #<WRITE * 400>+VIDEO,R0
    JSR PC,@140144 (EMT 56)

Устанавливаются буфера экрана для отображения (VIDEO) и для записи (WRITE). Номер буфера (0 или 1) отображения помещается в младший байт R0, записи - в старший. Если бит 15 R0 установлен в "1", в R0 возвращается текущий код буферов.

### 3.4.8. Установка координат алфавитно-цифрового курсора .BSPOS

Макрокоманда: | .BSPOS LINE,POS
Расширение: |
    MOV #<LINE * 400>+POS,R0
    JSR PC,@140146 (EMT 57)

Алфавитно-цифровой курсор устанавливается в заданной позиции POS заданной строки LINE. Если номер строки или позиции в строке превышает допустимый, то соответствующая координата не изменяется.

### 3.4.9. Чтение координат Алфавитно-цифрового курсора .BGPOS

Макрокоманда: | .BGPOS
Расширение: |
    JSR PC,@140150 (EMT 60)

В R0 помещается текущее положение курсора, причём в младшем байте содержится номер позиции, а в старшем - номер строки.

### 3.4.10. Сдвиг экрана .BSCRL

Макрокоманда: | .BSCRL NUM
Расширение: |
    MOV NUM,R0
    JSR PC,@140152 (EMT 61)

Производится сдвиг изображения на указанное число телевизионных строк, положительное число означает сдвиг вверх, отрицательное - вниз.

### 3.4.11. Очистка экрана .BCLS

Макрокоманда: | .BCLS
Расширение: |
    JSR PC,@140154 (EMT 62)

Производится очистка экрана (заполнение цветом фона). Курсор устанавливается в левый верхний угол.

### 3.4.12. Вывод символа .BTOUT

Макрокоманда: | .BTOUT CHAR
Расширение: |
    MOVB CHAR,R0
    JSR PC,@140156 (EMT 63)

Производится вывод символа на экран, если он печатаемый. Управляющие символы, интерпретируемые драйвером, описаны в приложении 2. Управляющие символы, отсутствующие в таблице, игнорируются. В режиме "БЛОКРЕД" все управляющие символы не обрабатываются, а выводятся в виде инверсных изображений латинских букв.

### 3.4.13. Вывод строки символов (формат RT-11) .BPRIN

Макрокоманда: | .BPRIN ADDR
Расширение: |
    MOV ADDR,R0
    JSR PC,@140160 (EMT 64)

Производится вывод на экран строки символов. Строка должна начинаться с адреса ADDR и заканчиваться байтом 0 (курсор переводится в начало следующей строки) или 200 (курсор располагается за последним выведенным символом). После возврата в R0 находится адрес байта, следующего за конечным.

### 3.4.14 Вывод строки символов .BSTR

Макрокоманда: | .BSTR ADDR
Расширение: |
    MOV ADDR,R0
    JSR PC,@140162 (EMT 65)

Производится вывод строки, заканчивающейся байтом 0. Курсор на новую строку не переводится.

### 3.4.15. Установка текущих графических координат .BSGRF

Макрокоманда: | .BGRF X,Y
Расширение: |
    MOV X,R0
    MOV Y,R1
    JSR PC,@140164 (EMT 66)

Устанавливаются текущие графические координаты, которые используются в других графических вызовах. Аргумент X - номер точки в строке. Y - задаёт номер строки растра, верхняя левая точка имеет координаты (0,0), правая нижняя - (255,255) или (511,255) в зависимости от режима.

### 3.4.16. Чтение текущих графических координат .BGGRF

Макрокоманда: | .BGGRF
Расширение: |
    JSR PC,@140166 (EMT 67)

В R0 и R1 помещаются текущие графические координаты в том же формате, что и в .BSGRF.

### 3.4.17. Установка графического цвета .BSCGR

Макрокоманда: | .BSCGR COLOR
Расширение: |
    MOVB COLOR,R0
    JSR PC,@140170 (EMT 70)

Устанавливается цвет для графического вывода. COLOR может принимать значения 0...3:

- 0 - чёрный
- 1 - синий
- 2 - зелёный
- 3 - красный

### 3.4.18 Чтение графического цвета .BGCGR

Макрокоманда: | .BGCGR
Расширение: |
    JSR PC,@140172 (EMT 71)

В R0 помещается код текущего графического цвета.

### 3.4.19 Установка/чтение режима рисования .BSMOD

Макрокоманда: | .BSMOD MODE
Расширение: |
    MOVB MODE,R0
    JSR PC,@140174 (EMT 72)

Устанавливается режим рисования для всех графических вызовов. При MODE=0 устанавливается режим замещения текущим цветом. MODE=1 - режим инверсии содержимого буфера, MODE=200 - режим не меняется, а в R0 помещается код текущего режима.

### 3.4.20. Вывод графической точки .BSPNT

Макрокоманда: | .BSPNT X,Y
Расширение: |
    MOV X,R0
    MOV Y,R1
    JSR PC,@140176 (EMT 73)

На экран по заданным координатам выводится графическая точка текущего цвета. Текущие координаты перемещаются в заданную точку.

### 3.4.21. Чтение цвета графической точки .BGPNT

Макрокоманда: | .BGPNT X,Y
Расширение: |
    MOV X,R0
    MOV Y,R1
    JSR PC,@140200 (EMT 74)

В точке с заданными координатами определяется цвет и помещается в R0. Текущие координаты не изменяются.

### 3.4.22. Вывод графического вектора .BVECT

Макрокоманда: | .BVECT X,Y
Расширение: |
    MOV X,R0
    MOV Y,R1
    JSR PC,@140202 (EMT 75)

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

### 3.4.23. Вывод закрашенного прямоугольника .BRECT

Макрокоманда: | .BRECT X,Y
Расширение: |
    MOV X,R0
    MOV Y,R1
    JSR PC,@140204 (EMT 76)

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

### 3.4.24. Вывод дуги или окружности .BCIRC

Макрокоманда: | .BCIRC ADDR
Расширение: |
    MOV ADDR,R0
    JSR PC,@140206 (EMT 77)

Выводится окружность, дуга или сектор текущего цвета. Аргумент ADDR задаёт адрес блока параметров вызова.

- Слово 1 - координата X центра дуги (окружности)
- Слово 2 - координата Y центра дуги (окружности)
- Слово 3 - радиус дуги (окружности)
- Слово 4 - начальный угол дуги
- Слово 5 - конечный угол
- Слово 6 - коэффициент сжатия по оси X
- Слово 7 - коэффициент сжатия по оси Y.

Начальный и конечный углы задаются следующим образом:

Аргумент | Значение угла (градусы)
--- | ---
000000 | 0
077777 | 360

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

- 0 - нет сжатия;
- 1-177777 - реальная координата = (вычисленная * коэфф.)/32767

### 3.4.25. Закраска гранично-определённой области .BFILL

Макрокоманда: | .BFILL COLOR
Расширение: |
    MOVB COLOR,R0
    JSR PC,@140210 (EMT 100)

Производится закраска гранично - определённой 4-связной области текущим цветом, начиная с текущей точки. Область должна быть ограничена одним заданным цветом (COLOR).

### 3.4.26. Выдача звука .BSOUN

Макрокоманда: | .BSOUN LENGTH,TONE
Расширение: |
    MOV LENGTH,R0
    MOV TONE,R1
    JSR PC,@140212 (EMT 101)

Выдаётся звук периодом TONE и длиной LENGTH периодов.

### 3.4.27. Установка графического окна .BSWIN

Макрокоманда: | .BSWIN AREA
Расширение: |
    MOV AREA,R0
    JSR PC,@140214 (EMT 102)

Производится установка границ окна для графического вывода. Аргумент AREA задаёт адрес области параметров. Формат области:

    .WORD MINX  ;левая граница по X
    .WORD MAXX  ;правая граница по X
    .WORD MINY  ;верхняя граница по Y
    .WORD MAXY  ;нижняя граница по Y

Если какая - либо из границ задана вне экрана, вместо неё устанавливается граница экрана.

### 3.4.28. Чтение графического экрана .BGWIN

Макрокоманда: | .BGWIN AREA
Расширение: |
    MOV AREA,R0
    JSR PC,@140216 (EMT 103)

По адресу, заданным параметром AREA, помещается таблица, описанная в .BSWIN.

### 3.4.29. Установка типа вектора .BSTYP

Макрокоманда: | .BSTYP ARG
Расширение: |
    MOV ARG,R0
    JSR PC,@140222 (EMT 105)

Производится установка типа (шаблона) для рисования графических векторов. Используется для рисования прерывистых линий. Каждый бит аргумента задаёт признак рисования (пропуска) двух точек, лежащих на векторе. После инициализации драйвера экрана устанавливается тип 177777 (8), задающий рисование сплошных линий. Следует учитывать, что значение типа циклически сдвигается, и поэтому рисование следующего вектора начинается не с начала шаблона, а с текущего положения.

### 3.4.30 Чтение типа вектора .BGTYP

Макрокоманда: | .BGTYP
Расширение: |
    JSR PC,@140224 (EMT 106)

В R0 помещается текущий шаблон рисования векторов. Значение может быть циклически сдвинуто относительно заданного (см. .BSTYP).

### 3.4.31 Установка и чтение ориентации графических символов .BGOSET

Макрокоманда: | .BGOSET ARG
Расширение: |
    MOVB ARG,R0
    JSR PC,@140226 (EMT 107)

Производится установка ориентации для графического вывода символов. ARG, равный 0 означает нормальный вывод, 1 - повёрнутый на 180 градусов, 2 - на 90 влево, 3 - на 90 вправо; 200 - чтение ориентации графических символов (в R0 помещается код ориентации).

### 3.4.32 Графический вывод символа .BGOUT

Макрокоманда: | .BGOUT CHAR
Расширение: |
    MOV CHAR,R0
    JSR PC,@140230 (EMT 110)

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

## 3.5. Запросы драйвера магнитофона

### 3.5.1. Управление двигателем .BMOT

Макрокоманда: | .BMOT ARG
Расширение: |
    MOV ARG,R0
    JSR PC,@140240 (EMT 114)

При ARG=1 осуществляется включение двигателя магнитофона,при ARG=0 - выключение.

### 3.5.2. Вызов формата БК-0010 .BMB10

Макрокоманда: | .BMB10 AREA
Расширение: |
    MOV AREA,R0
    JSR PC,@140242 (EMT 115)

Выполняется операция с магнитофоном, используется формат магнитной ленты, совместимый с БК-0010. Параметр AREA - адрес области ОЗУ, через которую передаются параметры вызова.

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

| Смещение в байтах
--- | ---
XXXXX | CODE | 0
нач. адрес | 2
длина в байтах | 4
имя файла . . . . . . | 6
(16. байтов)
СТР 1 | СТР 0 | 026
FILE ADDRESS | 030
FILE LENGTH | 032
FILE NAME . . . . . . | 034
(16. байтов)

Поле "CODE" (байт заполняется пользователем и содержит код операции:

- 0 - записать файл
- 1 - прочитать файл
- 2 - чтение метки файла
- 3 - фиктивное чтение файла

Аргумент "начальный адрес" задаёт начальный адрес области ОЗУ, из которой выводится информация в файл или начальный адрес области ОЗУ, куда производится ввод информации. Если в команде чтения указан адрес 0,информация записывается, начиная с адреса, указанного в метке файла.

Аргумент "длина" используется только в операции "запись файла"и задаёт длину в байтах записываемой области ОЗУ.

Аргумент "имя файла" содержит 16.-байтное имя файла, с которым необходимо произвести операцию. Если в запросе чтение файла имя будет начинаться с нулевого байта, то будет загружен первый встретившийся файл.

Аргументы "СТР0" и "СТР1" задают номера страниц ОЗУ (ПЗУ), подключаемых к окнам 40000 - 100000 и 100000 - 140000 при передаче данных (задают страницы памяти буфера ввода - вывода). Отрицательные значения соответствующих байтов означают текущее распределение памяти.

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

При ошибочном завершении операции запрос возвращает установленный бит "C" и код ошибки в байте 52:

- 1 - найден файл с именем, не совпадающим с заданным;
- 2 - ошибка контрольной суммы;
- 3 - недопустимый диапазон адресов;
- 4 - прерывание по вектору 4 или клавише "СТОП".

При ошибке типа 1 магнитофон останавливается после прочитанной метки файла.

## 3.6. Запросы драйвера принтера

### 3.6.1 Инициализация драйвера принтера .BPINI

Макрокоманда: | .BPINI
Расширение: |
    JSR PC,@140260 (EMT 124)

Осуществляется инициализация драйвера принтера, описанная в макрокоманде .BINIT.

### 3.6.2. Установка режима печати .BPSET

Макрокоманда: | .BPSET MODE
Расширение: |
    MOV MODE,R0
    JSR PC,@140262 (EMT 125)

Устанавливается режим печати в соответствии со словом MODE. Назначение разрядов:

- 8 - входная информация: 0 - КОИ-8, 1 - КОИ-7;
- 9 - выходная информация: 0 - КОИ-8, 1 - КОИ-7;
- 10 - 1 - КОИ-7Н2 (при КОИ-7 на входе).

Младший байт MODE содержит число квантов ожидания готовности принтера, один квант соответствует одному полному циклу (65536 раз) команды SOB. При равенстве нулю время ожидания бесконечно.

### 3.6.3. Чтение режима печати .BPGET

Макрокоманда: | .BPGET
Расширение: |
    JSR PC,@140264 (EMT 126)

В R0 помещается слово режима печати.

### 3.6.4. Вывод символа на печать .BPOUT

Макрокоманда: | .BPOUT CHAR
Расширение: |
    MOVB CHAR,R0
    JSR PC,@140266 (EMT 127)

Осуществляется вывод символа на печать. Если печать не выдаёт готовности больше установленного времени тайм-аута, возвращается управление с установленным битом "C".

### 3.6.5. Определение готовности принтера .BPRDY

Макрокоманда: | .BPRDY
Расширение: |
    JSR PC,@140270 (EMT 30)

Если принтер готов, в R0 помещается 1, бит "C" сброшен, иначе R0 = 0, C = 1.

### 3.6.6. Чтение текущей позиции печати .BPPOS

Макрокоманда: | .BPPOS
Расширение: |
    JSR PC,@140272 (EMT 131)

В R0 помещается текущая позиция печатающей головки. Пересчёт при выводе символов табуляции не производится.

## 3.7. Запросы драйвера НГМД

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

Адрес точки входа | Функция
--- | ---
160000 | Автоматическая загрузка
160002 | Загрузка с выбранного привода
160004 | Чтение-запись по номеру блока
160006 | Чтение-запись по номеру сектора
160010 | Инициализация рабочей области драйвера
160012 | Форматирование дорожки

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

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

Формат рабочей области:

Смещение от начала области | Длина (байт) | Символическое имя | Начальное значение | Назначение
--- | --- | --- | --- | ---
0 | 2 | CSRW | 0 | Копия по записи регистра состояния НГМД
2 | 2 | CURTRK | - | Адрес текущей дорожки
4 | 4 | TRKTAB | 177777, 77777 | Таблица текущих дорожек
10 | 2 | TDOWN | 20000 (для 6022) | Время опускания головки (в циклах SOB)
12 | 2 | TSTEP | 20000 (для 6022) | Время перехода с дорожки на дорожку
14 | 1 | TRKCOR | 36 (для 6022) | Номер дорожки, с которой включается предкомпенсация при записи
15 | 1 | BRETRY | 30 (рекоменд.) | Число повторных операций при ошибках
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 | вх. параметр | Число секторов на дорожке
62 | 4 |  | вх. параметр | Рабочие ячейки

Таблица FLGTAB содержит по одному байту на привод и используется для обработки нестандартных дисков. В каждом байте используется два бита для указания параметров операции:

- бит 0 - при установке в 1 драйвер производит пропуск дорожек при поиске, т.е. фактически обрабатываются только чётные дорожки. Эта возможность используется для обработки на дисководе, имеющем 80 дорожек, дискет, размеченных на 40-дорожечном дисководе;
- бит 1 - при установке в 1 драйвер производит обращение только к нижней стороне дискеты. Эта возможность используется при подключении дисководов, имеющих только одну головку, а также при обработке дискет, записанных на таком дисководе, на двустороннем дисководе;
- бит 2 - при равенстве 0 драйвер обрабатывает сектора длиной 512 байт, иначе длиной 1024 байт.

### 3.7.1. Автоматическая загрузка

Вызов: |
    JSR PC,@160000

Можно также произвести загрузку непосредственно из монитора команд оператора командой "B". Входные параметры отсутствуют.

Действие: производится попытка загрузить операционную систему с привода 0. Если попытка загрузки была неудачной, то драйвер последовательно пытается загрузить систему с 1, 2 и 3 привода. Если все попытки оказались неудачными, драйвер возвращает управление с установленным битом "C" оператора.

Алгоритм загрузки:

1. Инициализируется рабочая область драйвера в ОЗУ (базовый адрес - 2000) с параметрами для дисковода 6022.
2. Считается 1 сектор 0 дорожки выбранного дисковода в ОЗУ, начиная с адреса 1000.
3. В следующих случаях:

- в приводе отсутствует дискета,
- не закрыта крышка привода,
- привод неисправен,
- дискета не размечена,
- при считывании указанного сектора возникла ошибка,
- на диске нет загрузчика операционной системы,

попытка загрузки считается неудачной, иначе драйвер передаёт управление по адресу 1000, при этом в R0 помещается номер привода, откуда произведена загрузка.

### 3.7.2. Загрузка с выбранного привода

Вызов: |
    MOV #N,R0
    JSR PC,@#160002

Из монитора команд оператора:

<N>B,

где <N> — номер выбранного привода.

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

### 3.7.3. Чтение-запись логического блока

Вызов: |
    JSR PC,@#160004

Входные параметры:

- R0 — номер блока на диске,
- R1 — длина пересылаемого массива данных,
- R2 — начальный адрес массива данных,
- R3 — базовый адрес рабочей области драйвера,
- поле UNIT в рабочей области — номер привода.

Блок является логической единицей информации на внешних носителях и равен 512 байтам. В основном используемом формате записи на диск размер блока совпадает с размером сектора. Первый сектор нижней стороны нулевой дорожки соответствует блоку 0. Вычисление номера сектора и дорожки по номеру блока производится с учётом установленных признаков в таблице FLGTAB. Алгоритм этого вычисления совпадает с алгоритмом драйвера MY для микроЭВМ серии ДВК.

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

Перед самым первым вызовом драйвера поля CSRW, TRKTAB, FLAGS в рабочей области должны быть заполнены значениями, указанными в таблице, и не должны изменяться программой пользователя. Поля TDOWN, TSTEP, TRKCOR, BRETRY, FLGTAB рекомендуется заполнять значениями, указанными в таблице, однако они могут быть изменены в зависимости от конкретных условий.

Возврат из драйвера осуществляется командой RTS PC.

Содержимое регистров процессора R0, R1, R2, R4, R5 не сохраняется.

При возникновении ошибки бит "C" в слове состояния процессора устанавливается в 1 и в байт с абсолютным адресом 52 помещается код ошибки:

Код | Причина ошибки
--- | ---
1 | при чтении - ошибка CRC в зоне данных, при записи - установлена защита записи;
2 | ошибка CRC в зоне заголовка сектора
3 | нет позиционирования на 0 дорожку
4 | ошибка позиционирования
5 | не найден сектор
6 | нет диска или диск не вращается
7 | прерывание по вектору 4 при операции
010 | не найден адресный маркер
011 | не найден маркер данных
012 | недопустимые параметры команды или нестандартный формат диска.

После завершения операции драйвер оставляет двигатель дисковода включённым. Для остановки двигателя программа пользователя должна записать 0 по адресу 177130, а также в ячейку CSRW рабочей области.

### 3.7.4. Чтение-запись по номеру сектора и дорожки

Вызов: |
    JSR PC,@#160006

Входные параметры: R3 - адрес рабочей области

Поля рабочей области:

ADDR | - начальный адрес массива данных
WCNT | - длина массива данных
SIDE | - номер стороны (0 - нижняя, 1 - верхняя)
TRK | - номер дорожки
UNIT | - номер привода (0..3)
SECTOR | - номер сектора (1...12(8))

Действие аналогично предыдущему пункту.

### 3.7.5. Инициализация рабочей области

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

Вызов: |
    JSR PC,@#160010

Входной параметр: R3 - базовый адрес рабочей области.

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

CSRW | 0
TRKTAB | 177777, 177777
TDOWN | 10000.
TSTEP | 10000.
TRKCOR | 30.
BRETRY | 30.
FLAGS | 0
FLGTAB | 0,0

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

Вызов: |
    JSR PC,@160012

Входные параметры:

R3 | - базовый адрес рабочей области
FILLB | - код, которым будет заполнено поле данных сектора при форматировании
SIDE | - номер стороны
TRK | - номер дорожки
UNIT | - номер привода

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

# Приложения

## Приложение 1: кодировка клавиш БК-0011

Управляющие клавиши

Клавиша | Прямой режим | Перекодировка
--- | --- | ---
| АР2 |  | АР2
ТАБ | 11 | 11 | 11 | 11
КТ | 3 | 203 | 3 | 203
(удал. правой части строки) | 213 | 213 | 33 144 | 33 144
(сдвижка в строке) | 26 | 226 | 33 145 | 226
(раздвижка в строке) | 27 | 227 | 27 | 227
ИНД СУ | 202 | 202 | 33 25 | 33 25
БЛОК РЕД | Код в программу не передаётся
ШАГ | 220 | 220 | 33 10 | 33 10
СБР | 14 | 214 | 14 | 214
(забой) | 30 | 230 | 177 | 30
ВС | 23 | 223 | 23 | 33
(ввод) | 12 | 212 | 15 | 15*
(вверх) | 32 | 232 | 33 101 | 33 121
(вниз) | 33 | 233 | 33 102 | 12
(вправо) | 10 | 210 | 33 103 | 33 120
(влево) | 31 | 231 | 33 104 | 33 122

Примечание. * - в режиме дополнительной клавиатуры код 33 77

Коды функциональных клавиш в режиме перекодировки и дополнительной клавиатуры

Клавиша + АР2 | Код
--- | ---
0 | 33 77 160
1 | 33 77 161
2 | 33 77 162
3 | 33 77 163
4 | 33 77 164
5 | 33 77 165
6 | 33 77 166
7 | 33 77 167
8 | 33 77 170
9 | 33 77 171
. | 33 77 156

## Приложение 2: управление экраном

Управляющие символы драйвера экрана

Код | Назначение
--- | ---
7 | Звонок
10 | Возврат на шаг (курсор влево)
11 | Горизонтальная табуляция
12 | Перевод строки (курсор вниз, сдвиг экрана вверх)
14 | Перевод формата (пропуск 10 строк)
15 | Возврат каретки (курсор в начало строки)
16 | Переход на русский регистр (в КОИ-7)
17 | Переход на латинский регистр (в КОИ-7)
33 | ESCAPE (начало командной последовательности)

Командные последовательности

Команда | Назначение
--- | ---
ESC 0 | (033 060) | Устанавливает режим 32 символа в строке
ESC 1 | (033 061) | Устанавливает режим 64 символа в строке
ESC 2 | (033 062) | Устанавливает режим 80 символов в строке
ESC 3 | (033 063) | Двойная ширина символов
ESC 4 | (033 064) | Одинарная ширина символов
ESC 5 | (033 065) | Двойная высота символов (верхняя половина)
ESC 6 | (033 066) | Двойная высота символов (нижняя половина)
ESC 7 | (033 067) | Отмена двойной высоты
ESC 8 | (033 070) | Отображение курсора
ESC 9 | (033 071) | Запрет курсора
ESC : | (033 072) | Установка палитры (1)
ESC ; | (033 073) | Установка цветов (2)
ESC = | (033 075) | Вводит режим дополнительной клавиатуры
ESC > | (033 076) | Сбрасывает режим дополнительной клавиатуры
ESC @ | (033 100) | Раздвижка символов от курсора вправо
ESC A | (033 101) | Курсор вверх (в первой строке игнорируется)
ESC B | (033 102) | Курсор вниз (в последней строке игнорируется)
ESC C | (033 103) | Курсор вправо (зависит от режима автопереноса)
ESC D | (033 104) | Курсор влево (зависит от режима автопереноса)
ESC E | (033 105) | Стирание экрана
ESC H | (033 110) | Курсор в начало экрана
ESC I | (033 111) | "Обратный ПС" (сдвиг экрана вниз)
ESC J | (033 112) | Стирание от курсора до конца экрана
ESC K | (033 113) | Стирание от курсора до конца строки
ESC L | (033 114) | Раздвижка строк от курсора вниз
ESC M | (033 115) | Сдвижка строк к курсору вверх (строка, в которой находился курсор, исчезает)
ESC N | (033 116) | Подчёркивание символов
ESC O | (033 117) | Отмена подчёркивания символов
ESC P | (033 120) | Сдвижка символов к курсору влево
ESC Q | (033 121) | Курсор в начало следующей строки
ESC R | (033 122) | Курсор в начало текущей строки
ESC T | (033 124) | Инверсия символов
ESC U | (033 125) | Отмена инверсии
ESC Y | (033 131) | Прямая адресация курсора (3)
ESC Z | (033 132) | Идентификация (4)

Примечания.

- (1) после команды должен следовать байт, младшие 4 бита означают код палитры;
- (2) после команды должны следовать два байта,означающие фон и цвет символов;
- (3) после команды должны следовать код строки и код позиции в строке. Код 40 соответствует верхней строке и левой позиции;
- (4) в ответ на команду в драйвер клавиатуры передаётся последовательность: ESC/K.

## Приложение 3: формат слова управления режимом экрана