#define VOUT_MAX_WIDTH 320
#define VOUT_MAX_HEIGHT 240
static void *vout_buf;
-static int vout_width, vout_height;
+static int vout_width, vout_height, vout_offset;
static short __attribute__((aligned(4))) sndBuffer[2*44100/50];
memset(vout_buf, 0, 320 * 240 * 2);
vout_width = is_32cols ? 256 : 320;
PicoDrawSetOutBuf(vout_buf, vout_width * 2);
+
+ vout_height = line_count;
+ vout_offset = vout_width * start_line;
}
void emu_32x_startup(void)
//{ "region", "Region; Auto|NTSC|PAL" },
{ "picodrive_input1", "Input device 1; 3 button pad|6 button pad|None" },
{ "picodrive_input2", "Input device 2; 3 button pad|6 button pad|None" },
+ { "picodrive_sprlim", "No sprite limit; disabled|enabled" },
+ { "picodrive_ramcart", "MegaCD RAM cart; disabled|enabled" },
#ifdef DRC_SH2
{ "picodrive_drc", "Dynamic recompilers; enabled|disabled" },
#endif
info->timing.fps = Pico.m.pal ? 50 : 60;
info->timing.sample_rate = 44100;
info->geometry.base_width = 320;
- info->geometry.base_height = 240;
+ info->geometry.base_height = vout_height;
info->geometry.max_width = VOUT_MAX_WIDTH;
info->geometry.max_height = VOUT_MAX_HEIGHT;
- info->geometry.aspect_ratio = 4.0 / 3.0;
+ info->geometry.aspect_ratio = 0.0f;
}
/* savestates */
static bool disk_set_image_index(unsigned int index)
{
- cd_img_type cd_type;
+ enum cd_img_type cd_type;
int ret;
if (index >= sizeof(disks) / sizeof(disks[0]))
ret = -1;
cd_type = PicoCdCheck(disks[index].fname, NULL);
if (cd_type != CIT_NOT_CD)
- ret = Insert_CD(disks[index].fname, cd_type);
+ ret = cdd_load(disks[index].fname, cd_type);
if (ret != 0) {
lprintf("Load failed, invalid CD image?\n");
return 0;
static const char * const biosfiles_us[] = {
- "us_scd1_9210", "us_scd2_9306", "SegaCDBIOS9303", "bios_CD_U"
+ "us_scd2_9306", "SegaCDBIOS9303", "us_scd1_9210", "bios_CD_U"
};
static const char * const biosfiles_eu[] = {
- "eu_mcd1_9210", "eu_mcd2_9306", "eu_mcd2_9303", "bios_CD_E"
+ "eu_mcd2_9306", "eu_mcd2_9303", "eu_mcd1_9210", "bios_CD_E"
};
static const char * const biosfiles_jp[] = {
- "jp_mcd1_9112", "jp_mcd1_9111", "bios_CD_J"
+ "jp_mcd2_921222", "jp_mcd1_9112", "jp_mcd1_9111", "bios_CD_J"
};
static void make_system_path(char *buf, size_t buf_size,
PicoWriteSound = snd_write;
memset(sndBuffer, 0, sizeof(sndBuffer));
PsndOut = sndBuffer;
- PsndRerate(1);
+ PsndRerate(0);
return true;
}
size_t retro_get_memory_size(unsigned id)
{
+ unsigned int i;
+ int sum;
+
if (id != RETRO_MEMORY_SAVE_RAM)
return 0;
if (PicoAHW & PAHW_MCD)
// bram
return 0x2000;
- else
+
+ if (Pico.m.frame_count == 0)
return SRam.size;
+
+ // if game doesn't write to sram, don't report it to
+ // libretro so that RA doesn't write out zeroed .srm
+ for (i = 0, sum = 0; i < SRam.size; i++)
+ sum |= SRam.data[i];
+
+ return (sum != 0) ? SRam.size : 0;
}
void retro_reset(void)
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
PicoSetInputDevice(1, input_name_to_val(var.value));
+ var.value = NULL;
+ var.key = "picodrive_sprlim";
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) {
+ if (strcmp(var.value, "enabled") == 0)
+ PicoOpt |= POPT_DIS_SPRITE_LIM;
+ else
+ PicoOpt &= ~POPT_DIS_SPRITE_LIM;
+ }
+
+ var.value = NULL;
+ var.key = "picodrive_ramcart";
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) {
+ if (strcmp(var.value, "enabled") == 0)
+ PicoOpt |= POPT_EN_MCD_RAMCART;
+ else
+ PicoOpt &= ~POPT_EN_MCD_RAMCART;
+ }
+
#ifdef DRC_SH2
var.value = NULL;
var.key = "picodrive_drc";
PicoFrame();
- video_cb(vout_buf, vout_width, vout_height, vout_width * 2);
+ video_cb((short *)vout_buf + vout_offset,
+ vout_width, vout_height, vout_width * 2);
}
void retro_init(void)
#endif
PsndRate = 44100;
PicoAutoRgnOrder = 0x184; // US, EU, JP
- PicoCDBuffers = 0;
vout_width = 320;
vout_height = 240;