これからはキュートですかね。Necessitas(Qt for Android)入門を見ながら、何かやってみたいと思いました。
http://vivi.dyndns.org/tech/Qt/Necessitas.html
僕にとってはじめてのマイコンであるパピコンが、Androidで動いたらいいなと思っていました。SDL+Win32で書かれたオリジナルのPC-6001Vを、SDL+Qtで書きなおされたPC-6001VXをベースにいじりはじめてみます。
例によってSDLは以下から入手出来ます。
http://www.libsdl.org/tmp/android-project.zip
以下のフォルダ構成で解凍します。
+PC6001VX_1.01_src
PC6001VX.pro
+src
+src/SDL ←android-project.zipから上書きコピー
+src/png ←android-project.zipから上書きコピー
まずは、PC6001VX.proをQt Creatorで開きます。「Necessitas Qt 4.8.2 for Android armv5」でプロジェクトを構成します。以下のプロジェクトファイルを書いてみました。
http://eighttails.seesaa.net/article/305067428.html#more
PC6001VX_1.01_src.zip
#------------------------------------------------- # # Project created by QtCreator 2012-01-01T00:17:09 # #------------------------------------------------- QT += core gui network TARGET = PC6001VX TEMPLATE = app debug:DEFINES += DEBUG INCLUDEPATH += src/Qt src/Qt/qtsingleapplication src/SDL/include src/png win32:{ QTPLUGIN += qjpcodecs qico INCLUDEPATH += C:/mingw/include/SDL LIBS += -LC:/mingw/lib -Wl,-Bstatic $$system(sh sdl-config --static-libs) CONFIG += exceptions QMAKE_CXXFLAGS += $$system(sh sdl-config --cflags) QMAKE_LFLAGS += -static-libgcc RC_FILE = src/win32/PC6001VX.rc }else{ ###DEFINES += USESDLTHREAD USESDLCS USESDLSEMAPHORE USESDLTIMER ###QMAKE_CXXFLAGS += $$system(sdl-config --cflags) ###LIBS += $$system(sdl-config --libs) DEFINES += USESDLTHREAD USESDLCS USESDLSEMAPHORE USESDLTIMER SDL_ATOMIC_DISABLED LIBS += -lGLESv1_CM } SOURCES += \ src/breakpoint.cpp \ src/config.cpp \ src/cpum.cpp \ src/cpus.cpp \ src/d88.cpp \ src/debug.cpp \ src/device.cpp \ src/disk.cpp \ src/error.cpp \ src/graph.cpp \ src/ini.cpp \ src/intr.cpp \ src/io.cpp \ src/joystick.cpp \ src/keyboard.cpp \ src/memory.cpp \ src/movie.cpp \ src/p6t2.cpp \ src/pio.cpp \ src/psg.cpp \ src/replay.cpp \ src/schedule.cpp \ src/sound.cpp \ src/status.cpp \ src/tape.cpp \ src/vdg.cpp \ src/voice.cpp \ src/vsurface.cpp \ src/semaphore.cpp \ src/device/ay8910.cpp \ src/device/mc6847.cpp \ src/device/pd7752.cpp \ src/device/pd8255.cpp \ src/device/z80.cpp \ src/device/z80-dbg.cpp \ src/Qt/guiQt.cpp \ src/Qt/osdQt.cpp \ src/Qt/pc6001v.cpp \ src/Qt/configdialog.cpp \ src/Qt/colorbutton.cpp \ src/Qt/aboutdialog.cpp \ src/Qt/common.cpp \ src/Qt/console.cpp \ src/p6el.cpp \ src/p6vm.cpp \ src/SDL/osdSDL.cpp \ src/Qt/qtsingleapplication/qtlocalpeer.cpp \ src/Qt/qtsingleapplication/qtlockedfile.cpp \ src/Qt/qtsingleapplication/qtlockedfile_unix.cpp \ src/Qt/qtsingleapplication/qtlockedfile_win.cpp \ src/Qt/qtsingleapplication/qtsingleapplication.cpp \ src/Qt/qtsingleapplication/qtsinglecoreapplication.cpp \ src/thread.cpp \ $$files(src/SDL/src/*.c) \ $$files(src/SDL/src/audio/*.c) \ $$files(src/SDL/src/audio/android/*.c) \ $$files(src/SDL/src/audio/dummy/*.c) \ src/SDL/src/atomic/SDL_atomic.c \ src/SDL/src/atomic/SDL_spinlock.c \ $$files(src/SDL/src/core/android/*.cpp) \ $$files(src/SDL/src/cpuinfo/*.c) \ $$files(src/SDL/src/events/*.c) \ $$files(src/SDL/src/file/*.c) \ $$files(src/SDL/src/haptic/*.c) \ $$files(src/SDL/src/haptic/dummy/*.c) \ $$files(src/SDL/src/joystick/*.c) \ $$files(src/SDL/src/joystick/android/*.c) \ $$files(src/SDL/src/loadso/dlopen/*.c) \ $$files(src/SDL/src/power/*.c) \ $$files(src/SDL/src/render/*.c) \ $$files(src/SDL/src/render/software/*.c) \ $$files(src/SDL/src/render/opengl/*.c) \ $$files(src/SDL/src/render/opengles/*.c) \ $$files(src/SDL/src/stdlib/*.c) \ $$files(src/SDL/src/thread/*.c) \ $$files(src/SDL/src/thread/pthread/*.c) \ $$files(src/SDL/src/timer/*.c) \ $$files(src/SDL/src/timer/unix/*.c) \ $$files(src/SDL/src/video/*.c) \ $$files(src/SDL/src/video/android/*.c) \ src/png/pngwutil.c \ src/png/pngwtran.c \ src/png/pngwrite.c \ src/png/pngwio.c \ src/png/pngvcrd.c \ src/png/pngtrans.c \ src/png/pngset.c \ src/png/pngrutil.c \ src/png/pngrtran.c \ src/png/pngrio.c \ src/png/pngread.c \ src/png/pngpread.c \ src/png/pngmem.c \ src/png/pngget.c \ src/png/pnggccrd.c \ src/png/pngerror.c \ src/png/png.c HEADERS += \ src/breakpoint.h \ src/common.h \ src/config.h \ src/console.h \ src/cpum.h \ src/cpus.h \ src/d88.h \ src/debug.h \ src/device.h \ src/disk.h \ src/error.h \ src/graph.h \ src/ini.h \ src/intr.h \ src/io.h \ src/joystick.h \ src/keyboard.h \ src/keydef.h \ src/log.h \ src/memory.h \ src/movie.h \ src/osd.h \ src/p6device.h \ src/p6t2.h \ src/pc6001v.h \ src/pio.h \ src/psg.h \ src/replay.h \ src/schedule.h \ src/semaphore.h \ src/sound.h \ src/status.h \ src/tape.h \ src/thread.h \ src/typedef.h \ src/vdg.h \ src/voice.h \ src/vsurface.h \ src/device/ay8910.h \ src/device/mc6847.h \ src/device/pd7752.h \ src/device/pd8255.h \ src/device/z80.h \ src/device/z80-cdCB.h \ src/device/z80-cdED.h \ src/device/z80-cdXC.h \ src/device/z80-cdXX.h \ src/device/z80-code.h \ src/device/z80-tbl.h \ src/Qt/configdialog.h \ src/Qt/colorbutton.h \ src/Qt/aboutdialog.h \ src/event.h \ src/p6el.h \ src/p6vm.h \ src/Qt/qtsingleapplication/QtLockedFile \ src/Qt/qtsingleapplication/QtSingleApplication \ src/Qt/qtsingleapplication/qtlocalpeer.h \ src/Qt/qtsingleapplication/qtlockedfile.h \ src/Qt/qtsingleapplication/qtsingleapplication.h \ src/Qt/qtsingleapplication/qtsinglecoreapplication.h FORMS += \ src/Qt/configdialog.ui \ src/Qt/aboutdialog.ui OTHER_FILES += \ TODO.txt \ src/Qt/res/PC-6001.ico \ src/Qt/res/PC-6001mk2.ico \ src/Qt/res/PC-6001mk2SR.ico \ src/Qt/res/PC-6601.ico \ src/Qt/res/PC-6601SR.ico \ src/Qt/res/fonth12.png \ src/Qt/res/fontz12.png \ src/win32/PC6001VX.ico \ src/win32/PC6001VX.rc \ COPYING \ README.txt \ 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 += \ src/Qt/pc6001vx.qrc
ビルドしてみてエラーを消していきます。
osdSDL.cpp
#if SDL_VERSION_ATLEAST(2,0,0) static PCKEYsym VKTable[SDL_NUM_SCANCODES]; // SDLスキャンコード -> 仮想キーコード 変換テーブル #else ///static PCKEYsym VKTable[SDLK_LAST]; // SDLキーコード -> 仮想キーコード 変換テーブル static PCKEYsym VKTable[SDL_NUM_SCANCODES]; // SDLキーコード -> 仮想キーコード 変換テーブル #endif (省略) #if SDL_VERSION_ATLEAST(2,0,0) SDL_TimerID *pid = NULL; SDL_TimerID tid = SDL_AddTimer( interval, (SDL_TimerCallback)callback, param ); if( tid ){ pid = new SDL_TimerID; if( pid ) *pid = tid; } return (HTIMERID)pid; #else /// return (HTIMERID)SDL_AddTimer( interval, (SDL_NewTimerCallback)callback, param ); return (HTIMERID)SDL_AddTimer( interval, (SDL_TimerCallback)callback, param ); #endif (省略) #if SDL_VERSION_ATLEAST(2,0,0) event.type = SDL_FIRSTEVENT; #else /// event.type = SDL_NOEVENT; event.type = SDL_FIRSTEVENT; #endif
/* Enable OpenGL ES */ #define SDL_VIDEO_OPENGL_ES 1 #define SDL_VIDEO_RENDER_OGL_ES 1 /// #define SDL_VIDEO_RENDER_OGL_ES2 1 #define SDL_VIDEO_RENDER_OGL_ES2 0
いきなり起動してビビるのですが、これはNecessitasの完成度が高いのと、Qtの移植性が優れているだけで、肝心のSDL部分はコンパイルが通っただけです。まあ実機でDebuggerが使えるので地道にやっていきます。
※ 一連の手順は、PC6001VX 1.01ベースのものです。Qtのみで書き直された2.0aベースについては以下をご覧ください。