VGA Text Mode An introduction to font selection and to reprogramming of the Character Generator ram alphanumeric information • Most early PC programs weren’t graphical • Screen was similar to a typewriter’s output • Used only a limited set of character-images: – letters, numerals, and punctuation symbols • Hardware can efficiently render such glyphs • VGA can emulate the MDA/EGA text modes: – mode 1: emulates EGA 40x25 text (320x200 pixels) – mode 3: emulates EGA 80x25 text (640x400 pixels) – mode 7: emulates MDA 80x25 text (720x350 pixels) Font images in ROM • • • • • VGA has built-in firmware (ROM-BIOS) Both code and data are provided in ROM VGA’s ROM is normally at 0x000C0000 Can be addressed by CPU in ‘real-mode’ VGA ROM includes character glyph tables – 8x8 character-set is used with mode 1 – 8x16 character-set is used with mode 3 – 8x14 character-set is used with mode 7 A character-glyph example • Here’s a sample 8x8 character glyph (‘A’): This glyph can be represented as an array of 8 bytes: 0x00, 0x38, 0x6C, 0xC6, 0xFE, 0xC6, 0x00, 0x00 VGA Timer-Sequencer • A ‘character table’ is copied into VRAM • Glyphs organized as an array of bitmaps • Array holds 256 images (32 bytes/image) – Table-size: 256x32 = 8K bytes (= 0x2000) • The ascii-codes serve as array-indexes: – Example: ‘A’ has ascii-code 0x41 (=65) • Sequencer hardware accesses these images • Dedicated area of VRAM is used (plane 2) • Planes 0 and 1 are used as a text frame-buffer Arrangement of VRAM planes plane 3 plane 2 plane 1 plane 0 Not used (masked) Holds the character glyph table(s) Stores color attribute-bytes for displayed text Stores ASCII- codes for the currently displayed text CPU can read/write only to planes 0 and 1 (using odd/even addressing mode) multiple fonts supported • Plane 2 is the Character Generator’s ram • Enough room for eight separate tables: – 8 x 8K = 64K • Two tables can be in use simultaneously • Tables must start at prescribed offsets: – – – – Table 0: 0x0000 Table 1: 0x4000 Table 2: 0x8000 Table 3: 0xC000 Table 4: 0x2000 Table 5: 0x6000 Table 6: 0xA000 Table 7: 0xE000 Text color ‘attributes’ • In text mode, the picture-elements consist of character images, shown in two colors: – Foreground color, and Background color • Character colors individually programmed • A byte-pair in VRAM selects the bit-image (ascii code) and color-pair (attribute byte) • All colors come from a palette of 16 • But the color palette is ‘programmable’ Layout for an ‘attribute’ byte Background Color R G B Bit function is Programmable: Default is “EnableBlinking” Foreground Color R G B Bit function is programmable Default is “EnableIntensity” VGA Sequencer Registers • Five registers comprise VGA Sequencer: – index 0: – index 1: – index 2: – index 3: – index 4: Reset register Clocking Mode register Map Mask register Character Map Select register Memory Mode register • All accessed via i/o ports 0x3C4-0x3C5 using “multiplexing” scheme (index/data) Access to character ram • In text modes, CPU can’t access Plane 2 • Plane 2 gets accessed by the Sequencer • Sequencer performs a ‘glyph-lookup’ for each ascii code stored by CPU in Plane 0 • Both Sequencer and Graphics Controller must be suitably reprogrammed in order for the CPU to a read or write to Plane 2 • Six VGA registers are involved in that step Reset (index 0) 7 6 5 4 3 2 1 0 Synchronous Reset bit (bit 1) 1 = normal sequencer operation 0 = initiate a synchronous reset A synchronous reset is used in advance of reprogramming the Clocking Mode register (or the Clock Select field in the VGA’s Miscellaneous Output register) Asynchronous Reset bit (bit 0) 1 = normal sequencer operation 0 = initiate an asynchronous reset Halts VRAM refresh cycles and clears VRAM contents Map Mask (index 2) 7 6 5 4 3 2 1 Plane 3 Plane 2 Plane 1 Enables or disables CPU’s ability to access specific memory planes 1 = write enable, 0 = write disable Plane 0 0 Memory Mode (index 4) 7 6 5 “Chain-4” Addressing 1 = enabled 0 = disabled i.e., each plane holds every fourth byte “Odd/Even” Addressing 1 = disabled 0 = enabled It’s used for text modes 4 3 2 1 0 (For EGA only) 1= text 0 = graphics Extended Memory (>64K) 1 = present, 0 = absent GC: Miscellaneous (index 6) 7 6 5 4 3 Memory Map Memory Map options: 00 = 0xA0000 (128K) 01 = 0xA0000 (64K) 10 = 0xB0000 (64K) 11 = 0xB8000 (32K) 2 1 Odd/ Even enable 0 G/A 1 = use Odd/Even Addressing 0 = use Sequential Addressing 1 = Disable the character generator( graphics mode) 0 = Enable the character generator (use “text mode”) Graphics Controller registers are accessed via i/o ports 0x3CE/0x3CF GC: Mode (index 5) 7 6 256 colors 5 SHIFT 4 ODD/ EVEN 3 Read Mode 2 1 Write Mode (0, 1, 2, 3) Should be 0 for text mode This affects the VGA Attribute Controller’s operation (text color: foreground color and background color) Should be 1 for text 1 = cpu data at odd addresses is mapped to odd-numbered planes, cpu data at even addresses gets mapped to even-numbered planes 0 = cpu addressing is sequential NOT: This affects only the Graphics Controller. The Sequencer needs to be programmed separately to match 0 How to modify character ram • Algorithm: – Reset the VGA for accessing Plane 2 – Then CPU reads or modifies Plane 2 – Reset the VGA for accessing Planes 0, 1 • Acknowledgement: – Author Richard Wilton described this process in his classic book “Programmer’s Guide to PC Video Systems (2nd Edition)” Details for this ‘prolog’ outw( 0x0100, 0x3C4 ); // do a synch. reset outw( 0x0402, 0x3C4); // write Plane 2 only outw( 0x0704, 0x3C4 ); // sequential access outw( 0x0300, 0x3C4 ); // end the reset outw( 0x0204, 0x3CE ); // read Plane 2 only outw( 0x0005, 0x3CE ); // disable odd/even outw( 0x0006, 0x3CE ); // VRAM at 0xA0000 Details for the ‘epilog’ outw( 0x0100, 0x3C4 ); // do a synch. reset outw( 0x0302, 0x3C4); // write Planes 0 & 1 outw( 0x0304, 0x3C4 ); // odd/even access outw( 0x0300, 0x3C4 ); // end the reset outw( 0x0004, 0x3CE ); // restore to ‘default’ outw( 0x1005, 0x3CE ); // resume odd/even outw( 0x0E06, 0x3CE );// VRAM at 0xB8000 Some Class Demos • • • • ‘newzero.cpp’: installs new glyph for ‘0’ ‘romfonts.cpp’: finds ROM glyph-tables ‘backward.cpp’: flips character images! ‘vm86blue.cpp’: changes text’s attribute Algorithm for ‘backward.cpp’ for (int i = 0; i < 8192; i++) { unsigned char orig, revs = 0; orig = vram[ i ]; for (int j = 0; j < 8; j++) if ( orig & (1<<j) ) revs |= (1 << (7-j) ); vram[ i ] = revs; } Attribute Controller (0x3C0) Color Plane Enable (index 18) 7 6 5 4 3 2 1 0 Plane 3 Plane 2 Enables or disables color-palette address-bit from specific planes 1 = plane enable, 0 = place disable Plane 1 Plane 0 NOTE: Writing to Attribute Controller’s registers requires sending two bytes in succession to same port-address (0x3C0); reset internal flip-flop first by Inputting from port 0x3DA; output 0x20 to port 0x3C0 as a concluding step. In-Class Exercises • • • • Exercise #1: Design a new image for ‘A’ Exercise #2: Draw all text upside-down Exercise #3: Draw ‘yellow-on-green’ text Exercise #4: Draw fonts vertically aligned