Remove more non-wswan code

This commit is contained in:
twinaphex 2014-06-22 00:14:27 +02:00
parent 5bc3830a90
commit c912cbdffe
7 changed files with 5 additions and 1044 deletions

View File

@ -217,11 +217,6 @@ else
FLAGS += -DHAVE__MKDIR
endif
ifeq ($(NEED_THREADING), 1)
FLAGS += -DWANT_THREADING
THREAD_SOURCES += threads.c
endif
ifeq ($(NEED_CRC32), 1)
FLAGS += -DWANT_CRC32
LIBRETRO_SOURCES += scrc32.cpp
@ -231,32 +226,6 @@ ifeq ($(NEED_DEINTERLACER), 1)
FLAGS += -DNEED_DEINTERLACER
endif
ifeq ($(NEED_SCSI_CD), 1)
CDROM_SOURCES += $(MEDNAFEN_DIR)/cdrom/scsicd.cpp
endif
ifeq ($(NEED_CD), 1)
CDROM_SOURCES += $(MEDNAFEN_DIR)/cdrom/CDAccess.cpp \
$(MEDNAFEN_DIR)/cdrom/CDAccess_Image.cpp \
$(MEDNAFEN_DIR)/cdrom/CDAccess_CCD.cpp \
$(MEDNAFEN_DIR)/cdrom/CDUtility.cpp \
$(MEDNAFEN_DIR)/cdrom/lec.cpp \
$(MEDNAFEN_DIR)/cdrom/SimpleFIFO.cpp \
$(MEDNAFEN_DIR)/cdrom/audioreader.cpp \
$(MEDNAFEN_DIR)/cdrom/galois.cpp \
$(MEDNAFEN_DIR)/cdrom/recover-raw.cpp \
$(MEDNAFEN_DIR)/cdrom/l-ec.cpp \
$(MEDNAFEN_DIR)/cdrom/crc32.cpp \
$(MEDNAFEN_DIR)/cdrom/cdromif.cpp
FLAGS += -DNEED_CD
endif
ifeq ($(NEED_TREMOR), 1)
TREMOR_SRC := $(wildcard $(MEDNAFEN_DIR)/tremor/*.c)
FLAGS += -DNEED_TREMOR
endif
MEDNAFEN_SOURCES := $(MEDNAFEN_DIR)/mednafen.cpp \
$(MEDNAFEN_DIR)/error.cpp \
$(MEDNAFEN_DIR)/math_ops.cpp \

View File

@ -56,35 +56,11 @@ endif
CORE_INCDIR := $(CORE_DIR)
ifeq ($(NEED_THREADING), 1)
FLAGS += -DWANT_THREADING
THREAD_SOURCES += $(MEDNAFEN_LIBRETRO_DIR)/threads.c
endif
ifeq ($(NEED_CRC32), 1)
FLAGS += -DWANT_CRC32
CORE_SOURCES += $(MEDNAFEN_LIBRETRO_DIR)/scrc32.cpp
endif
ifeq ($(NEED_DEINTERLACER), 1)
FLAGS += -DNEED_DEINTERLACER
endif
ifeq ($(NEED_SCSI_CD), 1)
SCSI_CD_SOURCES := $(MEDNAFEN_DIR)/cdrom/scsicd.cpp
endif
ifeq ($(NEED_CD), 1)
CDROM_SOURCES := $(MEDNAFEN_DIR)/cdrom/CDAccess.cpp $(MEDNAFEN_DIR)/cdrom/CDAccess_Image.cpp $(MEDNAFEN_DIR)/cdrom/CDAccess_CCD.cpp $(MEDNAFEN_DIR)/cdrom/CDUtility.cpp $(MEDNAFEN_DIR)/cdrom/lec.cpp $(MEDNAFEN_DIR)/cdrom/SimpleFIFO.cpp $(MEDNAFEN_DIR)/cdrom/audioreader.cpp $(MEDNAFEN_DIR)/cdrom/galois.cpp $(MEDNAFEN_DIR)/cdrom/recover-raw.cpp $(MEDNAFEN_DIR)/cdrom/l-ec.cpp $(MEDNAFEN_DIR)/cdrom/cdromif.cpp $(MEDNAFEN_DIR)/cdrom/crc32.cpp
FLAGS += -DNEED_CD
endif
ifeq ($(NEED_TREMOR), 1)
TREMOR_SRC := $(wildcard $(MEDNAFEN_DIR)/tremor/*.c)
FLAGS += -DNEED_TREMOR
endif
MEDNAFEN_SOURCES := $(MEDNAFEN_DIR)/mednafen.cpp \
$(MEDNAFEN_DIR)/error.cpp \
$(MEDNAFEN_DIR)/math_ops.cpp \
@ -106,11 +82,11 @@ MEDNAFEN_SOURCES := $(MEDNAFEN_DIR)/mednafen.cpp \
$(MEDNAFEN_DIR)/md5.cpp
LIBRETRO_SOURCES := $(MEDNAFEN_LIBRETRO_DIR)/libretro.cpp $(THREAD_STUBS)
LIBRETRO_SOURCES := $(MEDNAFEN_LIBRETRO_DIR)/libretro.cpp
SOURCES_C := $(TREMOR_SRC) $(LIBRETRO_SOURCES_C) $(MEDNAFEN_DIR)/trio/trio.c $(MEDNAFEN_DIR)/trio/triostr.c $(THREAD_SOURCES)
SOURCES_C := $(TREMOR_SRC) $(LIBRETRO_SOURCES_C) $(MEDNAFEN_DIR)/trio/trio.c $(MEDNAFEN_DIR)/trio/triostr.c
LOCAL_SRC_FILES += $(LIBRETRO_SOURCES) $(CORE_SOURCES) $(MEDNAFEN_SOURCES) $(CDROM_SOURCES) $(SCSI_CD_SOURCES) $(HW_CPU_SOURCES) $(HW_MISC_SOURCES) $(HW_SOUND_SOURCES) $(HW_VIDEO_SOURCES) $(SOURCES_C) $(CORE_CD_SOURCES)
LOCAL_SRC_FILES += $(LIBRETRO_SOURCES) $(CORE_SOURCES) $(MEDNAFEN_SOURCES) $(HW_CPU_SOURCES) $(HW_MISC_SOURCES) $(HW_SOUND_SOURCES) $(HW_VIDEO_SOURCES) $(SOURCES_C) $(CORE_CD_SOURCES)
WARNINGS := -Wall \
-Wno-sign-compare \

View File

@ -50,22 +50,6 @@ static void set_basename(const char *path)
retro_base_name = retro_base_name.substr(0, retro_base_name.find_last_of('.'));
}
#if defined(WANT_LYNX_EMU)
#define MEDNAFEN_CORE_NAME_MODULE "lynx"
#define MEDNAFEN_CORE_NAME "Mednafen Lynx"
#define MEDNAFEN_CORE_VERSION "v0.9.32"
#define MEDNAFEN_CORE_EXTENSIONS "lnx"
#define MEDNAFEN_CORE_TIMING_FPS 75
#define MEDNAFEN_CORE_GEOMETRY_BASE_W 160
#define MEDNAFEN_CORE_GEOMETRY_BASE_H 102
#define MEDNAFEN_CORE_GEOMETRY_MAX_W 160
#define MEDNAFEN_CORE_GEOMETRY_MAX_H 102
#define MEDNAFEN_CORE_GEOMETRY_ASPECT_RATIO (4.0 / 3.0)
#define FB_WIDTH 160
#define FB_HEIGHT 102
static bool is_pal = false;
#elif defined(WANT_WSWAN_EMU)
#define MEDNAFEN_CORE_NAME_MODULE "wswan"
#define MEDNAFEN_CORE_NAME "Mednafen WonderSwan"
#define MEDNAFEN_CORE_VERSION "v0.9.35.1"
@ -79,48 +63,6 @@ static bool is_pal = false;
#define FB_WIDTH 224
#define FB_HEIGHT 144
#elif defined(WANT_GBA_EMU)
#define MEDNAFEN_CORE_NAME_MODULE "gba"
#define MEDNAFEN_CORE_NAME "Mednafen VBA-M"
#define MEDNAFEN_CORE_VERSION "v0.9.33.3"
#define MEDNAFEN_CORE_EXTENSIONS "gba|agb|bin"
#define MEDNAFEN_CORE_TIMING_FPS 59.73
#define MEDNAFEN_CORE_GEOMETRY_BASE_W (game->nominal_width)
#define MEDNAFEN_CORE_GEOMETRY_BASE_H (game->nominal_height)
#define MEDNAFEN_CORE_GEOMETRY_MAX_W 240
#define MEDNAFEN_CORE_GEOMETRY_MAX_H 160
#define MEDNAFEN_CORE_GEOMETRY_ASPECT_RATIO (4.0 / 3.0)
#define FB_WIDTH 240
#define FB_HEIGHT 160
#elif defined(WANT_SNES_EMU)
#define MEDNAFEN_CORE_NAME_MODULE "snes"
#define MEDNAFEN_CORE_NAME "Mednafen bSNES"
#define MEDNAFEN_CORE_VERSION "v0.9.26"
#define MEDNAFEN_CORE_EXTENSIONS "smc|fig|bs|st|sfc"
#define MEDNAFEN_CORE_TIMING_FPS 60.10
#define MEDNAFEN_CORE_GEOMETRY_BASE_W (game->nominal_width)
#define MEDNAFEN_CORE_GEOMETRY_BASE_H (game->nominal_height)
#define MEDNAFEN_CORE_GEOMETRY_MAX_W 512
#define MEDNAFEN_CORE_GEOMETRY_MAX_H 512
#define MEDNAFEN_CORE_GEOMETRY_ASPECT_RATIO (4.0 / 3.0)
#define FB_WIDTH 512
#define FB_HEIGHT 512
#elif defined(WANT_PCFX_EMU)
#define MEDNAFEN_CORE_NAME_MODULE "pcfx"
#define MEDNAFEN_CORE_NAME "Mednafen PC-FX"
#define MEDNAFEN_CORE_VERSION "v0.9.33.3"
#define MEDNAFEN_CORE_EXTENSIONS "cue|ccd"
#define MEDNAFEN_CORE_TIMING_FPS 59.94
#define MEDNAFEN_CORE_GEOMETRY_BASE_W (game->nominal_width)
#define MEDNAFEN_CORE_GEOMETRY_BASE_H (game->nominal_height)
#define MEDNAFEN_CORE_GEOMETRY_MAX_W 341
#define MEDNAFEN_CORE_GEOMETRY_MAX_H 480
#define MEDNAFEN_CORE_GEOMETRY_ASPECT_RATIO (4.0 / 3.0)
#define FB_WIDTH 344
#define FB_HEIGHT 480
#endif
#define FB_MAX_HEIGHT FB_HEIGHT
@ -228,56 +170,12 @@ static void check_variables(void)
{
struct retro_variable var = {0};
#if defined (WANT_GBA_EMU)
var.key = "gba_hle";
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
{
if (strcmp(var.value, "enabled") == 0)
setting_gba_hle = 1;
else if (strcmp(var.value, "disabled") == 0)
setting_gba_hle = 0;
}
#endif
}
#if defined(WANT_LYNX_EMU)
#define MAX_PLAYERS 1
#define MAX_BUTTONS 9
static uint8_t input_buf[MAX_PLAYERS][2] = {0};
#elif defined(WANT_WSWAN_EMU)
#define MAX_PLAYERS 1
#define MAX_BUTTONS 11
static uint16_t input_buf;
#elif defined(WANT_GBA_EMU)
#define MAX_PLAYERS 1
#define MAX_BUTTONS 11
static uint16_t input_buf;
#elif defined(WANT_SNES_EMU)
#define MAX_PLAYERS 5
#define MAX_BUTTONS 14
static uint8_t input_buf[MAX_PLAYERS][2];
#elif defined(WANT_PCFX_EMU)
#define MAX_PLAYERS 2
#define MAX_BUTTONS 12
static uint16_t input_buf[MAX_PLAYERS];
#else
#define MAX_PLAYERS 1
#define MAX_BUTTONS 7
static uint16_t input_buf[1];
#endif
static void hookup_ports(bool force)
{
@ -286,21 +184,7 @@ static void hookup_ports(bool force)
if (initial_ports_hookup && !force)
return;
#if defined(WANT_LYNX_EMU)
currgame->SetInput(0, "gamepad", &input_buf);
#elif defined(WANT_WSWAN_EMU)
currgame->SetInput(0, "gamepad", &input_buf);
#elif defined(WANT_GBA_EMU)
// Possible endian bug ...
currgame->SetInput(0, "gamepad", &input_buf);
#elif defined(WANT_SNES_EMU)
// Possible endian bug ...
for (unsigned i = 0; i < MAX_PLAYERS; i++)
currgame->SetInput(i, "gamepad", &input_buf[i][0]);
#else
// Possible endian bug ...
currgame->SetInput(0, "gamepad", &input_buf[0]);
#endif
initial_ports_hookup = true;
}
@ -354,30 +238,6 @@ void retro_unload_game()
static void update_input(void)
{
MDFNGI *currgame = (MDFNGI*)game;
#if defined(WANT_LYNX_EMU)
static unsigned map[] = {
RETRO_DEVICE_ID_JOYPAD_A,
RETRO_DEVICE_ID_JOYPAD_B,
RETRO_DEVICE_ID_JOYPAD_L,
RETRO_DEVICE_ID_JOYPAD_R,
RETRO_DEVICE_ID_JOYPAD_LEFT,
RETRO_DEVICE_ID_JOYPAD_RIGHT,
RETRO_DEVICE_ID_JOYPAD_UP,
RETRO_DEVICE_ID_JOYPAD_DOWN,
RETRO_DEVICE_ID_JOYPAD_START,
};
for (unsigned j = 0; j < MAX_PLAYERS; j++)
{
uint16_t input_state = 0;
for (unsigned i = 0; i < MAX_BUTTONS; i++)
input_state |= input_state_cb(j, RETRO_DEVICE_JOYPAD, 0, map[i]) ? (1 << i) : 0;
// Input data must be little endian.
input_buf[j][0] = (input_state >> 0) & 0xff;
input_buf[j][1] = (input_state >> 8) & 0xff;
}
#elif defined(WANT_WSWAN_EMU)
input_buf = 0;
static unsigned map[] = {
@ -407,123 +267,6 @@ static void update_input(void)
input_buf = u.b[0] | u.b[1] << 8;
#endif
#elif defined(WANT_GBA_EMU)
input_buf = 0;
static unsigned map[] = {
RETRO_DEVICE_ID_JOYPAD_A, //A button
RETRO_DEVICE_ID_JOYPAD_B, //B button
RETRO_DEVICE_ID_JOYPAD_SELECT,
RETRO_DEVICE_ID_JOYPAD_START,
RETRO_DEVICE_ID_JOYPAD_RIGHT,
RETRO_DEVICE_ID_JOYPAD_LEFT,
RETRO_DEVICE_ID_JOYPAD_UP,
RETRO_DEVICE_ID_JOYPAD_DOWN,
RETRO_DEVICE_ID_JOYPAD_R,
RETRO_DEVICE_ID_JOYPAD_L,
};
for (unsigned i = 0; i < MAX_BUTTONS; i++)
input_buf |= map[i] != -1u &&
input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, map[i]) ? (1 << i) : 0;
#ifdef MSB_FIRST
union {
uint8_t b[2];
uint16_t s;
} u;
u.s = input_buf;
input_buf = u.b[0] | u.b[1] << 8;
#endif
#elif defined(WANT_SNES_EMU)
static unsigned map[] = {
RETRO_DEVICE_ID_JOYPAD_B,
RETRO_DEVICE_ID_JOYPAD_Y,
RETRO_DEVICE_ID_JOYPAD_SELECT,
RETRO_DEVICE_ID_JOYPAD_START,
RETRO_DEVICE_ID_JOYPAD_UP,
RETRO_DEVICE_ID_JOYPAD_DOWN,
RETRO_DEVICE_ID_JOYPAD_LEFT,
RETRO_DEVICE_ID_JOYPAD_RIGHT,
RETRO_DEVICE_ID_JOYPAD_A,
RETRO_DEVICE_ID_JOYPAD_X,
RETRO_DEVICE_ID_JOYPAD_L,
RETRO_DEVICE_ID_JOYPAD_R,
};
for (unsigned j = 0; j < MAX_PLAYERS; j++)
{
uint16_t input_state = 0;
for (unsigned i = 0; i < MAX_BUTTONS; i++)
input_state |= input_state_cb(j, RETRO_DEVICE_JOYPAD, 0, map[i]) ? (1 << i) : 0;
#ifdef MSB_FIRST
union {
uint8_t b[2];
uint16_t s;
} u;
u.s = input_buf[j];
input_buf[j] = u.b[0] | u.b[1] << 8;
#else
input_buf[j][0] = (input_state >> 0) & 0xff;
input_buf[j][1] = (input_state >> 8) & 0xff;
#endif
}
#elif defined(WANT_PCFX_EMU)
input_buf[0] = input_buf[1] = 0;
static unsigned map[] = {
RETRO_DEVICE_ID_JOYPAD_A,
RETRO_DEVICE_ID_JOYPAD_B,
RETRO_DEVICE_ID_JOYPAD_X,
RETRO_DEVICE_ID_JOYPAD_Y,
RETRO_DEVICE_ID_JOYPAD_L,
RETRO_DEVICE_ID_JOYPAD_R,
RETRO_DEVICE_ID_JOYPAD_SELECT,
RETRO_DEVICE_ID_JOYPAD_START,
RETRO_DEVICE_ID_JOYPAD_UP,
RETRO_DEVICE_ID_JOYPAD_RIGHT,
RETRO_DEVICE_ID_JOYPAD_DOWN,
RETRO_DEVICE_ID_JOYPAD_LEFT,
};
for (unsigned j = 0; j < MAX_PLAYERS; j++)
{
for (unsigned i = 0; i < MAX_BUTTONS; i++)
input_buf[j] |= map[i] != -1u &&
input_state_cb(j, RETRO_DEVICE_JOYPAD, 0, map[i]) ? (1 << i) : 0;
#ifdef MSB_FIRST
union {
uint8_t b[2];
uint16_t s;
} u;
u.s = input_buf[j];
input_buf[j] = u.b[0] | u.b[1] << 8;
#endif
}
#else
input_buf[0] = 0;
static unsigned map[] = {
RETRO_DEVICE_ID_JOYPAD_UP,
RETRO_DEVICE_ID_JOYPAD_DOWN,
RETRO_DEVICE_ID_JOYPAD_LEFT,
RETRO_DEVICE_ID_JOYPAD_RIGHT,
RETRO_DEVICE_ID_JOYPAD_A, //A button
RETRO_DEVICE_ID_JOYPAD_B, //B button
RETRO_DEVICE_ID_JOYPAD_START, //Option button
};
for (unsigned j = 0; j < MAX_PLAYERS; j++)
{
for (unsigned i = 0; i < MAX_BUTTONS; i++)
input_buf[j] |= map[i] != -1u &&
input_state_cb(j, RETRO_DEVICE_JOYPAD, 0, map[i]) ? (1 << i) : 0;
}
#endif
}
static uint64_t video_frames, audio_frames;
@ -643,50 +386,11 @@ unsigned retro_api_version(void)
void retro_set_controller_port_device(unsigned in_port, unsigned device)
{
MDFNGI *currgame = (MDFNGI*)game;
if (!currgame)
return;
#if defined(WANT_PCFX_EMU)
switch(device)
{
case RETRO_DEVICE_JOYPAD:
if (currgame->SetInput)
currgame->SetInput(in_port, "gamepad", &input_buf[in_port]);
break;
case RETRO_DEVICE_MOUSE:
if (currgame->SetInput)
currgame->SetInput(in_port, "mouse", &input_buf[in_port]);
break;
}
#endif
}
void retro_set_environment(retro_environment_t cb)
{
environ_cb = cb;
#if defined(WANT_PCFX_EMU)
static const struct retro_controller_description pads[] = {
{ "PCFX Joypad", RETRO_DEVICE_JOYPAD },
{ "Mouse", RETRO_DEVICE_MOUSE },
};
static const struct retro_controller_info ports[] = {
{ pads, 2 },
{ pads, 2 },
{ 0 },
};
environ_cb(RETRO_ENVIRONMENT_SET_CONTROLLER_INFO, (void*)ports);
#elif defined(WANT_GBA_EMU)
static const struct retro_variable vars[] = {
{ "gba_hle", "HLE bios emulation; enabled|disabled" },
{ NULL, NULL },
};
cb(RETRO_ENVIRONMENT_SET_VARIABLES, (void*)vars);
#endif
}
void retro_set_audio_sample(retro_audio_sample_t cb)
@ -854,48 +558,3 @@ void MDFND_Sleep(unsigned int time)
{
retro_sleep(time);
}
#ifdef WANT_THREADING
MDFN_Thread *MDFND_CreateThread(int (*fn)(void *), void *data)
{
return (MDFN_Thread*)sthread_create((void (*)(void*))fn, data);
}
void MDFND_WaitThread(MDFN_Thread *thr, int *val)
{
sthread_join((sthread_t*)thr);
if (val)
{
*val = 0;
fprintf(stderr, "WaitThread relies on return value.\n");
}
}
void MDFND_KillThread(MDFN_Thread *)
{
fprintf(stderr, "Killing a thread is a BAD IDEA!\n");
}
MDFN_Mutex *MDFND_CreateMutex()
{
return (MDFN_Mutex*)slock_new();
}
void MDFND_DestroyMutex(MDFN_Mutex *lock)
{
slock_free((slock_t*)lock);
}
int MDFND_LockMutex(MDFN_Mutex *lock)
{
slock_lock((slock_t*)lock);
return 0;
}
int MDFND_UnlockMutex(MDFN_Mutex *lock)
{
slock_unlock((slock_t*)lock);
return 0;
}
#endif

View File

@ -31,11 +31,6 @@
#include "file.h"
#include "FileWrapper.h"
#ifdef NEED_CD
#include "cdrom/cdromif.h"
#include "cdrom/CDUtility.h"
#endif
#include "mempatcher.h"
#include "md5.h"
#include "clamp.h"
@ -44,43 +39,8 @@
#include "msvc_compat.h"
#endif
MDFNGI *MDFNGameInfo = NULL;
#if defined(WANT_NES_EMU)
extern MDFNGI EmulatedNES;
#define MDFNGI_CORE &EmulatedNES
#elif defined WANT_SNES_EMU
extern MDFNGI EmulatedSNES;
#define MDFNGI_CORE &EmulatedSNES
extern MDFNGI EmulatedGB;
#elif defined WANT_GB_EMU
#define MDFNGI_CORE &EmulatedGB
#elif defined WANT_GBA_EMU
extern MDFNGI EmulatedGBA;
#define MDFNGI_CORE &EmulatedGBA
#elif defined WANT_PCE_EMU
extern MDFNGI EmulatedPCE;
#define MDFNGI_CORE &EmulatedPCE
#elif defined WANT_LYNX_EMU
extern MDFNGI EmulatedLynx;
#define MDFNGI_CORE &EmulatedLynx
#elif defined WANT_MD_EMU
extern MDFNGI EmulatedMD;
#define MDFNGI_CORE &EmulatedMD
#elif defined WANT_PCFX_EMU
extern MDFNGI EmulatedPCFX;
#define MDFNGI_CORE &EmulatedPCFX
#elif defined WANT_WSWAN_EMU
extern MDFNGI EmulatedWSwan;
#define MDFNGI_CORE &EmulatedWSwan
#elif defined WANT_SMS_EMU
extern MDFNGI EmulatedSMS;
#define MDFNGI_CORE &EmulatedSMS
#elif defined(WANT_SMS_EMU) && defined(WANT_GG_EMU)
extern MDFNGI EmulatedGG;
#define MDFNGI_CORE &EmulatedGG
#endif
MDFNGI *MDFNGameInfo = &EmulatedWSwan;
/* forward declarations */
extern void MDFND_DispMessage(unsigned char *str);
@ -103,171 +63,11 @@ void MDFN_ResetMessages(void)
}
#ifdef NEED_CD
static void ReadM3U(std::vector<std::string> &file_list, std::string path, unsigned depth = 0)
{
std::vector<std::string> ret;
FileWrapper m3u_file(path.c_str(), FileWrapper::MODE_READ, _("M3U CD Set"));
std::string dir_path;
char linebuf[2048];
MDFN_GetFilePathComponents(path, &dir_path);
while(m3u_file.get_line(linebuf, sizeof(linebuf)))
{
std::string efp;
if(linebuf[0] == '#') continue;
MDFN_rtrim(linebuf);
if(linebuf[0] == 0) continue;
efp = MDFN_EvalFIP(dir_path, std::string(linebuf));
if(efp.size() >= 4 && efp.substr(efp.size() - 4) == ".m3u")
{
if(efp == path)
throw(MDFN_Error(0, _("M3U at \"%s\" references self."), efp.c_str()));
if(depth == 99)
throw(MDFN_Error(0, _("M3U load recursion too deep!")));
ReadM3U(file_list, efp, depth++);
}
else
file_list.push_back(efp);
}
}
#ifdef NEED_CD
static std::vector<CDIF *> CDInterfaces; // FIXME: Cleanup on error out.
#endif
// TODO: LoadCommon()
MDFNGI *MDFNI_LoadCD(const char *force_module, const char *devicename)
{
uint8 LayoutMD5[16];
MDFN_printf(_("Loading %s...\n\n"), devicename ? devicename : _("PHYSICAL CD"));
try
{
if(devicename && strlen(devicename) > 4 && !strcasecmp(devicename + strlen(devicename) - 4, ".m3u"))
{
std::vector<std::string> file_list;
ReadM3U(file_list, devicename);
for(unsigned i = 0; i < file_list.size(); i++)
{
CDInterfaces.push_back(CDIF_Open(file_list[i].c_str(), false, false /* cdimage_memcache */));
}
}
else
{
CDInterfaces.push_back(CDIF_Open(devicename, false, false /* cdimage_memcache */));
}
}
catch(std::exception &e)
{
MDFND_PrintError(e.what());
MDFN_PrintError(_("Error opening CD."));
return(0);
}
//
// Print out a track list for all discs.
//
MDFN_indent(1);
for(unsigned i = 0; i < CDInterfaces.size(); i++)
{
CDUtility::TOC toc;
CDInterfaces[i]->ReadTOC(&toc);
MDFN_printf(_("CD %d Layout:\n"), i + 1);
MDFN_indent(1);
for(int32 track = toc.first_track; track <= toc.last_track; track++)
{
MDFN_printf(_("Track %2d, LBA: %6d %s\n"), track, toc.tracks[track].lba, (toc.tracks[track].control & 0x4) ? "DATA" : "AUDIO");
}
MDFN_printf("Leadout: %6d\n", toc.tracks[100].lba);
MDFN_indent(-1);
MDFN_printf("\n");
}
MDFN_indent(-1);
// Calculate layout MD5. The system emulation LoadCD() code is free to ignore this value and calculate
// its own, or to use it to look up a game in its database.
{
md5_context layout_md5;
layout_md5.starts();
for(unsigned i = 0; i < CDInterfaces.size(); i++)
{
CD_TOC toc;
CDInterfaces[i]->ReadTOC(&toc);
layout_md5.update_u32_as_lsb(toc.first_track);
layout_md5.update_u32_as_lsb(toc.last_track);
layout_md5.update_u32_as_lsb(toc.tracks[100].lba);
for(uint32 track = toc.first_track; track <= toc.last_track; track++)
{
layout_md5.update_u32_as_lsb(toc.tracks[track].lba);
layout_md5.update_u32_as_lsb(toc.tracks[track].control & 0x4);
}
}
layout_md5.finish(LayoutMD5);
}
// This if statement will be true if force_module references a system without CDROM support.
if(!MDFNGameInfo->LoadCD)
{
MDFN_PrintError(_("Specified system \"%s\" doesn't support CDs!"), force_module);
return(0);
}
MDFN_printf(_("Using module: %s(%s)\n\n"), MDFNGameInfo->shortname, MDFNGameInfo->fullname);
// TODO: include module name in hash
memcpy(MDFNGameInfo->MD5, LayoutMD5, 16);
if(!(MDFNGameInfo->LoadCD(&CDInterfaces)))
{
for(unsigned i = 0; i < CDInterfaces.size(); i++)
delete CDInterfaces[i];
CDInterfaces.clear();
MDFNGameInfo = NULL;
return(0);
}
//MDFNI_SetLayerEnableMask(~0ULL);
MDFN_ResetMessages(); // Save state, status messages, etc.
MDFN_LoadGameCheats(NULL);
MDFNMP_InstallReadPatches();
return(MDFNGameInfo);
}
#endif
MDFNGI *MDFNI_LoadGame(const char *force_module, const char *name)
{
MDFNFILE GameFile;
std::vector<FileExtensionSpecStruct> valid_iae;
MDFNGameInfo = MDFNGI_CORE;
#ifdef NEED_CD
if(strlen(name) > 4 && (!strcasecmp(name + strlen(name) - 4, ".cue") || !strcasecmp(name + strlen(name) - 4, ".ccd") || !strcasecmp(name + strlen(name) - 4, ".toc") || !strcasecmp(name + strlen(name) - 4, ".m3u")))
return(MDFNI_LoadCD(force_module, name));
#endif
MDFNGameInfo = &EmulatedWSwan;
MDFN_printf(_("Loading %s...\n"),name);
@ -348,21 +148,11 @@ void MDFNI_CloseGame(void)
MDFNMP_Kill();
MDFNGameInfo = NULL;
#ifdef NEED_CD
for(unsigned i = 0; i < CDInterfaces.size(); i++)
delete CDInterfaces[i];
CDInterfaces.clear();
#endif
}
bool MDFNI_InitializeModule(void)
{
#ifdef NEED_CD
CDUtility::CDUtility_Init();
#endif
return(1);
}

View File

@ -21,10 +21,6 @@
#include <string>
#include "settings.h"
#if defined(WANT_GBA_EMU)
uint32_t setting_gba_hle = 1;
#endif
bool MDFN_SaveSettings(const char *path)
{
return(1);
@ -32,18 +28,6 @@ bool MDFN_SaveSettings(const char *path)
uint64 MDFN_GetSettingUI(const char *name)
{
#if defined(WANT_PCFX_EMU)
if (!strcmp("pcfx.cdspeed", name))
return 2;
if (!strcmp("pcfx.slend", name))
return 239;
if (!strcmp("pcfx.slstart", name))
return 0;
if (!strcmp("pcfx.high_dotclock_width", name))
return 1024; /* TODO - make configurable */
if (!strcmp("pcfx.resamp_quality", name))
return 3; /* TODO - make configurable */
#elif defined(WANT_WSWAN_EMU)
if (!strcmp("wswan.ocmultiplier", name))
return 1;
if (!strcmp("wswan.bday", name))
@ -56,7 +40,6 @@ uint64 MDFN_GetSettingUI(const char *name)
return 4;
if (!strcmp("wswan.slend", name))
return 235;
#endif
fprintf(stderr, "unhandled setting UI: %s\n", name);
return 0;
@ -64,30 +47,18 @@ uint64 MDFN_GetSettingUI(const char *name)
int64 MDFN_GetSettingI(const char *name)
{
#if defined(WANT_PCFX_EMU)
if (!strcmp("pcfx.cpu_emulation", name))
return 2;
#elif defined(WANT_WSWAN_EMU)
if (!strcmp("wswan.sex", name))
return 0;
if (!strcmp("wswan.blood", name))
return 0;
#endif
fprintf(stderr, "unhandled setting I: %s\n", name);
return 0;
}
double MDFN_GetSettingF(const char *name)
{
#if defined(WANT_PCFX_EMU)
if (!strcmp("pcfx.resamp_rate_error", name))
return 0.0000009;
if (!strcmp("pcfx.mouse_sensitivity", name))
return 1.25; /* TODO - make configurable */
#elif defined(WANT_WSWAN_EMU)
if (!strcmp("wswan.mouse_sensitivity", name))
return 0.50;
#endif
fprintf(stderr, "unhandled setting F: %s\n", name);
return 0;
@ -100,40 +71,12 @@ bool MDFN_GetSettingB(const char *name)
/* LIBRETRO */
if (!strcmp("libretro.cd_load_into_ram", name))
return 0;
#if defined(WANT_PCFX_EMU)
if (!strcmp("pcfx.disable_softreset", name))
return 0; /* TODO - make configurable */
if (!strcmp("pcfx.disable_softreset", name))
return 0; /* TODO - make configurable */
if (!strcmp("pcfx.input.port1.multitap", name))
return 0; /* TODO - make configurable */
if (!strcmp("pcfx.input.port2.multitap", name))
return 0; /* TODO - make configurable */
if (!strcmp("pcfx.nospritelimit", name))
return 0; /* TODO - make configurable */
if (!strcmp("pcfx.adpcm.suppress_channel_reset_clicks", name))
return 0; /* TODO - make configurable */
if (!strcmp("pcfx.disable_bram", name))
return 0; /* TODO - make configurable */
if (!strcmp("pcfx.adpcm.emulate_buggy_codec", name))
return 0; /* TODO - make configurable */
if (!strcmp("pcfx.rainbow.chromaip", name))
return 0; /* TODO - make configurable */
#elif defined(WANT_SNES_EMU)
if (!strcmp("snes.correct_aspect", name))
return 0;
if (!strcmp("snes.input.port1.multitap", name))
return 0;
if (!strcmp("snes.input.port2.multitap", name))
return 0;
#elif defined(WANT_WSWAN_EMU)
if (!strcmp("wswan.forcemono", name))
return 0;
if (!strcmp("wswan.language", name))
return 1;
if (!strcmp("wswan.correct_aspect", name))
return 1;
#endif
/* CDROM */
if (!strcmp("cdrom.lec_eval", name))
return 1;
@ -151,18 +94,8 @@ extern std::string retro_base_name;
std::string MDFN_GetSettingS(const char *name)
{
#if defined(WANT_GBA_EMU)
if (!strcmp("gba.bios", name))
return setting_gba_hle ? std::string("") : std::string("gba_bios.bin");
#elif defined(WANT_PCFX_EMU)
if (!strcmp("pcfx.bios", name))
return std::string("pcfx.bios");
if (!strcmp("pcfx.fxscsi", name))
return std::string("pcfx.fxscsi");
#elif defined(WANT_WSWAN_EMU)
if (!strcmp("wswan.name", name))
return std::string("Mednafen");
#endif
/* FILESYS */
if (!strcmp("filesys.path_firmware", name))
return retro_base_directory;

View File

@ -3,10 +3,6 @@
#include <string>
#if defined(WANT_GBA_EMU)
extern uint32_t setting_gba_hle;
#endif
bool MDFN_LoadSettings(const char *path, const char *section = NULL, bool override = false);
bool MDFN_MergeSettings(const void*);
bool MDFN_MergeSettings(const std::vector<void> &);

362
threads.c
View File

@ -1,362 +0,0 @@
/* RetroArch - A frontend for libretro.
* Copyright (C) 2010-2014 - Hans-Kristian Arntzen
* Copyright (C) 2011-2014 - Daniel De Matteis
*
* RetroArch is free software: you can redistribute it and/or modify it under the terms
* of the GNU General Public License as published by the Free Software Found-
* ation, either version 3 of the License, or (at your option) any later version.
*
* RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with RetroArch.
* If not, see <http://www.gnu.org/licenses/>.
*/
#include "thread.h"
#include <stdlib.h>
#if defined(_WIN32)
#ifdef _XBOX
#include <xtl.h>
#else
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#endif
#elif defined(GEKKO)
#include "thread/gx_pthread.h"
#else
#include <pthread.h>
#include <time.h>
#endif
#ifdef __MACH__
#include <mach/clock.h>
#include <mach/mach.h>
#endif
struct thread_data
{
void (*func)(void*);
void *userdata;
};
#ifdef _WIN32
struct sthread
{
HANDLE thread;
};
static DWORD CALLBACK thread_wrap(void *data_)
{
struct thread_data *data = (struct thread_data*)data_;
data->func(data->userdata);
free(data);
return 0;
}
sthread_t *sthread_create(void (*thread_func)(void*), void *userdata)
{
sthread_t *thread = (sthread_t*)calloc(1, sizeof(*thread));
if (!thread)
return NULL;
struct thread_data *data = (struct thread_data*)calloc(1, sizeof(*data));
if (!data)
{
free(thread);
return NULL;
}
data->func = thread_func;
data->userdata = userdata;
thread->thread = CreateThread(NULL, 0, thread_wrap, data, 0, NULL);
if (!thread->thread)
{
free(data);
free(thread);
return NULL;
}
return thread;
}
int sthread_detach(sthread_t *thread)
{
CloseHandle(thread->thread);
free(thread);
return 0;
}
void sthread_join(sthread_t *thread)
{
WaitForSingleObject(thread->thread, INFINITE);
CloseHandle(thread->thread);
free(thread);
}
struct slock
{
HANDLE lock;
};
slock_t *slock_new(void)
{
slock_t *lock = (slock_t*)calloc(1, sizeof(*lock));
if (!lock)
return NULL;
lock->lock = CreateMutex(NULL, FALSE, "");
if (!lock->lock)
{
free(lock);
return NULL;
}
return lock;
}
void slock_free(slock_t *lock)
{
CloseHandle(lock->lock);
free(lock);
}
void slock_lock(slock_t *lock)
{
WaitForSingleObject(lock->lock, INFINITE);
}
void slock_unlock(slock_t *lock)
{
ReleaseMutex(lock->lock);
}
struct scond
{
HANDLE event;
};
scond_t *scond_new(void)
{
scond_t *cond = (scond_t*)calloc(1, sizeof(*cond));
if (!cond)
return NULL;
cond->event = CreateEvent(NULL, FALSE, FALSE, NULL);
if (!cond->event)
{
free(cond);
return NULL;
}
return cond;
}
void scond_wait(scond_t *cond, slock_t *lock)
{
WaitForSingleObject(cond->event, 0);
SignalObjectAndWait(lock->lock, cond->event, INFINITE, FALSE);
slock_lock(lock);
}
bool scond_wait_timeout(scond_t *cond, slock_t *lock, int64_t timeout_us)
{
WaitForSingleObject(cond->event, 0);
DWORD res = SignalObjectAndWait(lock->lock, cond->event, (DWORD)(timeout_us) / 1000, FALSE);
slock_lock(lock);
return res == WAIT_OBJECT_0;
}
void scond_signal(scond_t *cond)
{
SetEvent(cond->event);
}
/* FIXME - check how this function should differ from scond_signal implementation */
int scond_broadcast(scond_t *cond)
{
SetEvent(cond->event);
return 0;
}
void scond_free(scond_t *cond)
{
CloseHandle(cond->event);
free(cond);
}
#else
struct sthread
{
pthread_t id;
};
static void *thread_wrap(void *data_)
{
struct thread_data *data = (struct thread_data*)data_;
data->func(data->userdata);
free(data);
return NULL;
}
sthread_t *sthread_create(void (*thread_func)(void*), void *userdata)
{
sthread_t *thr = (sthread_t*)calloc(1, sizeof(*thr));
if (!thr)
return NULL;
struct thread_data *data = (struct thread_data*)calloc(1, sizeof(*data));
if (!data)
{
free(thr);
return NULL;
}
data->func = thread_func;
data->userdata = userdata;
if (pthread_create(&thr->id, NULL, thread_wrap, data) < 0)
{
free(data);
free(thr);
return NULL;
}
return thr;
}
int sthread_detach(sthread_t *thread)
{
return pthread_detach(thread->id);
}
void sthread_join(sthread_t *thread)
{
pthread_join(thread->id, NULL);
free(thread);
}
struct slock
{
pthread_mutex_t lock;
};
slock_t *slock_new(void)
{
slock_t *lock = (slock_t*)calloc(1, sizeof(*lock));
if (!lock)
return NULL;
if (pthread_mutex_init(&lock->lock, NULL) < 0)
{
free(lock);
return NULL;
}
return lock;
}
void slock_free(slock_t *lock)
{
pthread_mutex_destroy(&lock->lock);
free(lock);
}
void slock_lock(slock_t *lock)
{
pthread_mutex_lock(&lock->lock);
}
void slock_unlock(slock_t *lock)
{
pthread_mutex_unlock(&lock->lock);
}
struct scond
{
pthread_cond_t cond;
};
scond_t *scond_new(void)
{
scond_t *cond = (scond_t*)calloc(1, sizeof(*cond));
if (!cond)
return NULL;
if (pthread_cond_init(&cond->cond, NULL) < 0)
{
free(cond);
return NULL;
}
return cond;
}
void scond_free(scond_t *cond)
{
pthread_cond_destroy(&cond->cond);
free(cond);
}
void scond_wait(scond_t *cond, slock_t *lock)
{
pthread_cond_wait(&cond->cond, &lock->lock);
}
int scond_broadcast(scond_t *cond)
{
return pthread_cond_broadcast(&cond->cond);
}
bool scond_wait_timeout(scond_t *cond, slock_t *lock, int64_t timeout_us)
{
struct timespec now = {0};
#ifdef __MACH__ // OSX doesn't have clock_gettime ... :(
clock_serv_t cclock;
mach_timespec_t mts;
host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock);
clock_get_time(cclock, &mts);
mach_port_deallocate(mach_task_self(), cclock);
now.tv_sec = mts.tv_sec;
now.tv_nsec = mts.tv_nsec;
#elif defined(__CELLOS_LV2__)
sys_time_sec_t s;
sys_time_nsec_t n;
sys_time_get_current_time(&s, &n);
now.tv_sec = s;
now.tv_nsec = n;
#elif defined(__mips__)
struct timeval tm;
gettimeofday(&tm, NULL);
now.tv_sec = tm.tv_sec;
now.tv_nsec = tm.tv_usec * 1000;
#elif !defined(GEKKO) // timeout on libogc is duration, not end time
clock_gettime(CLOCK_REALTIME, &now);
#endif
now.tv_sec += timeout_us / 1000000LL;
now.tv_nsec += timeout_us * 1000LL;
now.tv_sec += now.tv_nsec / 1000000000LL;
now.tv_nsec = now.tv_nsec % 1000000000LL;
int ret = pthread_cond_timedwait(&cond->cond, &lock->lock, &now);
return ret == 0;
}
void scond_signal(scond_t *cond)
{
pthread_cond_signal(&cond->cond);
}
#endif