前段时间把以前上传到优酷上的视频搬到了B站上,里面包含一个用STM32F407单片机上移植Nes模拟器玩超级玛丽的视频。视频大概是下面这个样子的。当时一只手玩,另一只手拿着HTC安卓手机拍的,那时候还是安卓手机刚刚兴起,好像小米也才刚发布第一款手机。所以拍摄的效果并不好,仅仅用作自娱自乐而已。

前几天,有初学单片机的小朋友表示对此非常感兴趣。然后翻开当年在电子发烧友论坛上发的帖子,找到当时的代码。

img

初看了下代码,纯C写的,移植到STM32F4上是用到了它比较大的ROM空间,然后使用的是个TFT液晶显示(驱动代码是我以前就写好的),然后就是手动焊接的一个5个按键的手柄。 这样看来移植到别的平台应该也是轻而易举了?多年不玩硬件了,那就在Windows上试试呗。首先考虑的就是显示问题,使用什么作为界面呢?

  • Qt/MFC,Qt吧我不想去安装,MFC呢,我又嫌它太麻烦了,有点杀鸡用牛刀的感觉。
  • OpenGL/Direct3D, 模拟机render的图当作texture,然后渲染使用OpenGL/Direct3D渲染出来,Direct3D配置太麻烦了,遂抛弃! 转而又想,OGL的优势不就是使用GPU吗,我这图都是渲染好的,还去用OGL岂不是本末倒置了?看看其他的吧。
  • SDL, 没有使用过,但是之前好像在哪看过SDL显示解码视频做播放器来的,搜索之。SDL的简介中写道:目前SDL多用于开发游戏、模拟器、媒体播放器等多媒体应用领域。这不是正和我意么。那就选用它吧!

SDL用起来确实很方便,简单的添加了显示和键盘输入就完成了,还可以玩呢!

img

玩起来之后再去看看代码,因为之前使用的是STM32F407的片内ROM做为游戏数据保存区的,所以.nes是以二进制数组写在代码中的,这样的话想玩其他的游戏岂不是要换二进制数组?如果在单片机系统中,这是一个做法,另一个做法就是数据保存在SD卡里面,之前没有使用这种方式,一是因为使用的是最小系统板子,上面没有SD卡的卡槽,二是因为使用了SD卡那就需要把文件系统移植上去,这工作量又增大了不少。

但是现在是运行在系统之上,我们完全可以用读文件的方式得到游戏数据然后传给模拟器,这样就可以玩各种游戏了!当然,这个模拟器里面还有个很大的缺点就是没有音频!有兴趣的小伙伴可以研究下播放音频出来。

搜了下发现知乎专栏上有小伙伴把红白机完整的搞了一遍:从零开始的红白机模拟。有兴趣的可以去看看。我移植好的Windows上的程序可以在github上获取:https://github.com/bzhou830/NesEmulator。