NES模拟器[H_NES]

1 篇文章 1 订阅

最近一直在NESdev里翻山越岭,搞出了一个NES模拟器

虽然NESdev资料全,但它一点都不适合用来学习,更适合用来查阅,我能成功写出这个模拟器很大程度上得益于https://www.jianshu.com/nb/44676155能更好的理解PPU

这个模拟器的代码全部由C编写,想移植到哪就移植到哪

特性

  1. 多制式支持(NTSC PAL )

  2. 拥有存档,加载存档功能

  3. 较为深入的模拟精度(PPU每渲染8个像素就执行CPU运算)

  4. 较高精度的音频输出,由于APU的一些特性,输出的音频样本要达到1.79MHz(NTSC制式下的CPU频率)才能完美模拟输出的音频波形。

但实际上很难找到那么高采样率的DAC,H_NES将渲染音频的采样率只有CPU频率的1/4(即使是这样,也只对某些分频(APU配置)下的高频信号有影响),300多KHz。实际输出还需要对些样本等间隔抽样(H_NES有个配置项可以配置)

  1. APU模拟的一些改动

5.1.APU的硬件缺陷修复,实机的API三角波通道的相位是无法控制的,这会造成使用三角波通道是可能会出现爆音问题(劈里啪啦声),例如《淘金者》的标题界面就有明显的爆音现象,但这在H_NES上不会出现。
5.2.DMC模拟去掉了8Bit的读取缓冲区,使得样本数据读操作提前被进行。

实例地址

链接: https://gitee.com/H0x9DEFA478/H_NES

提供了一个在STM32H750VBT上运行的实例,得益于其优秀的性能,H_NES得以全速运行(60FPS,开启音频渲染,CPU占用率基本在80%以下,如果游戏ROM在SRAM中的话能更快)

  1. 通过串口输出运行信息和传入手柄按键信息

  2. 提供一个串口上位机,发送按键信息(目前仅支持1P),显示单片机发来的信息。

  3. SPI串口屏显示,ST7789v的240x320的屏幕。极限满屏刷新达70+FPS(在80MHz下的SCK频率) ,完全可达NES渲染需要。

  4. SAI输出IIS音频信号,接入解码芯片即可出声

由于想快速测试,写得比较匆忙,SAI输出的是标准44100Hz的音频,但H_NES的音频采样率分频只能是整数(使用了10分频) 这会造成速度略微有些差别,但这可以微调PLL得到修正

实例用法

硬件连接

  1. 串口

PA9,PA10------------------串口

  1. 音频输出

PE11,PE12,PE13,PE14-------SAI2(至于怎么连CubeMX点一下就知道了)

  1. 显示屏(ST7789v 240x320) 有些模组把CS阉割掉了(接地),但CS对同步主时钟有帮助,即使受到干扰,但干扰不会传递到下一帧(下一次CS选通)。对于高帧率应用,CS线很有必要

PB3-----------------------SPI1_SCK (最好串个100R电阻)

PD7-----------------------SPI1_MOSI (最好串个100R电阻)

PD6-----------------------RES

PD5-----------------------DC

PA15----------------------CS

PB4-----------------------背光

  1. SPIFlash(存游戏必备) 建议W25q128jvsiq的(128以下的,速度能133MHz的) 如果是256的,读取时会多花若干个时钟来传递地址(我才不会说我的下载算法没有支持这个)

PB2-----------------------Flash1_SCK,Flash2_SCK

PE7-----------------------Flash2_IO0

PE8-----------------------Flash2_IO1

PE9-----------------------Flash2_IO2

PE10----------------------Flash2_IO3

PD11----------------------Flash1_IO0

PD12----------------------Flash1_IO1

PE2-----------------------Flash1_IO2

PD13----------------------Flash1_IO3

PB6-----------------------Flash1_CS,Flash2_CS

双Flash, 速度更快。这个实例将以120MHz的时钟访问Flash

食用方法

  1. 预先将Example\Bootloader下的文件下载到H750的内部Flash中

  2. 想玩的游戏通过Example\多文件合并.exe 合并成一个.bin文件(其实就是加了文件大小,便于搜索,实际上H_NES只识别数组)

  3. Example\STlinkUtility下载算法\ 下的文件复制到 STlinkUtility或者STM32CubeProgrammer安装目录下的ExternalLoader文件夹中

  4. 打开STlinkUtility或者STM32CubeProgrammer,加载下载算法,把前面生成的.bin文件下载到0x90040000中
    在这里插入图片描述
    然后就和烧录程序一样,只需要注意地址为0x90040000即可

  5. Example\MDK下载算法\ 下的文件放置到 MDK安装目录\ARM\Flash\ 中

  6. 打开 Example\STM32H750VB_NES 下载程序
    在这里插入图片描述
    下载程序时注意下载算法的配置

  7. 打开 Example\串口手柄\ 下的上位机,左下角的输入框是按键输入,W-上 A-左 S-下 D-右 K-B L-A

在这里插入图片描述

这是由我写的一个串口助手修改而来的上位机,左下角(图片中标为4)进入输入状态之后,就可以使用电脑键盘发送键值了,图片中1右边的按键发送保存存档指令,2旁边的按键发送加载存档命令,3下面的按键发送获取堆栈信息的指令,发送指令后单片机将返回堆栈状态,CPU占用率等信息。

发送: 空格FN-下一个游戏 空格FS-保存存档 空格FL-加载存档

如果想移植核心代码到自己的硬件上运行

如果想自己移植,Example\STM32H750VB_NES\Code\H_NES为NES相关的代码,移植时只提取其中的代码即可,其下的H_NES.h包含接口声明和注释,使用时仅需include其即可。H_NES\LL下有个配置头文件,用户可以按需配置,且H_NES\API下有个默认配置头文件,其中有各个配置选项的说明

Example\STM32H750VB_NES\Code\nes.c为底层接口实现(这个文件比较混乱),可以作为移植的例子

运行的一些照片

保密画质(设备太拉)
请添加图片描述

请添加图片描述

请添加图片描述

  • 27
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 28
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值