1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > NES模拟器[H_NES]

NES模拟器[H_NES]

时间:2020-10-14 14:06:56

相关推荐

NES模拟器[H_NES]

NES模拟器[H_NES]

特性实例地址实例用法硬件连接食用方法如果想移植核心代码到自己的硬件上运行运行的一些照片

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

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

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

特性

多制式支持(NTSC PAL )

拥有存档,加载存档功能

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

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

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

APU模拟的一些改动

5.1.APU的硬件缺陷修复,实机的API三角波通道的相位是无法控制的,这会造成使用三角波通道是可能会出现爆音问题(劈里啪啦声),例如《淘金者》的标题界面就有明显的爆音现象,但这在H_NES上不会出现。

5.2.DMC模拟去掉了8Bit的读取缓冲区,使得样本数据读操作提前被进行。

实例地址

链接: /H0x9DEFA478/H_NES

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

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

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

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

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

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

实例用法

硬件连接

串口

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

音频输出

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

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

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

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

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

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

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

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

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

食用方法

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

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

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

打开STlinkUtility或者STM32CubeProgrammer,加载下载算法,把前面生成的.bin文件下载到0x90040000中

然后就和烧录程序一样,只需要注意地址为0x90040000即可

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

打开 Example\STM32H750VB_NES 下载程序

下载程序时注意下载算法的配置

打开 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为底层接口实现(这个文件比较混乱),可以作为移植的例子

运行的一些照片

保密画质(设备太拉)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。