【问题标题】:Plotting a char in VGA mode在 VGA 模式下绘制一个字符
【发布时间】:2016-01-14 01:19:17
【问题描述】:

我正在为 256 VGA 模式在视频模式下绘制一个字符的功能。 我正在使用 6x7 字体,该字体集仅包含大写字母、数字和符号。这是数据:

uint8_t  characters[455] = {
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x50,
  0x50,0x00,0x00,0x00,0x00,0x00,0x50,0xf8,0x50,0x50,0xf8,0x50,0x00,0x20,0xf8,0xa0,
  0xf8,0x28,0xf8,0x00,0xc8,0xd0,0x20,0x20,0x58,0x98,0x00,0x40,0xa0,0x40,0xa8,0x90,
  0x68,0x00,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x20,0x40,0x40,0x40,0x40,0x20,0x00,
  0x20,0x10,0x10,0x10,0x10,0x20,0x00,0x50,0x20,0xf8,0x20,0x50,0x00,0x00,0x20,0x20,
  0xf8,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x60,0x20,0x40,0x00,0x00,0x00,0xf8,0x00,
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x08,0x10,0x20,0x40,0x80,
  0x00,0x70,0x88,0x98,0xa8,0xc8,0x70,0x00,0x20,0x60,0x20,0x20,0x20,0x70,0x00,0x70,
  0x88,0x08,0x70,0x80,0xf8,0x00,0xf8,0x10,0x30,0x08,0x88,0x70,0x00,0x20,0x40,0x90,
  0x90,0xf8,0x10,0x00,0xf8,0x80,0xf0,0x08,0x88,0x70,0x00,0x70,0x80,0xf0,0x88,0x88,
  0x70,0x00,0xf8,0x08,0x10,0x20,0x20,0x20,0x00,0x70,0x88,0x70,0x88,0x88,0x70,0x00,
  0x70,0x88,0x88,0x78,0x08,0x70,0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x00,0x30,0x30,
  0x00,0x30,0x10,0x20,0x00,0x00,0x10,0x20,0x40,0x20,0x10,0x00,0x00,0xf8,0x00,0xf8,
  0x00,0x00,0x00,0x00,0x20,0x10,0x08,0x10,0x20,0x00,0x70,0x88,0x10,0x20,0x00,0x20,
  0x00,0x70,0x90,0xa8,0xb8,0x80,0x70,0x00,0x70,0x88,0x88,0xf8,0x88,0x88,0x00,0xf0,
  0x88,0xf0,0x88,0x88,0xf0,0x00,0x70,0x88,0x80,0x80,0x88,0x70,0x00,0xe0,0x90,0x88,
  0x88,0x90,0xe0,0x00,0xf8,0x80,0xf0,0x80,0x80,0xf8,0x00,0xf8,0x80,0xf0,0x80,0x80,
  0x80,0x00,0x70,0x88,0x80,0x98,0x88,0x70,0x00,0x88,0x88,0xf8,0x88,0x88,0x88,0x00,
  0x70,0x20,0x20,0x20,0x20,0x70,0x00,0x10,0x10,0x10,0x10,0x90,0x60,0x00,0x90,0xa0,
  0xc0,0xa0,0x90,0x88,0x00,0x80,0x80,0x80,0x80,0x80,0xf8,0x00,0x88,0xd8,0xa8,0x88,
  0x88,0x88,0x00,0x88,0xc8,0xa8,0x98,0x88,0x88,0x00,0x70,0x88,0x88,0x88,0x88,0x70,
  0x00,0xf0,0x88,0x88,0xf0,0x80,0x80,0x00,0x70,0x88,0x88,0xa8,0x98,0x70,0x00,0xf0,
  0x88,0x88,0xf0,0x90,0x88,0x00,0x70,0x80,0x70,0x08,0x88,0x70,0x00,0xf8,0x20,0x20,
  0x20,0x20,0x20,0x00,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x88,0x88,0x88,0x88,0x50,
  0x20,0x00,0x88,0x88,0x88,0xa8,0xa8,0x50,0x00,0x88,0x50,0x20,0x20,0x50,0x88,0x00,
  0x88,0x50,0x20,0x20,0x20,0x20,0x00,0xf8,0x10,0x20,0x40,0x80,0xf8,0x00,0x60,0x40,
  0x40,0x40,0x40,0x60,0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x30,0x10,0x10,0x10,
  0x10,0x30,0x00,0x20,0x50,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
  0x00,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8};

对于 put_char 函数,我通过将 ascii 代码乘以 7 并减去 32 来计算数组的偏移量(因为我只是使用大写字母)。然后我遍历字体大小的宽度和高度(即 6 和 7)以绘制像素,如果我找到 1,如果我找到 0,则什么都不做。

void put_char(int x,int y,int ascii_char){
    int l,i,j,h,char_offset;
    j,h,l,i=0;
    char_offset = ascii_char*7-32;
    printf("offset: %d\n",char_offset);
    for (l = 0; l < 7; l++) {
        for (i = 6; i > 0; i--) {
            j++;
            if ((characters[char_offset+l+j] & (1 << i))) { 

                plot_pixel(j+x, h+y, current_color);
            }
        }
        h++;
        j = 0;
    }   
}

但是,我没有在屏幕上正确打印这封信。我想我可能在计算偏移量时遇到问题,但我不知道它在哪里。我也怀疑我检查数字是 1 还是 0 的方法是否正确。谁能帮我解决这个问题?

编辑:

这是我得到的图片(注意绘图区域上的绿色像素,应该是字母“A”

编辑 2:

这是我改变后得到的图片

 char_offset = ascii_char*7-32;

 char_offset = (ascii_char-32)*7;

这几乎是好的,但是“A”的左侧在像素的绘图中不知何故丢失了。

【问题讨论】:

  • 可以加个截图吗?尽管您已经提供了很多信息,但可能无需阅读代码就可以立即使问题变得明显。如果您在一行中打印空格、!、" 等,那么计算偏移量时的错误可能会立即显现出来。
  • 您好,感谢您的 cmets。 @enhzflep 我每个水平行有 1 个字节。所以这个想法是每个字符位图有 7 个字节。
  • @Tommy。我添加了显示内容的屏幕截图
  • OT,但我必须问:这些屏幕截图是什么程序?
  • 是我开发的

标签: c dos vga


【解决方案1】:

你很可能想要:

char_offset = (ascii_char-32)*7;

如果你先乘以 7,然后再减去 32,那么你将减去不够,因为你想向后移动 32 个字符,而不是 32 像素行。

【讨论】:

  • 感谢您的帮助。我现在差不多好了。我添加了另一个屏幕截图来显示我现在的结果
  • 看像素数据,每行的6个像素好像左移了2个像素,所以把内部的for循环改成for (i = 7; i &gt;= 2; i--) {
猜你喜欢
  • 2018-03-29
  • 1970-01-01
  • 2016-04-17
  • 1970-01-01
  • 2016-09-05
  • 2019-07-26
  • 2015-08-14
  • 2011-04-23
  • 1970-01-01
相关资源
最近更新 更多