home *** CD-ROM | disk | FTP | other *** search
/ OpenStep 4.2J (Developer) / os42jdev.iso / NextDeveloper / Examples / DriverKit / S3 / S3_reloc.tproj / vgaModes.c < prev    next >
Text File  |  1996-03-26  |  4KB  |  117 lines

  1. #import <driverkit/i386/ioPorts.h>
  2. #import "vgaModes.h"
  3.  
  4. static const VGAMode VGAMode_3 = {
  5.     0x67, 0x00,
  6.     { 0x01, 0x00, 0x03, 0x00, 0x02 },
  7.     {                    
  8.     0x5f, 0x4f, 0x50, 0x82, 0x55, 0x81, 0xbf, 0x1f, 0x00, 0x4f,
  9.     0x0d, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x9c, 0x8e, 0x8f, 0x28,
  10.     0x1f, 0x96, 0xb9, 0xa3, 0xff,
  11.     },
  12.     {
  13.     0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39,
  14.     0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x0c, 0x00, 0x0f, 0x08,
  15.     },
  16.     { 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0e, 0x00, 0xff },
  17. };
  18.  
  19. static const VGAMode VGAMode_12 = {
  20.     0xE3, 0x00,
  21.     { 0x03, 0x01, 0x0f, 0x00, 0x06 },
  22.     {
  23.     0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80, 0x0b, 0x3e, 0x00, 0x40,
  24.     0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0xea, 0x8c, 0xdf, 0x28,
  25.     0x00, 0xe7, 0x04, 0xe3, 0xff,
  26.     },
  27.     {
  28.     0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39,
  29.     0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x01, 0x00, 0x0f, 0x00,
  30.     },
  31.     { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0f, 0xff },
  32. };
  33.  
  34. int
  35. VGASetMode(unsigned int mode)
  36. {
  37.     switch (mode) {
  38.     case 0x03:
  39.     VGASetModeData(&VGAMode_3);
  40.     break;
  41.     case 0x12:
  42.     VGASetModeData(&VGAMode_12);
  43.     break;
  44.     default:
  45.     return -1;
  46.     }
  47.     return 0;
  48. }
  49.  
  50. int
  51. VGASetModeData(const VGAMode *modeData)
  52. {
  53.     int k;
  54.     
  55.     /* NOTE: The attribute registers are a little weird. For most registers,
  56.      * there is a separate index and data port. The attribute register set
  57.      * has just one port that gets used for both. You write an index to the
  58.      * port, then use the same port for data. The VGA automatically toggles
  59.      * the sense of the port (between index and data) with an internal
  60.      * flip-flop.  You set the state of the flip-flop by doing an inb() on
  61.      * the input status 1 port.
  62.      *
  63.      * The other weird thing is that the attribute index register also
  64.      * contains a palette access bit. This bit determines whether the
  65.      * CPU or the VGA has control of the palette. While the CPU owns the
  66.      * palette, the display is effectively off.
  67.      */
  68.  
  69.     /* Turn the video off while we are doing this.... */
  70.  
  71.     inb(VGA_INPUT_STATUS_1);    /* Set the attribute flip-flop to "index". */
  72.     outb(VGA_ATTR_INDEX, 0x00);    /* Gives palette to CPU, turning off video. */
  73.     
  74.     /* Set the misc. output register. */
  75.     outb(VGA_MISC_OUTPUT, modeData->miscOutput);
  76.     
  77.     /* Set the feature control register */
  78.     outb(VGA_FEATURE_CTRL, modeData->featureCtrl);
  79.  
  80.     /* Load the sequencer registers. */
  81.     for (k = 0; k < VGA_SEQ_COUNT; k++) {
  82.     outb(VGA_SEQ_INDEX, k);
  83.     outb(VGA_SEQ_DATA, modeData->seqx[k]);
  84.     }
  85.     outb(VGA_SEQ_INDEX, 0x00);
  86.     outb(VGA_SEQ_DATA, 0x03);    /* Low order two bits are reset bits. */
  87.     
  88.     /* Load the CRTC registers.  CRTC registers 0-7 are locked by a bit
  89.      * in register 0x11. We need to unlock these registers before we can
  90.      * start setting them. */
  91.     outb(VGA_CRTC_INDEX, 0x11);
  92.     outb(VGA_CRTC_DATA, 0x00);        /* Unlocks registers 0-7. */
  93.     for (k = 0; k < VGA_CRTC_COUNT; k++) {
  94.     outb(VGA_CRTC_INDEX, k);
  95.     outb(VGA_CRTC_DATA, modeData->crtc[k]);
  96.     }
  97.  
  98.     /* Load the attribute registers. */
  99.     inb(VGA_INPUT_STATUS_1);    /* Set the attribute flip-flop to "index" */
  100.     for (k = 0; k < VGA_ATTR_COUNT; k++) {
  101.     outb(VGA_ATTR_INDEX, k);
  102.     outb(VGA_ATTR_DATA, modeData->attr[k]);
  103.     }
  104.  
  105.     /* Load graphics registers. */
  106.     for (k = 0; k < VGA_GRFX_COUNT; k++) {
  107.     outb(VGA_GRFX_INDEX, k);
  108.     outb(VGA_GRFX_DATA, modeData->grfx[k]);
  109.     }    
  110.  
  111.     /* Re-enable video. */
  112.     inb(VGA_INPUT_STATUS_1);    /* Set the attribute flip-flop to "index" */
  113.     outb(VGA_ATTR_INDEX, 0x20);    /* Give the palette back to the VGA */
  114.     
  115.     return 0;
  116. }
  117.