Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Программирование видеоадаптеров

© Александр Фролов, Григорий Фролов
Том 21, М.: Диалог-МИФИ, 1993.

[Назад] [Содеожание] [Дальше]

Управление монитором

Многие современные мониторы позволяют временно отключать свои подсистемы, резко уменьшая потребление электроэнергии. Для обеспечения этой особенности монитор видеоадаптер должен соответствовать спецификации Energy Star и Display Power Management Signaling (DPMS).

Мы опишем несколько функций VBE/PM (VESA Display BIOS Extensions/Power Management) версии 1.0. С помощью них вы сможете определить, какие режимы экономии электроэнергии обеспечивает ваша видеосистема и выбрать любой из этих режимов.

В спецификации VBE/PM 1.0 различают следующие режимы:

Режим

Описание

ON

Обычный режим монитора

STANDBY

Гаснет изображение на экране монитора. Режим STANDBY доступен для всех типов мониторов

REDUSED ON

Уменьшается яркость изображения. Предназначается для мониторов, выполненных на основе газоразрядных и жидкокристаллических панелей

SUSPEND

Отключаются строчная развертка. Монитор переходит в режим экономии электроэнергии первого уровня (см. описание вашего монитора). Чтобы видеоадаптер мог установить режим SUSPEND, необходимо, чтобы монитор соответствовал стандарту Energy Star

OFF

Монитор отключаются полностью. Работает необходимый минимум схем монитора, позволяющий снова его включить. Монитор должен соответствовать стандарту Energy Star

Определение возможностей управления

Функция 4F10h определяет, какие режимы экономии электроэнергии поддерживает видеоадаптер.

На входе:

AH

4Fh

 

AL

10h

 

BL

00h

 

ES:DI

Зарезервировано, должен содержать 0000:0000h

На выходе:

AL

4Fh - функция поддерживается;

!= 4Fh - функция не поддерживается

 

AH

0, в случае успешного завершения,

1 в случае ошибки

 

BH

Поддерживаемые режимы сохранения электроэнергии:

D0 - содержит 1, если доступен режим STANDBY;

D1 - содержит 1, если доступен режим SUSPEND;

D2 - содержит 1, если доступен режим OFF;

D3 - содержит 1, если доступен режим REDUSED ON;

D7-D4 зарезервировано

 

BL

Номер версии VBE/PM:

D3-D0 младшая часть номера версии

D7-D4 старшая часть номера версии

 

ES:DI

Не изменяется

Включить режим сохранения электроэнергии

Функция устанавливает один из режимов, определенных в спецификации VBE/PM. Перед установкой режима, следует убедиться, что он доступен вашей видеосистеме. Для этого следует воспользоваться функцией 4F10h.

На входе:

AH

4Fh

 

AL

10h

 

BL

01h

 

BH

Режим:

00h - установить режим ON (включить монитор);

01h - установить режим STANDBY (погасить экран);

02h - установить режим SUSPEND (отключить развертку);

04h - установить режим OFF (выключить монитор);

08h - установить режим REDUSED ON (уменьшить яркость)

На выходе:

AL

4Fh - функция поддерживается;

в противном случае функция не поддерживается

 

AH

0, в случае успешного завершения,

1 в случае ошибки

 

BH

Не изменяется

Определить состояние монитора

Последняя функция, рассматриваемая нами, служит для определена текущего режима видеосистемы.

На входе:

AH

4Fh

 

AL

10h

 

BL

02h

На выходе:

AL

4Fh - функция поддерживается;

в противном случае функция не поддерживается

 

AH

0, в случае успешного завершения,

1 в случае ошибки

 

BH

Текущий режим:

00h - ON (монитор включен)

01h - STANDBY (погашен экран монитора)

02h - SUSPEND (отключена строчная развертка)

04h - OFF (монитор отключен)

08h - REDUSED ON (уменьшена яркость изображения)

Программа 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, &regs, &regs);

	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, &regs, &regs);

	*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, &regs, &regs, &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;
}
[Назад] [Содеожание] [Дальше]