emu_save_load_game((which & PEV_STATE_LOAD) ? 1 : 0, 0);\r
                        PicoStateProgressCB = NULL;\r
                }\r
+               plat_status_msg_busy_done();\r
        }\r
        if (which & PEV_SWITCH_RND)\r
        {\r
 
 /* used before things blocking for a while (these funcs redraw on return) */
 void plat_status_msg_busy_first(const char *msg);
 void plat_status_msg_busy_next(const char *msg);
+void plat_status_msg_busy_done(void);
 void plat_status_msg_clear(void);
 
 void plat_video_toggle_renderer(int change, int menu_call);
 
        plat_status_msg_busy_next(msg);\r
 }\r
 \r
+void plat_status_msg_busy_done(void)\r
+{\r
+}\r
+\r
 static void vid_reset_mode(void)\r
 {\r
        int gp2x_mode = 16;\r
 
        plat_status_msg_busy_next(msg);\r
 }\r
 \r
+void plat_status_msg_busy_done(void)\r
+{\r
+}\r
+\r
 void plat_update_volume(int has_changed, int is_up)\r
 {\r
 }\r
 
        plat_status_msg_busy_next(msg);\r
 }\r
 \r
+void plat_status_msg_busy_done(void)\r
+{\r
+}\r
+\r
 void plat_update_volume(int has_changed, int is_up)\r
 {\r
 }\r
 
        video_deinit();
 }
 
-/* display emulator status messages before holding emulation */
+/* display emulator status messages while holding emulation */
 void plat_status_msg_busy_first(const char *msg)
 {
+       // stop sound to make sure silence is played
+       pemu_sound_stop();
        plat_status_msg_busy_next(msg);
 }
 
 void plat_status_msg_busy_next(const char *msg)
 {
-       plat_status_msg_clear();
        pemu_finalize_frame("", msg);
+       // flip twice since our gskit pipeline has one frame delay
+       plat_video_flip();
        plat_video_flip();
        emu_status_msg("");
        reset_timing = 1;
 }
 
+void plat_status_msg_busy_done(void)
+{
+       pemu_sound_start();
+}
+
 /* clear status message area */
 void plat_status_msg_clear(void)
 {
 
 {
        // TODO hsync depends on NTSC/PAL (15750/15625 Hz), it however doesn't
        // matter if it falls a bit short, the while loop will catch the rest
-       unsigned hsyncs = (us_to - plat_get_ticks_us()) * 15620 / 1000000;
+       int hsyncs = (us_to - plat_get_ticks_us()) * 15620 / 1000000;
 
-       if (hsyncs && SetAlarm(hsyncs, alarm_cb, (void *)GetThreadId()) >= 0)
+       if (hsyncs > 0 && SetAlarm(hsyncs, alarm_cb, (void *)GetThreadId()) >= 0)
                SleepThread();
        while ((int)(us_to - plat_get_ticks_us()) > 0)
                RotateThreadReadyQueue(0);
 
 {
        plat_status_msg_clear();
        pemu_finalize_frame("", msg);
+       // flip twice since our GU pipeline has one frame delay
+       plat_video_flip();
        plat_video_flip();
        emu_status_msg("");
        reset_timing = 1;
 }
 
+void plat_status_msg_busy_done(void)
+{
+}
+
 /* clear status message area */
 void plat_status_msg_clear(void)
 {