与在模拟器中运行的NES游戏进行通信

时间:2011-07-26 08:59:31

标签: emulation

我正在考虑创建一个有趣的街机。像this one这样的东西。我想知道是否有可能从某些游戏获得事件,例如超级马里奥。假设我完成了一个级别,我希望通过得分和其他一些数据得到该事件,并对该数据执行一些操作。我正在考虑在Windows中运行模拟器。有没有人在做这样的事情?从旧的NES游戏获取事件和数据是否有太难的方法?可能是我应该运行不是Windows,而是一些Linux呢?好吧,请分享一下你如何做软件部分的想法。

3 个答案:

答案 0 :(得分:5)

FCEUX等现代模拟器可以通过Lua脚本(see example video)与正在运行的ROM进行交互。使用this API,您可以将Lua脚本写入:

  1. 监控某个内存位置
  2. 等待它保留一些特殊值(例如level_just_finished)
  3. 从内存中读出当前得分
  4. 用分数做点什么
  5. 为了知道要检查哪些内存位置,您需要反汇编ROM或通过调试器运行它,或者两者兼而有之。至于超级马里奥兄弟,已经有commented disassembly available。 FCEUX仿真器还有一个可以使用的内置调试器/反汇编器。

    所有这些都需要付出很多努力,你需要了解Lua,6502程序集以及NES的内部工作原理。对于您的街机机器,您可能最好只使用UberNES这样的模拟器,它可以自动track your highscore用于许多热门游戏。

答案 1 :(得分:2)

NES类游戏没有成就报告的标准钩子。我能想到的唯一选择如下:

  • 使用您自己的钩子(自定义模拟器可以处理)重建有问题的ROM。
  • 直接观察ROM内存占用情况,并持续解析状态,当您观察到某些已知状态时触发。

这两个选项都要求您真正了解NES ROM的内部结构。

答案 2 :(得分:0)

IRQ ...转到Interrupt_requests ..他们中断一个中断......我已经阅读/看到了某个地方的代码......甚至x86也使用IRQ与各种设备通信一个简单的例子:键盘当a按下键,调用ti PIC和IRQ生成,系统知道按下哪个键,并在NES中使用相同的机械