Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование видеоадаптеров EGA, VGA и SVGA.doc
Скачиваний:
138
Добавлен:
01.05.2014
Размер:
4.51 Mб
Скачать

Регистры начального адреса

Это группа из двух регистров: регистр старшего байта начального адреса (Start Address Register - SAR, high byte) (индекс 0Ch) и регистр младшего байта начального адреса (Start Address Register - SAR, low byte) (индекс 0Dh).

В регистрах SAR записан адрес видеоданных, которые отображаются в верхнем левом углу экрана монитора. Регистры начального адреса можно использовать для перемещения изображения по экрану (свертки) и для переключения активной страницы видеопамяти.

Если вы желаете использовать регистры для переключения страниц видеопамяти, то в регистры SAR надо записать смещение страницы видеопамяти (относительно начала видеопамяти), которую необходимо отобразить на экране.

На рисунке 4.4 показано, как происходит свертка экрана при изменении регистров начального адреса. В верхней части рисунка регистры начального адреса содержат ноль. Видеопамять отображается на экране с начала. В нижней части значение регистров начального адреса увеличено до 77h. В этом случае видеопамять отображается на экране начиная с данных, имеющих смещение 77h от начала видеопамяти. В нижней части экрана появляется изображение, ранее не помещающееся на экране.

PICTURE._FIG_36.PCX;6";4.308";PCX

Рисунок 4.4 Свертка изображения на экране

Регистры начального адреса доступны для чтения и для записи. При выборе режима работы видеоадаптера регистры обнуляются.

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

Два регистра - регистр старшего байта позиции курсора (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; }