Описание драйвера дисплея  TV-PRO, на Орион ПРО, PRODOS

Драйвер графического дисплея компьютера Орион ПРО

Продаю платы и наборы микросхем, куплю микросхемы Платы и комплектующие на ПК Орион-128

E:250997                                (C) 1990-1997 ORIONSOFT

-------------------------------------------------------------------------------------------------------

                                         КОМПЬЮТЕР "ORION-PRO"

                ОПИСАНИЕ ДРАЙВЕРА ДИСПЛЕЯ "TV-PRO"

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

-------------------------------------------------------------------------------------------------------

                        1. ОБЩИЕ ПОЛОЖЕНИЯ

                       ==================

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

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

      - максимальное использование возможностей компьютера;

     - максимальное быстродействие при ограниченном об еме;

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

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

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

      0F809H - вывод символа на экран из регистра (C);

   * 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). Функции  вектора  0F80CH   для    управления    экраном, обеспечивающие  управление  режимами  экранов,  переключение  их номеров,  установку  цветов,  а  также  определение  размеров  и положения текущего окна вывода;

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

    3). Функции вектора 0F82AH для вывода графики: точки, линии, прямоугольника, окружности, заполнения ограниченной области.

    4). Функции вектора 0F82DH для построения системы динамического распределения ОЗУ в PRODOS.

                      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 пикселей). Следует заметить, что для исключения конфликтов различных программ для выделения памяти под указанные буферы необходимо  использовать  входящую  в PRODOS систему динамического распределения ОЗУ.

 

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

              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 байт    дированием цвета)

 

    В цветовых режимах 6-9 номера экранов могут принимать  значения 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).

 

    После переключения доступного и видимого экранов из режимов 0-5 или 10-11 в режимы 6-9 и обратно пользователь должен назначить требуемый номер экрана,  так как в противном случае он может быть некорректно определен.

  

    (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  = m * [шаг символов по Y],

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

 

       Если же указанное условие не выполняется,  то высота окна должна выбираться так:

 

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

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

 

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

       HL = [ширина символа] + (n-1) * [шаг символов по 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 при вызове функции сохранения окна).  В процессе восстановления окна содержимое буфера сначала  сдвигается вправо на величину, определяемую смещением окна в пределах левого столбца байтов. После восстановления буфер снова сдвигается влево до нулевого смещения.  Таким образом, обеспечивается перемещение окна в любую точку экрана с некоторой потерей  скорости.

 

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

 

     (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.

  

    Управляющие символы с кодами 07H-1FH действуют так же,  как и в "Мониторе-2" компьютера "Орион-128", кроме кода 0CH, выполняющего очистку текущего окна  с  установкой  курсора  в  левый верхний угол.  Для вывода изображения символов с кодами 00H-1FH предусмотрен префикс 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 (количество записываемых байтов равно длине шаблона одного символа). Пользователь может впоследствии изменять размеры стандартного курсора в пределах знакоместа, не меняя его шаблон (или вообще заменить шаблон,  размеры  и форму курсора,  сделав его,  например,  в виде крестика или рамочки). Если дополнительно задан признак активизации ЗГ, то автоматически устанавливается стандартный курсор в виде черточки,  причем его размер будет соответствовать размеру символа выбранного стандартного шрифта.

 

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

 

    Функции вывода и  гашения  курсора  (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" имеет несколько сжатый с боков экран,  функция  вывода  окружности  автоматически  корректирует значение  радиуса  окружности  по  вертикали,  устанавливая  его равным 3/4 от заданного.

 

    (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   - необходимая длина буфера для

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

                                 * * *

           6. СИСТЕМА ДИНАМИЧЕСКОГО РАСПРЕДЕЛЕНИЯ ОЗУ

          ==========================================

                        (ВЕКТОР 0F82DH)

                        ===============

                       6.1. ОБЩИЕ СВЕДЕНИЯ

                      -------------------

     Наличие относительно большого для  8-разрядных  компьютеров объема памяти  в  ПК "Orion-Pro" (32 сегмента по 16 Кбайт,  что соответствует суммарной емкости 512 Кбайт в  базовом  варианте) вызывает необходимость  централизованного  управления ей с тем, чтобы исключить конфликты программ пользователя между  собой  и операционной системой  PRODOS.  Для  этого  ресурсы  памяти  ПК должны  выделяться  и  освобождаться  в   процессе   выполнения программ (т.е. динамически) через единую систему  распределения ОЗУ, являющуюся частью  операционной  системы.

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

 

    - инициализацию своих внутренних параметров;

    - проверку занятости указанной области памяти;

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

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

    - освобождение ранее выделенной области памяти.

 

    Так как память в ПК "Orion-Pro"  имеет  страничную  (по  60 Кбайт) и сегментную (по 16 Кбайт) организацию,  при  разработке системы динамического распределения ОЗУ необходимо было  решить вопрос о том, на каком уровне выполнять  распределение  памяти:

на страничном или сегментном.

     Выбор был сделан в пользу  последнего  способа,  поскольку, во-первых, при обращении к ОЗУ посегментно (через одно из  окон в  адресном  пространстве  процессора)  можно  получить  доступ практически ко  всей  памяти  компьютера,  а  при  постраничном обращении теряется 4 Кбайта на каждую страницу  (из-за  наличия непереключаемого   ОЗУ   0F000..0FFFFH).   Во-вторых,   драйвер дисплея TV-PRO взаимодействует с ОЗУ также  через  сегменты,  и целый ряд его функций для работы с  буфером  экрана  (например, сохранение  и  восстановление  окна,  вывод  спрайта  и   т.д.) требуют  указания  сегментных  адресов  памяти,  т.е.   номеров сегментов и адресов в пределах сегментов (0..3FFFH).

     Таким образом, рассматриваемую систему можно назвать системой сегментного динамического распределения памяти. Недостатком такого подхода можно считать то,  что система не может выделить область памяти,  находящуюся на границе двух сегментов, а также то, что  максимальный  объем  непрерывной  области  в  адресном пространстве процессора в общем случае не превышает 16 Кбайт.

     Система распределения  памяти  обеспечивает работу с многомерными областями памяти,  имеющими размерность от 1 до 4.  Под размерностью  области  памяти понимается количество "параллельных" плоскостей ОЗУ, размещенных в разных сегментах, но имеющих одинаковые адреса в пределах сегментов.  Данное условие необходимо для реализации функций драйвера TV-PRO, работающих с буфером  экрана.  Так,  при сохранении окна монохромного экрана используется буфер размерностью 1, а при сохранении окна 16-цветного экрана (EGA) - размерностью 4.

              6.2. ТАБЛИЦА ОПИСАНИЯ ОБЛАСТИ ПАМЯТИ

             ------------------------------------

     При  выполнении  функций  распределения  ОЗУ  должны   быть указаны параметры выделяемой  (освобождаемой)  области  памяти, включающие  ее  начальный  адрес   и   длину.   Эти   параметры представляются в виде специальной таблицы, называемой  ТАБЛИЦЕЙ

ОПИСАНИЯ ОБЛАСТИ (ТОО) длиной от 6 до 9 байт:

 

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

    - длина области (1..4000H) - 2 байта;

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

    -  список  номеров  сегментов  ОЗУ,  в  которых   находятся плоскости области, при этом количество сегментов  соответствует размерности области - 1..4 байта.

 

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

                  6.3. ТАБЛИЦА ОПИСАНИЯ СИСТЕМЫ

                 -----------------------------

     Для выполнения задач,  возлагаемых на систему распределения ОЗУ, она  должна  вести учет наличия свободной памяти.  В самом начале работы системы,  когда память еще не задействовалась,  в распоряжении системы находится исходный массив сегментов,  указанный в момент ее инициализации. При этом необязательно, чтобы в динамическую  память были включены все сегменты,  имеющиеся в компьютере: например, в нее можно не включать экранные сегменты и сегменты рабочей страницы ОЗУ.  Для указания системе допустимых к использованию сегментов используется СПИСОК НОМЕРОВ  СЕГМЕНТОВ (СНС).  Номера  сегментов в этом списке не должны повторяться. Под длиной СНС будем понимать количество сегментов, выделяемых под  динамическую память (для хранения номера сегмента используется 1 байт).

 

    По мере выделения и освобождения ОЗУ в процессе  выполнения программ  объем свободной динамической памяти будет изменяться, поэтому система ведет специальный  служебный  СПИСОК  СВОБОДНЫХ ОБЛАСТЕЙ (ССО).  Каждый элемент списка свободных областей называется ОПИСАТЕЛЕМ СВОБОДНОЙ ОБЛАСТИ и содержит 5 байт:

     - длина свободной области (1..4000H);

    - сегментный адрес начала свободной области (0..3FFFH);

    - номер сегмента, в котором находится свободная область.

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

 

    При инициализации системы в ССО будет включено столько описателей,  сколько сегментов было задано в СНС (по одному описателю на каждый сегмент); начальные адреса всех свободных областей будут равны 0, а длины - 4000H (16 Кбайт).

 

    Итак, состояние системы распределения сегментной динамической памяти характеризуется двумя списками: СНС и ССО, параметры которых  постоянно  хранятся  в так называемой ТАБЛИЦЕ ОПИСАНИЯ

СИСТЕМЫ (ТОС), содержащей 7 байт:

 

    - текущая длина ССО      - 1 байт;

    - максимальная длина ССО - 1 байт;

    - адрес размещения ССО   - 2 байта;

    - длина СНС              - 1 байт;

    - адрес размещения СНС   - 2 байта.

 

    Заметим,  что  адреса  размещения   списков   СНС   и   ССО указываются  в  пределах  рабочей  страницы   ОЗУ,   при   этом запрещается использовать адреса в области окна ROM2  -  2000H.. 3FFFH.

 

                  6.4. ИНИЦИАЛИЗАЦИЯ СИСТЕМЫ

                  --------------------------

 

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

 

    - создать СНС, разместив его в рабочей странице ОЗУ;

    - зарезервировать память под ССО,  задавшись его максимальной длиной (количеством элементов) и учитывая, что один элемент ССО занимает 5 байт;

    - заполнить все байты ТОС, кроме первого.

 

    При инициализации  первый байт ТОС заполняется системой автоматически исходя из длины СНС.

 

            6.5. ВЫЗОВ ФУНКЦИЙ РАСПРЕДЕЛЕНИЯ ПАМЯТИ

            ---------------------------------------

     Набор базовых функций низкого уровня системы  распределения памяти  находится в ROM2 V2.00 и доступен через вектор ROM-BIOS с адресом 0F82DH, при этом номер вызываемой функции определяется значением регистра (A).  Операционная система PRODOS использует указанные функции низкого уровня (за счет чего сокращается ее объем) и имеет свои операции более высокого уровня,  доступные через вызов расширенной BDOS и позволяющие обращаться программам  пользователя к уже инициализированной системной динамической памяти.  Здесь будут рассмотрены только функции  низкого уровня, доступные через вектор 0F82DH.

 

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

 

    (0)    Инициализация динамической памяти (INIMEM)

           На входе:

              DE - адрес ТОС с заполненными данными, кроме пер-

                   вого байта;

                   должен быть создан СНС и зарезервирована память под ССО;

           На выходе:

              A  - код завершения:

                   0 - ССО инициализирован успешно;

                   2 - переполнение ССО;

                   3 - повторный сегмент в СНС;

                   4 - недопустимый номер сегмента в СНС;

                   5 - недопустимая длина СНС.

 

    (1)    Проверка занятости области памяти (CHKMEM)

           На входе:

              DE - адрес ТОС;

              HL - адрес ТОО с параметрами области;

           На выходе:

              A  - код завершения:

                   0 - указанная область полностью свободна;

                   1 - указанная область  полностью  занята или

                       вообще отсутствует в системе;

                   2 - указанная область занята частично;

                   3 - недопустимое значение размерности области в ТОО (вне диапазона 1..4).

 

    (2)    Принудительное выделение области памяти (MRKMEM)  (установка признака использования области)

           На входе:

              DE - адрес ТОС;

              HL - адрес ТОО с параметрами выделяемой области;

           На выходе:

              A  - код завершения:

                   0 - указанная область выделена успешно и переведена в разряд занятых;

                   1 - указанная область  уже  полностью занята      или вообще отсутствует в системе;

                   2 - указанная область уже занята частично;

                   3 - недопустимое значение размерности области в ТОО (вне диапазона 1..4);

                 255 - фатальная ошибка памяти (нарушение целостности системы).

 

    (3)    Запрос области памяти требуемой длины (GETMEM)

           На входе:

              DE - адрес ТОС;

              HL - адрес ТОО с первыми  тремя заполненными бай-

                   тами:

                   (HL+0)        - требуемая  размерность выделяемой области 1..4;

                   (HL+1),(HL+2) - требуемая  длина  выделяемой

                                   области 1..4000H;        

           На выходе:

              A  - код завершения:

                   0 - требуемая область выделена успешно;

                   1 - нет  сегментной  памяти   для  выделения

                       требуемой области;

                   2 - переполнение ССО;

                   3 - недопустимое значение размерности области (вне диапазона 1..4);

                 255 - фатальная ошибка памяти (нарушение целостности системы);

           Для A=0:

              HL указывает на ТОО со всеми параметрами выделенной области.

 

    (4)    Освобождение указанной области памяти (FREMEM)

           На входе:

              DE - адрес ТОС;

              HL - адрес ТОО с параметрами области;

           На выходе:

              A  - код завершения:

                   0 - указанная область освобождена успешно;

                   1 - указанная область не была выделена (пол-

                       ностью или частично свободна);

                   2 - переполнение ССО;

                   3 - недопустимое значение размерности области в ТОО (вне диапазона 1..4);

                   4 - недопустимый номер сегмента в ТОО   (отсутствует в СНС);

                 255 - фатальная ошибка памяти (нарушение целостности системы).

 

 *** ORIONSOFT ***

 

Купить платы, наборы микросхем на Орион-128, КР565РУ5В, КР565ру7В, к565ру5г AU, к565ру7г Au в позолоте, куплю микросхемы, Z80, микропроцессоры и микроконтроллеры

 

Полезные и интересные статьи

На предыдущую страницу  На главную страницу  На следующую страницу