| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2124 人关注过本帖
标题:[求助]关于neo的几个问题
只看楼主 加入收藏
RockCarry
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
收藏
得分:0 

如果是英文显示是乱码的话,并且英文点阵使用的是机器BIOS里面的点阵数据的话,可能就是因为BIOS的原因了。
最早的,在吴进的TC256里面就是使用BIOS ROM里面的英文点阵,其方法大概是取得了某个地址,指向了英文点阵数据区。这种方法后来被证实不太可靠,因为不同机器的BIOS中的点阵数据可能是不同的。我以前就是使用此种方法,然后程序在自己机子上调好,到别人机器上就是乱码,如果在别人机器上调好,到自己机器上就成了乱码。
应该说是用BIOS里面的点阵数据是可行的,可能是TC256以及我后来的实现中,没有严格按照VGA的标准去做,而只是简单的取得了点阵数据区的地址。其实VGA在这方面是有一套标准的接口和操作流程的,最好能够严格按照其标准去做。
在我后来的实现中,将中英文全部采用文件形式的点阵字库来实现,个人感觉更加的简单易行,且易于维护。可以考虑采用这种方法。
字体方面,需要考虑的还有很多,比如矢量字库,国际化支持与多国语言等,因此需要好好思考,设计出简洁可扩充的调用接口,然后再加以实现。

如果是XP下进入VESA视频模式出现花屏,是因为某些显卡驱动的问题,一般情况下,更新一下显卡驱动就可以解决问题。我个人分析是XP再早期对SVGA的兼容性没有做好,但是当时各大显卡厂商已经按照微软提供的标准和DDK开发出了显卡驱动程序。后来MS发现了XP对SVGA的兼容性问题,对此做了修正(XP SP2中?猜测,因为SP2以前的好像始终不行)。当然,这种修正不是MS单方面就能解决问题的,还需要驱动开发厂商的配合,因此MS发布了新版的DDK,然后给出了新的县卡驱动标准,厂商就开发出修正般的驱动程序。作为用户就需要升级XP和显卡驱动,就可以解决问题。
当然,以上纯属个人推测。

[此贴子已经被作者于2007-4-2 16:18:53编辑过]

2007-04-02 15:02
RockCarry
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
收藏
得分:0 
以下是引用jig在2007-2-28 22:19:57的发言:
由于现在的显卡很多都不允许在16位实模式下修改分辨率和刷新率,所以你们的显示器出现蓝屏幕

要是大家是拿NEO学习,我强烈建议大家装个虚拟机,装上DOS,在这个虚拟DOS下去跑NEO,肯定没问题的。

Jig的说法有点错误。现在的PC机显卡,几乎都能支持到VESA VBE 2.0,VBE2.0中,在实模式和保护模式下都是可以进行设置视频模式等等与显卡相关的操作的。问题是在于Windows下,DOS程序是在Windows的一个虚拟机里运行的,而windows系统的这个虚拟机实现的好坏,就决定了windows对DOS程序兼容性的好坏。目前在XP上,大家是有目共睹的,做的不够好,所以才有这么多的问题。

更加严格的讲,我们所讲的VESA其实不是由显卡单方面实现的,很多功能是在主板的BIOS里面做的,当然显卡这边也需要进行配合。显卡里面有颗IC的,里面有更多的相关寄存器,更加底层(我这里就有一款显卡的资料,有兴趣地可以找我要)。BIOS程序其实才是真正实现VBE标准这一层的,BIOS直接会与显卡IC打交道,其下层是有差异的硬件,而向上提供的则是无差异的标准的VBE调用接口。这也是目前的许多主板只能支持某一系列的显卡的原因。
显卡发展到现在早已不再停留在VGA/SVGA/VESA标准上,这些标准都是针对2D的。现在的显卡已经具备了高性能的3D处理能力,曾有人将其称为AVGA。显卡3D方面的标准,目前应该还有确立,如果说有的话,可能OpenGL和D3D算是吧。但是这两个都只是给出了较为上层的接口,对于靠近硬件一层的相关标准应该是没有确立起来。显卡厂商需要和OS厂商配合,比如由MS和显卡厂商共同定义好D3D向下与显卡的接口,然后,将这个接口交给显卡厂商去实现,这个实现应该就是在显卡驱动里面做的吧。据个例子,在WinCE中,DirectDraw的实现就需要按照MS预先定义好的标准去做。
有关显卡3D接口的硬件方面的资料,在网上比较难找到,显卡厂商方面肯定是有的,只是可能出于商业原因,而没有公开。

我是做WinCE去冬开发的,并没有作过任何一个Windows的驱动,但是大致的原理应该都差不多的,因此我也相信以上基本上都是正确的,淡然也有些是猜测,如果有不对的,请指正。



[此贴子已经被作者于2007-4-2 16:10:24编辑过]

2007-04-02 15:59
一笔苍穹
Rank: 1
等 级:新手上路
帖 子:640
专家分:0
注 册:2006-5-25
收藏
得分:0 
以上两帖都很有道理,将中英双语言都放在文件中的确是个办法。JIG的意思是在16位编译器中比较难以实现刷新率的调整,我个人觉得很多黑屏问题与刷新率没有调整有关系。
最后那段猜测我和陈凯的想法一样,那份显卡资料我想要,呵呵:
dongkai329@yahoo.com.cn
2007-04-02 18:37
RockCarry
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
收藏
得分:0 
刷新率要改还是比较麻烦
其实按照通常的做法,我们都不会直接通过I/O去操作显示芯片,以达到改变分辨率和刷新率的目的。
在VGA系统中,是可以直接这样做的,并且能够实现被称为MODE-X的一系列显示模式。但是这样的做法并不推荐。
2007-04-02 20:18
RockCarry
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
收藏
得分:0 
在VESA标准中,则是,所有的操作都只能通过BIOS去实现,实模式下是通过软件中断,保护模式下是将BIOS复制一份到一个保护模式段中,然后找出调用地址,进行调用。大的原则就是不能直接访问显示IC,这样做更加安全,另一方面也是由于VESA显卡的硬件差异太大,每个显卡的内部实现和接口都是不同,VBE的目的就是为了屏蔽这些硬件的差异性,而向上提供一致的接口。
2007-04-02 20:18
RockCarry
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
收藏
得分:0 
VBE里面应该是定义了改变分辨率和刷新率的接口的,并且VBE2.0开始就支持实模式和保护模式两种模式。通常情况下,我们一不会直接改变分辨率和刷新率,而是通过调用接口查询当前的显卡所能支持的视频模式,然后再在这些可用的视频模式中,选择一种自己需要的模式。这应该是最为安全的做法(我个人是不太赞成VGA的MODE-X)。设置显卡不支持的显示模式也是导致异常的原因之一。
如果按照以上这样稳妥地做法,在XP下还要死机,那么我们就没有什么好的办法了,至少我是想不到了。
2007-04-02 20:19
RockCarry
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
收藏
得分:0 
晕,好像是家里网络的问题,导致发帖受限制
深圳电信宽带还真是垃圾,一点都不好用
在公司发帖都没有问题的,在家里必须要分成这样的一段一段的才能发。
都打电话投诉了好几次了,到现在还是没有解决问题。
2007-04-02 20:21
jig
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
帖 子:530
专家分:242
注 册:2005-12-27
收藏
得分:0 
那 RockCarry 兄,。能不能给个比较好的在DOS下设置为256色1024X768的模式的建议,我在MS-DOS7.1下去切换图形模式,还是出现了部分机器黑屏或花屏的现象。

要是实在不行,就只能去用32位的用现成的图形包试试啦。

[此贴子已经被作者于2007-4-14 8:54:19编辑过]


个人网站 -  http://.h001.
2007-04-14 08:53
RockCarry
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
收藏
得分:0 
我也没有实际做过
但是看VBE的标准里面是这样的:
1VESA下特定的显卡并不是一定就支持某个视频模式,1204x768x256这个视频模式并不是每个显卡都支持的。如果当前的显卡不支持这个视频模式,程序中设置这个视频模式时可能就会出问题
如何知道当前显卡能支持的视频模式?这个是有办法的,应该是VBE的
Function 00h - Return VBE Contorller information
Function 01h - Return Super VGA mode information
在设置视频模式时先查询显卡的能力,可以将返回的信息放到一个数组里面
然后实现setmode函数:
setmode(int width, int height, int color);
setmode函数会遍历前面的那个数组,看有没有对应的视频模式,然后再调用
Function 02h - Set Super VGA video mode
设置视频模式,如果该显卡不支持,则返回FLASE。
从VBE的文档上理解,应该是这种做法,但是我没有具体的实验过。这样做可能会设置某个视频模式失败,但是不会导致花屏和死机。
DirectDraw和Allegro应该都是这样做的吧。

[此贴子已经被作者于2007-4-14 10:46:16编辑过]

2007-04-14 09:46
一笔苍穹
Rank: 1
等 级:新手上路
帖 子:640
专家分:0
注 册:2006-5-25
收藏
得分:0 
NEO SDK后来加上的set_video_mode()函数就是这么做的,先询问显卡能支持的显示模式,再设置之,不过似乎仍然不行。超出刷新率范围的问题还是存在。所以我才认为是刷新率未与显示模式匹配造成的显示范围超出的。
2007-04-16 08:43
快速回复:[求助]关于neo的几个问题
数据加载中...
 
   



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

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