标题:关于DJGPP和RHIDE的入门级问题
只看楼主
灭火的风
Rank: 2
来 自:杭州
等 级:论坛游民
帖 子:161
专家分:10
注 册:2006-6-15
 问题点数:0 回复次数:9 
关于DJGPP和RHIDE的入门级问题

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

搜索更多相关主题的帖子: DJGPP RHIDE 入门 REGS GCC 
2006-06-19 17:38
一笔苍穹
Rank: 1
等 级:新手上路
帖 子:640
专家分:0
注 册:2006-5-25
得分:0 

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

2006-06-19 18:57
灭火的风
Rank: 2
来 自:杭州
等 级:论坛游民
帖 子:161
专家分:10
注 册:2006-6-15
得分:0 
嗯,谢谢斑竹。刚才REGS用不来是因为我自己没包含dos.h........
2006-06-19 20:26
灭火的风
Rank: 2
来 自:杭州
等 级:论坛游民
帖 子:161
专家分:10
注 册:2006-6-15
得分:0 

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

2006-06-20 00:52
灭火的风
Rank: 2
来 自:杭州
等 级:论坛游民
帖 子:161
专家分:10
注 册:2006-6-15
得分:0 
刚刚在国外网站上看到一种访问系统内存的方法,如下

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

这样就可以了,但是斑竹说的方法为什么通不过呢?
2006-06-20 01:41
灭火的风
Rank: 2
来 自:杭州
等 级:论坛游民
帖 子:161
专家分:10
注 册:2006-6-15
得分:0 
我的__djgpp_nearptr_enable()返回的是NULL.....
2006-06-20 02:15
一笔苍穹
Rank: 1
等 级:新手上路
帖 子:640
专家分:0
注 册:2006-5-25
得分:0 
我说的这个方法并没说全,不能做实际代码用,不好意思误导你了~~
你用的方法不错,不过不知性能如何,有空我去测试一下。
2006-06-20 19:16
灭火的风
Rank: 2
来 自:杭州
等 级:论坛游民
帖 子:161
专家分:10
注 册:2006-6-15
得分:0 
你说的那个方法我在国外站点上也看见了,他说要测试那个enable函数的返回值,如果为零的话就调用失败了,并说这是有可能发生的,但是就是没有说这是为什么,以及如何解决.....
2006-06-20 22:32
灭火的风
Rank: 2
来 自:杭州
等 级:论坛游民
帖 子:161
专家分:10
注 册:2006-6-15
得分:0 
顺便再问以下斑竹啊,和farnspokeb对应的有没有读系统内存的方法的?还有就是在保护模式下,ASCII码点阵的地址是多少呀?
2006-06-20 22:35
灭火的风
Rank: 2
来 自:杭州
等 级:论坛游民
帖 子:161
专家分:10
注 册:2006-6-15
得分:0 

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

2006-06-24 03:46



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-73406-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.150938 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved