



















                 Минибиблиотека работы с экраном
                 для IBM-совместимого компьютера





                               Автор: Шапорев Т.В.










                           Москва 1990


                            Аннотация

     Ниже  описывается простая библиотека для языка C для работы с
алфавитно-цифровым экраном на всех типах IBM-сомемтимых копьютеров
под управлением MS-DOS.
     В тексте без объяснения используются понятия, описанные в до-
кументации по IBM PC.

                          1. Назначение

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

                          2. Применение

     Библиотека работает в любой модели памяти любой системы про-
граммирования на C под управлением любой версии MS-DOS.
     Определения, необходимые для работы библиотеки, содержатся в
файле console.h
     Функции для использования с "крошечной" (tiny) моделью памяти
находятся в файле consolet.lib; функции для "малой" (small) и
"компактной" (compact) моделей - в файле consolen.lib; для "сред-
ней" (medium), "большой" (large) и "громадной" (huge) моделей - в
файле consolef.lib.

                       3. Описания функций

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

	struct	VideoSettings
	{
	   union {
	      unsigned x;
	      struct {
		 unsigned char l, h;
	      } h;
	   } vs_cursor;
	   unsigned      vs_segment;
	   unsigned      vs_blocks;
	   unsigned char vs_width;
	   unsigned char vs_height;
	   unsigned char vs_mode;
	   unsigned char vs_page;
	   unsigned char vs_point;
	   unsigned      vs_color:1;
	   unsigned      vs_graph:1;
	   unsigned      vs_hivid:1;
	};

	void AskVideo ( struct VideoSettings far * );

     Функция получает в качестве параметра указатель на структуру
типа VideoSettings и заполняет ее поля следующими значениями:
vs_cursor  - начальная и конечная линии изображения курсора, ко-
             торые могут быть использованы либо по отдельности
             (как поля l или h), либо как единое слово (поле x);
vs_segment - сегментный адрес начала видеобуфера в оперативной
             памяти ЭВМ. этот адрес обнаруживается поиском в диа-
             пазоне A000h - BFFFh (и не используется в дальней-
             шем библиотекой);
vs_blocks  - размер видеобуфера в оперативной памяти в блоках по
             512 байт;
vs_width   - колиечство колонок на экране;
vs_height  - количество строк на экране;
vs_mode    - номер текущего видеорежима;
vs_page    - номер активной видеостраницы;
vs_point   - размер символа по вертикали в пикселах;
vs_color   - флаг цветного видеорежима;
vs_graph   - флаг графического видеорежима;
vs_hivid   - поддерживается загрузка шрифтов (как это сделано в
             EGA, VGA, etc).

	void biosputc ( char );
        void scrputc  ( char );
     Функция получает в качестве агумента один символ и выводит
его на экран. Курсор устанавливается после выведенного символа.
     Символы "возврат каретки", "перевод строки", "возврат на шаг"
и "звонок" не выводятся на экран и выполняют соответсвующие дейст-
вия.
     Вывод символа в последнюю позицию экрана вызывает переход на
новую строку, перевод последней строки экрана вызывает скроллинг.
     Символы получают тот цвет, который имеет соответствующее мес-
то экрана перед выводом символа.

	void biosputs ( char far * );
        void scrputs  ( char far * );
     Функция получает в качестве аргумента текстовую строку и вы-
водит ее на экран.
     По сути дела представляет собой последовательное обращение к
предыдущей функции.

	void scrwipe ( short, short, short, short, short );
     Раскрашивает прямоугольную область экрана, заданную координа-
тами соответствено левого верхнего и правого нижнего углов, цветом
(аттрибутом), заданным последним аргументом.

	void scrolup ( short, short, short, short, short, short );
     Прокручивает прямоугольную область экрана, заданную координа-
тами соответствено левого верхнего и правого нижнего углов, вверх
на число строк, заданное последним аргументом и раскрашивает вновь
появившиеся пустые строки цветом (аттрибутом), заданным пятым
аргументом.

	void scrolld ( short, short, short, short, short, short );
     Прокручивает прямоугольную область экрана, заданную координа-
тами соответствено левого верхнего и правого нижнего углов, вниз
на число строк, заданное последним аргументом и раскрашивает вновь
появившиеся пустые строки цветом (аттрибутом), заданным пятым
аргументом.

	void scrgoto ( short, short );
     Устанавливает курсор в заданные колонку и строку.

	void scrouts ( short, short, char far * );
     Последовательно вызывает функции scrgoto() и scrputs().

	void scrpage  ( short );
     Устанавливает текущей страницу видеобуфера с заданным номе-
ром.

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

	void scrpick ( short, short, short, short, void far * );
     Запмсывает содержимое прямоугольной области экрана, заданной
координатами соответствено левого верхнего и правого нижнего
углов, в заданный массив. Требуется два байта на каждую позицию
экрана.

	void scrload ( short, short, short, short, void far * );
     Выводит в прямоугольную область экрана, заданную координатами
соответствено левого верхнего и правого нижнего углов, информацию,
ранее сформированную функцией scrpick().

	unsigned scrpeek ( void );
     Возвращает содержимое знакоместа (символ и аттрибуты) в теку-
щем положении курсора. Курсор не перемещается.

	void scrpoke ( unsigned );
     Записывает в текущую позицию курсора символ вместе с аттрибу-
тами (символ располагается в младшем байте аргумента, а аттрибуты,
соответственно, в старшем). Любые символы, в том числе "управляю-
щие", выводятся на экран, курсор не перемещается и никаких других
действий не происходит.

	void scraddr ( short far *, short far *);
     Записывает в переменные с заданными адресами колонку м стро-
ку, в которой находится курсор.

	int keyready ( void );
     Возвращает ненулевое значение, если в буфере ввода с клавиа-
туры есть несчитанные символы.

	unsigned keyinput ( void );
     Возвращает очередное значение из буфера клавиатуры (сканкод в
старшем байте и ASCII-код в младшем. Если в буфере нет символов,
ждет нажатия клавиши.

	unsigned keyflags ( void );
     Возвращает флаги состояния клавиатуры (нажатие клавиш Shift и
тому подобное). Результат существенно различается на стандартной
и расширенной клавиатуре (которые можно программно различать по
содержанию общей переменной _oldkeyboard, следует только учесть,
что ее значение имеет смысл после хотя бы одного обращения к опи-
санным функциям работы с клавиатурой).

	void keyclear ( void );
     Очищает буфер ввода с клавиатуры.

                        4.Макроопределения

     В файле console.h кроме описаний функций присутствуют также
определения макросов:

BLACK, BLUE, GREEN, CYAN, RED, MAGENTA, BROWN, LIGHTGRAY, DARKGRAY
LIGHTBLUE, LIGHTGREEN, LIGHTCYAN, LIGHTRED, LIGHTMAGENTA, YELLOW,
WHITE - соответсвующие цвета для неграфических режимов.
BLINK - флаг повышенной яркости цвета.
BOLD  - флаг мигающего текста.
attribute(f,b) - сборка аттрибута текста из цветов фона и букв со-
	ответственно.

KEY_SCAN  - маска сканкода (для результата функции keyinput)
KEY_CHAR  - маска ASCII-кода (для результата функции keyinput)
KEY_NONE  = 0
KEY_101K  - фиктивный ASCII-код (или сканкод - в зависимости от
            клавиши), возвращаемый для клавиш расширенной клавиа-
            туры.

     Результаты функции keyinput()
     Все коды функциональных клавиш цифровой клавиатуры, сдублиро-
ванных на расширенной клавиатуре соттветствуют только цифровой
клавиатуре (при нажатии их дублей возвращаются другие коды).
KEY_ESC  - клавиша авторегистр 2 (Escape)
KEY_AP2  - она же
KEY_F1   - клавиша F1
KEY_F2   -
KEY_F3   -
KEY_F4   -
KEY_F5   -
KEY_F6   -
KEY_F7   -
KEY_F8   -
KEY_F9   -
KEY_F10  -
KEY_F11  -
KEY_F12  -
KEY_TAB  - клавиша табуляции
KEY_RET  - клавиша "ввод" на основной клавиатуре
KEY_ENT  - клавиша "ввод" на цифровой клавиатуре
KEY_HOME - клавиша "домой"
KEY_UP   - стрелка вверх
KEY_PGUP - клавиша "предыдущая страница"
KEY_LEFT - стрелка влево
KEY_RIGT - стрелка вправо
KEY_END  - клавиша "конец"
KEY_DOWN - стрелка вниз
KEY_PGDN - клавиша "следующая страница"
KEY_INS  - клавиша "вставка"
KEY_DEL  - клавиша "удаление"
