1. 前言
InfoNES 是一款经典的任天堂娱乐系统(NES)模拟器,旨在让用户在现代计算机上重温80年代和90年代初期的经典 NES 游戏。该模拟器提供了高度准确的 NES 硬件仿真,支持大多数 NES 游戏,并提供了一种真实的游戏体验。InfoNES 具有用户友好的界面和简单的操作,使得用户可以轻松加载并玩经典的 NES 游戏。无论是想要怀旧,还是想要尝试一些传统的游戏,InfoNES 都为用户提供了一个便捷的平台,让他们沉浸在这些标志性的8位游戏中,体验游戏历史的魅力。
2. 下载
下载启动器源码:https://github.com/nejidev/arm-NES-linux
3. 解压
4. 配置源码
源码的编译是在编译完成的 buildroot 文件系统下完成的,必须使能 alsa-lib 和 alsa-utils 才可以使用
1、新建一个work文件夹
2、进入到源码中的 linux 目录下
3、修改Makefile文件:vim Makefile
在 CCFLAGS 后面增加 alsa 的头文件目录(该目录在bulidroot/output那里例如)
在 LDFILGS 增加 alsa 的 lib 文件目录(和上面一样)
修改最上面的 CC 为 bulidroot 里面的 gcc
4、更改最后的 install 那里为前面建立的 work 目录
5、修改 linux/InfoNES_System_Linux.cpp 文件中的 static int lcd_fb_display_px 函数(调整 spi 屏幕的颜色):
修改为:
如果不改的话:
改了颜色就好一些:
6、声音实现
实现这个声音支持的前提是,板子上得有基于alsa框架的音频驱动且功能正常。否则以下这些实现里需要全部留空,不用实现。驱动不正常还没有留空运行游戏会直接卡死。
5. 编译
生成的文件在 work 文件夹下:
然后把这个 InfoNES 拷贝到开板上就可以了。
6. 运行
打开游戏
跑起来了!!
6、添加USB手柄支持
linux kernel 里面编译:
重新烧录内核后,插上游戏手柄:/dev/input 下出现了 js0 设备节点
设备节点出来了,但是游戏手柄按键按着没有反应!
写一个用户空间代码测试一下手柄键值:
编译:
拷贝到开发板上:
测试:
游戏手柄按键 | 读出的键值 |
---|---|
L1 | btn: number: 4, value: 1, time: 198640 |
btn: number: 4, value: 0, time: 198850 | |
L2 | btn: number: 6, value: 1, time: 221840 |
btn: number: 6, value: 0, time: 222000 | |
R1 | btn: number: 5, value: 1, time: 255670 |
btn: number: 5, value: 0, time: 255840 | |
R2 | btn: number: 7, value: 1, time: 257390 |
btn: number: 7, value: 0, time: 257470 | |
左方向键上 | axis number: 1, value: -32767, time: 51680 |
axis number: 1, value: 0, time: 51840 | |
左方向键下 | axis number: 1, value: 32767, time: 99770 |
axis number: 1, value: 0, time: 99900 | |
左方向键左 | axis number: 0, value: -32767, time: 132060 |
axis number: 0, value: 0, time: 132150 | |
左方向键右 | axis number: 0, value: 32767, time: 156420 |
axis number: 0, value: 0, time: 156510 | |
SELECT键 | btn: number: 8, value: 1, time: 312440 |
btn: number: 8, value: 0, time: 312600 | |
START键 | btn: number: 9, value: 1, time: 313560 |
btn: number: 9, value: 0, time: 313730 | |
右边数字键1 | btn: number: 0, value: 1, time: 460600 |
btn: number: 0, value: 0, time: 460770 | |
右边数字键2 | btn: number: 1, value: 1, time: 461560 |
btn: number: 1, value: 0, time: 461730 | |
右边数字键3 | btn: number: 2, value: 1, time: 463040 |
btn: number: 2, value: 0, time: 463200 | |
右边数字键4 | btn: number: 3, value: 1, time: 463790 |
btn: number: 3, value: 0, time: 463920 |
查看一下它的写法:
/linux/joypad_input.cpp
调试了一下:
按键是可以获得键值的!!
看了一下逻辑,是键值没有对上
改一下:/linux/joypad_input.cpp 文件的这个函数就可以适配我的游戏手柄了
Nice,手柄可以了!完成!
7、添加键盘支持
InfoNes 默认只支持具有专有驱动的游戏手柄和一种 USB 通用手柄,但是我们手头只有键盘,所以我们需要添加键盘相关的驱动代码。事实上你下载的代码已经添加了键盘功能,如果想要看看修改了啥,可以看下面。
这里需要修改 linux/joypad_input.cpp 文件,该文件就是用来配置执行游戏操作相关的代码。
添加引用、宏定义、以及全局变量(注意插入的键盘是 event 多少,修改 /dev/input/event0 )
接下来是添加键盘结构体,以及相关初始化、释放、获取值相关的代码。
这里我们重点看一下 KeyBoardGet() ,在 nes 游戏中我们只需要配置 8 个键就可以了,对应如下表所示:
代码如下:
最后我们来注册一下键盘,修改 int InitJoypadInput(void) 函数
修改完成后重新编译就可以用键盘来控制游戏了
8、参考
iMX6ULL应用移植 | 移植 infoNES 模拟器(重玩经典NES游戏)
https://whycan.com/t_5139.html#p52283
评论区