Qt 4.8 和製MESS その2

色々いじってみて、実装方針が決まりました。和製MESSはマルチスレッドでないのがいいですね。以下のエミュレータの実装に関するメモを読みながら、オリジナルのソースコードを極力触らない方法を考えてみました。

http://homepage3.nifty.com/takeda-toshiya/memo.txt

結果、以下のファイルを作成するだけで、他のファイルは一切変更せずに動作します。

emu.h
emu.cpp
qtmain.cpp
qt_screen.cpp
qt_sound.cpp
qt_input.cpp

WindowsAndroidの移植性については、以下のヘッダを作成することで対応します。

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();
}