ИПМ им. М. В. Келдыша РАН А. О. Лацис
Операционная среда ROUTER
для транспьютерных систем.
Графическая библиотека.
Введение.
Ниже описывается базовая графическая библиотека для использования
в рамках операционной среды Router. Библиотека может использоваться в
двух вариантах: однопроцессном (независимо от Router'а) и многопро-
цессном. Данная реализация библиотеки опирается на стандартный прото-
кол ввода/вывода Inmos C Toolset и VESA BIOS видеоадаптера класса
SVGA. Возможна работа на просто VGA в режиме 320*200*256цветов.
1. Основные понятия для программиста.
Доступные прикладной программе внешние переменные и функции опи-
саны в bgraphic.h. Общая схема работы приводится ниже.
Перед началом работы следует перевести экран в графический режим.
Это делается обращением к функции
extern int bgr_init( int mode, int *s_x, int *s_y );
Здесь mode - номер требуемого режима (не в смысле BIOS, а в своей
нумерации, принятой в данной библиотеке, см. ниже), s_x и s_y -
возвращаемые размеры экрана в пикселах. Функция возвращает значение -
код ответа: BGR_OK соответствует успешному завершению, о прочих значе-
ниях см. ниже.
Во всех режимах предполагается дисплей класса "псевдоцвет" с фор-
матом видеопамяти "1 байт на пиксел". Для управления палитрой исполь-
зуется функция:
extern void bgr_setpal( int c, int cr, int cg, int cb );
Здесь c - значение пиксела, cr, cg, cb - компоненты цвета. Диапа-
зон значений компонент цвета ни к чему не приводится: значения непос-
редственно поступают в видеоадаптер. Поскольку данная реализация опи-
рается на VGA/SVGA, диапазон значений - от 0 до 63.
Для записи в видеопамять строки растра, сформированной прикладной
программой, используется функция:
extern void bgr_write( int xto, int yto, int xsize, char *start );
Здесь (xto, yto) - точка начала строки, xsize - длина записывае-
мой строки, start - указатель на строку.
Также предоставляется возможность закрасить заданным цветом пря-
моугольник со сторонами, параллельными сторонам экрана:
extern void bgr_rect( int c, int xmin, int ymin, int xmax, int ymax );
и написать горизонтальную строку текста заданным цветом в заданной позиции:
extern void bgr_text( int c, int xto, int yto, char *string );
Видеопамять при работе библотеки предполагается дважды буферизо-
ванной (работа непосредственно в экран возможна, но выглядит довольно
некрасиво). Это значит, что построения производятся в невидимом буфе-
ре, который в некоторый момент копируется на экран, и все накопленное
с момента прошлого копирования изображение становится видимым. Такое
копирование делается явно, обращением к функции:
extern void bgr_flbuf( int xmin, int ymin, int xmax, int ymax );
Аргументы этой функции задают так называемый динамический прямоу-
гольник со сторонами, параллельными сторонам экрана. Сразу после обра-
щения к bgr_flbuf невидимая видеопамять, в которой программа формирует
изображение, в пределах динамического прямоугольника заполняется нуля-
ми, а за его пределами - сохраняется. Такая схема помогает повысить
эффективность для некоторых способов двойной буферизации.
Однопроцессные возможности библиотеки этим исчерпываются. Расс-
мотрим организацию работы многих процессов пользователя в рамках сис-
темы Router.
Прежде всего, все процессы равноправны и симметричны при вызове
функций библиотеки. Внутри себя, конечно, Router различает первое и
последующие обращения к bgr_init. Тот процесс, который успел обратить-
ся первым, определяет, скольким процессам разрешено на этот раз сов-
местно работать с графикой. Чтобы сделать это, он должен перед обраще-
нием к bgr_init присвоить число процессов (включая себя), которые бу-
дут рисовать вместе, внешней переменной NPROC_REQUIRED. По умолчанию
ее значение равно 1.
Каждый следующий процесс, выполнивший bgr_init, будет регистриро-
ваться как подключившийся к графике. Если их будет слишком много
(больше, чем первый указал в своем NPROC_REQUIRED), подключения не
произойдет, bgr_init вернет аварийный код ответа BGR_TOOMANY.
Поскольку нельзя, вообще говоря, знать, кто будет первым, все ри-
сующие процессы одной программы должны указывать одно и то же значение
NPROC_REQUIRED.
Любой процесс, подключение которого прошло успешно, после завер-
шения bgr_init получит во внешней переменной NPROC_ACTUAL действитель-
ное число процессов, подключения которых будет ждать сервер. Ждать он
их будет при каждом bgr_flbuf: очередное копирование буфера в экран
произойдет только тогда, когда этого захотят все NPROC_ACTUAL
процессов. При этом динамические прямоугольники суммируются: берется
минимальный, объемлющий все заказанные.
2. Основные понятия для системного администратора.
2.1. Компоновка сервера-концентратора и программы пользователя с гра-
фической библиотекой.
В п. 5.2 документа router.doc описывается, как собрать сер-
вер-концентратор с графикой, как собрать автономную однопроцессную
программу пользователя с графикой и как собрать процесс многопроцесс-
ной задачи пользователя, использующий графику.
2.2. Поддерживаемые режимы.
# Параметры
0 320*200*256цветов, VGA
1 640*400*256цветов, SVGA - VESA BIOS
2 640*480*256цветов, SVGA - VESA BIOS
3 800*600*256цветов, SVGA - VESA BIOS
2.3. Настройка VESA-графики.
Для работы графики в режимах 1, 2, 3 (то есть VESA-режимах 0x100,
0x101, 0x103 соответственно) должны быть установлены set-переменные
VESAPAGE и VESA0xnnn, где nnn - это 100, 101, 103 соответственно. Что-
бы понять, как и для чего они устанавливаются, вспомним, как устроена
VESA-графика.
В VESA-режимах вся имеющаяся видеопамять представляет собой один
сплошной массив байтов, по байту на пиксел, причем с начала массива
расположена обычно нулевая страница, а в отношении расположения первой
и последующих, если они есть, возможны варианты, зависящие от реализа-
ции. Память эта не находится вся в адресном пространстве IBM PC, а ад-
ресуется скользящим окном (как минимум одним), которое программно ус-
танавливается на требуемое место памяти. При установке окна на конк-
ретное место видеопамяти место это указывается с точностью до величи-
ны, которое называется в VESA-документации "granularity". Значение
этой величины для данной реализации VESA-драйвера/BIOS'а можно узнать,
запустив программу. Именно это значение в виде числа в десятичной сис-
теме счисления следует присвоить set-переменной VESAPAGE. По умолчанию
- 64к, что эквивалентно:
set VESAPAGE=65536
В set-переменных VESA0xnnn для каждого режима nnn указывается (в
том же виде) смещение в байтах до начала видеостраницы номер 1, если
она есть. Обычно страница начинается на границе сегмента. В общем слу-
чае это число потребуется подбирать экспериментально. Оно будет зави-
сеть как от объема видео-ОЗУ, так и от версии VESA-драйвера/BIOS'а.
Например, в адаптере Trident T-9000 его следует задать для режима 100
равным 256к-4, если в адаптере 512к памяти.
По умолчанию, то есть если set-переменная для используемого режи-
ма не задана, будет считаться, что имеется только одна страница видео-
памяти. Обращения к функциям переключения страниц будут игнорировать-
ся, и вывод не будет дважды буферизованным, но все равно должен рабо-
тать.
В очень редких случаях может получиться, что и в режиме 0 вывод
не будет дважды буферизованным. Это бывает, если после запуска прог-
раммы iserver.exe на IBM PC не осталось 64к свободной памяти. Однако и
в этом случае все должно работать.