我试图在我的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 *
第一个参数设为as,所以将其转换为近指针。由于您使用的是Near数据模型,因此void *
是Near指针类型。
要解决此问题,您应该改用_fmemcpy
将void far *
指针作为参数的函数,这样您的VGA
指针就不会转换为Near指针。
您还应该注意编译器警告。您的编译器应已通过以下消息警告您有关此问题的信息:
Warning: test.c 24: Suspicious pointer conversion in function main
您还应该留意并修复有关没有原型就调用函数的警告,因为正确原型化的函数可以使编译器对上述可疑指针转换发出警告。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句