在 C 中获取 OS 的默认颜色

Obtaining Default Color for OS in C

好的,我现在做的是一些背景知识。我正在开发一个带有小型文件系统的 OS。它是用部分汇编程序和部分 C 编写的。我正在尝试实现热键以使系统循环显示颜色、交换前景和背景颜色、完全清除屏幕等。这是我目前正在使用的功能

PRIVATE void my_toy_shell(u16_t key) {
u32_t color = 0;
char fg_color, bg_color, newcolor;

// Colors
newcolor = 0x2a;
fg_color = 0x0E;
bg_color = 0x10;

switch(key) {
    case C('D'):        /* ctrl-d set default color */
        newcolor = 0x1E;
        color = newcolor;
        __clr_screen(color,_NO_FILL);
        break;

    case C('S'):        /* ctrl-s swap bg and fg color */
        bg_color = color & 0xF0;
        fg_color = color & 0x0F;
        newcolor = fg_color | bg_color;
        color = newcolor;
        __clr_screen(color,_NO_FILL);
        break;

    case C('F'):        /* ctrl-f  cycle fg color */
        if(fg_color == 0x0F)
            fg_color = 0x00;
        else
            fg_color<<;
        color = bg_color | fg_color;
        __clr_screen(color, _NO_FILL);
        break;

    case C('G'):        /* ctrl-g cycle bg color */
        /*if(bg_color == 0x70)*/
        break;

    case C('Q'):        /* ctrl-q  reset */
        /*Clears screen*/
        __clr_screen(_IOTA_TTY_COLOR,_FILL_BLANK);
        _display_welcome();
        break;
    }
}

现在只是为了验证函数是否正常工作,我已经硬编码了 "newcolor"、"fg_color" 和 "bg_color"。 CTRL-D 和 CTRL-Q 一样执行正确的功能。 CTRL-S 应该交换前景色和背景色。 这就是我感到困惑的地方。为了交换屏幕上的当前颜色,我被告知使用 0x0F 或 0xF0 的颜色,具体取决于我想为 fg 或 bg 获得哪个值。但是我不确定如何获得屏幕上显示的当前颜色。默认值为蓝底黄字 (0x1E)。我还发现,当我尝试其他颜色时,任何高于 8 的十六进制值都会给我 0-7 的颜色,但它会导致屏幕闪烁。使用按位“&”和“|”应该让我得到我需要交换的相应值。但是我的问题是获取屏幕上的当前颜色。我不确定这是否是我需要尝试在其他地方的文件中找到的东西,或者我是否可以使用 C 中内置的东西来获取这些值

编辑:我明白了。结果我在另一个文件中有一个属性被导入到这个名为 _color_attr 的文件中,它包含当前颜色。

bg_color = color & 0xF0;
fg_color = color & 0x0F;
newcolor = fg_color | bg_color;
color = newcolor;

前面的代码没有调换颜色!使用

bg_color = (color & 0xF0) / 16;
fg_color = (color & 0x0F) * 16;
newcolor = fg_color | bg_color;
color = newcolor;

However my problem is obtaining the current color on screen

可以直接读取屏幕显示的第一个字符的属性字节。它的线性地址是0xB8001.
还有不错的视频 BIOS 功能 8 可以帮助您检索当前颜色。

I also found that when I tried the other colors, anything above a hex value of 8 will give me the colors for 0-7 but it causes the screen to blink.

要禁用闪烁,请使用 AL=3 和 BL=0 的视频 BIOS 功能 16