The framebuffer
Video memory is directly mapped to memory areas from 0xA0000
to 0xBFFFF
. There
are different graphic mode, and therefore different framebuffers. For now, let
us stick with the default mode: color text mode. This mode allow us to write 25
rows of 80 columns and to use colors. Its buffer starts at address 0xB8000
:
everything written in this buffer is displayed on the screen.
This buffer works as a big unidimensional array. Each cell is represented by two bytes: the character and then its color parameters (see below).
Character definition
Here is the description of each byte of a text framebuffer character:
Bit Color Function
15 B Background intensity
14 R Background color
13 G Background color
12 B Background color
11 I Foreground intensity
10 R Foreground color
9 G Foreground color
8 B Foreground color
0-7 - ASCII code
Here is the color table:
I R G B Color
0 0 0 0 Black
0 0 0 1 Blue
0 0 1 0 Green
0 0 1 1 Cyan
0 1 0 0 Red
0 1 0 1 Magenta
0 1 1 0 Brown
0 1 1 1 White
1 0 0 0 Gray
1 0 0 1 Light Blue
1 0 1 0 Light Green
1 0 1 1 Ligth Cyan
1 1 0 0 Light Red
1 1 0 1 Light Magenta
1 1 1 0 Yellow
1 1 1 1 White (high intensity)
I stands for intensity, R for red, G for green and B for blue.
Example
The following C code displays the character âkâ on the zeroth line, twelveth column with a red foreground on a blue background:
char* video_mem = (void*) 0xb8000;
video_mem[(0 * 80 + 11) * 2] = 'k';
video_mem[(0 * 80 + 11) * 2 + 1] = 0x14;