# nesemu
**Repository Path**: daxnet/nesemu
## Basic Information
- **Project Name**: nesemu
- **Description**: 任天堂8位红白机模拟器的C#实现
- **Primary Language**: C#
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 2
- **Forks**: 2
- **Created**: 2023-08-11
- **Last Updated**: 2026-01-05
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# nesemu
[](https://daxnet.visualstudio.com/nesemu/_build/latest?definitionId=12)
## 介绍
nesemu是一个用C#实现的任天堂8位红白机(Nintendo Entertainment System, NES)模拟器,其核心库基于.NET 8编写,支持跨平台。您可以建立一个可跨平台的应用程序(比如控制台应用程序、ASP.NET Core Web API应用程序等),然后引用nesemu核心类库,在Windows、MacOS、Linux平台下提供如下功能:
- NES卡带文件的读取(暂不支持iNES 2.0标准),获取卡带信息
- 模拟器的运行,包括CPU和PPU的执行,通过订阅事件的方式,获得由PPU完成渲染的位图信息
- 在模拟器运行过程中,获得CPU和PPU的各种状态指标
- 将从NES卡带文件中读出的二进制程序反编译成6502兼容的汇编语言指令
注意:主运行程序(NesEmu.Console.exe)基于.NET 8 Windows Forms开发,利用了MonoGame组件,使用DirectX渲染,因此它只能在Windows下运行。
## 界面截图
### 运行界面
(还支持很多游戏,不在此一一列举)
### 调试界面
(调试信息刷新太快,没人能看得清,所以,就是增加科技感而已)

## 已知/未决问题
- 暂只支持NROM和UxROM两种Mapper,后续会增加
- NRom Mapper游戏列表:https://nesdir.github.io/mapper0.html
- UxRom Mapper游戏列表:https://nesdir.github.io/mapper2.html
- 在少量游戏(比如《敲冰块》、《彩虹岛》)运行时会出错,或者出现不显示的情况,之后慢慢解决
- 暂时不支持金手指、游戏修改器等功能,后续会增加
- 暂时不支持声音,后续会增加
- 支持部分非XBOX手柄,(如8位堂M30手柄,通过控制器设置界面进行设置,能不能用看运气,后续会改进)
## 软件架构
NesEmu.Core核心库基本架构遵循NES的基本物理架构,大致可以用下图表示(图片来源:https://bugzmanov.github.io/nes_ebook/chapter_2.html ):

- CPU:(Central Processing Unit)NesEmu.Core支持[所有256个指令](https://www.nesdev.org/wiki/CPU_unofficial_opcodes),包含一部分[未公开指令](https://www.nesdev.org/undocumented_opcodes.txt),涵盖[13种内存寻址模式](https://www.nesdev.org/wiki/CPU_addressing_modes)
- PPU:(Picture Processing Unit)主要作用是根据CPU在运行时向PPU内存中发送的数据,从卡带的CHR ROM或RAM(如果CHR支持CHR数据写入的话)中获得图形信息,生成当前画面帧的图像数据,并通过NMI中断通知CPU,可以向PPU的内存中写入下一帧的数据
- Bus:主要负责各个组件之间的数据访问,物理上机器内存是一个独立的模块,但在nesemu中,内存被直接实现在Bus里,以减少不必要的C#类和额外的访问负担
- APU:(Audio Processing Unit)声音处理单元,暂未支持
- Cartridge:卡带,目前仅支持[iNES版本](https://www.nesdev.org/wiki/INES),[iNES 2.0](https://www.nesdev.org/wiki/NES_2.0)不支持
- Controller:控制器,目前仅支持键盘
## 源代码使用
需要安装.NET 8.0,使用Visual Studio 2022直接打开 `nesemu\nesemu.sln` 文件,将 `NesEmu.Console` 设置为启动项目,然后直接编译运行。
项目结构:
- NesEmu.Console:主运行程序,编译运行后即可启动模拟器
- NesEmu.ControlsNet:一个简单的封装了NesEmu.Core的Windows Forms控件库,可以直接在Windows Forms应用程序中使用NesEmu.Core运行游戏(基于.NET 8的Windows Forms应用程序)
- NesEmu.Core:nesemu的核心库,包括CPU、PPU、Bus等的定义和实现
- NesEmu.Snake:一个测试CPU常用指令的贪吃蛇小游戏,可以直接运行
- NesEmu.Tests:单元测试项目,包含了所有CPU指令的测试
## 使用说明
如无需使用源代码,可在“发行版”页面下载已编译版本,无需额外安装.NET,下载的编译版本是自完备的,可直接启动`NesEmu.Console.exe`进行体验。
启动`NesEmu.Console.exe`之后,可以从`File`菜单直接打开.NES文件,或者选择从某个目录打开。如果ROM文件都保存在同一个目录下的话,推荐使用从目录打开,这样可以浏览所有的文件属性,并可查看所有已经支持的游戏列表。
在第一次运行NesEmu.Console时,可以使用W、S、A、D控制上下左右方向,J、K分别对应任天堂游戏机手柄控制器的`B`和`A`键,B、N分别对应手柄的`Select`和`Start`按键。控制器按键可以通过游戏菜单进行设置:
鼠标点击任何一个按键映射,然后按下键盘或者游戏手柄上的按键即可设置,设置后,光标会移动到下一个按键映射,全部设置完成后,点击OK按钮,按键映射就会应用到游戏中。
### NesEmu.Snake项目
这是一个测试CPU模拟完备程度的贪吃蛇小游戏,该项目的目录下包含了贪吃蛇游戏的6502汇编语言源程序代码`snake2.asm`,可以使用`tools\asm6f\asm6f_64.exe`编译器进行编译,编译后产生`snake2.bin`文件,将其改名为`snake2.nes`后,即可在NesEmu.Snake项目中打开。
打开后即可进行游戏,通过W、S、A、D控制方向,右侧可以看到调试信息。
## 参考文献
- https://www.nesdev.org/wiki/NES_reference_guide
- https://bugzmanov.github.io/nes_ebook/chapter_1.html
- https://github.com/GunshipPenguin/nescafe
- https://skilldrick.github.io/easy6502
- https://github.com/pjhades/tolarian-academy/blob/master/nes-ppu.md
### 使用的开源项目、框架
- MonoGame.Forms:https://github.com/BlizzCrafter/MonoGame.Forms
- FontStashSharp: https://github.com/FontStashSharp/FontStashSharp
- 图标库Fugue Icons:https://p.yusukekamiyamane.com/