Скачать Как усыпить монитор

20.08.1997
Скачать файл (0,00 Б)

unit Blank;
{ This unit was ripped from the 'Blackout screen saver', file BLACK.C.
  This code performs DPMS screen Blanking & UnBlanking.
  You can set all 3 modes - On, Suspend and Off.
 
  Working both in DOS(Borland Pascal) and OS/2(Virtual Pascal) !
 
  ---
  (x) 1997 by Stepan Kazakov aka MAD DED-II aka 2:5050/13.29. }
 
interface
const
   seq_port_reg  = $3c4;  { Sequencer register select port }
   seq_port_val  = $3c5;  { Sequencer register value port  }
   video_misc_rd = $3cc;  { Video misc. read port   }
   video_misc_wr = $3c2;  { Video misc. write port   }
   video_port_reg= $3d4;  { CRT Controller Index - color emulation }
   video_port_val= $3d5;  { CRT Controller Data Register - c. e. }
 
type
{ structure holding original VGA register settings }
   VGA_reg = record
      SeqCtrlIndex         :  Byte;  { Sequencer Index reg.   }
      CrtCtrlIndex         :  Byte;  { CRT-Contr. Index reg.  }
      CrtMiscIO          :  Byte;  { Miscellaneous register }
      HorizontalTotal         :  Byte;  { CRT-Controller:00h }
      HorizDisplayEnd         :  Byte;  { CRT-Controller:01h }
      StartHorizRetrace         :  Byte;  { CRT-Controller:04h }
      EndHorizRetrace         :  Byte;  { CRT-Controller:05h }
      Overflow          :  Byte;  { CRT-Controller:07h }
      StartVertRetrace         :  Byte;  { CRT-Controller:10h }
      EndVertRetrace         :  Byte;  { CRT-Controller:11h }
      ModeControl         :  Byte;  { CRT-Controller:17h }
      ClockingMode         :  Byte;  { Seq-Controller:01h }
   end;
 
procedure VideoBlank(mode:Byte);
{*  Mode/Status  HSync VSync Video
 *  -------------------------------------------
 *  "On"  on on active (mode 0)
 *  "Suspend" (either) on off blank (mode 1)
 *       (  or  ) off on blank
 *  "Off"  off off blank (mode 2) }
 
implementation
 
const
   v_mode          :  Byte = 0;
 
var
   vga           :  VGA_reg;
 
procedure VideoBlank(mode:Byte);
begin
   if (v_mode=mode) or (mode>2) then Exit;
   {$IFNDEF VIRTUALPASCAL} asm cli  end; {$ENDIF}
   with vga do
   if mode=0 then
   begin
      { mode=0 - Restore 'ON' mode. }
      Port[video_misc_wr]:=CrtMiscIO;
      if v_mode=2 then
      begin
  Port[video_port_reg]:=$00;       { HorizontalTotal }
  Port[video_port_val]:=HorizontalTotal;
  Port[video_port_reg]:=$01;       { HorizDisplayEnd }
  Port[video_port_val]:=HorizDisplayEnd;
  Port[video_port_reg]:=$04;       { StartHorizRetrace }
  Port[video_port_val]:=StartHorizRetrace;
  Port[video_port_reg]:=$05;       { EndHorizRetrace }
  Port[video_port_val]:=EndHorizRetrace;
      end;
      Port[video_port_reg]:=$07;       { Overflow }
      Port[video_port_val]:=Overflow;
      Port[video_port_reg]:=$10;       { StartVertRetrace }
      Port[video_port_val]:=StartVertRetrace;
      Port[video_port_reg]:=$11;       { EndVertRetrace }
      Port[video_port_val]:=EndVertRetrace;
      Port[video_port_reg]:=$17;       { ModeControl }
      Port[video_port_val]:=ModeControl;
      Port[seq_port_reg]:=$01;        { ClockingMode }
      Port[seq_port_val]:=ClockingMode;
 
      { restore index/control registers }
      Port[seq_port_reg]:=SeqCtrlIndex;
      Port[video_port_reg]:=CrtCtrlIndex;
   end else
   begin
      { mode=1,2 - Set 'Suspend' & 'Off' mode. }
      SeqCtrlIndex:=Port[seq_port_reg];
      CrtCtrlIndex:=Port[video_port_reg];
      CrtMiscIO:=Port[video_misc_rd];
      if mode=2 then
      begin
  Port[video_port_reg]:=$00;       { HorizontalTotal }
  HorizontalTotal:=Port[video_port_val];
  Port[video_port_reg]:=$01;       { HorizDisplayEnd }
  HorizDisplayEnd:=Port[video_port_val];
  Port[video_port_reg]:=$04;       { StartHorizRetrace }
  StartHorizRetrace:=Port[video_port_val];
  Port[video_port_reg]:=$05;       { EndHorizRetrace }
  EndHorizRetrace:=Port[video_port_val];
      end;
      Port[video_port_reg]:=$07;       { Overflow }
      Overflow:=Port[video_port_val];
      Port[video_port_reg]:=$10;       { StartVertRetrace }
      StartVertRetrace:=Port[video_port_val];
      Port[video_port_reg]:=$11;       { EndVertRetrace }
      EndVertRetrace:=Port[video_port_val];
      Port[video_port_reg]:=$17;       { ModeControl }
      ModeControl:=Port[video_port_val];
      Port[seq_port_reg]:=$01;        { ClockingMode }
      ClockingMode:=Port[seq_port_val];
 
      { assure that video is enabled }
      { "0x20" is VIDEO_ENABLE_bit in register 01 of sequencer }
      Port[seq_port_reg]:=$01;
      Port[seq_port_val]:=ClockingMode or $20;
 
      { test for vertical retrace in process.... }
      if (CrtMiscIO and $80)=$80 then Port[video_misc_wr]:=CrtMiscIO and $ef;
 
      { * Set <End of vertical retrace> to minimum (0) and
 * <Start of vertical Retrace> to maximum (incl. overflow)
 * Result: turn off vertical sync (VSync) pulse. }
      Port[video_port_reg]:=$10;      { StartVertRetrace }
      Port[video_port_val]:=$ff;      { maximum value }
      Port[video_port_reg]:=$11;      { EndVertRetrace }
      Port[video_port_val]:=$40;      { minimum (bits 0..3)  }
      Port[video_port_reg]:=$07;      { Overflow }
      Port[video_port_val]:=Overflow or $84; { bits 9,10 of vert. retrace }
 
      if mode=2 then
      begin
  { * Set <End of horizontal retrace> to minimum (0) and
    *  <Start of horizontal Retrace> to maximum
    * Result: turn off horizontal sync (HSync) pulse. }
  Port[video_port_reg]:=$04;      { StartHorizRetrace }
  Port[video_port_val]:=$ff;      { maximum }
  Port[video_port_reg]:=$05;      { EndHorizRetrace }
  Port[video_port_val]:=$00;      { minimum (0) }
      end;
 
      { restore both index registers }
      Port[seq_port_reg]:=SeqCtrlIndex;
      Port[video_port_reg]:=CrtCtrlIndex;
   end;
   v_mode:=mode;
   {$IFNDEF VIRTUALPASCAL} asm sti  end; {$ENDIF}
end;
 
end.