问题描述
我试图在我的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)上没有白色像素
解决方法
您的问题是,您大概在使用Near数据模型进行编译,例如默认情况下数据指针接近的微型或小型内存模型。 Near数据指针只能引用默认数据段中的内容,而VGA帧缓冲区位于此默认段之外。在将变量VGA
正确定义为远指针的同时,将此指针传递给memcpy
时,它被转换为近指针,因为memcpy
的第一个参数为void *
。由于您使用的是Near数据模型,void *
是Near指针类型。
要解决此问题,您应该使用函数_fmemcpy
来代替,该函数将void far *
指针作为参数,因此您的VGA
指针将不会转换为Near指针。
您还应该注意编译器警告。您的编译器应该已通过以下消息警告您有关此问题的信息:
Warning: test.c 24: Suspicious pointer conversion in function main
您还应该注意并修复有关没有原型的调用函数的警告,因为正确原型的函数可以使编译器警告上述可疑的指针转换。