Programowanie w języku C/C++ » Artykuły

Obsługa monitora

  • 2007-01-01 11:54
  • 0 komentarzy
  • 548 odsłon
  • Oceń ten tekst jako pierwszy
Czasami pisząc programy dla trybu tekstowego (czy każdy program wymaga trybu graficznego?) myślę o jakimś wygaszaczu ekranu, jakaś najprostszą choćby funkcja oszczędzania monitora. Jest to dobre, a i nasz program zdobędzie większą sympatię użytkownika. Nie zawsze jednak mamy czas, aby zmyślić jakiś ciekawy efekt, a i jeszcze go napisać. Z pomocą może nam wtedy przyjść przerwanie 10h (karty graficznej). Otóż możemy ustawić monitor w kilka trybów (w nawiasie od razu podaję numer trybu): On (0) - włączony: normalny tryb pracy; StandBy (1): tryb czuwania; Suspend (2): monitor jest zawieszony w działaniu, Off (4): wyłączony. W zależności od trybu jest zużycie energii. Im wyższy numer trybu tym mniej energii monitor pobiera. Funkcja, którą użyjemy nosi numer 4f10h.. Podajemy ją oczywiście do rejestru AX. Rejestr BX: jego dolna połówka BL winna być ustawiona na wartość 1, a górna polówka BH winna zawierać numer trybu. Jak się zapewne domyślasz wykorzystamy możliwości wywoływania funkcji Assemblera w naszym kompilatorze C. W pliku nagłówkowym dos.h znajduje się miła unia REGS i funkcja int86, którą wykorzystamy.

#include <dos.h>
 
void main() {
  REGS regs;
  regs.x.ax=0x4f10;
  regs.h.bl=1;
  regs.h.bh=2;
  //suspend monitor...
  int86(0x10, $regs, $regs);
  //...for one second
  sleep(1000);
  regs.x.ax=0x4f10;
  regs.h.bl=1;
  regs.h.bh=0;
  //go back to normal working mode
  int86(0x10, $regs, $regs);
}

Sposób ten można wykorzystać praktycznie w każdym języku pozwalającym wywoływać przerwania, i w każdym systemie operacyjnym, działającym na procesorze zgodnym z x86. Także Windows XP nie stwarza tu ograniczeń.