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 模拟器
每月402次下载
用于tetanes-web
4MB
23K SLoC
TetaNES
📖 概要 - ✨ 功能 - 🌆 截图 - 🚀 开始使用 - 🛠️ 路线图 - ⚠️ 已知问题 - 💬 联系
概要
背景照片归功于:由Zsolt Palatinus在unsplash提供
TetaNES
是一个跨平台的模拟器,用于日本1983年和北美1986年发布的任天堂娱乐系统(NES),使用Rust和wgpu编写。它可以在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保存
- 屏幕截图
- 游戏录制和回放
- 音频录制
屏幕截图
入门指南
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
iNES 和 NES 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% |
控制
可以在按键绑定菜单中自定义按键绑定。以下是默认值。
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 build
或 cargo 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-MIT
或 LICENSE-APACHE
文件中查找副本。
贡献
虽然这是一个个人项目,但我欢迎任何贡献或建议。如果您想帮忙,请随时提交拉取请求!
联系方式
对于问题报告,请使用GitHub问题跟踪器。您也可以直接通过https://lukeworks.tech/contact/联系我。
致谢
实现受到了几个惊人的NES项目的启发,没有它们,我就无法理解或消化NES维基上的所有信息。
我还不能没有NES开发论坛上的那些了不起的人走到这一步NES Dev Forums
此外,向OneLoneCoder表示巨大的敬意,感谢他的NES和olcPixelGameEngine系列,因为这些在最近的重构中帮了很大忙。
依赖关系
~26–67MB
~1M SLoC