Qt 5.3.1をいじってみた

PC6001VXのAndroid版がリリースされました。試したところ、今までQTの問題であったQtMultimediaやFile Chooserの表示が、新しいQTでは改善されているようです。

f:id:tanam:20140816024331p:image:w360

まずは、武田さんの最新版ソースコードをベースに、makefileを書くところから始めます。QtMultimediaが使えるようになったため、AndroidでもSDLが不要となりスッキリしました。

http://takeda-toshiya.seesaa.net/article/397915031.html

PC6001.pro

#-------------------------------------------------
#
# Project created by QtCreator 2014-08-16T00:00:00
#
#-------------------------------------------------

QT += core gui widgets multimedia

DEFINES += _PC6001 FPS=60 MAX_SKIP_FRAMES=0

DEFINES -= UNICODE

TARGET = PC-6001

TEMPLATE = app

win32:{
INCLUDEPATH += src
LIBS += -lshlwapi
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/event.cpp \
    src/vm/i8255.cpp \
    src/vm/io.cpp \
    src/vm/mc6847.cpp \
    src/vm/pc6031.cpp \
    src/vm/pc80s31k.cpp \
    src/vm/upd765a.cpp \
    src/vm/ym2203.cpp \
    src/vm/mcs48.cpp \
    src/vm/z80.cpp \
    src/vm/datarec.cpp \
    src/vm/disk.cpp \
    src/vm/fmgen/file.cpp \
    src/vm/fmgen/fmgen.cpp \
    src/vm/fmgen/fmtimer.cpp \
    src/vm/fmgen/opna.cpp \
    src/vm/fmgen/psg.cpp \
    src/vm/pc6001/display.cpp \
    src/vm/pc6001/joystick.cpp \
    src/vm/pc6001/printer.cpp \
    src/vm/pc6001/memory.cpp \
    src/vm/pc6001/psub.cpp \
    src/vm/pc6001/sub.cpp \
    src/vm/pc6001/timer.cpp \
    src/vm/pc6001/pc6001.cpp
} else {
INCLUDEPATH += src include
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/event.cpp \
    src/vm/i8255.cpp \
    src/vm/io.cpp \
    src/vm/mc6847.cpp \
    src/vm/pc6031.cpp \
    src/vm/pc80s31k.cpp \
    src/vm/upd765a.cpp \
    src/vm/ym2203.cpp \
    src/vm/mcs48.cpp \
    src/vm/z80.cpp \
    src/vm/datarec.cpp \
    src/vm/disk.cpp \
    src/vm/fmgen/file.cpp \
    src/vm/fmgen/fmgen.cpp \
    src/vm/fmgen/fmtimer.cpp \
    src/vm/fmgen/opna.cpp \
    src/vm/fmgen/psg.cpp \
    src/vm/pc6001/display.cpp \
    src/vm/pc6001/joystick.cpp \
    src/vm/pc6001/printer.cpp \
    src/vm/pc6001/memory.cpp \
    src/vm/pc6001/psub.cpp \
    src/vm/pc6001/sub.cpp \
    src/vm/pc6001/timer.cpp \
    src/vm/pc6001/pc6001.cpp
}

HEADERS  += \
    src/emu.h \
    src/common.h \
    src/config.h \
    src/fifo.h \
    src/fileio.h \
    src/vm/device.h \
    src/vm/event.h \
    src/vm/i8255.h \
    src/vm/io.h \
    src/vm/mc6847.h \
    src/vm/vm.h \
    src/vm/ym2203.h \
    src/vm/z80.h \
    src/vm/fmgen/diag.h \
    src/vm/fmgen/file.h \
    src/vm/fmgen/fmgen.h \
    src/vm/fmgen/fmgeninl.h \
    src/vm/fmgen/fmtimer.h \
    src/vm/fmgen/headers.h \
    src/vm/fmgen/misc.h \
    src/vm/fmgen/opna.h \
    src/vm/fmgen/psg.h \
    src/vm/fmgen/types.h \
    src/vm/pc6001/display.h \
    src/vm/pc6001/joystick.h \
    src/vm/pc6001/printer.h \
    src/vm/pc6001/memory.h \
    src/vm/pc6001/psub.h \
    src/vm/pc6001/sub.h \
    src/vm/pc6001/timer.h \
    src/vm/pc6001/pc6001.h \
    src/res/resource.h

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

emu.cpp
emu.h
config.cpp
fileio.cpp
vm/fmgen/file.cpp
qt_input.cpp
qt_screen.cpp
qt_sound.cpp
qtmain.cpp

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

shlwapi.h

/*
	Skelton for retropc emulator

	QT Version : tanam
	Date   : 2014.08.16 -
*/

#ifndef _SHLWAPI_H_
#define _SHLWAPI_
void PathRemoveExtension(char* p){};
#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 _T(a) (a)
#define __min(a, b) (((a) < (b)) ? (a) : (b))
#define min(a, b) (((a) < (b)) ? (a) : (b))
#define max(a, b) (((a) > (b)) ? (a) : (b))
#define MAX_PATH 256
#define _MAX_PATH 256
#define GENERIC_WRITE			0
#define GENERIC_READ			0
#define ERROR_FILE_NOT_FOUND	0
#define ERROR_SHARING_VIOLATION	0
#define CREATE_NEW				0
#define CREATE_ALWAYS			0
#define OPEN_EXISTING			0
#define INVALID_HANDLE_VALUE	0
#define FILE_BEGIN				0
#define FILE_CURRENT			0
#define FILE_END				0
#define FILE_SHARE_READ			0
typedef void* HANDLE;
typedef char* LPCTSTR;
typedef unsigned long DWORD;
typedef int BOOL;
typedef unsigned char byte;
typedef unsigned int UINT32;
typedef unsigned short UINT16;
typedef unsigned char UINT8;
typedef int INT32;
typedef short INT16;
typedef char INT8;
#define __assume exit
#define _tfopen fopen
#define _tcsncpy strncpy
#define _tcsncat strncat
#define _tcslen strlen
#define _tcsncicmp strncmp
#define _tcsicmp strcmp
#define _tcscpy strcpy
#define _stprintf sprintf

#endif

windows.h

/*
	Skelton for retropc emulator

	QT Version : tanam
	Date   : 2013.05.18 -
*/

#ifndef _WINDOWS_H_
#define _WINDOWS_H_

#define __stdcall
#define VK_SPACE     0x20
#define VK_LEFT      0x25
#define VK_RIGHT     0x27
#define VK_DOWN      0x28
#define VK_UP        0x26
#define VK_RETURN    0x0d
#define VK_SHIFT     0x10
#define VK_CONTROL   0x11
#define VK_F9        0x78
#define FALSE           0
#define TRUE            1
#endif