2011年04月04日


広告


SNES9X最新版をPSPに移植してみる

NP2 for PSPもまだまだいろいろと修正したいところがありますが、無性に別の何かをPSPに移植したくなってきた。
その移植過程を示すことで、ブログの記事が書けて、さらにいろいろとノウハウを伝えられるとよいかなと。

そんな訳で、せっかくだからsnes9xの最新版をPSPに移植してみることにした。

■なにをベースとするか

ベースとなるsnes9xはsnes9x-gtk revision 81にする。

現在公開されている最新のsnes9xはバージョン1.52であるが、
上記snes9x-gtkはバージョン1.53向け開発ツリーのスナップショットを取り込んでいる。

つまり1.52と(未完成の)1.53の間に位置するバージョンであり、現在使用できる最新のsnes9xと考えてよいだろう。

■まずはソースをよく眺める

早速ベースとする snes9x-1.52-src-gtk-81.tar.bz2 を展開し、中身をチェックする。

docsディレクトリには、porting.htmlというドキュメントがあった。これには、他のプラットフォームへ移植する場合のノウハウが記述されている。すばらしい。

i386ディレクトリには、i386向けのアセンブラコードが置かれている。PSPでこのディレクトリを使うことはないだろう。

gtkディレクトリには、X11/gtk向けのソースが入っている。これをPSPのベースにするには少々おおげさで面倒だ。

snes9x 1.52のソース snes9x-1.52-src.tar.bz2 を見てみると、gtkの他に、macosx、unix、win32というディレクトリが存在する。
それぞれMAC OS X用、gtkを用いないunix/X11用、Windows用のようだ。
各ディレクトリを見比べてみると、unixディレクトリが一番移植元としてシンプルでよさそうだ。他が数十のソースが含まれるのに対し、unixディレクトリのソースは unix.cpp と x11.cpp のみである。

ということで、1.52から1.52.81へunixディレクトリをコピーして使うことにする。ディレクトリ名はunixからpspに変更しておく。不要なgtk、i386ディレクトリについては削除しておく。
注意しておくことは、unixディレクトリ以下が1.52向けに書かれているのに対し、それ以外のファイルはすべて1.52.81向けに書かれていることである。
■ ./configure を実行してみる。

pspディレクトリ(もともとのディレクトリ名unixをpspに変更した)には、Makefileがない。unix向けソースにはありがちではあるが、./configure を実行してそのシステムにあったMakefile を生成する。

ひっそりぃの開発環境はUbuntu 10.10上にあるので、まずはUbuntu 10.10向けのMakefileを生成し、それを手作業でPSP向けに手直しすることにする。

Makefile生成後、pspディレクトリ以下でMakefile, docs, x11.cpp, unix.cpp以外の不要になったファイルは削除しておく。

生成されたMakefileを以下に示す。


#S9XZSNESFX=1
#S9XZSNESC4=1
#S9XDEBUGGER=1
#S9XNETPLAY=1
S9XZIP=1
S9XJMA=1

# Fairly good and special-char-safe descriptor of the os being built on.
OS = `uname -s -r -m|sed \"s/ /-/g\"|tr \"[A-Z]\" \"[a-z]\"|tr \"/()\" \"___\"`
BUILDDIR = .

OBJECTS = ../apu/apu.o ../apu/SNES_SPC.o ../apu/SNES_SPC_misc.o ../apu/SNES_SPC_state.o ../apu/SPC_DSP.o ../apu/SPC_Filter.o ../bsx.o ../cheats.o ../cheats2.o ../clip.o ../conffile.o ../controls.o ../cpu.o ../cpuexec.o ../cpuops.o ../crosshairs.o ../dma.o ../dsp.o ../dsp1.o ../dsp2.o ../dsp3.o ../dsp4.o ../gfx.o ../globals.o ../logger.o ../memmap.o ../movie.o ../obc1.o ../ppu.o ../reader.o ../sa1.o ../sa1cpu.o ../screenshot.o ../sdd1.o ../sdd1emu.o ../seta.o ../seta010.o ../seta011.o ../seta018.o ../snapshot.o ../snes9x.o ../spc7110.o ../srtc.o ../tile.o ../filter/2xsai.o ../filter/blit.o ../filter/epx.o ../filter/hq2x.o ../filter/snes_ntsc.o unix.o x11.o
DEFS = -DMITSHM -DCPU_SHUTDOWN -DSPC700_SHUTDOWN -DCORRECT_VRAM_READS

ifdef S9XZSNESFX
OBJECTS += ../i386/fxemu2.o ../i386/fxemu2b.o ../i386/fxemu2c.o ../i386/fxtable.o ../i386/sfxproc.o ../i386/zsnes.o
else
OBJECTS += ../fxinst.o ../fxemu.o
ifdef S9XDEBUGGER
OBJECTS += ../fxdbg.o
endif
endif

ifdef S9XZSNESC4
OBJECTS += ../i386/c4.o ../i386/zsnesc4.o ../c4.o
else
OBJECTS += ../c4.o ../c4emu.o
endif

ifdef S9XDEBUGGER
OBJECTS += ../debug.o
endif

ifdef S9XNETPLAY
OBJECTS += ../netplay.o ../server.o
endif

ifdef S9XZIP
OBJECTS += ../loadzip.o ../unzip/ioapi.o ../unzip/unzip.o
endif

ifdef S9XJMA
OBJECTS += ../jma/7zlzma.o ../jma/crc32.o ../jma/iiostrm.o ../jma/inbyte.o ../jma/jma.o ../jma/lzma.o ../jma/lzmadec.o ../jma/s9x-jma.o ../jma/winout.o
endif

CCC = g++
CC = gcc
NASM =
GASM = g++
INCLUDES = -I. -I.. -I../apu/ -I../unzip/ -I../jma/ -I../filter/

CCFLAGS = -O3 -fomit-frame-pointer -fno-exceptions -fno-rtti -pedantic -Wall -W -Wno-unused-parameter -DJOYSTICK_SUPPORT -DZLIB -DUNZIP_SUPPORT -DJMA_SUPPORT -DHAVE_LIBPNG -DHAVE_MKSTEMP -DHAVE_STRINGS_H -DHAVE_SYS_IOCTL_H -DHAVE_STDINT_H -DRIGHTSHIFT_IS_SAR -DUSE_THREADS $(DEFS)
CFLAGS = $(CCFLAGS)

.SUFFIXES: .o .cpp .c .cc .h .m .i .s .asm .obj

all: Makefile configure snes9x

Makefile: configure Makefile.in
@echo "Makefile is older than configure or in-file. Run configure or touch Makefile."
exit 1

configure: configure.ac
@echo "configure is older than in-file. Run autoconf or touch configure."
exit 1

snes9x: $(OBJECTS)
$(CCC) $(INCLUDES) -o $@ $(OBJECTS) -lm -lz -lpng -lSM -lICE -lX11 -lXext -lpthread

../jma/s9x-jma.o: ../jma/s9x-jma.cpp
$(CCC) $(INCLUDES) -c $(CCFLAGS) -fexceptions $*.cpp -o $@
../jma/7zlzma.o: ../jma/7zlzma.cpp
$(CCC) $(INCLUDES) -c $(CCFLAGS) -fexceptions $*.cpp -o $@
../jma/crc32.o: ../jma/crc32.cpp
$(CCC) $(INCLUDES) -c $(CCFLAGS) -fexceptions $*.cpp -o $@
../jma/iiostrm.o: ../jma/iiostrm.cpp
$(CCC) $(INCLUDES) -c $(CCFLAGS) -fexceptions $*.cpp -o $@
../jma/inbyte.o: ../jma/inbyte.cpp
$(CCC) $(INCLUDES) -c $(CCFLAGS) -fexceptions $*.cpp -o $@
../jma/jma.o: ../jma/jma.cpp
$(CCC) $(INCLUDES) -c $(CCFLAGS) -fexceptions $*.cpp -o $@
../jma/lzma.o: ../jma/lzma.cpp
$(CCC) $(INCLUDES) -c $(CCFLAGS) -fexceptions $*.cpp -o $@
../jma/lzmadec.o: ../jma/lzmadec.cpp
$(CCC) $(INCLUDES) -c $(CCFLAGS) -fexceptions $*.cpp -o $@
../jma/winout.o: ../jma/winout.cpp
$(CCC) $(INCLUDES) -c $(CCFLAGS) -fexceptions $*.cpp -o $@

.cpp.o:
$(CCC) $(INCLUDES) -c $(CCFLAGS) $*.cpp -o $@

.c.o:
$(CC) $(INCLUDES) -c $(CCFLAGS) $*.c -o $@

.cpp.S:
$(GASM) $(INCLUDES) -S $(CCFLAGS) $*.cpp -o $@

.cpp.i:
$(GASM) $(INCLUDES) -E $(CCFLAGS) $*.cpp -o $@

.S.o:
$(GASM) $(INCLUDES) -c $(CCFLAGS) $*.S -o $@

.S.i:
$(GASM) $(INCLUDES) -c -E $(CCFLAGS) $*.S -o $@

.s.o:
@echo Compiling $*.s
sh-elf-as -little $*.s -o $@

.asm.o:
$(NASM) -f elf -DELF -DJOYSTICK_SUPPORT -DZLIB -DUNZIP_SUPPORT -DJMA_SUPPORT -DHAVE_LIBPNG -DHAVE_MKSTEMP -DHAVE_STRINGS_H -DHAVE_SYS_IOCTL_H -DHAVE_STDINT_H -DRIGHTSHIFT_IS_SAR -DUSE_THREADS -i../i386/ -o $@ $*.asm

.obj.o:
cp $*.obj $*.o

clean:
rm -f $(OBJECTS)


次回以降で、このMakefileをPSP用に手直しして、ごりごりコンパイルしていきます。




タグ:SNES9X PSP
posted by ひっそりぃ at 2011/04/04 22:45 | Comment(0) | TrackBack(0) | SNES9X for PSP | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:


この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。