PC6001V for IS01 その1

ところでQtの実行速度が、SDLより遅い気がします。今度は本家PC6001VをベースにGUIの部分を取り除いて、Androidに移植したいと思いました。

#ようするに、Qt CreatorでQtベースではなく、EclipseSDLをベースにビルドし直します。

http://www.papicom.net/p6v/

例によってSDLのサイトから、android-project.zipをダウンロードして解凍します。

http://www.libsdl.org/tmp/android-project.zip

プロジェクトは以下のフォルダ構成で解凍します。

android-project/jni/SDL/
android-project/jni/png/

以下はnecessitas/Android/Qt/482/armeabiよりフォルダをコピー

android-project/jni/external/include/
android-project/jni/external/lib/

以下はPC6001Vよりフォルダをコピー

android-project/jni/src/

以下のファイルはPC6001VXより上書きコピー

android-project/jni/src/SDL/osdSDL.cpp
android-project/jni/src/Qt/osdQt.cpp
android-project/jni/src/Qt/guiQt.cpp
android-project/jni/src/Qt/common.cpp
android-project/jni/src/Qt/console.cpp

以下のファイルを修正します。

android-project\src\org\libsdl.app\SDLActivity.java

    // Load the .so
    static {
        System.loadLibrary("SDL");
///        System.loadLibrary("SDL_image");
///        System.loadLibrary("mikmod");
///        System.loadLibrary("SDL_mixer");
///        System.loadLibrary("SDL_ttf");
        System.loadLibrary("QtCore");
        System.loadLibrary("QtGui");
        System.loadLibrary("main");
    }

APIレベル4なのでOpenGLESv2は利用出来ません。

android-project\jni\SDL\Android.mk

###LOCAL_LDLIBS := -ldl -lGLESv1_CM -lGLESv2 -llog
LOCAL_LDLIBS := -ldl -lGLESv1_CM -llog -lz

android-project\jni\SDL\include\SDL_config_android.h

///#define SDL_VIDEO_RENDER_OGL_ES2	1
#define SDL_VIDEO_RENDER_OGL_ES2	0

android-project\default.properties

# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
# 
# This file must be checked in Version Control Systems.
# 
# To customize properties used by the Ant build system use,
# "build.properties", and override values to adapt the script to your
# project structure.

# Project target.
#target=android-7
target=android-4

android-project\localproperties

# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
# 
# This file must *NOT* be checked in Version Control Systems,
# as it contains information specific to your local configuration.

# location of the SDK. This is only used by Ant
# For customization when using a Version Control System, please read the
# header note.
#sdk.dir=/Users/hercules/eclipse/android-sdk-mac_86
sdk.dir=C:\\android-sdk-windows\\sdk

画面の向き、SDカードへの書き込みなどを設定します。

android-project\AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="org.libsdl.app"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:label="@string/app_name" android:icon="@drawable/icon" android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" android:debuggable="true">
        <activity android:name="SDLActivity"
                  android:label="@string/app_name" android:screenOrientation="landscape">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
<uses-sdk android:minSdkVersion="4" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
</manifest> 

Application.mk

APP_PLATFORM := android-4
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := QtCore
LOCAL_SRC_FILES := ../external/lib/libQtCore.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := QtGui
LOCAL_SRC_FILES := ../external/lib/libQtGui.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE := main

SDL_PATH := ../SDL

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../external/include \
	$(LOCAL_PATH)/../external/include/QtCore \
	$(LOCAL_PATH)/../external/include/QtGui \
	$(LOCAL_PATH)/$(SDL_PATH)/include \
	$(LOCAL_PATH)/../png

# Add any compilation flags for your project here...
LOCAL_CFLAGS := \
	-DUSESDLTHREAD -DUSESDLCS -DUSESDLSEMAPHORE -DMAX_PATH=256
	

# Add your application source files here...
LOCAL_SRC_FILES := $(SDL_PATH)/src/main/android/SDL_android_main.cpp \
    breakpoint.cpp \
    config.cpp \
    cpum.cpp \
    cpus.cpp \
    d88.cpp \
    debug.cpp \
    device.cpp \
    disk.cpp \
    error.cpp \
    graph.cpp \
    ini.cpp \
    intr.cpp \
    io.cpp \
    joystick.cpp \
    keyboard.cpp \
    memory.cpp \
    movie.cpp \
    p6t2.cpp \
    pio.cpp \
    psg.cpp \
    replay.cpp \
    schedule.cpp \
    sound.cpp \
    status.cpp \
    tape.cpp \
    vdg.cpp \
    voice.cpp \
    vsurface.cpp \
    device/ay8910.cpp \
    device/mc6847.cpp \
    device/pd7752.cpp \
    device/pd8255.cpp \
    device/z80-dbg.cpp \
    device/z80.cpp \
    p6el.cpp \
    p6vm.cpp \
    semaphore.cpp \
    thread.cpp \
    SDL/osdSDL.cpp \
    Qt/osdQt.cpp \
    Qt/guiQt.cpp \
    Qt/common.cpp \
    Qt/console.cpp \
    pc6001v.cpp

LOCAL_SHARED_LIBRARIES := SDL QtCore QtGui

LOCAL_STATIC_LIBRARIES := png

LOCAL_LDLIBS := -lGLESv1_CM -llog -lz

include $(BUILD_SHARED_LIBRARY)

ビルドしてみてエラーを消していきます。

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

設定ファイルパス取得関数名を全て変えます。

osdQt.cpp

guiQt.cpp

const char *OSD_GetConfigPath();

const char *OSD_GetModulePath();

osdQt.cpp

const char *OSD_GetModulePath( void )
{
    PRINTD( OSD_LOG, "[OSD][OSD_GetModulePath]\n" );
    static char mpath[PATH_MAX] = "";	// モジュールパス取得用

    //Windowsの場合はexe本体と同じ場所。
    //それ以外(UNIX系を想定)は ~/.pc6001vx を返す
#ifdef WIN32
    QString confPath = qApp->applicationDirPath() + QDir::separator();
#else
    QString confPath = QDir::homePath() + QDir::separator() + QString(".pc6001vx");
#endif
    sprintf( mpath, "%s", confPath.toUtf8().data() );
    AddDelimiter( mpath );	// 念のため
    UnDelimiter( mpath );
    return mpath;
}

(省略)

#ifdef WIN32
    QString confPath = qApp->applicationDirPath() + QDir::separator();
#else
///    QString confPath = QDir::homePath() + QDir::separator() + QString(".pc6001vx");
    QString confPath = QString("/sdcard");
#endif

guiQt.cpp

/// #include "configdialog.h"
/// #include "aboutdialog.h"

(省略)

    case ID_VERSION:		// バージョン情報
///        AboutDialog dialog(cfg);
///        dialog.exec();
        break;
    }

(省略)

/*    ConfigDialog dialog(ecfg);
    dialog.exec();
    int ret = dialog.result();
    // OKボタンが押されたならINIファイル書込み
    if( ret == QDialog::Accepted) ecfg->Write();

    delete ecfg;
    ecfg = NULL;

    return ret; */
    return -1;

pc6001v.cpp

	// 二重起動禁止
///	if( OSD_IsWorking() ) return false;

これでビルドは通りますが、実行すると画面が真っ暗です。原因究明しないと、、、