接上篇F1C100S玩游戏系列-FC红白机Nes模拟器(二)-移植正点原子的nes模拟器(ye781205的汇编核心),带声音,ARM转GNU汇编
和第一篇F1C100S玩游戏系列-FC红白机Nes模拟器(一)-移植InfoNes到BoloRTT工程,带Audio驱动,支持声音
现在第三篇,移植windows端最常见到的模拟器VirtuaNes,支持绝大部分的mapper了,可以说,我现在能找到的nes它都能正常运行!VirtuaNes是c++编写的,好在rtthread的启动linked文件对于c++也有支持。具体修改下面说。其实移植是在一年半以前了,但是一直没有发出来,是因为好像跑起来还有点bug,就是有时候会运行异常,没有找到具体原因。一拖再拖。想想还是发出来让大伙一起找好过自己摸索(逃。移植的是最新版本为0.97,先上链接https://github.com/VeiLiang/BoloRTT.git
---------------------------------------------------------------------------
然后接下来说说移植过程中遇到的坑
坑1:
如果你移植源码到rtthread的工程下,你会发现编译好,运行就会出问题,无法正常跑,,,这是因为VirtuaNes代码里面用到的char型,是有符号的。所以在makefile 或者说rtconfig.py中加入一个编译选项-fsigned-char
坑2:
对于有些指针是强转unsigned char* 到unsigned short或者unsigned int*的。如果unsigned char * 传入的地址不是4字节对齐的,那就崩了,因为没有加入非对齐访问。对于这种情况,我们可以把对应地方修改下,具体例子函数看inline WORD OP6502W( WORD addr )
还有一个坑是移植完成感觉特别卡慢的,,但时代久远,又没有做笔记,害。。。记起来再来这里说吧
----------------------------------------------------------------------------
说说rtthread如何加入c++的支持
1.在link脚本中加入以下代码,不然编译时候会报undefined
__exidx_start = .;
.ARM.exidx :
{
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
_sidata = .;
}
__exidx_end = .;
__rodata_start = .;
.rodata : { *(.rodata) *(.rodata.*) }
__rodata_end = .;
. = ALIGN(4);
.ctors :
{
PROVIDE(__ctors_start__ = .);
KEEP(*(SORT(.ctors.*)))
KEEP(*(.ctors))
KEEP (*(SORT(.init_array.*)))
KEEP (*(.init_array))
PROVIDE(__ctors_end__ = .);
}
. = ALIGN(4);
.dtors :
{
PROVIDE(__dtors_start__ = .);
KEEP(*(SORT(.dtors.*)))
KEEP(*(.dtors))
PROVIDE(__dtors_end__ = .);
}
. = ALIGN(4);
2.代码中加入:void *__dso_handle = 0
-------------------------------------------------------------
最后上图和视频,顺便预告一下第四篇,会用图中的小屏幕awtk做一个界面,发布时间未定。。。
离线
利害了,那里有详细教程?
离线
想问一下,这个NES游戏的模拟器原理是啥啊?我们能不能自己开发简单的NES游戏啊
离线