使用开源SNES模拟器代码将rom文件转换为自包含的可执行游戏

时间:2010-06-14 01:08:27

标签: executable emulation rom

是否可以从SNES模拟器(或任何其他游戏系统模拟器)获取源代码和系统的游戏ROM,并以某种方式创建一个单独的自包含可执行文件,让您可以播放该特定的ROM不需要单独的ROM或模拟器本身播放?假设您已经获得了rom和模拟器源代码,那会难吗?

2 个答案:

答案 0 :(得分:3)

如果您拥有模拟器源代码,那应该不会太困难。您可以使用通常用于在c源文件中存储图像的方法。

基本上,您需要做的是在头文件中创建一个char *变量,并将rom文件的内容存储在该变量中。您可能希望编写一个脚本来为您自动执行此操作。

然后,您需要更改源代码,以便不使用文件读取rom,而是使用内存版本的rom,存储在变量中并包含在头文件中。

如果您需要模拟文件指针等,可能需要一些工作,或者您可能很幸运并发现rom加载函数只是立即加载整个文件。在这种情况下,它可能就像用函数替换文件加载函数以返回指针一样简单。

但是,请注意许可问题。如果模拟器是根据GPL许可的,则可能无法合法地允许您在可执行文件中存储专有文件,因此值得检查,特别是在您发布/分发之前(如果您打算这样做)。

答案 1 :(得分:1)

是的,超过可能,多次完成。谷歌:静态二进制翻译。格雷厄姆·托尔(Graham Toal)有一篇关于这个主题的好文章,应该在点击的早期出现。可能有一些代码我可能已经留下了一些代码。

完全删除rom可能比你想象的要多一些,但不能使用模拟器,绝对可能。实际上,这两个要求都是可能的,您可能会惊讶于有多少掌上游戏机或机顶盒游戏被翻译而未被模仿。像任天堂那样的Esp平台,没有足够的处理能力来实时模拟。

您需要一个好的模拟器作为参考和/或编写您自己的模拟器作为参考。然后你需要编写一个反汇编程序,然后你有反汇编程序生成C代码(请不要尝试直接转换到另一个目标,我犯了一次错误,C是可移植的,编译器会处理大量的死代码消除您)。所以make相信指令集的指令可能是:

add r0,r0,#2

这可能会转化为:

//add r0,r0,#2
r0=r0+2;
do_zflag(r0);
do_nflag(r0);

看起来SNES与6502有关,这就是小行星所使用的,这是我一直在努力的翻译,现在作为一种爱好。您正在使用的仿真器可能已针对运行时性能进行编写和调整,并且最多可能难以用作参考并使用已转换的代码检查锁定步骤。 6502很不错,因为与z80相比,确实没有那么多指令。与任何可变字长指令集一样,反汇编程序是您的第一个大障碍。不要线性思考,想想执行顺序,像模拟器一样思考,你不能将指令从零到N或N线性转换为零。您必须遵循所有可能的执行路径,将rom中的字节标记为指令的第一个字节,而不是指令的第一个字节。您可以将某些字节解码为数据,如果选择标记,则假设所有其他字节都是数据或填充。弄清楚如何处理这些数据以摆脱rom是摆脱rom的问题。有些代码直接解决其他人使用寄存器间接含义的意思,在翻译时您不知道数据的位置或数据的大小。一旦你标记了指令的所有起始字节,那么将rom从0转换为N进行拆解和/或翻译是一项微不足道的任务。

祝你好运,享受,非常值得体验。