Пример программы, показывающей использование области данных BIOS. // Программа собирает данные о видеосистеме из // переменных BIOS и выводит их на экран. #include #include #include // Отключаем Word Aligment #pragma option -a- typedef unsigned char byte; typedef struct { byte bEquipFlags, bVideoMode; unsigned wColumns, wPageLength, wVidStart, w8CursorPos[8], wCursorShape; byte bActivePage; unsigned wAddrCRT; byte bRegMode, bRegPalette, bRows; unsigned wCharHigh; byte bInfo, bInfoTwo, bFlags, bDCC; void far *dwSavePtr; } BIOS_VAR; void FillBIOSVar(BIOS_VAR *); int main(int argc, char *argv[]) { BIOS_VAR vars; byte vmode; if( argc != 2 ) { printf( "Формат вызова: BIOSVAR <режим " "видеоадаптера>\n" ); return -1; } sscanf(argv[1], "%d", &vmode); asm { Mov AH,0 Mov AL,vmode Int 10h } FillBIOSVar(&vars); // Переходим в режим 3 asm { Mov AX,3 Int 10h } printf( "Флаги конфигурации видеоадаптера: %xh\n" "Текущий режим работы видеоадаптера: %xh\n" "Количество символов в строке: %d\n" "Размер страницы видеопамяти: %d\n" "Начальный адрес: %xh\n" "Координаты курсора нулевой страницы: %xh\n" "Форма курсора: %xh\n" "Активная страница: %xh\n" "Адрес индексного регистра контроллера ЭЛТ: %xh\n "Регистр режима CGA: %xh\n" "Цветовая палитра CGA: %xh\n" "Количество текстовых строк: %d\n" "Высота символов: %d\n" "Информация о EGA 1: %xh\n" "Информация о EGA 2: %xh\n" "Адрес таблицы окружения: %Fp\n", vars.bEquipFlags, vars.bVideoMode, vars.wColumns, vars.wPageLength, vars.wVidStart, vars.w8CursorPos[0], vars.wCursorShape, vars.bActivePage, vars.wAddrCRT, vars.bRegMode, vars.bRegPalette, vars.bRows + 1, vars.wCharHigh, vars.bInfo, vars.bInfoTwo, vars.dwSavePtr); return 0; } void FillBIOSVar(BIOS_VAR *ptr) { // Заполнение записи данными из BIOS ptr->bEquipFlags = peekb(0, 0x410); _fmemcpy((char far *) ptr + 1, MK_FP(0, 0x449), 30 ); _fmemcpy((char far *) ptr + 31, MK_FP(0, 0x484), 7 ); ptr->dwSavePtr = MK_FP(0, 0x4A8); }