Программирование видеоадаптеров

       

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


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

D4-D0    Соответствует номеру последней линии курсора для видеоадаптеров VGA и SVGA (рис. 4.3). Для видеоадаптера 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

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

PICTURE._FIG_35.PCX;6";4.308";PCX

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

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

Листинг 4.4. Файл GETCURS.C

#include <stdio.h>

#include <conio.h>

#include "sysp.h"                                               // см. листинг 3.2

#include "sysgraph.h"      // см. листинг 3.3

// Описания функций

void        main(void);

void        WriteReg(unsigned reg, unsigned char data);

unsigned char     ReadReg(unsigned reg);

// Главная функция

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

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

  // курсора

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

  WriteReg(crt_address++, 0x0A);

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

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

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

  WriteReg(crt_address++, 0x0B);

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

  bottom = (unsigned char) ReadReg(crt_address);

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

  printf("\ nРегистр начальной линии курсора содержит: %d\n"

                                 "\nРегистр конечной линии курсора содержит: %d\n",

                                top, bottom);

  getch();

}

Для доступа к регистрам видеоадаптера мы пользуемся функциями WriteReg и ReadReg, определенными в файле DESIGN.C (листинг 4.5).

Листинг 4.5. Файл DESIGN.C

//=========================================================

// WriteReg(unsigned reg, unsigned char data)

// Функция выводит данные в порт

//

// Параметры:

//                              reg - номер порта

//                              data - данные, записываемые в порт reg

//=========================================================

void WriteReg(unsigned reg, unsigned char data) {

  _asm {

                mov  dx,reg

                mov  al,data

                out  dx,al

  }

}

//=========================================================

// unsigned char ReadReg(unsigned reg)

// Функция читает данные из определенного порта

//

// Параметры:

//                              reg - номер порта

//

//              Возвращаемое значение:

//                              данные, считанные из порта reg

//=========================================================

unsigned char ReadReg(unsigned reg) {

  unsigned char  data;

  _asm {

                mov  dx,reg

                in   al,dx

                mov  data,al

  }

  return(data);

}


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