130 likes | 154 Views
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
E N D
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 17 12 11 6 5 0 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_t green = { 0, 63, 0 }; rgb_t blue = { 0, 0, 63 }; rgb_t white = { 63, 63, 63 };
Writing to a color-register rgb_t color = { 32, 48, 16 ); int index = 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_t color; int index = 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 26 = 64possible 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