Уровень bios для текстовых режимов работы адаптеров
Выяснение и настройка параметров видеосистемы выполняется с использованием прерываний 10h и 15h. Соответствующие значения возвращаются на регистрах. Более быстрый способ получения параметров – непосредственное обращение к области данных bios. Выполнив обращение к определенным ячейкам bios, которые содержат данные относящиеся к работе адаптера можно выяснить текущий режим, активную страницу видеопамяти, число символов в строке, определить текущую позицию курсора и пр. В таблице ниже представлена область данных bios, связанная с организацией работы видеоадаптера. Так, воздействуя на некоторые ячейки можно изменить положение курсора не выполняя прерывания с кодом 10h.
Адрес | Назначение поля | Размер поля |
40:49h | Текущий режим | Байт |
40:4Ah | Число символов в строке (количество столбцов) | Слово |
40:4Ch | Длина буфера видеопамяти (в байтах) | Слово |
40:4Еh | Начальный адрес в буфере регенерации (смещение от начального сегмента видеопамяти до начального адреса активной страницы в байтах) | Слово |
40:50h | Позиция курсора для страницы 0 (мл. байт столбец, ст. байт строка) | Слово |
40:52h | ----------------«------------------«--- 1 | Слово |
40:54h | ----------------«------------------«--- 2 | Слово |
………. | …….. повтор через 2 байта до страницы 7 | …………….. |
40:5Eh | ----------------«------------------«--- 7 | Слово |
40:60h | Форма курсора (мл. байт – номер строки начала изображения курсора, ст. байт – номер строки конца изображения курсора в пределах знакоместа) | Слово |
40:62h | Номер активной видеостраницы | Байт |
40:63h | Базовый адрес порта контроллера ВА (3D4h – для цветных, 3D8h – для монохромных) | Слово |
………… | ……………установки внутренних портов адаптера и пр…………….. | …………….. |
40:84h | Число строк текста для активного режима (самая верхняя строка имеет номер 0). Адаптеры старше CGA корректно устанавливают этот байт. Для CGA – всегда 25 строк, а значение в ячейке равно 0. | Байт |
Когда выполняется запрос к bios с кодом 10h, - bios использует управляющую информацию из своих таблиц и воздействует необходимым образом на порты ВА (контроллера). В лекции 16 приведены примеры выполнения запросов к bios. В Приложении представлена таблица некоторых функций, которые могут быть связаны с запросом 10h.
Пример
В примере представлена функция printche(), выполняющая вывод символа заданное число раз по горизонтали. Функция может быть полезна для рисования, например, рамки окна.
printche(int str, int stolb, char symb, char atr, int n) // str, stolb – координаты начала вывода
{ // symb, atr – символ и его аттрибут
register cur_page, max_stolb; // n – число повторов
union REGS r;
// контроль параметров и определение текущей страницы
cur_page = *(char far*)MK_FP(0x40, 0x62);
max_stolb = *(unsigned far*)MK_FP(0x40, 0x4a);
if(goto_xy(str, stolb, cur_page) == BAD_PARAM)
return BAD_PARAM;
if(max_stolb < (stolb + n – 1))
return OUT_OF_SCREEN;
// вывод символа и атрибута n раз
r.h.ah = 0x09; r.h.al = symb; r.h.bh = cur_page;
r.h.bl = atr; r.h.cx = n;
int86(0x10, &r, &r);
return OK;
}
Собственно контроль начальных координат для вывода выполняет функция goto_xy(), возвращающая константу BAD_PARAM, если координаты заданы некорректно.
В следующем примере представлена функция, выполняющая скроллинг. Используются подфункции 06h и 07h.
Пример
void scroll(int direction, char l_row, char l_col, char r_row, char r_col, char atr)
{
union REGS r;
if(direction)
if(direction == 6 || direction == 7)
{
r.h.al = 1; r.h.ah = direction;
}
else
return;
else
{
r.h.al = 0; r.h.ah = 6;
};
r.h.ch = l_row; r.h.cl = l_col; r.h.dh = r_row;
r.h.dl = r_col; r.h.bh = l_atr; int86(0x10, &r, &r);
}
Первый параметр задает направление скроллинга (см. Приложение), следующие 4 параметра задают координаты, соответственно, левого верхнего и правого нижнего угла области скроллинга. Если в качестве координат указать весь экран и задать 1-й параметр значением 0, то очистится весь экран. В справочнике Касаткина [12] средствами скроллинга показана реализация программы построения «распахивающегося» окна. Для этого с определенной задержкой выполняется в цикле вывод рамки окна от самого минимального размера до заданного.
Дата добавления: 2016-05-26; просмотров: 1637;