будет искать библиотеки, стартовую программу, включаемые файлы и
себя самого.
Эти параметры могут быть установлены также из
интегрированной среды путем выбора меню Options (Параметров).
После установки всех параметров такими, как вы хотели, выберите в
меню строку "Запомнить", завершая тем самым создание файла
TCCONFIG.TC.
Модели памяти
-----------------------------------------------------------------
Турбо Си поддерживает шесть моделей памяти: крошечную,
малую, среднюю, компактную, большую и огромную. Руководство
пользователя содержит раздел, посвященный моделям памяти и
разъясняющий сегментную организацию памяти для процессора 8086 и
ее проявления в различных моделях памяти. Советуем вам прочитать
и осмыслить этот раздел, поскольку понимание архитектуры
процессора 8086 позволит использовать и модифицировать
резидентные в памяти программные утилиты, представленные в данной
книге.
Библиотека исходных модулей
-----------------------------------------------------------------
Турбо Си поставляется без исходных текстов программ
библиотеки функций исполняющей системы. Но каждый пользователь
Турбо Си может купить лицензию на использование исходных текстов,
которые в этом случае поставляются ему фирмой Borland.
Заключение
-----------------------------------------------------------------
Раздел 4 начинает описание библиотеки функций Турбо Си.
После прочтения этого и последующих разделов вы получите в свое
распоряжение инструментальные программные средства, необходимые
для создания вашими программами всплывающих окон и последующего
преобразования этих программ в резидентные утилиты. На настоящий
момент нет другого компилятора, который поддерживал бы эти
средства на таком же уровне, что и Турбо Си.
ГЛАВА 4
-------
Функции общего назначения
-----------------------------------------------------------------
Эта книга посвящена программному обеспечению, и следующие
разделы содержат набор инструментальных программных средств,
которые могут быть использованы при создании прикладных систем.
Эти инструментальные средства написаны на языке Си,
транслируются с помощью компилятора Турбо Си и готовы к тому,
чтобы быть включенными в ваши программы. Эти функции могут
рассматриваться как расширения языка Си, если будут присоединены
к и без того достаточно обширной библиотеке стандартных
расширений Турбо Си. Настоящий раздел описывает функции первого
уровня, которые необходимо включать в программы, использующие
эти библиотеки. Представленные в данном разделе функции являются
функциями общего назначения, выполняющими операции низкого
уровня (специфическими для аппаратуры IBM PC) по управлению
дисплеем и клавиатурой.
Вы можете посчитать недостаточно обоснованным применение
некоторых из этих функций в своих программах. Назначением этих
функций является поддержка функций библиотеки высокого уровня,
также рассматриваемых в этой книге. В этом смысле они полезны, и
вы можете найти для них применение. Кроме того, глубина вашего
понимания функций, представленных в книге, зависит от осмысления
вами всех функций, в том числе и тех, которые вы не будете
использовать в своих программах.
При чтении описаний этих функций обращайтесь к листингу 4.1
программы ibmpc.c, который приводится после описаний.
void clear_screen()
-------------------
Эта функция очищает экран и устанавливает курсор в левый
верхний угол. Экран заполняется символами пробела, и атрибуты
символов извлекаются из символьной переменной attrib, описанной в
программе ibmpc.c. Значение этого атрибута соответствует байту
атрибута в видеопамяти, сопутствующему каждому байту ASCII-кода
при записи символа в видеопамять. Более подробная информация по
этому вопросу содержится в разделе 5. Переменная attrib принимает
значение, которое соответствует установке черного цвета для фона
символа и белого цвета для самого символа. Если вы желаете другое
значение атрибута, то должны изменить значение этой переменной
перед вызовом функции clear_screen.
int vmode()
-----------
Эта функция возвращает код текущего режима системы
формирования изображения. Она прeжде всего предназначена для
определения того, как программе интерпретировать содержимое
видеопамяти: как содержимое видеопамяти в монохромном режиме или
в алфавитно-цифровом режиме для Цветного Графического Адаптера
(CGA) и для Усовершенствованного Графического Адаптера (EGA). Эти
устройства более подробно рассматриваются в разделе 5. Функция
vmode возвращает код 7, если IBM PC работает в монохромном
режиме. Любое другое значение обозначает алфавитно-цифровой режим
для контроллеров CGA и EGA.
void cursor(int x,int y)
------------------------
Эта функция устанавливает курсор в позицию на экране,
определяемую координатами X и Y. Координаты (0,0) соответствуют
левому верхнему углу экрана. Значение координаты X изменяется в
диапазоне от 0 до 79, а координаты Y - в диапазоне от 0 до 24.
void curr_cursor(int *x, int *y)
--------------------------------
Эта функция считывает текущее положение курсора и записывает
значения координат X и Y в адреса памяти, определяемые с помощью
указателей перед обращением к функции.
int set_cursor_type(int t)
--------------------------
Эта функция устанавливает текущий размер курсора,
интерпретируемый программами из этой книги как тип курсора.
Размер обозначается целочисленной переменной, которая содержит в
старшем байте номер начальной растровой линии курсора и в младшем
байте - номер конечной растровой линии курсора.
Редактор текстов и программа ввода данных, представленные в
следующих разделах, используют возможность изменения размера
курсора для обозначения того, какой из режимов установлен:
Вставки или Замены. Курсор прямоугольной формы обозначает, что
установлен режим Вставки, он определяется значением
переменной, равным 0x0106. При этом курсор занимает
растровые линии с 1 по 6 того знакоместа, в котором он находится.
Курсор в виде знака подчеркивания обозначает режим Замены и
определяется значением переменной, равным 0x0607. При этом
курсор занимает растровые линии 6 и 7 знакоместа.
int get_char()
--------------
Эта функция является очень важной, так как выполняет
несколько крайне необходимых действий в вызывающих ее программах.
get_char принимает поступающий от клавиатуры символ путем
использования программ ROM-BIOS IBM PC. Ее главное назначение
состоит в приеме одиночного символа от клавиатуры без эха, без
преобразования и без обращения к функциям DOS. Кроме того, она
выполняет следующие дополнительные функции.
В то время, как система ожидает нажатия клавиши, функция get
_char вызывает программные прерывания по вектору 0x28, так
называемые прерывания DOSOK. Это прерывание и его значение для
создания резидентных утилит более подробно рассматриваются в
разделе 11.
Когда вы нажимаете функциональную клавишу, ROM BIOS
возвращает двубайтный код. Первый байт имеет нулевое значение и
обозначает, что следующий за ним код символа соответствует
функциональной клавише. Этот второй байт содержит 7-битный ASCII-
код, который является уникальным для каждой функциональной
клавиши. Eсли не учитывать первый нулевой байт, то реакция на
нажатие функциональных клавиш сходна с реакцией на нажатие
клавиш, соответствующих ASCII-символам, в частности, буквам.
Функция get_char преобразует двубайтную последовательность,
возвращаемую ROM-BIOS в ответ на нажатие функциональной клавиши,
в 8-битный код, позволяющий отличать функциональные клавиши от
нефункциональных. Функция осуществляет это преобразование путем
установки старшего разряда в байте, содержащем АSCII-код символа
и следующем за нулевым байтом. Формируемые коды описыватся в
исходном файле keys.h как глобальные символы (см. листинг 4.2).
Функция get_char oжидает нажатия функциональной клавиши,
обозначенной Help. Код, соответствующий функциональной клавише
Help, присвоен целочисленной глобальной переменной, названной
helpkey. Первоначально этой переменной присваивается нулевое
значение, но программные средства, которые работают с окном
Help, предназначенным для отображения справочной информациии,
будут присваивать этой переменной значение, соответствующее
функциональной клавише. При нажатии функциональной клавиши Help
функция get_char проверяет значение глобального указателя
функций, названного helpfunc. Если указатель имеет ненулевое
значение, то функция get_char вызывает адресуемую с помощью
указателя helpfunc функцию выдачи справочной информации.
void vpoke(unsigned vseg,unsigned adr,unsigned chr) int
vpeek (unsigned vseg,unsigned adr)
--------------------------------------------------------
Эти две функции считывают из видеопамяти коды символов и
атрибуты символов и записывают их в видеопамять. Для того, чтобы
использовать эти функции, вы должны разобраться в организации
видеопамяти IBM PC, а также принципах формирования изображения. В
тело функций vpoke и vpeek включены фрагменты на ассемблере. Для
того, чтобы оттранслировать эти функции, вы должны иметь
программу Macro Assembler (MASM) фирмы Microsoft, поскольку
именно она используется в Турбо Си для трансляции ассемблерных
фрагментов. Включение ассемблерных фрагментов необходимо только в
том случае, если ваши программы работают в системах, использущих
Цветной Графический Адаптер (CGA) или совместимый с ним адаптер.
Смысл этого требования разъясняется в разделе 5. Если у вас нет
контроллера CGA или если вы хотите работать с функциями, не
используя ассемблер, то удалите эти функции из исходного модуля
ibmpc.c и вставьте в файл twindow.h из раздела 6 следующие
операторы:
#define vpoke(vseg,adr,chr) poke(vseg,adr,chr)
#define vpeek(vseg,adr) peek(vseg,adr)
Эти макроопределения заменят функции vpoke и vpeek и избавят
от необходимости использования макроассемблера для функций работы
с окнами из этой книги.
Исходные модули функций общего назначения
-----------------------------------------------------------------
Листинг 4.1 представляет собой исходный текст программы
ibmpc.c, которая содержит функции, описанные в данном разделе.
Вследствие того, что функции включают фрагменты на ассемблере,
программу лучше транслировать с помощью командного компилятора
tcc, а не компилятора tc Интегрированной Среды.
Чтобы оттранслировать файл ibmpc.c, введите следующую
команду (не набирая промптер С>):
С>tcc -c ibmpc
Листинг 4.1: ibmpc.c
/* ibmpc.c */
/* Функции нижнего уровня, обращающиеся к BIOS и аппаратным
средствам РС */
#pragma inline #include static union REGS rg;
/* позиция курсора */
void cursor(int x,int y) {
rg.x.ax = 0x0200;
rg.x.bx = 0;
rg.x.dx = ((y << 8) & 0xff00) + x;
int86( 16, &rg, &rg);
}
/* возвратить позицию курсора */
void curr_cursor( int *x, int *y )
{
rg.x.ax = 0x0300;
rg.x.bx = 0;
int86( 16, &rg, &rg );
*x = rg.h.dl;
*y = rg.h.dh;
}
/* установить тип курсора */
void set_cursor_type( int t )