Hasty Briefsbeta

双语

Cycle-accurate 6502 emulator as coroutine in Rust

4 months ago
  • #rust
  • #coroutines
  • #emulation
  • 简单的CPU模拟器通常使用循环配合switch语句来解释操作码,从而抽象掉时序细节。
  • 时序抽象可能导致具有时序敏感组件的系统(如NES的CPU和PPU)出现同步问题。
  • 解决方案是将CPU实现为可单周期步进的状态机,确保精确同步。
  • 本项目演示了使用Rust协程定义CPU模拟语义,并将其编译为状态机,实现与PPU的锁步执行。
  • CPU状态包括寄存器和I/O数据总线,协程通过yield产生读写I/O事件。
  • `fetch!`和`write!`等宏处理I/O事件,简化了指令语义的实现。
  • 示例代码展示了CPU和PPU的锁步运行,CPU每3个周期步进一次以匹配PPU时钟频率。
  • 性能表现良好,在现代硬件上模拟器运行速度达470MHz,远超NES原生的1.79MHz需求。
  • 项目通过Harte和Klaus测试套件进行了全面验证以确保正确性。
  • 基于Rust nightly版本构建,可能因编译器更新而不稳定,但可在1.93.0-nightly版本上运行。