0
VGA監視器編程多字節值包括用於獲取打印在屏幕上的字符寫入16位值的某些存儲器位置。這是在該16位值中不同位如何翻譯成字符被打印在屏幕上:使用按位運算符,以形成從單個字節
我用枚舉來代表不同的背景/前景顏色:
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.
}
問:代碼是否正確,是不是寫的方式來創造這樣的價值呢?有沒有一些標準的方法來做這種操作?
問:將我的方法是獨立於平臺的?對代碼的任何其他意見?
那些更錯別字我激動由:P但感謝指點出來。關於最後一部分,你的意思是指向小端/大端?我在最後直接寫了'* ptr_frameBuffer = complete16bitValue;'。它稍後會有一些問題嗎?如果機器是小型/大型的,那麼換擋操作員的輸出也不會取決於? –
錯別字發生,但它們很重要!移位運算符將正常工作......但是您不能確定高位字節是否將存儲在比低位字節少一位的存儲位置,或者多一位。但你的CPU會知道。因此,只要你將事物作爲16位整數來處理(就像你所做的那樣),而不是分別寫出高位和低位字節,這樣你就可以了。 – Floris