#仿真器 #6502 #no-std

no-std yamos6502

MOS 6502 仿真器

5 个版本

0.1.4 2023年12月30日
0.1.3 2023年8月25日
0.1.2 2023年6月3日
0.1.1 2023年3月5日
0.1.0 2023年3月5日

#24仿真器

42 每月下载量
用于 manzana-uno-emu

MIT 许可证

92KB
2K SLoC

MOS 6502 功能性仿真器

这是什么?

这个仿真器旨在与 no_std Rust 项目轻松集成,以便在没有操作系统的环境中运行。换句话说,它也应该很容易在 std 项目中使用,如下面的示例所示。对清晰的实现给予了极大的重视。在少数地方使用了一些位操作,以使代码无分支并希望提高性能。

仿真器包含一些单元测试(仍在进行中),并且最重要的是,它通过了 6502 功能性测试

这个仿真器力求按照比实际硬件和基于 6502 网络列表的仿真器(如 Perfect 6502)更严格的规范进行计算。简而言之,这不是硬件仿真器。

仿真算法相当简单

  • 获取操作码字节
  • 根据将操作码分解为操作位、地址模式和操作组来解码指令
  • 如果需要,计算有效地址
  • 仿真操作,更新状态
  • 调整程序计数器

话虽如此,没有仿真微架构层,例如

  • 精确到周期的仿真或周期计数,
  • (意外的)对“非文档化”指令的支持。这些指令会导致执行停滞,仿真器将在重置之前回滚到之前的指令并在任何后续调用时返回错误。
  • (意外的?)微架构副作用,例如(但不限于)
    1. 先写入旧值,再执行读-修改-写指令,
    2. 中断劫持。

堆栈下溢和上溢可能会设置为引发故障,仿真器将不会继续执行,直到重置。

不言而喻,物理层的故障也不会仿真 :)

用法

添加

yamos6502 = "0.1"

将以下内容添加到项目的 Cargo.toml 文件中。如果您打算不依赖于 std crate,这里提供相应的语法使用

yamos6502 = { version = "0.1", default_features = false }

示例

yamos6502e

Usage: yamos6502e [OPTIONS] <MEM_FILE_LIST>

Arguments:
  <MEM_FILE_LIST>
          Paths to the files to seed the memory with.
          Format is (path[:load_addr_hex_no_0x],)+, load addresses must increase, and the loaded files must not overlap.

Options:
      --rom-start <ROM_START>
          ROM start. Writes into ROM will cause an error.
          [default: 65535]
      --reset-pc <RESET_PC>
          Initial program counter
          [default: 1024]
      --exit-pc <EXIT_PC>
          Program counter at which exit
          [default: 13417]
      --stack-wraparound
          Allow stack wraparound
      --print-stats <PRINT_STATS>
          Print statistics after execution every `print_stats` instructions
          [default: 0]
      --pause-millis <PAUSE_MILLIS>
          Pause in milliseconds between executing instructions
      --dead-loop-iterations <DEAD_LOOP_ITERATIONS>
          Dead loop iterations before exit          
          [default: 65536]          
      --log <LOG>
          Logging level          
          [default: info]
          [possible values: info, debug, trace]

  -h, --help
          Print help (see a summary with '-h')
  -V, --version
          Print version

运行 6502 功能测试,每 15_000_000 指令打印一次统计数据

#
# Assuming https://github.com/Klaus2m5/6502_65C02_functional_tests is cloned one directory above:
# 
# `git clone https://github.com/Klaus2m5/6502_65C02_functional_tests ../6502_65C02_functional_tests
#
cargo run --example yamos6502e  \
    ../6502_65C02_functional_tests/bin_files/6502_functional_test.bin:0000 \
    --print-stats 15000000 \
    --reset-pc 0x400 \
    --exit-pc 0x3469 \
    --stack-wraparound \
    --dead-loop-iterations 16

使用 --release 构建会产生一个速度更快的模拟器,但会省略一些运行时检查。

模拟器

  1. 6502 功能测试
  2. 宽屏 NES
  3. 我的小 6502
  4. MCS6502
  5. 6502

硬件模拟器

  1. Visual 6502 Remix
  2. 完美 6502
  3. 怪物 6502
  4. Verilog 6502

编译器、汇编器

  1. ASM X
  2. CC65 和 CA65
  3. LLVM-MOS

文档、参考资料、RE

  1. 西部设计中心
  2. 6502 指令集
  3. 6502.org
  4. 解释 6502 溢出标志
  5. 快速二进制编码十进制加减法

无运行时依赖