Программирование видеоадаптеров CGA,EGA и VGA

       

Конечная линия курсора (Cursor End Register - CER) (индекс0Bh)



Конечная линия курсора
(Cursor End Register - CER) (индекс 0Bh)

Регистр задает нижнюю линию сканирования символа, в которой кончается курсор.

  • D4-D0 Соответствует номеру последней линии курсора.
  • D7-D5 Не используются.

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

Режим0,1,2,34,5,6
Содержимое регистра7 0

Изменяя значение регистров начальной и конечной линии курсора можно менять его положение и размер.

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


// изменение размеров курсора #include <stdio.h> #include "sysp.h" #include "sysgraph.h" void main(void) { char top = 0, bottom = 0; unsigned crt_address; BIOS_VAR _far *bios_var_ptr; // получаем указатель на область переменных видеофункций BIOS bios_var_ptr = (BIOS_VAR _far *) FP_MAKE(0x0000, 0x0410); // определяем адрес порта индексного регистра контроллера ЭЛТ crt_address = bios_var_ptr->crt_address; printf("Введите верхнюю границу курсора:"); scanf("%d", &top); printf("Введите нижнюю границу курсора:"); scanf("%d", &bottom); // изменение формы курсора // выбираем регистр начальной линии курсора WriteReg(crt_address++, 0x0A); // записываем в регистр значение переменной top WriteReg(crt_address--, (unsigned char) top); // выбираем регистр конечной линии курсора WriteReg(crt_address++, 0x0B); // записываем в регистр значение переменной bottom WriteReg(crt_address, (unsigned char)bottom); getch(); }

Данная программа, а также часть программ, приведенных ниже, использует для доступа к регистрам видеоадаптера функции ReadReg и WriteReg: /** *.Name WriteReg * *.Title Запись в порт. * *.Descr Функция выводит данные в порт. * *.Proto WriteReg(unsigned reg, unsigned char data) * *.Params unsigned reg - номер регистра, * * unsigned char data - данные, записываемые в регистр. * *.Return Не ипользуется. * *.Sample get_curs.c **/ WriteReg(unsigned reg, unsigned char data) { _asm { mov dx,reg mov al,data out dx,al } } /** *.Name ReadReg * *.Title Чтение регистра. * *.Descr Функция читает данные из определенного порта. * *.Proto unsigned char ReadReg(unsigned reg) * *.Params unsigned reg - номер регистра. * *.Return считанные данные. * *.Sample get_curs.c **/ unsigned char ReadReg(unsigned reg) { unsigned char data; _asm { mov dx,reg in al,dx mov data,al } return(data); }

Вместо этих функций для доступа к регистрам можно использовать функции inp и outp, из стандартных библиотек трансляторов Microsoft Quick C 2.5 и C 6.0.



Содержание раздела