#MAKEFLAGS_CXX="-g -O2 -DNDEBUG"
#MAKEFLAGS_CC="-g -O2 -DNDEBUG"
-BUILD_TYPE="Relwithdebinfo"
+#BUILD_TYPE="Relwithdebinfo"
+BUILD_TYPE="Release"
CMAKE_APPENDFLAG=""
export WINEDEBUG="-all"
#if [ -e ./buildvars.dat ] ; then
# . ./buildvars.dat
#fi
-#MAKEFLAGS_CXX="-g -O3 -ftree-vectorize -flto -DNDEBUG"
-#MAKEFLAGS_CC="-g -O3 -ftree-vectorize -flto -DNDEBUG"
+MAKEFLAGS_CXX="-O3 -DNDEBUG"
+MAKEFLAGS_CC="-O3 -DNDEBUG"
+
# To use MOC, please enable wine as interpreter of EXEs , below:
# $ sudo update-binfmts --install Win32_Wine /usr/bin/wine --extension exe .
MAKEFLAGS_GENERAL="-j4"
-#CMAKE_LINKFLAG="-DCMAKE_EXE_LINKER_FLAGS='${CMAKE_EXE_LINKER_FLAGS} -flto -O3 -ftree-vectorize -g'"
-#CMAKE_LINKFLAG=""
+#CMAKE_LINKFLAG="-DCMAKE_EXE_LINKER_FLAGS='${CMAKE_EXE_LINKER_FLAGS}' "
+CMAKE_LINKFLAG=""
#CMAKE_APPENDFLAG="-DCMAKE_AR=/usr/bin/gcc-ar -DCMAKE_NM=/usr/bin/gcc-nm -DCMAKE_RANLIB=/usr/bin/gcc-ranlib"
case ${BUILD_TYPE} in
${CMAKE_FLAGS1} \
"${CMAKE_FLAGS2}=${MAKEFLAGS_CXX}" \
"${CMAKE_FLAGS3}=${MAKEFLAGS_CC}" \
- "-D USE_SDL2=OFF" \
+ "-D USE_SDL2=ON" \
${CMAKE_APPENDFLAG} \
${CMAKE_LINKFLAG} \
.. | tee make.log
${CMAKE} ${CMAKE_FLAGS1} \
"${CMAKE_FLAGS2}=${MAKEFLAGS_CXX}" \
"${CMAKE_FLAGS3}=${MAKEFLAGS_CC}" \
- "-D USE_SDL2=OFF" \
+ "-D USE_SDL2=ON" \
${CMAKE_APPENDFLAG} \
${CMAKE_LINKFLAG} \
.. | tee -a make.log
make ${MAKEFLAGS_GENERAL} 2>&1 | tee -a ./make.log
case $? in
- 0 ) sudo cp ./qt/common/*.exe ../../bin-win32/ ;;
+ 0 ) cp ./qt/common/*.exe ../../bin-win32/ ;;
* ) exit $? ;;
esac
#include "agar_logger.h"
#endif
-#ifdef _USE_QT
-//# include <SDL/SDL.h>
+#if defined(_USE_QT)
#include <string>
#include <vector>
#include "fileio.h"
#include <windows.h>
#endif
+
#include <stdlib.h>
#include <stdio.h>
#include "common.h"
#define CONFIG_NAME "conf"
#endif
-#if defined(_USE_AGAR) || defined(_USE_QT)
+#if defined(_USE_QT)
bool WritePrivateProfileString(char *lpAppName, char *lpKeyName, char *Value, FILEIO *lpFileName)
{
std::string s;
{
std::string key;
char ibuf[4096 + 102];
- uint64_t i;
+ int64_t i;
int l_len;
int c = '\0';
std::string::size_type pos;
} else {
strncpy(str, defaultstr, max_len);
}
- printf("Got: %s\n", str);
+ AGAR_DebugLog(AGAR_LOG_DEBUG, "Got: %s\n", str);
}
} else {
i = strtol(s.c_str(), NULL, 10);
}
- printf("Got: %d\n", i);
+ AGAR_DebugLog(AGAR_LOG_DEBUG, "Got: %d\n", i);
return i;
}
for(int drv = 0; drv < MAX_FD; drv++) {
config.ignore_disk_crc[drv] = false;
}
-// for(i = 0; i <8; i++) config.fdd_hack_fast_transfer[i] = false;
#endif
#if defined(USE_SOUND_DEVICE_TYPE) && defined(SOUND_DEVICE_TYPE_DEFAULT)
config.sound_device_type = SOUND_DEVICE_TYPE_DEFAULT;
}
}
#endif
+
#ifdef USE_TAPE
GetPrivateProfileString(_T("RecentFiles"), _T("InitialTapeDir"), _T(""), config.initial_tape_dir, _MAX_PATH, config_path);
for(i = 0; i < MAX_HISTORY; i++) {
GetPrivateProfileString(_T("RecentFiles"), name, _T(""), config.recent_tape_path[i], _MAX_PATH, config_path);
}
#endif
+
#ifdef USE_LASER_DISC
GetPrivateProfileString(_T("RecentFiles"), _T("InitialLaserDiscDir"), _T(""), config.initial_laser_disc_dir, _MAX_PATH, config_path);
for(int i = 0; i < MAX_HISTORY; i++) {
#ifdef USE_SOUND_DEVICE_TYPE
config.sound_device_type = GetPrivateProfileInt(_T("Sound"), _T("DeviceType"), config.sound_device_type, config_path);
#endif
+#if !defined(_USE_QT)
GetPrivateProfileString(_T("Sound"), _T("FMGenDll"), _T("mamefm.dll"), config.fmgen_dll_path, _MAX_PATH, config_path);
-
+#endif
// input
config.multiple_speakers = GetPrivateProfileBool(_T("Sound"), _T("MultipleSpeakers"),
config.multiple_speakers, config_path);
#ifdef USE_SOUND_DEVICE_TYPE
WritePrivateProfileInt(_T("Sound"), _T("DeviceType"), config.sound_device_type, config_path);
#endif
+#if !defined(_USE_QT)
+ WritePrivateProfileString(_T("Sound"), _T("FMGenDll"), config.fmgen_dll_path, config_path);
+#endif
WritePrivateProfileBool(_T("Sound"), _T("MultipleSpeakers"),
config.multiple_speakers, config_path);
WritePrivateProfileInt(_T("Sound"), _T("GeneralSoundLevel"),
#ifndef _CONFIG_H_
#define _CONFIG_H_
-# if defined(_USE_AGAR) || defined(_USE_SDL)
-#include <sys/param.h>
-#include <agar/core.h>
-#ifndef _MAX_PATH
- #define _MAX_PATH AG_PATHNAME_MAX
-#endif
-# elif defined(_USE_QT)
+#if defined(_USE_QT)
#include <sys/param.h>
#include <QtCore/QFile>
#include <QtCore/QFileInfo>
// #define _IO_DEBUG_LOG
#endif
-#if defined(_USE_AGAR)
-# include <SDL/SDL.h>
-# include <agar/core.h>
-# include <agar/gui.h>
-# include "simd_types.h"
-// Wrapper of WIN32->*nix
-
-#ifndef _MAX_PATH
- #define _MAX_PATH AG_PATHNAME_MAX
-#endif
-
-#elif defined(_USE_QT)
+#if defined(_USE_QT)
# include <SDL.h>
//# include "menuclasses.h"
//# include "mainwidget.h"
# include "simd_types.h"
// Wrapper of WIN32->*nix
-#ifndef _MAX_PATH
- #ifdef MAX_PATH
- #define _MAX_PATH MAX_PATH
- #else
- #define MAX_PATH 2048
- #define _MAX_PATH 2048
- #endif
-#endif
#else // _USE_WIN32
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
char *arg[1] = {""};
- main(1, arg);
+ main(0, arg);
}
#endif
#endif
#ifndef UPDATE_HISTORY
-#define UPDATE_HISTORY(path, recent) { \
+#define UPDATE_HISTORY(path, recent, list) { \
int no = MAX_HISTORY - 1; \
for(int i = 0; i < MAX_HISTORY; i++) { \
if(strcmp(recent[i], path) == 0) { \
strcpy(recent[i], recent[i - 1]); \
} \
strcpy(recent[0], path); \
+ list.clear(); \
+ for(int i = 0; i < MAX_HISTORY; i++) { \
+ QString _tmps = QString::fromUtf8(recent[i]); \
+ list << _tmps; \
+ } \
+}
+#endif
+
+#ifndef SETUP_HISTORY
+#define SETUP_HISTORY(recent, list) { \
+ list.clear(); \
+ for(int i = 0; i < MAX_HISTORY; i++) { \
+ QString _tmps = QString::fromUtf8(recent[i]); \
+ list << _tmps; \
+ } \
}
#endif
#include <stdio.h>
#include <string.h>
-#include <unistd.h>
+//#include <unistd.h>
#include <fcntl.h>
#include <QObject>
#include <QMetaObject>
#include <QIcon>
#include <QLabel>
#include <QGraphicsEllipseItem>
+#include <QStringList>
#else
#include <QtCore/QVariant>
#include <QtGui/QAction>
class Action_Control *action_Recent_List_CART[2][MAX_HISTORY];
class Action_Control *actionInsert_CART[2];
class Action_Control *actionEject_CART[2];
+ QStringList listCarts[2];
#endif
#if defined(USE_QD1) || defined(USE_QD2)
class Action_Control *actionEject_QD[2];
class Action_Control *actionProtection_ON_QD[2];
class Action_Control *actionProtection_OFF_QD[2];
+ QStringList listQDs[2];
#endif
#ifdef USE_TAPE
QActionGroup *actionGroup_Opened_CMT;
class Action_Control *actionPlay_Rewind;
class Action_Control *actionPlay_Apss_Forward;
class Action_Control *actionPlay_Apss_Rewind;
+ QStringList listCMT;
#endif
class Action_Control *actionRecording;
class Action_Control *actionProtection_ON_CMT;
QActionGroup *actionGroup_Opened_LD;
class Action_Control *actionRecent_Opened_LD;
class Action_Control *action_Recent_List_LD[MAX_HISTORY];
+ QStringList listLaserDisc;
#endif
#if defined(USE_BINARY_FILE1)
QActionGroup *actionGroup_Opened_BIN[8];
class Action_Control *action_Recent_List_BIN[8][MAX_HISTORY];
class Action_Control *actionLoad_BIN[8];
class Action_Control *actionSave_BIN[8];
+ QStringList listBinary[8];
#endif
// Screen
QActionGroup *actionGroup_Stretch;
#if defined(USE_FD1) || defined(USE_FD2) || defined(USE_FD3) || defined(USE_FD4) || \
defined(USE_FD5) || defined(USE_FD6) || defined(USE_FD7) || defined(USE_FD8)
Menu_FDClass *menu_fds[MAX_FD];
+ QStringList listFDs[MAX_FD];
+ QStringList listD88[MAX_FD];
#endif
#if defined(USE_QD1) || defined(USE_QD2)
QMenu *menuQD[2];
menuCMT->setObjectName(QString::fromUtf8("menuCMT", -1));
menuWrite_Protection_CMT = new QMenu(menuCMT);
menuWrite_Protection_CMT->setObjectName(QString::fromUtf8("menuWrite_Protection_CMT", -1));
+ listCMT.clear();
//CreateCMTPulldownMenu(p);
#endif // USE_TAPE
}
connect(actionEject_CMT, SIGNAL(triggered()),
this, SLOT(eject_cmt()));
// Translate Menu
+ SETUP_HISTORY(config.recent_tape_path, listCMT);
#endif // USE_TAPE
+
}
void Ui_MainWindow::retranslateCMTMenu(void)
tmps.setNum(drv);
object_desc = desc;
object_desc.append(tmps);
+#if defined(USE_FD1)
for(ii = 0; ii < MAX_D88_BANKS; ii++) {
action_select_media_list[ii] = NULL;
}
+#endif
use_write_protect = true;
use_d88_menus = false;
initial_dir = QString::fromUtf8("");
void Menu_MetaClass::do_select_inner_media(int num)
{
+#if defined(USE_FD1)
if(use_d88_menus && (num < MAX_D88_BANKS)) {
if(action_select_media_list[num] != NULL) {
action_select_media_list[num]->setChecked(true);
}
}
+#endif
}
void Menu_MetaClass::do_open_dialog()
return;
}
-void Menu_MetaClass::do_update_histories(_TCHAR str[MAX_HISTORY][_MAX_PATH])
+void Menu_MetaClass::do_update_histories(QStringList lst)
{
int ii;
QString tmps;
history.clear();
for(ii = 0; ii < MAX_HISTORY; ii++) {
- if(str[ii] != NULL) {
- tmps = QString::fromUtf8(str[ii]);
- } else {
- tmps = QString::fromUtf8("");
- }
+ tmps = QString::fromUtf8("");
+ if(ii < lst.size()) tmps = lst.value(ii);
history << tmps;
action_recent_list[ii]->setText(tmps);
if(!tmps.isEmpty()) {
{
int ii;
inner_media_list.clear();
+#if defined(USE_FD1)
if(use_d88_menus) {
for(ii = 0; ii < MAX_D88_BANKS; ii++) {
if(action_select_media_list[ii] != NULL) {
}
}
}
+#endif
}
-void Menu_MetaClass::do_update_inner_media(_TCHAR str[MAX_D88_BANKS][128], int num)
+#if defined(USE_FD1)
+void Menu_MetaClass::do_update_inner_media(QStringList lst, int num)
{
QString tmps;
int ii;
-
inner_media_list.clear();
if(use_d88_menus) {
- if(str == NULL) {
- for(ii = 0; ii < MAX_D88_BANKS; ii++) {
- if(action_select_media_list[ii] != NULL) action_select_media_list[ii]->setVisible(false);
- }
- return;
- }
-
for(ii = 0; ii < MAX_D88_BANKS; ii++) {
if(ii < p_emu->d88_file[media_drive].bank_num) {
- if(action_select_media_list[ii] != NULL) {
- tmps = QString::fromUtf8(str[ii]);
- } else {
- tmps = QString::fromUtf8("");
- }
- action_select_media_list[ii]->setText(tmps);
+ inner_media_list << lst.value(ii);
+ action_select_media_list[ii]->setText(lst.value(ii));
action_select_media_list[ii]->setVisible(true);
if(ii == num) action_select_media_list[ii]->setChecked(true);
} else {
}
}
}
-
+#endif
void Menu_MetaClass::create_pulldown_menu_sub(void)
{
action_insert = new Action_Control(p_wid);
}
}
}
+#if defined(USE_FD1)
if(use_d88_menus) {
int ii;
QString tmps;
}
}
}
-
+#endif
if(use_write_protect) {
action_group_protect = new QActionGroup(p_wid);
action_group_protect->setExclusive(true);
menu_history = new QMenu(this);
menu_history->setObjectName(QString::fromUtf8("menu_history_") + object_desc);
+#if defined(USE_FD1)
if(use_d88_menus) {
menu_inner_media = new QMenu(this);
menu_inner_media->setObjectName(QString::fromUtf8("menu_inner_media_") + object_desc);
for(ii = 0; ii < MAX_D88_BANKS; ii++) menu_inner_media->addAction(action_select_media_list[ii]);
this->addAction(menu_inner_media->menuAction());
}
+#endif
{
menu_history = new QMenu(this);
menu_history->setObjectName(QString::fromUtf8("menu_history_") + object_desc);
// More actions
this->addAction(menu_history->menuAction());
+#if defined(USE_FD1)
if(use_d88_menus) {
this->addAction(menu_inner_media->menuAction());
}
+#endif
if(use_write_protect) {
this->addSeparator();
this->addAction(menu_write_protect->menuAction());
connect(action_recent_list[ii]->binds, SIGNAL(set_recent_disk(int, int)),
this, SLOT(do_open_recent_media(int, int)));
}
+#if defined(USE_FD1)
if(use_d88_menus) {
for(ii = 0; ii < MAX_D88_BANKS; ii++) {
connect(action_select_media_list[ii], SIGNAL(triggered()),
this, SLOT(do_open_inner_media(int, int)));
}
}
+#endif
connect(this, SIGNAL(sig_open_media(int, QString)), p_wid, SLOT(_open_disk(int, QString)));
connect(this, SIGNAL(sig_eject_media(int)), p_wid, SLOT(eject_fd(int)));
connect(this, SIGNAL(sig_write_protect_media(int, bool)), p_wid, SLOT(write_protect_fd(int, bool)));
connect(this, SIGNAL(sig_set_recent_media(int, int)), p_wid, SLOT(set_recent_disk(int, int)));
+#if defined(USE_FD1)
connect(this, SIGNAL(sig_set_inner_slot(int, int)), p_wid, SLOT(set_d88_slot(int, int)));
+#endif
}
void Menu_MetaClass::retranslate_pulldown_menu_sub(void)
action_write_protect_on->setVisible(false);
action_write_protect_off->setVisible(false);
}
+#if defined(USE_FD1)
if(use_d88_menus) {
menu_inner_media->setTitle(QApplication::translate("MainWindow", "Select D88 image", 0));
} else {
//menu_inner_media->setVisible(false);
}
+#endif
menu_history->setTitle(QApplication::translate("MainWindow", "Recent opened", 0));
}
class Action_Control *action_inner_media;
class Action_Control *action_write_protect_on;
class Action_Control *action_write_protect_off;
-
+#if defined(USE_FD1)
class Action_Control *action_select_media_list[MAX_D88_BANKS];
+#endif
class Action_Control *action_recent_list[MAX_HISTORY];
QActionGroup *action_group_recent;
void do_open_dialog(void);
void do_clear_inner_media(void);
void do_select_inner_media(int num);
- void do_update_inner_media(_TCHAR s[MAX_D88_BANKS][128], int num);
- void do_update_histories(_TCHAR s[MAX_HISTORY][_MAX_PATH]);
+#if defined(USE_FD1)
+ void do_update_inner_media(QStringList lst, int num);
+#endif
+ void do_update_histories(QStringList lst);
signals:
int sig_open_media(int, QString);
int sig_eject_media(int);
s_path = QString::fromUtf8(config.recent_tape_path[num]);
strncpy(path_shadow, s_path.toUtf8().constData(), PATH_MAX);
- UPDATE_HISTORY(path_shadow, config.recent_tape_path);
+ UPDATE_HISTORY(path_shadow, config.recent_tape_path, listCMT);
//strncpy(path_shadow, s_path.toUtf8().constData(), PATH_MAX);
get_parent_dir(path_shadow);
#ifdef USE_TAPE
if(path.length() <= 0) return;
strncpy(path_shadow, path.toUtf8().constData(), PATH_MAX);
- UPDATE_HISTORY(path_shadow, config.recent_tape_path);
+ UPDATE_HISTORY(path_shadow, config.recent_tape_path, listCMT);
get_parent_dir(path_shadow);
strcpy(config.initial_tape_dir, path_shadow);
// Copy filename again.
#endif
}
+#ifndef UPDATE_D88_LIST
+#define UPDATE_D88_LIST(__d, lst) { \
+ lst.clear(); \
+ QString __tmps; \
+ for(int iii = 0; iii < MAX_D88_BANKS; iii++) { \
+ __tmps = QString::fromUtf8(""); \
+ if(iii < emu->d88_file[__d].bank_num) { \
+ __tmps = QString::fromUtf8(emu->d88_file[__d].disk_name[iii]); \
+ } \
+ lst << __tmps; \
+ } \
+}
+#endif
+
void Object_Menu_Control::do_set_correct_disk_timing(bool flag)
{
#ifdef USE_FD1
{
int i;
if(emu == NULL) return;
- menu_fds[drv]->do_update_histories(config.recent_disk_path[drv]);
+ menu_fds[drv]->do_update_histories(listFDs[drv]);
menu_fds[drv]->do_set_initialize_directory(config.initial_disk_dir);
if(emu->get_disk_protected(drv)) {
menu_fds[drv]->do_write_protect_media();
if((num < 0) || (num >= MAX_HISTORY)) return -1;
s_path = QString::fromUtf8(config.recent_disk_path[drv][num]);
strncpy(path_shadow, s_path.toUtf8().constData(), PATH_MAX);
- UPDATE_HISTORY(path_shadow, config.recent_disk_path[drv]);
+ UPDATE_HISTORY(path_shadow, config.recent_disk_path[drv], listFDs[drv]);
strncpy(path_shadow, s_path.toUtf8().constData(), PATH_MAX);
get_parent_dir(path_shadow);
if(emu) {
emit sig_close_disk(drv);
emit sig_open_disk(drv, s_path, 0);
- menu_fds[drv]->do_update_histories(config.recent_disk_path[drv]);
+ menu_fds[drv]->do_update_histories(listFDs[drv]);
menu_fds[drv]->do_set_initialize_directory(config.initial_disk_dir);
if(check_file_extension(path_shadow, ".d88") || check_file_extension(path_shadow, ".d77")) {
- menu_fds[drv]->do_update_inner_media(emu->d88_file[drv].disk_name, 0);
+ UPDATE_D88_LIST(drv, listD88[drv]);
+ menu_fds[drv]->do_update_inner_media(listD88[drv], 0);
} else {
menu_fds[drv]->do_clear_inner_media();
}
int drv2 = drv + 1;
emit sig_close_disk(drv2);
emit sig_open_disk(drv2, s_path, 1);
- menu_fds[drv2]->do_update_histories(config.recent_disk_path[drv2]);
+ menu_fds[drv2]->do_update_histories(listFDs[drv2]);
menu_fds[drv2]->do_set_initialize_directory(config.initial_disk_dir);
- menu_fds[drv2]->do_update_inner_media(emu->d88_file[drv2].disk_name, 1);
+ UPDATE_D88_LIST(drv2, listD88[drv2]);
+ menu_fds[drv2]->do_update_inner_media(listD88[drv2], 1);
}
}
# endif
if(fname.length() <= 0) return;
drv = drv & 7;
strncpy(path_shadow, fname.toUtf8().constData(), PATH_MAX);
- UPDATE_HISTORY(path_shadow, config.recent_disk_path[drv]);
+ UPDATE_HISTORY(path_shadow, config.recent_disk_path[drv], listFDs[drv]);
get_parent_dir(path_shadow);
strcpy(config.initial_disk_dir, path_shadow);
// Update List
emit sig_close_disk(drv);
//emu->LockVM();
emit sig_open_disk(drv, fname, 0);
- menu_fds[drv]->do_update_histories(config.recent_disk_path[drv]);
+ menu_fds[drv]->do_update_histories(listFDs[drv]);
menu_fds[drv]->do_set_initialize_directory(config.initial_disk_dir);
if(check_file_extension(path_shadow, ".d88") || check_file_extension(path_shadow, ".d77")) {
- menu_fds[drv]->do_update_inner_media(emu->d88_file[drv].disk_name, 0);
+ UPDATE_D88_LIST(drv, listD88[drv]);
+ menu_fds[drv]->do_update_inner_media(listD88[drv], 0);
} else {
menu_fds[drv]->do_clear_inner_media();
}
//emu->LockVM();
strncpy(path_shadow, fname.toUtf8().constData(), PATH_MAX);
emit sig_open_disk(drv2, fname, 1);
- menu_fds[drv2]->do_update_histories(config.recent_disk_path[drv2]);
+ menu_fds[drv2]->do_update_histories(listFDs[drv2]);
menu_fds[drv2]->do_set_initialize_directory(config.initial_disk_dir);
- menu_fds[drv2]->do_update_inner_media(emu->d88_file[drv2].disk_name, 1);
+ UPDATE_D88_LIST(drv2, listD88[drv2]);
+ menu_fds[drv2]->do_update_inner_media(listD88[drv2], 1);
}
}
# endif
menu_fds[drv]->do_clear_inner_media();
menu_fds[drv]->do_add_media_extension(ext, desc1);
- menu_fds[drv]->do_update_histories(config.recent_disk_path[drv]);
+ SETUP_HISTORY(config.recent_disk_path[drv], listFDs[drv]);
+ menu_fds[drv]->do_update_histories(listFDs[drv]);
menu_fds[drv]->do_set_initialize_directory(config.initial_disk_dir);
+ listD88[drv].clear();
}
#endif
}
#include "device.h"
#include "fmgen/opm.h"
-#if defined(_WIN32)
+#if defined(_WIN32) && !defined(SDL) && !defined(_USE_QT) && !defined(QT_VERSION)
#define SUPPORT_MAME_FM_DLL
#include "fmdll/fmdll.h"
#endif
#if !(defined(HAS_AY_3_8910) || defined(HAS_AY_3_8912) || defined(HAS_AY_3_8913))
#define HAS_YM_SERIES
-#if defined(_WIN32) && !defined(SDL) && !defined(_USE_QT)
+#if defined(_WIN32) && !defined(SDL) && !defined(_USE_QT) && !defined(QT_VERSION)
#define SUPPORT_MAME_FM_DLL
#include "fmdll/fmdll.h"
#endif