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

4

我想制作一个街机游戏机用于娱乐,类似于这个。我想知道是否可能从某些游戏(例如超级马里奥)中获取事件。假设我完成了一个关卡并想要获得该事件及其得分和其他数据,并对那些数据执行一些操作。我想在Windows上运行模拟器。有人尝试过这样的事情吗?是否有不太困难的方法可以从旧的NES游戏中获取事件和数据?也许我应该不运行Windows,而是运行一些Linux?好的,请分享您对如何完成软件部分的想法。

3个回答

6

现代模拟器(例如FCEUX)使得通过Lua脚本(请参见示例视频)与正在运行的ROM进行交互成为可能。使用此API,您可以编写一个Lua脚本来:

  1. 监视特定的内存位置
  2. 等待其保持某些特殊值(例如level_just_finished)
  3. 从内存中读取当前分数
  4. 对分数进行操作
为了知道要检查哪些内存位置,您需要反汇编ROM或通过调试器运行ROM,或两者兼备。至于超级马里奥兄弟游戏,已经有一份注释过的反汇编代码可用。FCEUX模拟器还具有内置的调试器/反汇编器,您可以使用它。
所有这些都需要大量的努力,并且您需要了解Lua、6502汇编和NES的内部工作原理。对于您的街机游戏机,您最好只使用像UberNES这样的模拟器,它可以自动追踪您的高分,适用于许多热门游戏。

2

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

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

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


0

IRQ...中断请求,触发中断...我在某个地方读过/看过相关代码...即使是x86也使用IRQ与各种设备进行通信,一个简单的例子:键盘,当按下键时,调用PIC并生成IRQ,系统知道哪个键被按下,并且NES中也使用相同的机制。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接