# 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 [![Build status](https://daxnet.visualstudio.com/nesemu/_apis/build/status/nesemu-CI)](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下运行。 ## 界面截图 ### 运行界面 猪小弟  1944
PAC-MAN  90坦克
超级马里奥兄弟  恶魔城 (还支持很多游戏,不在此一一列举) ### 调试界面 (调试信息刷新太快,没人能看得清,所以,就是增加科技感而已) ![魂斗罗1代调试界面](res/dbg.png) ## 已知/未决问题 - 暂只支持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 ): ![NES架构图](res/image_3_nes_components.png) - 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时,可以使用WSAD控制上下左右方向,JK分别对应任天堂游戏机手柄控制器的`B`和`A`键,BN分别对应手柄的`Select`和`Start`按键。控制器按键可以通过游戏菜单进行设置: 打开目录窗口 鼠标点击任何一个按键映射,然后按下键盘或者游戏手柄上的按键即可设置,设置后,光标会移动到下一个按键映射,全部设置完成后,点击OK按钮,按键映射就会应用到游戏中。 ### NesEmu.Snake项目 这是一个测试CPU模拟完备程度的贪吃蛇小游戏,该项目的目录下包含了贪吃蛇游戏的6502汇编语言源程序代码`snake2.asm`,可以使用`tools\asm6f\asm6f_64.exe`编译器进行编译,编译后产生`snake2.bin`文件,将其改名为`snake2.nes`后,即可在NesEmu.Snake项目中打开。 打开后即可进行游戏,通过WSAD控制方向,右侧可以看到调试信息。 贪吃蛇游戏 ## 参考文献 - 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/