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 位,unsigned short 16 位,char 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.
}

:代码是否正确,是创建这样一个值的编写方式吗?有没有一些标准的方法来做这种操作?

:我的方法会独立于平台吗?对代码还有其他评论吗?

4

1 回答 1

1

它非常接近 - 但线路

unsigned short lowerByteAs16bitValue = lowerByte & 0 ;

将清除低字节。你可能想要

unsigned short lowerByteAs16bitValue = lowerByte;

您实际上并不需要lowerByte, 并且可以c直接使用 - 但您的代码更具可读性。

下一个问题:

unsigned short complete16bitValue = higherByteAs16bitValue & lowerByteAs16bitValue ;

同样,您正在使用&运算符。我认为您的意思是使用|(OR) ,就像您之前所做的几行一样。

虽然这现在看起来“可移植”,但在写入硬件时仍然需要小心,因为低端和高端平台可能会切换字节 - 所以当你的代码工作到返回正确的 16 位字时,您可能需要注意该字是如何写入 VGA 卡的。那是您注释掉的那行……但它至关重要!

于 2013-10-19T21:30:29.740 回答