Search code examples
graphicsoperating-systemvga

Why is the bitwise shift needed for VGA colors?


I’ve been following the Bare Bones kernel guide at https://wiki.osdev.org/Bare_Bones, and I don’t understand these methods. Could someone explain why the bitwise operators in the methods are necessary? Thanks in advance!

enum vga_color {
    VGA_COLOR_BLACK = 0,
    VGA_COLOR_BLUE = 1,
    VGA_COLOR_GREEN = 2,
    VGA_COLOR_CYAN = 3,
    VGA_COLOR_RED = 4,
    VGA_COLOR_MAGENTA = 5,
    VGA_COLOR_BROWN = 6,
    VGA_COLOR_LIGHT_GREY = 7,
    VGA_COLOR_DARK_GREY = 8,
    VGA_COLOR_LIGHT_BLUE = 9,
    VGA_COLOR_LIGHT_GREEN = 10,
    VGA_COLOR_LIGHT_CYAN = 11,
    VGA_COLOR_LIGHT_RED = 12,
    VGA_COLOR_LIGHT_MAGENTA = 13,
    VGA_COLOR_LIGHT_BROWN = 14,
    VGA_COLOR_WHITE = 15,
};

static inline uint8_t vga_entry_color(enum vga_color fg, enum vga_color bg) 
{
    return fg | bg << 4;
}

static inline uint16_t vga_entry(unsigned char uc, uint8_t color) 
{
    return (uint16_t) uc | (uint16_t) color << 8;
}

Solution

  • The code is for generating VGA Compatible Text Mode,

    The enum specifies a color table that takes four bits. The first function takes in foreground and background colors and bitshifts the background color so that the two colors fit in an eight bit unsigned integer.

    The second function takes in the eight bit uint defined above and appends it to an eight bit character to produce a 16 bit value that defines a letter, background color and foreground color.