* прерываний последовательного порта.
*/
intmask = inp(P8259 _1) | int_disable_mask;
outp(P8259_1, intmask);
/* Восстановить первоначальный вектор прерывания */
_dos_setvect(int_number, old_handler);
/* Снова разрешить прерывания */
_enable();
}
/*---------------------------------------------------------*/
/* s _ s e n d c h a r
* Поместить символ в очередь на передачу. Вернуть 1, если
* все в порядке, в противном случае вернуть 0.
*/
int s_sendchar(int ch)
{
int retval, intmask;
_disable();
retval = q_puton(txq, (char *)&ch);
_enable();
/* Включить прерываниеTHRE в том случае, если оно выключено
* и не получен XOFF.
*/
if (rcvd_xonxoff != XOFF_RCVD)
turnon_int(THREINT,intmask);
return(retval);
}
/*---------------------------------------------------------*/
/* s _ r c v c h a r
* Вернуть символ из очереди на прием.
* Вернуть 1, если очередь пуста.
*/
int s_rcvchar(void)
{
int ch, intmask;
/* Если ранее был послан сигнал XOFF, то мы должны направить
* XON.
*/
if(enable_xonxoff)
{
if(rxq->count <= LO_TRIGGER(RXQSIZE) &&
sent_xonxoff != XON_SENT )
{
send_xon = TRUE;
turnon_int(THREINT,intmask);
}
}
_disable();
if (q_getfrom(rxq, (chr *)&ch) == NULL)
{
_enable();
return(-1);
}
else
- 8-31 -
{
_enable();
return(ch);
}
}
/*--------------------------------------------------------*/
/* q _ g e t f r o m
* Копировать следующий элемент данных в очередь в
* определенное местоположение. Также вернуть указатель
* на этот элемент.
*/
char *q_getfrom( QTYPE *queue, char *data)
{
char *current;
current = NULL;
if(queue->front == -1) return(current);
/* В противном случае искать данные */
current = &(queue->data[queue->front]);
*data = *current;
queue->count--;
if(queue->count == 0)
{
/* Очередь пуста. Сбросить начало, конец и счет */
queue->front = queue->rear = -1;
return(current);
}
/* Увеличить начальный индекс и проверить на циклический
* переход.
*/
if(queue->front == queue->maxsize-1)
queue->front = 0;
else
queue->front++;
return(current);
}
/*--------------------------------------------------------*/
/* q _ p u t o n
* Поместить элемент данных в очередь.
*/
int q_puton(QTYPE *queue, char *data)
{
/* Сначала проверить степень заполнения очереди.
* Если она полна, то вернуть 0.
*/
if(queue->count == queue->maxsize) return(0);
/* В противном случае установить на конец и провести
* проверку на циклический переход.
*/
if(queue->rear == queue->maxsize-1)
queue->rear = 0;
else
queue->rear++;
/* Сохранить символ в очереди */
queue->data[queue->rear] = *data;
queue->count++;
- 8-32 -
if(queue->front == -1) queue->front = 0;
return(1); /* Успешно вставленный элемент */
}
_____________________________________________________________
Заключение
В этой главе рассмотрены характеристики аппаратных средств
последовательного порта в системах MS-DOS и представлены методы
его программирования. Также содержится небольшая коммуникационная
программа, написанная на Microsoft C 5.0, для иллюстрации реали-
зации этих методов на практике. Программирование последовательно-
го порта для управляемого прерывания ввода/вывода выполняется
следующим образом:
1. Получить базовый адрес выбранного коммуникационного порта
из области данных BIOS на сегменте 40h и со смещением 0.
2. Используя функцию MS-DOS 35h, получить адрес старой под-
программы обслуживания прерывания для номера прерывания,
соответствующего данному адаптеру, и сохранить его.
3. Используя функцию MS-DOS 25h, установить для номера преры-
вания Вашу собственную подпрограмму обслуживания прерыва-
ния.
4. С использованием функции BIOS 14h установить коммуникаци-
онные параметры адаптера.
5. Установить очереди приема и передачи для содержания входя-
щих и исходящих символов.
6. Включить в регистре управления модемом необходимые сигналы
(например, DTR - терминал готов и RTS - запрос на переда-
чу).
7. Разрешить все прерывания адаптера (установкой битов с 0 по
3 в регистре разрешения прерывания в 1).
8. Так же включить бит OUT2 в регистре управления модемом для
разрешения прерываний последовательного адаптера.
9. Запрограммировать контроллер 8259A для распознавания пре-
рываний с IRQ этого адаптера (путем установки соответству-
ющего бита регистра маски прерывания, доступного через ад-
рес порта 21h, в 0).
При выполнении некоторых операций, если пользователь решает
прервать сеанс работы, должна быть вызвана подпрограмма "очист-
ки". Очистка выполняется следующим образом:
1. Выключить прерывания последовательного адаптера.
2. Сбросить биты регистра управления модемом.
3. Восстановить старую подпрограмму обработки прерывания.
4. Замаскировать прерывания для этого IRQ в 8259A.
Глава 9. ПРОГРАММИРОВАНИЕ EGA И VGA
Мониторы и возможности EGA
Прямая запись на экран
Много точек
Чтение битовых матриц
Цветовые палитры EGA
Регистр циклического сдвига данных
Режим отображения 256 цветов VGA
Заключение
Усовершенствованный графический адаптер (EGA) и более новая
видеографическая матрица (VGA) предлагают разработчику единствен-
ные в своем роде задачи. EGA становится традиционной графической
картой в мире MS-DOS. Тем не менее, существует четыре совершенно
различных графических стандарта поддержки EGA:
1. Графические режимы, совместимые с CGA.
2. Два новых графических режима EGA для 200-строчных цветных
мониторов.
3. Новый графический режим EGA для 350-строчных цветных мони-
торов.
4. Новый графический режим EGA для использования с монохром-
ными (текстовыми) мониторами.
Помимо всех указанных режимов, VGA поддерживает еще несколько
новых. В этой главе рассматриваются концепции программирования
каждого нового графического режима EGA, а также новые режимы VGA.
Не охватываются совместимые с CGA текстовый и графический режимы,
так как они более приемлемы для карты CGA.
Оригинальная плата EGA фирмы IBM поступает с 64К графической
памяти. Она может быть расширена до 256К. Чем больше память EGA,
тем шире графические возможности адаптера. EGA-совместимые карты
других производителей обычно поступают с уже установленными 256К
памяти. Карты VGA в большинстве новых персональных компьютерах
IBM System 2 включены в объединительную плату; для других ПК VGA
доступна в качестве платы расширения. В каждом случае VGA всегда
будет иметь установленными 256К памяти.
Видеофункции компьютера IBM PC вызываются прерыванием BIOS
10h. Эти видеофункции позволяют программе устанавливают текстовый
или графический режимы, считывать или писать одиночные точки
растра и помещать символы на экран. Адаптер EGA имеет новую BIOS,
которая заменяет все оригинальные функции персонального компьюте-
ра и добавляет несколько новых. Эти функции EGA позволяют опреде-
лять новые символы, лучше управлять палитрой и выводом на печать
текстовых строк.
- 9-2 -
Мониторы и возможности EGA
Адаптер EGA создан для работы с тремя различными типами мони-
торов: цветным дисплеем IBM, усовершенствованным цветным дисплеем
IBM или монохромным дисплеем IBM, а также с эквивалентными дисп-
леями других производителей. Обычно, тип используемого монитора
определяет графическое разрешение, максимальное количество цве-
тов, цветовую палитру и число элементов растра, составляющее каж-
дый символ. Карта VGA должна использоваться с цветным или монох-
ромным аналоговым монитором. Несмотря на то, что аналоговый
монитор функционально отличается от цифрового (или ТТЛ) монитора,
программист должен рассматривать его как цифровой монитор с высо-
кой разрешающей способность. Следует только обратить внимание на
то, цветной он или монохромный.
Цветной монитор IBM имеет максимальную разрешающую способ-
ность 640 х 200 элементов изображения. Цветной монитор ограничен
200 вертикальными строками развертки ввиду того, что он может
применять только одну вертикальную частоту сканирования. При ис-
пользовании с цветным монитором адаптер EGA совместим со всеми
текстовымы и графическими режимами цветного графического адапте-
ра. Два новых графических режима, режимы 13 и 14, используют до
16 цветов с разрешением 320 х 200 и 640 х 200. Тем не менее,
цветной монитор ограничивается 16-цветной фиксированной палитрой
и 200-ми вертикальными линиями развертки. Фиксированная палитра
использует те же 16 цветов, что и CGA в текстовом режиме. Исполь-
зуемый по умолчанию прямоугольник для генерации символа имеет
размер 8 х 8 элементов изображения. Эти режимы перечислены в таб-
лице 9-1.
Таблица 9-1
Использование EGA c цветным монитором IBM
ДДДДВДДДДДДДДДВДДДДДДДВДДДДДДДДВДДДДДДДВДДДДДДДДВДДДДВДДДДДДДД
Но- ¦ Тип ¦Макси- ¦ Размер ¦ Размер¦ Макси- ¦Сег-¦ Разре-
мер ¦ ¦мальное¦(столбцы¦ прямо-¦ мальное¦мент¦ шение
ре- ¦ ¦число ¦ х ¦ уголь-¦ число ¦бу- ¦
жима¦ ¦цветов ¦ строки)¦ ника ¦ страниц¦фера¦
ДДДД†ДДДДДДДДД†ДДДДДДД†ДДДДДДДД†ДДДДДДД†ДДДДДДДД†ДДДД†ДДДДДДДД
0 ¦ Текст ¦ 16 ¦ 40х25 ¦ 8х8 ¦ 8 ¦B800¦ 320х200