注册 登录
编程论坛 C图形专区

关于DJGPP和RHIDE的入门级问题

灭火的风 发布于 2006-06-19 17:38, 2247 次点击

我下载了DJGPP还带了RHIDE环境;
但是以前的一些程序都不能通过编译
里面似乎没有REGS这个联合,我开始以为这是因为GCC是标准C的关系,但是后来发现像getch()这样的一些不标准的函数居然可以用.......
这是为什么呢?
我该怎样才能调用系统中断呢?

9 回复
#2
一笔苍穹2006-06-19 18:57

在实模式下,定义 一个指向显存首址和指针可以是这样:
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结合使用的。

#3
灭火的风2006-06-19 20:26
嗯,谢谢斑竹。刚才REGS用不来是因为我自己没包含dos.h........
#4
灭火的风2006-06-20 00:52

又有问题了......
#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里通不过.....为什么会这样?

#5
灭火的风2006-06-20 01:41
刚刚在国外网站上看到一种访问系统内存的方法,如下

#include <sys/farptr.h>
#include <go32.h>
...
farsetsel(_dos_ds);
farnspokeb(0xA0000+offset,color);

这样就可以了,但是斑竹说的方法为什么通不过呢?
#6
灭火的风2006-06-20 02:15
我的__djgpp_nearptr_enable()返回的是NULL.....
#7
一笔苍穹2006-06-20 19:16
我说的这个方法并没说全,不能做实际代码用,不好意思误导你了~~
你用的方法不错,不过不知性能如何,有空我去测试一下。
#8
灭火的风2006-06-20 22:32
你说的那个方法我在国外站点上也看见了,他说要测试那个enable函数的返回值,如果为零的话就调用失败了,并说这是有可能发生的,但是就是没有说这是为什么,以及如何解决.....
#9
灭火的风2006-06-20 22:35
顺便再问以下斑竹啊,和farnspokeb对应的有没有读系统内存的方法的?还有就是在保护模式下,ASCII码点阵的地址是多少呀?
#10
灭火的风2006-06-24 03:46

我知道方法了
dosmemget函数就可以读取系统内存中的数据了

1