home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / ocl150a.zip / OCL / Source / OVesaBlank.cpp < prev    next >
C/C++ Source or Header  |  1996-08-12  |  7KB  |  227 lines

  1. // OCL - OS/2 Class Library
  2. // (c) Cubus 1995
  3. // All Rights Reserved
  4. // (c) 1994 B. Stein
  5. // OVesaBlank.cpp
  6.  
  7. /*
  8.  * Redistribution and use in source and binary forms, with or without
  9.  * modification, are permitted provided that the following conditions
  10.  * are met:
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions and the following disclaimer.
  13.  * 2. Neither the name Cubus nor the name Team OCL may be used to
  14.  *    endorse or promote products derived from this software
  15.  *    without specific prior written permission.
  16.  * 3. See OCL.INF for a detailed copyright notice.
  17.  *
  18.  *              THIS SOFTWARE IS PROVIDED ``AS IS'' AND
  19.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  20.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  21.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  22.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  23.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  24.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  25.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  26.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  27.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  28.  * SUCH DAMAGE.
  29.  */
  30.  
  31.  
  32. // $Header: W:/Projects/OCL/Source/rcs/OVesaBlank.cpp 1.50 1996/08/11 23:49:34 B.STEIN Release $
  33.  
  34. #define __OCL_SOURCE__
  35.  
  36. #define OINCL_OSTRING
  37. #define OINCL_BASE
  38.  
  39. #include <ocl.hpp>
  40.  
  41. #include <OVesaBlank.h>
  42. #include <OVesaBlank.hpp>
  43.  
  44. OVesaBlank::mode OVesaBlank::currentState = OVesaBlank::on;
  45. vga              OVesaBlank::vga_registers;
  46.  
  47.  
  48. OVesaBlank::OVesaBlank()
  49.   : blankSem(NULL)
  50. {
  51.  try  // this is not the first instance of this class in the system
  52.    {
  53.     blankSem = new OMuxSem("\\SEM32\\OVBlank.SEM", OMuxSem::open, FALSE);
  54.    }
  55.  catch(OVioException &ex)
  56.    {
  57.     blankSem = new OMuxSem("\\SEM32\\OVBlank.SEM", OMuxSem::create, FALSE);
  58.    }
  59.  
  60.  if (OVesaBlank::currentState != OVesaBlank::on)
  61.    unblank(); 
  62.  
  63.  
  64. OVesaBlank::~OVesaBlank()
  65. {
  66.  unblank();
  67.  delete blankSem;
  68. }
  69.  
  70.  
  71. PSZ OVesaBlank::isOfType() const
  72. {
  73.  return("OVesaBlank");
  74.  
  75.  
  76. OVesaBlank& OVesaBlank::blank(OVesaBlank::mode _mode)
  77. {
  78.  if (!blankSem->requestMuxSem(OMuxSem::immediate))
  79.    return(*this);
  80.  
  81.  if ((OVesaBlank::currentState == OVesaBlank::off) ||
  82.      (_mode                    == OVesaBlank::on))
  83.    return(*this);
  84.  
  85.  _portaccess(FIRST_PORT, LAST_PORT);
  86.  
  87.  vga_registers.SeqCtrlIndex = inb_p(seq_port_reg);
  88.  vga_registers.CrtCtrlIndex = inb_p(video_port_reg);
  89.  vga_registers.CrtMiscIO    = inb_p(video_misc_rd);
  90.  
  91.  if(_mode == OVesaBlank::off)
  92.    { 
  93.     outb_p(0x00,video_port_reg);      // HorizontalTotal
  94.     vga_registers.HorizontalTotal   = inb_p(video_port_val);
  95.     outb_p(0x01,video_port_reg);      // HorizDisplayEnd
  96.     vga_registers.HorizDisplayEnd   = inb_p(video_port_val);
  97.     outb_p(0x04,video_port_reg);      // StartHorizRetrace 
  98.     vga_registers.StartHorizRetrace = inb_p(video_port_val);
  99.     outb_p(0x05,video_port_reg);      // EndHorizRetrace
  100.     vga_registers.EndHorizRetrace   = inb_p(video_port_val);
  101.    }
  102.  
  103.  outb_p(0x07,video_port_reg);         // Overflow
  104.  vga_registers.Overflow             = inb_p(video_port_val);
  105.  outb_p(0x10,video_port_reg);         // StartVertRetrace
  106.  vga_registers.StartVertRetrace     = inb_p(video_port_val);
  107.  outb_p(0x11,video_port_reg);         // EndVertRetrace
  108.  vga_registers.EndVertRetrace       = inb_p(video_port_val);
  109.  outb_p(0x17,video_port_reg);         // ModeControl
  110.  vga_registers.ModeControl          = inb_p(video_port_val);
  111.  outb_p(0x01,seq_port_reg);           // ClockingMode
  112.  vga_registers.ClockingMode         = inb_p(seq_port_val);
  113.     
  114.  // assure that video is enabled
  115.  // "0x20" is VIDEO_ENABLE_bit in register 01 of sequencer
  116.  
  117.  outb_p(0x01,seq_port_reg);
  118.  outb_p(vga_registers.ClockingMode | 0x20,seq_port_val);
  119.  
  120.  // test for vertical retrace in process....
  121.  
  122.  if ((vga_registers.CrtMiscIO & 0x80) == 0x80)
  123.    outb_p(vga_registers.CrtMiscIO & 0xef,video_misc_wr);
  124.  
  125.  // Set <End of vertical retrace> to minimum (0) and
  126.  // <Start of vertical Retrace> to maximum (incl. overflow)
  127.  // Result: turn off vertical sync (VSync) pulse.
  128.  
  129.  outb_p(0x10,video_port_reg);         // StartVertRetrace 
  130.  outb_p(0xff,video_port_val);         // maximum value 
  131.  outb_p(0x11,video_port_reg);         // EndVertRetrace 
  132.  outb_p(0x40,video_port_val);         // minimum (bits 0..3)  
  133.  outb_p(0x07,video_port_reg);         // Overflow 
  134.  outb_p(vga_registers.Overflow | 0x84,video_port_val);
  135.                                       // bits 9,10 of 
  136.  
  137.  // vert. retrace
  138.       
  139.  if (_mode == OVesaBlank::off)
  140.   {
  141.    // Set <End of horizontal retrace> to minimum (0) and
  142.    // <Start of horizontal Retrace> to maximum
  143.    // Result: turn off horizontal sync (HSync) pulse.
  144.  
  145.    outb_p(0x04,video_port_reg);       // StartHorizRetrace 
  146.    outb_p(0xff,video_port_val);       // maximum 
  147.    outb_p(0x05,video_port_reg);       // EndHorizRetrace 
  148.    outb_p(0x00,video_port_val);       // minimum (0) 
  149.   }
  150.  
  151.  // restore both index registers
  152.  
  153.  outb_p(vga_registers.SeqCtrlIndex,seq_port_reg);
  154.  outb_p(vga_registers.CrtCtrlIndex,video_port_reg);
  155.  
  156.  OVesaBlank::currentState = _mode;
  157.  
  158.  blankSem->releaseMuxSem();
  159.  return(*this);
  160. }
  161.  
  162.  
  163.  
  164. OVesaBlank& OVesaBlank::unblank()
  165. {
  166.  if (!blankSem->requestMuxSem(OMuxSem::immediate))
  167.    return(*this);
  168.  
  169.  if (OVesaBlank::currentState == OVesaBlank::on)
  170.    return(*this);
  171.  
  172.  _portaccess(FIRST_PORT, LAST_PORT);
  173.  
  174.  outb_p(vga_registers.CrtMiscIO,video_misc_wr);
  175.  
  176.  if (OVesaBlank::currentState == OVesaBlank::off)
  177.    { 
  178.     outb_p(0x00,video_port_reg);      // HorizontalTotal
  179.     outb_p(vga_registers.HorizontalTotal,video_port_val);
  180.     outb_p(0x01,video_port_reg);      // HorizDisplayEnd 
  181.     outb_p(vga_registers.HorizDisplayEnd,video_port_val);
  182.     outb_p(0x04,video_port_reg);      // StartHorizRetrace 
  183.     outb_p(vga_registers.StartHorizRetrace,video_port_val);
  184.     outb_p(0x05,video_port_reg);      // EndHorizRetrace 
  185.     outb_p(vga_registers.EndHorizRetrace,video_port_val);
  186.    }
  187.  
  188.  outb_p(0x07,video_port_reg);         // Overflow 
  189.  outb_p(vga_registers.Overflow,video_port_val);
  190.  outb_p(0x10,video_port_reg);         // StartVertRetrace 
  191.  outb_p(vga_registers.StartVertRetrace,video_port_val);
  192.  outb_p(0x11,video_port_reg);         // EndVertRetrace
  193.  outb_p(vga_registers.EndVertRetrace,video_port_val);
  194.  outb_p(0x17,video_port_reg);         // ModeControl
  195.  outb_p(vga_registers.ModeControl,video_port_val);
  196.  outb_p(0x01,seq_port_reg);           // ClockingMode
  197.  outb_p(vga_registers.ClockingMode,seq_port_val);
  198.     
  199.  
  200.  // restore index/control registers
  201.  
  202.  outb_p(vga_registers.SeqCtrlIndex,seq_port_reg);
  203.  outb_p(vga_registers.CrtCtrlIndex,video_port_reg);
  204.  
  205.  OVesaBlank::currentState = OVesaBlank::on;
  206.   
  207.  blankSem->releaseMuxSem();
  208.  return(*this);
  209. }
  210.  
  211.  
  212. OVesaBlank& OVesaBlank::sleep()
  213. {
  214.  return(blank(OVesaBlank::suspend));
  215. }       
  216.  
  217. OVesaBlank& OVesaBlank::standby()
  218. {
  219.  return(blank(OVesaBlank::off));
  220. }
  221.  
  222.  
  223. // end of source
  224.  
  225.