armLinux NES模拟器移植

NES模拟器图像可以直接在嵌入式的framebuffer上绘制。Ubuntu中也可以使用framebuffer显示。在Ubuntu中如果要方便测试,用SDL更好。

InfoNES097JRC1.zip

InfoNES 音频部分需要alsa相关的组件

对于alsa-utils可以直接通过 apt-get install alsa-utils 进行安装

对于 alsa-lib,用命令 apt-get install libasound2-dev安装

也可以*载下**源码进行移植alsalib。

如果不使用音频,清空掉 InfoNES_System_Linux.cpp 中Sound有关的函数。

void InfoNES_SoundInit( void )
{   
}
int InfoNES_SoundOpen( int samples_per_sync, int sample_rate )
{
    return 1;
}
void InfoNES_SoundClose( void )
{
}
void InfoNES_SoundOutput( int samples, BYTE *wave1, BYTE *wave2, BYTE *wave3, BYTE *wave4, BYTE *wave5 )
{
}

去掉音频头文件包含及变量声明

-- #include <alsa/asoundlib.h>
-- static snd_pcm_t *playback_handle;

Makefile去掉动态库的链接 -lasound .

NES项目配置

上面*载下**nes代码,作者已经完成了下面三个部分的修改,所以直接进入 arm-NES-linux-master/linux_fb 目录下执行 make 命令就能直接编译了。

增加键盘输入

略,这部分使用event实现,比较简单,只需要关心摇杆按键的映射。

Framebuffer初始化修改

在Ubuntu中,屏幕实际尺寸并不等于每行像素的长宽,有填充字节,这里需要注意一下。

否则画面会错位。可以通过 FBIOGET_FSCREENINFO 获取到一行所占字节宽度。

修改偏色问题

模拟器支持的颜色模式为RGB555.所以需要按照自己的屏幕颜色进项转换,常见的是RGB565与RGB8888.

Framebuffer光标闪烁问题

切换tty到图形模式即可。

InfoNES_Wait()函数修改

InfoNES_Wait() 增加如下内容,否则在Ubuntu中可能出现画面速率过快。不是很明白为什么要sleep(0);

void InfoNES_Wait()
{
    static int wLines = 0;
    wLines++;
    if (wLines < lcd_height)
    {
        return;
    }
    wLines = 0;
    sleep(0);
}

接下来就在linux目录下执行

make

命令,等待编译结束就可以在当前目录下看到一个叫 InfoNES 的软件,这就是编译好的模拟器。

将*载下**好的《魂斗罗.nes》放到指定目录,然后运行程序

./InfoNES /root/game/hdl.nes

armLinuxNES模拟器移植