diff --git a/libretro/libretro.cpp b/libretro/libretro.cpp index c8e616d8..758180eb 100644 --- a/libretro/libretro.cpp +++ b/libretro/libretro.cpp @@ -35,11 +35,11 @@ #define RETRO_MEMORY_SNES_GAME_BOY_RAM ((5 << 8) | RETRO_MEMORY_SAVE_RAM) #define RETRO_MEMORY_SNES_GAME_BOY_RTC ((6 << 8) | RETRO_MEMORY_RTC) -#define RETRO_GAME_TYPE_BSX 0x101 | 0x1000 -#define RETRO_GAME_TYPE_BSX_SLOTTED 0x102 | 0x1000 -#define RETRO_GAME_TYPE_SUFAMI_TURBO 0x103 | 0x1000 +#define RETRO_GAME_TYPE_BSX 0x101 | 0x1000 +#define RETRO_GAME_TYPE_BSX_SLOTTED 0x102 | 0x1000 +#define RETRO_GAME_TYPE_SUFAMI_TURBO 0x103 | 0x1000 #define RETRO_GAME_TYPE_SUPER_GAME_BOY 0x104 | 0x1000 -#define RETRO_GAME_TYPE_MULTI_CART 0x105 | 0x1000 +#define RETRO_GAME_TYPE_MULTI_CART 0x105 | 0x1000 #define SNES_4_3 4.0f / 3.0f @@ -63,61 +63,61 @@ static retro_input_state_t input_state_cb = NULL; static void extract_basename(char *buf, const char *path, size_t size) { - const char *base = strrchr(path, '/'); - if (!base) - base = strrchr(path, '\\'); - if (!base) - base = path; + const char *base = strrchr(path, '/'); + if (!base) + base = strrchr(path, '\\'); + if (!base) + base = path; - if (*base == '\\' || *base == '/') - base++; + if (*base == '\\' || *base == '/') + base++; - strncpy(buf, base, size - 1); - buf[size - 1] = '\0'; + strncpy(buf, base, size - 1); + buf[size - 1] = '\0'; - char *ext = strrchr(buf, '.'); - if (ext) - *ext = '\0'; + char *ext = strrchr(buf, '.'); + if (ext) + *ext = '\0'; } static void extract_directory(char *buf, const char *path, size_t size) { - strncpy(buf, path, size - 1); - buf[size - 1] = '\0'; + strncpy(buf, path, size - 1); + buf[size - 1] = '\0'; - char *base = strrchr(buf, '/'); - if (!base) - base = strrchr(buf, '\\'); + char *base = strrchr(buf, '/'); + if (!base) + base = strrchr(buf, '\\'); - if (base) - *base = '\0'; - else - buf[0] = '\0'; + if (base) + *base = '\0'; + else + buf[0] = '\0'; } void retro_set_video_refresh(retro_video_refresh_t cb) { - video_cb = cb; + video_cb = cb; } void retro_set_audio_sample(retro_audio_sample_t cb) { - audio_cb = cb; + audio_cb = cb; } void retro_set_audio_sample_batch(retro_audio_sample_batch_t cb) { - audio_batch_cb = cb; + audio_batch_cb = cb; } void retro_set_input_poll(retro_input_poll_t cb) { - poll_cb = cb; + poll_cb = cb; } void retro_set_input_state(retro_input_state_t cb) { - input_state_cb = cb; + input_state_cb = cb; } enum overscan_mode { @@ -139,232 +139,232 @@ static bool rom_loaded = false; void retro_set_environment(retro_environment_t cb) { - environ_cb = cb; + environ_cb = cb; - static const struct retro_subsystem_memory_info multi_a_memory[] = { - { "srm", RETRO_MEMORY_SNES_SUFAMI_TURBO_A_RAM }, - }; + static const struct retro_subsystem_memory_info multi_a_memory[] = { + { "srm", RETRO_MEMORY_SNES_SUFAMI_TURBO_A_RAM }, + }; - static const struct retro_subsystem_memory_info multi_b_memory[] = { - { "srm", RETRO_MEMORY_SNES_SUFAMI_TURBO_B_RAM }, - }; + static const struct retro_subsystem_memory_info multi_b_memory[] = { + { "srm", RETRO_MEMORY_SNES_SUFAMI_TURBO_B_RAM }, + }; - static const struct retro_subsystem_rom_info multicart_roms[] = { - { "Cart A", "smc|sfc|swc|fig|bs", false, false, false, multi_a_memory, 1 }, - { "Add-On B", "smc|sfc|swc|fig|bs", false, false, false, multi_b_memory, 1 }, - }; + static const struct retro_subsystem_rom_info multicart_roms[] = { + { "Cart A", "smc|sfc|swc|fig|bs", false, false, false, multi_a_memory, 1 }, + { "Add-On B", "smc|sfc|swc|fig|bs", false, false, false, multi_b_memory, 1 }, + }; - static const struct retro_subsystem_info subsystems[] = { - { "Multi-Cart Link", "multicart_addon", multicart_roms, 2, RETRO_GAME_TYPE_MULTI_CART }, - {} - }; + static const struct retro_subsystem_info subsystems[] = { + { "Multi-Cart Link", "multicart_addon", multicart_roms, 2, RETRO_GAME_TYPE_MULTI_CART }, + {} + }; - cb(RETRO_ENVIRONMENT_SET_SUBSYSTEM_INFO, (void*)subsystems); + cb(RETRO_ENVIRONMENT_SET_SUBSYSTEM_INFO, (void*)subsystems); - struct retro_variable variables[] = { - // These variable names and possible values constitute an ABI with ZMZ (ZSNES Libretro player). - // Changing "Show layer 1" is fine, but don't change "layer_1"/etc or the possible values ("Yes|No"). - // Adding more variables and rearranging them is safe. - { "snes9x_up_down_allowed", "Allow Opposing Directions; disabled|enabled" }, - { "snes9x_hires_blend", "Hires Blending; disabled|enabled" }, - { "snes9x_overclock", "SuperFX Frequency; 100%|200%|400%|600%|800%|1000%" }, - //{ "snes9x_overclock_cycles", "Reduce Slowdown (Hack, Unsafe); disabled|compatible|max" }, - //{ "snes9x_reduce_sprite_flicker", "Reduce Flickering (Hack, Unsafe); disabled|enabled" }, - { "snes9x_layer_1", "Show layer 1; enabled|disabled" }, - { "snes9x_layer_2", "Show layer 2; enabled|disabled" }, - { "snes9x_layer_3", "Show layer 3; enabled|disabled" }, - { "snes9x_layer_4", "Show layer 4; enabled|disabled" }, - { "snes9x_layer_5", "Show sprite layer; enabled|disabled" }, - { "snes9x_gfx_clip", "Enable graphic clip windows; enabled|disabled" }, - { "snes9x_gfx_transp", "Enable transparency effects; enabled|disabled" }, - { "snes9x_gfx_hires", "Enable hires mode; enabled|disabled" }, - { "snes9x_sndchan_1", "Enable sound channel 1; enabled|disabled" }, - { "snes9x_sndchan_2", "Enable sound channel 2; enabled|disabled" }, - { "snes9x_sndchan_3", "Enable sound channel 3; enabled|disabled" }, - { "snes9x_sndchan_4", "Enable sound channel 4; enabled|disabled" }, - { "snes9x_sndchan_5", "Enable sound channel 5; enabled|disabled" }, - { "snes9x_sndchan_6", "Enable sound channel 6; enabled|disabled" }, - { "snes9x_sndchan_7", "Enable sound channel 7; enabled|disabled" }, - { "snes9x_sndchan_8", "Enable sound channel 8; enabled|disabled" }, - { "snes9x_overscan", "Crop overscan; enabled|disabled|auto" }, - { "snes9x_aspect", "Preferred aspect ratio; 4:3|8:7|auto|ntsc|pal" }, - { NULL, NULL }, - }; + struct retro_variable variables[] = { + // These variable names and possible values constitute an ABI with ZMZ (ZSNES Libretro player). + // Changing "Show layer 1" is fine, but don't change "layer_1"/etc or the possible values ("Yes|No"). + // Adding more variables and rearranging them is safe. + { "snes9x_up_down_allowed", "Allow Opposing Directions; disabled|enabled" }, + { "snes9x_hires_blend", "Hires Blending; disabled|enabled" }, + { "snes9x_overclock", "SuperFX Frequency; 100%|200%|400%|600%|800%|1000%" }, + //{ "snes9x_overclock_cycles", "Reduce Slowdown (Hack, Unsafe); disabled|compatible|max" }, + //{ "snes9x_reduce_sprite_flicker", "Reduce Flickering (Hack, Unsafe); disabled|enabled" }, + { "snes9x_layer_1", "Show layer 1; enabled|disabled" }, + { "snes9x_layer_2", "Show layer 2; enabled|disabled" }, + { "snes9x_layer_3", "Show layer 3; enabled|disabled" }, + { "snes9x_layer_4", "Show layer 4; enabled|disabled" }, + { "snes9x_layer_5", "Show sprite layer; enabled|disabled" }, + { "snes9x_gfx_clip", "Enable graphic clip windows; enabled|disabled" }, + { "snes9x_gfx_transp", "Enable transparency effects; enabled|disabled" }, + { "snes9x_gfx_hires", "Enable hires mode; enabled|disabled" }, + { "snes9x_sndchan_1", "Enable sound channel 1; enabled|disabled" }, + { "snes9x_sndchan_2", "Enable sound channel 2; enabled|disabled" }, + { "snes9x_sndchan_3", "Enable sound channel 3; enabled|disabled" }, + { "snes9x_sndchan_4", "Enable sound channel 4; enabled|disabled" }, + { "snes9x_sndchan_5", "Enable sound channel 5; enabled|disabled" }, + { "snes9x_sndchan_6", "Enable sound channel 6; enabled|disabled" }, + { "snes9x_sndchan_7", "Enable sound channel 7; enabled|disabled" }, + { "snes9x_sndchan_8", "Enable sound channel 8; enabled|disabled" }, + { "snes9x_overscan", "Crop overscan; enabled|disabled|auto" }, + { "snes9x_aspect", "Preferred aspect ratio; 4:3|8:7|auto|ntsc|pal" }, + { NULL, NULL }, + }; - environ_cb(RETRO_ENVIRONMENT_SET_VARIABLES, variables); + environ_cb(RETRO_ENVIRONMENT_SET_VARIABLES, variables); - const struct retro_controller_description port_1[] = { - { "SNES Joypad", RETRO_DEVICE_JOYPAD }, - { "SNES Mouse", RETRO_DEVICE_MOUSE }, - { "Multitap", RETRO_DEVICE_JOYPAD_MULTITAP }, - }; + const struct retro_controller_description port_1[] = { + { "SNES Joypad", RETRO_DEVICE_JOYPAD }, + { "SNES Mouse", RETRO_DEVICE_MOUSE }, + { "Multitap", RETRO_DEVICE_JOYPAD_MULTITAP }, + }; - const struct retro_controller_description port_2[] = { - { "SNES Joypad", RETRO_DEVICE_JOYPAD }, - { "SNES Mouse", RETRO_DEVICE_MOUSE }, - { "Multitap", RETRO_DEVICE_JOYPAD_MULTITAP }, - { "SuperScope", RETRO_DEVICE_LIGHTGUN_SUPER_SCOPE }, - { "Justifier", RETRO_DEVICE_LIGHTGUN_JUSTIFIER }, - }; + const struct retro_controller_description port_2[] = { + { "SNES Joypad", RETRO_DEVICE_JOYPAD }, + { "SNES Mouse", RETRO_DEVICE_MOUSE }, + { "Multitap", RETRO_DEVICE_JOYPAD_MULTITAP }, + { "SuperScope", RETRO_DEVICE_LIGHTGUN_SUPER_SCOPE }, + { "Justifier", RETRO_DEVICE_LIGHTGUN_JUSTIFIER }, + }; - const struct retro_controller_info ports[] = { - { port_1, 3 }, - { port_2, 5 }, - { 0, 0 }, - }; + const struct retro_controller_info ports[] = { + { port_1, 3 }, + { port_2, 5 }, + { 0, 0 }, + }; - environ_cb(RETRO_ENVIRONMENT_SET_CONTROLLER_INFO, (void*)ports); + environ_cb(RETRO_ENVIRONMENT_SET_CONTROLLER_INFO, (void*)ports); } void update_geometry(void) { - struct retro_system_av_info av_info; - retro_get_system_av_info(&av_info); - environ_cb(RETRO_ENVIRONMENT_SET_GEOMETRY, &av_info); + struct retro_system_av_info av_info; + retro_get_system_av_info(&av_info); + environ_cb(RETRO_ENVIRONMENT_SET_GEOMETRY, &av_info); } static void update_variables(void) { - bool geometry_update = false; - char key[256]; - struct retro_variable var; + bool geometry_update = false; + char key[256]; + struct retro_variable var; - var.key = "snes9x_hires_blend"; - var.value = NULL; + var.key = "snes9x_hires_blend"; + var.value = NULL; - if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var)) - hires_blend = !strcmp(var.value, "disabled") ? false : true; - else - hires_blend = false; + if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var)) + hires_blend = !strcmp(var.value, "disabled") ? false : true; + else + hires_blend = false; - var.key = "snes9x_overclock_superfx"; - var.value = NULL; + var.key = "snes9x_overclock_superfx"; + var.value = NULL; - if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var)) - { - int freq = atoi(var.value); - Settings.SuperFXClockMultiplier = freq; - } + if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var)) + { + int freq = atoi(var.value); + Settings.SuperFXClockMultiplier = freq; + } - var.key = "snes9x_hires_blend"; - var.value = NULL; + var.key = "snes9x_hires_blend"; + var.value = NULL; - if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var)) - hires_blend = !strcmp(var.value, "disabled") ? false : true; - else - hires_blend = false; + if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var)) + hires_blend = !strcmp(var.value, "disabled") ? false : true; + else + hires_blend = false; - var.key = "snes9x_up_down_allowed"; - var.value = NULL; + var.key = "snes9x_up_down_allowed"; + var.value = NULL; - if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var)) - { - Settings.UpAndDown = !strcmp(var.value, "disabled") ? false : true; - } - else - Settings.UpAndDown = false; + if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var)) + { + Settings.UpAndDown = !strcmp(var.value, "disabled") ? false : true; + } + else + Settings.UpAndDown = false; - int disabled_channels=0; - strcpy(key, "snes9x_sndchan_x"); - var.key=key; - for (int i=0;i<8;i++) - { - key[strlen("snes9x_sndchan_")]='1'+i; - var.value=NULL; - if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && !strcmp("disabled", var.value)) - disabled_channels|=1<= BUFFER_SIZE) - { - //this loop will never be entered, but handle oversized sample counts just in case - S9xMixSamples((uint8*)audio_buf, BUFFER_SIZE); - audio_batch_cb(audio_buf, BUFFER_SIZE >> 1); + S9xFinalizeSamples(); + size_t avail = S9xGetSampleCount(); + while (avail >= BUFFER_SIZE) + { + //this loop will never be entered, but handle oversized sample counts just in case + S9xMixSamples((uint8*)audio_buf, BUFFER_SIZE); + audio_batch_cb(audio_buf, BUFFER_SIZE >> 1); - avail -= BUFFER_SIZE; - } - if (avail > 0) - { - S9xMixSamples((uint8*)audio_buf, avail); - audio_batch_cb(audio_buf, avail >> 1); - } + avail -= BUFFER_SIZE; + } + if (avail > 0) + { + S9xMixSamples((uint8*)audio_buf, avail); + audio_batch_cb(audio_buf, avail >> 1); + } } void retro_get_system_info(struct retro_system_info *info) @@ -383,35 +383,35 @@ void retro_get_system_info(struct retro_system_info *info) float get_aspect_ratio(unsigned width, unsigned height) { - if (aspect_ratio_mode == ASPECT_RATIO_4_3) - { - return SNES_4_3; - } - else if (aspect_ratio_mode == ASPECT_RATIO_8_7) - { - return SNES_8_7; - } + if (aspect_ratio_mode == ASPECT_RATIO_4_3) + { + return SNES_4_3; + } + else if (aspect_ratio_mode == ASPECT_RATIO_8_7) + { + return SNES_8_7; + } - // OV2: not sure if these really make sense - NTSC is similar to 4:3, PAL looks weird - float sample_frequency_ntsc = 135000000.0f / 11.0f; - float sample_frequency_pal = 14750000.0; + // OV2: not sure if these really make sense - NTSC is similar to 4:3, PAL looks weird + float sample_frequency_ntsc = 135000000.0f / 11.0f; + float sample_frequency_pal = 14750000.0; - float sample_freq = retro_get_region() == RETRO_REGION_NTSC ? sample_frequency_ntsc : sample_frequency_pal; - float dot_rate = SNES::cpu.frequency / 4.0; + float sample_freq = retro_get_region() == RETRO_REGION_NTSC ? sample_frequency_ntsc : sample_frequency_pal; + float dot_rate = SNES::cpu.frequency / 4.0; - if (aspect_ratio_mode == ASPECT_RATIO_NTSC) // ntsc - { - sample_freq = sample_frequency_ntsc; - dot_rate = NTSC_MASTER_CLOCK / 4.0; - } - else if (aspect_ratio_mode == ASPECT_RATIO_PAL) // pal - { - sample_freq = sample_frequency_pal; - dot_rate = PAL_MASTER_CLOCK / 4.0; - } + if (aspect_ratio_mode == ASPECT_RATIO_NTSC) // ntsc + { + sample_freq = sample_frequency_ntsc; + dot_rate = NTSC_MASTER_CLOCK / 4.0; + } + else if (aspect_ratio_mode == ASPECT_RATIO_PAL) // pal + { + sample_freq = sample_frequency_pal; + dot_rate = PAL_MASTER_CLOCK / 4.0; + } - float par = sample_freq / 2.0 / dot_rate; - return (float)width * par / (float)height; + float par = sample_freq / 2.0 / dot_rate; + return (float)width * par / (float)height; } void retro_get_system_av_info(struct retro_system_av_info *info) @@ -420,9 +420,9 @@ void retro_get_system_av_info(struct retro_system_av_info *info) unsigned width = SNES_WIDTH; unsigned height = PPU.ScreenHeight; if (crop_overscan_mode == OVERSCAN_CROP_ON) - height = SNES_HEIGHT; + height = SNES_HEIGHT; else if (crop_overscan_mode == OVERSCAN_CROP_OFF) - height = SNES_HEIGHT_EXTENDED; + height = SNES_HEIGHT_EXTENDED; info->geometry.base_width = width; info->geometry.base_height = height; @@ -435,92 +435,92 @@ void retro_get_system_av_info(struct retro_system_av_info *info) unsigned retro_api_version() { - return RETRO_API_VERSION; + return RETRO_API_VERSION; } void retro_reset() { - S9xSoftReset(); + S9xSoftReset(); } static unsigned snes_devices[2]; void retro_set_controller_port_device(unsigned port, unsigned device) { - if (port < 2) - { - int offset = snes_devices[0] == RETRO_DEVICE_JOYPAD_MULTITAP ? 4 : 1; - switch (device) - { - case RETRO_DEVICE_JOYPAD: + if (port < 2) + { + int offset = snes_devices[0] == RETRO_DEVICE_JOYPAD_MULTITAP ? 4 : 1; + switch (device) + { + case RETRO_DEVICE_JOYPAD: S9xSetController(port, CTL_JOYPAD, port * offset, 0, 0, 0); snes_devices[port] = RETRO_DEVICE_JOYPAD; break; - case RETRO_DEVICE_JOYPAD_MULTITAP: + case RETRO_DEVICE_JOYPAD_MULTITAP: S9xSetController(port, CTL_MP5, port * offset, port * offset + 1, port * offset + 2, port * offset + 3); snes_devices[port] = RETRO_DEVICE_JOYPAD_MULTITAP; break; - case RETRO_DEVICE_MOUSE: + case RETRO_DEVICE_MOUSE: S9xSetController(port, CTL_MOUSE, port, 0, 0, 0); snes_devices[port] = RETRO_DEVICE_MOUSE; break; - case RETRO_DEVICE_LIGHTGUN_SUPER_SCOPE: + case RETRO_DEVICE_LIGHTGUN_SUPER_SCOPE: S9xSetController(port, CTL_SUPERSCOPE, 0, 0, 0, 0); snes_devices[port] = RETRO_DEVICE_LIGHTGUN_SUPER_SCOPE; break; - case RETRO_DEVICE_LIGHTGUN_JUSTIFIER: + case RETRO_DEVICE_LIGHTGUN_JUSTIFIER: S9xSetController(port, CTL_JUSTIFIER, 0, 0, 0, 0); snes_devices[port] = RETRO_DEVICE_LIGHTGUN_JUSTIFIER; break; - default: + default: if (log_cb) log_cb(RETRO_LOG_ERROR, "[libretro]: Invalid device (%d).\n", device); - } - if (!port) - retro_set_controller_port_device(1, snes_devices[1]); - } - else if(device != RETRO_DEVICE_NONE) - log_cb(RETRO_LOG_INFO, "[libretro]: Nonexistent Port (%d).\n", port); + } + if (!port) + retro_set_controller_port_device(1, snes_devices[1]); + } + else if(device != RETRO_DEVICE_NONE) + log_cb(RETRO_LOG_INFO, "[libretro]: Nonexistent Port (%d).\n", port); } void retro_cheat_reset() { - S9xDeleteCheats(); + S9xDeleteCheats(); } void retro_cheat_set(unsigned index, bool enabled, const char *codeline) { - char codeCopy[256]; - char* code; + char codeCopy[256]; + char* code; - if (codeline == (char *)'\0') return; + if (codeline == (char *)'\0') return; - strcpy(codeCopy,codeline); - code=strtok(codeCopy,"+,.; "); - while (code != NULL) { - //Convert GH RAW to PAR - if (strlen(code)==9 && code[6]==':') - { - code[6]=code[7]; - code[7]=code[8]; - code[8]='\0'; - } + strcpy(codeCopy,codeline); + code=strtok(codeCopy,"+,.; "); + while (code != NULL) { + //Convert GH RAW to PAR + if (strlen(code)==9 && code[6]==':') + { + code[6]=code[7]; + code[7]=code[8]; + code[8]='\0'; + } - /* Goldfinger was broken and nobody noticed. Removed */ - if (S9xAddCheatGroup ("retro", code) >= 0) - { - if (enabled) - S9xEnableCheatGroup (Cheat.g.size () - 1); - } - else - { - printf("CHEAT: Failed to recognize %s\n",code); - } + /* Goldfinger was broken and nobody noticed. Removed */ + if (S9xAddCheatGroup ("retro", code) >= 0) + { + if (enabled) + S9xEnableCheatGroup (Cheat.g.size () - 1); + } + else + { + printf("CHEAT: Failed to recognize %s\n",code); + } - code=strtok(NULL,"+,.; "); // bad code, ignore - } + code=strtok(NULL,"+,.; "); // bad code, ignore + } - S9xCheatsEnable(); + S9xCheatsEnable(); } #define MAX_MAPS 32 @@ -565,322 +565,322 @@ void S9xAppendMapping(struct retro_memory_descriptor *desc) static void init_descriptors(void) { - struct retro_input_descriptor desc[] = { - { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT, "D-Pad Left" }, - { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP, "D-Pad Up" }, - { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN, "D-Pad Down" }, - { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT, "D-Pad Right" }, - { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B, "B" }, - { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A, "A" }, - { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_X, "X" }, - { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y, "Y" }, - { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L, "L" }, - { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R, "R" }, - { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_SELECT, "Select" }, - { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START, "Start" }, + struct retro_input_descriptor desc[] = { + { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT, "D-Pad Left" }, + { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP, "D-Pad Up" }, + { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN, "D-Pad Down" }, + { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT, "D-Pad Right" }, + { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B, "B" }, + { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A, "A" }, + { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_X, "X" }, + { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y, "Y" }, + { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L, "L" }, + { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R, "R" }, + { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_SELECT, "Select" }, + { 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START, "Start" }, - { 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT, "D-Pad Left" }, - { 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP, "D-Pad Up" }, - { 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN, "D-Pad Down" }, - { 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT, "D-Pad Right" }, - { 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B, "B" }, - { 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A, "A" }, - { 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_X, "X" }, - { 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y, "Y" }, - { 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L, "L" }, - { 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R, "R" }, - { 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_SELECT, "Select" }, - { 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START, "Start" }, + { 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT, "D-Pad Left" }, + { 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP, "D-Pad Up" }, + { 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN, "D-Pad Down" }, + { 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT, "D-Pad Right" }, + { 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B, "B" }, + { 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A, "A" }, + { 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_X, "X" }, + { 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y, "Y" }, + { 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L, "L" }, + { 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R, "R" }, + { 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_SELECT, "Select" }, + { 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START, "Start" }, - { 2, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT, "D-Pad Left" }, - { 2, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP, "D-Pad Up" }, - { 2, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN, "D-Pad Down" }, - { 2, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT, "D-Pad Right" }, - { 2, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B, "B" }, - { 2, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A, "A" }, - { 2, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_X, "X" }, - { 2, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y, "Y" }, - { 2, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L, "L" }, - { 2, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R, "R" }, - { 2, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_SELECT, "Select" }, - { 2, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START, "Start" }, + { 2, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT, "D-Pad Left" }, + { 2, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP, "D-Pad Up" }, + { 2, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN, "D-Pad Down" }, + { 2, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT, "D-Pad Right" }, + { 2, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B, "B" }, + { 2, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A, "A" }, + { 2, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_X, "X" }, + { 2, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y, "Y" }, + { 2, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L, "L" }, + { 2, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R, "R" }, + { 2, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_SELECT, "Select" }, + { 2, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START, "Start" }, - { 3, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT, "D-Pad Left" }, - { 3, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP, "D-Pad Up" }, - { 3, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN, "D-Pad Down" }, - { 3, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT, "D-Pad Right" }, - { 3, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B, "B" }, - { 3, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A, "A" }, - { 3, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_X, "X" }, - { 3, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y, "Y" }, - { 3, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L, "L" }, - { 3, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R, "R" }, - { 3, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_SELECT, "Select" }, - { 3, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START, "Start" }, + { 3, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT, "D-Pad Left" }, + { 3, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP, "D-Pad Up" }, + { 3, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN, "D-Pad Down" }, + { 3, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT, "D-Pad Right" }, + { 3, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B, "B" }, + { 3, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A, "A" }, + { 3, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_X, "X" }, + { 3, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y, "Y" }, + { 3, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L, "L" }, + { 3, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R, "R" }, + { 3, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_SELECT, "Select" }, + { 3, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START, "Start" }, - { 4, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT, "D-Pad Left" }, - { 4, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP, "D-Pad Up" }, - { 4, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN, "D-Pad Down" }, - { 4, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT, "D-Pad Right" }, - { 4, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B, "B" }, - { 4, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A, "A" }, - { 4, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_X, "X" }, - { 4, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y, "Y" }, - { 4, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L, "L" }, - { 4, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R, "R" }, - { 4, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_SELECT, "Select" }, - { 4, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START, "Start" }, + { 4, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT, "D-Pad Left" }, + { 4, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP, "D-Pad Up" }, + { 4, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN, "D-Pad Down" }, + { 4, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT, "D-Pad Right" }, + { 4, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B, "B" }, + { 4, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A, "A" }, + { 4, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_X, "X" }, + { 4, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y, "Y" }, + { 4, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L, "L" }, + { 4, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R, "R" }, + { 4, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_SELECT, "Select" }, + { 4, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START, "Start" }, - { 0, 0, 0, 0, NULL }, - }; + { 0, 0, 0, 0, NULL }, + }; - environ_cb(RETRO_ENVIRONMENT_SET_INPUT_DESCRIPTORS, desc); + environ_cb(RETRO_ENVIRONMENT_SET_INPUT_DESCRIPTORS, desc); } static bool valid_normal_bank (uint8 bankbyte) { - switch (bankbyte) - { - case 32: case 33: case 48: case 49: - return (true); - } + switch (bankbyte) + { + case 32: case 33: case 48: case 49: + return (true); + } - return (false); + return (false); } static int is_bsx (uint8 *p) { - if ((p[26] == 0x33 || p[26] == 0xFF) && (!p[21] || (p[21] & 131) == 128) && valid_normal_bank(p[24])) - { - unsigned char m = p[22]; + if ((p[26] == 0x33 || p[26] == 0xFF) && (!p[21] || (p[21] & 131) == 128) && valid_normal_bank(p[24])) + { + unsigned char m = p[22]; - if (!m && !p[23]) - return (2); + if (!m && !p[23]) + return (2); - if ((m == 0xFF && p[23] == 0xFF) || (!(m & 0xF) && ((m >> 4) - 1 < 12))) - return (1); - } + if ((m == 0xFF && p[23] == 0xFF) || (!(m & 0xF) && ((m >> 4) - 1 < 12))) + return (1); + } - return (0); + return (0); } static void Remove_Header(uint8_t *&romptr, size_t &romsize, bool multicart_sufami) { - if (romptr==0 || romsize==0) return; + if (romptr==0 || romsize==0) return; - uint32 calc_size = (romsize / 0x2000) * 0x2000; - if ((romsize - calc_size == 512 && !Settings.ForceNoHeader) || Settings.ForceHeader) - { - romptr += 512; - romsize -= 512; + uint32 calc_size = (romsize / 0x2000) * 0x2000; + if ((romsize - calc_size == 512 && !Settings.ForceNoHeader) || Settings.ForceHeader) + { + romptr += 512; + romsize -= 512; - if(log_cb) log_cb(RETRO_LOG_INFO,"[libretro]: ROM header removed\n"); - } + if(log_cb) log_cb(RETRO_LOG_INFO,"[libretro]: ROM header removed\n"); + } - if (multicart_sufami) - { - if (strncmp((const char*)(romptr+0x100000), "BANDAI SFC-ADX", 14) == 0 && - strncmp((const char*)(romptr+0x000000), "BANDAI SFC-ADX", 14) == 0) - { - romptr += 0x100000; - romsize -= 0x100000; + if (multicart_sufami) + { + if (strncmp((const char*)(romptr+0x100000), "BANDAI SFC-ADX", 14) == 0 && + strncmp((const char*)(romptr+0x000000), "BANDAI SFC-ADX", 14) == 0) + { + romptr += 0x100000; + romsize -= 0x100000; - if(log_cb) log_cb(RETRO_LOG_INFO,"[libretro]: Sufami Turbo Multi-ROM bios removed\n"); - } - } + if(log_cb) log_cb(RETRO_LOG_INFO,"[libretro]: Sufami Turbo Multi-ROM bios removed\n"); + } + } } static bool8 LoadBIOS(uint8 *biosrom, char *biosname, int biossize) { - FILE *fp; - char name[PATH_MAX + 1]; - bool8 r = FALSE; + FILE *fp; + char name[PATH_MAX + 1]; + bool8 r = FALSE; - strcpy(name, S9xGetDirectory(ROMFILENAME_DIR)); - strcat(name, SLASH_STR); - strcat(name, biosname); + strcpy(name, S9xGetDirectory(ROMFILENAME_DIR)); + strcat(name, SLASH_STR); + strcat(name, biosname); - fp = fopen(name, "rb"); - if (!fp) - { - strcpy(name, S9xGetDirectory(BIOS_DIR)); - strcat(name, SLASH_STR); - strcat(name, biosname); + fp = fopen(name, "rb"); + if (!fp) + { + strcpy(name, S9xGetDirectory(BIOS_DIR)); + strcat(name, SLASH_STR); + strcat(name, biosname); - fp = fopen(name, "rb"); - } + fp = fopen(name, "rb"); + } - if (fp) - { - size_t size; + if (fp) + { + size_t size; - size = fread((void *) biosrom, 1, biossize, fp); - fclose(fp); - if (size == biossize) - r = TRUE; - } + size = fread((void *) biosrom, 1, biossize, fp); + fclose(fp); + if (size == biossize) + r = TRUE; + } - return (r); + return (r); } static bool8 is_SufamiTurbo_Cart (const uint8 *data, uint32 size) { - if (size >= 0x80000 && size <= 0x100000 && - strncmp((char *) data, "BANDAI SFC-ADX", 14) == 0 && strncmp((char * ) (data + 0x10), "SFC-ADX BACKUP", 14) != 0) - return (TRUE); - else - return (FALSE); + if (size >= 0x80000 && size <= 0x100000 && + strncmp((char *) data, "BANDAI SFC-ADX", 14) == 0 && strncmp((char * ) (data + 0x10), "SFC-ADX BACKUP", 14) != 0) + return (TRUE); + else + return (FALSE); } bool retro_load_game(const struct retro_game_info *game) { - init_descriptors(); + init_descriptors(); - update_variables(); + update_variables(); - if(game->data == NULL && game->size == 0 && game->path != NULL) - rom_loaded = Memory.LoadROM(game->path); - else - { - uint8 *biosrom = new uint8[0x100000]; + if(game->data == NULL && game->size == 0 && game->path != NULL) + rom_loaded = Memory.LoadROM(game->path); + else + { + uint8 *biosrom = new uint8[0x100000]; - if (game->path != NULL) - { - extract_basename(g_basename, game->path, sizeof(g_basename)); - extract_directory(g_rom_dir, game->path, sizeof(g_rom_dir)); - } + if (game->path != NULL) + { + extract_basename(g_basename, game->path, sizeof(g_basename)); + extract_directory(g_rom_dir, game->path, sizeof(g_rom_dir)); + } - if (is_SufamiTurbo_Cart((uint8 *) game->data, game->size)) { - if (rom_loaded = LoadBIOS(biosrom,"STBIOS.bin",0x40000)) + if (is_SufamiTurbo_Cart((uint8 *) game->data, game->size)) { + if (rom_loaded = LoadBIOS(biosrom,"STBIOS.bin",0x40000)) rom_loaded = Memory.LoadMultiCartMem((const uint8_t*)game->data, game->size, 0, 0, biosrom, 0x40000); - } + } - else - if ((is_bsx((uint8 *) game->data + 0x7fc0)==1) | (is_bsx((uint8 *) game->data + 0xffc0)==1)) { - if (rom_loaded = LoadBIOS(biosrom,"BS-X.bin",0x100000)) + else + if ((is_bsx((uint8 *) game->data + 0x7fc0)==1) | (is_bsx((uint8 *) game->data + 0xffc0)==1)) { + if (rom_loaded = LoadBIOS(biosrom,"BS-X.bin",0x100000)) rom_loaded = Memory.LoadMultiCartMem(biosrom, 0x100000, (const uint8_t*)game->data, game->size, 0, 0); - } + } - else - rom_loaded = Memory.LoadROMMem((const uint8_t*)game->data ,game->size); + else + rom_loaded = Memory.LoadROMMem((const uint8_t*)game->data ,game->size); - if(biosrom) delete[] biosrom; - } + if(biosrom) delete[] biosrom; + } - int pixel_format = RGB555; - if(environ_cb) - { - pixel_format = RGB565; - enum retro_pixel_format fmt = RETRO_PIXEL_FORMAT_RGB565; - if (!environ_cb(RETRO_ENVIRONMENT_SET_PIXEL_FORMAT, &fmt)) - pixel_format = RGB555; - } - S9xGraphicsDeinit(); - S9xSetRenderPixelFormat(pixel_format); - S9xGraphicsInit(); + int pixel_format = RGB555; + if(environ_cb) + { + pixel_format = RGB565; + enum retro_pixel_format fmt = RETRO_PIXEL_FORMAT_RGB565; + if (!environ_cb(RETRO_ENVIRONMENT_SET_PIXEL_FORMAT, &fmt)) + pixel_format = RGB555; + } + S9xGraphicsDeinit(); + S9xSetRenderPixelFormat(pixel_format); + S9xGraphicsInit(); - struct retro_memory_map map={ memorydesc+MAX_MAPS-memorydesc_c, memorydesc_c }; - if (rom_loaded) - { - environ_cb(RETRO_ENVIRONMENT_SET_MEMORY_MAPS, &map); - update_geometry(); - } + struct retro_memory_map map={ memorydesc+MAX_MAPS-memorydesc_c, memorydesc_c }; + if (rom_loaded) + { + environ_cb(RETRO_ENVIRONMENT_SET_MEMORY_MAPS, &map); + update_geometry(); + } - if (!rom_loaded && log_cb) - log_cb(RETRO_LOG_ERROR, "[libretro]: Rom loading failed...\n"); + if (!rom_loaded && log_cb) + log_cb(RETRO_LOG_ERROR, "[libretro]: Rom loading failed...\n"); - return rom_loaded; + return rom_loaded; } bool retro_load_game_special(unsigned game_type, const struct retro_game_info *info, size_t num_info) { - uint8_t *romptr[3]; - size_t romsize[3]; + uint8_t *romptr[3]; + size_t romsize[3]; - for(size_t lcv=0; lcv (SNES_WIDTH-1)) snes_scope_state[0] = SNES_WIDTH-1; @@ -1183,15 +1183,15 @@ static void report_buttons() else if (snes_scope_state[1] > (SNES_HEIGHT-1)) snes_scope_state[1] = SNES_HEIGHT-1; S9xReportPointer(BTN_POINTER, snes_scope_state[0], snes_scope_state[1]); for (int i = SCOPE_TRIGGER; i <= SCOPE_LAST; i++) - S9xReportButton(MAKE_BUTTON(2, i), input_state_cb(port, RETRO_DEVICE_LIGHTGUN, 0, i)); + S9xReportButton(MAKE_BUTTON(2, i), input_state_cb(port, RETRO_DEVICE_LIGHTGUN, 0, i)); break; - case RETRO_DEVICE_LIGHTGUN_JUSTIFIER: - case RETRO_DEVICE_LIGHTGUN_JUSTIFIERS: + case RETRO_DEVICE_LIGHTGUN_JUSTIFIER: + case RETRO_DEVICE_LIGHTGUN_JUSTIFIERS: if(runahead_poll) { - snes_justifier_state[port][0] += input_state_cb(port, RETRO_DEVICE_LIGHTGUN_JUSTIFIER, 0, RETRO_DEVICE_ID_LIGHTGUN_X); - snes_justifier_state[port][1] += input_state_cb(port, RETRO_DEVICE_LIGHTGUN_JUSTIFIER, 0, RETRO_DEVICE_ID_LIGHTGUN_Y); + snes_justifier_state[port][0] += input_state_cb(port, RETRO_DEVICE_LIGHTGUN_JUSTIFIER, 0, RETRO_DEVICE_ID_LIGHTGUN_X); + snes_justifier_state[port][1] += input_state_cb(port, RETRO_DEVICE_LIGHTGUN_JUSTIFIER, 0, RETRO_DEVICE_ID_LIGHTGUN_Y); } if (snes_justifier_state[port][0] < 0) snes_justifier_state[port][0] = 0; else if (snes_justifier_state[port][0] > (SNES_WIDTH-1)) snes_justifier_state[port][0] = SNES_WIDTH-1; @@ -1199,195 +1199,195 @@ static void report_buttons() else if (snes_justifier_state[port][1] > (SNES_HEIGHT-1)) snes_justifier_state[port][1] = SNES_HEIGHT-1; S9xReportPointer(BTN_POINTER, snes_justifier_state[port][0], snes_justifier_state[port][1]); for (int i = JUSTIFIER_TRIGGER; i <= JUSTIFIER_LAST; i++) - S9xReportButton(MAKE_BUTTON(2, i), input_state_cb(port, RETRO_DEVICE_LIGHTGUN, 0, i)); + S9xReportButton(MAKE_BUTTON(2, i), input_state_cb(port, RETRO_DEVICE_LIGHTGUN, 0, i)); break; - default: + default: if (log_cb) - log_cb(RETRO_LOG_ERROR, "[libretro]: Unknown device...\n"); - } - } + log_cb(RETRO_LOG_ERROR, "[libretro]: Unknown device...\n"); + } + } } void retro_run() { - static uint16 height = PPU.ScreenHeight; - bool updated = false; - if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE_UPDATE, &updated) && updated) - update_variables(); - if (height != PPU.ScreenHeight) - { - update_geometry(); - height = PPU.ScreenHeight; - } + static uint16 height = PPU.ScreenHeight; + bool updated = false; + if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE_UPDATE, &updated) && updated) + update_variables(); + if (height != PPU.ScreenHeight) + { + update_geometry(); + height = PPU.ScreenHeight; + } - int result = -1; - bool okay = environ_cb(RETRO_ENVIRONMENT_GET_AUDIO_VIDEO_ENABLE, &result); - if (okay) - { - bool audioEnabled = 0 != (result & 2); - bool videoEnabled = 0 != (result & 1); - IPPU.RenderThisFrame = videoEnabled; - S9xSetSoundMute(!audioEnabled); - } - else - { - IPPU.RenderThisFrame = true; - S9xSetSoundMute(false); - } + int result = -1; + bool okay = environ_cb(RETRO_ENVIRONMENT_GET_AUDIO_VIDEO_ENABLE, &result); + if (okay) + { + bool audioEnabled = 0 != (result & 2); + bool videoEnabled = 0 != (result & 1); + IPPU.RenderThisFrame = videoEnabled; + S9xSetSoundMute(!audioEnabled); + } + else + { + IPPU.RenderThisFrame = true; + S9xSetSoundMute(false); + } - poll_cb(); - report_buttons(); - S9xMainLoop(); - S9xAudioCallback(NULL); + poll_cb(); + report_buttons(); + S9xMainLoop(); + S9xAudioCallback(NULL); } void retro_deinit() { - S9xDeinitAPU(); - Memory.Deinit(); - S9xGraphicsDeinit(); - S9xUnmapAllControls(); + S9xDeinitAPU(); + Memory.Deinit(); + S9xGraphicsDeinit(); + S9xUnmapAllControls(); - free(GFX.Screen); - free(gfx_blend); + free(GFX.Screen); + free(gfx_blend); } unsigned retro_get_region() { - return Settings.PAL ? RETRO_REGION_PAL : RETRO_REGION_NTSC; + return Settings.PAL ? RETRO_REGION_PAL : RETRO_REGION_NTSC; } void* retro_get_memory_data(unsigned type) { - void* data; + void* data; - switch(type) { - case RETRO_MEMORY_SNES_SUFAMI_TURBO_A_RAM: - case RETRO_MEMORY_SAVE_RAM: - data = Memory.SRAM; - break; - case RETRO_MEMORY_SNES_SUFAMI_TURBO_B_RAM: - data = Multi.sramB; - break; - case RETRO_MEMORY_RTC: - data = RTCData.reg; - break; - case RETRO_MEMORY_SYSTEM_RAM: + switch(type) { + case RETRO_MEMORY_SNES_SUFAMI_TURBO_A_RAM: + case RETRO_MEMORY_SAVE_RAM: + data = Memory.SRAM; + break; + case RETRO_MEMORY_SNES_SUFAMI_TURBO_B_RAM: + data = Multi.sramB; + break; + case RETRO_MEMORY_RTC: + data = RTCData.reg; + break; + case RETRO_MEMORY_SYSTEM_RAM: data = Memory.RAM; break; - case RETRO_MEMORY_VIDEO_RAM: + case RETRO_MEMORY_VIDEO_RAM: data = Memory.VRAM; break; - //case RETRO_MEMORY_ROM: - // data = Memory.ROM; - // break; - default: - data = NULL; - break; - } + //case RETRO_MEMORY_ROM: + // data = Memory.ROM; + // break; + default: + data = NULL; + break; + } - return data; + return data; } size_t retro_get_memory_size(unsigned type) { - size_t size; + size_t size; - switch(type) { - case RETRO_MEMORY_SNES_SUFAMI_TURBO_A_RAM: - case RETRO_MEMORY_SAVE_RAM: - size = (unsigned) (Memory.SRAMSize ? (1 << (Memory.SRAMSize + 3)) * 128 : 0); - if (size > 0x20000) - size = 0x20000; - break; - case RETRO_MEMORY_SNES_SUFAMI_TURBO_B_RAM: - size = (unsigned) (Multi.cartType==4 && Multi.sramSizeB ? (1 << (Multi.sramSizeB + 3)) * 128 : 0); - break; - case RETRO_MEMORY_RTC: - size = (Settings.SRTC || Settings.SPC7110RTC)?20:0; - break; - case RETRO_MEMORY_SYSTEM_RAM: - size = 128 * 1024; - break; - case RETRO_MEMORY_VIDEO_RAM: - size = 64 * 1024; - break; - //case RETRO_MEMORY_ROM: - // size = Memory.CalculatedSize; - // break; - default: - size = 0; - break; - } + switch(type) { + case RETRO_MEMORY_SNES_SUFAMI_TURBO_A_RAM: + case RETRO_MEMORY_SAVE_RAM: + size = (unsigned) (Memory.SRAMSize ? (1 << (Memory.SRAMSize + 3)) * 128 : 0); + if (size > 0x20000) + size = 0x20000; + break; + case RETRO_MEMORY_SNES_SUFAMI_TURBO_B_RAM: + size = (unsigned) (Multi.cartType==4 && Multi.sramSizeB ? (1 << (Multi.sramSizeB + 3)) * 128 : 0); + break; + case RETRO_MEMORY_RTC: + size = (Settings.SRTC || Settings.SPC7110RTC)?20:0; + break; + case RETRO_MEMORY_SYSTEM_RAM: + size = 128 * 1024; + break; + case RETRO_MEMORY_VIDEO_RAM: + size = 64 * 1024; + break; + //case RETRO_MEMORY_ROM: + // size = Memory.CalculatedSize; + // break; + default: + size = 0; + break; + } - return size; + return size; } size_t retro_serialize_size() { - return rom_loaded ? S9xFreezeSize() : 0; + return rom_loaded ? S9xFreezeSize() : 0; } bool retro_serialize(void *data, size_t size) { - if (S9xFreezeGameMem((uint8_t*)data,size) == FALSE) - return false; + if (S9xFreezeGameMem((uint8_t*)data,size) == FALSE) + return false; - return true; + return true; } bool retro_unserialize(const void* data, size_t size) { - if (S9xUnfreezeGameMem((const uint8_t*)data,size) != SUCCESS) - return false; + if (S9xUnfreezeGameMem((const uint8_t*)data,size) != SUCCESS) + return false; - return true; + return true; } bool8 S9xDeinitUpdate(int width, int height) { - if (crop_overscan_mode == OVERSCAN_CROP_ON) - { - if (height >= SNES_HEIGHT << 1) - { - height = SNES_HEIGHT << 1; - } - else - { - height = SNES_HEIGHT; - } - } - else if (crop_overscan_mode == OVERSCAN_CROP_OFF) - { - if (height > SNES_HEIGHT_EXTENDED) - { - if (height < SNES_HEIGHT_EXTENDED << 1) + if (crop_overscan_mode == OVERSCAN_CROP_ON) + { + if (height >= SNES_HEIGHT << 1) + { + height = SNES_HEIGHT << 1; + } + else + { + height = SNES_HEIGHT; + } + } + else if (crop_overscan_mode == OVERSCAN_CROP_OFF) + { + 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) + 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; - } - } + height = SNES_HEIGHT_EXTENDED; + } + } - if(width==MAX_SNES_WIDTH && hires_blend) - { + if(width==MAX_SNES_WIDTH && hires_blend) + { #define AVERAGE_565(el0, el1) (((el0) & (el1)) + ((((el0) ^ (el1)) & 0xF7DE) >> 1)) - for (register int y = 0; y < height; y++) - { - register uint16 *input = (uint16 *) ((uint8 *) GFX.Screen + y * GFX.Pitch); - register uint16 *output = (uint16 *) ((uint8 *) gfx_blend + y * GFX.Pitch); - register uint16 l, r; + for (register int y = 0; y < height; y++) + { + register uint16 *input = (uint16 *) ((uint8 *) GFX.Screen + y * GFX.Pitch); + register uint16 *output = (uint16 *) ((uint8 *) gfx_blend + y * GFX.Pitch); + register uint16 l, r; - l = 0; - for (register int x = 0; x < (width >> 1); x++) - { + l = 0; + for (register int x = 0; x < (width >> 1); x++) + { r = *input++; *output++ = AVERAGE_565 (l, r); l = r; @@ -1395,23 +1395,23 @@ bool8 S9xDeinitUpdate(int width, int height) r = *input++; *output++ = AVERAGE_565 (l, r); l = r; - } - } + } + } - video_cb(gfx_blend, width, height, GFX.Pitch); - } - else - { - video_cb(GFX.Screen, width, height, GFX.Pitch); - } + video_cb(gfx_blend, width, height, GFX.Pitch); + } + else + { + video_cb(GFX.Screen, width, height, GFX.Pitch); + } - return TRUE; + return TRUE; } bool8 S9xContinueUpdate(int width, int height) { - S9xDeinitUpdate(width, height); - return true; + S9xDeinitUpdate(width, height); + return true; } // Dummy functions that should probably be implemented correctly later. @@ -1427,35 +1427,35 @@ const char* S9xStringInput(const char* in) { return in; } const char* S9xGetFilename(const char* in, s9x_getdirtype type) { - static char newpath[2048]; + static char newpath[2048]; - newpath[0] = '\0'; + newpath[0] = '\0'; - switch (type) - { - case ROMFILENAME_DIR: - sprintf(newpath, "%s%c%s%s", g_rom_dir, SLASH, g_basename, in); - return newpath; - default: - break; - } + switch (type) + { + case ROMFILENAME_DIR: + sprintf(newpath, "%s%c%s%s", g_rom_dir, SLASH, g_basename, in); + return newpath; + default: + break; + } - return in; + return in; } const char* S9xGetDirectory(s9x_getdirtype type) { - switch (type) - { - case ROMFILENAME_DIR: - return g_rom_dir; - case BIOS_DIR: - return retro_system_directory; - default: - break; - } + switch (type) + { + case ROMFILENAME_DIR: + return g_rom_dir; + case BIOS_DIR: + return retro_system_directory; + default: + break; + } - return ""; + return ""; } void S9xInitInputDevices() {} const char* S9xChooseFilename(unsigned char) { return ""; } @@ -1476,116 +1476,116 @@ bool S9xPollPointer(unsigned int, short*, short*) { return false; } const char *S9xChooseMovieFilename(unsigned char) { return NULL; } void S9xMessage(int type, int, const char* s) { - if (!log_cb) return; + if (!log_cb) return; - switch (type) - { - case S9X_DEBUG: - log_cb(RETRO_LOG_DEBUG, "%s\n", s); - break; - case S9X_WARNING: - log_cb(RETRO_LOG_WARN, "%s\n", s); - break; - case S9X_INFO: - log_cb(RETRO_LOG_INFO, "%s\n", s); - break; - case S9X_ERROR: - log_cb(RETRO_LOG_ERROR, "%s\n", s); - break; - default: - log_cb(RETRO_LOG_DEBUG, "%s\n", s); - break; - } + switch (type) + { + case S9X_DEBUG: + log_cb(RETRO_LOG_DEBUG, "%s\n", s); + break; + case S9X_WARNING: + log_cb(RETRO_LOG_WARN, "%s\n", s); + break; + case S9X_INFO: + log_cb(RETRO_LOG_INFO, "%s\n", s); + break; + case S9X_ERROR: + log_cb(RETRO_LOG_ERROR, "%s\n", s); + break; + default: + log_cb(RETRO_LOG_DEBUG, "%s\n", s); + break; + } } 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); + 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); + CLOSE_STREAM(file); } void S9xAutoSaveSRAM() { - return; + return; } #ifndef __WIN32__ // S9x weirdness. void _splitpath (const char *path, char *drive, char *dir, char *fname, char *ext) { - *drive = 0; + *drive = 0; - const char *slash = strrchr(path, SLASH_CHAR), - *dot = strrchr(path, '.'); + const char *slash = strrchr(path, SLASH_CHAR), + *dot = strrchr(path, '.'); - if (dot && slash && dot < slash) - dot = NULL; + if (dot && slash && dot < slash) + dot = NULL; - if (!slash) - { - *dir = 0; + if (!slash) + { + *dir = 0; - strcpy(fname, path); + strcpy(fname, path); - if (dot) - { - fname[dot - path] = 0; - strcpy(ext, dot + 1); - } - else - *ext = 0; - } - else - { - strcpy(dir, path); - dir[slash - path] = 0; + 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); + strcpy(fname, slash + 1); - if (dot) - { - fname[dot - slash - 1] = 0; - strcpy(ext, dot + 1); - } - else - *ext = 0; - } + 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; + if (dir && *dir) + { + strcpy(path, dir); + strcat(path, SLASH_STR); + } + else + *path = 0; - strcat(path, fname); + strcat(path, fname); - if (ext && *ext) - { - strcat(path, "."); - strcat(path, ext); - } + if (ext && *ext) + { + strcat(path, "."); + strcat(path, ext); + } } #endif // __WIN32__