Fix remaining bugs and fix indentation
[picodrive.git] / platform / libretro.c
index 21f5a96..23f0694 100644 (file)
@@ -39,7 +39,7 @@ static FILE *emu_log;
 #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];
 
@@ -251,6 +251,9 @@ void emu_video_mode_change(int start_line, int line_count, int is_32cols)
        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)
@@ -292,6 +295,8 @@ void retro_set_environment(retro_environment_t cb)
                //{ "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
@@ -333,10 +338,10 @@ void retro_get_system_av_info(struct retro_system_av_info *info)
        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 */
@@ -495,7 +500,7 @@ static unsigned int disk_get_image_index(void)
 
 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]))
@@ -516,7 +521,7 @@ static bool disk_set_image_index(unsigned int index)
        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;
@@ -585,13 +590,13 @@ static void disk_tray_close(void)
 
 
 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,
@@ -704,7 +709,7 @@ bool retro_load_game(const struct retro_game_info *info)
        PicoWriteSound = snd_write;
        memset(sndBuffer, 0, sizeof(sndBuffer));
        PsndOut = sndBuffer;
-       PsndRerate(1);
+       PsndRerate(0);
 
        return true;
 }
@@ -736,14 +741,25 @@ void *retro_get_memory_data(unsigned id)
 
 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)
@@ -799,6 +815,24 @@ static void update_variables(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";
@@ -829,7 +863,8 @@ void retro_run(void)
 
        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)
@@ -858,7 +893,6 @@ void retro_init(void)
 #endif
        PsndRate = 44100;
        PicoAutoRgnOrder = 0x184; // US, EU, JP
-       PicoCDBuffers = 0;
 
        vout_width = 320;
        vout_height = 240;