#emulator #ppu #game #mapper #rom #sprite #cycle

无std koute/nes

用Rust编写的NES模拟器

1个不稳定版本

使用旧的Rust 2015

0.1.0 2016年10月23日

#1186 in Rust模式

738 stars & 23 watchers

285KB
6.5K SLoC

Build Status

Pinky

Pinky是一个完全从头开始用Rust编写的NES模拟器,仅基于公开可用的文档

您可以在您的Web浏览器中运行它

功能

  • 相对准确的(周期准确)6502、PPU和APU模拟。
  • 基于测试ROM的测试套件。
  • 从真实PPU的晶体管级模拟自动生成的PPU测试套件。
  • 支持NROM (0)、MMC1 (1)、UxROM (2)、AxROM (7) 和 UNROM 512 (30) 映射器。
  • 可以作为libretro核心编译。
  • 可以编译成WebAssembly。

还有一些东西仍然缺失,包括

  • 大多数非官方的6502指令。
  • 对其他映射器的支持。
  • 准确的PPU精灵溢出。
  • 保存状态支持。
  • PAL支持。

尽管如此,这个模拟器目前还不是生产质量(由于有限的映射器支持,它可以在它能够玩的游戏(例如超级马里奥兄弟、大金刚或俄罗斯方块;您可以通过nesmapper.txt了解哪些游戏使用哪些映射器)中表现得相当不错。

入门

该项目内部分为多个crate。

pinky-libretro 包含了此模拟器的libretro核心,这是运行它的预期方式。它应该与任何libretro前端兼容,但仅与 RetroArch 进行了测试。

要编译 libretro 内核,请进入 pinky-libretro 目录并输入

cargo build

这将在 target/debug 中构建一个共享对象,名称为 libpinky_libretro.so(在非 Linux 系统上,扩展名可能不同,例如在 Windows 上将是 .dll),然后您可以像这样与 RetroArch 一起使用

retroarch -L libpinky_libretro.so your_rom.nes

您还可以运行 cargo build --release 来构建一个优化得更好的版本(调试构建应在现代系统上以全速运行)。

pinky-devui 目录中还有一个简单的基于 SDL2 的前端;只需在命令行中传递游戏 ROM 的路径即可运行它。

nes-testsuite 包含了一个 NES ROM 的模拟器无关测试套件,只需实现一个特质即可轻松将其连接到任何其他模拟器(参见 nes/src/testsuite.rs)。

rp2c02-testsuite 包含了一个 PPU 测试套件,该套件是在 Visual2C02 的帮助下自动生成的,Visual2C02 是一个实际的 NES PPU 的晶体管级模拟器。

nes 包含了模拟器本身。mos6502 包含了 6502 解释器,这对于模拟基于 6502 的其他机器可能很有用。

已经有数百个 NES 模拟器了;为什么还需要另一个?

因为为什么不呢?编写游戏机模拟器是最有趣和最有回报的项目之一,没有什么能比得上在您自己编写的模拟器上击败您最喜欢的游戏的感受。

选择 NES 也是显而易见的 - 由于它有非常详细的文档,它是模拟起来最节省时间的控制台。

依赖关系

~310KB