PC-6001VX for IS11T その1

これからはキュートですかね。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/SDLandroid-project.zipから上書きコピー

+src/pngandroid-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

SDL_config_android.h

/* 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が使えるので地道にやっていきます。

f:id:tanam:20130418234255p:image:w360f:id:tanam:20130418234313p:image:w360

※ 一連の手順は、PC6001VX 1.01ベースのものです。Qtのみで書き直された2.0aベースについては以下をご覧ください。

http://d.hatena.ne.jp/tanam/20130511/1368270352