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


Регистр горизонтального панорамирования (Horizontal Panning Register - HPR) (индекс13) - часть 2


void main(void) {

struct videoconfig vc; unsigned char i,j;

// выбираем текстовый режим работы видеоадаптера, // принятый по умолчанию

_setvideomode(_DEFAULTMODE);

// устанавливаем логическую ширину экрана в 100 символов

SetColumn(100);

// отображаем на экране дисплея 24 строки текста

for(i = 0; i < 24; i++) printf("\ntext text text");

// производим горизонтальное смещение экрана // на i пикселов при каждом нажатии на клавиатуру

for(i = 0; i < 13; i++) { getch(); HorScroll(i,8); }

// производим вертикальное смещение экрана // на i пикселов при каждом нажатии на клавиатуру

for(i = 0; i < 13; i++) { getch(); VerScroll(i); } getch();

_setvideomode(_DEFAULTMODE); }

/** *.Name HorScroll * *.Title Горизонтальный сдвиг содержимого экрана. * *.Descr Функция смещает содержимое экрана влево на определенное * число пикселов. * *.Proto void HorScroll(unsigned offset, unsigned wide) * *.Params unsigned offset - величина смещения в пикселах, * * unsigned wide - ширина символов (8 или 9). * *.Return Не используется. * *.Sample scroll.c **/ void HorScroll(unsigned offset, unsigned wide) {

unsigned start_addr_reg, panning_reg; div_t res;

res = div(offset,wide);

start_addr_reg = res.quot; panning_reg = (wide == 9) ? ((res.rem == 0) ? 8 : res.rem - 1 ) : res.rem;

_asm { push ds

; вычисляем адрес регистра состояния 1 (3BAh/3DAh)

xor ax,ax mov es,ax mov dx,es:[463h] add dx,6

; ожидаем начало обратного вертикального хода луча

in al,dx nop nop test al,08h jz wait_on

wait_off:

in al,dx nop nop test al,08h jnz wait_off

wait_on:

in al,dx nop nop test al,08h jz wait_on

; вычисляем адрес порта индексного регистра контроллера ЭЛТ

sub dx,6

; выбираем для доступа младший байт регистра начального адреса

mov al,0Dh out dx,al

; вычисляем адрес порта регистра данных контроллера ЭЛТ

inc dx

; устанавливаем новый начальный адрес

mov ax,start_addr_reg out dx,al

; снова получаем адрес порта регистра состояния 1

add dx,5

; сбрасываем внутренний триггер контроллера атрибутов, управляющий ; адресацией его регистров




Начало  Назад  Вперед



Книжный магазин