作者TKyo (闇黑贵公子)
看板Programming
标题Re: [问题] 电玩模拟器是怎麽写出来的?
时间Mon Sep 1 05:36:47 2008
※ 引述《powerguy (小P)》之铭言:
: 这个问题让我好奇很久了,而且也不知道能去哪问
: 想来想去,我想还是这儿最适合吧,毕竟能写出模拟器的都是程式高手.....
: 我想过
: 方法1:厂商有公布or流出电玩的spec.
: 听说当年GBA模拟器能那麽快写出来,就是规格外泄
: 但那些规格未知的电玩模拟器是怎麽写的?
有种东西叫做示波器, 它可以探测讯号
有种东西叫做三用电表, 它的好处我举例不完
硬体高手可以藉着这两种基本工具和其他测试工具
画出大概的图或是 spec.
举例:
破解光碟保护不挑片的破解晶片就是这样来的
: 方法2:拆解硬体,然後写出模拟器
: 觉得这方法根本是天方夜谭 = =
拆解硬体是一样要的
: 方法3:软体逆向工程
: 例如藉由厂商公布电玩支援的指令集、API....等
: 然後分析这些指令、API对应到的机码,藉此写出模拟器
: 不过这方法是我乱想到的,不知道可行吗?
: 请乡民补充,还有有错请更正
: 谢谢 <(_ _)>
基本上, 经由 1, 2 的步骤就可以得知大致上的规格 (CPU/讯号 ... 等)
如果不知道, 换找一个硬体工程师来帮你检测
而 CPU 的指令码资料, 要弄到不是难事, 大部分资料网路上都有
没有的话, 最好可以找到有在 "游戏开发产商" 内部工作的人
因为他们都会有 "整包的开发工具"
等到这些都完备後, 基本上, 就可以开始写模拟器
* 程式撰写人员基本都要有侦错能力和组合语言实作能力
如果有机械语言撰写编排能力更好
因为你接下来要面对资料档都是这些玩意
1.请把游戏片上的 ROM 全部当成 "资料档"
即使要模拟 "使用 x86 系列 CPU 的 WSC" 也一样
也请把模拟器的角色当成是一个 DEBUG
按照该 CPU 的指令解码流程, 解析 ROM 档後的相关结果 (暂存器/旗标)
和计算该指令的对应时序和目前执行指令的时序
以上都可存放在各个自订变数
时序太少的 (CPU 较慢), 可以用延迟指令补足
时序太多的 (CPU 较快), 可以在画面处理处补足 (Skip Frames)
或是想办法最佳化自己程式码
2.等到 1 完成後, 再来就要处理最难搞的 "I/O 中断"
因为每个平台主机都有自己的独特 I/O 和中断处理方式
即使该平台主机用的 CPU 一样
这时候就要搭配硬体人员画出来的规格书
哪种讯号会送到哪边去处理...等等 (这部份是大工程)
3.可以跟 2 同步进行, 这部份要做的是自家电脑的 "绘图/音效/输入/档案" 处理
输入初期都会以键盘为主, 等到完成度差不多了, 才会考虑支援摇杆或是 GamePad
绘图方面, 先求画面正确, 再求其他优化的演算法
音效方面, 先求声音正确, 再求其他优化 (爆音/环绕...等) 演算法
档案方面, 以档案处理为主, 即使是光碟, 一样会先拷贝到硬碟处理
等完成度差不多了, 才会撰写其光碟驱动程式, 或是用 Mount 的方式
不过我还没有碰到过需要写 Driver 的模拟器就是 :)
4.大量样本 ROM 的 Debug
这可以侦测出可能遗漏处理的中断或 I/O 处理
另外有些厂商会自行加入额外的晶片 (ex. SFC)
要正确执行 ROM, 支援该种额外晶片是一定要的
这通常都要 CRC/MD5 检测确认是不是该 ROM 档
大致上就是如此, 先说到这, 说个大概就好, 真要写相关细节, 可以出书了 :D
--
私が生存への道は
今も未来も唯一つ
私自身の闇黑のためだ
即ち「ハ・ル・ヒ」
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.133.168.73
1F:→ Lordaeron:基本上只靠哪样应该是不全可行的 125.232.133.9 09/01 05:47
2F:→ Lordaeron:因为SFC 的几颗特殊的chips 到现在都还 125.232.133.9 09/01 05:47
3F:→ Lordaeron:没有任何的完整方案 125.232.133.9 09/01 05:48
4F:→ Lordaeron:例如SFC的DSP3 有partial但无完整方案125.232.133.110 09/01 07:03
5F:→ Lordaeron:而ZNES的team也有出个少少的奖金希望能125.232.133.110 09/01 07:04
6F:→ Lordaeron:找到解决方案125.232.133.110 09/01 07:04