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

       

Регистры, определяющие положение курсора


Два регистра - регистр старшего байта позиции курсора (Cursor Location Register - CLR_h, high byte) (индекс 0Eh) и регистр младшего байта позиции курсора (Cursor Location Register - CLR_l, low byte) (индекс 0Fh) определяют положение курсора на экране (рис. 4.5). Регистры доступны как для записи, так и для чтения.

PICTURE._FIG_37.PCX;6";4.308";PCX

Рисунок 4.5   Отображение курсора на экране

Программа CURSLOC, приведенная в листинге 4.6 переводит видеоадаптер в текстовый режим, устанавливает курсор в позицию 5 строки 10. Затем программа считывает значения регистров позиции курсора (на момент запуска программы) и отображает их на экране монитора. Вы должны получить значение 0325h (80 * 10 + 5 = 805 = 0325h).

Листинг 4.6. Файл CURSLOC.C

// Чтение регистра положения курсора

#include <stdio.h>

#include "sysp.h"

#include "sysgraph.h"

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

void        main(void);

// Функции WriteReg и ReadReg определены в файле

// DESIGN.C. Смотри листинг 4.5

void        WriteReg(unsigned reg, unsigned char data);

unsigned char     ReadReg(unsigned reg);



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

void main(void) {

 

int                                                          crt_port;

 

unsigned char   h_pos, l_pos;

 

BIOS_VAR _far  *bios_var_ptr;

 

_asm {

               

// Устанавливаем режим 3

               

mov        ah,0

               

mov        al,3

               

int           10h

               

//              Выбираем страницу видеоапамяти 0

               

mov        ah,5

               

mov        al,0

               

int           10h

               

// Устанавливаем курсор в положение (20,10)

               

mov        ah,2

               

mov        dh,10      //

               

mov        dl,5         // строка 10, позиция 5:

                                                                               

// CLR = 80 * 10 + 5 = 805 = 325h

               

xor          bh,bh

               

int           10h

 

}


// Получаем указатель на область переменных видеофункций BIOS

  bios_var_ptr = (BIOS_VAR _far *) FP_MAKE(0x0000, 0x0410);

// Определяем адрес порта индексного регистра контроллера ЭЛТ

  crt_port = bios_var_ptr -> wAddrCRT;

// Выбираем старший байт регистра положения курсора

  WriteReg(crt_port, 0x0E);

// Читаем значение старшего байта регистра

  h_pos = ReadReg(crt_port + 1);

// Выбираем младший байт регистра положения курсора

  WriteReg(crt_port, 0x0F);

// Считываем значение младшего байта регистра

  l_pos = ReadReg(crt_port + 1);

// Отображаем полученные значения

  printf("\nТекущий адрес курсора %2.2X%2.2Xh\n",

                (unsigned char) h_pos, (unsigned char) l_pos );

  return;

}


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