#nes #emulator #wasm #memory-safety #save-load

bin+lib tetanes

使用wgpu编写的跨平台NES模拟器

5个版本 (breaking)

0.11.0 2024年6月12日
0.10.0 2024年5月16日
0.9.0 2023年10月31日
0.8.0 2022年6月20日
0.7.0 2020年5月15日

#17 in 模拟器

Download history 6/week @ 2024-04-21 5/week @ 2024-05-05 153/week @ 2024-05-12 27/week @ 2024-05-19 9/week @ 2024-05-26 6/week @ 2024-06-02 171/week @ 2024-06-09 15/week @ 2024-06-16 1/week @ 2024-06-23

每月402次下载
用于tetanes-web

MIT/Apache

4MB
23K SLoC

TetaNES

Build Status Doc Status Latest Version Downloads License

📖 概要 - ✨ 功能 - 🌆 截图 - 🚀 开始使用 - 🛠️ 路线图 - ⚠️ 已知问题 - 💬 联系

概要

TetaNES

背景照片归功于:由Zsolt Palatinusunsplash提供

TetaNES是一个跨平台的模拟器,用于日本1983年和北美1986年发布的任天堂娱乐系统(NES),使用Rustwgpu编写。它可以在Linux、macOS、Windows以及带有Web Assembly的网页浏览器上运行。

它最初是一个个人的好奇心,后来变成了一项热情的项目。它仍在积极开发中,不断添加新功能和改进。它是一个相当准确的模拟器,可以播放大多数NES游戏。

TetaNES还旨在展示如何在大型项目中使用Rust的性能、内存安全和无畏并发功能。本项目使用的功能包括复杂的枚举、特质、泛型、匹配、迭代器、通道和线程。

TetaNES还可以为网页编译!在您的浏览器中尝试一下!

功能

  • 在Linux、macOS、Windows和Web上运行。
  • tetanes-core中的独立模拟核心。
  • NTSC、PAL和Dendy模拟。
  • 使用tetanes-core时支持无头模式。
  • 像素化滤镜和NTSC滤镜。
  • 最多支持4名玩家,带有游戏手柄支持。
  • 使用鼠标支持Zapper(光枪)。
  • 支持iNES和NES 2.0 ROM头文件格式。
  • 支持14个映射器,涵盖约85%的授权游戏。
  • 游戏Genie代码。
  • 使用egui在运行时进行配置。
    • 增加/减少速度 & 快进
    • 视觉 & 即时回放
    • 保存 & 加载状态
    • 电池备份RAM保存
    • 屏幕截图
    • 游戏录制和回放
    • 音频录制

屏幕截图

Donkey Kong  Super Mario Bros. The Legend of Zelda  Metroid

入门指南

TetaNES运行于所有主流操作系统(Linux、macOS、Windows和网页)。当发布1.0.0版本时,将提供可安装的二进制文件,但在此期间,您可以使用随Rust一起安装的cargo进行安装。

安装

安装选项取决于您的操作系统、偏好和现有工具。

Linux

Ubuntu/Debian

在最新发布版Assets下提供了.deb软件包。下载后,您可以安装它及其所需的依赖项。例如:

sudo apt install ./tetanes-0.10.0-1-amd64.deb
其他发行版

在最新发布版Assets下提供了AppImage。只需下载并将其放置在您想要的位置。

还提供了在最新发布版Assets下的.tar.gz软件包。您可以将tetanes二进制文件放置在您的PATH中的任何位置。

以下依赖项需要安装

  • ALSA共享库
  • GTK3

例如:

apt install libasound2 libgtk-3-0 dnf install alsa-lib gtk3 pacman -Sy alsa-lib gtk3

macOS

应用程序包

最简单的方法是下载适用于您处理器的正确应用程序包。您可以在最新发布版Assets部分找到.dmg下载。

Homebrew

TetaNES还可以通过Homebrew进行安装。

brew install lukexor/formulae/tetanes

Windows

在最新发布版Assets下提供了Windows安装程序。

Cargo安装

您还可以使用随rustup一起安装的cargo进行构建和安装。

cargo install tetanes

这将安装最新发布的TetaNES二进制文件到您的cargo bin目录,该目录位于类Unix平台上的$HOME/.cargo/bin/或Windows上的%USERPROFILE%\.cargo\bin

或者,如果您已安装 cargo binstall

cargo binstall tetanes

这将尝试从最新的 发布版 中查找您平台的目标二进制文件,或从源代码安装,类似于上面所述。

用法

Usage: tetanes [OPTIONS] [PATH]

Arguments:
  [PATH]  The NES ROM to load or a directory containing `.nes` ROM files.
  [default: current directory]

Options:
      --rewind                     Enable rewinding
  -s, --silent                     Silence audio
  -f, --fullscreen                 Start fullscreen
  -4, --four-player <FOUR_PLAYER>  Set four player adapter. [default: 'disabled']
                                   [possible values: disabled, four-score, satellite]
  -z, --zapper                     Enable zapper gun
      --no-threaded                Disable multi-threaded
  -m, --ram-state <RAM_STATE>      Choose power-up RAM state. [default: "all-zeros"]
                                   [possible values: all-zeros, all-ones, random]
  -r, --region <REGION>            Choose default NES region. [default: "ntsc"]
                                   [possible values: ntsc, pal, dendy]
  -i, --save-slot <SAVE_SLOT>      Save slot. [default: 1]
      --no-load                    Don't load save state on start
      --no-save                    Don't auto save state or save on exit
  -x, --speed <SPEED>              Emulation speed. [default: 1.0]
  -g, --genie-code <GENIE_CODE>    Add Game Genie Code(s). e.g. `AATOZE`
                                   (Start Super Mario Bros. with 9 lives)
      --config <CONFIG>            Custom Config path
  -c, --clean                      "Default Config" (skip user config and previous
                                   save states)
  -d, --debug                      Start with debugger open
  -h, --help                       Print help
  -V, --version                    Print version

iNESNES 2.0 格式的 ROM 支持使用,尽管一些高级的 NES 2.0 功能可能尚未实现。

支持映射器

以下映射器的支持目前已在实现或开发中

# 名称 示例游戏 游戏数量1 游戏百分比1
000 NROM 炸弹人、大金刚、超级马里奥兄弟 ~247 ~10%
001 SxROM/MMC1B/C 超级马里奥、塞尔达传说、俄罗斯方块 ~680 ~28%
002 UxROM 鬼泣、魂斗罗、合金弹头 ~270 ~11%
003 CNROM 坦克大战、纸boy、管道梦 ~155 ~6%
004 TxROM/MMC3/MMC6 Kirby's Adventure、超级马里奥兄弟 2/3 ~599 ~24%
005 ExROM/MMC5 鬼泣 3、激光入侵 ~24 <0.01%
007 AxROM 战斗神龟、弹珠台 ~75 ~3%
009 PxROM/MMC2 拳击手!! 1 <0.01%
010 FxROM/MMC4 火焰纹章:暗黑龙与光之轨迹 3 <0.01%
011 Color Dreams 水晶矿洞、金属战士 34 ~1%
024 VRC6a 恶魔战士传说 1 <0.01%
026 VRC6b 魔导少年、Esper Dream 2 2 <0.01%
034 BNROM/NINA-001 致命之塔、不可能的任务 2 3 <0.01%
066 GxROM/MxROM 超级马里奥兄弟 + 鸭子射击 ~17 <0.01%
071 Camerica/Codemasters 火鹰、蜜蜂 52、MiG 29 - 苏联战斗机 ~15 <0.01%
155 SxROM/MMC1A 加油!!拉面男:杀戮战士 2 <0.01%
~2128 / 2447 ~87.0%
  1. 来源 镜像

控制

可以在按键绑定菜单中自定义按键绑定。以下是默认值。

NES 手柄

按钮 键盘(玩家 1) 键盘(玩家 2) 控制器
A Z N
B X M
A(涡轮) A
B(涡轮) S 西
开始 Q 8 开始
选择 W 9 选择
D-Pad 箭头键 IJKL D-Pad

控制器布局

使用与 SDL 兼容的映射: https://github.com/mdqinc/SDL_GameControllerDB?tab=readme-ov-file 但可以通过设置 SDL_GAMECONTROLLERCONFIG 来覆盖。

           Left Triggers                        Right Triggers
              _=====_                               _=====_
             / _____ \                             / _____ \
           +.-'_____'-.---------------------------.-'     '-.+
          /   |     |  '.                       .'            \
         / ___| /|\ |___ \                     /      (N)      \
        / |      |      | ;    _         _    ;                 ;  Action Pad
 D-Pad  | | <---   ---> | |  <:_|       |_:>  |  (W)       (E)  |  (South, East,
        | |___   |   ___| ;  Select    Start  ;                 ;   North, West)
        |\    | \|/ |    /  _              _   \      (S)      /|
        | \   |_____|  .','" "',        ,'" "', '.           .' |
        |  '-.______.-' / Left  \------/ Right \  '-._____.-'   |
        |              /\ Stick /      \ Stick /\               |
        |             /  '.___.'        '.___.'  \              |
        |            /                            \             |
         \          /                              \           /
          \________/                                \_________/

模拟器快捷键

动作 键盘 控制器
暂停 Esc 指南按钮
关于 TetaNES F1
配置菜单 Ctrl-P 或 F2
加载/打开 ROM Ctrl-O 或 F3
退出 Ctrl-Q
重置 Ctrl-R
电源循环 Ctrl-H
增加速度 25% = 右肩
减少速度 25% - 左肩
增加缩放 Shift-=
减少缩放 Shift--
增加 UI 缩放 Ctrl-=
减少 UI 缩放 Ctrl--
快进 2 倍 空格(按住)
设置保存状态槽(1-4) Ctrl-(1-4)
保存状态 Ctrl-S
加载状态 Ctrl-L
即时倒放 R(轻触)
视觉倒放 R(按住)
截图 F10
切换游戏记录 Shift-V
切换音频记录 Shift-R
切换音频 Ctrl-M
切换脉冲通道 1 Shift-1
切换脉冲通道 2 Shift-2
切换三角形通道 Shift-3
切换噪声通道 Shift-4
切换 DMC 通道 Shift-5
切换全屏 Ctrl-Enter
切换NTSC滤镜 Ctrl-N
切换CPU调试器 Shift-D
切换PPU调试器 Shift-P
切换APU调试器 Shift-A

当CPU调试器开启时

动作 键盘
单步执行CPU指令 C
单步跳过函数 O
跳出函数 Shift-O
单步执行扫描线 Shift-L
单步执行整个帧 Shift-F

当PPU调试器开启时

动作 键盘
向上移动调试扫描线1行 Ctrl-Up
向上移动调试扫描线10行 Ctrl-Shift-Up
向下移动调试扫描线1行 Ctrl-Down
向下移动调试扫描线10行 Ctrl-Shift-Down

其他映射可以在配置 -> - 键绑定菜单中找到并修改。

目录

TetaNES将文件存储在支持许多功能的位置,并且根据文件类型和操作系统而有所不同。

配置首选项

  • Linux: $HOME/.config
  • macOS: $HOME/Library/Application Support
  • Windows: %LOCALAPPDATA%\tetanes
  • Web: 目前不支持持久化配置首选项。

屏幕截图

  • Linux, macOS, & Windows: $HOME/Pictures
  • Web: 目前不支持保存截图。

回放录制

  • Linux, macOS, & Windows: $HOME/Documents
  • Web: 目前不支持保存录制。

音频录制

  • Linux, macOS, & Windows: $HOME/Music
  • Web: 目前不支持保存录制。

备用电池RAM、存档状态和日志

  • Linux: $HOME/.local/share/tetanes
  • macOS: $HOME/Library/Application Support/tetanes
  • Windows: %LOCALAPPDATA%\tetanes
  • Web: 目前不支持保存存档状态。

启动状态

原始NES硬件在开机时RAM中有半随机的内容,许多游戏利用这一点来初始化它们的随机数生成器(RNG)。默认情况下,TetaNES尊重原始硬件,并模拟随机的启动RAM状态。这在一些游戏中有所体现,如最终幻想河城大劫案不可能任务II等。如果不模拟这一点,这些游戏看起来将是确定性的,尽管它们并非如此。

如果您希望TetaNES提供完全确定性的模拟启动状态,您需要在配置菜单中更改ram_state设置,并触发电源循环或使用命令行中的-m/--ram_state标志。

构建/运行

要构建/运行 TetaNES,您需要一个编译器的夜间版本,并运行 cargo buildcargo build --release(如果您希望获得更好的帧率)。

要运行网络版本,您还需要安装 wasm32-unknown-unknown 目标和 trunk

rustup target add wasm32-unknown-unknown
trunk serve --release

可以使用 cargo test 运行单元和集成测试。还有一些测试 ROM 可以用来测试模拟器的各种功能。它们都位于 tetanes-core/tests_roms/ 目录中。

以运行游戏的方式运行它们。例如:

cargo run --release tetanes-core/test_roms/cpu/nestest.nes

功能标志

  • cycle-accurate - 启用周期精确模拟。更占用 CPU 资源,但支持更广泛的游戏,这些游戏需要精确的时间。禁用可能在低端机器上提高性能。默认启用。
  • profiling - 启用 puffin 性能分析。

故障排除

如果您在运行使用上述支持的 Mapper 列表之一的 ROM 时遇到错误,可能是 ROM 格式损坏或不兼容。如果您不确定哪些游戏使用哪些 Mapper,请参阅 http://bootgod.dyndns.org:7777/。尝试从不同来源下载相同游戏的其它版本有时可以解决问题。

如果您在尝试启动之前可以正常工作的游戏时遇到其他错误,请尝试从上述目录中删除任何已保存的状态,以确保问题不是由不兼容的保存状态文件引起的。

如果您遇到任何快捷键无法正常工作,请确保您的操作系统没有绑定覆盖它的快捷键。特别是 macOS 将许多东西绑定到了 Ctrl-* 上。

如果尚未创建问题,请使用 github 问题跟踪器 创建问题。一个良好的指南是

  • 遇到问题的游戏(例如 Super Mario Bros 3)。请勿包含任何下载链接或 ROM 附件。
  • 操作系统和版本(例如 Windows 7,macOS Mojave 10.14.6 等)
  • 错误发生时您正在做的事情
  • 错误描述和发生的情况
  • 任何截图或控制台输出
  • 任何相关错误或日志

在浏览器中使用网络版本时,还包括

  • 网络浏览器和版本(例如 Chrome 77.0.3865)

路线图

参见 ROADMAP.md

已知问题

参见 github 问题跟踪器

文档

除了 docs/ 目录中的大量信息外,我在开发期间还广泛参考了以下网站

许可

TetaNES 使用 MIT 或 Apache-2.0 许可证。请在根目录下的 LICENSE-MITLICENSE-APACHE 文件中查找副本。

贡献

虽然这是一个个人项目,但我欢迎任何贡献或建议。如果您想帮忙,请随时提交拉取请求!

联系方式

对于问题报告,请使用GitHub问题跟踪器。您也可以直接通过https://lukeworks.tech/contact/联系我。

致谢

实现受到了几个惊人的NES项目的启发,没有它们,我就无法理解或消化NES维基上的所有信息。

我还不能没有NES开发论坛上的那些了不起的人走到这一步NES Dev Forums

此外,向OneLoneCoder表示巨大的敬意,感谢他的NESolcPixelGameEngine系列,因为这些在最近的重构中帮了很大忙。

依赖关系

~26–67MB
~1M SLoC