一、infoNES 简介
infoNES 是一款轻量级、开源的 FC(NES)游戏机模拟器,核心目标是在资源受限的平台(如嵌入式设备、早期 PC)上实现 NES 游戏的流畅运行。其设计理念是 "简洁、高效、可移植",源码结构清晰、无复杂依赖,成为嵌入式开发者学习模拟器原理、移植复古游戏的经典范本。
InfoNES 的整体架构,从功能上看,InfoNES 由 五个核心子系统组成:
1️⃣ CPU:6502 模拟器
软件模拟 MOS 6502 CPU,每条指令严格按照 周期(cycle)执行 ,使用 K6502_Step() 执行指令,是 InfoNES 中 最耗时的部分之一。
2️⃣ PPU:图形渲染系统
软件模拟 NES 的 PPU(2C02), 原生分辨率256X240,以 扫描线(Scanline) 为单位渲染,通过InfoNES_DrawLine()生成一行像素数据。像素最终写入WorkFrame或 DoubleFrame。
3️⃣ APU:音频系统
软件模拟 NES 的 5 路音源:2 × Pulse、1 × Triangle、1 × Noise、1 × DPCM。通过音频输出接口:void InfoNES_SoundOutput(int samples, BYTE *wave1, BYTE *wave2, BYTE *wave3, BYTE *wave4, BYTE *wave5)输出PCM格式的音频数据。
4️⃣ Mapper:ROM 映射器(最容易出问题)
NES 游戏使用 Mapper 进行:PRG-ROM 切换、CHR-ROM 切换、IRQ 触发。不支持的 Mapper 会导致花屏 / 错图 / 死机。👉 这是"有的游戏正常,有的花屏"的根本原因。
5️⃣ 平台抽象层(移植关键)
InfoNES 把所有"与平台有关的东西"都留给你实现:
| 功能 | 需要你实现的接口 |
|---|---|
| 显示 | InfoNES_LoadFrame() |
| 扫描线输出 | InfoNES_LoadLine() |
| 输入 | InfoNES_PadState() |
| 声音 | InfoNES_SoundOutput() |
| 时间同步 | InfoNES_Wait() |
总结来讲, InfoNES 是一个轻量级、纯 C 实现的 NES 模拟器内核,适合移植到 STM32 等 MCU 平台。通过自行实现显示、输入、声音和时间同步接口,可以在资源受限的嵌入式系统上完整运行 NES 游戏。
二、移植前准备
1.源码下载
github:Page not found · GitHub
https://github.com/infoNES/infoNEScsdn:
【免费】 infoNES原生源码(方便移植到嵌入式设备上面)资源-CSDN下载
https://download.csdn.net/download/qq_34885669/92459127
2.添加源码到工程
(1)添加好头文件路径

(2)添加核心源码文件到工程
虽然infoNES的源码文件非常多,设置里面还包含很多的.cpp文件,但是不用担心,我们其实只要关注上面介绍的infoNES的 5大核心模块的源码文件就行,如图:


3.显示驱动
infoNES对显示驱动要求:
4.手柄驱动
STM32上使用HAL库驱动9针FC手柄实现游戏自由!-CSDN博客
https://blog.csdn.net/qq_34885669/article/details/155890282
