2013-10-19 18 views
0

VGA監視器編程多字節值包括用於獲取打印在屏幕上的字符寫入16位值的某些存儲器位置。這是在該16位值中不同位如何翻譯成字符被打印在屏幕上:使用按位運算符,以形成從單個字節

enter image description here

我用枚舉來代表不同的背景/前景顏色:

typedef enum 
{ 
    eBlack , 
    eBlue , 
    eGreen , 
    eCyan, 
    eRed, 
    eMagenta, 
    eBrown, 
    eLightGrey, 
    eDarkGrey, 
    eLightBlue, 
    eLightGreen, 
    eLightCyan, 
    eLightRed, 
    eLightMagenta, 
    eLightBrown, 
    eWhite 

} textColor ; 

我寫這個函數根據三件事情創建這個16位值,字符用戶想要打印他想要的前景色和背景色:

假設:在我的平臺上,INT 32位無符號短的16位字符8位

void printCharacterOnScreen (char c , textColor bgColor, textColor fgColor) 
{ 
    unsigned char higherByte = (bgColor << 4) | (fgColor) ; 
    unsigned char lowerByte = c ; 

    unsigned short higherByteAs16bitValue = higherByte & 0 ; 
    higherByteAs16bitValue = higherByteAs16bitValue << 8 ; 

    unsigned short lowerByteAs16bitValue = lowerByte & 0 ; 

    unsigned short complete16bitValue = higherByteAs16bitValue & lowerByteAs16bitValue ; 

    // Then write this value at the special address for VGA devices. 
} 

問:代碼是否正確,是不是寫的方式來創造這樣的價值呢?有沒有一些標準的方法來做這種操作?

問:將我的方法是獨立於平臺的?對代碼的任何其他意見?

回答

1

這是非常接近 - 但行

unsigned short lowerByteAs16bitValue = lowerByte & 0 ; 

將清除低字節。你可能想

unsigned short lowerByteAs16bitValue = lowerByte; 

你並不真正需要的lowerByte,並且可以直接使用c - 但你的代碼更易讀。

下一個問題是:

unsigned short complete16bitValue = higherByteAs16bitValue & lowerByteAs16bitValue ; 

同樣,你正在使用的&操作。我想你的意思是使用|(OR),就像你之前做過幾行一樣。

雖然現在看起來「便攜」,但在寫入硬件時仍需小心,因爲低端和高端平臺可能會切換字節 - 所以當您的代碼工作到返回正確的16位字,您可能需要注意如何將該字寫入VGA卡。這是你註釋的路線......但這非常重要!

+0

那些更錯別字我激動由:P但感謝指點出來。關於最後一部分,你的意思是指向小端/大端?我在最後直接寫了'* ptr_frameBuffer = complete16bitValue;'。它稍後會有一些問題嗎?如果機器是小型/大型的,那麼換擋操作員的輸出也不會取決於? –

+0

錯別字發生,但它們很重要!移位運算符將正常工作......但是您不能確定高位字節是否將存儲在比低位字節少一位的存儲位置,或者多一位。但你的CPU會知道。因此,只要你將事物作爲16位整數來處理(就像你所做的那樣),而不是分別寫出高位和低位字節,這樣你就可以了。 – Floris