【发布时间】:2020-09-18 06:46:13
【问题描述】:
我试图在我的 VGA dos 程序中加入双缓冲,但是当我使用 memcpy 函数时似乎出现了问题。
我确定我分配了所需的内存,但它似乎不起作用。
这是程序:
#include <dos.h>
#include <string.h>
unsigned char* doublebuffer;
unsigned char far* VGA = (unsigned char far*) 0xA0000000L;
void setmode(int mode)
{
union REGS regs;
regs.h.ah = 0x0;
regs.h.al = mode;
int86(0x10, ®s, ®s);
}
void main()
{
doublebuffer =(unsigned char *) malloc(320*200);
setmode(0x13);
VGA[9*320+11] = 0x41;
doublebuffer[9*320+10] = 15;
if(doublebuffer[9*320+10] != 15)
{
exit(1);
}
memcpy(VGA, doublebuffer, 320*200);
getch();
}
malloc 有效,因为程序不会崩溃,缓冲区接受颜色,但 memcpy 似乎不起作用,因为屏幕上没有任何内容。
当我直接写入 VGA 地址时,它可以工作。 (11, 9) 上会有一个粉红色像素,但 (10, 9) 上没有白色像素
【问题讨论】:
-
你确定如果你写一些东西到VGA地址它对屏幕有影响吗?例如。 VGA[320*10] = 128;
-
@Login 对不起,我注意到了,但是是的,VGA 地址适用于所有 320*200 像素
-
我会尝试的事情(这里只是头脑风暴):使用
calloc()将双缓冲区初始化为零并测试NULL的结果,使用memmove()只是为了好玩,将全局变量移入main()...退出大声:fprintf(stderr, "\aBUFFER MISMATCH!!!\a\n"); exit(1); -
请edit 并显示有效的代码(直接写入VGA 内存的代码)。
-
_fmemcpy(......