VGA Color Registers How we can reprogram the Analog Converter’s Digital-to-

Download Report

Transcript VGA Color Registers How we can reprogram the Analog Converter’s Digital-to-

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
rgb_t
rgb_t
rgb_t
red
green
blue
white
= { 63, 0, 0 };
= { 0, 63, 0 };
= { 0, 0, 63 };
= { 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 = 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 intensityarrays for several ‘pastel’ colors.
• You can build these colors by “mixing” a
pure color with the color white
• For example: pink = ½ red + ½ white