revive PC build, support Linux
[gpsp.git] / main.c
diff --git a/main.c b/main.c
index 1f076c8..bd66c06 100644 (file)
--- a/main.c
+++ b/main.c
@@ -41,14 +41,15 @@ debug_state current_debug_state = RUN;
 frameskip_type current_frameskip_type = auto_frameskip;
 u32 global_cycles_per_instruction = 1;
 u32 random_skip = 0;
+u32 fps_debug = 0;
 
 #ifdef GP2X_BUILD
 u32 frameskip_value = 2;
 
 u64 frame_count_initial_timestamp = 0;
 u64 last_frame_interval_timestamp;
-u32 gp2x_fps_debug = 0;
 
+void gp2x_init(void);
 void gp2x_quit(void);
 #else
 
@@ -84,7 +85,11 @@ u32 oam_update_count = 0;
 u32 synchronize_flag = 1;
 
 u32 update_backup_flag = 1;
+#ifdef GP2X_BUILD
+u32 clock_speed = 200;
+#else
 u32 clock_speed = 333;
+#endif
 u8 main_path[512];
 
 void trigger_ext_event();
@@ -188,17 +193,10 @@ int main(int argc, char *argv[])
   u8 load_filename[512];
   u8 bios_filename[512];
 
-#ifdef GP2X_BUILD
-  if(gp2x_load_mmuhack() == -1)
-    delay_us(2500000);
-#endif
-
 #ifdef PSP_BUILD
   sceKernelRegisterSubIntrHandler(PSP_VBLANK_INT, 0,
    vblank_interrupt_handler, NULL);
   sceKernelEnableSubIntr(PSP_VBLANK_INT, 0);
-#else
-  freopen("CON", "wb", stdout);
 #endif
 
   extern char *cpu_mode_names[];
@@ -221,13 +219,13 @@ int main(int argc, char *argv[])
   delay_us(2500000);
 #endif
 
-  init_video();
-
 #ifdef GP2X_BUILD
   // Overclocking GP2X and MMU patch goes here
-  gp2x_overclock();
+  gp2x_init();
 #endif
 
+  init_video();
+
 #ifdef GP2X_BUILD
   sprintf(bios_filename, "%s/%s", main_path, "gba_bios.bin");
   if(load_bios(bios_filename) == -1)
@@ -326,6 +324,7 @@ int main(int argc, char *argv[])
         exit(-1);
       }
 
+      set_clock_speed();
       set_gba_resolution(screen_scale);
       video_resolution_small();
 
@@ -351,7 +350,7 @@ int main(int argc, char *argv[])
    current_savestate_filename);
   load_state(current_savestate_filename); */
 
-  debug_on();
+//  debug_on();
 
   if(argc > 2)
   {
@@ -494,6 +493,9 @@ void trigger_ext_event()
   event_number++;
 }
 
+static u32 fps = 60;
+static u32 frames_drawn = 60;
+
 u32 update_gba()
 {
   irq_type irq_raised = IRQ_NONE;
@@ -608,10 +610,18 @@ u32 update_gba()
             continue;
 
           update_gbc_sound(cpu_ticks);
-          synchronize();
+
+          if(fps_debug)
+          {
+            char print_buffer[32];
+            sprintf(print_buffer, "%d (%d)", fps, frames_drawn);
+            print_string(print_buffer, 0xFFFF, 0x000, 0, 0);
+          }
 
           update_screen();
 
+          synchronize();
+
           if(update_backup_flag)
             update_backup();
 
@@ -758,28 +768,16 @@ u32 num_skipped_frames = 0;
 u32 interval_skipped_frames;
 u32 frames;
 
-u32 skipped_frames = 0;
-u32 ticks_needed_total = 0;
 const u32 frame_interval = 60;
 
 void synchronize()
 {
   u64 new_ticks;
   u64 time_delta;
-  static u32 fps = 60;
-  static u32 frames_drawn = 60;
-
-  if(gp2x_fps_debug)
-  {
-    char print_buffer[128];
-    sprintf(print_buffer, "%d (%d)", fps, frames_drawn);
-    print_string(print_buffer, 0xFFFF, 0x000, 0, 0);
-  }
 
   get_ticks_us(&new_ticks);
   time_delta = new_ticks - last_screen_timestamp;
   last_screen_timestamp = new_ticks;
-  ticks_needed_total += time_delta;
 
   skip_next_frame = 0;
   virtual_frame_count++;
@@ -802,14 +800,6 @@ void synchronize()
       num_skipped_frames = 0;
     }
   }
-  else
-  {
-    if((synchronize_flag) &&
-     ((time_delta < frame_speed) && synchronize_flag))
-    {
-      delay_us(frame_speed - time_delta);
-    }
-  }
 
   frames++;
 
@@ -829,7 +819,6 @@ void synchronize()
 
     last_frame_interval_timestamp = new_ticks;
     interval_skipped_frames = 0;
-    ticks_needed_total = 0;
     frames = 0;
   }
 
@@ -1008,7 +997,8 @@ void get_ticks_us(u64 *ticks_return)
 
 void delay_us(u32 us_count)
 {
-  usleep(us_count);
+  //usleep(us_count);
+  SDL_Delay(us_count / 1000);
 }
 
 void get_ticks_us(u64 *ticks_return)
@@ -1051,3 +1041,19 @@ void printout(void *str, u32 val)
 {
   printf(str, val);
 }
+
+void set_clock_speed()
+{
+  static u32 clock_speed_old = default_clock_speed;
+  if (clock_speed != clock_speed_old)
+  {
+    printf("about to set CPU clock to %iMHz\n", clock_speed);
+  #ifdef PSP_BUILD
+    scePowerSetClockFrequency(clock_speed, clock_speed, clock_speed / 2);
+  #elif defined(GP2X_BUILD)
+    set_FCLK(clock_speed);
+  #endif
+    clock_speed_old = clock_speed;
+  }
+}
+