2012-04-10 21:06:17 +00:00
|
|
|
#include "libretro.h"
|
2012-01-02 00:48:51 +00:00
|
|
|
|
|
|
|
#include "snes9x.h"
|
|
|
|
#include "memmap.h"
|
|
|
|
#include "srtc.h"
|
|
|
|
#include "apu/apu.h"
|
2012-03-25 17:47:12 +00:00
|
|
|
#include "apu/bapu/snes/snes.hpp"
|
2012-01-02 00:48:51 +00:00
|
|
|
#include "gfx.h"
|
|
|
|
#include "snapshot.h"
|
|
|
|
#include "controls.h"
|
|
|
|
#include "cheats.h"
|
|
|
|
#include "movie.h"
|
|
|
|
#include "logger.h"
|
|
|
|
#include "display.h"
|
|
|
|
#include "conffile.h"
|
|
|
|
#include <stdio.h>
|
|
|
|
#ifndef __WIN32__
|
|
|
|
#include <unistd.h>
|
|
|
|
#endif
|
|
|
|
#include <sys/stat.h>
|
|
|
|
#include <sys/types.h>
|
|
|
|
#include <fcntl.h>
|
|
|
|
|
2012-04-10 21:06:17 +00:00
|
|
|
static retro_video_refresh_t s9x_video_cb = NULL;
|
|
|
|
static retro_audio_sample_t s9x_audio_cb = NULL;
|
|
|
|
static retro_audio_sample_batch_t s9x_audio_batch_cb = NULL;
|
|
|
|
static retro_input_poll_t s9x_poller_cb = NULL;
|
|
|
|
static retro_input_state_t s9x_input_state_cb = NULL;
|
2012-01-02 00:48:51 +00:00
|
|
|
|
2012-04-10 21:06:17 +00:00
|
|
|
void retro_set_video_refresh(retro_video_refresh_t cb)
|
2012-01-02 00:48:51 +00:00
|
|
|
{
|
|
|
|
s9x_video_cb = cb;
|
|
|
|
}
|
|
|
|
|
2012-04-10 21:06:17 +00:00
|
|
|
void retro_set_audio_sample(retro_audio_sample_t cb)
|
2012-01-02 00:48:51 +00:00
|
|
|
{
|
|
|
|
s9x_audio_cb = cb;
|
|
|
|
}
|
|
|
|
|
2012-04-10 21:06:17 +00:00
|
|
|
void retro_set_audio_sample_batch(retro_audio_sample_batch_t cb)
|
|
|
|
{
|
|
|
|
s9x_audio_batch_cb = cb;
|
|
|
|
}
|
|
|
|
|
|
|
|
void retro_set_input_poll(retro_input_poll_t cb)
|
2012-01-02 00:48:51 +00:00
|
|
|
{
|
|
|
|
s9x_poller_cb = cb;
|
|
|
|
}
|
|
|
|
|
2012-04-10 21:06:17 +00:00
|
|
|
void retro_set_input_state(retro_input_state_t cb)
|
2012-01-02 00:48:51 +00:00
|
|
|
{
|
|
|
|
s9x_input_state_cb = cb;
|
|
|
|
}
|
|
|
|
|
2012-04-10 21:06:17 +00:00
|
|
|
static retro_environment_t environ_cb;
|
2012-05-07 22:03:20 +00:00
|
|
|
static bool use_overscan = false;
|
|
|
|
static bool rom_loaded = false;
|
2012-04-10 21:06:17 +00:00
|
|
|
void retro_set_environment(retro_environment_t cb)
|
2012-01-02 00:48:51 +00:00
|
|
|
{
|
|
|
|
environ_cb = cb;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void S9xAudioCallback(void*)
|
|
|
|
{
|
|
|
|
// Just pick a big buffer. We won't use it all.
|
|
|
|
static int16_t audio_buf[0x10000];
|
|
|
|
|
|
|
|
S9xFinalizeSamples();
|
|
|
|
size_t avail = S9xGetSampleCount();
|
|
|
|
S9xMixSamples((uint8*)audio_buf, avail);
|
2012-04-10 21:06:17 +00:00
|
|
|
s9x_audio_batch_cb(audio_buf,avail >> 1);
|
2012-01-02 00:48:51 +00:00
|
|
|
}
|
|
|
|
|
2012-04-10 21:06:17 +00:00
|
|
|
void retro_get_system_info(struct retro_system_info *info)
|
2012-01-02 00:48:51 +00:00
|
|
|
{
|
2012-04-10 21:06:17 +00:00
|
|
|
memset(info,0,sizeof(retro_system_info));
|
|
|
|
|
|
|
|
info->library_name = "SNES9x";
|
|
|
|
info->library_version = VERSION;
|
|
|
|
info->valid_extensions = "smc|sfc|zip|gz|swc|fig|jma";
|
|
|
|
info->need_fullpath = false;
|
|
|
|
info->block_extract = false;
|
2012-01-02 00:48:51 +00:00
|
|
|
}
|
|
|
|
|
2012-04-10 21:06:17 +00:00
|
|
|
void retro_get_system_av_info(struct retro_system_av_info *info)
|
2012-01-02 00:48:51 +00:00
|
|
|
{
|
2012-04-10 21:06:17 +00:00
|
|
|
memset(info,0,sizeof(retro_system_av_info));
|
|
|
|
|
|
|
|
info->geometry.base_width = SNES_WIDTH;
|
|
|
|
info->geometry.base_height = SNES_HEIGHT;
|
|
|
|
info->geometry.max_width = MAX_SNES_WIDTH;
|
|
|
|
info->geometry.max_height = MAX_SNES_HEIGHT;
|
2012-04-26 11:16:58 +00:00
|
|
|
info->geometry.aspect_ratio = 4.0f / 3.0f;
|
2012-04-10 21:06:17 +00:00
|
|
|
info->timing.sample_rate = 32040.5;
|
|
|
|
info->timing.fps = retro_get_region() == RETRO_REGION_NTSC ? 21477272.0 / 357366.0 : 21281370.0 / 425568.0;
|
2012-01-02 00:48:51 +00:00
|
|
|
}
|
|
|
|
|
2012-04-10 21:06:17 +00:00
|
|
|
const char *retro_library_id()
|
2012-01-02 00:48:51 +00:00
|
|
|
{
|
2012-04-10 21:06:17 +00:00
|
|
|
return "SNES9x v" VERSION;
|
2012-01-02 00:48:51 +00:00
|
|
|
}
|
|
|
|
|
2012-04-10 21:06:17 +00:00
|
|
|
unsigned retro_api_version()
|
2012-01-02 00:48:51 +00:00
|
|
|
{
|
2012-04-10 21:06:17 +00:00
|
|
|
return RETRO_API_VERSION;
|
2012-01-02 00:48:51 +00:00
|
|
|
}
|
|
|
|
|
2012-04-10 21:06:17 +00:00
|
|
|
|
|
|
|
void retro_reset()
|
2012-01-02 00:48:51 +00:00
|
|
|
{
|
|
|
|
S9xSoftReset();
|
|
|
|
}
|
|
|
|
|
|
|
|
static unsigned snes_devices[2];
|
2012-04-10 21:06:17 +00:00
|
|
|
void retro_set_controller_port_device(unsigned port, unsigned device)
|
2012-01-02 00:48:51 +00:00
|
|
|
{
|
|
|
|
switch (device)
|
|
|
|
{
|
2012-04-10 21:06:17 +00:00
|
|
|
case RETRO_DEVICE_JOYPAD:
|
2012-01-02 00:48:51 +00:00
|
|
|
S9xSetController(port, CTL_JOYPAD, 0, 0, 0, 0);
|
2012-04-10 21:06:17 +00:00
|
|
|
snes_devices[port] = RETRO_DEVICE_JOYPAD;
|
2012-01-02 00:48:51 +00:00
|
|
|
break;
|
2012-04-10 21:06:17 +00:00
|
|
|
case RETRO_DEVICE_JOYPAD_MULTITAP:
|
2012-01-02 00:48:51 +00:00
|
|
|
S9xSetController(port, CTL_MP5, 1, 2, 3, 4);
|
2012-04-10 21:06:17 +00:00
|
|
|
snes_devices[port] = RETRO_DEVICE_JOYPAD_MULTITAP;
|
2012-01-02 00:48:51 +00:00
|
|
|
break;
|
2012-04-10 21:06:17 +00:00
|
|
|
case RETRO_DEVICE_MOUSE:
|
2012-01-02 00:48:51 +00:00
|
|
|
S9xSetController(port, CTL_MOUSE, 0, 0, 0, 0);
|
2012-04-10 21:06:17 +00:00
|
|
|
snes_devices[port] = RETRO_DEVICE_MOUSE;
|
2012-01-02 00:48:51 +00:00
|
|
|
break;
|
2012-04-10 21:06:17 +00:00
|
|
|
case RETRO_DEVICE_LIGHTGUN_SUPER_SCOPE:
|
2012-01-02 00:48:51 +00:00
|
|
|
S9xSetController(port, CTL_SUPERSCOPE, 0, 0, 0, 0);
|
2012-04-10 21:06:17 +00:00
|
|
|
snes_devices[port] = RETRO_DEVICE_LIGHTGUN_SUPER_SCOPE;
|
2012-01-02 00:48:51 +00:00
|
|
|
break;
|
2012-04-10 21:06:17 +00:00
|
|
|
case RETRO_DEVICE_LIGHTGUN_JUSTIFIER:
|
2012-01-02 00:48:51 +00:00
|
|
|
S9xSetController(port, CTL_JUSTIFIER, 0, 0, 0, 0);
|
2012-04-10 21:06:17 +00:00
|
|
|
snes_devices[port] = RETRO_DEVICE_LIGHTGUN_JUSTIFIER;
|
2012-01-02 00:48:51 +00:00
|
|
|
break;
|
2012-04-10 21:06:17 +00:00
|
|
|
case RETRO_DEVICE_LIGHTGUN_JUSTIFIERS:
|
2012-01-02 00:48:51 +00:00
|
|
|
S9xSetController(port, CTL_JUSTIFIER, 1, 0, 0, 0);
|
2012-04-10 21:06:17 +00:00
|
|
|
snes_devices[port] = RETRO_DEVICE_LIGHTGUN_JUSTIFIERS;
|
2012-01-02 00:48:51 +00:00
|
|
|
break;
|
|
|
|
default:
|
2012-04-10 21:06:17 +00:00
|
|
|
fprintf(stderr, "[libretro]: Invalid device!\n");
|
2012-01-02 00:48:51 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-04-10 21:06:17 +00:00
|
|
|
void retro_cheat_reset()
|
2012-01-02 00:48:51 +00:00
|
|
|
{}
|
|
|
|
|
2012-04-10 21:06:17 +00:00
|
|
|
void retro_cheat_set(unsigned, bool, const char*)
|
2012-01-02 00:48:51 +00:00
|
|
|
{}
|
|
|
|
|
2012-04-10 21:06:17 +00:00
|
|
|
bool retro_load_game(const struct retro_game_info *game)
|
2012-01-02 00:48:51 +00:00
|
|
|
{
|
2012-04-10 21:06:17 +00:00
|
|
|
|
|
|
|
if(game->data == NULL && game->size == NULL && game->path != NULL)
|
2012-05-07 22:03:20 +00:00
|
|
|
rom_loaded = Memory.LoadROM(game->path);
|
2012-04-10 21:06:17 +00:00
|
|
|
else
|
2012-05-07 22:03:20 +00:00
|
|
|
rom_loaded = Memory.LoadROMMem((const uint8_t*)game->data ,game->size);
|
2012-01-06 19:13:16 +00:00
|
|
|
|
2012-05-07 22:03:20 +00:00
|
|
|
if (!rom_loaded)
|
2012-01-06 19:13:16 +00:00
|
|
|
{
|
2012-04-10 21:06:17 +00:00
|
|
|
fprintf(stderr, "[libretro]: Rom loading failed...\n");
|
2012-01-06 19:13:16 +00:00
|
|
|
}
|
2012-04-10 21:06:17 +00:00
|
|
|
|
2012-05-07 22:03:20 +00:00
|
|
|
return rom_loaded;
|
2012-04-10 21:06:17 +00:00
|
|
|
}
|
2012-01-06 19:13:16 +00:00
|
|
|
|
2012-04-10 21:06:17 +00:00
|
|
|
void retro_unload_game(void)
|
|
|
|
{}
|
2012-01-06 19:13:16 +00:00
|
|
|
|
2012-04-10 21:06:17 +00:00
|
|
|
bool retro_load_game_special(unsigned game_type,
|
|
|
|
const struct retro_game_info *info, size_t num_info) {
|
2012-01-02 00:48:51 +00:00
|
|
|
|
2012-04-10 21:06:17 +00:00
|
|
|
switch (game_type) {
|
|
|
|
case RETRO_GAME_TYPE_BSX:
|
|
|
|
|
|
|
|
if(num_info == 1) {
|
2012-05-07 22:03:20 +00:00
|
|
|
rom_loaded = Memory.LoadROMMem((const uint8_t*)info[0].data,info[0].size);
|
2012-04-10 21:06:17 +00:00
|
|
|
} else if(num_info == 2) {
|
|
|
|
memcpy(Memory.BIOSROM,(const uint8_t*)info[0].data,info[0].size);
|
2012-05-07 22:03:20 +00:00
|
|
|
rom_loaded = Memory.LoadROMMem((const uint8_t*)info[1].data,info[1].size);
|
2012-04-10 21:06:17 +00:00
|
|
|
}
|
2012-01-02 00:48:51 +00:00
|
|
|
|
2012-05-07 22:03:20 +00:00
|
|
|
if (!rom_loaded)
|
2012-04-10 21:06:17 +00:00
|
|
|
{
|
|
|
|
fprintf(stderr, "[libretro]: BSX Rom loading failed...\n");
|
|
|
|
}
|
2012-01-06 19:13:16 +00:00
|
|
|
|
2012-05-07 22:03:20 +00:00
|
|
|
break;
|
2012-04-10 21:06:17 +00:00
|
|
|
|
|
|
|
case RETRO_GAME_TYPE_BSX_SLOTTED:
|
2012-01-06 19:13:16 +00:00
|
|
|
|
2012-04-10 21:06:17 +00:00
|
|
|
if(num_info == 2)
|
2012-05-07 22:03:20 +00:00
|
|
|
rom_loaded = Memory.LoadMultiCartMem((const uint8_t*)info[0].data, info[0].size,
|
2012-04-10 21:06:17 +00:00
|
|
|
(const uint8_t*)info[1].data, info[1].size, NULL, NULL);
|
2012-01-02 00:48:51 +00:00
|
|
|
|
2012-05-07 22:03:20 +00:00
|
|
|
if (!rom_loaded)
|
2012-04-10 21:06:17 +00:00
|
|
|
{
|
|
|
|
fprintf(stderr, "[libretro]: Multirom loading failed...\n");
|
|
|
|
}
|
|
|
|
|
2012-05-07 22:03:20 +00:00
|
|
|
break;
|
2012-04-10 21:06:17 +00:00
|
|
|
|
|
|
|
case RETRO_GAME_TYPE_SUFAMI_TURBO:
|
|
|
|
|
|
|
|
if(num_info == 3)
|
2012-05-07 22:03:20 +00:00
|
|
|
rom_loaded = Memory.LoadMultiCartMem((const uint8_t*)info[1].data, info[1].size,
|
2012-04-10 21:06:17 +00:00
|
|
|
(const uint8_t*)info[2].data, info[2].size, (const uint8_t*)info[0].data, info[0].size);
|
|
|
|
|
2012-05-07 22:03:20 +00:00
|
|
|
if (!rom_loaded)
|
2012-04-10 21:06:17 +00:00
|
|
|
{
|
|
|
|
fprintf(stderr, "[libretro]: Sufami Turbo Rom loading failed...\n");
|
|
|
|
}
|
|
|
|
|
2012-05-07 22:03:20 +00:00
|
|
|
break;
|
2012-04-10 21:06:17 +00:00
|
|
|
|
|
|
|
default:
|
2012-05-07 22:03:20 +00:00
|
|
|
rom_loaded = false;
|
|
|
|
break;
|
2012-04-10 21:06:17 +00:00
|
|
|
}
|
2012-05-07 22:03:20 +00:00
|
|
|
|
|
|
|
return rom_loaded;
|
2012-01-02 00:48:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void map_buttons();
|
|
|
|
|
|
|
|
|
2012-04-10 21:06:17 +00:00
|
|
|
void retro_init()
|
2012-01-02 00:48:51 +00:00
|
|
|
{
|
|
|
|
if (environ_cb)
|
|
|
|
{
|
2012-04-10 21:06:17 +00:00
|
|
|
if (!environ_cb(RETRO_ENVIRONMENT_GET_OVERSCAN, &use_overscan))
|
2012-01-02 00:48:51 +00:00
|
|
|
use_overscan = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
memset(&Settings, 0, sizeof(Settings));
|
|
|
|
Settings.MouseMaster = TRUE;
|
|
|
|
Settings.SuperScopeMaster = TRUE;
|
|
|
|
Settings.JustifierMaster = TRUE;
|
|
|
|
Settings.MultiPlayer5Master = TRUE;
|
|
|
|
Settings.FrameTimePAL = 20000;
|
|
|
|
Settings.FrameTimeNTSC = 16667;
|
|
|
|
Settings.SixteenBitSound = TRUE;
|
|
|
|
Settings.Stereo = TRUE;
|
|
|
|
Settings.SoundPlaybackRate = 32000;
|
|
|
|
Settings.SoundInputRate = 32000;
|
|
|
|
Settings.SupportHiRes = TRUE;
|
|
|
|
Settings.Transparency = TRUE;
|
|
|
|
Settings.AutoDisplayMessages = TRUE;
|
|
|
|
Settings.InitialInfoStringTimeout = 120;
|
|
|
|
Settings.HDMATimingHack = 100;
|
|
|
|
Settings.BlockInvalidVRAMAccessMaster = TRUE;
|
|
|
|
Settings.WrongMovieStateProtection = TRUE;
|
|
|
|
Settings.DumpStreamsMaxFrames = -1;
|
|
|
|
Settings.StretchScreenshots = 0;
|
|
|
|
Settings.SnapshotScreenshots = FALSE;
|
|
|
|
Settings.CartAName[0] = 0;
|
|
|
|
Settings.CartBName[0] = 0;
|
|
|
|
Settings.AutoSaveDelay = 1;
|
|
|
|
|
|
|
|
CPU.Flags = 0;
|
|
|
|
|
|
|
|
if (!Memory.Init() || !S9xInitAPU())
|
|
|
|
{
|
|
|
|
Memory.Deinit();
|
|
|
|
S9xDeinitAPU();
|
2012-04-10 21:06:17 +00:00
|
|
|
fprintf(stderr, "[libretro]: Failed to init Memory or APU.\n");
|
2012-01-02 00:48:51 +00:00
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
S9xInitSound(16, 0);
|
|
|
|
S9xSetSoundMute(FALSE);
|
|
|
|
S9xSetSamplesAvailableCallback(S9xAudioCallback, NULL);
|
|
|
|
|
|
|
|
S9xSetRenderPixelFormat(RGB555);
|
2012-04-10 21:06:17 +00:00
|
|
|
GFX.Pitch = MAX_SNES_WIDTH * sizeof(uint16);
|
|
|
|
GFX.Screen = (uint16*) calloc(1, GFX.Pitch * MAX_SNES_HEIGHT);
|
2012-01-02 00:48:51 +00:00
|
|
|
S9xGraphicsInit();
|
|
|
|
|
|
|
|
S9xInitInputDevices();
|
|
|
|
for (int i = 0; i < 2; i++)
|
|
|
|
{
|
|
|
|
S9xSetController(i, CTL_JOYPAD, i, 0, 0, 0);
|
2012-04-10 21:06:17 +00:00
|
|
|
snes_devices[i] = RETRO_DEVICE_JOYPAD;
|
2012-01-02 00:48:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
S9xUnmapAllControls();
|
|
|
|
map_buttons();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
#define MAP_BUTTON(id, name) S9xMapButton((id), S9xGetCommandT((name)), false)
|
|
|
|
#define MAKE_BUTTON(pad, btn) (((pad)<<4)|(btn))
|
|
|
|
|
|
|
|
#define PAD_1 1
|
|
|
|
#define PAD_2 2
|
|
|
|
#define PAD_3 3
|
|
|
|
#define PAD_4 4
|
|
|
|
#define PAD_5 5
|
|
|
|
|
2012-04-10 21:06:17 +00:00
|
|
|
#define BTN_B RETRO_DEVICE_ID_JOYPAD_B
|
|
|
|
#define BTN_Y RETRO_DEVICE_ID_JOYPAD_Y
|
|
|
|
#define BTN_SELECT RETRO_DEVICE_ID_JOYPAD_SELECT
|
|
|
|
#define BTN_START RETRO_DEVICE_ID_JOYPAD_START
|
|
|
|
#define BTN_UP RETRO_DEVICE_ID_JOYPAD_UP
|
|
|
|
#define BTN_DOWN RETRO_DEVICE_ID_JOYPAD_DOWN
|
|
|
|
#define BTN_LEFT RETRO_DEVICE_ID_JOYPAD_LEFT
|
|
|
|
#define BTN_RIGHT RETRO_DEVICE_ID_JOYPAD_RIGHT
|
|
|
|
#define BTN_A RETRO_DEVICE_ID_JOYPAD_A
|
|
|
|
#define BTN_X RETRO_DEVICE_ID_JOYPAD_X
|
|
|
|
#define BTN_L RETRO_DEVICE_ID_JOYPAD_L
|
|
|
|
#define BTN_R RETRO_DEVICE_ID_JOYPAD_R
|
2012-01-02 00:48:51 +00:00
|
|
|
#define BTN_FIRST BTN_B
|
|
|
|
#define BTN_LAST BTN_R
|
|
|
|
|
2012-04-10 21:06:17 +00:00
|
|
|
#define MOUSE_X RETRO_DEVICE_ID_MOUSE_X
|
|
|
|
#define MOUSE_Y RETRO_DEVICE_ID_MOUSE_Y
|
|
|
|
#define MOUSE_LEFT RETRO_DEVICE_ID_MOUSE_LEFT
|
|
|
|
#define MOUSE_RIGHT RETRO_DEVICE_ID_MOUSE_RIGHT
|
2012-01-02 00:48:51 +00:00
|
|
|
#define MOUSE_FIRST MOUSE_X
|
|
|
|
#define MOUSE_LAST MOUSE_RIGHT
|
|
|
|
|
2012-04-10 21:06:17 +00:00
|
|
|
#define SCOPE_X RETRO_DEVICE_ID_SUPER_SCOPE_X
|
|
|
|
#define SCOPE_Y RETRO_DEVICE_ID_SUPER_SCOPE_Y
|
|
|
|
#define SCOPE_TRIGGER RETRO_DEVICE_ID_LIGHTGUN_TRIGGER
|
|
|
|
#define SCOPE_CURSOR RETRO_DEVICE_ID_LIGHTGUN_CURSOR
|
|
|
|
#define SCOPE_TURBO RETRO_DEVICE_ID_LIGHTGUN_TURBO
|
|
|
|
#define SCOPE_PAUSE RETRO_DEVICE_ID_LIGHTGUN_PAUSE
|
2012-01-02 00:48:51 +00:00
|
|
|
#define SCOPE_FIRST SCOPE_X
|
|
|
|
#define SCOPE_LAST SCOPE_PAUSE
|
|
|
|
|
2012-04-10 21:06:17 +00:00
|
|
|
#define JUSTIFIER_X RETRO_DEVICE_ID_JUSTIFIER_X
|
|
|
|
#define JUSTIFIER_Y RETRO_DEVICE_ID_JUSTIFIER_Y
|
|
|
|
#define JUSTIFIER_TRIGGER RETRO_DEVICE_ID_LIGHTGUN_TRIGGER
|
|
|
|
#define JUSTIFIER_START RETRO_DEVICE_ID_LIGHTGUN_PAUSE
|
2012-01-02 00:48:51 +00:00
|
|
|
#define JUSTIFIER_FIRST JUSTIFIER_X
|
|
|
|
#define JUSTIFIER_LAST JUSTIFIER_START
|
|
|
|
|
|
|
|
#define BTN_POINTER (BTN_LAST + 1)
|
|
|
|
#define BTN_POINTER2 (BTN_POINTER + 1)
|
|
|
|
|
|
|
|
static void map_buttons()
|
|
|
|
{
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_1, BTN_A), "Joypad1 A");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_1, BTN_B), "Joypad1 B");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_1, BTN_X), "Joypad1 X");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_1, BTN_Y), "Joypad1 Y");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_1, BTN_SELECT), "{Joypad1 Select,Mouse1 L}");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_1, BTN_START), "{Joypad1 Start,Mouse1 R}");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_1, BTN_L), "Joypad1 L");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_1, BTN_R), "Joypad1 R");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_1, BTN_LEFT), "Joypad1 Left");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_1, BTN_RIGHT), "Joypad1 Right");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_1, BTN_UP), "Joypad1 Up");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_1, BTN_DOWN), "Joypad1 Down");
|
|
|
|
S9xMapPointer((BTN_POINTER), S9xGetCommandT("Pointer Mouse1+Superscope+Justifier1"), false);
|
|
|
|
S9xMapPointer((BTN_POINTER2), S9xGetCommandT("Pointer Mouse2"), false);
|
|
|
|
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_2, BTN_A), "Joypad2 A");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_2, BTN_B), "Joypad2 B");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_2, BTN_X), "Joypad2 X");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_2, BTN_Y), "Joypad2 Y");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_2, BTN_SELECT), "{Joypad2 Select,Mouse2 L,Superscope Fire,Justifier1 Trigger}");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_2, BTN_START), "{Joypad2 Start,Mouse2 R,Superscope Cursor,Justifier1 Start}");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_2, BTN_L), "Joypad2 L");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_2, BTN_R), "Joypad2 R");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_2, BTN_LEFT), "Joypad2 Left");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_2, BTN_RIGHT), "Joypad2 Right");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_2, BTN_UP), "{Joypad2 Up,Superscope ToggleTurbo}");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_2, BTN_DOWN), "{Joypad2 Down,Superscope Pause}");
|
|
|
|
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_3, BTN_A), "Joypad3 A");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_3, BTN_B), "Joypad3 B");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_3, BTN_X), "Joypad3 X");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_3, BTN_Y), "Joypad3 Y");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_3, BTN_SELECT), "Joypad3 Select");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_3, BTN_START), "Joypad3 Start");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_3, BTN_L), "Joypad3 L");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_3, BTN_R), "Joypad3 R");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_3, BTN_LEFT), "Joypad3 Left");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_3, BTN_RIGHT), "Joypad3 Right");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_3, BTN_UP), "Joypad3 Up");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_3, BTN_DOWN), "Joypad3 Down");
|
|
|
|
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_4, BTN_A), "Joypad4 A");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_4, BTN_B), "Joypad4 B");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_4, BTN_X), "Joypad4 X");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_4, BTN_Y), "Joypad4 Y");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_4, BTN_SELECT), "Joypad4 Select");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_4, BTN_START), "Joypad4 Start");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_4, BTN_L), "Joypad4 L");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_4, BTN_R), "Joypad4 R");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_4, BTN_LEFT), "Joypad4 Left");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_4, BTN_RIGHT), "Joypad4 Right");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_4, BTN_UP), "Joypad4 Up");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_4, BTN_DOWN), "Joypad4 Down");
|
|
|
|
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_5, BTN_A), "Joypad5 A");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_5, BTN_B), "Joypad5 B");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_5, BTN_X), "Joypad5 X");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_5, BTN_Y), "Joypad5 Y");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_5, BTN_SELECT), "Joypad5 Select");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_5, BTN_START), "Joypad5 Start");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_5, BTN_L), "Joypad5 L");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_5, BTN_R), "Joypad5 R");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_5, BTN_LEFT), "Joypad5 Left");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_5, BTN_RIGHT), "Joypad5 Right");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_5, BTN_UP), "Joypad5 Up");
|
|
|
|
MAP_BUTTON(MAKE_BUTTON(PAD_5, BTN_DOWN), "Joypad5 Down");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2012-04-10 21:06:17 +00:00
|
|
|
// libretro uses relative values for analogue devices.
|
2012-01-02 00:48:51 +00:00
|
|
|
// S9x seems to use absolute values, but do convert these into relative values in the core. (Why?!)
|
|
|
|
// Hack around it. :)
|
|
|
|
static int16_t snes_mouse_state[2][2] = {{0}, {0}};
|
|
|
|
static int16_t snes_scope_state[2] = {0};
|
|
|
|
static int16_t snes_justifier_state[2][2] = {{0}, {0}};
|
|
|
|
static void report_buttons()
|
|
|
|
{
|
|
|
|
int _x, _y;
|
2012-04-10 21:06:17 +00:00
|
|
|
for (int port = 0; port <= 1; port++)
|
2012-01-02 00:48:51 +00:00
|
|
|
{
|
|
|
|
switch (snes_devices[port])
|
|
|
|
{
|
2012-04-10 21:06:17 +00:00
|
|
|
case RETRO_DEVICE_JOYPAD:
|
2012-01-02 00:48:51 +00:00
|
|
|
for (int i = BTN_FIRST; i <= BTN_LAST; i++)
|
2012-04-10 21:06:17 +00:00
|
|
|
S9xReportButton(MAKE_BUTTON(port + 1, i), s9x_input_state_cb(port, RETRO_DEVICE_JOYPAD, 0, i));
|
2012-01-02 00:48:51 +00:00
|
|
|
break;
|
|
|
|
|
2012-04-10 21:06:17 +00:00
|
|
|
case RETRO_DEVICE_JOYPAD_MULTITAP:
|
2012-01-02 00:48:51 +00:00
|
|
|
for (int j = 0; j < 4; j++)
|
|
|
|
for (int i = BTN_FIRST; i <= BTN_LAST; i++)
|
2012-04-10 21:06:17 +00:00
|
|
|
S9xReportButton(MAKE_BUTTON(j + 2, i), s9x_input_state_cb(port, RETRO_DEVICE_JOYPAD_MULTITAP, j, i));
|
2012-01-02 00:48:51 +00:00
|
|
|
break;
|
|
|
|
|
2012-04-10 21:06:17 +00:00
|
|
|
case RETRO_DEVICE_MOUSE:
|
|
|
|
_x = s9x_input_state_cb(port, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_X);
|
|
|
|
_y = s9x_input_state_cb(port, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_Y);
|
2012-01-02 00:48:51 +00:00
|
|
|
snes_mouse_state[port][0] += _x;
|
|
|
|
snes_mouse_state[port][1] += _y;
|
|
|
|
S9xReportPointer(BTN_POINTER + port, snes_mouse_state[port][0], snes_mouse_state[port][1]);
|
|
|
|
for (int i = MOUSE_LEFT; i <= MOUSE_LAST; i++)
|
2012-04-10 21:06:17 +00:00
|
|
|
S9xReportButton(MAKE_BUTTON(port + 1, i), s9x_input_state_cb(port, RETRO_DEVICE_MOUSE, 0, i));
|
2012-01-02 00:48:51 +00:00
|
|
|
break;
|
|
|
|
|
2012-04-10 21:06:17 +00:00
|
|
|
case RETRO_DEVICE_LIGHTGUN_SUPER_SCOPE:
|
|
|
|
snes_scope_state[0] += s9x_input_state_cb(port, RETRO_DEVICE_LIGHTGUN_SUPER_SCOPE, 0, RETRO_DEVICE_ID_LIGHTGUN_X);
|
|
|
|
snes_scope_state[1] += s9x_input_state_cb(port, RETRO_DEVICE_LIGHTGUN_SUPER_SCOPE, 0, RETRO_DEVICE_ID_LIGHTGUN_Y);
|
2012-01-02 00:48:51 +00:00
|
|
|
S9xReportPointer(BTN_POINTER, snes_scope_state[0], snes_scope_state[1]);
|
|
|
|
for (int i = SCOPE_TRIGGER; i <= SCOPE_LAST; i++)
|
2012-04-10 21:06:17 +00:00
|
|
|
S9xReportButton(MAKE_BUTTON(port + 1, i), s9x_input_state_cb(port, RETRO_DEVICE_LIGHTGUN_SUPER_SCOPE, 0, i));
|
2012-01-02 00:48:51 +00:00
|
|
|
break;
|
|
|
|
|
2012-04-10 21:06:17 +00:00
|
|
|
case RETRO_DEVICE_LIGHTGUN_JUSTIFIER:
|
|
|
|
case RETRO_DEVICE_LIGHTGUN_JUSTIFIERS:
|
|
|
|
snes_justifier_state[0][0] += s9x_input_state_cb(port, RETRO_DEVICE_LIGHTGUN_JUSTIFIER, 0, RETRO_DEVICE_ID_LIGHTGUN_X);
|
|
|
|
snes_justifier_state[0][1] += s9x_input_state_cb(port, RETRO_DEVICE_LIGHTGUN_JUSTIFIER, 0, RETRO_DEVICE_ID_LIGHTGUN_Y);
|
2012-01-02 00:48:51 +00:00
|
|
|
S9xReportPointer(BTN_POINTER, snes_justifier_state[0][0], snes_justifier_state[0][1]);
|
|
|
|
for (int i = JUSTIFIER_TRIGGER; i <= JUSTIFIER_LAST; i++)
|
2012-04-10 21:06:17 +00:00
|
|
|
S9xReportButton(MAKE_BUTTON(port + 1, i), s9x_input_state_cb(port, RETRO_DEVICE_LIGHTGUN_JUSTIFIER, 0, i));
|
2012-01-02 00:48:51 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
2012-04-10 21:06:17 +00:00
|
|
|
fprintf(stderr, "[libretro]: Unknown device...\n");
|
2012-01-02 00:48:51 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-04-10 21:06:17 +00:00
|
|
|
void retro_run()
|
2012-01-02 00:48:51 +00:00
|
|
|
{
|
|
|
|
s9x_poller_cb();
|
|
|
|
report_buttons();
|
|
|
|
S9xMainLoop();
|
|
|
|
}
|
|
|
|
|
2012-04-10 21:06:17 +00:00
|
|
|
void retro_deinit()
|
2012-01-02 00:48:51 +00:00
|
|
|
{
|
|
|
|
S9xDeinitAPU();
|
|
|
|
Memory.Deinit();
|
|
|
|
S9xGraphicsDeinit();
|
|
|
|
S9xUnmapAllControls();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2012-04-10 21:06:17 +00:00
|
|
|
unsigned retro_get_region()
|
2012-01-02 00:48:51 +00:00
|
|
|
{
|
2012-04-10 21:06:17 +00:00
|
|
|
return Settings.PAL ? RETRO_REGION_PAL : RETRO_REGION_NTSC;
|
2012-01-02 00:48:51 +00:00
|
|
|
}
|
|
|
|
|
2012-04-10 21:06:17 +00:00
|
|
|
void* retro_get_memory_data(unsigned type)
|
2012-01-02 00:48:51 +00:00
|
|
|
{
|
2012-04-10 21:06:17 +00:00
|
|
|
void* data;
|
2012-01-02 00:48:51 +00:00
|
|
|
|
|
|
|
switch(type) {
|
2012-04-10 21:06:17 +00:00
|
|
|
case RETRO_MEMORY_SNES_SUFAMI_TURBO_A_RAM:
|
|
|
|
case RETRO_MEMORY_SAVE_RAM:
|
2012-01-02 00:48:51 +00:00
|
|
|
data = Memory.SRAM;
|
|
|
|
break;
|
2012-04-10 21:06:17 +00:00
|
|
|
case RETRO_MEMORY_SNES_SUFAMI_TURBO_B_RAM:
|
2012-01-06 19:13:16 +00:00
|
|
|
data = Multi.sramB;
|
|
|
|
break;
|
2012-04-10 21:06:17 +00:00
|
|
|
case RETRO_MEMORY_RTC:
|
2012-01-02 00:48:51 +00:00
|
|
|
data = RTCData.reg;
|
|
|
|
break;
|
2012-04-10 21:06:17 +00:00
|
|
|
case RETRO_MEMORY_SYSTEM_RAM:
|
2012-01-02 00:48:51 +00:00
|
|
|
data = Memory.RAM;
|
2012-04-26 11:16:58 +00:00
|
|
|
break;
|
|
|
|
case RETRO_MEMORY_VIDEO_RAM:
|
|
|
|
data = Memory.VRAM;
|
|
|
|
break;
|
2012-01-02 00:48:51 +00:00
|
|
|
default:
|
|
|
|
data = NULL;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return data;
|
|
|
|
}
|
|
|
|
|
2012-04-10 21:06:17 +00:00
|
|
|
void retro_unload_cartridge()
|
2012-01-02 00:48:51 +00:00
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2012-04-10 21:06:17 +00:00
|
|
|
size_t retro_get_memory_size(unsigned type)
|
2012-01-02 00:48:51 +00:00
|
|
|
{
|
2012-04-10 21:06:17 +00:00
|
|
|
size_t size;
|
2012-01-02 00:48:51 +00:00
|
|
|
|
|
|
|
switch(type) {
|
2012-04-10 21:06:17 +00:00
|
|
|
case RETRO_MEMORY_SNES_SUFAMI_TURBO_A_RAM:
|
|
|
|
case RETRO_MEMORY_SAVE_RAM:
|
2012-01-02 00:48:51 +00:00
|
|
|
size = (unsigned) (Memory.SRAMSize ? (1 << (Memory.SRAMSize + 3)) * 128 : 0);
|
|
|
|
if (size > 0x20000)
|
|
|
|
size = 0x20000;
|
|
|
|
break;
|
2012-04-10 21:06:17 +00:00
|
|
|
case RETRO_MEMORY_SNES_SUFAMI_TURBO_B_RAM:
|
2012-01-06 19:13:16 +00:00
|
|
|
size = (unsigned) (Multi.cartType && Multi.sramSizeB ? (1 << (Multi.sramSizeB + 3)) * 128 : 0);
|
|
|
|
break;
|
2012-04-10 21:06:17 +00:00
|
|
|
case RETRO_MEMORY_RTC:
|
2012-01-02 00:48:51 +00:00
|
|
|
size = (Settings.SRTC || Settings.SPC7110RTC)?20:0;
|
|
|
|
break;
|
2012-04-26 11:16:58 +00:00
|
|
|
case RETRO_MEMORY_SYSTEM_RAM:
|
|
|
|
size = 128 * 1024;
|
|
|
|
break;
|
|
|
|
case RETRO_MEMORY_VIDEO_RAM:
|
|
|
|
size = 64 * 1024;
|
|
|
|
break;
|
2012-01-02 00:48:51 +00:00
|
|
|
default:
|
|
|
|
size = 0;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return size;
|
|
|
|
}
|
|
|
|
|
2012-04-10 21:06:17 +00:00
|
|
|
size_t retro_serialize_size()
|
2012-01-02 00:48:51 +00:00
|
|
|
{
|
2012-05-07 22:03:20 +00:00
|
|
|
return rom_loaded ? S9xFreezeSize() : 0;
|
2012-01-02 00:48:51 +00:00
|
|
|
}
|
|
|
|
|
2012-04-15 19:46:09 +00:00
|
|
|
bool retro_serialize(void *data, size_t size)
|
2012-01-02 00:48:51 +00:00
|
|
|
{
|
2012-04-15 19:46:09 +00:00
|
|
|
if (S9xFreezeGameMem((uint8_t*)data,size) == FALSE)
|
2012-01-02 00:48:51 +00:00
|
|
|
return false;
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2012-04-15 19:46:09 +00:00
|
|
|
bool retro_unserialize(const void* data, size_t size)
|
2012-01-02 00:48:51 +00:00
|
|
|
{
|
2012-04-15 19:46:09 +00:00
|
|
|
if (S9xUnfreezeGameMem((const uint8_t*)data,size) != SUCCESS)
|
2012-01-02 00:48:51 +00:00
|
|
|
return false;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool8 S9xDeinitUpdate(int width, int height)
|
|
|
|
{
|
2012-04-10 21:06:17 +00:00
|
|
|
if (!use_overscan)
|
2012-01-02 00:48:51 +00:00
|
|
|
{
|
2012-04-10 21:06:17 +00:00
|
|
|
if (height >= SNES_HEIGHT << 1)
|
2012-01-02 00:48:51 +00:00
|
|
|
{
|
2012-04-10 21:06:17 +00:00
|
|
|
height = SNES_HEIGHT << 1;
|
2012-01-02 00:48:51 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2012-04-10 21:06:17 +00:00
|
|
|
height = SNES_HEIGHT;
|
2012-01-02 00:48:51 +00:00
|
|
|
}
|
|
|
|
}
|
2012-04-15 19:44:25 +00:00
|
|
|
else
|
|
|
|
{
|
|
|
|
if (height > SNES_HEIGHT_EXTENDED)
|
|
|
|
{
|
|
|
|
if (height < SNES_HEIGHT_EXTENDED << 1)
|
|
|
|
memset(GFX.Screen + (GFX.Pitch >> 1) * height,0,GFX.Pitch * ((SNES_HEIGHT_EXTENDED << 1) - height));
|
|
|
|
height = SNES_HEIGHT_EXTENDED << 1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (height < SNES_HEIGHT_EXTENDED)
|
|
|
|
memset(GFX.Screen + (GFX.Pitch >> 1) * height,0,GFX.Pitch * (SNES_HEIGHT_EXTENDED - height));
|
|
|
|
height = SNES_HEIGHT_EXTENDED;
|
|
|
|
}
|
|
|
|
}
|
2012-01-02 00:48:51 +00:00
|
|
|
|
2012-04-10 21:06:17 +00:00
|
|
|
s9x_video_cb(GFX.Screen, width, height, GFX.Pitch);
|
2012-01-02 00:48:51 +00:00
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool8 S9xContinueUpdate(int width, int height)
|
|
|
|
{
|
|
|
|
return S9xDeinitUpdate(width, height);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Dummy functions that should probably be implemented correctly later.
|
|
|
|
void S9xParsePortConfig(ConfigFile&, int) {}
|
|
|
|
void S9xSyncSpeed() {}
|
|
|
|
const char* S9xStringInput(const char* in) { return in; }
|
|
|
|
const char* S9xGetFilename(const char* in, s9x_getdirtype) { return in; }
|
2012-01-28 00:52:28 +00:00
|
|
|
const char* S9xGetDirectory(s9x_getdirtype) { return ""; }
|
2012-01-02 00:48:51 +00:00
|
|
|
void S9xInitInputDevices() {}
|
2012-01-28 00:52:28 +00:00
|
|
|
const char* S9xChooseFilename(unsigned char) { return ""; }
|
2012-01-02 00:48:51 +00:00
|
|
|
void S9xHandlePortCommand(s9xcommand_t, short, short) {}
|
|
|
|
bool S9xPollButton(unsigned int, bool*) { return false; }
|
|
|
|
void S9xToggleSoundChannel(int) {}
|
2012-01-28 00:52:28 +00:00
|
|
|
const char* S9xGetFilenameInc(const char* in, s9x_getdirtype) { return ""; }
|
2012-01-02 00:48:51 +00:00
|
|
|
const char* S9xBasename(const char* in) { return in; }
|
|
|
|
bool8 S9xInitUpdate() { return TRUE; }
|
|
|
|
void S9xExtraUsage() {}
|
|
|
|
bool8 S9xOpenSoundDevice() { return TRUE; }
|
|
|
|
void S9xMessage(int, int, const char*) {}
|
|
|
|
bool S9xPollAxis(unsigned int, short*) { return FALSE; }
|
|
|
|
void S9xSetPalette() {}
|
|
|
|
void S9xParseArg(char**, int&, int) {}
|
|
|
|
void S9xExit() {}
|
|
|
|
bool S9xPollPointer(unsigned int, short*, short*) { return false; }
|
|
|
|
const char *S9xChooseMovieFilename(unsigned char) { return NULL; }
|
|
|
|
|
|
|
|
bool8 S9xOpenSnapshotFile(const char* filepath, bool8 read_only, STREAM *file)
|
|
|
|
{
|
|
|
|
if(read_only)
|
|
|
|
{
|
|
|
|
if((*file = OPEN_STREAM(filepath, "rb")) != 0)
|
|
|
|
{
|
|
|
|
return (TRUE);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if((*file = OPEN_STREAM(filepath, "wb")) != 0)
|
|
|
|
{
|
|
|
|
return (TRUE);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return (FALSE);
|
|
|
|
}
|
|
|
|
|
|
|
|
void S9xCloseSnapshotFile(STREAM file)
|
|
|
|
{
|
|
|
|
CLOSE_STREAM(file);
|
|
|
|
}
|
|
|
|
|
|
|
|
void S9xAutoSaveSRAM()
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifndef __WIN32__
|
|
|
|
// S9x weirdness.
|
|
|
|
void _splitpath (const char *path, char *drive, char *dir, char *fname, char *ext)
|
|
|
|
{
|
|
|
|
*drive = 0;
|
|
|
|
|
|
|
|
const char *slash = strrchr(path, SLASH_CHAR),
|
|
|
|
*dot = strrchr(path, '.');
|
|
|
|
|
|
|
|
if (dot && slash && dot < slash)
|
|
|
|
dot = NULL;
|
|
|
|
|
|
|
|
if (!slash)
|
|
|
|
{
|
|
|
|
*dir = 0;
|
|
|
|
|
|
|
|
strcpy(fname, path);
|
|
|
|
|
|
|
|
if (dot)
|
|
|
|
{
|
|
|
|
fname[dot - path] = 0;
|
|
|
|
strcpy(ext, dot + 1);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
*ext = 0;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
strcpy(dir, path);
|
|
|
|
dir[slash - path] = 0;
|
|
|
|
|
|
|
|
strcpy(fname, slash + 1);
|
|
|
|
|
|
|
|
if (dot)
|
|
|
|
{
|
|
|
|
fname[dot - slash - 1] = 0;
|
|
|
|
strcpy(ext, dot + 1);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
*ext = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void _makepath (char *path, const char *, const char *dir, const char *fname, const char *ext)
|
|
|
|
{
|
|
|
|
if (dir && *dir)
|
|
|
|
{
|
|
|
|
strcpy(path, dir);
|
|
|
|
strcat(path, SLASH_STR);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
*path = 0;
|
|
|
|
|
|
|
|
strcat(path, fname);
|
|
|
|
|
|
|
|
if (ext && *ext)
|
|
|
|
{
|
|
|
|
strcat(path, ".");
|
|
|
|
strcat(path, ext);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif // __WIN32__
|