2009年2月15日星期日

FCEU 分析

作者: Sam(甄峰) sam_code@hotmail.com

Sam下载了fceu_0.96.tar.gz.
首先察看 Makefile.

这个Makefile包含makefile.base。将所有东西编译进去。因为是Linux版本,所以底层使用SDL.
所以Makefile将drivers/cli 中的sdl有关的内容全部编译进去。

主程序从 drivers/cli/sdl.c中开始。

大致看来,FCEU底层显示和声音基本都是使用SDL实现的。

Makefile中,有一项-DUNIXDSP。如果使用这一项,则直接使用OSS driver建立的device--/dev/dsp来播放声音。如果不使用这一项,则通过SDL播放。 SDL底层则可以适配到不同的音频设备上,如OSS, ALSA等。


代码解析:
在Fceu代码目录中,drivers/cli为Linux下实现Fceu的代码段。因为Fceu基于SDL实现,所以底层和SDL有很大关系。
代码起点放在: drivers/cli/sdl.c中。

SetDefaults(); 用来初始化一些设置,这些设置放在全局变量Settings中。

然后进入Fceu的主体:CLImain()

1.FCEUI_Initialize()
NES(FC)的分辨率为:256x224(NTSC) 或 256x239(PAL)

1.1 分配video buffer.
每个scanline有256+15 byte.
一共有最多240个scanline.
另外还有8 byte的alignment。 8byte的catch overflow
所以分配了 (256+16)x 240 + 8 + 8 字节的buffer,并设为128。

1.2 建立目录。
在 "HOME"目录下创建.fceultra 目录,并在其中创建5个目录。
例如: /home/sam/.fceultra/

1.3 load config 或建立config file.
查/home/sam/.fceultra/fceu.cfg文件,如果有,则提取其config,如果没有,则建立。


没有评论: