2015-04-04 90 views
2

好吧,这是我正在做的一些小背景。我正在开发一个小文件系统的操作系统。它是部分汇编器和C部分编写的。我试图实现热键以使系统循环遍历颜色,交换前景和背景颜色,完全清除屏幕等。这里是我正在使用的功能在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的包含当前颜色的文件中。

+0

'__clr_screen'是一个函数,它需要两个参数,一个颜色,并且它出现一个字的属性。当使用“_FILL_BLANK”时,它将清除屏幕上的所有内容,使用“_NO_FILL”时,屏幕上的所有内容都不会被修改。这是另一个文件中的用户定义的函数,它被导入到这个文件中。我基本上是使用这个函数来在需要时将所有内容保留在屏幕上,并且在需要时清除屏幕,就像按CTRL-Q时一样。 – kszalai 2015-04-05 16:44:21

回答

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

但是我的问题是获得在屏幕上

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

我还发现,当我尝试其他颜色时,任何高于十六进制值8的颜色都会给我0-7的颜色,但会导致屏幕闪烁。

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

+0

这帮了很多!想了很多,我需要相应地左右移动颜色 'bg_color = bg_c​​olor >> 4; fg_color = fg_color << 4; newcolor = bg_c​​olor | fg_color; color - newcolor;' 在看到名为'_color_attr'后,在另一个文件中还有一个属性,它包含当前的颜色,所以在完成按位后,我能够得到我所需要的。 – kszalai 2015-04-05 16:45:35