为什么VGA颜色需要按位移位?

时间:2019-04-19 20:52:32

标签: graphics operating-system vga

我一直在关注https://wiki.osdev.org/Bare_Bones上的Bare Bones内核指南,但我不理解这些方法。有人可以解释为什么方法中的按位运算符是必要的吗?预先感谢!

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;
}

2 个答案:

答案 0 :(得分:3)

该代码用于生成VGA Compatible Text Mode

该枚举指定一个占用四位的颜色表。第一个函数接受前景色和背景色,并对背景色进行位移位,以使这两种颜色适合一个八位无符号整数。

第二个函数接受上面定义的8位uint,并将其附加到8位字符以产生16位值,该值定义字母,背景色和前景色。

答案 1 :(得分:0)

您似乎正在以每像素4位的模式运行。因此,每个字节需要两个值。该位在8位字节中放置了两个4位值。