VGA Color Registers How we can reprogram the Digital-to-Analog Converter’s 256 color-table registers
VGA’s color-innovation The VGA introduced display-mode 19 Allowed showing 256 simultaneous colors Used one byte of VRAM for every pixel Convenient addressing for programming Screen-resolution was only 320-by-200 But SVGA offers improved resolutions: –VESA mode 0x101: 640-by-480 –VESA mode 0x103: 800-by-600
‘digital’ versus ‘analog’ MDA and CGA used ‘digital’ cable-signals VGA introduced ‘analog’ cable-signals Special hardware needed: DAC controller Implements a table of 256 color-registers Supports primary colors: red, green, blue Supports 64 different intensities per color So each color-register implements 18-bits
Format of a color-register I/O port-addresses (for DAC programming): 0x03C8: index-register 0x03C9: data-register for writes 0x03C7: data-register for reads
Data-structure for colors typedef struct { char r, g, b; } rgb_t; rgb_t red = { 63, 0, 0 }; rgb_tgreen = { 0, 63, 0 }; rgb_tblue = { 0, 0, 63 }; rgb_twhite = { 63, 63, 63 };
Writing to a color-register rgb_tcolor = { 32, 48, 16 ); intindex = 15; // example: reprogramming a DAC register outb( index, 0x03C8 );// select register outb( color.r, 0x3C9 );// set r-component outb( color.g, 0x3C9 );// set g-component outb( color.b, 0x3C9 );// set b-component
Reading a color register rgb_tcolor; intindex = 14; // example: reading a DAC color-register outb( index, 0x3C8 );// select register color.r = inb( 0x3C7 );// get r-component color.g = inb( 0x3C7 );// get g-component color.b = inb( 0x03C7 );// get b-component
Demo: ‘studydac.cpp’ This is a ‘testbed’ for color experiments It uses VESA display-mode 0x4101 (i.e., 640-by-480, in 256 simultaneous colors) It draws a 16-by-16 grid of color-boxes Each box shows a color-register’s value Initially we see the ‘default’ color-values Then the 256 registers are reprogrammed’ But you can try out different color schemes
An array of color intensities Each color-component is a 6-bit number So there are 2 6 = 64 possible intensities (This applies to each color-component) So here’s how to build all the cyan-values: rgb_t table[ 64 ]; for (int i = 0; i < 64; i++) { table[i].b = i; table[i].g = i; table[i].r = 0; }
Why do we need to do this? We will soon study lighting and shadows, in order to create ‘photorealistic’ images It requires showing varied color-intensity We’ll want to be sure our hardware can display all intensities a given image needs We’ll want to arrange needed colors in an array, for conveniently accessing a given color-intensity in terms of its array-index
In-class exercise #1 Modify the ‘studydac.cpp’ demo-program so that it will simultaneously display: –32 intensities of blue –32 intensities of cyan –32 intensities of green –32 intensities of magenta –32 intensities of red –32 intensities of yellow –64 intensities of white
In-class exercise #2 Modify the ‘studydac.cpp’ demo-program so it will simultaneously display intensity- arrays for several ‘pastel’ colors. You can build these colors by “mixing” a pure color with the color white For example: pink = ½ red + ½ white