openblt

a hobby OS from the late 90s
git clone http://frotz.net/git/openblt.git
Log | Files | Refs | LICENSE

vga.cpp (3415B)


      1 /* $Id:  $
      2 **
      3 ** Copyright 1998 Brian J. Swetland
      4 ** All rights reserved.
      5 **
      6 ** Redistribution and use in source and binary forms, with or without
      7 ** modification, are permitted provided that the following conditions
      8 ** are met:
      9 ** 1. Redistributions of source code must retain the above copyright
     10 **    notice, this list of conditions, and the following disclaimer.
     11 ** 2. Redistributions in binary form must reproduce the above copyright
     12 **    notice, this list of conditions, and the following disclaimer in the
     13 **    documentation and/or other materials provided with the distribution.
     14 ** 3. The name of the author may not be used to endorse or promote products
     15 **    derived from this software without specific prior written permission.
     16 **
     17 ** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     18 ** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     19 ** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     20 ** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     21 ** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     22 ** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     23 ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     24 ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     25 ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     26 ** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27 */
     28 #include "vga.h"
     29 
     30 #include <i386/io.h>
     31 
     32 const int MiscOutputReg = 0x3c2;
     33 const int DataReg = 0x3c0;
     34 const int AddressReg = 0x3c0;
     35 
     36 const char mode13[][32] = {
     37   { 0x03, 0x01, 0x0f, 0x00, 0x0e },            /* 0x3c4, index 0-4*/
     38   { 0x5f, 0x4f, 0x50, 0x82, 0x54, 0x80, 0xbf, 0x1f,
     39     0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     40     0x9c, 0x0e, 0x8f, 0x28, 0x40, 0x96, 0xb9, 0xa3,
     41     0xff },                                    /* 0x3d4, index 0-0x18*/
     42   { 0, 0, 0, 0, 0, 0x40, 0x05, 0x0f, 0xff },   /* 0x3ce, index 0-8*/ 
     43   { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 
     44     0x41, 0, 0x0f, 0, 0 }                      /* 0x3c0, index 0-0x14*/
     45 };
     46 
     47 #define Vga256                   0x13   // 320x200x256
     48 #define TextMode                 0x03   // 80x25 text mode
     49 #define PaletteMask              0x3C6  // bit mask register
     50 #define PaletteRegisterRead      0x3C7  // read index
     51 #define PaletteRegisterWrite     0x3C8  // write index
     52 #define PaletteData              0x3C9  // send/receive data here
     53 #define RomCharSegment           0xF000 
     54 #define RomCharOffset            0xFA6E 
     55 #define CharWidth                8
     56 #define CharHeight               8
     57 
     58 void SetPalette(int color, int red, int green, int blue)
     59 {
     60 
     61   outb(0xFF, PaletteMask);
     62   outb(color, PaletteRegisterWrite);
     63   outb(red, PaletteData);
     64   outb(green, PaletteData);
     65   outb(blue, PaletteData);
     66 }      
     67 
     68 int InitVGA()
     69 {
     70   int i;
     71 
     72   outb_p(0x63, MiscOutputReg);
     73   outb_p(0x00, 0x3da);
     74 
     75   for (i=0; i < 5; i++) {
     76     outb_p(i, 0x3c4);
     77     outb_p(mode13[0][i], 0x3c4+1);
     78   }
     79 
     80   outw_p(0x0e11, 0x3d4);
     81 
     82   for (i=0; i < 0x19; i++) {
     83     outb_p(i, 0x3d4);
     84     outb_p(mode13[1][i], (0x3d4 + 1));
     85   }  
     86 
     87   for (i=0; i < 0x9; i++) {
     88     outb_p(i, 0x3ce);
     89     outb_p(mode13[2][i], (0x3ce + 1));
     90   }
     91 
     92   inb_p(0x3da);
     93 
     94   for (i=0; i < 0x15; i++) {
     95     inw(DataReg);
     96     outb_p(i, AddressReg);
     97     outb_p(mode13[3][i], DataReg);
     98   }
     99 
    100   outb_p(0x20, 0x3c0);
    101 
    102   return 1;
    103 }
    104