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

       

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


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

  • D4-D0 Соответствует номеру последней линии курсора.
  • D7-D5 Не используются.
  • По умолчанию в регистр конечной линии курсора BIOS загружает следующие значения (которые зависят от режима работы видеоадаптера):

    Режим 0,1,2,3 4,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.


    Этот регистр, также как и регистр CSR, является доступным для чтения и для записи.

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

  • D4-D0 Соответствует номеру последней линии курсора для VGA (см. рисунок 8.4). Для EGA - номеру следующей линии.
  • D6-D5 Отклонение курсора. Задает смещение курсора относительно позиции, определенной регистром CLR.

    00 - нет отклонения

    01 - отклонение вправо на один символ

    10 - отклонение вправо на два символа

    11 - отклонение вправо на три символа

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

    Режим 0,1,2,3 4,5,6,D,E,F,10 7
    Содержимое регистра 07 00 0Ch

    Изменяя значение регистров начальной и конечной линии курсора, можно менять его положение и размер. На левой части рисунка, приведенного ниже, регистр начальной линии курсора равен 0Ah, регистр конечной линии курсора равен 0Bh. На правой части рисунка значение регистров изменено: регистр начальной линии равен 4, а регистр конечной линии - 5.

    Рисунок 8.4 Изменение положения курсора.

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

    #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;

    // считываем значения регистров начальной и // конечной линии курсора

    // выбираем регистр начальной линии курсора

    WriteReg(crt_address++, 0x0A);

    // считываем значение регистра

    top = (unsigned char) ReadReg(crt_address--);

    // выбираем регистр конечной линии курсора

    WriteReg(crt_address++, 0x0B);

    // считываем значение регистра

    bottom = (unsigned char) ReadReg(crt_address);

    // отображаем на экране значение регистров

    printf("\nРегистр начальной линии курсора содержит %x\n" "\nРегистр конечной линии курсора содержит %x\n", top, bottom);

    getch(); }



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