initial pandora port, with hardware scaling and stuff
[gpsp.git] / gui.c
diff --git a/gui.c b/gui.c
index f03aa49..22a39e0 100644 (file)
--- a/gui.c
+++ b/gui.c
@@ -16,6 +16,9 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include "common.h"
+#include "font.h"
+
 #ifndef _WIN32_WCE
 
 #include <sys/stat.h>
 #ifndef _WIN32_WCE
 
 #include <sys/stat.h>
 
 #endif
 
 
 #endif
 
-#ifndef GP2X_BUILD
-#include "gp2x/cpuctrl.h"
-#endif
-
-#include "common.h"
-#include "font.h"
-
 #define MAX_PATH 1024
 
 // Blatantly stolen and trimmed from MZX (megazeux.sourceforge.net)
 
 #ifdef GP2X_BUILD
 
 #define MAX_PATH 1024
 
 // Blatantly stolen and trimmed from MZX (megazeux.sourceforge.net)
 
 #ifdef GP2X_BUILD
 
-#define FILE_LIST_ROWS ((int)((SDL_SCREEN_HEIGHT - 40) / FONT_HEIGHT))
+#define FILE_LIST_ROWS 20
 #define FILE_LIST_POSITION 5
 #define DIR_LIST_POSITION 260
 
 #define FILE_LIST_POSITION 5
 #define DIR_LIST_POSITION 260
 
 
 #ifdef PSP_BUILD
 
 
 #ifdef PSP_BUILD
 
+#define COLOR_BG            color16(2, 8, 10)
+
 #define color16(red, green, blue)                                             \
   (blue << 11) | (green << 5) | red                                           \
 
 #else
 
 #define color16(red, green, blue)                                             \
   (blue << 11) | (green << 5) | red                                           \
 
 #else
 
-#define color16(red, green, blue)                                             \
-  (red << 11) | (green << 5) | blue                                           \
-
-#endif
-
-#ifdef GP2X_BUILD
-
 #define COLOR_BG            color16(0, 0, 0)
 
 #define COLOR_BG            color16(0, 0, 0)
 
-#else
-
-#define COLOR_BG            color16(2, 8, 10)
+#define color16(red, green, blue)                                             \
+  (red << 11) | (green << 5) | blue                                           \
 
 #endif
 
 
 #endif
 
 #define COLOR_HELP_TEXT     color16(16, 40, 24)
 
 #ifdef PSP_BUILD
 #define COLOR_HELP_TEXT     color16(16, 40, 24)
 
 #ifdef PSP_BUILD
-  #define get_clock_speed() \
+  u8 *clock_speed_options[] =
+  {
+    "33MHz", "66MHz", "100MHz", "133MHz", "166MHz", "200MHz", "233MHz",
+    "266MHz", "300MHz", "333MHz"
+  };
+  #define menu_get_clock_speed() \
     clock_speed = (clock_speed_number + 1) * 33
   #define get_clock_speed_number() \
     clock_speed_number = (clock_speed / 33) - 1
 #elif defined(WIZ_BUILD)
     clock_speed = (clock_speed_number + 1) * 33
   #define get_clock_speed_number() \
     clock_speed_number = (clock_speed / 33) - 1
 #elif defined(WIZ_BUILD)
-  #define get_clock_speed() \
+  u8 *clock_speed_options[] =
+  {
+    "300MHz", "333MHz", "366MHz", "400MHz", "433MHz",
+    "466MHz", "500MHz", "533MHz", "566MHz", "600MHz",
+    "633MHz", "666MHz", "700MHz", "733MHz", "766MHz",
+    "800MHz", "833MHz", "866MHz", "900MHz"
+  };
+  #define menu_get_clock_speed() \
     clock_speed = 300 + (clock_speed_number * 3333) / 100
   #define get_clock_speed_number() \
     clock_speed_number = (clock_speed - 300) / 33
 #elif defined(GP2X_BUILD)
     clock_speed = 300 + (clock_speed_number * 3333) / 100
   #define get_clock_speed_number() \
     clock_speed_number = (clock_speed - 300) / 33
 #elif defined(GP2X_BUILD)
-  #define get_clock_speed() \
+  u8 *clock_speed_options[] =
+  {
+    "150MHz", "160MHz", "170MHz", "180MHz", "190MHz",
+    "200MHz", "210MHz", "220MHz", "230MHz", "240MHz",
+    "250MHz", "260MHz", "270MHz", "280MHz", "290MHz"
+  };
+  #define menu_get_clock_speed() \
     clock_speed = 150 + clock_speed_number * 10
   #define get_clock_speed_number() \
     clock_speed_number = (clock_speed - 150) / 10
 #else
     clock_speed = 150 + clock_speed_number * 10
   #define get_clock_speed_number() \
     clock_speed_number = (clock_speed - 150) / 10
 #else
-  #define get_clock_speed() 0
+  u8 *clock_speed_options[] =
+  {
+    "0"
+  };
+  #define menu_get_clock_speed() 0
   #define get_clock_speed_number() 0
 #endif
 
   #define get_clock_speed_number() 0
 #endif
 
-const int
-#ifdef WIZ_BUILD
-  default_clock_speed = 533;
-#elif defined(GP2X_BUILD)
-  default_clock_speed = 200;
-#else
-  default_clock_speed = 333;
-#endif
+
 int sort_function(const void *dest_str_ptr, const void *src_str_ptr)
 {
   char *dest_str = *((char **)dest_str_ptr);
 int sort_function(const void *dest_str_ptr, const void *src_str_ptr)
 {
   char *dest_str = *((char **)dest_str_ptr);
@@ -564,11 +569,11 @@ struct _menu_option_type
   void (* action_function)();
   void (* passive_function)();
   struct _menu_type *sub_menu;
   void (* action_function)();
   void (* passive_function)();
   struct _menu_type *sub_menu;
-  char *display_string;
+  const char *display_string;
   void *options;
   u32 *current_option;
   u32 num_options;
   void *options;
   u32 *current_option;
   u32 num_options;
-  char *help_string;
+  const char *help_string;
   u32 line_number;
   menu_option_type_enum option_type;
 };
   u32 line_number;
   menu_option_type_enum option_type;
 };
@@ -735,6 +740,28 @@ u32 gamepad_config_line_to_button[] =
 
 #endif
 
 
 #endif
 
+#ifdef PND_BUILD
+
+u32 gamepad_config_line_to_button[] =
+ { 0, 2, 1, 3, 8, 9, 10, 11, 6, 7, 4, 5, 12, 13, 14, 15 };
+
+#endif
+
+u8 *scale_options[] =
+{
+#ifdef PSP_BUILD
+  "unscaled 3:2", "scaled 3:2", "fullscreen 16:9"
+#elif defined(WIZ_BUILD)
+  "unscaled 3:2", "scaled 3:2 (slower)",
+  "unscaled 3:2 (anti-tear)", "scaled 3:2 (anti-tear)"
+#elif defined(PND_BUILD)
+  "unscaled", "2x", "3x", "fullscreen"
+#elif defined(GP2X_BUILD)
+  "unscaled 3:2", "scaled 3:2", "fullscreen", "scaled 3:2 (software)"
+#else
+  "unscaled 3:2"
+#endif
+};
 
 s32 load_game_config_file()
 {
 
 s32 load_game_config_file()
 {
@@ -815,10 +842,10 @@ s32 load_config_file()
 {
   u8 config_path[512];
 
 {
   u8 config_path[512];
 
-  #if (defined(PSP_BUILD) || defined(ARM_ARCH)) && !defined(_WIN32_WCE)
-    sprintf(config_path, "%s/%s", main_path, GPSP_CONFIG_FILENAME);
-  #else
+  #if defined(_WIN32) || defined(_WIN32_WCE)
     sprintf(config_path, "%s\\%s", main_path, GPSP_CONFIG_FILENAME);
     sprintf(config_path, "%s\\%s", main_path, GPSP_CONFIG_FILENAME);
+  #else
+    sprintf(config_path, "%s/%s", main_path, GPSP_CONFIG_FILENAME);
   #endif
 
   file_open(config_file, config_path, read);
   #endif
 
   file_open(config_file, config_path, read);
@@ -835,7 +862,8 @@ s32 load_config_file()
       s32 menu_button = -1;
       file_read_array(config_file, file_options);
 
       s32 menu_button = -1;
       file_read_array(config_file, file_options);
 
-      screen_scale = file_options[0] % 3;
+      screen_scale = file_options[0] %
+        (sizeof(scale_options) / sizeof(scale_options[0]));
       screen_filter = file_options[1] % 2;
       global_enable_audio = file_options[2] % 2;
 
       screen_filter = file_options[1] % 2;
       global_enable_audio = file_options[2] % 2;
 
@@ -1006,7 +1034,7 @@ void get_savestate_snapshot(u8 *savestate_filename)
   else
   {
     memset(snapshot_buffer, 0, 240 * 160 * 2);
   else
   {
     memset(snapshot_buffer, 0, 240 * 160 * 2);
-    print_string_ext("No savestate exists for this slot.",
+    print_string_ext("No savestate in this slot.",
      0xFFFF, 0x0000, 15, 75, snapshot_buffer, 240, 0, 0, FONT_HEIGHT);
     print_string("---------- --/--/---- --:--:--          ", COLOR_HELP_TEXT,
      COLOR_BG, 10, 40);
      0xFFFF, 0x0000, 15, 75, snapshot_buffer, 240, 0, 0, FONT_HEIGHT);
     print_string("---------- --/--/---- --:--:--          ", COLOR_HELP_TEXT,
      COLOR_BG, 10, 40);
@@ -1044,9 +1072,8 @@ void get_savestate_filename_noshot(u32 slot, u8 *name_buffer)
 
 u32 menu(u16 *original_screen)
 {
 
 u32 menu(u16 *original_screen)
 {
-  u32 clock_speed_number;
-  static u32 clock_speed_old = default_clock_speed;
   u8 print_buffer[81];
   u8 print_buffer[81];
+  u32 clock_speed_number;
   u32 _current_option = 0;
   gui_action_type gui_action;
   menu_enum _current_menu = MAIN_MENU;
   u32 _current_option = 0;
   gui_action_type gui_action;
   menu_enum _current_menu = MAIN_MENU;
@@ -1067,7 +1094,7 @@ u32 menu(u16 *original_screen)
   auto void choose_menu();
   auto void clear_help();
 
   auto void choose_menu();
   auto void clear_help();
 
-  u8 *gamepad_help[] =
+  static const u8 * const gamepad_help[] =
   {
     "Up button on GBA d-pad.",
     "Down button on GBA d-pad.",
   {
     "Up button on GBA d-pad.",
     "Down button on GBA d-pad.",
@@ -1093,6 +1120,17 @@ u32 menu(u16 *original_screen)
     "Does nothing."
   };
 
     "Does nothing."
   };
 
+  void menu_update_clock()
+  {
+    get_clock_speed_number();
+    if (clock_speed_number < 0 || clock_speed_number >=
+     sizeof(clock_speed_options) / sizeof(clock_speed_options[0]))
+    {
+      clock_speed = default_clock_speed;
+      get_clock_speed_number();
+    }
+  }
+
   void menu_exit()
   {
     if(!first_load)
   void menu_exit()
   {
     if(!first_load)
@@ -1101,7 +1139,7 @@ u32 menu(u16 *original_screen)
 
   void menu_quit()
   {
 
   void menu_quit()
   {
-    get_clock_speed();
+    menu_get_clock_speed();
     save_config_file();
     quit();
   }
     save_config_file();
     quit();
   }
@@ -1121,6 +1159,7 @@ u32 menu(u16 *original_screen)
        return_value = 1;
        repeat = 0;
        reg[CHANGED_PC_STATUS] = 1;
        return_value = 1;
        repeat = 0;
        reg[CHANGED_PC_STATUS] = 1;
+       menu_update_clock();
     }
     else
     {
     }
     else
     {
@@ -1232,19 +1271,6 @@ u32 menu(u16 *original_screen)
   u8 *yes_no_options[] = { "no", "yes" };
   u8 *enable_disable_options[] = { "disabled", "enabled" };
 
   u8 *yes_no_options[] = { "no", "yes" };
   u8 *enable_disable_options[] = { "disabled", "enabled" };
 
-  u8 *scale_options[] =
-  {
-#ifdef WIZ_BUILD
-    "unscaled 3:2", "scaled 3:2 (slower)",
-    "unscaled 3:2 (anti-tear)", "scaled 3:2 (anti-tear)"
-#else
-    "unscaled 3:2", "scaled 3:2", "fullscreen"
-#ifdef PSP_BUILD
-    " 16:9"
-#endif
-#endif
-  };
-
   u8 *frameskip_options[] = { "automatic", "manual", "off" };
   u8 *frameskip_variation_options[] = { "uniform", "random" };
 
   u8 *frameskip_options[] = { "automatic", "manual", "off" };
   u8 *frameskip_variation_options[] = { "uniform", "random" };
 
@@ -1266,29 +1292,6 @@ u32 menu(u16 *original_screen)
 
   u8 *update_backup_options[] = { "Exit only", "Automatic" };
 
 
   u8 *update_backup_options[] = { "Exit only", "Automatic" };
 
-#ifdef WIZ_BUILD
-  u8 *clock_speed_options[] =
-  {
-    "300MHz", "333MHz", "366MHz", "400MHz", "433MHz",
-    "466MHz", "500MHz", "533MHz", "566MHz", "600MHz",
-    "633MHz", "666MHz", "700MHz", "733MHz", "766MHz",
-    "800MHz", "833MHz", "866MHz", "900MHz"
-  };
-#elif defined(GP2X_BUILD)
-  u8 *clock_speed_options[] =
-  {
-    "150MHz", "160MHz", "170MHz", "180MHz", "190MHz",
-    "200MHz", "210MHz", "220MHz", "230MHz", "240MHz",
-    "250MHz", "260MHz", "270MHz", "280MHz", "290MHz"
-  };
-#else
-  u8 *clock_speed_options[] =
-  {
-    "33MHz", "66MHz", "100MHz", "133MHz", "166MHz", "200MHz", "233MHz",
-    "266MHz", "300MHz", "333MHz"
-  };
-#endif
-
   u8 *gamepad_config_buttons[] =
   {
     "UP",
   u8 *gamepad_config_buttons[] =
   {
     "UP",
@@ -1322,16 +1325,19 @@ u32 menu(u16 *original_screen)
      (u32 *)(&screen_scale),
      sizeof(scale_options) / sizeof(scale_options[0]),
 #ifndef GP2X_BUILD
      (u32 *)(&screen_scale),
      sizeof(scale_options) / sizeof(scale_options[0]),
 #ifndef GP2X_BUILD
-     "Determines how the GBA screen is resized in relation to the entire\n"
-     "screen. Select unscaled 3:2 for GBA resolution, scaled 3:2 for GBA\n"
+     "Determines how the GBA screen is resized in relation to the\n"
+     "entire screen."
+#ifdef PSP_BUILD
+     " Select unscaled 3:2 for GBA resolution, scaled 3:2 for GBA\n"
      "aspect ratio scaled to fill the height of the PSP screen, and\n"
      "fullscreen to fill the entire PSP screen."
      "aspect ratio scaled to fill the height of the PSP screen, and\n"
      "fullscreen to fill the entire PSP screen."
+#endif
 #endif
      "", 2),
 #ifndef GP2X_BUILD
     string_selection_option(NULL, "Screen filtering", yes_no_options,
      (u32 *)(&screen_filter), 2,
 #endif
      "", 2),
 #ifndef GP2X_BUILD
     string_selection_option(NULL, "Screen filtering", yes_no_options,
      (u32 *)(&screen_filter), 2,
-     "Determines whether or not bilinear filtering should be used when\n"
+     "Determines whether or not filtering should be used when\n"
      "scaling the screen. Selecting this will produce a more even and\n"
      "smooth image, at the cost of being blurry and having less vibrant\n"
      "colors.", 3),
      "scaling the screen. Selecting this will produce a more even and\n"
      "smooth image, at the cost of being blurry and having less vibrant\n"
      "colors.", 3),
@@ -1359,8 +1365,8 @@ u32 menu(u16 *original_screen)
 #ifndef GP2X_BUILD
      "If objects in the game flicker at a regular rate certain manual\n"
      "frameskip values may cause them to normally disappear. Change this\n"
 #ifndef GP2X_BUILD
      "If objects in the game flicker at a regular rate certain manual\n"
      "frameskip values may cause them to normally disappear. Change this\n"
-     "value to 'random' to avoid this. Do not use otherwise, as it tends to\n"
-     "make the image quality worse, especially in high motion games."
+     "value to 'random' to avoid this. Do not use otherwise, as it tends\n"
+     "to make the image quality worse, especially in high motion games."
 #endif
      "", 7),
     string_selection_option(NULL, "Audio output", yes_no_options,
 #endif
      "", 7),
     string_selection_option(NULL, "Audio output", yes_no_options,
@@ -1402,25 +1408,29 @@ u32 menu(u16 *original_screen)
     cheat_option(7),
     cheat_option(8),
     cheat_option(9),
     cheat_option(7),
     cheat_option(8),
     cheat_option(9),
+#if defined(PSP_BUILD) || defined(GP2X_BUILD)
     string_selection_option(NULL, "Clock speed",
      clock_speed_options, &clock_speed_number,
      sizeof(clock_speed_options) / sizeof(clock_speed_options[0]),
      "Change the clock speed of the device. Higher clock\n"
      "speed will yield better performance, but will drain\n"
      "battery life further.", 11),
     string_selection_option(NULL, "Clock speed",
      clock_speed_options, &clock_speed_number,
      sizeof(clock_speed_options) / sizeof(clock_speed_options[0]),
      "Change the clock speed of the device. Higher clock\n"
      "speed will yield better performance, but will drain\n"
      "battery life further.", 11),
+#endif
     string_selection_option(NULL, "Update backup",
      update_backup_options, &update_backup_flag, 2,
 #ifdef GP2X_BUILD
      "Determines when in-game save files should be\n"
     string_selection_option(NULL, "Update backup",
      update_backup_options, &update_backup_flag, 2,
 #ifdef GP2X_BUILD
      "Determines when in-game save files should be\n"
-     "written back to SD card.",
+     "written back to SD card."
 #else
      "Determines when in-game save files should be written back to\n"
 #else
      "Determines when in-game save files should be written back to\n"
-     "memstick. If set to 'automatic' writebacks will occur shortly after\n"
-     "the game's backup is altered. On 'exit only' it will only be written\n"
-     "back when you exit from this menu (NOT from using the home button).\n"
-     "Use the latter with extreme care.",
+     "card. If set to 'automatic' writebacks will occur shortly after\n"
+     "the game's backup is altered. On 'exit only' it will only be\n"
+     "written back when you exit from this menu.\n"
+#ifdef PSP
+     "(NOT from using the home button), use the latter with extreme care."
 #endif
 #endif
-     12),
+#endif
+     "", 12),
     submenu_option(NULL, "Back", "Return to the main menu.", 14)
   };
 
     submenu_option(NULL, "Back", "Return to the main menu.", 14)
   };
 
@@ -1490,7 +1500,7 @@ u32 menu(u16 *original_screen)
 
 #endif
 
 
 #endif
 
-#ifdef GP2X_BUILD
+#if defined(GP2X_BUILD) || defined(PND_BUILD)
 
   menu_option_type gamepad_config_options[] =
   {
 
   menu_option_type gamepad_config_options[] =
   {
@@ -1510,10 +1520,18 @@ u32 menu(u16 *original_screen)
     gamepad_config_option("Start        ", 10),
 #endif
     gamepad_config_option("Select       ", 11),
     gamepad_config_option("Start        ", 10),
 #endif
     gamepad_config_option("Select       ", 11),
-#ifndef WIZ_BUILD
+#if !defined(WIZ_BUILD) && !defined(PND_BUILD)
     gamepad_config_option("Stick Push   ", 12),
 #endif
     gamepad_config_option("Stick Push   ", 12),
 #endif
+#ifdef PND_BUILD
+    gamepad_config_option("1            ", 12),
+    gamepad_config_option("2            ", 13),
+    gamepad_config_option("3            ", 14),
+    gamepad_config_option("4            ", 15),
+    submenu_option(NULL, "Back", "Return to the main menu.", 16)
+#else
     submenu_option(NULL, "Back", "Return to the main menu.", 14)
     submenu_option(NULL, "Back", "Return to the main menu.", 14)
+#endif
   };
 
 
   };
 
 
@@ -1610,14 +1628,7 @@ u32 menu(u16 *original_screen)
     }
   }
 
     }
   }
 
-  get_clock_speed_number();
-  if (clock_speed_number < 0 || clock_speed_number >=
-   sizeof(clock_speed_options) / sizeof(clock_speed_options[0]))
-  {
-    clock_speed = default_clock_speed;
-    get_clock_speed_number();
-  }
-
+  menu_update_clock();
   video_resolution_large();
 
 #ifndef GP2X_BUILD
   video_resolution_large();
 
 #ifndef GP2X_BUILD
@@ -1679,13 +1690,13 @@ u32 menu(u16 *original_screen)
 
       if(display_option == current_option)
       {
 
       if(display_option == current_option)
       {
-        print_string_pad(line_buffer, COLOR_ACTIVE_ITEM, COLOR_BG, 10,
-         (display_option->line_number * 10) + 40, 41);
+        print_string_pad(line_buffer, COLOR_ACTIVE_ITEM, COLOR_BG, 6,
+         (display_option->line_number * 10) + 40, 36);
       }
       else
       {
       }
       else
       {
-        print_string_pad(line_buffer, COLOR_INACTIVE_ITEM, COLOR_BG, 10,
-         (display_option->line_number * 10) + 40, 41);
+        print_string_pad(line_buffer, COLOR_INACTIVE_ITEM, COLOR_BG, 6,
+         (display_option->line_number * 10) + 40, 36);
       }
     }
 
       }
     }
 
@@ -1766,20 +1777,11 @@ u32 menu(u16 *original_screen)
 
   set_gba_resolution(screen_scale);
   video_resolution_small();
 
   set_gba_resolution(screen_scale);
   video_resolution_small();
-
-  get_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;
-  }
+  menu_get_clock_speed();
+  set_clock_speed();
 
   SDL_PauseAudio(0);
 
   SDL_PauseAudio(0);
+  num_skipped_frames = 100;
 
   return return_value;
 }
 
   return return_value;
 }