- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在开发一种功能,可以在 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”的左侧。
最佳答案
您很可能想要:
char_offset = (ascii_char-32)*7;
如果您先乘以 7,然后减去 32,那么您减去的量将不够,因为您要向后移动 32 个字符,而不是 32 个像素行。
关于c - 在 VGA 模式下绘制一个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34772441/
我有一个简单的函数,可以在 DOS 框中使用 djgpp 和 256 VGA 在 c 中使用内联汇编来绘制像素: byte *VGA = (byte *)0xA0000; void plot_pi
我正在尝试使用 C 在 256 色 VGA 上创建一个简单的图像编辑器(如绘画)。现在我正在努力在屏幕上绘制圆圈。我遇到的问题是,当圆圈比屏幕大时,不应该绘制的部分出现在屏幕的另一侧。我有一个 if
我正在尝试在 DOSBox 的汇编程序中设置 VGA(640x480x16) 调色板,但特别是颜色 6、8-F 不会改变。我试过使用中断和直接通过端口都适用于其他颜色但不适用于那些颜色。我在默认配置上
是否可以通过 VGA 连接器镜像屏幕?找不到任何关于此的内容。 最佳答案 我一直在寻找和你一样的东西。上周末我写了一个小的 UIApplication 类别来添加镜像支持。我在 Google Code
我正在用 rltk 构建一个简单的游戏。 8x8 简单字体可以正常工作,但是当我尝试将其更改为内置 8x16 VGA 字体时,它会像这样拉伸(stretch)和移动字体: 我像这样初始化窗口: fn
我目前正在为 x86 开发内核(只是为了好玩)。我正在尝试实现一个相当有用的早期控制台,以报告驱动程序的加载情况,并允许我在需要时在引导期间使用内存,使用位于 0xB8000 的 80x25 字符 V
有没有一种方法可以使用 Python 脚本检测外接显示器何时插入 Ubuntu Linux 中的 VGA 端口?我应该使用 xrandr 还是 monitor a UDEV message 进行轮询?
我正在尝试编写一个函数,使用 VGA 文本模式缓冲区将消息打印到屏幕上。这是打印单个字符的函数: void putc(uint8_t c, enum Color term_color) { u
我正在开发一个操作系统作为一个业余项目。我使用地址 0xB8000 连接 VGA 显示器,行数设置为 25,列数设置为 80。我使用了以下清屏功能: void vga_init(void) {
我正在开发一种功能,可以在 256 VGA 模式的视频模式下绘制角色。我使用 6x7 字体,该字体集仅包含大写字母、数字和符号。这是数据: uint8_t characters[455] = {
我正在开发操作系统作为个人爱好,以便我可以学习软件工程和计算机体系结构。 当文本到达底部或 VGA_HEIGHT 时,我试图让 VGA 终端“滚动”。我将 OSDev wiki 中的代码与我自己的代码
我做了简单的代码,应该写入VGA内存。 org 07c00h mov eax,0xb8000 mov bx,msg call printstr printstr: mov al,byt
我使用了所有示例和源代码来将应用程序内容显示到外部 VGA 显示器。在应用程序内部播放视频时,外部设备中出现以下情况。有什么建议......我错过了一些东西......但在设备中它以良好的方式显示实际
1我在 DosBox 0.74 上用 TASM 3.0 写,我想用 Mode x 写(Tweaked 13h, unchained mode 13 ),我遇到了一个问题,你如何在图像中看到,每一行都被
就是这样,我想知道是否有人拔掉显示器插头并采取一些行动,知道吗?谢谢 最佳答案 我自己没有尝试过,但我认为您可以监听 WM_DEVICECHANGE 并检查 System.Windows.Forms.
我正在使用 NASM 来学习 x86 汇编,在 linux 上的 qemu 中运行我的代码。 我正在尝试在屏幕上绘制一个像素。 为什么是这样 mov bx,0xA000 mov byte [b
早在 199[456] 年,我就在使用 Linux 和 Matrox 图形适配器。对于编程,我经常使用 text mode 并且懒得启动到 X11。这些图形卡允许非常高的文本分辨率,并且仍然具有非常易
我正在寻找“Linux VGA 捕获卡”,它可以从远程计算机捕获 VGA 输入,这样我就可以使用 V4L2 捕获源。请推荐一些。 最佳答案 Datapath 声誉良好,并且支持 Linux: http
我正在尝试获得一个简单的 Hello World!内核启动。每当我打开我的虚拟机时,我都会看到 GRUB 加载,选择我的操作系统,然后在屏幕上出现一个随机字符,并因三重故障而崩溃。我认为问题出在我的
因此,我们得到了一些图形技巧,需要在没有真正视频卡的情况下在服务器环境中运行。它真正需要的只是帧缓冲区对象和一些矢量/字体抗锯齿。它会很慢,我知道。它只需要输出单帧。 我看到 this发布有关如何强制
我是一名优秀的程序员,十分优秀!