gpt4 book ai didi

c - 在 C 中获取操作系统的默认颜色

转载 作者:太空宇宙 更新时间:2023-11-04 00:04:36 28 4
gpt4 key购买 nike

好的,我现在做的是一些背景知识。我正在开发一个带有小型文件系统的操作系统。它是用部分汇编器和部分 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

关于c - 在 C 中获取操作系统的默认颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29449941/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com