刚才会一个帖子写了一段,觉得有必要让更多的人了解一下
http://bbs.yyjoy.com/thread-13863-1-1.html
如果写过程序的兄弟就更应该明白,CleanROM应该如何准确的定义了:游戏加载的时候,不改变CleanROM内容的就是支持CleanROM ,现在看来,Acekard,SC DS, Ez5应该都是支持CleanROM的,只是各家硬件的实现水准不一样,支持的程度,就要看谁模拟正版环境模拟的更加好了。其实AK说什么"大脚"没有按照任天堂标准来开发,那也是胡扯,是他们不知道如何解释才能解释清楚,我相信是AK没考虑到 有些游戏的程序员,在写程序的时候,也许没有初始化设备或者是给变量赋值就直接使用了,这个初始化或者是赋值的操作,如果是一个C/C++程序员,那没有做,就不是一个合格的程序员:D,这个不管是不是写游戏,都是程序员的错误。---当然了,正版游戏没出错,也不能怪程序员:) ,那就换个说法,AK的程序员没想到还有这样的程序员来写游戏:)
支持CleanROM的,菜单程序加载游戏的时候,构造一个完全模拟 NDSL自己引导正版游戏的环境(用硬件模拟),这个里面可能包括清控菜单程序使用的内存,取消中断(所谓的软复位就是在游戏ROM里面或者是直接在内存里面加中断处理),初始化CPU寄存器,初始化设备(包括显示设备等),做完这些,再把游戏加载。根据AK描述的,解决大脚游戏的问题是游戏没有初始化显卡,我猜测,一般任天堂自己开发游戏,或者说有经验的程序员开发游戏的时候,会初始化变量,初始化设备和中断,而大脚的程序员估计没有预料到会有AK这样的东西存在,所以理所当然的认为,加载游戏的时候,设备都是初始化好的,按照默认值去操作,所以会促错。我相信写过程序的人都懂我说的是什么意思,如果 你在 C语言里面写一个 int i; 不付值的话,这个i有可能等于任何值。
而R4的打补丁(还有其他 Slot2的卡)完全不一样,要支持FAT么?好,我找到ROM里面那段访问磁盘的代码(一般都是反汇编的),然后把它访问磁盘的函数改成直接读FAT的,存档代码直接改成写到FAT去。这个过程以前是在PC端完成的,到了忍者卡开始,开始把这个过程放在烧录卡的加载程序中完成,但是最大的问题是,每个游戏读写的代码都不太一样,也许一点差别,就要升级才能找到这个需要修改代码在那里,就像杀毒软件病毒库升级一样,要是厂商的时间不够或者是技术不够,或者是人手不够....或者是......种种情况了..就有可能要忍几天才能玩到了。
再说几个被误导的地方:
说合卡就不是CleanROM,单卡就是,我觉得这个问题就我的理解我觉得不是这么回事,NDSL的引导程序,就是玩正版的时候,选择游戏的那个界面,其实也是运行在NDSL游戏机上的一个程序,是由他来引导DS端的游戏,或者是GBA端或者是设置程序,聊天等。进入这些程序后,和引导程序就没关系了。同理,合卡的Menu程序,和NDSL游戏机上的引导程序没什么区别,单卡的游戏,只是在硬件上仿真而已,应该是最低端的技术了(相对于合卡),里面不包含任何程序。
说将ROM COPY到卡里,运行后在COPY出来,没有变化(不管是用CRC还是MD5)的,就是CleanROM ,这也是错误的,因为修改内容有可能是在加载的时候完成,并不会把介质上的程序真实的修改了。
第一时间我就入手AK了,刚好也是搞软硬结合的工作(手机),恰巧也写过SD卡的驱动。。。。我觉得AK采取专用格式,完全是被迫无奈,如果AK只支持PNY 1G,KingSton 1G连续区块,速度3的卡,应该是完全能做到FAT的。现在用AKFS是因为TF卡的兼容性。我的经验,有些卡,在连续读写的时候速度没有任何问题,但是随机读写的时候,速度会忽然快忽然慢,我想AKFS为什么要保持存储连续,这是一个主要的原因。其他采取FAT格式的卡,我实在是没想出来他们怎么解决这个问题的。。。。还有跨分块访问的时候,读取会有暂停这种现象...sc ds,ez5是怎么解决的,实在想不出来,有sc ds的朋友,可以测试一下 kingmax 512多copy些游戏,看看会不会出问题。
对了,写到这里,想到还有一个n-card..,他采取的是NAND-FLASH 的,但是他是怎么处理NAND上的坏块呢。。。这是一件比较复杂的事情,理论上他们用的那个CPLD是解决不了这个问题的,而NAND使用一段时间之后,一定会出现坏块的.
这篇文章如果大家感兴趣,我会不断修改和补充的,有什么问题,可以和大家一起探讨。
有一个朋友问我 NAND-FLASH坏块的问题,不太好解释,我在网上随便找了一段:
引用:
"对于nand最大的问题就是会有bad block,由于bad block的不确定性,所以进一步加大了对nand编程访问的难度。所以只有解决了bad block的问题才可能使用nand,将bad block处理的好才会最大的提升nand的access效率。
什么是badblock呢?就是在这一个block里有1个或多个bit的状态不能稳定的编程,所以就没法使用它,但是如果一个block(128KByte)有一个Bit是坏的,那么整个block放弃使用。听起来有点浪费,可能是根据物理原理使整个block的稳定性不能保证吧,或者是其他考虑。不过既然三星要求我们这么做,那么为了系统的稳定,也不要计较那几百KB的容量了。
bad block有2种,一种是initial badblock,另一种是runtime bad block。所谓initial badblock就是在三星出厂时就是坏块的。为什么出厂会有坏块?这个很正常,因为nand就是会有坏块,比LCD有坏点的几率大的多。但是可以放心的是三星在出厂前都对nand进行了测试,erase了所有的block,所以内容会都是0xFF,同时标记了bad block,这些即是initialbadblock。每一种容量的nand允许的最多坏块数都是有规定的,低于某个值是不会出厂的,同时低于98%的可用块,基本就会认为这块nand很不稳定了。
initial bad block的标记是保证坏块的前2个page里的sparearea里的第一个字节的内容不会是0xFF。即如果前2个page其中一个的2048地址(从0开始计数,以后都是这种计数方式)上的数据(就是spare area的第一个字节)是0xFF,那么这个块不是initial bad block。值得注意的一点是badblock的标记会被erase掉成0xFF,所以有可能会误被认为是good block。所以在对每一个blockearse之前一定要判断是不是bad block,否则将bad block的标志erase了,以后使用的时候会误被当作goodblock,从而有可能带来数据损失。
对于runtime的bad block,就是使用中出现的badblock,可以从erase或program后对成功与否的判断来决定这个block是否变成badblock,如果是的话则标记。一般标记的法则和initial bad block一样,在前两个page的sparearea的第一个byte上写非0xFF值,一般写0。
对于bad block的处理办法就是驱动层的问题了,做的好的话会很复杂,这个以后再介绍诸如三星的pocketstoreII这样的专门的nand driver来提供高可靠性和高perfermance。最简单的就是遇到坏块向后跳,但也是效率最差的,因为访问第n块时,你要知道0--(n-1)块一共有多少个bad block才能决定操作的偏移量,而扫描n-1块对于n比较大的情况无疑会很慢。
[
本帖最后由 leon 于 2006-12-23 12:31 AM 编辑 ]