VGA Color Registers How we can reprogram the

  • Slides: 12
Download presentation
VGA Color Registers How we can reprogram the Digital-to-Analog Converter’s 256 color-table registers

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

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 0 x 101: 640 -by-480 – VESA mode 0 x 103: 800 -by-600

‘digital’ versus ‘analog’ • • MDA and CGA used ‘digital’ cable-signals VGA introduced ‘analog’

‘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

Format of a color-register 17 12 11 6 5 0 I/O port-addresses (for DAC programming): 0 x 03 C 8: index-register 0 x 03 C 9: data-register for writes 0 x 03 C 7: data-register for reads

Data-structure for colors typedef struct { char r, g, b; } rgb_t; rgb_t red

Data-structure for colors typedef struct { char r, g, b; } rgb_t; rgb_t red green blue white = { 63, 0, 0 }; = { 0, 63, 0 }; = { 0, 0, 63 }; = { 63, 63 };

Writing to a color-register rgb_t color = { 32, 48, 16 ); int index

Writing to a color-register rgb_t color = { 32, 48, 16 ); int index = 15; // example: reprogramming a DAC register outb( index, 0 x 03 C 8 ); // select register outb( color. r, 0 x 3 C 9 ); // set r-component outb( color. g, 0 x 3 C 9 ); // set g-component outb( color. b, 0 x 3 C 9 ); // set b-component

Reading a color register rgb_t color; int index = 14; // example: reading a

Reading a color register rgb_t color; int index = 14; // example: reading a DAC color-register outb( index, 0 x 3 C 8 ); // select register color. r = inb( 0 x 3 C 7 ); // get r-component color. g = inb( 0 x 3 C 7 ); // get g-component color. b = inb( 0 x 03 C 7 ); // get b-component

Demo: ‘studydac. cpp’ • This is a ‘testbed’ for color experiments • It uses

Demo: ‘studydac. cpp’ • This is a ‘testbed’ for color experiments • It uses VESA display-mode 0 x 4101 (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 •

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

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

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

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