未完待续……更新至2013.10.20 - 20:26
温馨提示,本文中每个部分涉及到的工程包括源文件,都可以在本文的最后发现下载链接哟!
由于最近身体不适,移植进度有点慢了,前面的帖子不能再更新了,所以没办法,我们新开一贴继续研究。
续前篇:
https://bbs.eeworld.com.cn/thread-415692-1-1.html
有童鞋问了,神马是InfNES?
这是一款NES游戏模拟器,也就是任天堂的红白机,80后的童年……InfoNES可以很容易地被移植到各个平台,可以说各大开发论坛上都可见它的身影。
如果你是有关技术的老鸟,那不好意思你可能什么都学不到了,更可能会发现本文的诸多错误,阅读本文只会让你更多地浪费生命,对此我十分抱歉。
好吧,节目继续。
第四部分是让我们的程序在板子上运行起来
不得不说,这一部分才是最难最艰难的工作,以至于我们又得被学习很多知识了。
上回说,尽管成功编译通过了,可是根本没法运行,最重要的原因就是上文中的最后一步,我们“主观”上增大了内存容量……实际上如果在你们的板子上,内存足够的情况下,可能根本不需要增加,也不会出现最后一步的问题,也就是说——你们已经可以运行这个模拟器了!那么你可以暂且告别这一部分,直接跨越到下一个部分去。
然而对于大多数持有工控级学习(开发)板而又想跑模拟器的童鞋来说,InfoNES在RAM方面的胃口实在是太大太大。特别说明一下,我们这次以HANKER-LM4F232为例来讨论InfoNES的移植,这块板子的片上RAM有32K……所以就以这个数量作为我们的第一个目标——
目标1:RAM耗用量32K以内!
当然了,我们首先看看它现在吃掉了多少内存……
在工程空间里这样双击目标名(Target 1),
在编辑区打开的有关信息,我们来看最后面(Ctrl+End):
- Total RO Size (Code + RO Data) 150996 ( 147.46kB)
- Total RW Size (RW Data + ZI Data) 617336 ( 602.87kB)
- Total ROM Size (Code + RO Data + RW Data) 151796 ( 148.24kB)
所以我们总的RAM占用量应当是中间那行……羊了个驼!怎么这么大?
好吧,我暂时也不清楚是否真的能完成这个任务,总之硬着头皮搞吧。602.87K->32K,恩,看起来似乎问题不大,呵呵呵呵……有一种技能叫做不折手断!看来真得敲代码敲到手断啊。
步骤一,仍然是刚才的有关信息,我们找到“Global Symbols”这一章节。以下列举了有关全局符号的信息,我可以简单的把全局符号解释成函数和全局变量么?
根据我们之前的内容,我们可以知道RAM是从0x20000000开始的,所以直接找到这里……
注意到其中有个24,那里就是占用的大小啦,我们顺势往下找找看,到底谁占的多?
- WorkFrame 0x20008c20 Data 122880 infones.o(.bss)
……这是谁家的代码,怎么这么吃RAM?
分析了代码以后得知,这个是绘图的缓冲区,是以一屏画面为单位的。因为NES的画面大小为256*240,每个点在这里用2个字节来表示,所以占用RAM为2*256*240=???再根据程序流程,每个画面的内容组织完毕,再统一调用
- /* Transfer the contents of work frame on the screen */
- void
- InfoNES_LoadFrame()
- {
- }
这样把画面描绘在屏幕上。
InfoNES在工作时,实际上是以行为单位的,每个工作周期描画画面的一行,并执行这一行时间内的程序。整个画面执行的行数为262(大概这个数吧,记不太清了,如有错误请各位指出哈,不过这里应当暂不影响移植),其中240行是描绘出真实像素点的。我们大可以把工作过程改为,每画完一行,就调用InfoNES_LoadLine()来描画这一行像素到屏幕上。这样,这122880Byte的RAM就可以缩减到2*256=512Byte,岂不是很美……
同样滴,变更要有可移植性。另外在代码中发现InfoNES是支持双缓冲绘图的(有点理解不能啊童鞋们……),既然这样,我们把这个地方统一成一个设置显示描画的方式吧(双缓、单缓、单行)。
增加我们的设置内容
/*-------------------------------------------------------------------*/
- /* Config */
- /*-------------------------------------------------------------------*/
- #define WORKFRAME_DOUBLE 2
- #define WORKFRAME_SINGLE 1
- #define WORKFRAME_NONE 0
- #define WORKFRAME_DEFINE WORKFRAME_NONE
-
- #define APU_NONE
具体代码变更详见1楼回复。
变更之后再编译看看,RAM用量是不是少了不少呀?
- Total RW Size (RW Data + ZI Data) 494968 ( 483.37kB)
接下来比较大的RAM占用还有谁呢?
- Map85_Chr_Ram 0x20035ae0 Data 262144 infones_mapper.o(.bss)
像这种大小是无论如何也不行的,所以我们暂时把Mapper85从我们的程序中取缔吧……
方法就是:
在InfoNES_Mapper.cpp中注掉如下的两行:
- // #include "mapper/InfoNES_Mapper_085.cpp"
以后每次想取缔某个mapper,就使用这个办法就OK,所以之后我就不再赘述,直接说取缔那个mapper啦。
值得一提的是,之后我们需要整理更具体的资源,所以相关代码的位置我会重新整理,然后上传成整理资源后的工程,大家可以参考调整。
之后再看还有谁吃掉的RAM比较大?
- RAM 0x200009cc Data 8192 infones.o(.bss)
- SRAM 0x200029cc Data 8192 infones.o(.bss)
- PPURAM 0x200049cc Data 16384 infones.o(.bss)
- PPUBANK 0x200089cc Data 64 infones.o(.bss)
- SPRRAM 0x20008a0c Data 256 infones.o(.bss)
- PPU_ScanTable 0x20008b0c Data 263 infones.o(.bss)
- WorkLine 0x20008c14 Data 512 infones.o(.bss)
- ChrBuf 0x20008e14 Data 32768 infones.o(.bss)
- PalTable 0x20010e14 Data 64 infones.o(.bss)
- NesHeader 0x20010e54 Data 16 infones.o(.bss)
- DRAM 0x20010e64 Data 40960 infones_mapper.o(.bss)
- Map5_Wram 0x2001ae64 Data 65536 infones_mapper.o(.bss)
- Map5_Ex_Ram 0x2002ae64 Data 1024 infones_mapper.o(.bss)
- Map5_Ex_Vram 0x2002b264 Data 1024 infones_mapper.o(.bss)
- Map5_Ex_Nam 0x2002b664 Data 1024 infones_mapper.o(.bss)
- Map5_Chr_Reg 0x2002ba64 Data 16 infones_mapper.o(.bss)
- Map6_Chr_Ram 0x2002ba74 Data 32768 infones_mapper.o(.bss)
- Map18_Regs 0x20033a74 Data 11 infones_mapper.o(.bss)
- Map19_Chr_Ram 0x20033a7f Data 8192 infones_mapper.o(.bss)
- Map21_Regs 0x20035a7f Data 10 infones_mapper.o(.bss)
- Map23_Regs 0x20035a89 Data 9 infones_mapper.o(.bss)
- Map25_VBank 0x20035a92 Data 16 infones_mapper.o(.bss)
- Map45_P 0x20035aa4 Data 16 infones_mapper.o(.bss)
- Map45_C 0x20035ab4 Data 32 infones_mapper.o(.bss)
- Map185_Dummy_Chr_Rom 0x20035ad4 Data 1024 infones_mapper.o(.bss)
- Map187_Chr 0x20035ed4 Data 32 infones_mapper.o(.bss)
- Map188_Dummy 0x20035ef4 Data 8192 infones_mapper.o(.bss)
- Map251_Reg 0x20037ef4 Data 11 infones_mapper.o(.bss)
- Map252_Reg 0x20037eff Data 9 infones_mapper.o(.bss)
看看这些啊……都这么大~情不自禁地我就想说:那几个大的mapper取缔了吧!
从上面捋,它们怎么办?
欲知后文请继续围观。
[
本帖最后由 sjtitr 于 2013-10-21 07:17 编辑 ]