Программирование видеоадаптеров© Александр Фролов, Григорий ФроловТом 21, М.: Диалог-МИФИ, 1993. Управление монитором>Многие современные мониторы позволяют временно отключать свои подсистемы, резко уменьшая потребление электроэнергии. Для обеспечения этой особенности монитор видеоадаптер должен соответствовать спецификации Energy Star и Display Power Management Signaling (DPMS). Мы опишем несколько функций VBE/PM (VESA Display BIOS Extensions/Power Management) версии 1.0. С помощью них вы сможете определить, какие режимы экономии электроэнергии обеспечивает ваша видеосистема и выбрать любой из этих режимов. В спецификации VBE/PM 1.0 различают следующие режимы:
Определение возможностей управленияФункция 4F10h определяет, какие режимы экономии электроэнергии поддерживает видеоадаптер.
Включить режим сохранения электроэнергииФункция устанавливает один из режимов, определенных в спецификации VBE/PM. Перед установкой режима, следует убедиться, что он доступен вашей видеосистеме. Для этого следует воспользоваться функцией 4F10h.
Определить состояние монитораПоследняя функция, рассматриваемая нами, служит для определена текущего режима видеосистемы.
Программа POWER, исходный текст которой представлен в листинге 7.3, демонстрирует использование функций VBE Power Management. После запуска программы POWER, она определяет возможности сохранения электроэнергии, доступные вашей видеоподсистеме. Затем, если компьютер поддерживает VBE Power Management, программа гасит экран монитора. Чтобы продолжить работу нажмите любую клавишу клавиатуры компьютера. Листинг 7.3. Файл POWER.CPP #include <stdio.h> #include <conio.h> #include <dos.h> // Описание функций void main(void); int SetPowerState( unsigned char ); int GetPowerState( unsigned char* ); int AnalyseResult(union REGS); int PowerCapabilities( unsigned char*, unsigned char*, unsigned char*); #define ON 0x00 #define OFF 0x04 #define STANDBY 0x01 #define SUSPEND 0x02 #define REDUCED 0x08 //=========================================================== // Главная функция //=========================================================== void main(void) { int uiResult; unsigned char ucMode, ucModes, ucMinorVer, ucMajorVer; // Определяем возможность управления энергопотреблением uiResult = PowerCapabilities(&ucModes, &ucMajorVer, &ucMinorVer); printf("\n\n Copyright (C)Frolov G.V.,1995. " "E-mail: frolov@glas.apc.org\n"); if(uiResult==0) { printf("\n Версия VBE Power Management %d.%d", (int)ucMajorVer, (int)ucMinorVer ); printf("\n Поддерживаются режимы:\n" "STANDBY - %s\n" "SUSPEND - %s\n" "OFF - %s\n" "REDUCED - %s\n", (ucModes & STANDBY)? "да" : "нет", (ucModes & SUSPEND)? "да" : "нет", (ucModes & OFF)? "да" : "нет", (ucModes & REDUCED)? "да" : "нет" ); } else if(uiResult < 0) { printf("\n Возможность управления энергопотреблением" "не поддерживается" ); return; } else if(uiResult > 0) { printf("\n Ошибка при вызове функции " "VBE Power Management" ); return; } // Определяем текущий режим uiResult = GetPowerState( &ucMode ); printf("\n Функция GetPowerState возвращает %d",uiResult); printf("\n GetPowerState = %x", ucMode ); printf("\n Текущий режим: %s\n", (ucMode & STANDBY) ? "STANDBY" : (ucMode & SUSPEND) ? "SUSPEND" : (ucMode & OFF) ? "OFF" : (ucMode & REDUCED) ? "REDUCED" : "Неопределен" ); printf("\n\n После нажатия на клавиатуру " "гасим изображение (режим STANDBY)" "\n Для продолжения работы нажмите любую клавишу" ); // Ожидаем нажатие на клавиатуру getch(); // Гасим экран монитора uiResult = SetPowerState(STANDBY); printf("\n Функция SetPowerState(STANDBY) " "возвращает %d", uiResult ); // Ожидаем нажатие на клавиатуру getch(); // Включаем монитор uiResult = SetPowerState( ON ); printf("\n Функция SetPowerState( ON ) " "возвращает %d", uiResult ); return; } //=========================================================== // Функция SetPowerState // Устанавливает режим видеоадаптера и монитора //=========================================================== int SetPowerState( unsigned char ucMode ) { union REGS regs; int iResult; regs.h.ah = 0x4f; regs.h.al = 0x10; regs.h.bl = 0x01; regs.h.bh = ucMode; int86(0x10, ®s, ®s); iResult = AnalyseResult(regs); return iResult; } //=========================================================== // Функция GetPowerState // Определят текущий режим видеоадаптера //=========================================================== int GetPowerState( unsigned char *ucMode ) { union REGS regs; int iResult; regs.h.ah = 0x4f; regs.h.al = 0x10; regs.h.bl = 0x02; int86(0x10, ®s, ®s); *ucMode = regs.h.bh; iResult = AnalyseResult(regs); return iResult; } //=========================================================== // Функция PowerCapabilities // Определяет возможности видеоподсистемы //=========================================================== int PowerCapabilities( unsigned char *ucModes, unsigned char *ucMajorVer, unsigned char *ucMinorVer) { union REGS regs; struct SREGS segregs; int iResult; regs.h.ah = 0x4f; regs.h.al = 0x10; regs.h.bl = 0x00; segregs.es = 0x00; regs.x.di = 0x00; int86x(0x10, ®s, ®s, &segregs); *ucModes = regs.h.bh; *ucMinorVer = regs.h.bl & 0x0F; // Младший *ucMajorVer = (regs.h.bl & 0xF0) >> 4; // Старший iResult = AnalyseResult(regs); return iResult; } //=========================================================== // Функция AnalyseResult // Анализирует результат, возвращаемый функциями // Power VBE //=========================================================== int AnalyseResult(union REGS regs) { int iResult; // Функция VBE Power Management завершилась успешно if((regs.h.al == 0x4f) && (regs.h.ah == 0)) iResult = 0; // Функция не поддерживается else if(regs.h.al != 0x4f) iResult = -1; // Ошибка при выполнении функции else iResult = 1; return iResult; } |