32x: packed pixel mode (works over 68k)
[picodrive.git] / platform / common / emu.c
index aca54be..627c3be 100644 (file)
@@ -409,6 +409,32 @@ static void shutdown_MCD(void)
        PicoAHW &= ~PAHW_MCD;\r
 }\r
 \r
+static void system_announce(void)\r
+{\r
+       const char *sys_name, *tv_standard;\r
+       int fps;\r
+\r
+       if (PicoAHW & PAHW_SMS) {\r
+               sys_name = "Master System";\r
+       } else if (PicoAHW & PAHW_PICO) {\r
+               sys_name = "Pico";\r
+       } else if (PicoAHW & PAHW_MCD) {\r
+               sys_name = "Mega CD";\r
+               if ((Pico.m.hardware & 0xc0) == 0x80)\r
+                       sys_name = "Sega CD";\r
+       } else if (PicoAHW & PAHW_32X) {\r
+               sys_name = "32X";\r
+       } else {\r
+               sys_name = "MegaDrive";\r
+               if ((Pico.m.hardware & 0xc0) == 0x80)\r
+                       sys_name = "Genesis";\r
+       }\r
+       tv_standard = Pico.m.pal ? "PAL" : "NTSC";\r
+       fps = Pico.m.pal ? 50 : 60;\r
+\r
+       emu_status_msg("%s %s / %dFPS", tv_standard, sys_name, fps);\r
+}\r
+\r
 // note: this function might mangle rom_fname\r
 // XXX: portions of this code should move to pico/\r
 int emu_reload_rom(char *rom_fname)\r
@@ -612,21 +638,7 @@ int emu_reload_rom(char *rom_fname)
        }\r
        else\r
        {\r
-               const char *sys_name, *tv_standard;\r
-               int fps;\r
-\r
-               if (PicoAHW & PAHW_SMS) {\r
-                       sys_name = "Master System";\r
-               } else {\r
-                       sys_name = "MegaDrive";\r
-                       if ((Pico.m.hardware&0xc0) == 0x80)\r
-                               sys_name = "Genesis";\r
-               }\r
-               tv_standard = Pico.m.pal ? "PAL" : "NTSC";\r
-               fps = Pico.m.pal ? 50 : 60;\r
-\r
-               emu_status_msg("%s %s / %dFPS", tv_standard, sys_name, fps);\r
-\r
+               system_announce();\r
                PicoOpt &= ~POPT_DIS_VDP_FIFO;\r
        }\r
 \r
@@ -977,7 +989,7 @@ int emu_save_load_game(int load, int sram)
                int truncate = 1;\r
                if (PicoAHW & PAHW_MCD)\r
                {\r
-                       if (PicoOpt&POPT_EN_MCD_RAMCART) {\r
+                       if (PicoOpt & POPT_EN_MCD_RAMCART) {\r
                                sram_size = 0x12000;\r
                                sram_data = SRam.data;\r
                                if (sram_data)\r
@@ -988,8 +1000,7 @@ int emu_save_load_game(int load, int sram)
                                truncate  = 0; // the .brm may contain RAM cart data after normal brm\r
                        }\r
                } else {\r
-                       sram_size = SRam.end-SRam.start+1;\r
-                       if(Pico.m.sram_reg & 4) sram_size=0x2000;\r
+                       sram_size = SRam.size;\r
                        sram_data = SRam.data;\r
                }\r
                if (!sram_data) return 0; // SRam forcefully disabled for this game\r
@@ -1074,6 +1085,12 @@ static void emu_tray_close(void)
        emu_status_msg("CD tray closed.");\r
 }\r
 \r
+void emu_32x_startup(void)\r
+{\r
+       plat_video_toggle_renderer(0, 1, 0);\r
+       system_announce();\r
+}\r
+\r
 void emu_reset_game(void)\r
 {\r
        PicoReset();\r
@@ -1201,9 +1218,9 @@ static void run_events_ui(unsigned int which)
                        PicoStateProgressCB = NULL;\r
                }\r
        }\r
-       if (which & PEV_SWITCH_RND)\r
+       if ((which & PEV_SWITCH_RND) && !(PicoAHW & PAHW_32X))\r
        {\r
-               plat_video_toggle_renderer(1, 0);\r
+               plat_video_toggle_renderer(1, 0, 0);\r
        }\r
        if (which & (PEV_SSLOT_PREV|PEV_SSLOT_NEXT))\r
        {\r
@@ -1332,7 +1349,7 @@ void emu_loop(void)
 {\r
        int pframes_done;               /* "period" frames, used for sync */\r
        int frames_done, frames_shown;  /* actual frames for fps counter */\r
-       int oldmodes, target_fps, target_frametime;\r
+       int target_fps, target_frametime;\r
        unsigned int timestamp_base = 0, timestamp_fps;\r
        char *notice_msg = NULL;\r
        char fpsbuff[24];\r
@@ -1341,8 +1358,8 @@ void emu_loop(void)
        fpsbuff[0] = 0;\r
 \r
        /* make sure we are in correct mode */\r
-       oldmodes = ((Pico.video.reg[12]&1)<<2) ^ 0xc;\r
        Pico.m.dirtyPal = 1;\r
+       rendstatus_old = -1;\r
 \r
        /* number of ticks per frame */\r
        if (Pico.m.pal) {\r
@@ -1371,7 +1388,6 @@ void emu_loop(void)
        {\r
                unsigned int timestamp;\r
                int diff, diff_lim;\r
-               int modes;\r
 \r
                timestamp = get_ticks();\r
                if (reset_timing) {\r
@@ -1398,13 +1414,6 @@ void emu_loop(void)
                        }\r
                }\r
 \r
-               // check for mode changes\r
-               modes = ((Pico.video.reg[12]&1)<<2) | (Pico.video.reg[1]&8);\r
-               if (modes != oldmodes) {\r
-                       oldmodes = modes;\r
-                       pemu_video_mode_change(!(modes & 4), (modes & 8));\r
-               }\r
-\r
                // second changed?\r
                if (timestamp - timestamp_fps >= ms_to_ticks(1000))\r
                {\r