色々いじってみて、実装方針が決まりました。和製MESSはマルチスレッドでないのがいいですね。以下のエミュレータの実装に関するメモを読みながら、オリジナルのソースコードを極力触らない方法を考えてみました。
http://homepage3.nifty.com/takeda-toshiya/memo.txt
結果、以下のファイルを作成するだけで、他のファイルは一切変更せずに動作します。
emu.h emu.cpp qtmain.cpp qt_screen.cpp qt_sound.cpp qt_input.cpp
WindowsとAndroidの移植性については、以下のヘッダを作成することで対応します。
windows.h
/* Skelton for retropc emulator Qt Version : tanam Date : 2013.05.18 - */ #ifndef _WINDOWS_H_ #define _WINDOWS_H_ #define _tfopen fopen #define __assume exit #define min(a, b) (((a) < (b)) ? (a) : (b)) #define max(a, b) (((a) > (b)) ? (a) : (b)) #endif
tchar.h
/* Skelton for retropc emulator Qt Version : tanam Date : 2013.05.18 - */ #ifndef _TCHAR_H_ #define _TCHAR_H_ #include <string.h> #include <stdlib.h> #define _TCHAR char #define _tcslen strlen #define _tcsncicmp strncmp #define _tcsicmp strcmp #define _tcscpy strcpy #define _stprintf sprintf #define _T(a) (a) #define __min(a, b) (((a) < (b)) ? (a) : (b)) #endif
まずは、Makefileを作成してみます。Qt4.8 for AndroidではMultimediaが使えないためサウンド機能は無効とします。
SC-3000.pro
#------------------------------------------------- # # Project created by QtCreator 2013-05-20T00:00:00 # #------------------------------------------------- android { QT += core gui DEFINES += _MAX_PATH=256 FPS=60 MAX_SKIP_FRAMES=4 INCLUDEPATH += include } else { QT += core gui multimedia DEFINES += FPS=60 MAX_SKIP_FRAMES=0 INCLUDEPATH += "C:\Program Files (x86)\Microsoft DirectX SDK (March 2009)\Include" LIBPATH += "C:\Program Files (x86)\Microsoft DirectX SDK (March 2009)\Lib\x86" LIBS += winmm.lib dsound.lib } TARGET = SC-3000 TEMPLATE = app INCLUDEPATH += src DEFINES += _SC3000 SOURCES += \ src/qtmain.cpp \ src/qt_input.cpp \ src/qt_screen.cpp \ src/qt_sound.cpp \ src/emu.cpp \ src/common.cpp \ src/config.cpp \ src/fileio.cpp \ src/vm/datarec.cpp \ src/vm/disk.cpp \ src/vm/event.cpp \ src/vm/i8251.cpp \ src/vm/i8255.cpp \ src/vm/io.cpp \ src/vm/sn76489an.cpp \ src/vm/tms9918a.cpp \ src/vm/upd765a.cpp \ src/vm/z80.cpp \ src/vm/sc3000/keyboard.cpp \ src/vm/sc3000/memory.cpp \ src/vm/sc3000/sc3000.cpp HEADERS += \ src/emu.h \ src/common.h \ src/config.h \ src/fifo.h \ src/fileio.h \ src/vm/datarec.h \ src/vm/device.h \ src/vm/disk.h \ src/vm/event.h \ src/vm/i8251.h \ src/vm/i8255.h \ src/vm/io.h \ src/vm/sn76489an.h \ src/vm/tms9918a.h \ src/vm/vm.h \ src/vm/z80.h \ src/vm/sc3000/keyboard.h \ src/vm/sc3000/memory.h \ src/vm/sc3000/sc3000.h \ src/res/resource.h FORMS += \ OTHER_FILES += \ android/AndroidManifest.xml \ android/res/drawable/icon.png \ android/res/drawable/logo.png \ android/res/drawable-hdpi/icon.png \ android/res/drawable-ldpi/icon.png \ android/res/drawable-mdpi/icon.png \ android/res/layout/splash.xml \ android/res/values/libs.xml \ android/res/values/strings.xml \ android/res/values-de/strings.xml \ android/res/values-el/strings.xml \ android/res/values-es/strings.xml \ android/res/values-et/strings.xml \ android/res/values-fa/strings.xml \ android/res/values-fr/strings.xml \ android/res/values-id/strings.xml \ android/res/values-it/strings.xml \ android/res/values-ja/strings.xml \ android/res/values-ms/strings.xml \ android/res/values-nb/strings.xml \ android/res/values-nl/strings.xml \ android/res/values-pl/strings.xml \ android/res/values-pt-rBR/strings.xml \ android/res/values-ro/strings.xml \ android/res/values-rs/strings.xml \ android/res/values-ru/strings.xml \ android/res/values-zh-rCN/strings.xml \ android/res/values-zh-rTW/strings.xml \ android/src/org/kde/necessitas/ministro/IMinistro.aidl \ android/src/org/kde/necessitas/ministro/IMinistroCallback.aidl \ android/src/org/kde/necessitas/origo/QtActivity.java \ android/src/org/kde/necessitas/origo/QtApplication.java \ android/version.xml RESOURCES += \
そしてmain()ですが、これだけすっきり書けました。
qtmain.cpp
/* Skelton for retropc emulator Qt Version : tanam Date : 2013.05.18 - */ #include "emu.h" int main(int argc, char **argv) { // qt init QApplication app(argc, argv); // load config load_config(); // create window EMU* emu; emu=new EMU(); emu->show(); emu->resize(emu->get_window_width(config.window_mode), emu->get_window_height(config.window_mode)); // main loop return app.exec(); }