使用视频内存的文本编辑器

时间:2011-04-01 14:06:10

标签: c++ c

我正在使用C创建文本编辑器。你能解释一下这些宏吗?

#define Ad (unsigned char far *)0xb8000000
#define Pos(y,x) (2*((y)*80+x))
#define Write(y,x,ch) *(Ad+Pos(y,x))=ch
#define WriteA(y,x,fb) *(Ad+1+Pos(y,x))=fb

4 个答案:

答案 0 :(得分:7)

回到控制台程序的黑暗时代,人们习惯通过直接写入屏幕缓冲区来输出文本。

控制台屏幕缓冲区被组织为一组连续的字节对,描述显示的字符及其属性(颜色,背景颜色,最终闪烁)。

在您的情况下,屏幕缓冲区似乎为0xb800000(Ad)。假设屏幕宽度为80,Pos会将屏幕位置(y,x)转换为屏幕缓冲区中的内存偏移量。

Write更改指定位置的显示字符,而WriteA更改字符的颜色。

答案 1 :(得分:4)

我的天哪,就像1990年一样......

  • Ad是视频卡(文本模式)映射到其字符生成器的内存部分的地址。因此,如果您将* A'写入* Ad,那么您将在屏幕的左上角显示“A”。
  • Pos是一个宏,它计算屏幕左上角x,y位置的偏移量。 (这是一个危险的破碎宏,因为'x'周围没有()。)
  • 写入将char写入(x,y)位置
  • WriteA将字符属性(颜色等)写入(x,y)位置。

我不想苛刻,但如果你在这个级别上挣扎,你将很难写出一个文本编辑器。

答案 2 :(得分:3)

  • 广告返回视频内存开头的地址
  • Pos将x,y位置转换为内存中的绝对位置(假设80个字符宽度)
  • 将字符ch放在x,y位置
  • WriteA在x,y位置设置字体颜色

答案 3 :(得分:3)

您不想使用它们。

这些宏用于旧硬件,可以直接访问屏幕。

  • 第一个宏只指定屏幕的基地址(标准C无法识别far
  • 第二个宏将屏幕位置转换为偏移
  • 第3个人将一个角色写入屏幕
  • 第4个将颜色写入屏幕

同样,您不想使用这些宏