Орион-Про/Описание драйвера дисплея «TV-PRO»

Материал из Emuverse
Данный материал защищён авторскими правами!

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

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

1. Общие положения

Описываемый драйвер графического дисплея размещается в ПЗУ («ROM2») и инициализируется автоматически при запуске компьютера в режиме «Orion-Pro».

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

  • максимальное использование возможностей компьютера;
  • максимальное быстродействие при ограниченном объеме;
  • функционирование любой стандартной подпрограммы драйвера во всех цветовых режимах.

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

В таблице стандартных подпрограмм BIOS драйверу дисплея отведены следующие вектора:

  0F809H – вывод символа на экран из регистра (С);
* 0F80CH – управление экраном (режимы, цвет, окна);
* 0F80FH – управление выводом символа и курсора;
  0F815H – вывод HEX-байта на экран;
  0F818H – вывод сообщения с адресом HL на экран;
* 0F82AH – вывод графики;
* 0F82DH – резерв;
  0F81EH – получение позиции курсора;
  0F83CH – установка позиции курсора;
  0F851H – управление указателем мыши (функция 0).

Значком «*» отмечены базовые вектора управления, действующие после инициализации драйвера «TV-PRO». Каждый из этих векторов содержит набор подпрограмм (функций), предназначенных для управления и для вывода информации. Выбор требуемой функции осуществляется по ее номеру, указываемому в регистре A перед вызовом соответствующего вектора, при этом соблюдаются следующие соглашения:

  • все регистры сохраняются, кроме AF;
  • в качестве параметров используются только BC,DE,HL;
  • на выходе некоторых функций устанавливаются флаги «CY» и «Z», свидетельствующие о выполнении (невыполнении) заданных условий.

Остальные вектора являются производными, то есть основываются на функциях управляющих векторов. Так, например, вектор 0F809H для вывода символа в очередную позицию курсора использует функцию A=0 вектора 0F80FH, а вектора 0F815H, 0F818H вызывают вектор 0F809H.

Далее будем рассматривать только вектора 0F80CH, 0F80FH и 0F82AH (вектор 0F82DH в «TV-PRO» версии 1.00 не реализован).

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

Итак, в состав «TV-PRO» входят три группы базовых функций:

  1. Функции вектора 0F80CH для управления экраном, обеспечивающие управление режимами экранов, переключение их номеров, установку цветов, а также определение размеров и положения текущего окна вывода;
  2. Функции вектора 0F80FH для управления выводом символа и курсора, позволяющие формировать практически любые символы и курсор заданной формы в пределах текущего окна экрана;
  3. Функции вектора 0F82AH для вывода графики: точки, линии, прямоугольника, окружности, заполнения ограниченной области.

2. Условия применения

Вызов функций драйвера возможен из любой страницы оперативной памяти, при этом состояние портов управления сегментами ОЗУ и ПЗУ не имеет значения. Однако, значение бита 7 порта диспетчера 0AH всегда должно оставаться нулевым (режим «Orion-Pro»), а бита 6 — единичным (ОЗУ 0F000H..0FFFFH не переключается при переключении страниц).

Драйвер занимает адреса ОЗУ 0F3C0H..0F6FFH под оверлейную область и рабочие ячейки, а адреса 0F7C0H..0F7FFH — под внутренний стек. Кроме того, для внутренних нужд драйвера используется область ОЗУ страницы 7 с адресами 0D000H..0EFFFH (или, что то же самое, в сегменте 31 по адресам 1000H..2FFFH). Программы пользователя не должны размещать в указанных областях свои данные.

Буфер для сохранения информации текущего окна находится в сегментах 1B,1CH,1DH,1EH по адресам 0000H..3FBFH (в пределах каждого сегмента из расчета на 4-х экранные плоскости), а буфер для сохранения информации под курсором - в этих же сегментах по адресам 3FC0H..3FFFH (что обеспечивает обслуживание стандартного курсора с увеличенным размером 12x20 пикселей). Указанные значения адресов буферов устанавливаются при инициализации драйвера и могут быть изменены в любой момент по усмотрению программиста.

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

3. Управление экраном (вектор 0F80CH)

3.1. Режимы доступного и видимого экранов

Драйвер дисплея почти в полной мере реализует возможности компьютера «Orion-Pro» по управлению экранами: пользователь может переключать номера экранов, их цветовые режимы, выводить информацию на экран сразу или в теневом режиме. Ограничением является невозможность работы с широким экраном под номером 0.

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

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

Изображение видимого экрана можно отключить (запретить видеосигнал) или включить. Эта возможность может быть использована при переключении цветовых режимов видимого экрана для исключения эффекта мелькания.

Для каждого типа экрана может быть назначен один из следующих режимов:

   0  – монохромный    384x256 точек
   1  – монохромный    512x256 точек
   2  – псевдо-цветной 384x256 точек
   3  – псевдо-цветной 512x256 точек
   4  –   4-цветный    384x256 точек
   5  –   4-цветный    512x256 точек
   6  –   8-цветный    384x256 точек
   7  –   8-цветный    512x256 точек
   8  –  16-цветный    384x256 точек
   9  –  16-цветный    512x256 точек
  10  –  16-цветный    48x256 байт   (с групповым  ко-
  11  –  16-цветный    64x256 байт    дированием цвета)

В цветовых режимах 69 номера экранов могут принимать значения 0,1, в остальных режимах — 0,1,2,3.

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

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

Для видимого экрана режим назначается сразу, если его изображение было включено (если изображение было выключено, то назначение режима видимого экрана откладывается до его включения).

При переключении номеров видимого и доступного экранов их соответствующие цветовые режимы не изменяются.

Рассмотрим функции вектора 0F80CH, связанные с назначением режимов экранов (здесь и далее слева в скобках указано значение регистра A — номер функции):

(0) Установить режим доступного экрана
    Исходные данные:  C   – номер режима (0..11);
    Выходные данные: нет.

Назначение режимов с нечетными номерами (ширина экрана 512 точек) для доступного экрана 0 заблокировано, так как доступ к экранным ячейкам, начиная с адреса 0F000H, драйвером не обеспечивается.

(1) Получить режим доступного экрана 
    Исходные данные: нет;
    Выходные данные:  C   – номер режима (0..11);

(2) Установить режим видимого экрана 
    Исходные данные:  C   – номер режима (0..11);
    Выходные данные: нет.

(3) Получить режим видимого экрана
    Исходные данные: нет;
    Выходные данные:  C   – номер режима (0..11);

(4) Установить номер доступного экрана 
    Исходные данные:  C   – номер экрана (0..3 или 0,1);
    Выходные данные: нет.

(5) Получить номер доступного экрана 
    Исходные данные: нет;
    Выходные данные:  C   – номер экрана (0..3 или 0,1).

(6) Установить номер видимого экрана 
    Исходные данные:  C   – номер экрана (0..3 или 0,1);
    Выходные данные:  нет.

(7) Получить номер видимого экрана
    Исходные данные: нет;
    Выходные данные:  C   – номер экрана (0..3 или 0,1).

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

(8) Выключить изображение видимого экрана
    Исходные данные: нет;
    Выходные данные: нет.

(9) Включить изображение видимого экрана
    Исходные данные: нет;
    Выходные данные: нет.

Рассмотрим примеры.

1). Номера доступного и видимого экранов совпадают. Для видимого экрана назначен режим 0, для доступного — режим 10.

Вывод данных будет происходить с формированием невидимых цветовых атрибутов. Изображение видимого экрана будет монохромным. Если затем назначить и для видимого экрана режим 10, то на дисплее сразу появится 16-цветное изображение.

2). Номера доступного и видимого экранов совпадают. Для видимого экрана назначен режим 11, для доступного — режим 1.

Вывод данных на цветной экран будет происходить без изменения цветовых атрибутов (быстрее).

3). Номера доступного и видимого экранов различны. Видимый экран — в режиме 4, доступный — в режиме 9.

Вывод на экран будет невидимым; в доступном экране сформируется 16-цветное изображение.

Далее можно действовать в такой последовательности:

  • отключить изображение видимого экрана;
  • выбрать видимый экран с номером доступного;
  • назначить режим 9 для видимого экрана;
  • включить изображение видимого экрана.

3.2. Работа с цветами

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

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

А) Доступный экран

В монохромном и псевдо-цветном режимах (0,1,2,3) для доступного экрана используется только 2 цвета: 0 и 1 (как для фона, так и для переднего плана).

В 4-цветных режимах (4,5) коды цветов принимают следующие значения:

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

В 16-цветных режимах (8..11) коды цветов могут быть следующими:

   0 – черный                     8 – темно-серый
   1 – синий                      9 – светло-синий
   2 – зеленый                   10 – светло-зеленый
   3 – голубой                   11 – светло-голубой
   4 – красный                   12 – светло-красный
   5 – лиловый                   13 – светло-лиловый
   6 – коричневый                14 – желтый
   7 – светло-серый              15 – белый

В 8-цветных режимах (6,7) для доступного экрана используются коды цветов 0..7.

Б) Видимый экран

В монохромных режимах (0,1) номер аппаратной палитры принимает значения 0,1 (зеленые символы соответственно на черном или белом фоне).

В псевдо-цветных режимах (2,3) номер палитры может принимать 256 значений от 00H до 0FFH, при этом старший ниббл определяет цвет отображения погашенных точек видео ОЗУ, а младший — засвеченных точек.

В 4-цветных режимах (4,5) действуют две палитры:

0 – черный, красный, зеленый, синий;
1 – белый,  красный, зеленый, синий.

Для 8-цветных и 16-цветных режимов понятие аппаратной палитры отсутствует.

Функции для работы с цветами:

(10) Установить текущий цвет фона доступного экрана 
     Исходные данные: C – код цвета (0..15);
     Выходные данные: нет.

(11) Получить текущий цвет фона доступного экрана 
     Исходные данные: нет;
     Выходные данные: C – код цвета (0..15).

(12) Установить текущий цвет изображения доступного экрана 
     Исходные данные: C – код цвета (0..15);
     Выходные данные: нет.

(13) Получить текущий цвет изображения доступного экрана 
     Исходные данные: нет;
     Выходные данные: C – код цвета (0..15).

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

(14) Установить код аппаратной палитры видимого экрана 
     Исходные данные: C – номер палитры (0..255);
     Выходные данные: нет;

(15) Получить код аппаратной палитры видимого экрана 
     Исходные данные: нет;
     Выходные данные: C – номер палитры (0..255);

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

Замечание

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

  • подход, основанный на одновременном использовании только цвета фона и цвета изображения, позволяет унифицировать функции драйвера для всех режимов;
  • наличие всего двух кодов цветов позволяет вычислить заранее (в момент их установки) коды заполнения экранных областей для режимов 4..9, не занимаясь этим в процессе вывода информации;
  • одной из основных функций драйвера мы будем считать вывод символа, задаваемого по двухцветному шаблону; при выводе символов наличие двух цветов (фона и изображения) является общепринятым;
  • драйвер не предназначен для быстрого вывода многоцветных спрайтов (в режимах 4..9), поэтому, в случае необходимости, пользователь должен сам разработать соответствующие программы;
  • ограниченный объем памяти, выделенной под драйвер, не позволяет реализовать более мощную систему управления логическими цветами доступного экрана (например, создание палитр пользователя, привязывающих коды цветов в различных цветовых режимах к единой шкале серого цвета и пр.).

3.3. Определение окна вывода

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

Началом координат в окне считается левый верхний угол (0,0). Вывод данных за пределами окна (при X < 0 или X >= ширины окна или Y < 0 или Y >= высоты окна) блокируется.

При установке окна задается его смещение относительно левого верхнего угла доступного экрана, ширина и высота окна. В момент установки окна никаких изменений в содержимом доступного экрана не происходит.

Функции для работы с окном:

(16) Установить текущее окно
     Исходные данные:  C   – смещение окна по Y (0..255),
                       DE  – смещ.окна по X (0..383/511), 
                       HL  – ширина окна (1..384/512), 
                       B   – высота окна (1..256).
     Выходные данные: «CY» – признак ошибки.

Параметры устанавливаемого окна должны удовлетворять следующим условиям:

а) Сумма B+C (высоты окна и смещения окна по Y) не должна превышать высоту доступного экрана (256); значению высоты окна 256 соответствует B=0;

б) Сумма DE+HL (ширины окна и смещения окна по X) не должна превышать ширину доступного экрана (384 или 512).

Для нормального вывода текста требуется соблюдение дополнительных условий:

в) Высота окна

B  = [высота символа] + (m1) * [шаг символов по Y],

где m – число строк текста;

г) Ширина окна

HL = [ширина символа] + (n1) * [шаг символов по X],

где n – число столбцов текста.

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

Заметим, что в драйвере имеется функция установки символьного окна с выполнением условий в) и г) (вектор 0F80FH, функция A=4, подфункция C=9).

(17) Получить текущее окно
     Исходные данные:  нет;
     Выходные данные:  C   – смещение окна по Y (0..255),
                       DE  – смещ.окна по X (0..383/511), 
                       HL  – ширина окна (1..384/512), 
                       B   – высота окна (1..256).

ВНИМАНИЕ: При переключении режимов и номеров доступного экрана окно устанавливается на весь экран!

(18) Очистить текущее окно цветом фона
     Исходные данные:  нет,
     Выходные данные:  нет.

Функции установки и очистки окна обнуляют позицию курсора и координаты начала линии.

Функция очистки окна в режимах 10,11 очищает как ОЗУ переднего плана доступного экрана, так и ОЗУ цвета. Если нужно очистить только ОЗУ переднего плана, то необходимо переключиться в режим 0 или 1 (с сохранением и переустановкой размеров окна). Очистка только ОЗУ цвета не предусмотрена.

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

(19) Установить адрес буфера для сохранения окна 
     Исходные данные: CBED – номера сегментов ОЗУ для сохранения содержимого окна 
                             (C – для режимов 0,1,2,3, CB – для режимов 4,5,10,11,  
                             CBE – для режимов 6,7, CBED – для режимов 8,9);
                      HL   – начальный  адрес   размещения
                             данных в сегментах  (во  всех одинаковый).
     Выходные данные:  нет.

При вызове функции установки адреса буфера допускается указывать как адрес в пределах сегмента ОЗУ (0..3FFFH), так и действительный адрес в пределах страницы ОЗУ (0..0FFFFH); в последнем случае необходимая коррекция старшего байта адреса будет выполнена автоматически. Указанное замечание относится также к другим функциям установки буферов: установки адреса ЗГ, адреса шаблона курсора, адреса буфера для сохранения информации под курсором.

(20) Получить адрес буфера для сохранения окна 
     Исходные данные: нет;
     Выходные данные: CBED – номера сегментов ОЗУ для сохранения содержимого окна 
                             (C – для режимов 0,1,2,3, CB – для режимов 4,5,10,11,
                             CBE – для режимов 6,7, CBED – для режимов 8,9);
                      HL   – начальный  адрес   размещения
                             данных в сегментах  (во  всех одинаковый).

(21) Определить длину буфера для сохранения текущего окна 
     Исходные данные: нет;
     Выходные данные: DE – длина буфера в байтах (для всех
                           сегментов  одинакова), необходимая для сохранения 
                           текущего окна.

(22) Сохранить текущее окно
     Исходные данные:  C – признак сдвига буфера:
                           C = 00H  – ускоренный режим сохранения без сдвига буфера;
                           C = 0FFH – режим сохранения с  последующим сдвигом 
                                      буфера влево.
     Выходные данные: «CY» признак переполнения буфера.

При сохранении текущего окна в буфер записывается только его содержимое без дополнительных параметров. Если входное значение C=0FFH, то после сохранения информации окна содержимое буфера сдвигается влево для приведения его к нулевому смещению в пределах байта.

(23) Восстановить текущее окно
     Исходные данные:  C – признак сдвига буфера:
                           C = 00H  – ускоренный режим  восстановления 
                                      без сдвига буфера;
                           C = 0FFH – режим восстановления  
                                      со сдвигом буфера вправо.
     Выходные данные: «CY» признак переполнения буфера.

Значение параметра C при восстановлении окна должно быть таким же, каким оно было при сохранении окна.

Размеры восстанавливаемого окна должны совпадать с размерами, действовавшими при сохранении, при этом допускается установка нового положения окна для его перемещения по экрану. Смещение окна по Y относительно верхней границы экрана может быть выбрано произвольным, а допустимые значения смещения окна по X относительно левой границы экрана зависят от величины входного параметра C.

Если C=0, то смещение восстанавливаемого окна по X в пределах байта должно оставаться прежним, то есть окно может быть перемещено по X на величину, кратную 8. Этим режимом целесообразно пользоваться при восстановлении окна на «старом» месте экрана без перемещения.

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

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

(24) Скроллинг содержимого окна вверх 
     Исходные данные:  H – высота скроллируемой части окна   
                        (от верхней границы окна);
                    L – величина сдвига окна (высота
                        строки),  0 < L <= H;
                    C – смещение  скроллируемой   части
                        окна относительно верхней  границы окна, 
                        C+H <= высоты окна;
  Выходные данные: «CY» – признак ошибки.

(25) Скроллинг содержимого окна вниз 
     Исходные данные:  H – высота  скроллируемой части окна   
                           (от верхней границы окна);
                       L – величина сдвига окна    (высота
                           строки),  0 < L <= H;
                       C – смещение  скроллируемой   части
                           окна относительно верхней  границы окна, 
                           C+H <= высоты окна;
     Выходные данные: «CY» – признак ошибки.

Скроллинг окна заключается в сдвиге его содержимого вверх (вниз) на заданное число пикселей с последующей очисткой «освободившейся» нижней (верхней) строки.

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

   Скроллинг содержимого окна      Скроллинг содержимого окна
             вверх                           вниз
     ┌─────────────────┐              ┌─────────────────┐
   C │                 │            C │                 │
     ├─────────────────┤              ├─────────────────┤
     │░░░░░░░░░░░░░░░░░│              │▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓│ L
   H │░░░░░░░░░░░░░░░░░│            H │░░░░░░░░░░░░░░░░░│
     │▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓│ L            │░░░░░░░░░░░░░░░░░│
     ├─────────────────┤              ├─────────────────┤
     └─────────────────┘              └─────────────────┘

Верхняя часть окна высотой [C] пикселей не скроллируется. В середине окна находится скроллируемая область высотой [H], которая в свою очередь делится на две части — копируемую (░) и очищаемую цветом фона (▓) с высотой [L]. Оставшаяся нижняя часть окна не изменяется.

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

а) Высота скроллируемой части окна [H] не должна быть меньше величины сдвига [L], то есть необходимо выполнение условия: H >= L. При H = L скроллируемая часть окна просто очищается.

б) Величина смещения скроллируемой части окна [C] — это позиция Y начала скроллируемой части окна. Величина [C] может быть равна нулю; сумма C+H не должна превышать высоту окна.

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

в) Величина сдвига [L] должна быть равна высоте строки текста (определяется шагом вывода символов по Y);

г) Высота скроллируемой части [H] должна быть кратна высоте строки [L];

д) Смещение скроллируемой части окна [C] должно быть кратно высоте строки [L].

(26) Очистка до конца строки
     Исходные данные:  BC – текущая графическая позиция Y;
                       DE – текущая графическая позиция X;
                       L  – высота строки;
     Выходные данные: «CY» – строка вне окна;

(27) Очистка до конца окна
     Исходные данные:  BC – текущая графическая позиция Y;
                       DE – текущая графическая позиция X;
                       L  – высота строки;
     Выходные данные: «CY» – строка вне окна;

Для выполнения функций очистки до конца строки и до конца окна необходимо, чтобы строка с заданными координатами ее левого верхнего угла (DE,BC) и высотой [L] полностью помещалась в окне, то есть должны быть соблюдены следующие условия:

а) Сумма C+L не должна превышать высоты окна; [B] всегда равно 0;

б) Смещение начала очищаемой части строки [DE] по X должно быть меньше ширины окна.

   Очистка до конца строки           Очистка до конца окна
        DE                               DE
     ┌─────────────────┐              ┌─────────────────┐
  BC │                 │           BC │                 │
     │     ▓▓▓▓▓▓▓▓▓▓▓▓│  L           │     ▓▓▓▓▓▓▓▓▓▓▓▓│
     │                 │              │▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓│
     │                 │              │▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓│
     └─────────────────┘              └─────────────────┘

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

в) Высота строки [L] должна равняться шагу вывода символов по Y;

г) BC = i * [шаг символов по Y], где i — количество отступаемых сверху строк,

д) DE = j * [шаг символов по X], где j — количество отступаемых слева символов.

Описанные функции работы с окном, имеющиеся в описываемом векторе 0F80CH, не зависят от размеров установленного шрифта, то есть являются универсальными. Пользователь может применять их по своему усмотрению, например, при разработке специальных процедур вывода символов.

Функция (4) в векторе управления выводом символа и курсора 0F80FH позволяет выполнить некоторые операции с окном, действие которых зависит от текущих размеров символов и позиции курсора.

4. Управление выводом символа и курсора (вектор 0F80FH)

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

Для вывода графических символов задаются параметры знакогенератора (ЗГ) с шаблонами символов, и режим вывода символов (см. функции 7-12). При задании знакогенератора указывается его адрес, шаг следования шаблонов (в байтах), размеры символов и шаг приращения координат курсора в пикселях по X и по Y. Можно иметь несколько знакогенераторов со шрифтами разного размера, при этом каждый знакогенератор должен размещаться целиком в сегменте ОЗУ (в одном сегменте может быть несколько знакогенераторов).

Шаблон символа задается последовательностью байтов: сначала следует левый столбец байтов (начиная с левого верхнего угла шаблона — вниз), за ним подряд — все остальные столбцы (если есть), причем количество байтов в каждом столбце равно высоте символа, а количество столбцов определяется шириной символа и смещением шаблона в левом столбце байтов.

Теоретически размеры знакоместа могут быть в пределах от 1 до 256 пикселей как по X, так и по Y. Однако, следует учитывать тот факт, что ЗГ должен целиком умещаться в выбранном сегменте ОЗУ, то есть суммарная длина всех шаблонов не может быть больше 16 Кбайт. Отсюда следует, что в полном знакогенераторе, содержащем шаблоны 256 символов, длина одного шаблона не должна превышать 16384/256 = 64 байт. Для большинства применений этого достаточно, но если Вам необходимо иметь символы большего размера, ЗГ можно разделить на несколько неполных частей, разместив каждую из них в отдельном сегменте ОЗУ, причем одна такая часть будет соответствовать определенному диапазону символов. Переключение между частями ЗГ в зависимости от кода выводимого символа должно выполняться в программе пользователя с помощью функции A=11 вектора 0F80FH с последующим приведением кода символа к нулю для привязки к началу соответствующей части ЗГ. Решение проблемы упрощается, если Вам нужны всего лишь несколько крупноразмерных символов, а не полный ЗГ. В этом случае шаблоны всех этих символов, возможно, вместятся в одном сегменте ОЗУ.

Для примера рассмотрим шаблон символа «A» с размером знакоместа 12x8 пикселей.

                 байты левого     байты правого
                    столбца          столбца
                7 6 5 4 3 2 1 0  7 6 5 4 3 2 1 0
              ┌────────┬───────╥────────────────┐──
            1 │░░░░░░░░│       ║                │
            2 │░░░░░░░░│       ║    ████        │ в
            3 │░░░░░░░░│       ║████    ████    │ ы
            4 │░░░░░░░░│   ████║            ████│ с
            5 │░░░░░░░░│   ████║            ████│ о
            6 │░░░░░░░░│   ████║████████████████│ т
            7 │░░░░░░░░│   ████║            ████│ а
            8 │░░░░░░░░│   ████║            ████│
              └────────┴───────╨────────────────┘──
              │смещение│    ширина знакоместа   │

Значком (░) обозначены неиспользуемые биты (ширина неиспользуемой области определяется смещением шаблона в левом столбце байтов, принимающим значения 0..7). В данном случае величина смещения равна 4.

Для хранения приведенного шаблона необходимо 16 байт, то есть шаг следования шаблонов в ЗГ будет равен 16 (хотя он может быть выбран и больше):

DB 00H,00H, 00H,03H,03H, 03H,03H,03H  ;ЛЕВЫЙ СТОЛБЕЦ
DB 00H,30H,0CCH,03H,03H,0FFH,03H,03H  ;ПРАВЫЙ СТОЛБЕЦ

Функция (0), реализованная в векторе 0F80FH и используемая подпрограммой 0F809H, выводит символ в очередную позицию курсора с его перемещением. Данная функция поддерживает некоторые управляющие последовательности по стандарту дисплея DEC VT52 (см. ниже) и автоматически подстраивается под размеры текущего окна и размеры символов. Если символ полностью не умещается в окне, то он не выводится. Заметим, что для работы с другими стандартами пользователь может написать свой внешний драйвер, отключив действие всех внутренних управляющих кодов.

              УПРАВЛЯЮЩИЕ СИМВОЛЫ
 
   ^G (07H) - звуковой сигнал (ЗС);
   ^H (08H) - возврат на шаг;
   ^I (09H) - табуляция на 8;
   ^J (0AH) - перевод строки  (ПС);
   ^L (0CH) - очистка окна экрана и HOME;
   ^M (0DH) - возврат каретки (ВК);
   ^P (10H) - префикс для вывода символов с кодами 00H..1FH;
   ^X (18H) - курсор вправо;
   ^Y (19H) - курсор вверх;
   ^Z (1AH) - курсор вниз;
   ^[ (1BH) - начало ESC-последовательности (АР2);
   ^_ (1FH) - очистка окна и HOME.

             ESC-ПОСЛЕДОВАТЕЛЬНОСТИ

   ESC '2' - вкл. автоперевод при выв.в посл. позицию строки;
   ESC '3' - выкл.автоперевод при выв.в посл. позицию строки;
   ESC '4' - вкл. скроллинг при выводе ПС в последней строке;
   ESC '5' - выкл.скроллинг при выводе ПС в последней строке;
   ESC '6' - включение инверсии;
   ESC '7' - выключение инверсии;
   ESC '8' - включение  режима подчеркивания (курсором);
   ESC '9' - выключение режима подчеркивания;
   ESC ':' - включение непрерывного вывода курсора в 0F809H;
   ESC ';' - выключение курсора;
   ESC '<' - включение  мигания курсора при вводе в 0F803H;
   ESC '=' - выключение мигания курсора при вводе в 0F803H;
   ESC 'A' - курсор вверх;
   ESC 'B' - курсор вниз;
   ESC 'C' - курсор вправо;
   ESC 'D' - курсор влево;
   ESC 'E' - очистка окна;
   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',20H+Y,20H+X - установка курсора в позицию X,Y.

Управляющие символы с кодами 07H1FH действуют так же, как и в «Мониторе-2» компьютера «Орион-128», кроме кода 0CH, выполняющего очистку текущего окна с установкой курсора в левый верхний угол. Для вывода изображения символов с кодами 00H1FH предусмотрен префикс 10H (^P). Например, если последовательно вывести символы с кодами 10H, 02H, на экране появится «рожица».

Рассмотрим особенности некоторых управляющих ESC (АР2) — последовательностей.

Последовательности ESC '2', ESC '3' используются для включения / выключения автоматического переноса на новую строку при переходе через правую границу окна. Если он выключен, то после вывода последнего символа в строке курсор уйдет вправо за пределы окна и будет находиться там до тех пор, пока количество выведенных символов не превысит 255, или не будет выдан соответствующий управляющий код перемещения курсора (например, 0DH).

Последовательности ESC '4', ESC '5' предназначены для включения / выключения режима скроллинга при выводе кода 0AH (перевод строки) в последней строке окна. Если скроллинг выключен, то вывод символа в последнюю позицию окна не приведет к «прокрутке» отображенной информации.

Последовательности ESC '8', ESC '9' включают / выключают режим подчеркивания символов стандартным курсором (в виде черточки), устанавливаемым после инициализации драйвера или при распаковке стандартного ЗГ. За формой курсора программист должен следить самостоятельно. Данным режимом не следует пользоваться, если установлена другая форма курсора.

Последовательности ESC ':', ESC ';', ESC '<', ESC '=' предназначены для управления отображением курсора.

Последовательность ESC ':' включает режим непрерывного отображения немигающего курсора и предназначена для обеспечения совместимости с существующими программами в среде CP/M-80, взаимодействующими с драйвером дисплея только через управляющие коды стандартной подпрограммы вывода символа на экран. Для нормального отображения курсора в этом режиме необходимо, чтобы все операции по перемещению курсора, изменению его размеров и формы (а также установке режимов и номеров экрана, изменению текущего окна вывода и пр.) выполнялись только посредством вышеперечисленных управляющих кодов внутри функции (0) вектора 0F80FH.

Последовательность ESC ';' запрещает отображение курсора любой формы.

Последовательность ESC '<' включает мигающий курсор при вводе в подпрограмме 0F803H, при этом режим непрерывного вывода курсора отключается.

Последовательность ESC '=' устанавливает немигающий курсор при вводе в 0F803H.

Для управления толщиной стандартного курсора используется последовательность ESC 'R',Byte, в которой значение «Byte» равно толщине курсора в пикселях (нормальная работа данной последовательности обеспечивается в случае, если шаблон курсора состоит из необходимого числа байтов 0FFH).

Последовательность ESC 'U',Mode устанавливает режим доступного и видимого экранов, определяемый кодом «Mode», а последовательность ESC 'S', Num выбирает доступный и видимый экран с номером Num. При этом, для исключения эффекта «мелькания» на момент очистки экрана можно запретить видеосигнал с помощью последовательности ESC 'V','0'. Включается видеосигнал кодами ESC 'V','1'.

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

В системе имеется набор стандартных шрифтов для 4-х типов кодировок, которые могут быть распакованы в указанный сегмент ОЗУ по требуемому адресу (см. функцию 13):

  • ALT (альтернативная);
  • КОИ8;
  • КОИ7/Н2 (большие латинские и русские);
  • КОИ7/Н1 (только русские).

Для реализации знакогенератора КОИ7/Н0 (только латинские) можно использовать первую половину кодовой таблицы ALT или КОИ8.

Заметим, что драйвер не высекает старший бит символов при использовании наборов КОИ7. Любой знакогенератор содержит шаблоны 256 символов (в КОИ7/Н2 или КОИ7/Н1 обе половины знакогенератора совпадают).

Базовый размер стандартных символов составляет 6x10 пикселей, однако при распаковке стандартного шрифта можно установить символы увеличенной вдвое ширины (12 пикселей) или/и увеличенной вдвое высоты (20 пикселей).

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

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

От использования стандартного курсора можно отказаться. В этом случае должен быть установлен новый шаблон курсора, который представляется в ОЗУ аналогично шаблону символа. Размеры и форма курсора могут быть выбраны независимо от параметров текущего шрифта (см. функции 1619).

Функции вывода и гашения курсора (2), (3) используются подпрограммой ввода с клавиатуры и драйвером мыши, а также применяются для реализации режима подчеркивания символов и режима непрерывного вывода курсора в функции (0). Однако пользователь может использовать указанные функции и по своему усмотрению (например, для вывода движущихся образов с сохранением информации экрана) с обязательным возвратом прежних параметров курсора.

Для вывода символа и курсора может быть по отдельности задан один из режимов наложения шаблона на содержимое окна экрана (см. функции 7,8,14,15):

  • режим полной замены (когда единичным битам шаблона на экране будут соответствовать точки, засвеченные цветом изображения, а нулевым битам шаблона — точки, погашенные цветом фона);
  • режим наложения по ИЛИ (фон не меняется, цветом изображения засвечиваются точки, соответствующие единичным битам шаблона);
  • режим наложения по И (наоборот — меняется только фон, соответствующий нулевым битам шаблона);
  • режим наложения по ИСКЛЮЧАЮЩЕМУ ИЛИ (независимо от установленных кодов цветов фона и изображения инвертируются те экранные биты, которым в шаблоне соответствуют единицы) — при повторном выводе в то же место экрана по тому же шаблону происходит восстановление прежней информации экрана.

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

Рассмотрим интерфейс функций вектора 0F80FH (слева в скобках указан номер функции, задаваемый в регистре A):

(0) Вывести графический символ в очередную поз. Курсора (используется в 0F809H)
    Исходные данные:  C  – код символа;
    Выходные данные:  нет.

(1) Вывести графический символ в заданную позицию окна 
    Исходные данные:  L  –  код символа;
                      DE –  X  (левого верхнего угла символа);
                      BC –  Y  (левого верхнего угла символа);
    Выходные данные: «CY» – символ вне окна.

Функция (1) не обрабатывает управляющие коды и ESC-последовательности, а также не изменяет позицию курсора.

(2) Отобразить графический курсор в заданной позиции окна 
    Исходные данные:  BC – позиция Y;
                      DE – позиция X;
    Выходные данные: «CY» – вне окна.

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

(3) Погасить графический курсор в заданной позиции окна 
    Исходные данные:  BC – позиция Y;
                      DE – позиция X;
    Выходные данные: «CY» – вне окна.

Курсор убирается следующим образом: если в данный момент установлен режим сохранения информации под курсором, то происходит ее восстановление из заданного буфера, в противном случае курсор просто выводится повторно, при этом, если курсор выводился с наложением по ИСКЛЮЧАЮЩЕМУ ИЛИ, изображение восстановится автоматически.

(4) Выполнить управляющую подфункцию
    Исходные данные: C – номер подфункции:
                         0 – курсор в левый верхний угол
                         1 – курсор влево
                         2 – курсор вправо
                         3 – курсор вверх
                         4 – курсор вниз
                         5 – табуляция
                         6 – возврат каретки
                         7 – перевод строки
                         8 – BackSpace (забой влево)
                         9 – установка символьного окна:
                             L-ширина окна, H-высота окна,
                             E-смещение по X, D-смещение по Y
                             «CY» – признак ошибки.
                         10 – очистка окна
                         11 – очистка до конца окна
                         12 – очистка до конца строки
                         13 – скроллинг содержимого окна вверх
                         14 – скроллинг содержимого окна вниз
                         15 – вставить строку
                         16 – удалить строку
    Выходные данные: нет.

Функция (4) введена в состав драйвера специально для создания «внешних» подпрограмм вывода символа на основе функции (0) или (1). Особенностью функции (4) является привязка управляющих подфункций к текущим размерам символов и к позиции курсора.

Подфункция (4/1) возвращает флаг «CY» при переходе курсора из позиции Home текущего окна в последнюю позицию, а подфункция (4/2) — при переходе курсора из последней позиции окна в позицию Home (скроллинг не выполняется). Подфункции (4/3), (4/4) возвращают флаг «CY» при переходе курсора соответственно из верхней строки на нижнюю и из нижней строки на верхнюю.

На выполнение подфункции (4/2) влияет состояние бита C5, на выполнение подфункции (4/7) — бита C6, описывающих режим вывода символов (см. функцию 7).

Управляющая подфункция BackSpace (4/8) стирает символ слева от курсора и перемещает курсор на его место. Забой символа цветом фона происходит всегда, независимо от текущего режима наложения символов.

Подфункция (4/9) служит для установки символьного окна. Параметры окна указываются при вызове в регистрах DE, HL (все размеры задаются в количестве символов). Курсор перемещается в левый верхний угол установленного окна.

(5) Установить символьную позицию курсора 
    Исходные данные:  H – символьная позиция по Y;
                      L – символьная позиция по X;
    Выходные данные:  нет.
 
(6) Получить позицию курсора
    Исходные данные:  нет;
    Выходные данные:  H  – символьная позиция по Y;
                      L  – символьная позиция по X;
                      BC – графическая позиция по Y;
                      DE – графическая позиция по X.

Функции (5) и (6) используются соответственно в векторах 0F83CH и 0F81EH.

Необходимо заметить, что функция (6) возвращает и графические координаты курсора для того, чтобы можно было отобразить / погасить курсор в текущей позиции окна (например, из драйвера клавиатуры) с помощью функций (2), (3).

(7) Установить режим вывода символов 
    Исходные данные: C – код режима, определяется значением 
                         следующих битов регистра C:
                         С7 – резерв (0);
                         C6 – признак  разрешения  скроллинга при выводе  
                              ПС в последней   строке  окна  (при C6=0 
                              действие ПС соответствует   перемещению  
                              курсора вниз);
                         C5 – признак разрешения  автоперевода строки  
                              при выводе в последнюю   позицию  строки 
                              (при  C5=0  лишние  символы отсекаются);
                         С4 – признак разрешения обработки    управляющих   
                              Функций 00H..1FH   (если  C4=0,  то вместо 
                              функций высвечиваются соответствующие символы)
                         C3 – резерв (0);
                         C2 – признак инверсии символа;
                         C1,C0 – задают режим наложения в графическом режиме:
                                 00 – наложение с полной  заменой
                                      (если в шаблоне 0,  то точка гасится 
                                      цветом фона,  если 1 – засвечивается 
                                      цветом изображения);
                                 01 - наложение  по  ИЛИ  (если в шаблоне 0, 
                                      то вывод блокируется,  если 1 – 
                                      производится засветка  цветом   
                                      изображения);
                                 10 – наложение по И (если в шаблоне 0,  
                                      то производится гашение точки цветом фона, 
                                      если 1 – вывод блокируется);
                                 11 - наложение  по  исключающему ИЛИ  (независимо  
                                      от  цветов фона и изображения:  если  в 
                                      шаблоне  1,  то производится инверсия  цвета,
                                      если  0  – цвет не меняется);
    Выходные данные: нет.

Биты C6, C5 анализируются при выполнении управляющих кодов соответственно «ПС» и «курсор вправо» в функциях (0) и (4), бит C4 — при выводе символов с помощью функции (0), биты C2..C0 — при формировании изображения символа в функциях (0) и (1).

На значения битов C6, C5 воздействуют управляющие последовательности ESC '2' — ESC '5', на бит C4 — 10H (^P), на бит C2 — ESC '6' и ESC '7'.

(8) Получить режим вывода символов 
    Исходные данные:  нет;
    Выходные данные:  C  – код режима.

(9) Установить размеры графического символа 
    Исходные данные:  D  – ширина символа;
                      E  – высота символа;
                      B  – шаг вывода символов по X;
                      C  – шаг вывода символов по Y;
                      L  – смещение левого  столбца битов
                           шаблона в левом столбце байтов (0..7);
    Выходные данные:  нет.

(10) Получить размеры графического символа 
     Исходные данные:  нет;
     Выходные данные:  D  – ширина символа;
                       E  – высота символа;
                       B  – шаг вывода символов по X;
                       C  – шаг вывода символов по Y;
                       L  – смещение  левого столбца битов
                            шаблона в левом столбце байтов (0..7);

Шаг вывода символов по X и по Y определяется соответственно шириной и высотой символа, однако эти параметры можно увеличивать (или уменьшать) для получения какого-либо эффекта, например, для вывода шрифта вразрядку.

(11) Установить адрес текущего знакогенератора 
     Исходные данные:  C  – номер сегмента ОЗУ со знакогенератором;
                       HL – начальный адрес ЗГ в  пределах сегмента  ОЗУ 
                            (значение HL может  задаваться   в   пределах 
                            страницы   ОЗУ,  так  как  два старших бита 
                            H игнорируются);
                       DE – расстояние  в байтах между соседними шаблонами в ЗГ.
     Выходные данные:  нет.

Функция установки адреса знакогенератора позволяет оперативно менять шрифты (если их предварительно загрузить в нужные сегменты ОЗУ).

(12) Получить адрес текущего знакогенератора 
     Исходные данные:  нет;
     Выходные данные:  C  – номер сегмента ОЗУ со знакогенератором;
                       HL – начальный адрес  ЗГ в пределах сегмента ОЗУ.
                       DE – расстояние  в байтах между соседними шаблонами в ЗГ.

(13) Установить (распаковать) стандартный шрифт из ПЗУ 
     Исходные данные:  С  – номер  сегмента ОЗУ для распаковки;
                       HL – начальный адрес ЗГ в сегменте;
                       B  – код распаковки:
                            B7 – признак активизации ЗГ (и курсора при  B6=1)  
                                 после распаковки;
                            B6 – признак закачки стандартного курсора (шаблон 
                                 курсора дописывается в конец ЗГ);
                            B5-B4 – резерв (00);
                            B3 – признак высоких букв;
                            B2 – признак широких букв;
                            B1,B0 – номер кодировки:
                                    00 – ALT;
                                    01 - КОИ8;
                                    10 - КОИ7/Н2;
                                    11 - КОИ7/Н1.
     Выходные данные:  DE – длина знакогенератора с учетом шаблона  курсора   
                            (если B6=1) или без учета  шаблона курсора (если B6=0);
                       «CY» выход   за  пределы   сегмента (шрифт не 
                            распаковывается).

Если задано B7=1, то функция (13) распаковывает стандартный шрифт из ПЗУ в ОЗУ по указанному адресу с автоматической настройкой всех параметров, задаваемых функциями (9) и (11). Кроме того, если задано B6=1, то автоматически устанавливается стандартный курсор в виде черточки с изменением всех параметров, задаваемых функциями (16) и (18). Текущий режим вывода курсора не изменяется.

При B7=0 операция распаковки знакогенератора выполняется без его активизации (и без установки курсора для B6=1), то есть параметры текущего шрифта и курсора не изменяются.

Заметим, что если знакогенератор не умещается в заданном сегменте, никаких изменений не происходит, а на выходе функции устанавливается флаг «CY». Однако в любом случае выходное значение DE, содержащее длину ЗГ в байтах, является действительным. Последнее свойство может быть использовано для определения длины ЗГ без распаковки (перед распаковкой), если на входе функции (13) задать заведомо недопустимое значение HL=0FFFFH.

(14) Установить режим вывода графического курсора 
     Исходные данные: C – код режима, задаваемый следующими разрядами:
                          С7 – резерв (0);
                          C6 – признак непрерывного  отображения курсора 
                               при выводе символа;
                          C5 – признак  разрешения вывода курсора при 
                               вводе с клавиатуры;
                          C4 – признак  мигания   курсора при вводе с клавиатуры;
                          C3 – признак  сохранения информации под курсором;
                          С2 – признак инверсии;
                          C1-C0 – задают режим наложения:
                                  00 – наложение  с полной  заменой;
                                  01 - наложение по ИЛИ;
                                  10 - наложение по И;
                                  11 - наложение по исключающему ИЛИ;
    Выходные данные:  нет.

Бит C6 введен специально для обеспечения совместимости с существующими программами, рассчитанными на использование аппаратного курсора в среде CP/M-80. Режим непрерывного вывода курсора не рекомендуется использовать при разработке новых программ. Заметим, что если при вызове функции (14) задано C6=1, то курсор сразу отображается, в противном случае — сразу гасится. Ограничения, действующие в режиме непрерывного отображения курсора, были рассмотрены при описании управляющей последовательности ESC ':'.

Биты C5, C4 являются информационными и анализируются подпрограммой ввода символа с клавиатуры KBRD (0F803H).

Комбинация битов C6 = C5 = 1 запрещена.

Биты C3..C0 используются функциями (2) и (3) при формировании изображения курсора.

На значения битов C6, C5, C4 влияют управляющие последовательности ESC ':', ESC ';', ESC '<', ESC '=' :


    Режим курсора      ESC    C6  C5  C4
    ------------------------------------
    Непрерывный        ':'     1   0   0
    Отсутствует        ';'     0   0   0
    Мигает в KBRD      '<'     0   1   1
    Не мигает в KBRD   '='     0   1   0

(15) Получить режим вывода графического курсора 
     Исходные данные:  нет;
     Выходные данные:  C    – код режима.

(16) Установить размеры графического курсора
     Исходные данные:  D   – ширина курсора;
                       E   – высота (толщина) курсора;
                       B   – смещение по X относительно
                             позиции курсора;
                       C   – смещение по Y относительно
                             позиции курсора;
                       L   – смещение шаблона в левом
                             столбце байтов;
     Выходные данные:  нет.

С помощью предлагаемой функции установки размеров курсора можно, например, управлять его толщиной. Для этого шаблон курсора должен состоять из необходимого числа байтов 0FFH (равного длине шаблона символа). Смещение [B] по X устанавливается равным нулю, а смещение [C] по Y выбирается, исходя из условия:

C+E = const,

где [E] — толщина курсора в пикселях, а значение const есть суммарная высота изображения символа вместе курсором (как правило, они выводятся в пределах одного знакоместа так, что нижний срез курсора совпадает с нижней границей знакоместа).

Например, для стандартного шрифта с матрицей 6x10 пикселей высота изображения символа с курсором равна 10 строкам. В этом случае для толщины курсора в E = 1 строку необходимо задать смещение: C = 10-1 = 9 пикселей, а для толщины курсора в E = 4 строки: C = 10-4 = 6.

(17) Получить размеры графического курсора 
     Исходные данные:  нет;
     Выходные данные:  D   – ширина курсора;
                       E   – высота курсора;
                       B   – смещение по X относительно
                             позиции курсора;
                       C   – смещение по Y относительно
                             позиции курсора;
                       L   – смещение шаблона в левом
                             столбце байтов.

(18) Установить адрес шаблона графического курсора 
     Исходные данные:  C   – номер сегмента шаблона;
                       HL  – адрес шаблона в сегменте;
     Выходные данные:  нет.

(19) Получить адрес шаблона графического курсора 
     Исходные данные:  нет;
     Выходные данные:  C   – номер сегмента шаблона;
                       HL  – адрес шаблона в сегменте.

(20) Установить адрес буфера для сохр. данных под курсором 
     Исходные данные:  CBED – номера сегментов ОЗУ;
                       HL   – адрес в пределах сегментов;
     Выходные данные:  нет.

(21) Получить адрес буфера для сохр. данных под курсором 
     Исходные данные:  нет;
     Выходные данные:  CBED – номера сегментов ОЗУ;
                       HL   – адрес в пределах сегментов.

(22) Получить длину буфера для сохранения инф. под курс.
     Исходные данные:  нет;
     Выходные данные:  DE – длина буфера;

5. Вывод графики (вектор 0F82AH)

5.1. Вывод точки

Координаты выводимых точек — двухбайтовые. Они могут быть отрицательными (в дополнительном коде с единичным старшим битом). Диапазон координат X,Y: −32768..-1..0..32767 (8000H..0FFFFH..0..7FFFH). Координаты указываются относительно левого верхнего угла текущего окна. Отрицательные значения координат могут быть использованы, например при рисовании линий, выходящих за пределы окна, и в других случаях. Если точка не попадает в текущее окно, то она не выводится.

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

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

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

Функции, связанные с выводом точки (слева в скобках указан номер функции, помещаемый перед вызовом в регистр A):

(0) Засветить точку заданным цветом
    Исходные данные:  DE  – координата X,
                      BC  – координата Y, L   – код цвета;
    Выходные данные: «CY» – признак нахождения вне окна.

(1) Засветить точку цветом изображения 
    Исходные данные:  DE  – координата X,
                      BC  – координата Y, 
    Выходные данные: «CY» – признак нахождения вне окна.

(2) Погасить точку цветом фона
    Исходные данные:  DE  – координата X,
                      BC  – координата Y, 
    Выходные данные: «CY» – признак нахождения вне окна.

(3) Проинвертировать точку
    Исходные данные:  DE  – координата X,
                      BC  – координата Y, 
    Выходные данные: «CY» – признак нахождения вне окна.

(4) Определить цвет точки
    Исходные данные:  DE  – координата X,
                      BC  – координата Y,
    Выходные данные: «CY» – признак нахождения вне окна,
    иначе:
                      A   – код цвета точки;

Для режима группового кодирования дополнительно возвращается признак «NZ», если точка засвечена в ОЗУ переднего плана, и «Z» - если погашена. Для всех остальных режимов всегда возвращается признак «NZ».

5.2. Вывод линии

Для вывода линии должны быть заданы координаты ее начальной и конечной точек.

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

Вывод пунктирной линии осуществляется по специальной 16-разрядной маске. Формирование каждой точки линии происходит в соответствии со значением очередного разряда маски (циклически, начиная со старших разрядов): если бит маски нулевой, то точка гасится, если единичный — то засвечивается.

Пунктирная линия вырождается в непрерывную при значениях маски 0000H (гашение линии) или 0FFFFH (засветка).

Функции для вывода линии:

(5) Установить координаты начальной точки для линии 
    Исходные данные:  DE  – координата X начала линии;
                      BC  – координата Y начала линии;
    Выходные данные:  нет.

(6) Получить координаты начальной точки для линии 
    Исходные данные:  нет;
    Выходные данные:  DE  – координата X начала линии;
                      BC  – координата Y начала линии.

(7) Вывести линию засветкой точек заданным цветом 
    Исходные данные:  DE – координата X конца линии;
                      BC – координата Y конца линии;
                      L  – код цвета линии;
    Выходные данные:  нет.

(8) Вывести линию инверсией точек
    Исходные данные:  DE – координата X конца линии;
                      BC – координата Y конца линии;
    Выходные данные:  нет.

(9) Вывести пунктирную линию
    Исходные данные:  DE – координата X конца линии;
                      BC – координата Y конца линии;
    Выходные данные:  нет.

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

(10) Установить режим вывода пунктирной линии 
     Исходные данные:  C   – код режима:
                             C7-C3 – резерв (00000);
                             C2    – признак инверсии (цвета фона
                                   и изображения  меняются местами);
                             C1,C0:
                                     0 –  наложение  с полной заменой
                                          (если очередной разряд маски 0,  
                                          то  текущая  точка линии гасится 
                                          цветом фона,  если 1 – засвечивается 
                                          цветом изображения);
                                     1 -  наложение  по  ИЛИ  (цветом изображения 
                                          засвечиваются только  те точки,  которым 
                                          в маске соответствует 1);
                                     2 -  наложение по И (цветом фона гасятся 
                                          только те точки, которым  
                                          в маске соответствует 0);
                                     3 -  наложение  по  исключающему ИЛИ 
                                          (независимо  от  цветов фона  и 
                                          изображения:  если в маске 1, то 
                                          производится инверсия цвета,  
                                          если 0 – цвет точки не меняется);
                       HL  – Маска линии;
     Выходные данные:  нет.

(11) Получить текущий режим вывода пунктирной линии 
     Исходные данные:  нет;
     Выходные данные:  C  – номер режима;
                       HL – маска линии.

Функция (10) сбрасывает указатель в маске на старший бит. Совместно с функцией (11) данное свойство может быть использовано, например, для прорисовки углов фигуры (для этого надо последовательно вызвать функции (11) и (10)).

5.3. Вывод прямоугольника

Для вывода прямоугольника в виде рамки необходимо указать координаты его двух противоположных углов. Один из углов задается координатами начала линии (функцией 5), другой — входными параметрами DE, BC.

(12) Вывести прямоугольник в виде рамки заданным цветом 
     Исходные данные:  BC  – координата Y одного из углов;
                       DE  – координата X одного из углов;
                       L   – код цвета;
     Выходные данные: «CY» – выход за пределы окна.

(13) Вывести прямоугольник в виде рамки с инверсией 
     Исходные данные:  BC  – координата Y одного из углов;
                       DE  – координата X одного из углов;
     Выходные данные: «CY» – выход за пределы окна.

Функция (13) может использоваться для вывода рамки с возможностью последующего стирания.

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

(14) Вывести столбец, закрашенный заданным цветом 
     Исходные данные:  BC  – координата Y одного из углов;
                       DE  – координата X одного из углов;
                       L   – код цвета;
     Выходные данные: «CY» – выход за пределы окна.

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

5.4. Вывод окружности

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

(15) Вывести окружность заданным цветом 
     Исходные данные:  BC  – координата Y центра;
                       DE  – координата X центра;
                       H   – радиус (по горизонтали);
                       L   – код цвета;
     Выходные данные:  Нет.

5.5. Заполнение ограниченной области

(16) Заполнить ограниченную область заданным цветом 
     Исходные данные:  BC  – координата Y начальной точки заполнения;
                       DE  – координата X начальной точки заполнения;
                       H   – код цвета границы;
                       L   – код цвета заполнения;
     Выходные данные: «CY» – начальная точка вне окна.

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

При выполнении функции (16) в качестве временного буфера используется часть сегмента 31 (страница 7 ОЗУ) с адресами 0EC40H..0EFFFH.

(17) Установить режим заполнения
     Исходные данные:  C   – код режима:
                             0 – направление вверх и вниз;
                             1 - направление вправо и влево;
     Выходные данные:  нет.

(18) Получить режим заполнения
     Исходные данные:  нет;
     Выходные данные:  C – код режима:
                           0 – направление вверх и вниз;
                           1 - направление вправо и влево.

5.6. Обработка спрайтов

(19) Сохранить область экрана (спрайт) в буфере 
     Исходные данные:  BC  – Y левого верхнего угла спрайта в окне 
                             доступного экрана;
                       DE  – X левого верхнего угла спрайта
                             в окне доступного экрана;
                       H   – высота спрайта;
                       L   – ширина спрайта;
     Выходные данные: «CY», «NZ» – переполнение буфера;
                      «CY»,»Z»  – выход за пределы окна;
                      «NC»      – нормальное завершение.

(20) Отобразить область экрана (спрайт) из буфера 
     Исходные данные:  BC  – Y левого верхнего угла спрайта 
                             в окне доступного экрана;
                       DE  – X левого верхнего угла спрайта
                             в окне доступного экрана;
                       H   – высота спрайта;
                       L   – ширина спрайта;
     Выходные данные: «CY»,»NZ» – переполнение буфера;
                      «CY»,»Z»  – выход за пределы окна;
                      «NC»      – нормальное завершение.

Структура буфера для сохранения/восстановления спрайтов аналогична буферу для сохранения/восстановления окна экрана.

(21) Установить адрес буфера для сохранения спрайта 
     Исходные данные:  CBED – номера сегментов ОЗУ;
                       HL   – адрес начала буфера (во всех
                              сегментах одинаковый);
     Выходные данные:  нет.

(22) Получить адрес буфера для сохранения спрайта 
     Исходные данные:  нет;
     Выходные данные:  CBED – номера сегментов ОЗУ;
                       HL   – адрес начала буфера (во всех
                              сегментах одинаковый).

(23) Определить длину буфера для сохранения спрайта
     Исходные данные:  H    – высота спрайта;
                       L    – ширина спрайта;
     Выходные данные:  DE   – необходимая длина буфера для
                              сохранения спрайта указанных
                              размеров (для одной экранной
                              плоскости).