Орион-Про/Описание BIOS

Материал из Emuverse
Версия от 22:11, 18 сентября 2008; Panther (обсуждение | вклад) (Новая: {{ДИ|Автор=(C) 1990-1996 ORIONSOFT}} == 1. Аннотация == В данном руководстве описан интерфейс стандартных подпрогра...)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Данный материал защищён авторскими правами!

Использование материала заявлено как добросовестное, исключительно для образовательных некоммерческих целей.

Автор: (C) 1990-1996 ORIONSOFT

1. Аннотация

В данном руководстве описан интерфейс стандартных подпрограмм Базовой Системы Ввода/Вывода (BIOS), а также распределение системной памяти при работе компьютера в режиме «Orion-Pro».

2. Структура BIOS

Под Базовой Системой Ввода/Вывода (BIOS) компьютера «Orion-Pro» будем понимать набор подпрограмм, обеспечивающих взаимодействие программ пользователя с аппаратными ресурсами компьютера.

Доступ к стандартным подпрограммам BIOS осуществляется через таблицу векторов, расположенную в не переключаемой области оперативной памяти по адресам 0F800H..0F85FH (смотри П.3).

Каждый вектор занимает в таблице 3 байта: первый байт содержит команду процессора «JP» (код 0C3H), второй и третий — соответственно младший и старший байты адреса перехода. Местоположение каждого вектора в таблице и интерфейс соответствующей подпрограммы строго определены и не изменяются при доработках BIOS.

Так как таблица векторов расположена в ОЗУ, адреса перехода на их обработку могут быть «перехвачены» программистом для подключения внешних подпрограмм.

BIOS можно условно разделить на три составные части:

  • «ROM1-BIOS» — размещается в ПЗУ «ROM1» объемом 8 Кбайт и содержит стартовый блок, набор драйверов (клавиатуры, мыши и пр.) и прочие специальные программы;
  • «ROM2-BIOS» — размещается в ПЗУ «ROM2» объемом не менее 32 Кбайт и содержит драйвер дисплея «TV-PRO» (первые 8 Кбайт используются для хранения внутренней системы ORDOS для режима «Orion-128», а собственно «TV-PRO» занимает следующие 24 Кбайта); * «RAM BIOS» — размещается в непереключаемой области ОЗУ и содержит таблицу векторов, резидентные подпрограммы обращения к ОЗУ, ПЗУ, портам, а также рабочие ячейки. Эта часть формируется из «ROM1» и «ROM2» при «холодном» старте компьютера.

В качестве рабочей области BIOS используется сегмент ОЗУ 1FH, что должно учитываться при разработке программ для исключения конфликтных ситуаций. По относительным адресам 3000H..3FFFH этого сегмента находится непереключаемая область ОЗУ (0F000H..0FFFFH), распределение которой приведено в Приложении 1, а по адресам 1000H..2FFFH — дополнительная рабочая область драйвера «TV-PRO» (смотри описание «TV-PRO»). Адреса 0000H..0FFFH в сегменте 1FH зарезервированы для дальнейших расширений.

Заметим, что прямое обращение к рабочим ячейкам BIOS, минуя стандартные подпрограммы, запрещено, поэтому конкретные адреса этих ячеек и их назначение не объявляются.

Сегменты ОЗУ 1BH,1CH,1DH,1EH используются в качестве буферов для сохранения информации экрана (до 4-х экранных плоскостей одновременно) при вызове соответствующих функций BIOS. По умолчанию предполагаются следующие начальные адреса буферов в пределах указанных сегментов:

  • 0000H — буфер для сохранения окна или спрайта (используется при вызове соответствующих функций);
  • 3FB0H — буфер для сохранения информации под указателем мыши (используется при отображении указателя мыши с сохранением информации экрана);
  • 3FC0H — буфер для сохранения информации под курсором (используется при отображении курсора с сохранением информации экрана).

Номера сегментов и адреса размещения буферов могут изменяться программистом для всех указанных функций независимо (подробнее смотри описание «TV-PRO»).

3. Таблица векторов BIOS

Доступ к стандартным подпрограммам BIOS в режиме «Orion-Pro» возможен через таблицу векторов:

0F800H (RESET)  – перезагрузка системы в режиме «Pro»
0F803H (KBRD)   – ввод символа с клавиатуры
0F806H (KBDCTL) – управление клавиатурой
0F809H (TVC)    – вывод символа на экран
0F80CH (SCRCTL) – управление экраном
0F80FH (SYMCTL) – управление выводом символа и курсора
0F812H (KBSTAT) – опрос состояния клавиатуры
0F815H (HEX)    – вывод байта в шестнадцатиричной форме
0F818H (MSG)    – вывод сообщения на экран
0F81BH (INKEY)  – опрос кода нажатой клавиши
0F81EH (RCUR)   – получение позиции курсора
0F821H (PRINT)  – вывод на печать
0F824H (NUMKEY) – опрос номеров нажатых клавиш
0F827H (INFAST) – быстрый опрос клавиш курсора, спец-клавиш
0F82AH (GRAPH)  – вывод графики
0F82DH          – резерв для драйвера дисплея
0F830H (FILL)   – заполнение страницы ОЗУ константой
0F833H (MOVBL)  – перенос блока кодов
0F836H (RRAM)   – чтение байта из страницы ОЗУ
0F839H (WRAM)   – запись байта в страницу ОЗУ
0F83CH (WCUR)   – установка позиции курсора
0F83FH (SOUND)  – синтез звука
0F842H (RDWIN)  – чтение портов диспетчера в ОЗУ
0F845H (WRWIN)  – восстановление портов диспетчера из ОЗУ
0F848H (JPWIN)  – установка варианта диспетчера и переход
0F84BH (OPCLW)  – открыть/закрыть окно ОЗУ, ПЗУ
0F84EH (MOUSE)  – опрос порта мыши
0F851H (MSCTL)  – управление мышью
0F854H (RDSEC)  – чтение сектора диска
0F857H (WRSEC)  – запись сектора диска
0F85AH (SYSCTL) – управление системой
0F85DH (VERS)   – получение номера версии ROM1/ROM2

Перечень всех стандартных подпрограмм BIOS с кратким описанием их интерфейса приведен в Приложениях 2,3,4,5.

Рассмотрим назначение и особенности использования векторов стандартных подпрограмм.

Вектор RESET (0F800H) не имеет параметров и используется для перезапуска компьютера в режиме «Orion-Pro». Это единственный вектор, не являющийся подпрограммой, то есть для обращения к нему необходимо использовать команду процессора JP 0F800H.

Вектора KBRD (0F803H), KBDCTL (0F806H), KBSTAT (0F812H), INKEY (0F81BH), NUMKEY (0F824H), INFAST (0F827H) предназначены для обслуживания клавиатуры и описаны отдельно в П. 4.

Подпрограмма TVC (0F809H) выводит на экран символ, код которого задан в регистре C. В состав драйвера дисплея входят также следующие управляющие вектора:

SCRCTL (0F80CH) – управление экраном: режимы, цвета, окна;
SYMCTL (0F80FH) – управление выводом символа и курсора;
GRAPH  (0F82AH) – вывод графики;
[    ] (0F82DH) – резерв.

Каждый из указанных векторов выполняет целый набор функционально объединенных подпрограмм (функций), причем для обращения к требуемой функции в регистр A необходимо поместить ее номер. Перечень функций «TV-PRO» и их интерфейс приведен в Приложении 5.

Подробное описание данных векторов приведено в документации на драйвер «TV-PRO».

Приложение 6 содержит набор управляющих кодов, поддерживаемых подпрограммой TVC.

Подпрограмма HEX (0F815H) используется для вывода байта в шестнадцатиричной форме на экран, указанного в регистре A.

Подпрограмма MSG (0F818H) служит для вывода на экран сообщения, адрес начала которого задан в регистровой паре HL (признаком конца сообщения является байт 00H).

Заметим, что для вывода символов в подпрограммах HEX и MSG используется подпрограмма с адресом TVC.

Подпрограмма RCUR (0F81EH) возвращает символьную позицию курсора: в регистре H — по Y, в регистре L — по X, причем левому верхнему углу экрана (Home) соответствуют координаты (0,0).

Подпрограмма WCUR (0F83CH) выполняет обратную функцию: устанавливает курсор в позицию экрана, заданную значениями регистров H и L.

Подпрограмма PRINT (0F821H) предназначена для обслуживания печатающего устройства и выполняет две функции.

Если входное значение регистра A=0, то подпрограмма PRINT выводит символ с кодом, указанным в регистре C, на печать. В регистре A на выходе возвращается байт состояния печатающего устройства со следующими значениями битов:

    D0     – отсутствие бумаги в принтере,
    D1     – признак ошибки ERROR,
    D2     – признак отсутствия готовности BUSY,
    D3..D7 – нули.

Таким образом, признаком готовности принтера является выходное значение A=0.

При входном значении регистра A=1 подпрограмма PRINT выдает байт состояния принтера (как и при печати символа).

Подпрограмма FILL (0F830H) заполняет заданную область указанной страницы ОЗУ константой. В регистре A указывается номер страницы ОЗУ, в регистре C — записываемый байт, в регистрах HL — начальный адрес ОЗУ, DE — длина заполняемой области.

Подпрограмма MOVBL (0F833H) копирует блок данных из одной страницы памяти в другую. В регистре A указываются номера обеих страниц (старшие 4 разряда — «откуда», младшие — «куда»), в регистрах HL — начальный адрес «откуда», DE - начальный адрес «куда», BC — число копируемых байт.

Подпрограмма RRAM (0F836H) считывает в регистр C содержимое ячейки по адресу HL из страницы ОЗУ с номером, указанным в регистре A.

Подпрограмма WRAM (0F839H) записывает значение регистра C по адресу HL в страницу ОЗУ с номером, указанным в регистре A.

Подпрограмма SOUND (0F83FH) предназначена для формирования звукового сигнала. В регистровой паре BC задается длительность в миллисекундах, в DE — частота в герцах. Так как генерация звука осуществляется программным способом, данная подпрограмма выдает сигнал с усредненной частотой. Если значение DE=0, то формируется пауза заданной длительности.

Данный вектор используется подпрограммой KBRD для звукового сопровождения нажатия клавиши.

Вектора RDWIN (0F842H), WRWIN (0F845H), JPWIN (0F848H) предназначены для оперативного управления памятью компьютера.

Подпрограмма RDWIN считывает (сохраняет) в ОЗУ состояние портов диспетчера, для чего используется специальная таблица (буфер) с адресом HL длиной 6 байт. Значения портов сохраняются в указанном буфере в следующем порядке:

порт 04H (номер сегмента ОЗУ в окне 0) 
порт 05H (номер сегмента ОЗУ в окне 1) 
порт 06H (номер сегмента ОЗУ в окне 2) 
порт 08H (номер страницы ОЗУ) 
порт 09H (номер сегмента ROM2) 
порт 0AH (состояние диспетчера).

Подпрограмма WRWIN выполняет «зеркальную» функцию — восстанавливает состояние перечисленных портов из буфера ОЗУ, адрес которого задан в регистровой паре HL.

Ограничение: буфер для сохранения / восстановления портов должен находиться в непереключаемой области памяти, в противном случае он может быть «потерян» при переключении сегментов (страниц) ОЗУ.

Подпрограмма JPWIN предназначена для установки значений портов из таблиц (аналогично WRWIN) с последующей передачей управления. Данная подпрограмма позволяет работать с несколькими предварительно настроенными таблицами, каждая из которых состоит из 8 байт: первые 6 байт содержат значения портов, последние 2 байта — адрес перехода. Адрес начала всего блока таблиц задается в регистровой паре HL при первоначальном вызове JPWIN со значением аккумулятора A=0FFH. Для выполнения функции настройки диспетчера памяти с передачей управления в регистре A должен быть указан номер таблицы (номер канала), по которой JPWIN формирует состояние портов и выполняет команду перехода (JP).

Подпрограмма OPCLW (0F84BH) используется для открытия (при A=0) и закрытия (при A=1) окон в памяти.

В регистре C задается номер окна:

0 – окно 0 ОЗУ,
1 – окно 1 ОЗУ,
2 – окно 2 ОЗУ,
3 – окно ROM2,
4 – окно ROM1.

В регистре B для функции открытия окна указывается номер сегмента ОЗУ (ПЗУ).

Подпрограммы RDSEC (0F854H) и WRSEC (0F857H) используются для чтения / записи сектора гибкого диска.

Подпрограммы MOUSE (0F84EH) и MSCTL (0F851H) предназначены для обслуживания мыши. Они описаны в П.5.

Подпрограмма SYSCTL (0F85AH) выполняет функции управления системой. Номер функции задается в регистре A:

A=0 – инициализация рабочих ячеек «ROM1-BIOS»;
A=1 – инициализация портов диспетчера  памяти  (отключение всех окон);
A=2 – освобождение оверлейной  области  ОЗУ,  используемой драйвером «TV-PRO»;
A=3 – проверка занятости оверлейной области ОЗУ, используемой  драйвером «TV-PRO»    
      («Z» – область свободна для размещения внешних данных,  «NZ»  –  область  
      занята данными «TV-PRO»).

Подпрограмма VERS (0F85DH) используется для определения номеров версий «ROM1-BIOS» и «ROM2-BIOS»:

H – двоично-десятичный N версии «ROM1-BIOS»,
L – двоично-десятичный N версии «ROM2-BIOS» («TV-PRO»).

4. Особенности драйвера клавиатуры

Драйвер клавиатуры рассчитан на обслуживание клавиатур типа РК-86 и МС7007.

Подпрограмма KBRD (0F803H) используется для ввода символа с клавиатуры (с ожиданием нажатия клавиши и выводом курсора). Для клавиатуры МС7007 поддерживается старое и новое распределение спец-клавиш. Обеспечивается работа в 4-х кодировках: альтернативной, КОИ8, КОИ7/Н2 (большие латинские и большие русские буквы), КОИ7/Н1,Н0 (большие и маленькие латинские, большие и маленькие русские). Функционирование клавиатуры в различных режимах описано в Приложении 6.

В данной подпрограмме предусмотрена возможность работы с внутренним буфером клавиатуры, рассчитанным на хранение 15 кодов клавиш. Буфер организован по принципу очереди (FIFO — «первым пришел — первым ушел»). Подпрограмма KBRD при вызове проверяет наличие данных в буфере и выталкивает первый находящийся в нем байт на выход. Если же буфер пуст, осуществляется переход к вводу с клавиатуры очередного символа.

Наличие буфера KBRD дает возможность использования функциональных клавиш. Кроме того, пользователь в своих программах может заполнять буфер клавиатуры требуемыми кодами для автоматического выполнения некоторых команд.

Заметим, что драйвер клавиатуры использует еще один внутренний буфер NUMKEY с кодами сканирования нажатых клавиш (смотри описание подпрограммы NUMKEY).

Принцип обработки функциональных клавиш состоит в следующем. При нажатии такой клавиши (отдельно или совместно с одной из клавиш УПР, SHIFT) соответствующая ей строка кодов заносится в буфер, откуда будет посимвольно выдаваться при последующих вызовах KBRD.

Функциональной может быть назначена любая клавиша, кроме спец-клавиш УПР (УС), SHIFT (СС), ФИКС (РУС/ЛАТ), ГРАФ, АЛФ. Коды сканирования функциональных клавиш задаются в специальных таблицах вместе с соответствующими генерируемыми строками. Таких таблиц может быть три:

  • для отдельно нажатых клавиш,
  • для клавиш, нажатых совместно с УПР (УС),
  • для клавиш, нажатых совместно с SHIFT (СС),

причем клавиши во всех таблицах могут быть выбраны разные.

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

Каждая из указанных таблиц имеет следующую структуру:

        ┌───┬───────────────────────────────────────┐
        │ n │ Список кодов сканирования клавиш      │
        ├───┼───────────────────────────────────────┤
        │ L1│ Строка для 1-й клавиши длиной L1 байт │
        ├───┼───────────────────────────────────────┤
        │ L2│ Строка для 2-й клавиши длиной L2 байт │
        ├───┼───────────────────────────────────────┤
        │...│                 . . .                 │
        ├───┼───────────────────────────────────────┤
        │ Ln│ Строка для n-й клавиши длиной Ln байт │
        └───┴───────────────────────────────────────┘

Первый байт таблицы задает число n клавиш, которые будут функциональными, то есть определяет длину списка клавиш.

Список кодов сканирования клавиш включает n байт, при этом значению n=0 соответствует пустая таблица (она будет состоять всего из 1 байта).

Далее в таблице (если она не пустая) располагаются n следующих друг за другом строк, предваряемых байтом длины L1..Ln. При нажатии функциональной клавиши соответствующая строка будет заноситься в буфер клавиатуры.

Адреса таблиц функциональных клавиш могут быть установлены/получены с помощью вектора KBDCTL.

Подпрограмма KBDCTL (0F806H) используется для управления клавиатурой. В зависимости от номера функции, задаваемой в регистре A, она позволяет устанавливать и получать значения следующих параметров:

  • код режима (KBMODE) и байт флагов (KBFLAG) клавиатуры, которые действуют для векторов KBRD и INKEY;
  • константы задержки автоповтора и мигания курсора для вектора KBRD;
  • коды клавиш управления курсором (в том числе при нажатии клавиш УПР и SHIFT) для векторов KBRD и INKEY;
  • функциональные клавиши и соответствующие им последовательности кодов для вектора KBRD.

Режим клавиатуры (KBMODE) описывается состоянием следующих битов:

    D7     – признак  старого распределения специальных клавиш
             для  клавиатуры  MC7007  (при  единичном значении
             этого бита управление MC7007 совпадает с РК-86);
    D1,D0  – определяют тип кодировки клавиатуры:
             00 – альтернативная;
             01 – КОИ8;
             10 – КОИ7/Н2;
             11 – КОИ7/Н1,0.

В байте флагов клавиатуры (KBFLAG) имеется 5 временных флагов, устанавливаемых каждый раз после вызова подпрограмм KBRD, INKEY и NUMKEY, и 3 триггерных флага, устанавливаемых нажатием комбинаций спец-клавиш в подпрограмме KBRD:

а) временные флаги – сигнализируют о нажатии  соответствующих клавиш:
   D0 – нажата клавиша УПР   (УС);
   D1 – нажата клавиша SHIFT (СС);
   D2 – нажата клавиша ФИКС  (РУС/ЛАТ);
   D3 – нажата клавиша АЛФ   (для МС7007);
   D4 – нажата клавиша ГРАФ  (для МС7007);
б) триггерные  флаги – определяют текущий режим ввода:
   D5 – режим CAPS LOCK (1 – большие буквы);
   D6 – режим РУС/ЛАТ   (1 – русские);
   D7 – режим ГРАФ/АЛФ  (1 – псевдографика).

Бит CAPS LOCK действует во всех кодировках, кроме КОИ7/Н2 (там нет больших и малых букв), бит РУС/ЛАТ - во всех кодировках, кроме КОИ7/Н1,Н0, бит ГРАФ/АЛФ — только в альтернативной кодировке и КОИ8.

Путем принудительной установки триггерных флагов пользователь может переводить клавиатуру в требуемое состояние.

При вызове подпрограммы KBDCTL в регистре A указывается номер функции:

A=0 – Установка режима клавиатуры
      На входе:
         E  – код режима  (KBMODE);
         D  – байт флагов (KBFLAG);
A=1 – Получение режима клавиатуры
      На выходе:
         E  – код режима  (KBMODE);
         D  – байт флагов (KBFLAG);
         HL – адрес буфера NUMKEY  с номерами клавиш после
              последнего вызова KBRD, INKEY, NUMKEY;
         A  – число нажатых клавиш в буфере NUMKEY;
         C  – номер последней клавиши в буфере NUMKEY (ес
              ли буфер пуст,  то C=0FFH, и на выходе установлен флаг «Z»);
A=2 – Установка констант задержки
      На входе:
         HL – константа автоповтора;
         DE – константа мигания курсора;
A=3 – Получение констант задержки
      На выходе:
         HL – константа автоповтора;
         DE – константа мигания курсора;
A=4 – Установка кодов клавиш курсора
      На входе:
         C – влево
         B – вправо
         E – вверх
         D – вниз
A=5 – Получение кодов клавиш курсора
      На выходе:
         C – влево
         B – вправо
         E – вверх
         D – вниз
A=6 – Установка кодов клавиш курсора при нажатой УПР
      На входе:
         C – влево  + УПР
         B – вправо + УПР
         E – вверх  + УПР
         D – вниз   + УПР
A=7 – Получение кодов клавиш курсора при нажатой УПР
      На выходе:
         C – влево  + УПР
         B – вправо + УПР
         E – вверх  + УПР
         D – вниз   + УПР
A=8 – Установка кодов клавиш курсора при нажатой SHIFT
      На входе:
         C – влево  + SHIFT
         B – вправо + SHIFT
         E – вверх  + SHIFT
         D – вниз   + SHIFT
A=9 – Получение кодов клавиш курсора при нажатой SHIFT
      На выходе:
         C – влево  + SHIFT
         B – вправо + SHIFT
         E – вверх  + SHIFT
         D – вниз   + SHIFT
A=10 – Установка адреса таблицы функциональных клавиш
       На входе:
          C  – номер сегмента ОЗУ с таблицей,
          HL – адрес таблицы в сегменте
A=11 – Получение адреса таблицы функциональных клавиш
       На выходе:
          C  – номер сегмента ОЗУ с таблицей,
          HL – адрес таблицы в сегменте
A=12 – Установка адреса таблицы функциональных клавиш при
       нажатой УПР 
       На входе:
          C  – номер сегмента ОЗУ с таблицей,
          HL – адрес таблицы в сегменте
A=13 – Получение адреса таблицы функциональных клавиш при
       нажатой УПР 
       На выходе:
          C  – номер сегмента ОЗУ с таблицей,
          HL – адрес таблицы в сегменте
A=14 – Установка адреса таблицы функциональных клавиш при
       нажатой SHIFT 
       На входе:
          C  – номер сегмента ОЗУ с таблицей,
          HL – адрес таблицы в сегменте
A=15 – Получение адреса таблицы функциональных клавиш при
       нажатой SHIFT 
       На выходе:
          C  – номер сегмента ОЗУ с таблицей,
          HL – адрес таблицы в сегменте

Следует заметить, что устанавливаемые коды клавиш курсора действуют как для подпрограммы KBRD, так и для INKEY, а коды функциональных клавиш — только для KBRD, причем приоритет последних выше, то есть если клавиша управления курсором выбрана в качестве функциональной, то при ее нажатии на выходе KBRD будет сформирована строка кодов.

A=16 – Запись символа в буфер KBRD
       На входе:
          C   – код символа;
       На выходе:
          «CY» – признак переполнения буфера
A=17 – Чтение символа из буфера KBRD
       На выходе:
          «CY» – буфер пуст, иначе:
          C   – код символа.
A=18 – Обнуление буфера KBRD
A=19 – Проверка буфера клавиатуры
       На выходе:
          «CY» – буфер пуст, иначе содержит символ(ы).

Сводный перечень функций вектора KBDCTL приведен в Приложении 3.

Подпрограмма KBSTAT (0F812H) возвращает A=0 (и флаг «Z»), если ни одна клавиша не нажата, и A=0FFH (флаг «NZ») — если нажата хотя бы одна клавиша, при этом клавиши УПР (УС), SHIFT (СС), ФИКС (РУС/ЛАТ) не опрашиваются (для клавиатуры MC7007 не опрашиваются также клавиши АЛФ и ГРАФ).

Подпрограмма INKEY (0F81BH) предназначена для опроса кода нажатой клавиши. Код нажатой клавиши возвращается в регистре A, при этом дополнительно устанавливается флаг «CY» в следующих случаях:

  – ни одна клавиша не нажата                    (A=0FFH);
  – нажата только SHIFT (СС) или УПР (УС)        (A=0FFH);
  – нажата недопустимая комбинация спецклавиш    (A=0FFH);
  – нажата единственная клавиша ФИКС (РУС/ЛАТ)   (A=0FEH);
  - нажата единственная клавиша АЛФ  (на МС7007) (A= 0FH);
  - нажата единственная клавиша ГРАФ (на МС7007) (A= 0EH).

В остальных случаях на выходе INKEY формируется признак «NC», а в аккумуляторе — код клавиши с учетом нажатия клавиш УПР (УС), SHIFT (СС), АЛФ и ГРАФ (для МС7007). Кроме того, при определении кода клавиши учитывается текущее состояние байта триггерных флагов клавиатуры (KBFLAG).

Легко видеть, что сохраняется совместимость новой INKEY со старыми версиями (если не анализировать признак «NC»), но, в то же время, обеспечивается ввод с клавиатуры любых символов с кодами от 0 до 0FFH.

Подпрограмма NUMKEY (0F824H) опрашивает клавиатуру с определением номеров (кодов сканирования) нескольких нажатых клавиш и может использоваться для разработки собственных драйверов клавиатуры. Номера нажатых клавиш в порядке возрастания помещаются в специальный внутренний буфер NUMKEY, адрес которого возвращается в регистровой паре HL.

   *00 – 9 цифр.   *16 – . цифр.    2C – М M        42 – Г G
   *01 – 8 цифр.   *17 – , цифр.    2D – DEL        43 – О O
    02              18 – K1        *2E – ИСП (КОМ)  44 – Ь X
    03              19 – 1 !        2F – ПОМ (ПС)   45 – . >
    04 – SHIFT      1A – Ц C        30 – 4 $        46 – : *
   *05 – 4 цифр.    1B – Ы Y        31 – Е E        47 – - =
   *06 – 5 цифр.    1C – Ч ^        32 – П P        48 – 7 '
   *07 – 6 цифр.   *1D – 1 цифр.    33 – И I        49 – Ш [
    08 – АР2       *1E – 2 цифр.    34 – SPACE      4A – Л L
    09 – TAB       *1F – 3 цифр.    35 –  &         4B – Б B
    0A – УПР        20 – K2         36 – ENTER      4C –  '
   *0B – ГРАФ       21 – 2 "        37 – / ?        4D – Э \
   *0C – АЛФ        22 – У U        38 – K4         4E – Х H
   *0D – + цифр.    23 – В W        39 – 5 %        4F – 0
   *0E –  цифр.     24 – С S        3A – Н N        50 – 8 (
   *0F – ВВОД цифр.*25 – 7 цифр.    3B – Р R        51 – Щ ]
    10 – + ;        26 – УСТ        3C – Т T        52 – Д D
    11 – Й J        27 – СБРОС      3D –  )         53 – Ю @
    12 – Ф F        28 – K3         3E –  (         54 – , <
    13 – Я Q        29 – 3 #       *3F –   _        55 – Ж V
    14 – ФИКС       2A – К K        40 – K5         56 – З Z
   *15 – 0 цифр.    2B – А A        41 – 6 &        57 – 9 )

Значком «*» отмечены клавиши, отсутствующие на клавиатуре РК-86.

В регистре A подпрограмма NUMKEY выдает количество нажатых клавиш, а в регистре C — номер нажатой клавиши, записанный в буфере последним (если ни одна клавиша не нажата, то A=0, C=0FFH, и на выходе устанавливается флаг «Z»).

Кроме того, NUMKEY устанавливает пять младших битов в байте (KBFLAG) при нажатии соответствующих клавиш.

На основе подпрограммы NUMKEY разработаны подпрограммы KBRD и INKEY, поэтому после их вызова можно получить текущее состояние буфера NUMKEY с номерами нажатых клавиш (смотри функцию A=1 вектора KBDCTL).

Нумерация клавиш осуществляется в соответствии с их расположением в матрице клавиатуры MC7007 (для РК-86 номера клавиш преобразуются в кодировку MC7007):

Подпрограмма INFAST (0F827H) выполняет быстрое сканирование матрицы клавиатуры с целью определения факта нажатия клавиш управления курсором и спец-клавиш УПР (УС), SHIFT (СС), ФИКС (РУС/ЛАТ).

В регистре A возвращаются признаки нажатия указанных клавиш:

      D7 – курсор вниз,           D3 – резерв,
      D6 – курсор вправо,         D2 – ФИКС  (РУС/ЛАТ),
      D5 – курсор вверх,          D1 – SHIFT (СС),
      D4 – курсор влево,          D0 – УПР   (УС).

Если ни одна из указанных клавиш не нажата, устанавливается флаг «Z».

5. Драйвер мыши

Для поддержки мыши в BIOS имеются два вектора: MOUSE (0F84EH) и MSCTL (0F851H). После вызова указанных векторов все регистры сохраняются, за исключением AF.

Вектор MOUSE предназначен для непосредственного опроса порта мыши (1EH) и возвращает в регистре A его состояние:

D7 – резерв (1)
D6 – резерв (1)
D5 – /правая кнопка
D4 – /левая кнопка
D3 – /вверх
D2 – /вниз
D1 – /вправо
D0 – /влево

Активному состоянию какого-либо разряда соответствует уровень лог.0 (исходное состояние всех разрядов — единичное).

Вектор MSCTL выполняет несколько функций по управлению мышью. Номер функции задается в регистре A перед вызовом подпрограммы 0F851H:

A=0 – Перемещение указателя мыши в окне до нажатия кнопки
      на входе:
         BC  – исходная позиция Y мыши;
         DE  – исходная позиция X мыши;
      на выходе:
         «CY» – признак нахождения исходных значений  X,Y
                вне окна, или признак переполнения буфера сохранения 
                информации под указателем;
      иначе:
         BC  – выходная позиция Y мыши;
         DE  – выходная позиция X мыши;
         A   – код нажатой кнопки:
         80H – нажата левая кнопка;
         40H – нажата правая кнопка.

При вызове функции A=0 на экране появляется указатель мыши, который перемещается до тех пор, пока не нажата хотя бы одна из ее кнопок. Указатель мыши может перемещаться также с помощью клавиш управления курсором; клавиша ВК соответствует нажатию левой кнопки мыши, клавиша АР2 — правой кнопки.

Цвет указателя мыши зависит от установленного режима отображения мыши (смотри ниже) и от текущих цветов фона и переднего плана (смотри описание драйвера «TV-PRO»).

Замечание

Данная функция A=0 использует вектор MOUSE (0F84EH) для опроса состояния мыши. При написании собственной подпрограммы обработки вектора MOUSE (например, в случае использования нестандартной мыши) следует учитывать, что адрес размещения ее кодов должен быть больше 1FFFH, так как она вызывается из ROM1.

A=1 – Установка режима отображения указателя мыши
      На входе:
         C  – код режима:
              D7 – признак  перемещения  по  всему  экрану
                   (при D7=0 – в пределах текущего окна);
              D3 – признак  сохранения  информации  экрана
                   под указателем мыши;
              D2 – признак инверсии (цвета фона и переднего 
                   плана меняются местами);
              D1,D0 – режим наложения указателя:
                      00 – с полной заменой фона и изображения;
                      01 – наложение по ИЛИ  (цветом  переднего 
                           плана закрашиваются те точки экрана, 
                           которым в шаблоне указателя мыши 
                           соответствуют единицы);
                      10 – наложение по И (цветом фона закрашиваются  
                           те  точки экрана,  которым в шаблоне указателя 
                           мыши соответствуют нули);
                      11 – наложение по исключающему ИЛИ (независимо  
                           от текущих цветов фона и переднего плана 
                           инвертируется цвет точек экрана, которым 
                           в шаблоне указателя мыши соответствуют единицы);

Рекомендуемые режимы отображения указателя мыши: по ИЛИ — 09H (89H), или по XOR — 03H (83H).

A=2 – Получение режима отображения указателя мыши
      На выходе:
         C – код режима;
A=3 – Установка размеров указателя мыши
      На входе:
         E – высота указателя мыши в пикселях;
         D – ширина указателя мыши в пикселях;
         C – шаг перемещения мыши по Y;
         B – шаг перемещения мыши по X;
         L – смещение шаблона указателя  мыши  в  пределах
             левого столбца байтов (0..7);
A=4 – Получение размеров указателя мыши
      На выходе:
         E – высота указателя мыши в пикселях;
         D – ширина указателя мыши в пикселях;
         C – шаг перемещения мыши по Y;
         B – шаг перемещения мыши по X;
         L – смещение шаблона указателя  мыши  в  пределах
             левого столбца байтов (0..7);
A=5 – Установка адреса размещения шаблона мыши
      На входе:
         C  – номер сегмента с шаблоном указателя;
         HL – начальный адрес размещения шаблона в сегменте 
              (в пределах сегмента или в пределах страницы ОЗУ);
A=6 – Получение адреса размещения шаблона мыши
      На выходе:
         C  – номер сегмента с шаблоном указателя;
         HL – начальный адрес размещения шаблона в сегменте 
              (в пределах сегмента или в пределах страницы ОЗУ);
A=7 – Установка  адреса  буфера сохранения  информации под
      указателем мыши 
      На входе:
         CBED – номера сегментов для сохранения информации
                экрана под указателем мыши (C – для монохромного 
                и псевдо-цветного режимов доступного  экрана,  
                CB – для 4-цветного режима и 16-цветного режима 
                с групповым кодированием,  CBE – для 8-цветного режима,  
                CBED – для 16-цветного режима);
         HL   – начальный  адрес  буфера  в  сегментах (во
                всех сегментах одинаковый);
A=8 – Получение адреса буфера  сохранения  информации  под
      указателем мыши 
      На выходе:
         CBED – номера сегментов для сохранения информации
                экрана под указателем мыши (C – для монохромного 
                и псевдо-цветного режимов доступного экрана,  
                CB – для 4-цветного  режима  и 16-цветного режима 
                с групповым кодированием,  CBE – для 8-цветного режима,  
                CBED  – для 16-цветного режима);
         HL   – начальный адрес  буфера  в  сегментах  (во
                всех сегментах одинаковый);
A=9 – Получение длины буфера,  необходимой  для сохранения
      информации под указателем мыши 
      На выходе:
         DE – длина буфера, необходимая для сохранения инормации  
              под указателем мыши (одинакова для всех сегментов буфера);
A=10 – Поиск выбранного объекта по базе
       На входе:
          BC – координата Y объекта;
          DE – координата X объекта;
          HL – адрес начала таблицы с описанием базы;
       На выходе:
          «CY» объект не найден,
       иначе:
          A  – порядковый номер объекта (0,1,..);
          HL – адрес начала описания объекта в базе.

Таблица с описанием базы объектов имеет следующую структуру:

    TAB:DB n   ;Число объектов в базе
        ;
        DW x1  ;X,Y левого верхнего угла 0-го объекта
        DB y1
        DW dx1 ;Размеры 0-го объекта
        DB dy1
        ;
        . . .
        DW xn  ;X,Y левого верхнего угла (n-1)-го объекта
        DB yn
        DW dxn ;Размеры (n-1)-го объекта
        DB dyn
 EOFTAB:       ;Конец таблицы
        ;

Первый байт таблицы содержит количество объектов в базе. Далее следует соответствующее число описателей объектов, каждый из которых занимает 6 байт. Заметим, что количество объектов в базе:

n = [ EOFTAB – TAB – 1 ] / 6.

Сводный перечень функций вектора MSCTL приведен в Приложении 4.

Приложение 1. Распределение непереключаемой памяти в режиме «PRO»

   0FFFFH ┌─────────────────────────────────────────────┐
          │                                             │
          │           Резидентная часть BIOS            │
          │                                             │
   0F860H ├─────────────────────────────────────────────┤
          │                                             │
          │            Таблица векторов BIOS            │
          │                                             │
   0F800H ├─────────────────────────────────────────────┤
          │                                             │
          │             Служебный стек BIOS             │
          │                                             │
   0F7C0H ├─────────────────────────────────────────────┤
          │                                             │
          │          Рабочий стек "Orion-Pro"           │
          │                                             │
   0F710H ├─────────────────────────────────────────────┤
          │       Таблица адресов подпрограмм ISR       │
          │                                             │
   0F700H ├─────────────────────────────────────────────┤
          │                                             │
          │          Рабочие ячейки "TV-PRO"            │
          │                                             │
   0F5C0H ├─────────────────────────────────────────────┤
          │                                             │
          │        Оверлейная область "TV-PRO"          │
          │                                             │
   0F3C0H ├─────────────────────────────────────────────┤
          │░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
          │░░░░░░░░░░ Свободная область ОЗУ ░░░░░░░░░░░░│
          │░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
   0F000H ├─────────────────────────────────────────────┤
          │░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
Примечания
  1. Область ОЗУ, отмеченная символами (░), свободна для данных пользователя.
  2. Оверлейная область драйвера дисплея «TV-PRO» может быть освобождена для временного размещения данных пользователя (с помощью функции A=2 вектора 0F85AH) до тех пор, пока указанная область не понадобится драйверу. Программа пользователя может проверить, занял ли драйвер оверлейную область своими данными (с помощью функции A=3 вектора 0F85AH).

Таким образом, участок памяти 0F3C0H..0F5BFH может быть использован в оверлейном режиме совместно с драйвером дисплея «TV-PRO».


Приложение 2. Таблица векторов стандартных подпрограмм в режиме «PRO»

╔════╤════════╤═══════════════════════════════════════════════╗
║F800│ RESET  │ Перезагрузка системы в режиме "Pro"           ║
╠════╪════════╪═══════════════════════════════════════════════╣
║F803│ KBRD   │ Ввод символа с клавиатуры                     ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║                             │ A - код нажатой клавиши       ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║F806│ KBDCTL │ Управление клавиатурой                        ║
╟────┴────────┴───────────────────────────────────────────────╢
║ A - номер функции, BC, DE, HL - параметры                   ║
╠════╤════════╤═══════════════════════════════════════════════╣
║F809│ TVC    │ Вывод символа на экран                        ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ C - код символа             │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║F80C│ SCRCTL │ Управление экраном                            ║
╟────┴────────┴───────────────────────────────────────────────╢
║ A - номер функции, BC, DE, HL - параметры                   ║
╠════╤════════╤═══════════════════════════════════════════════╣
║F80F│ SYMCTL │ Управление выводом символа и курсора TV-PRO   ║
╟────┴────────┴───────────────────────────────────────────────╢
║ A - номер функции, BC, DE, HL - параметры                   ║
╠════╤════════╤═══════════════════════════════════════════════╣
║F812│ KBSTAT │ Опрос состояния клавиатуры                    ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║                             │ A=0FFH - нажата, A=0,"Z"- нет ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║F815│ HEX    │ Вывод байта в шестнадцатиричном формате       ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ A - выводимый байт          │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║F818│ MSG    │ Вывод сообщения на экран                      ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ HL - адрес начала сообщения │                               ║
║      (00H - конец сообщения)│                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║F81B│ INKEY  │ Опрос кода нажатой клавиши                    ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║                             │  A   - код нажатой клавиши    ║
║                             │ "CY" - дополнительный флаг    ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║F81E│ RCUR   │ Получение позиции курсора                     ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║                             │ H - символьная позиция Y      ║
║                             │ L - символьная позиция X      ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║F821│ PRINT  │ Управление печатающим устройством             ║
╟────┴────────┴───────────────────────────────────────────────╢
║               A=0 - вывод символа на печать                 ║
╟─────────────────────────────┬───────────────────────────────╢
║ C - код печатаемого символа │ А= 0 - символ принят          ║
║                             │ A<>0 - принтер не готов:      ║
║                             │        D0=1 - ERROR           ║
║                             │        D1=1 - нет BUSY        ║
╟─────────────────────────────┴───────────────────────────────╢
║               A=1 - чтение байта состояния принтера         ║
╟─────────────────────────────┬───────────────────────────────╢
║                             │ А= 0 - символ принят          ║
║                             │ A<>0 - принтер не готов       ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║F824│ NUMKEY │ Опрос номеров нажатых клавиш                  ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║                             │  HL - адрес начала очереди    ║
║                             │  A  - число нажатых клавиш    ║
║                             │  C  - номер последней клавиши ║
║                             │       (C=0FFH - нет нажатых,  ║
║                             │       при этом уст.флаг "Z")  ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║F827│ INFAST │ Быстрый опрос клавиш курсора и спецклавиш     ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║                             │  A - признаки клавиш:         ║
║                             │      D7 - курсор вниз         ║
║                             │      D6 - курсор вправо       ║
║                             │      D5 - курсор ввверх       ║
║                             │      D4 - курсор влево        ║
║                             │      D2 - ФИКС  (РУС/ЛАТ)     ║
║                             │      D1 - SHIFT (СС)          ║
║                             │      D0 - УПР   (УС)          ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║F82A│ GRAPH  │ Вывод графики                                 ║
╟────┴────────┴───────────────────────────────────────────────╢
║ A - номер функции, BC, DE, HL - параметры                   ║
╠════╤════════╤═══════════════════════════════════════════════╣
║F82D│        │ Резервный вектор TV-PRO                       ║
╟────┴────────┴───────────────────────────────────────────────╢
║ A - номер функции, BC, DE, HL - параметры                   ║
╠════╤════════╤═══════════════════════════════════════════════╣
║F830│ PFILL  │ Заполнение заданной страницы ОЗУ константой   ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ A  - номер страницы ОЗУ     │                               ║
║ C  - записываемый байт      │                               ║
║ HL - начальный адрес        │                               ║
║ DE - длина                  │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║F833│ MOVBL  │ Перемещение блока из одной страницы в другую  ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ A  - старший ниббл - откуда │                               ║
║      младший ниббл - куда   │                               ║
║ HL - начальный адрес: откуда│                               ║
║ DE - начальный адрес: куда  │                               ║
║ BC - количество байт        │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║F836│ RRAM   │ Чтение байта из страницы ОЗУ                  ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ A  - номер страницы         │ C - считанный байт            ║
║ HL - адрес                  │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║F839│ WRAM   │ Запись байта в страницу ОЗУ                   ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ A  - номер страницы         │                               ║
║ HL - адрес                  │                               ║
║ C  - записываемый байт      │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║F83C│ WCUR   │ Установка позиции курсора                     ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ H - символьная позиция Y    │                               ║
║ L - символьная позиция X    │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║F83F│ SOUND  │ Формирование звукового сигнала                ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ BC - длительность, ms       │                               ║
║ DE - частота, Hz            │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║F842│ RDWIN  │ Сохранение состояния портов диспетчера в ОЗУ  ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ HL - Адрес буфера (6 байт): │                               ║
║      порт 04H - сегм.окна 0 │                               ║
║      порт 05H - сегм.окна 1 │                               ║
║      порт 06H - сегм.окна 2 │                               ║
║      порт 08H - стр.ОЗУ     │                               ║
║      порт 09H - сегм. ROM2  │                               ║
║      порт 0AH - диспетчер   │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║F845│ WRWIN  │ Восстановление портов диспетчера из ОЗУ       ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ HL - Адрес буфера (6 байт)  │                               ║
║      (аналогично RDWIN)     │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║F848│ JPWIN  │ Установка окон и диспетчера с передачей упр.  ║
╟────┴────────┴───────────────────────────────────────────────╢
║               A=0FFH - установка адреса таблиц состояния    ║
╟─────────────────────────────┬───────────────────────────────╢
║ HL - адрес блока таблиц по  │                               ║
║      8 байт каждая:         │                               ║
║      порт 04H - сегм.окна 0 │                               ║
║      порт 05H - сегм.окна 1 │                               ║
║      порт 06H - сегм.окна 2 │                               ║
║      порт 08H - стр.ОЗУ     │                               ║
║      порт 09H - сегм. ROM2  │                               ║
║      порт 0AH - диспетчер   │                               ║
║      2 байта  - адрес JP... │                               ║
╟─────────────────────────────┴───────────────────────────────╢
║               A<0FFH - установка портов по номеру таблицы   ║
╟─────────────────────────────┬───────────────────────────────╢
║ A - номер таблицы (0..N)    │ JP по адресу в конце таблицы  ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║F84B│ OPCLW  │ Открыть/закрыть окно                          ║
╟────┴────────┴───────────────────────────────────────────────╢
║               A=0 - открыть окно                            ║
╟─────────────────────────────┬───────────────────────────────╢
║ C - номер окна:             │                               ║
║     0 - окно 0 ОЗУ;         │                               ║
║     1 - окно 1 ОЗУ;         │                               ║
║     2 - окно 2 ОЗУ;         │                               ║
║     3 - окно ROM2;          │                               ║
║     4 - окно ROM1;          │                               ║
║ B - номер сегмента          │                               ║
╟─────────────────────────────┴───────────────────────────────╢
║               A=1 - закрыть окно                            ║
╟─────────────────────────────┬───────────────────────────────╢
║ C - номер окна              │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║F84E│ MOUSE  │ Опрос состояния порта мыши                    ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║                             │ A - байт состояния порта мыши ║
║                             │     D7 - не используется      ║
║                             │     D6 - не используется      ║
║                             │     D5 - /правая кнопка ─┐┌─  ║
║                             │     D4 - /левая кнопка   └┘   ║
║                             │     D3 - /вверх               ║
║                             │     D2 - /вниз                ║
║                             │     D1 - /вправо              ║
║                             │     D0 - /влево               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║F851│ MSCTL  │ Управление мышью                              ║
╟────┴────────┴───────────────────────────────────────────────╢
║ A - номер функции, BC, DE, HL - параметры                   ║
╠════╤════════╤═══════════════════════════════════════════════╣
║F854│ RDSEC  │ Чтение сектора с флоппи-диска                 ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ HL - начальный адрес буфера │ А - байт состояния            ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║F857│ WRSEC  │ Запись сектора на флоппи-диск                 ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ HL - начальный адрес буфера │ А - байт состояния            ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║F85A│ SYSCTL │ Управление системой                           ║
╟────┴────────┴───────────────────────────────────────────────╢
║               A=0 - инициализация ячеек "ROM1-BIOS"         ║
╟─────────────────────────────────────────────────────────────╢
║               A=1 - отключение всех окон                    ║
╟─────────────────────────────────────────────────────────────╢
║               A=2 - освобождение оверлейной памяти "TV-PRO" ║
╟─────────────────────────────────────────────────────────────╢
║               A=3 - проверка оверлейной памяти "TV-PRO"     ║
╟─────────────────────────────┬───────────────────────────────╢
║                             │ "Z"  - память занята "TV-PRO" ║
║                             │ "NZ" - память свободна.       ║
╠════╤════════╤═══════════════════════════════════════════════╣
║F85D│ VERS   │ Получение номера версии "ROM1" и "ROM2"       ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║                             │ H  - номер версии "ROM1"      ║
║                             │ L  - номер версии "ROM2"      ║
╚═════════════════════════════╧═══════════════════════════════╝

Приложение 3. Функции вектора управления клавиатурой KBDCTL (0F806H)

╔════╤════════╤═══════════════════════════════════════════════╗
║A= 0│ SETKBM │ Установка режима клавиатуры                   ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ E - код режима              │                               ║
║ D - байт флагов             │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A= 1│ GETKBM │ Получение режима клавиатуры                   ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║                             │ E  - код режима               ║
║                             │ D  - байт флагов              ║
║                             │ HL - адрес буфера NUMKEY      ║
║                             │ A  - число клавиш в буфере    ║
║                             │ С  - номер последней клавиши  ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A= 2│ SETKTM │ Установка констант задержки клавиатуры        ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ HL - автоповтора            │                               ║
║ DE - мигания курсора        │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A= 3│ GETKTM │ Получение констант задержки клавиатуры        ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║                             │ HL - константа автоповтора    ║
║                             │ DE - константа мигания курсора║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A= 4│ SETCCD │ Установка кодов клавиш курсора                ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ CBED - коды  ў Ў ° ∙        │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A= 5│ GETCCD │ Получение кодов клавиш курсора                ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║                             │ CBED - коды  ў Ў ° ∙          ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A= 6│ SETCCT │ Установка кодов клавиш курсора + УПР          ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ CBED - коды  ў Ў ° ∙ + УПР  │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A= 7│ GETCCT │ Получение кодов клавиш курсора + УПР          ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║                             │ CBED - коды  ў Ў ° ∙  + УПР   ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A= 8│ SETCSF │ Установка кодов клавиш курсора + SHIFT        ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ CBED - коды  ў Ў ° ∙ + SHIFT│                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A= 9│ GETCSF │ Получение кодов клавиш курсора + SHIFT        ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║                             │ CBED - коды  ў Ў ° ∙  + SHIFT ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=10│ SETFCD │ Установка адреса таблицы функциональных клавиш║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ C  - номер сегмента ОЗУ     │                               ║
║ HL - адрес табл. в сегменте │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=11│ GETFCD │ Получение адреса таблицы функциональных клавиш║
╟────┴────────┴───────────────┬───────────────────────────────╢
║                             │ C  - номер сегмента ОЗУ       ║
║                             │ HL - адрес таблицы в сегменте ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=12│ SETFCT │ Установка таблицы функциональных клавиш + УПР ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ C  - номер сегмента ОЗУ     │                               ║
║ HL - адрес табл. в сегменте │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=13│ GETFCT │ Получение таблицы функциональных клавиш + УПР ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║                             │ C  - номер сегмента ОЗУ       ║
║                             │ HL - адрес таблицы в сегменте ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=14│ SETFSF │ Установка таблицы функциональных клавиш +SHIFT║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ C  - номер сегмента ОЗУ     │                               ║
║ HL - адрес в сегменте       │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=15│ GETFSF │ Получение таблицы функциональных клавиш +SHIFT║
╟────┴────────┴───────────────┬───────────────────────────────╢
║                             │ C  - номер сегмента ОЗУ       ║
║                             │ HL - адрес таблицы в сегменте ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=16│ WRBUF  │ Запись кода клавиши в буфер клавиатуры        ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ C  - код                    │"CY" - буфер заполнен          ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=17│ RDBUF  │ Чтение кода клавиши из буфера клавиатуры      ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║                             │ C   - код                     ║
║                             │"CY" - буфер пуст              ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=18│ CLRBUF │ Очистка буфера клавиатуры                     ║
╠════╪════════╪═══════════════════════════════════════════════╣
║A=19│ TSTBUF │ Проверка буфера клавиатуры                    ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║                             │"CY" - буфер пуст              ║
╚═════════════════════════════╧═══════════════════════════════╝

Приложение 4. Функции вектора управления мышью MSCTL (0F851H)

╔════╤════════╤═══════════════════════════════════════════════╗
║A= 0│ MSWND  │ Перемещение мыши в окне до нажатия кнопки     ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ BC - исходная координата Y  │"CY" - исходные X, Y вне окна, ║
║ DE - исходная координата X  │       или переполнение буфера ║
║                             │       сохранения   информации ║
║                             │       под указателем          ║
║                             │ иначе:                        ║
║                             │ BC  - выходная координата Y   ║
║                             │ DE  - выходная координата X   ║
║                             │ A   - код нажатых кнопок мыши:║
║                             │     80H - нажата левая кнопка,║
║                             │     40H - нажата правая кнопка║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A= 1│ SETMSM │ Установка режима отображения мыши             ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ C  - код режима:            │                               ║
║ C7 - признак вывода мыши на │                               ║
║      весь экран             │                               ║
║ C3 - признак сохранения ин- │                               ║
║      формации  экрана  под  │                               ║
║      указателем мыши        │                               ║
║ С2 - признак инверсии цветов│                               ║
║ C1,C0 - режим наложения:    │                               ║
║      00 - с полной заменой  │                               ║
║      01 - по OR             │                               ║
║      10 - по AND            │                               ║
║      11 - по XOR            │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A= 2│ GETMSM │ Получение режима отображения мыши             ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║                             │ C  - код режима               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A= 3│ SETMSZ │ Установка размеров указателя мыши             ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ E  - высота указателя мыши  │                               ║
║ D  - ширина указателя мыши  │                               ║
║ C  - шаг перемещения по Y   │                               ║
║ B  - шаг перемещения по X   │                               ║
║ L  - смещение шаблона в ле- │                               ║
║      вом столбце байтов     │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A= 4│ GETMSZ │ Получение размеров указателя мыши             ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║                             │ E  - высота указателя мыши    ║
║                             │ D  - ширина указателя мыши    ║
║                             │ C  - шаг перемещения по Y     ║
║                             │ B  - шаг перемещения по X     ║
║                             │ L  - смещение шаблона в ле-   ║
║                             │      вом столбце байтов       ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A= 5│ SETMSP │ Установка адреса шаблона мыши                 ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ C  - номер сегмента ОЗУ,    │                               ║
║ HL - адрес начала шаблона в │                               ║
║      сегменте               │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A= 6│ GETMSP │ Получение адреса шаблона мыши                 ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║                             │ C  - номер сегмента ОЗУ,      ║
║                             │ HL - адрес начала шаблона в   ║
║                             │      сегменте                 ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A= 7│ SETMBF │ Установка буфера сохранения инф.под указателем║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ CBED - номера сегментов ОЗУ │                               ║
║        для сохранения;      │                               ║
║ HL   - адрес начала буфера  │                               ║
║        в сегментах;         │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A= 8│ GETMBF │ Получение буфера сохранения инф.под указателем║
╟────┴────────┴───────────────┬───────────────────────────────╢
║                             │ CBED - номера сегментов ОЗУ   ║
║                             │        для сохранения;        ║
║                             │ HL   - адрес начала буфера    ║
║                             │        в сегментах;           ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A= 9│ GETMLN │ Получение длины буфера для сохранения инф.    ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║                             │ DE - требуемая длина буфера   ║
║                             │      для сохранения информа-  ║
║                             │      ции под указателем;      ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=10│ SRCMS  │ Поиск выбранного объекта по базе              ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ BC - Y объекта              │"CY"- объект не найден в базе, ║
║ DE - X объекта              │      иначе:                   ║
║ HL - адрес таблицы объектов │ A  - порядковый номер объекта,║
║                             │ HL - адрес начала его описания║
╚═════════════════════════════╧═══════════════════════════════╝

Приложение 5. Перечень функций драйвера графического дисплея

1. Вектор управления экраном SCRCTL (0F80CH)

╔════╤════════╤═══════════════════════════════════════════════╗
║A= 0│ SETDM  │ Установка режима доступного экрана            ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ C - номер режима            │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A= 1│ GETDM  │ Получение режима доступного экрана            ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║                             │ C - номер режима              ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A= 2│ SETVM  │ Установка режима видимого экрана              ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ C - номер режима            │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A= 3│ GETVM  │ Получение режима видимого экрана              ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║                             │ C - номер режима              ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A= 4│ SETDS  │ Установка номера доступного экрана            ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ C - номер экрана            │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A= 5│ GETDS  │ Получение номера доступного экрана            ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║                             │ C - номер экрана              ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A= 6│ SETVS  │ Установка номера видимого экрана              ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ C - номер экрана            │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A= 7│ GETVS  │ Получение номера видимого экрана              ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║                             │ C - номер экрана              ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A= 8│ OFFVID │ Выключение изображения видимого экрана        ║
╠════╪════════╪═══════════════════════════════════════════════╣
║A= 9│ ONVID  │ Включение изображения видимого экрана         ║
╠════╪════════╪═══════════════════════════════════════════════╣
║A=10│ SETBKG │ Установка текущего цвета фона                 ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ C - код цвета фона          │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=11│ GETBKG │ Получение текущего цвета фона                 ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║                             │ C - код цвета фона            ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=12│ SETCOL │ Установка текущего цвета изображения          ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ C - код цвета изображения   │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=13│ GETCOL │ Получение текущего цвета изображения          ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║                             │ C - код цвета изображения     ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=14│ SETPAL │ Установка палитры видимого экрана             ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ C - код палитры             │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=15│ GETPAL │ Получение палитры видимого экрана             ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║                             │ C - код палитры               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=16│ SETWND │ Установка параметров текущего окна вывода     ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ C  - смещение левого верхне-│ "CY" - признак ошибки входных ║
║      го угла окна по Y;     │        параметров             ║
║ DE - смещение левого верхне-│                               ║
║      го угла окна по X;     │                               ║
║ B  - высота окна;           │                               ║
║ HL - ширина окна.           │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=17│ GETWND │ Получение параметров текущего окна вывода     ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║                             │ C  - смещение левого верхне-  ║
║                             │      го угла окна по Y;       ║
║                             │ DE - смещение левого верхне-  ║
║                             │      го угла окна по X;       ║
║                             │ B  - высота окна;             ║
║                             │ HL - ширина окна.             ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=18│ CLRWND │ Очистка окна цветом фона                      ║
╠════╪════════╪═══════════════════════════════════════════════╣
║A=19│ SETWBF │ Установка адреса буфера сохранения окна       ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ CBED - номера сегментов ОЗУ │                               ║
║        для сохранения окна; │                               ║
║ HL - начальный адрес разме- │                               ║
║      щения данных в сегмен- │                               ║
║      тах  (во всех одинако- │                               ║
║      вый).                  │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=20│ GETWBF │ Получение адреса буфера сохранения окна       ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║                             │ CBED - номера сегментов ОЗУ   ║
║                             │        для сохранения окна;   ║
║                             │ HL - начальный адрес разме-   ║
║                             │      щения данных в сегмен-   ║
║                             │      тах  (во всех одинако-   ║
║                             │      вый).                    ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=21│ GETWLN │ Определение длины буфера для сохранения окна  ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║                             │ DE - длина буфера (для всех   ║
║                             │      сегментов одинакова)     ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=22│ SAVWND │ Сохранение содержимого текущего окна          ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ C=0/0FFH -флаг сдвига буфера│ "CY" - переполнение буфера    ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=23│ RSTWND │ Восстановление содержимого текущего окна      ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ C=0/0FFH -флаг сдвига буфера│ "CY" - признак выхода за пре- ║
║                             │        делы буфера            ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=24│ SCRLUP │ Скроллинг содержимого окна вверх              ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ H - высота скроллируемой    │ "CY" - признак ошибки входных ║
║     части окна;             │        параметров             ║
║ L - величина сдвига окна    │                               ║
║     (высота строки);        │                               ║
║ C - смещение скролируемой   │                               ║
║     части окна сверху;      │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=25│ SCRLDN │ Скроллинг содержимого окна вниз               ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ H - высота скроллируемой    │ "CY" - признак ошибки входных ║
║     части окна;             │        параметров             ║
║ L - величина сдвига окна    │                               ║
║     (высота строки);        │                               ║
║ C - смещение скролируемой   │                               ║
║     части окна сверху;      │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=26│ CLREOL │ Очистка цветом фона до конца строки           ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ BC - смещение очищаемой час-│ "CY" - строка вне окна        ║
║      ти строки по Y (B=0);  │                               ║
║ DE - смещение очищаемой час-│                               ║
║      ти строки по X;        │                               ║
║ L  - высота очищаемой строки│                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=27│ CLREOW │ Очистка цветом фона до конца окна             ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ BC - смещение очищаемой час-│ "CY" - строка вне окна        ║
║      ти строки по Y (B=0);  │                               ║
║ DE - смещение очищаемой час-│                               ║
║      ти строки по X;        │                               ║
║ L  - высота очищаемой строки│                               ║
╚═════════════════════════════╧═══════════════════════════════╝

2. Вектор управления выводом символа и курсора SYMCTL (0F80FH)

╔════╤════════╤═══════════════════════════════════════════════╗
║A= 0│ TVSYM  │ Вывод символа в очередную позицию курсора     ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ C - код символа             │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A= 1│ OUTSYM │ Вывод символа в заданную позицию окна         ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ BC - графическая позиция Y  │ "CY" - символ вне окна        ║
║      левого верхнего угла   │                               ║
║      символа;               │                               ║
║ DE - графическая позиция X  │                               ║
║      левого верхнего угла   │                               ║
║      символа;               │                               ║
║ L  - код символа;           │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A= 2│ OUTCUR │ Отображение курсора в заданной позиции окна   ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ BC - графическая позиция ку-│ "CY" - курсор вне окна        ║
║      рсора по Y;            │                               ║
║ DE - графическая позиция ку-│                               ║
║      рсора по X;            │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A= 3│ ERACUR │ Стирание курсора в заданной позиции окна      ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ BC - графическая позиция ку-│ "CY" - курсор вне окна        ║
║      рсора по Y;            │                               ║
║ DE - графическая позиция ку-│                               ║
║      рсора по X;            │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A= 4│ CTRLFN │ Выполнить управляющую функцию                 ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║  C - Номер функции:         │                               ║
║  0 - Home                   │                               ║
║  1 - Left                   │                               ║
║  2 - Right                  │                               ║
║  3 - Up                     │                               ║
║  4 - Down                   │                               ║
║  5 - Tab [8]                │                               ║
║  6 - Carriage Return        │                               ║
║  7 - Line Feed              │                               ║
║  8 - Back Space             │                               ║
║  9 - Set Window             │                               ║
║      E = X, D = Y,          │                               ║
║      L = Ширина, H = Высота │                               ║
║ 10 - Clear Window           │                               ║
║ 11 - Clear End Of Window    │                               ║
║ 12 - Clear End Of Line      │                               ║
║ 13 - Scroll Up              │                               ║
║ 14 - Scroll Down            │                               ║
║ 15 - Insert Line            │                               ║
║ 16 - Delete Line            │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A= 5│ SETCUR │ Установка символьной позиции курсора          ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ H - номер позиции по Y;     │                               ║
║ L - номер позиции по X;     │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A= 6│ GETCUR │ Получение позиции курсора                     ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║                             │ H - символьная позиция по Y;  ║
║                             │ L - символьная позиция по X;  ║
║                             │ BC - графическая позиция Y;   ║
║                             │ DE - графическая позиция X;   ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A= 7│ SETSM  │ Установка режима вывода символов              ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ C  - код режима:            │                               ║
║ С6 - разрешение скроллинга; │                               ║
║ С5 - разрешение автоперевода│                               ║
║      строки;                │                               ║
║ C4 - разрешение управляющих │                               ║
║      функций 00H..1FH;      │                               ║
║ C2 - признак инверсии;      │                               ║
║ C1,C0 - режим наложения:    │                               ║
║      00 - с полной заменой; │                               ║
║      01 - по OR;            │                               ║
║      10 - по AND;           │                               ║
║      11 - по XOR;           │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A= 8│ GETSM  │ Получение режима вывода символов              ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║                             │ C - код режима                ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A= 9│ SETSSZ │ Установка размеров графических символов       ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ D - ширина символа;         │                               ║
║ E - высота символа;         │                               ║
║ B - шаг вывода символов по  │                               ║
║     X;                      │                               ║
║ C - шаг вывода символов по  │                               ║
║     Y;                      │                               ║
║ L - смещение левого столбца │                               ║
║     битов  шаблона в  левом │                               ║
║     столбце байтов 0..7;    │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=10│ GETSSZ │ Получение размеров графических символов       ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║                             │ D - ширина символа;           ║
║                             │ E - высота символа;           ║
║                             │ B - шаг вывода символов по    ║
║                             │     X;                        ║
║                             │ C - шаг вывода символов по    ║
║                             │     Y;                        ║
║                             │ L - смещение левого столбца   ║
║                             │     битов  шаблона в  левом   ║
║                             │     столбце байтов 0..7;      ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=11│ SETCHG │ Установка адреса знакогенератора              ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ C  - номер сегмента ОЗУ со  │                               ║
║      знакогенератором;      │                               ║
║ HL - адрес начала ЗГ в пре- │                               ║
║      делах сегмента ОЗУ;    │                               ║
║ DE - шаг шаблонов в байтах; │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=12│ GETCHG │ Получение адреса знакогенератора              ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║                             │ C  - номер сегмента ОЗУ со    ║
║                             │      знакогенератором;        ║
║                             │ HL - адрес начала ЗГ в пре-   ║
║                             │      делах сегмента ОЗУ;      ║
║                             │ DE - шаг шаблонов в байтах;   ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=13│ UNPCHG │ Распаковка стандартного знакогенератора       ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ C  - номер сегмента для рас-│ DE - длина знакогенератора с  ║
║      паковки;               │      учетом длины шаблона ку- ║
║ HL - начальный адрес ЗГ в   │      рсора (если B6=1);       ║
║      сегменте;              │ "CY" - признак переполнения   ║
║ B  - код распаковки:        │                               ║
║ B7 - признак активизации ЗГ │                               ║
║      после распаковки (и ус-│                               ║
║      тановки курсора в виде │                               ║
║      черточки для B6=1);    │                               ║
║ B6 - признак добавления  в  │                               ║
║      конец ЗГ шаблона стан- │                               ║
║      дартного курсора;      │                               ║
║ B3 - признак высоких букв;  │                               ║
║ B2 - признак широких букв;  │                               ║
║ B1,B0 - кодировка:          │                               ║
║      00 - ALT;              │                               ║
║      01 - КОИ-8;            │                               ║
║      10 - КОИ-7/Н2;         │                               ║
║      11 - КОИ-7/Н1;         │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=14│ SETСM  │ Установка режима вывода курсора               ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ C  - код режима:            │                               ║
║ С6 - вывод курсора при выво-│                               ║
║      де символа в TVC;      │                               ║
║ С5 - вывод курсора при вводе│                               ║
║      с клавиатуры в KBRD    │                               ║
║      (C5=C6=1 запрещено);   │                               ║
║ С4 - мигание при вводе с    │                               ║
║      клавиатуры в KBRD;     │                               ║
║ C3 - признак сохранения ин- │                               ║
║      формации под курсором; │                               ║
║ C2 - признак инверсии;      │                               ║
║ C1,C0 - режим наложения:    │                               ║
║      00 - с полной заменой; │                               ║
║      01 - по OR;            │                               ║
║      10 - по AND;           │                               ║
║      11 - по XOR;           │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=15│ GETCM  │ Получение режима вывода курсора               ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║                             │ C - код режима                ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=16│ SETCSZ │ Установка размеров графического курсора       ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ D - ширина курсора;         │                               ║
║ E - высота курсора;         │                               ║
║ B - смещение по X относите- │                               ║
║     льно графической пози-  │                               ║
║     ции курсора;            │                               ║
║ C - смещение по Y относите- │                               ║
║     льно графической пози-  │                               ║
║     ции курсора;            │                               ║
║ L - смещение шаблона курсора│                               ║
║     в левом  столбце байтов │                               ║
║     0..7;                   │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=17│ GETCSZ │ Получение размеров графического курсора       ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║                             │ D - ширина курсора;           ║
║                             │ E - высота курсора;           ║
║                             │ B - смещение по X относите-   ║
║                             │     льно графической пози-    ║
║                             │     ции курсора;              ║
║                             │ C - смещение по Y относите-   ║
║                             │     льно графической пози-    ║
║                             │     ции курсора;              ║
║                             │ L - смещение шаблона курсора  ║
║                             │     в лев.столбце байтов 0..7;║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=18│ SETCRP │ Установка адреса шаблона курсора              ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ C - номер сегмента шаблона; │                               ║
║ HL - адрес начала шаблона в │                               ║
║      пределах сегмента;     │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=19│ GETCRP │ Получение адреса шаблона курсора              ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║                             │ C - номер сегмента шаблона;   ║
║                             │ HL - адрес начала шаблона в   ║
║                             │      пределах сегмента;       ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=20│ SETCBF │ Установка адреса буфера сохр.инф.под курсором ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ CBED - номера сегментов ОЗУ │                               ║
║        для сохранения;      │                               ║
║ HL - адрес начала буфера в  │                               ║
║      сегментах;             │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=21│ GETCBF │ Получение адреса буфера сохр.инф.под курсором ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║                             │ CBED - номера сегментов ОЗУ   ║
║                             │        для сохранения;        ║
║                             │ HL - адрес начала буфера в    ║
║                             │      сегментах;               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=22│ GETCLN │ Определение длины буфера для курсора          ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║                             │ DE - требуемая длина буфера   ║
║                             │      для сохранения информа-  ║
║                             │      ции под курсором;        ║
╚═════════════════════════════╧═══════════════════════════════╝

=== 3. Вектор вывода графики GRAPH (0F82AH) ==-

╔════╤════════╤═══════════════════════════════════════════════╗
║A= 0│ PSETC  │ Засветка точки заданным цветом                ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ BC - координата Y;          │ "CY" - точка вне окна         ║
║ DE - координата X;          │                               ║
║ L  - код цвета;             │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A= 1│ PSET   │ Засветка точки текущим цветом изображения     ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ BC - координата Y;          │ "CY" - точка вне окна         ║
║ DE - координата X;          │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A= 2│ PRESET │ Гашение точки текущим цветом фона             ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ BC - координата Y;          │ "CY" - точка вне окна         ║
║ DE - координата X;          │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A= 3│ PXOR   │ Инверсия точки                                ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ BC - координата Y;          │ "CY" - точка вне окна         ║
║ DE - координата X;          │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A= 4│ PCOL   │ Получение кода цвета точки                    ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ BC - координата Y;          │ "CY" - точка вне окна;        ║
║ DE - координата X;          │ "NZ" - точка засвечена  (для  ║
║                             │        реж.группового кодир.) ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A= 5│ SETLXY │ Установка координат начала линии              ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ BC - координата Y;          │                               ║
║ DE - координата X;          │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A= 6│ GETLXY │ Получение координат начала линии              ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║                             │ BC - координата Y;            ║
║                             │ DE - координата X;            ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A= 7│ LINE   │ Вывод линии заданным цветом                   ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ BC - координата Y конца ли- │                               ║
║      нии;                   │                               ║
║ DE - координата X конца ли- │                               ║
║      нии;                   │                               ║
║ L  - код цвета;             │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A= 8│ LINX   │ Вывод линии с инверсией                       ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ BC - координата Y конца ли- │                               ║
║      нии;                   │                               ║
║ DE - координата X конца ли- │                               ║
║      нии;                   │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A= 9│ LINP   │ Вывод пунктирной линии                        ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ BC - координата Y конца ли- │                               ║
║      нии;                   │                               ║
║ DE - координата X конца ли- │                               ║
║      нии;                   │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=10│ SETLM  │ Установка режима вывода пунктирной линии      ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ C - код режима:             │                               ║
║ C2 - признак инверсии;      │                               ║
║ C1,C0 - режим наложения:    │                               ║
║      00 - с полной заменой; │                               ║
║      01 - по OR;            │                               ║
║      10 - по AND;           │                               ║
║      11 - по XOR;           │                               ║
║ HL - маска линии;           │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=11│ GETLM  │ Получение режима вывода пунктирной линии      ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║                             │ C - код режима;               ║
║                             │ HL - маска линии;             ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=12│ RECTAN │ Вывод прямоугольника (рамки) заданным цветом  ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ BC - Y одного из углов;     │ "CY" - прямоугольник вне окна ║
║ DE - X одного из углов;     │                               ║
║ L  - код цвета;             │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=13│ RECTXR │ Вывод прямоугольника (рамки) инверсией /XOR/  ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ BC - Y одного из углов;     │ "CY" - прямоугольник вне окна ║
║ DE - X одного из углов;     │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=14│ BAR    │ Вывод столбца, закрашенного заданным цветом   ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ BC - Y одного из углов;     │ "CY" - столбец вне окна       ║
║ DE - X одного из углов;     │                               ║
║ L  - код цвета;             │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=15│ CIRCLE │ Вывод окружности заданным цветом              ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ BC - координата Y центра;   │                               ║
║ DE - координата X центра;   │                               ║
║ H  - радиус по X;           │                               ║
║ L  - код цвета;             │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=16│ FILSHP │ Заполнение ограниченной области               ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ BC - координата Y начала;   │ "CY" - начальная точка нахо-  ║
║ DE - координата X начала;   │        дится вне окна         ║
║ H  - код цвета границы;     │                               ║
║ L  - код цвета заполнения;  │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=17│ SETFM  │ Установить режим заполнения                   ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ C  - код режима:            │                               ║
║      0 - вверх/вниз;        │                               ║
║      1 - вправо/влево;      │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=18│ GETFM  │ Получить режим заполнения                     ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║                             │ C  - код режима:              ║
║                             │      0 - вверх/вниз;          ║
║                             │      1 - вправо/влево;        ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=19│ GETIMA │ Перенос спрайта с экрана в буфер              ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ BC - координата Y спрайта;  │ "CY","Z"  - выход за пределы  ║
║ DE - координата X спрайта;  │             окна;             ║
║ H  - высота спрайта;        │ "CY","NZ" - переполнение бу-  ║
║ L  - ширина спрайта;        │             фера.             ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=20│ PUTIMA │ Перенос спрайта из буфера на экран            ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ BC - координата Y спрайта;  │ "CY","Z"  - выход за пределы  ║
║ DE - координата X спрайта;  │             окна;             ║
║ H  - высота спрайта;        │ "CY","NZ" - выход за пределы  ║
║ L  - ширина спрайта;        │             буфера;           ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=21│ SETIBF │ Установка адреса буфера для сохранения спрайта║
╟────┴────────┴───────────────┬───────────────────────────────╢
║ CBED - номера сегментов ОЗУ │                               ║
║        для сохранения;      │                               ║
║ HL - адрес начала буфера в  │                               ║
║      сегментах;             │                               ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=22│ GETIBF │ Поучение адреса буфера для сохранения спрайта ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║                             │ CBED - номера сегментов ОЗУ   ║
║                             │        для сохранения спрайта;║
║                             │ HL - начальный адрес разме-   ║
║                             │      щения данных в сегмен-   ║
║                             │      тах  (во всех одинако-   ║
║                             │      вый).                    ║
╠════╤════════╤═══════════════╧═══════════════════════════════╣
║A=23│ GETILN │ Определение длины буфера для спрайта          ║
╟────┴────────┴───────────────┬───────────────────────────────╢
║                             │ DE - длина буфера (для всех   ║
║                             │      сегментов одинакова)     ║
╚═════════════════════════════╧═══════════════════════════════╝

Приложение 6. Управляющие коды драйвера дисплея «TV-PRO»

Для вектора 0F809H

  07H - BELL     (звуковой сигнал);
  08H - LEFT     (курсор влево);
  09H - TAB      (табуляция на 8);
  0AH - LF       (перевод строки, ПС);
  0CH - CLS+HOME (очистка окна и курсор в левый верхний угол);
  0DH - CR       (возврат каретки, ВК);
  10H - CTRL     (префикс перед символами с кодами 00-1FH);
  18H - RIGHT    (курсор вправо);
  19H - UP       (курсор вверх);
  1AH - DOWN     (курсор вниз);
  1BH - ESC      (начало ESC-последовательности, АР2);
  1FH - CLS+HOME (очистка окна и курсор в левый верхний угол);

ESC-последовательности

  ESC '2' - вкл. автоперевод при выводе в посл.позицию строки;
  ESC '3' - выкл.автоперевод при выводе в посл.позицию строки;
  ESC '4' - вкл. скроллинг при выводе LF в последней строке;
  ESC '5' - выкл.скроллинг при выводе LF в последней строке;
  ESC '6' - включение  инверсии символов;
  ESC '7' - выключение инверсии символов;
  ESC '8' - включение  подчеркивания символов (курсором);
  ESC '9' - выключение подчеркивания символов;
  ESC ':' - включение  непрерывного отображения курсора в TVC;
  ESC ';' - выключение отображения курсора;
  ESC '<' - включение  мигания курсора при вводе в KBRD;
  ESC '=' - выключение мигания курсора при вводе в KBRD;
  ESC 'A' - UP    (курсор вверх);
  ESC 'B' - DOWN  (курсор вниз);
  ESC 'C' - RIGHT (курсор вправо);
  ESC 'D' - LEFT  (курсор влево);
  ESC 'E' - CLS   (очистка окна);
  ESC 'F',C1,C2 - уст.цветов фона C1 и изображения C2;
  ESC 'H' - HOME     (курсор в левый верхний угол окна);
  ESC 'J' - стирание текста от курсора до конца окна;
  ESC 'K' - стирание текста от курсора до конца строки;
  ESC 'L' - вставка строки;
  ESC 'M' - удаление строки;
  ESC 'R',Byte  - установка толщины курсора;
  ESC 'S',Num   - уст.номера доступного и видимого экранов;
  ESC 'T',Pal   - установка палитры видимого экрана;
  ESC 'U',Mode  - уст.режима доступного и видимого экранов;
  ESC 'V',Flag  - вкл./выкл. изображения видимого экрана;
  ESC 'Y',Lin+20H,Col+20H - уст.курсора в позицию Col,Lin.

Приложение 7. Таблица соответствия действий управляющих клавиш клавиатуры

РК-86 (и МС7007 в старом режиме)

┌───────────┬───────────────────────────────────────────────┐
│ Нажатые   │        Режим клавиатуры (кодировка)           │
│ клавиши   ├───────────┬───────────┬───────────┬───────────┤
│           │   АЛТ     │   КОИ-8   │КОИ-7 / Н2 │КОИ-7 /Н0,1│
├───────────┼───────────┴───────────┴───────────┼───────────┤
│* РУС/ЛАТ  │Переключение с фиксацией РУС/ЛАТ,  │Перекл. с  │
│  (ФИКС)   │кроме спецсимволов                 │фик.БОЛ/МАЛ│
│           │                                   │кроме спец.│
├───────────┼───────────────────────┬───────────┼───────────┤
│ CC+СИМВОЛ │Переключение без фикса-│Перекл.без │Перекл.без │
│ (SHIFT+   │ции БОЛ/МАЛ, спецсимво-│фик.РУС/ЛАТ│фик.БОЛ/МАЛ│
│    СИМВОЛ)│лов, наборов псевдогр. │и спецсимв.│и спецсимв.│
├───────────┼───────────────────────┼───────────┼───────────┤
│* УС+СС    │Переключение с фикса-  │Перекл. с  │Перекл. с  │
│  (УПР+    │цией БОЛ/МАЛ, наборов  │фик.РУС/ЛАТ│фик.БОЛ/МАЛ│
│     SHIFT)│псевдогр.,кроме спец.  │кроме спец.│кроме спец.│
├───────────┼───────────────────────┼───────────┴───────────┤
│* УС+N     │Переключение с фикса-  │           -           │
│(УПР+N,ГРФ)│цией в псевдографику   │                       │
├───────────┼───────────────────────┼───────────────────────┤
│* УС+О     │Переключение с фикса-  │           -           │
│(УПР+O,АЛФ)│цией в буквен. режим   │                       │
├───────────┼───────────────────────┴───────────────────────┤
│ УС+БУКВА  │Формирование управляющих кодов независимо от   │
│(УПР+БУКВА)│регистра и алфавита                            │
└───────────┴───────────────────────────────────────────────┘

 Примечание: значком "*" отмечены комбинации клавиш,  дейст-
             вующих только в режиме ввода символа при вызове
             подпрограммы  KBRD  (остальные срабатывают  и в
             режиме опроса  INKEY).


МС7007 в новом режиме

┌───────────┬───────────────────────────────────────────────┐
│ Нажатые   │        Режим клавиатуры (кодировка)           │
│ клавиши   ├───────────┬───────────┬───────────┬───────────┤
│           │   АЛТ     │   КОИ-8   │КОИ-7 / Н2 │КОИ-7 /Н0,1│
├───────────┼───────────┴───────────┴───────────┴───────────┤
│ ФИКС      │                       -                       │
├───────────┼───────────────────────────────────┬───────────┤
│ АЛФ+БУКВА │Переключение без фиксации РУС/ЛАТ, │     -     │
│           │кроме спецсимволов                 │           │
├───────────┼───────────────────────────────────┼───────────┤
│ АЛФ+ФИКС  │Переключение с фиксацией РУС/ЛАТ,  │Перекл. с  │
│    *      │кроме спецсимволов                 │фик.БОЛ/МАЛ│
│           │                                   │кроме спец.│
├───────────┼───────────────────────┬───────────┴───────────┤
│ ГРАФ+БУКВА│Переключение без фикса-│           -           │
│           │ции ГРАФ/БУКВЫ         │                       │
├───────────┼───────────────────────┼───────────────────────┤
│ ГРАФ+ФИКС │Переключение с фикса-  │           -           │
│    *      │цией ГРАФ/БУКВЫ        │                       │
├───────────┼───────────────────────┼───────────┬───────────┤
│ SHIFT+    │Переключение без фикса-│Перекл.без │Перекл.без │
│   СИМВОЛ  │ции БОЛ/МАЛ, спецсимв.,│фик.РУС/ЛАТ│фик.БОЛ/МАЛ│
│           │наборов псевдографики  │и спецсимв.│и спецсимв.│
├───────────┼───────────────────────┼───────────┼───────────┤
│ SHIFT+ФИКС│Переключение с фикса-  │Перекл. с  │Перекл. с  │
│    *      │цией БОЛ/МАЛ, наборов  │фик.РУС/ЛАТ│фик.БОЛ/МАЛ│
│           │псевдографики, кроме   │кроме спец.│кроме спец.│
│           │спецсимволов           │           │           │
├───────────┼───────────────────────┴───────────┴───────────┤
│ УПР+БУКВА │Формирование управляющих кодов независимо от   │
│           │регистра и алфавита                            │
└───────────┴───────────────────────────────────────────────┘

 Примечание: значком "*" отмечены комбинации клавиш,  дейст-
             вующих только в режиме ввода символа при вызове
             подпрограммы  KBRD  (остальные срабатывают  и в
             режиме опроса  INKEY).

Размещение псевдографических символов

(Фрагмент клавиатуры МС7007)

    ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
    │┌ ╔│┬ ╦│┐ ╗│╒ ╓│╤ ╥│╕ ╖│ї ░│° ▀│Ї ▒│• √│─ ═│   │ё Ё│
    └┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴───┘
     │├ ╠│┼ ╬│┤ ╣│╞ ╟│╪ ╫│╡ ╢│ў ▌│  ■│Ў ▐│№ ¤││ ║│
     └┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴───┘
      │└ ╚│┴ ╩│┘ ╝│╘ ╙│╧ ╨│╛ ╜│Є ▓│∙ ▄│є █│
      └───┴───┴───┴───┴───┴───┴───┴───┴───┘