2015-04-04 152 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