Ïðîãðàììèðîâàíèå âèäåîàäàïòåðîâ

       

Îïðåäåëèòü ñîñòîÿíèå ìîíèòîðà


Ïîñëåäíÿÿ ôóíêöèÿ, ðàññìàòðèâàåìàÿ íàìè, ñëóæèò äëÿ îïðåäåëåíà òåêóùåãî ðåæèìà âèäåîñèñòåìû.



Íà âõîäå:

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;

}


Ñîäåðæàíèå ðàçäåëà