[解读] 简述 FBNeo 的 ROMs 校验机制
本帖最后由 taoenwen 于 2025-6-4 13:17 编辑这两天听到有人在讨论 FBNeo 游戏驱动 ROMs 的校验机制,有讲到点上,也有命中边缘的,更有不着边际的 ...,为了砖家们别误人子弟,也不耽误你们自以为是地捧高踩低,我简单解析一下吧。
FBNeo 属于内置列表类的模拟器,游戏只有存在于驱动列表中,才能工作 (ips、romdata 都是基于这种模型而拓展)。
每个驱动都维护着至少一个 ROMs 信息结构,我们可以认为是这是一张明细表,这些 ROMs 信息结构体 (表) 包含:当前被选中的游戏的 ROMs 的名称、长度、crc32、type;BIOS 的 ROMs (如果需求) 的相关信息。
校验/载入 ROMs 实际上只有一个区别,有一个布尔值去控制是不是要启动回调函数载入校验筛选后的的 ROMs,核心仍是校验机制,win32 平台,可参阅 bzip.cpp。
校验机制会做以下几件事 (这里跳过子目录扫描):
1、获取选中驱动的 ROMs 信息结构表,如果需求 BIOS 也获取 BIOS 的信息结构表,分别计算出它们各自的 ROMs 数量;
2、获取选中驱动的压缩包名称,如果需求 BIOS 也获取 BIOS 的压缩包名称,是 Clone 的话向上获取父级驱动的压缩包名称,然后以此准备从目录中找到它们。(有高手称之为解析,还能诞生出其它驱动的内容,果然既砖又高);
3、从预置的 20 个 ROMs 路径逐个查找符合的压缩包名称,找到则保存到一个最大可容纳 20 条的字符串数组中备用,当找满 20 条记录或 20 个默认路径都找完,搜索结束,如果搜索结果为 0,保存错误信息备用,将跳过 ;
4、开始按 获取的 ROMs 数量逐个校验找到的压缩包内的 ROMs,以驱动的 ROMs 结构体信息分别比对每个 ROM,通过 crc32、ROM 长度为主要依据,当上述 中有路径的压缩包中任意一个压缩包中的 ROM 符合正在校验的结构体 ROM 信息时,则返回成功并检查结构体的下一条内容,以此循环,直至全部检查完毕;
5、如果运行游戏,程序优先载入符合项 ROMs,但校验结果单项全部的 crc32、ROM 长度不符,但只要 ROM 名称符合,实际上是不会影响 ROMs 载入的,真正影响载入的是基于上述不符,且 ROMs 的 type 为 BRF_ESS 的 ROM,BRF_ESS 说明为:essential rom - without it the game may not run at all;
6、缺少 ROM、crc32、ROM 长度不符都会在校验中保留错误信息,在检查结束后一次性汇总,以信息框方式弹出,告知用户问题所在,游戏会不会触发运行,上述 已阐述;
7、全部校验结束后是且无 中提到的否决项,是否运行游戏取决于程序逻辑中的布尔值,如果运行则参考 ,直接回调函数载入 ROMs 了。
以上则是 FBNeo 游戏驱动 ROMs 的校验/载入机制的简明阐述,希望能帮助真正想搞明白原理的人,真的搞明白了,也就不会胡搅蛮缠了。
进来看看 技术大佬来了,欢迎欢迎,热烈欢迎 不明觉厉。有啥例子。示例 谢谢分享知识 进来学习一下 进来学习一下 爱唱歌的汤姆猫 发表于 2025-6-4 16:48
进来学习一下
猫猫是元老啊!牛! 学习一下,长姿势:loveliness: 大概的原理懂了,怎么添加新的rom包到游戏列表呢?
页:
[1]