我下载了DJGPP还带了RHIDE环境;
但是以前的一些程序都不能通过编译
里面似乎没有REGS这个联合,我开始以为这是因为GCC是标准C的关系,但是后来发现像getch()这样的一些不标准的函数居然可以用.......
这是为什么呢?
我该怎样才能调用系统中断呢?
我下载了DJGPP还带了RHIDE环境;
但是以前的一些程序都不能通过编译
里面似乎没有REGS这个联合,我开始以为这是因为GCC是标准C的关系,但是后来发现像getch()这样的一些不标准的函数居然可以用.......
这是为什么呢?
我该怎样才能调用系统中断呢?
在实模式下,定义 一个指向显存首址和指针可以是这样:
char far *vgamemory = (char *)0xA0000000L;
或者是:
char far *vgamemory = (char *)MK_FP(0xA000, 0);
但是由于DJGPP下没有这么简单因为它的程序工作在保护模式下,你不能直接对所有的系统内存进行寻址,较好的方案是你可以通过__djgpp_nearptr_enable()暂时禁用保护模式,示例代码如下:
#include <sys/nearptr.h>
__djgpp_nearptr_enable();
vgamemory=(char *)(0xa0000 + __djgpp_conventional_base);
/*......*/
__djgpp_nearptr_disable();
至于REGS联合你可以到DJGPP的include文件夹中查看dos.h里的内容,你会发现它不仅没消失,反而更强大的,可以适用于访问32位寄存器了。如果你想仔细研究,下载一个Allegro是不错的选择,仔细阅读其中有关DOS平台的代码,你会颇有收获,因为这个库在DOS下就是与DJGPP结合使用的。
又有问题了......
#include <stdlib.h>
#include <conio.h>
#include <dos.h>
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <sys/nearptr.h>
#define VEDIO_ACCESS (0xA0000+__djgpp_conventional_base)
int main()
{
union REGS r;
__djgpp_nearptr_enable();
r.x.ax = 0x13;
int86(0x10,&r,&r);
*((char *)VEDIO_ACCESS) = 4;
getch();
r.x.ax = 0x03;
int86(0x10,&r,&r);
__djgpp_nearptr_disable();
}
这个在RHIDE里通不过.....为什么会这样?