diff --git a/include/app.h b/include/app.h index e1023534..34c27886 100644 --- a/include/app.h +++ b/include/app.h @@ -26,6 +26,7 @@ #define MAX_RECENT_ROMS 5 #define MAX_QUICKSAVES 5 #define POWER_SAVE_FRAME_DELAY 30 +#define MAX_GFX_PROGRAMS 10 struct ImGuiIO; @@ -88,11 +89,20 @@ extern char const * const binds_slug[]; struct app { atomic_bool run; + struct args { + char const *rom_path; + char const *bios_path; + } args; + struct { struct gba *gba; + struct launch_config *launch_config; + struct game_entry const *game_entry; + + FILE *backup_file; - bool started; - bool running; + bool is_started; + bool is_running; // Current FPS uint32_t fps; @@ -105,18 +115,33 @@ struct app { bool skip_bios; // Backup storage - enum backup_storage_types backup_type; + struct { + bool autodetect; + enum backup_storage_types type; + } backup_storage; // RTC - bool rtc_autodetect; - bool rtc_force_enabled; + struct { + bool autodetect; + bool enabled; + } rtc; + + // The current quicksave request + struct { + bool enabled; + size_t idx; + } quicksave_request; + + // The current quickload request + struct { + bool enabled; + void *data; + } quickload_request; } emulation; struct { SDL_Window *window; - SDL_GLContext gl_context; SDL_AudioDeviceID audio_device; - GLuint game_texture; /* Game controller */ struct { @@ -132,23 +157,35 @@ struct app { } controller; } sdl; + struct { + SDL_GLContext gl_context; + + enum texture_filter_kind texture_filter; + GLuint game_texture_in; + GLuint game_texture_out; + GLuint fbo; + GLuint vao; + GLuint vbo; + + GLuint program_color_correction; + + GLuint active_programs[MAX_GFX_PROGRAMS]; + size_t active_programs_length; + } gfx; + struct { char *config_path; char *bios_path; - char *game_path; char *recent_roms[MAX_RECENT_ROMS]; - char *backup_path; - FILE *backup_file; - struct { char *path; char *mtime; bool exist; } qsaves[MAX_QUICKSAVES]; - bool flush_qsaves_cache; + bool flush_qsaves_cache; // Set to true if the `mtime` and `exist` field of `qsaves` needs to be refreshed. } file; struct { @@ -156,17 +193,12 @@ struct app { enum aspect_ratio aspect_ratio; bool vsync; bool color_correction; - - struct { - enum texture_filter_kind kind; - bool refresh; - } texture_filter; - } video; struct { bool mute; float level; + uint32_t resample_frequency; } audio; struct { @@ -244,6 +276,9 @@ struct app { #if WITH_DEBUGGER struct { + bool is_running; + bool is_started; + csh handle_arm; // Capstone handle for ARM mode csh handle_thumb; // Capstone handle for Thumb mode @@ -260,17 +295,27 @@ struct app { }; /* common/game.c */ -void app_game_reset(struct app *app); +void app_game_process_all_notifs(struct app *app); +void app_game_configure(struct app *app, char const *rom_path); void app_game_stop(struct app *app); void app_game_run(struct app *app); void app_game_pause(struct app *app); -void app_game_write_backup(struct app *app); +void app_game_reset(struct app *app); +void app_game_exit(struct app *app); +void app_game_key(struct app *app, enum keys key, bool pressed); +void app_game_speed(struct app *app, uint32_t); +void app_game_update_backup(struct app *app); void app_game_screenshot(struct app *app); -void app_game_quicksave(struct app *, size_t); -void app_game_quickload(struct app *, size_t); +void app_game_quicksave(struct app *app, size_t idx); +void app_game_quickload(struct app *app, size_t idx); #ifdef WITH_DEBUGGER + void app_game_frame(struct app *app); void app_game_trace(struct app *app, size_t, void (*)(struct app *)); -void app_game_step(struct app *app, bool over, size_t cnt); +void app_game_step_in(struct app *app, size_t cnt); +void app_game_step_over(struct app *app, size_t cnt); +void app_game_set_breakpoints_list(struct app *app, struct breakpoint *breakpoints, size_t len); +void app_game_set_watchpoints_list(struct app *app, struct watchpoint *watchpoints, size_t len); + #endif diff --git a/include/common/channel/channel.h b/include/common/channel/channel.h new file mode 100644 index 00000000..7bed3d10 --- /dev/null +++ b/include/common/channel/channel.h @@ -0,0 +1,44 @@ +/******************************************************************************\ +** +** This file is part of the Hades GBA Emulator, and is made available under +** the terms of the GNU General Public License version 2. +** +** Copyright (C) 2021-2023 - The Hades Authors +** +\******************************************************************************/ + +#pragma once + +#include "hades.h" + +struct event_header { + int32_t kind; + size_t size; +}; + +struct channel { + struct event_header *events; // An array of events. + size_t length; // The number of event in `events` + size_t size; // The sum of the size of all the events in `events` + size_t allocated_size; // The size of the allocation of `events` + + pthread_mutex_t lock; + pthread_cond_t ready; +}; + +struct channels { + struct channel messages; // Sent by the frontned to the emulator + struct channel notifications; // Sent by the emulator to the frontend +#ifdef WITH_DEBUGGER + struct channel debug; // Sent by the emulator to the debugger +#endif +}; + +/* channel.c */ +void channel_init(struct channel *channel); +void channel_lock(struct channel *channel); +void channel_release(struct channel *channel); +void channel_push(struct channel *channel, struct event_header const *event); +void channel_wait(struct channel *channel); +struct event_header const *channel_next(struct channel const *channel, struct event_header const *event); +void channel_clear(struct channel *channel); diff --git a/include/common/channel/event.h b/include/common/channel/event.h new file mode 100644 index 00000000..0453be56 --- /dev/null +++ b/include/common/channel/event.h @@ -0,0 +1,153 @@ +/******************************************************************************\ +** +** This file is part of the Hades GBA Emulator, and is made available under +** the terms of the GNU General Public License version 2. +** +** Copyright (C) 2021-2023 - The Hades Authors +** +\******************************************************************************/ + +#pragma once + +#include "hades.h" +#include "gba/gba.h" + +/* +** Messages +*/ + +enum message_kind { + MESSAGE_EXIT, + MESSAGE_RESET, + MESSAGE_RUN, + MESSAGE_PAUSE, + MESSAGE_STOP, + MESSAGE_KEY, + MESSAGE_SPEED, + MESSAGE_QUICKSAVE, + MESSAGE_QUICKLOAD, + +#ifdef WITH_DEBUGGER + MESSAGE_FRAME, + MESSAGE_TRACE, + MESSAGE_STEP_IN, + MESSAGE_STEP_OVER, + MESSAGE_SET_BREAKPOINTS_LIST, + MESSAGE_SET_WATCHPOINTS_LIST, +#endif + + MESSAGE_MAX, + MESSAGE_MIN = 0, + MESSAGE_LEN = MESSAGE_MAX + 1, +}; + +struct message { + struct event_header header; +}; + +struct message_reset { + struct event_header header; + struct launch_config config; +}; + +struct message_speed { + struct event_header header; + uint32_t speed; +}; + +struct message_key { + struct event_header header; + enum keys key; + bool pressed; +}; + +struct message_quickload { + struct event_header header; + uint8_t *data; + size_t size; +}; + +#ifdef WITH_DEBUGGER + +struct message_step { + struct event_header header; + size_t count; +}; + +struct message_trace { + struct event_header header; + size_t count; + void (*tracer_cb)(void *); + void *arg; +}; + +struct message_set_breakpoints_list { + struct event_header header; + struct breakpoint *breakpoints; + size_t len; +}; + +struct message_set_watchpoints_list { + struct event_header header; + struct watchpoint *watchpoints; + size_t len; +}; + +#endif + +/* +** Notifications +*/ + +enum notification_kind { + NOTIFICATION_RESET, + NOTIFICATION_RUN, + NOTIFICATION_PAUSE, + NOTIFICATION_STOP, + + // Only sent to the frontend + NOTIFICATION_QUICKSAVE, + NOTIFICATION_QUICKLOAD, + + // Only sent to the debuger +#ifdef WITH_DEBUGGER + NOTIFICATION_BREAKPOINT, + NOTIFICATION_WATCHPOINT, + NOTIFICATION_BREAKPOINTS_LIST_SET, + NOTIFICATION_WATCHPOINTS_LIST_SET, +#endif + + NOTIFICATION_MAX, + NOTIFICATION_MIN = 0, + NOTIFICATION_LEN = NOTIFICATION_MAX + 1, +}; + +struct notification { + struct event_header header; +}; + +struct notification_quicksave { + struct event_header header; + uint8_t *data; + size_t size; +}; + +#ifdef WITH_DEBUGGER + +struct notification_breakpoint { + struct event_header header; + uint32_t addr; +}; + +struct notification_watchpoint { + struct event_header header; + uint32_t addr; + struct { + uint32_t addr; + uint32_t val; + uint32_t size; + bool write; + } access; +}; + +#endif diff --git a/include/compat.h b/include/common/compat.h similarity index 99% rename from include/compat.h rename to include/common/compat.h index ad810f3f..9daa699c 100644 --- a/include/compat.h +++ b/include/common/compat.h @@ -153,7 +153,7 @@ hs_usleep( static inline uint64_t -hs_tick_count(void) +hs_time(void) { FILETIME ts; uint64_t time; @@ -196,7 +196,7 @@ hs_basename( static inline uint64_t -hs_tick_count(void) +hs_time(void) { struct timespec ts; diff --git a/include/dbg/dbg.h b/include/dbg/dbg.h index 622db15d..90ad267f 100644 --- a/include/dbg/dbg.h +++ b/include/dbg/dbg.h @@ -13,6 +13,7 @@ #include #include "hades.h" +#include "common/channel/event.h" #include "gba/gba.h" struct app; @@ -169,7 +170,8 @@ extern size_t g_io_registers_len; void debugger_cmd_break(struct app *, size_t, struct arg const *); /* dbg/cmd/context.c */ -void debugger_dump_context(struct app *, bool); +void debugger_dump_context(struct app *); +void debugger_dump_context_auto(struct app *); void debugger_dump_context_compact(struct app *); void debugger_dump_context_compact_header(void); void debugger_cmd_context(struct app *, size_t, struct arg const *); @@ -223,7 +225,9 @@ void debugger_cmd_watch(struct app *, size_t, struct arg const *); void debugger_run(struct app *app); void debugger_reset_terminal(void); bool debugger_check_arg_type(enum commands_list command, struct arg const *arg, enum args_type expected); -void debugger_wait_for_emulator(struct app *, bool); +void debugger_process_all_notifs(struct app *); +void debugger_wait_for_emulator(struct app *); +void debugger_wait_for_notif(struct app *, enum notification_kind kind); /* dbg/io.c */ void debugger_io_init(struct gba *); diff --git a/include/gba/apu.h b/include/gba/apu.h index 24b738fd..a6a0be92 100644 --- a/include/gba/apu.h +++ b/include/gba/apu.h @@ -43,8 +43,6 @@ struct apu_rbuffer { }; struct apu { - uint64_t resample_frequency; // In cycles - struct fifo fifos[2]; struct wave wave; @@ -52,19 +50,16 @@ struct apu { int16_t fifo[2]; int16_t wave; } latch; - - pthread_mutex_t frontend_channels_mutex; - struct apu_rbuffer frontend_channels; }; /* gba/apu/apu.c */ -void apu_init(struct gba *gba); void apu_reset_fifo(struct gba *gba, enum fifo_idx fifo_idx); void apu_fifo_write8(struct gba *gba, enum fifo_idx fifo_idx, uint8_t val); uint32_t apu_rbuffer_pop(struct apu_rbuffer *rbuffer); void apu_on_timer_overflow(struct gba *gba, uint32_t timer_id); +void apu_sequencer(struct gba *gba, struct event_args args); +void apu_resample(struct gba *gba, struct event_args args); /* gba/apu/wave.c */ -void apu_wave_init(struct gba *); void apu_wave_reset(struct gba *gba); void apu_wave_stop(struct gba *gba); diff --git a/include/gba/core.h b/include/gba/core.h index 66f32d9f..92732059 100644 --- a/include/gba/core.h +++ b/include/gba/core.h @@ -207,7 +207,6 @@ static char const * const arm_modes_name[] = { }; /* gba/core/core.c */ -void core_init(struct gba *gba); void core_run(struct gba *gba); void core_next(struct gba *gba); void core_idle(struct gba *gba); diff --git a/include/gba/db.h b/include/gba/db.h deleted file mode 100644 index 40763649..00000000 --- a/include/gba/db.h +++ /dev/null @@ -1,25 +0,0 @@ -/******************************************************************************\ -** -** This file is part of the Hades GBA Emulator, and is made available under -** the terms of the GNU General Public License version 2. -** -** Copyright (C) 2021-2023 - The Hades Authors -** -\******************************************************************************/ - -#pragma once - -#include "gba/memory.h" - -#define FLAGS_NONE 0x0 -#define FLAGS_RTC 0x1 - -struct game_entry { - char *code; - enum backup_storage_types storage; - uint64_t flags; - char *title; -}; - -/* gba/db.c */ -void db_lookup_game(struct gba *gba); diff --git a/include/gba/debugger.h b/include/gba/debugger.h index 8874b35e..67f1e480 100644 --- a/include/gba/debugger.h +++ b/include/gba/debugger.h @@ -13,6 +13,14 @@ #include "hades.h" +enum gba_run_modes { + GBA_RUN_MODE_NORMAL, + GBA_RUN_MODE_FRAME, + GBA_RUN_MODE_TRACE, + GBA_RUN_MODE_STEP_IN, + GBA_RUN_MODE_STEP_OVER, +}; + /* ** The different reasons why the emulation could be interrupted. */ @@ -36,28 +44,14 @@ struct watchpoint { }; struct debugger { - struct { - atomic_bool flag; - enum interrupt_reasons reason; + // The "run mode" of the gba (how it should behave when running). + enum gba_run_modes run_mode; - union { - struct breakpoint *breakpoint; - struct { - struct watchpoint *watchpoint; - struct { - uint32_t ptr; - uint32_t val; - uint8_t size; - bool write; - } access; - }; - } data; - } interrupt; + bool interrupted; struct { struct breakpoint *list; size_t len; - void (*cleanup)(void *); } breakpoints; struct { @@ -68,8 +62,8 @@ struct debugger { struct { size_t count; - void *data; - void (*tracer)(void *); + void (*tracer_cb)(void *); + void *arg; } trace; struct { @@ -83,5 +77,6 @@ void debugger_init(struct debugger *debugger); void debugger_eval_breakpoints(struct gba *gba); void debugger_eval_write_watchpoints(struct gba *gba, uint32_t addr, size_t size, uint32_t); void debugger_eval_read_watchpoints(struct gba *gba, uint32_t addr, size_t size); +void debugger_execute_run_mode(struct gba *gba); #endif /* WITH_DEBUGGER */ diff --git a/include/gba/gba.h b/include/gba/gba.h index 32d268fc..e037922b 100644 --- a/include/gba/gba.h +++ b/include/gba/gba.h @@ -9,62 +9,32 @@ #pragma once -#include +#define GBA_SCREEN_WIDTH 240 +#define GBA_SCREEN_HEIGHT 160 +#define GBA_SCREEN_REAL_WIDTH 308 +#define GBA_SCREEN_REAL_HEIGHT 228 +#define GBA_CYCLES_PER_PIXEL 4 +#define GBA_CYCLES_PER_FRAME (CYCLES_PER_PIXEL * GBA_SCREEN_REAL_WIDTH * GBA_SCREEN_REAL_HEIGHT) +#define GBA_CYCLES_PER_SECOND (16 * 1024 * 1024) + +#include "hades.h" +#include "common/channel/channel.h" #include "gba/core.h" +#include "gba/scheduler.h" #include "gba/memory.h" #include "gba/ppu.h" -#include "gba/io.h" #include "gba/apu.h" -#include "gba/scheduler.h" +#include "gba/io.h" #include "gba/gpio.h" - -#ifdef WITH_DEBUGGER #include "gba/debugger.h" -#endif enum gba_states { - GBA_STATE_PAUSE = 0, + GBA_STATE_STOP = 0, + GBA_STATE_PAUSE, GBA_STATE_RUN, -#ifdef WITH_DEBUGGER - GBA_STATE_FRAME, - GBA_STATE_TRACE, - GBA_STATE_STEP_IN, - GBA_STATE_STEP_OVER, -#endif -}; - -enum device_states { - DEVICE_AUTO_DETECT = 0, - DEVICE_ENABLED, - DEVICE_DISABLED, -}; - -enum message_types { - MESSAGE_EXIT, - MESSAGE_BIOS, - MESSAGE_ROM, - MESSAGE_BACKUP, - MESSAGE_BACKUP_TYPE, - MESSAGE_SPEED, - MESSAGE_RESET, - MESSAGE_RUN, - MESSAGE_PAUSE, - MESSAGE_KEYINPUT, - MESSAGE_QUICKLOAD, - MESSAGE_QUICKSAVE, - MESSAGE_AUDIO_RESAMPLE_FREQ, - MESSAGE_SETTINGS_COLOR_CORRECTION, - MESSAGE_SETTINGS_RTC, -#ifdef WITH_DEBUGGER - MESSAGE_DBG_FRAME, - MESSAGE_DBG_TRACE, - MESSAGE_DBG_STEP, - MESSAGE_DBG_BREAKPOINTS, - MESSAGE_DBG_WATCHPOINTS, -#endif }; -enum keyinput { +enum keys { KEY_A, KEY_B, KEY_L, @@ -77,162 +47,113 @@ enum keyinput { KEY_SELECT, }; -struct message { - enum message_types type; - size_t size; -}; - -struct message_keyinput { - struct message super; - enum keyinput key; - bool pressed; -}; - -struct message_backup_type { - struct message super; - enum backup_storage_types type; -}; - -struct message_speed { - struct message super; - uint32_t speed; // 0 means unbounded (no fps cap). -}; - -struct message_reset { - struct message super; - bool skip_bios; -}; - -struct message_data { - struct message super; - uint8_t *data; - size_t size; - void (*cleanup)(void *); -}; - -struct message_audio_freq { - struct message super; - uint64_t resample_frequency; -}; - -struct message_color_correction { - struct message super; - bool color_correction; -}; +struct shared_data { + // The emulator's screen, as built by the PPU each frame. + struct { + uint32_t data[GBA_SCREEN_WIDTH * GBA_SCREEN_HEIGHT]; + pthread_mutex_t lock; + } framebuffer; -struct message_device_state { - struct message super; - enum device_states state; -}; + // The game's backup storage. + // There's no lock behind this data because + struct { + uint8_t *data; + size_t size; -#ifdef WITH_DEBUGGER + atomic_bool dirty; // Set to true when `data` is modified. + } backup_storage; -struct message_dbg_trace { - struct message super; - size_t count; - void *data; - void (*tracer)(void *); -}; + // The frame counter, used for FPS calculations. + atomic_uint frame_counter; -struct message_dbg_step { - struct message super; - bool over; - size_t count; + // Audio ring buffer. + struct apu_rbuffer audio_rbuffer; + pthread_mutex_t audio_rbuffer_mutex; }; -struct message_dbg_breakpoints { - struct message super; - struct breakpoint *breakpoints; - size_t len; - void (*cleanup)(void *); -}; +#define GAME_ENTRY_FLAGS_NONE 0x0 +#define GAME_ENTRY_FLAGS_RTC 0x1 -struct message_dbg_watchpoints { - struct message super; - struct watchpoint *watchpoints; - size_t len; - void (*cleanup)(void *); +struct game_entry { + char *code; + enum backup_storage_types storage; + uint64_t flags; + char *title; }; -#endif - -struct message_queue { - struct message *messages; - size_t length; - size_t allocated_size; +struct gba { + bool exit; - pthread_mutex_t lock; - pthread_cond_t ready; -}; + // The current state of the GBA + enum gba_states state; -struct game_entry; + // The channel used to communicate with the frontend + struct channels channels; -struct gba { - enum gba_states state; - uint32_t speed; + // Shared data with the frontend, mainly the framebuffer and audio channels. + struct shared_data shared_data; + // The different components of the GBA struct core core; + struct scheduler scheduler; struct memory memory; - struct io io; struct ppu ppu; struct apu apu; - struct scheduler scheduler; + struct io io; struct gpio gpio; #ifdef WITH_DEBUGGER struct debugger debugger; #endif +}; - /* Entry in the game database, if it exists. */ - struct game_entry *game_entry; - - /* Set to true when the emulation is started. Used to lock some options like backup type. */ - bool started; - - /* Stores if color correction is enabled. */ - bool color_correction; - - /* Stores the RTC-related settimgs */ - bool rtc_auto_detect; - bool rtc_enabled; - - /* The message queue used by the frontend to communicate with the emulator. */ - struct message_queue message_queue; - - /* The emulator's screen as it is being rendered. */ - uint32_t framebuffer[GBA_SCREEN_WIDTH * GBA_SCREEN_HEIGHT]; +struct launch_config { + // The game ROM and its size + struct { + uint8_t *data; + size_t size; + } rom; - /* The emulator's screen, refreshed each frame, used by the frontend */ - uint32_t framebuffer_frontend[GBA_SCREEN_WIDTH * GBA_SCREEN_HEIGHT]; - pthread_mutex_t framebuffer_frontend_mutex; + // The BIOS and its size + struct { + uint8_t *data; + size_t size; + } bios; - /* The frame counter, used for FPS calculations. */ - atomic_uint framecounter; -}; + // True if the BIOS should be skipped + bool skip_bios; -/* gba/gba.c */ -void gba_init(struct gba *gba); -void gba_main_loop(struct gba *gba); -void gba_send_exit(struct gba *gba); -void gba_send_bios(struct gba *gba, uint8_t *data, void (*cleanup)(void *)); -void gba_send_rom(struct gba *gba, uint8_t *data, size_t size, void (*cleanup)(void *)); -void gba_send_backup(struct gba *gba, uint8_t *data, size_t size, void (*cleanup)(void *)); -void gba_send_backup_type(struct gba *gba, enum backup_storage_types backup_type); -void gba_send_reset(struct gba *gba, bool skip_bios); -void gba_send_speed(struct gba *gba, uint32_t speed); -void gba_send_run(struct gba *gba); -void gba_send_pause(struct gba *gba); -void gba_send_keyinput(struct gba *gba, enum keyinput key, bool pressed); -void gba_send_quickload(struct gba *gba, char const *path); -void gba_send_quicksave(struct gba *gba, char const *path); -void gba_send_audio_resample_freq(struct gba *gba, uint64_t resample_freq); -void gba_send_settings_color_correction(struct gba *gba, bool color_correction); -void gba_send_settings_rtc(struct gba *gba, enum device_states state); + // Speed. 0 = unlimited, 1 = 60fps, 2 = 120fps, etc. + uint32_t speed; -#ifdef WITH_DEBUGGER -void gba_send_dbg_frame(struct gba *gba); -void gba_send_dbg_trace(struct gba *gba, size_t count, void *data, void (*tracer)(void *data)); -void gba_send_dbg_step(struct gba *gba, bool over, size_t count); -void gba_send_dbg_breakpoints(struct gba *gba, struct breakpoint *breakpoints, size_t len, void (*cleanup)(void *)); -void gba_send_dbg_watchpoints(struct gba *gba, struct watchpoint *watchpoints, size_t len, void (*cleanup)(void *)); -#endif + // Set to the frontend's audio frequency. + // Can be 0 if the frontend has no audio. + uint32_t audio_frequency; + + // True if RTC is enabled, false otherwise. + bool rtc; + + // The kind of storage type to use. + struct { + enum backup_storage_types type; + uint8_t *data; + size_t size; + } backup_storage; +}; + +struct notification; + +/* source/gba.c */ +struct gba *gba_create(void); +void gba_run(struct gba *gba); +void gba_delete(struct gba *gba); +void gba_shared_framebuffer_lock(struct gba *gba); +void gba_shared_framebuffer_release(struct gba *gba); +void gba_shared_audio_rbuffer_lock(struct gba *gba); +void gba_shared_audio_rbuffer_release(struct gba *gba); +uint32_t gba_shared_audio_rbuffer_pop_sample(struct gba *gba); +uint32_t gba_shared_reset_frame_counter(struct gba *gba); +void gba_delete_notification(struct notification const *notif); + +/* source/db.c */ +struct game_entry const *db_lookup_game(uint8_t const *code); diff --git a/include/gba/gpio.h b/include/gba/gpio.h index 8dffb598..d10e70ad 100644 --- a/include/gba/gpio.h +++ b/include/gba/gpio.h @@ -36,6 +36,8 @@ enum rtc_registers { }; struct rtc { + bool enabled; + enum rtc_states state; uint64_t data; @@ -69,11 +71,9 @@ struct gpio { struct gba; /* gpio/gpio.c */ -void gpio_init(struct gba *); uint8_t gpio_read_u8(struct gba *gba, uint32_t); void gpio_write_u8(struct gba *gba, uint32_t, uint8_t); /* gpio/rtc.c */ -void gpio_rtc_init(struct gba *); uint8_t gpio_rtc_read(struct gba *gba); void gpio_rtc_write(struct gba *gba, uint8_t); diff --git a/include/gba/memory.h b/include/gba/memory.h index b48a8afa..4f3c4c87 100644 --- a/include/gba/memory.h +++ b/include/gba/memory.h @@ -116,10 +116,6 @@ enum access_types { ** The different types of backup storage a game can use. */ enum backup_storage_types { - BACKUP_MIN = -1, - - BACKUP_AUTO_DETECT = -1, - BACKUP_NONE = 0, BACKUP_EEPROM_4K = 1, BACKUP_EEPROM_64K = 2, @@ -127,13 +123,19 @@ enum backup_storage_types { BACKUP_FLASH64 = 4, BACKUP_FLASH128 = 5, - BACKUP_MAX = 5, + BACKUP_MIN = BACKUP_NONE, + BACKUP_MAX = BACKUP_FLASH128, + BACKUP_LEN = BACKUP_MAX + 1, }; -enum backup_storage_sources { - BACKUP_SOURCE_AUTO_DETECT, - BACKUP_SOURCE_MANUAL, - BACKUP_SOURCE_DATABASE, + +static char const * const backup_storage_names[] = { + "None", + "EEPROM 4k", + "EEPROM 64k", + "SRAM", + "Flash 64k", + "Flash 128k", }; enum flash_states { @@ -219,6 +221,7 @@ struct memory { uint8_t rom[CART_SIZE]; size_t rom_size; + // Backup Storage struct { struct { // Flash memory @@ -227,15 +230,11 @@ struct memory { // EEPROM memory struct eeprom eeprom; } chip; - uint8_t *data; - size_t size; - enum backup_storage_types type; - enum backup_storage_sources source; - atomic_bool dirty; + enum backup_storage_types type; } backup_storage; - // Prefetch + // Prefetch buffer struct prefetch_buffer pbuffer; // Open Bus @@ -271,7 +270,6 @@ uint8_t mem_io_read8(struct gba const *gba, uint32_t addr); void mem_io_write8(struct gba *gba, uint32_t addr, uint8_t val); /* gba/memory/memory.c */ -void mem_reset(struct memory *memory); void mem_access(struct gba *gba, uint32_t addr, uint32_t size, enum access_types access_type); void mem_update_waitstates(struct gba const *gba); void mem_prefetch_buffer_access(struct gba *gba, uint32_t addr, uint32_t intended_cycles); @@ -301,16 +299,13 @@ uint8_t mem_flash_read8(struct gba const *gba, uint32_t addr); void mem_flash_write8(struct gba *gba, uint32_t addr, uint8_t val); /* gba/memory/storage/storage.c */ -extern size_t backup_storage_sizes[]; -void mem_backup_storage_detect(struct gba *gba); -void mem_backup_storage_init(struct gba *gba); uint8_t mem_backup_storage_read8(struct gba const *gba, uint32_t addr); void mem_backup_storage_write8(struct gba *gba, uint32_t addr, uint8_t value); void mem_backup_storage_write_to_disk(struct gba *gba); /* gba/quicksave.c */ -void quicksave(struct gba const *gba, char const *); -void quickload(struct gba *gba, char const *); +void quicksave(struct gba const *gba, uint8_t **data, size_t *size); +bool quickload(struct gba *gba, uint8_t *data, size_t size); /* ** The following memory-accessors are used by the PPU for fast memory access diff --git a/include/gba/ppu.h b/include/gba/ppu.h index b56c0f7c..2e814bed 100644 --- a/include/gba/ppu.h +++ b/include/gba/ppu.h @@ -10,14 +10,7 @@ #pragma once #include "hades.h" - -#define GBA_SCREEN_WIDTH 240 -#define GBA_SCREEN_HEIGHT 160 -#define GBA_SCREEN_REAL_WIDTH 308 -#define GBA_SCREEN_REAL_HEIGHT 228 -#define CYCLES_PER_PIXEL 4 -#define CYCLES_PER_FRAME (CYCLES_PER_PIXEL * GBA_SCREEN_REAL_WIDTH * GBA_SCREEN_REAL_HEIGHT) -#define CYCLES_PER_SECOND (16 * 1024 * 1024) +#include "gba/gba.h" enum oam_mode { OAM_MODE_NORMAL, @@ -118,6 +111,9 @@ union oam_entry { static_assert(sizeof(union oam_entry) == 3 * sizeof(uint16_t)); struct ppu { + // The emulator's screen as it is being rendered. + uint32_t framebuffer[GBA_SCREEN_WIDTH * GBA_SCREEN_HEIGHT]; + // Internal registers used for affine backgrounds int32_t internal_px[2]; int32_t internal_py[2]; @@ -145,8 +141,9 @@ void ppu_step_affine_internal_registers(struct gba *gba); void ppu_prerender_oam(struct gba *gba, struct scanline *scanline, int32_t line); /* gba/ppu/ppu.c */ -void ppu_init(struct gba *); void ppu_render_black_screen(struct gba *gba); +void ppu_hblank(struct gba *gba, struct event_args args); +void ppu_hdraw(struct gba *gba, struct event_args args); /* gba/ppu/window.c */ void ppu_window_build_masks(struct gba *gba, uint32_t y); diff --git a/include/gba/scheduler.h b/include/gba/scheduler.h index e7e10200..15e94d3b 100644 --- a/include/gba/scheduler.h +++ b/include/gba/scheduler.h @@ -52,19 +52,19 @@ struct scheduler_event { }; struct scheduler { + uint64_t cycles; // Amount of cycles spent by the system since initialization + uint64_t next_event; // The next event should occure when cycles == next_event struct scheduler_event *events; size_t events_size; -}; -/* gba/scheduler.c */ -void sched_init(struct gba *gba); -void sched_cleanup(struct gba *gba); -event_handler_t sched_add_event(struct gba *gba, struct scheduler_event event); -void sched_cancel_event(struct gba *gba, event_handler_t handler); -void sched_process_events(struct gba *gba); -void sched_run_for(struct gba *gba, uint64_t cycles); + uint32_t speed; // Speed. 0 = unlimited, 1 = 60fps, 2 = 120fps, etc. + + uint64_t time_per_frame; + uint64_t time_last_frame; + uint64_t accumulated_time; +}; #define NEW_FIX_EVENT(_at, _callback) \ (struct scheduler_event){ \ @@ -113,3 +113,11 @@ void sched_run_for(struct gba *gba, uint64_t cycles); #define EVENT_ARGS(...) CONCAT(EVENT_ARGS_, NARG(__VA_ARGS__))(__VA_ARGS__) #define EVENT_ARG(kind, _value) ((union event_arg) { .kind = (_value) }) #define EVENT_ARG_EMPTY ((union event_arg) { 0 }) + +/* gba/scheduler.c */ +event_handler_t sched_add_event(struct gba *gba, struct scheduler_event event); +void sched_cancel_event(struct gba *gba, event_handler_t handler); +void sched_process_events(struct gba *gba); +void sched_run_for(struct gba *gba, uint64_t cycles); +void sched_frame_limiter(struct gba *gba,struct event_args args); +void sched_update_speed(struct gba *gba, uint32_t speed); diff --git a/include/gui/gui.h b/include/gui/gui.h index c04efad8..4e041f64 100644 --- a/include/gui/gui.h +++ b/include/gui/gui.h @@ -13,6 +13,8 @@ struct app; +#define GLSL(src) "#version 330 core\n" #src + /* gui/sdl/audio.c */ void gui_sdl_audio_init(struct app *app); void gui_sdl_audio_cleanup(struct app *app); @@ -29,6 +31,13 @@ void gui_sdl_handle_inputs(struct app *app); void gui_sdl_video_init(struct app *app); void gui_sdl_video_cleanup(struct app *app); void gui_sdl_video_render_frame(struct app *app); +void gui_sdl_video_rebuild_pipeline(struct app *app); + +/* gui/shaders/frag-color-correction.c */ +extern char const *SHADER_FRAG_COLOR_CORRECTION; + +/* gui/shaders/vertex-common.c */ +extern char const *SHADER_VERTEX_COMMON; /* gui/windows/keybinds.c */ void gui_win_keybinds_editor(struct app *app); @@ -46,4 +55,4 @@ void gui_win_menubar(struct app *app); /* config.c */ void gui_config_load(struct app *app); void gui_config_save(struct app *app); -void gui_config_push_recent_rom(struct app *app); +void gui_config_push_recent_rom(struct app *app, char const *path); diff --git a/source/common/channel.c b/source/common/channel.c new file mode 100644 index 00000000..86bf40d3 --- /dev/null +++ b/source/common/channel.c @@ -0,0 +1,139 @@ +/******************************************************************************\ +** +** This file is part of the Hades GBA Emulator, and is made available under +** the terms of the GNU General Public License version 2. +** +** Copyright (C) 2021-2023 - The Hades Authors +** +\******************************************************************************/ + +#include +#include "hades.h" +#include "common/channel/channel.h" +#include "common/channel/event.h" + +/* +** Initialize the channel. +*/ +void +channel_init( + struct channel *channel +) { + memset(channel, 0, sizeof(*channel)); + + pthread_mutex_init(&channel->lock, NULL); + pthread_cond_init(&channel->ready, NULL); +} + +/* +** Lock the channel. +*/ +void +channel_lock( + struct channel *channel +) { + pthread_mutex_lock(&channel->lock); +} + +/* +** Release the channel. +*/ +void +channel_release( + struct channel *channel +) { + pthread_mutex_unlock(&channel->lock); +} + +/* +** Push an event at the end of a channel. +** +** The channel must already be locked. +*/ +void +channel_push( + struct channel *channel, + struct event_header const *event +) { + size_t new_size; + + // Reallocate if `channel->events` is too small. + new_size = channel->size + event->size; + if (channel->allocated_size < new_size) { + if (!channel->allocated_size) { + channel->allocated_size += 1; + } + + while (channel->allocated_size < new_size) { + channel->allocated_size *= 2; + } + channel->events = realloc(channel->events, channel->allocated_size); + hs_assert(channel->events); + } + + // Copy the new event at the end of the buffer + memcpy((uint8_t *)channel->events + channel->size, event, event->size); + + // Update the channel's length and size + channel->length += 1; + channel->size += event->size; + + pthread_cond_broadcast(&channel->ready); +} + +/* +** Wait for an event to be available. +** +** The channel must already be locked. +*/ +void +channel_wait( + struct channel *channel +) { + pthread_cond_wait(&channel->ready, &channel->lock); +} + +/* +** Return a read-only view of the next event in the channel. +** One can iterate over the events contained in a channel by calling +** this function multiple time, using the previous return value as the +** new value for `prev_event`. +** +** On the first call, `prev_event` must be NULL. +** Return `NULL` if there is no more event in the channel. +** +** The returned pointer is valid until `channel_release` or `channel_clear_events` is called. +** +** The channel must already be locked. +*/ +struct event_header const * +channel_next( + struct channel const *channel, + struct event_header const *prev_event +) { + struct event_header *new_event; + + if (prev_event) { + new_event = (struct event_header *)((uint8_t *)prev_event + prev_event->size); + } else { + new_event = channel->events; + } + + if ((uint8_t *)new_event < (uint8_t *)channel->events + channel->size) { + return (new_event); + } + return (NULL); +} + +/* +** Clear the channel of all of its events. +** +** The channel must already be locked. +*/ +void +channel_clear( + struct channel *channel +) { + channel->length = 0; + channel->size = 0; +} diff --git a/source/common/game.c b/source/common/game.c index d966e847..40d27eca 100644 --- a/source/common/game.c +++ b/source/common/game.c @@ -7,22 +7,200 @@ ** \******************************************************************************/ -#define _GNU_SOURCE #define STB_IMAGE_WRITE_IMPLEMENTATION #include #include -#include -#include -#include "hades.h" #include "app.h" -#include "compat.h" #include "gba/gba.h" #include "gui/gui.h" +#include "common/compat.h" +#include "common/channel/event.h" + +/* +** Process and delete the given notification. +** +** NOTE: This only handles frontend notifications. +** The debugger is expected to handle its notification on its own. +*/ +static +void +app_game_process_notif( + struct app *app, + struct event_header const *notif_header +) { + struct notification const *notif; + + notif = (struct notification const *)notif_header; + switch (notif->header.kind) { + case NOTIFICATION_RUN: { + app->emulation.is_started = true; + app->emulation.is_running = true; + break; + }; + case NOTIFICATION_STOP: { + app->emulation.is_started = false; + app->emulation.is_running = false; + break; + }; + case NOTIFICATION_RESET: { + app->emulation.is_started = true; + break; + }; + case NOTIFICATION_PAUSE: { + app->emulation.is_running = false; + break; + }; + case NOTIFICATION_QUICKSAVE: { + struct notification_quicksave *qsave; + char const *path; + FILE *file; + + qsave = (struct notification_quicksave *)notif; + + hs_assert(app->emulation.quicksave_request.enabled); + path = app->file.qsaves[app->emulation.quicksave_request.idx].path; + + file = hs_fopen(path, "wb+"); + if (!file) { + goto qsave_err; + } + + if (fwrite(qsave->data, qsave->size, 1, file) != 1) { + goto qsave_err; + } + + logln( + HS_INFO, + "State saved to %s%s%s", + g_light_magenta, + path, + g_reset + ); + + goto qsave_finally; + +qsave_err: + logln( + HS_INFO, + "%sError: failed to save state to %s: %s%s", + g_light_red, + path, + strerror(errno), + g_reset + ); + +qsave_finally: + app->emulation.quicksave_request.enabled = false; + app->emulation.quicksave_request.idx = 0; + app->file.flush_qsaves_cache = true; + + if (file) { + fclose(file); + } + + break; + }; + case NOTIFICATION_QUICKLOAD: { + char const *path; + + hs_assert(app->emulation.quickload_request.enabled); + + path = app->file.qsaves[app->emulation.quicksave_request.idx].path; + + logln( + HS_INFO, + "State loaded from %s%s%s", + g_light_magenta, + path, + g_reset + ); + + free(app->emulation.quickload_request.data); + + app->emulation.quickload_request.enabled = false; + app->emulation.quickload_request.data = NULL; + break; + }; + } + gba_delete_notification(notif); +} + +void +app_game_process_all_notifs( + struct app *app +) { + struct channel *channel; + struct event_header const *event; + + channel = &app->emulation.gba->channels.notifications; + + channel_lock(channel); + { + event = channel_next(channel, NULL); + while (event) { + app_game_process_notif(app, event); + event = channel_next(channel, event); + } + channel_clear(channel); + } + channel_release(channel); +} + +void +app_game_wait_for_notif( + struct app *app, + enum notification_kind kind +) { + struct channel *channel; + bool ok; + + channel = &app->emulation.gba->channels.notifications; + ok = false; + + channel_lock(channel); + + while (!ok) { + struct event_header const *event; + + event = channel_next(channel, NULL); + while (event) { + app_game_process_notif(app, event); + ok = (event->kind == kind); + event = channel_next(channel, event); + } + + channel_clear(channel); + + if (!ok) { + channel_wait(channel); + } + } + + channel_release(channel); +} + +static +void +app_game_unconfigure( + struct app *app +) { + if (app->emulation.launch_config) { + free(app->emulation.launch_config->bios.data); + free(app->emulation.launch_config->rom.data); + free(app->emulation.launch_config); + app->emulation.launch_config = NULL; + } + + if (app->emulation.backup_file) { + fclose(app->emulation.backup_file); + app->emulation.backup_file = NULL; + } +} static bool -app_game_load_bios( +app_game_configure_bios( struct app *app ) { FILE *file; @@ -74,36 +252,29 @@ app_game_load_bios( return (true); } - gba_send_bios(app->emulation.gba, data, free); + app->emulation.launch_config->bios.data = data; + app->emulation.launch_config->bios.size = BIOS_SIZE; return (false); } static bool -app_game_load_rom( - struct app *app +app_game_configure_rom( + struct app *app, + char const *rom_path ) { FILE *file; size_t file_len; void *data; char *error_msg; - if (!app->file.game_path) { - hs_assert(-1 != asprintf( - &error_msg, - "no game ROM found.\n\nPlease download and select a valid Nintendo GBA ROM using \"File\" -> \"Open\"." - )); - gui_new_error(app, error_msg); - return (true); - } - - file = hs_fopen(app->file.game_path, "rb"); + file = hs_fopen(rom_path, "rb"); if (!file) { hs_assert(-1 != asprintf( &error_msg, "failed to open %s: %s.", - app->file.game_path, + rom_path, strerror(errno) )); gui_new_error(app, error_msg); @@ -127,7 +298,7 @@ app_game_load_rom( hs_assert(-1 != asprintf( &error_msg, "failed to read %s: %s.", - app->file.game_path, + rom_path, strerror(errno) )); gui_new_error(app, error_msg); @@ -135,69 +306,54 @@ app_game_load_rom( return (true); } - gba_send_rom(app->emulation.gba, data, file_len, free); - - return (false); -} - -static -bool -app_game_load_devices( - struct app *app -) { - gba_send_backup_type(app->emulation.gba, app->emulation.backup_type); - - if (app->emulation.rtc_autodetect) { - gba_send_settings_rtc(app->emulation.gba, DEVICE_AUTO_DETECT); - } else { - gba_send_settings_rtc(app->emulation.gba, app->emulation.rtc_force_enabled ? DEVICE_ENABLED : DEVICE_DISABLED); - } + app->emulation.launch_config->rom.data = data; + app->emulation.launch_config->rom.size = file_len; return (false); } static bool -app_game_load_save( - struct app *app +app_game_configure_backup( + struct app *app, + char const *backup_path ) { size_t file_len; char *error_msg; - if (app->file.backup_file) { - fclose(app->file.backup_file); - } - - app->file.backup_file = hs_fopen(app->file.backup_path, "rb+"); + app->emulation.backup_file = hs_fopen(backup_path, "rb+"); - if (app->file.backup_file) { + if (app->emulation.backup_file) { void *data; size_t read_len; - fseek(app->file.backup_file, 0, SEEK_END); - file_len = ftell(app->file.backup_file); - rewind(app->file.backup_file); + fseek(app->emulation.backup_file, 0, SEEK_END); + file_len = ftell(app->emulation.backup_file); + rewind(app->emulation.backup_file); data = calloc(1, file_len); hs_assert(data); - read_len = fread(data, 1, file_len, app->file.backup_file); + + read_len = fread(data, 1, file_len, app->emulation.backup_file); if (read_len != file_len) { logln(HS_WARNING, "Failed to read the save file. Is it corrupted?"); } else { - logln(HS_INFO, "Save data successfully loaded."); - gba_send_backup(app->emulation.gba, data, file_len, free); + logln(HS_INFO, "Save file successfully read."); } + + app->emulation.launch_config->backup_storage.data = data; + app->emulation.launch_config->backup_storage.size = file_len; } else { logln(HS_WARNING, "Failed to open the save file. A new one is created instead."); - app->file.backup_file = hs_fopen(app->file.backup_path, "wb+"); + app->emulation.backup_file = hs_fopen(backup_path, "wb+"); - if (!app->file.backup_file) { + if (!app->emulation.backup_file) { hs_assert(-1 != asprintf( &error_msg, "failed to create %s: %s.", - app->file.backup_path, + backup_path, strerror(errno) )); gui_new_error(app, error_msg); @@ -208,26 +364,37 @@ app_game_load_save( } /* -** Load the BIOS/ROM into the emulator's memory and reset it. +** Update the GBA's launch configuration to load a new game +** +** This function abstracts all the different step needed to load a game: +** - Read the BIOS/ROM files +** - Extracting the game code +** - Performing a database lookup to identify the features of the game +** - Update the gba's launch configuration */ void -app_game_reset( - struct app *app +app_game_configure( + struct app *app, + char const *rom_path ) { + struct message_reset event; + char *backup_path; char *extension; - size_t base_len; + size_t basename_len; size_t i; + uint8_t *code; - gui_config_push_recent_rom(app); + app_game_unconfigure(app); - free(app->file.backup_path); + app->emulation.launch_config = calloc(1, sizeof(struct launch_config)); + hs_assert(app->emulation.launch_config); - extension = strrchr(app->file.game_path, '.'); + extension = strrchr(rom_path, '.'); if (extension) { - base_len = extension - app->file.game_path; + basename_len = extension - rom_path; } else { - base_len = strlen(app->file.game_path); + basename_len = strlen(rom_path); } for (i = 0; i < MAX_QUICKSAVES; ++i) { @@ -239,8 +406,8 @@ app_game_reset( hs_assert(-1 != asprintf( &app->file.qsaves[i].path, "%.*s.%zu.hds", - (int)base_len, - app->file.game_path, + (int)basename_len, + rom_path, i + 1 )); } @@ -248,28 +415,107 @@ app_game_reset( app->file.flush_qsaves_cache = true; hs_assert(-1 != asprintf( - &app->file.backup_path, + &backup_path, "%.*s.sav", - (int)base_len, - app->file.game_path + (int)basename_len, + rom_path )); - app_game_stop(app); + if (app_game_configure_bios(app) + || app_game_configure_rom(app, rom_path) + || app_game_configure_backup(app, backup_path) + ) { + app_game_unconfigure(app); + return ; + } - /* Misc. */ - gba_send_speed(app->emulation.gba, app->emulation.speed * !app->emulation.unbounded); - gba_send_settings_color_correction(app->emulation.gba, app->video.color_correction); + code = app->emulation.launch_config->rom.data + 0xAC; + app->emulation.game_entry = db_lookup_game(code); - if ( - !app_game_load_bios(app) - && !app_game_load_rom(app) - && !app_game_load_devices(app) - && !app_game_load_save(app) - ) { - gba_send_reset(app->emulation.gba, app->emulation.skip_bios); + if (app->emulation.game_entry) { + logln( + HS_INFO, + "Game code %s%.3s%s identified as %s%s%s.", + g_light_magenta, + code, + g_reset, + g_light_magenta, + app->emulation.game_entry->title, + g_reset + ); } else { - app_game_stop(app); + logln( + HS_WARNING, + "No game with the code \"%s%.3s%s\" could be found in the Hades game database.", + g_light_magenta, + code, + g_reset + ); + } + + app->emulation.launch_config->skip_bios = app->emulation.skip_bios; + app->emulation.launch_config->speed = app->emulation.speed; + app->emulation.launch_config->audio_frequency = GBA_CYCLES_PER_SECOND / app->audio.resample_frequency; + + if (app->emulation.rtc.autodetect) { + app->emulation.launch_config->rtc = (bool)(app->emulation.game_entry->flags & GAME_ENTRY_FLAGS_RTC); + } else { + app->emulation.launch_config->rtc = app->emulation.rtc.enabled; + } + + if (app->emulation.backup_storage.autodetect) { + app->emulation.launch_config->backup_storage.type = app->emulation.game_entry->storage; + } else { + app->emulation.launch_config->backup_storage.type = app->emulation.backup_storage.type; } + + logln(HS_INFO, "Emulator's configuration:"); + logln(HS_INFO, " Skip BIOS: %s", app->emulation.launch_config->skip_bios ? "true" : "false"); + logln(HS_INFO, " Backup storage: %s", backup_storage_names[app->emulation.launch_config->backup_storage.type]); + logln(HS_INFO, " Rtc: %s", app->emulation.launch_config->rtc ? "true" : "false"); + logln(HS_INFO, " Speed: %i", app->emulation.speed); + logln(HS_INFO, " Audio Frequency: %iHz (%i cycles)", app->audio.resample_frequency, app->emulation.launch_config->audio_frequency); + + // Send the RESET message. + + event.header.kind = MESSAGE_RESET; + event.header.size = sizeof(event); + + memcpy(&event.config, app->emulation.launch_config, sizeof(event.config)); + + channel_lock(&app->emulation.gba->channels.messages); + channel_push(&app->emulation.gba->channels.messages, &event.header); + channel_release(&app->emulation.gba->channels.messages); + + gui_config_push_recent_rom(app, rom_path); +} + +/* +** Reset the already-configured emulation. +*/ +void +app_game_reset( + struct app *app +) { + struct message_reset event; + + hs_assert(app->emulation.launch_config); + event.header.kind = MESSAGE_RESET; + event.header.size = sizeof(event); + + memcpy(&event.config, app->emulation.launch_config, sizeof(event.config)); + + /* + ** Process all notifications before sending the reset message to make sure the NOTIFICATION_RESET we will + ** receive comes from the correct reset message. + */ + + app_game_process_all_notifs(app); + channel_lock(&app->emulation.gba->channels.messages); + channel_push(&app->emulation.gba->channels.messages, &event.header); + channel_release(&app->emulation.gba->channels.messages); + + app_game_wait_for_notif(app, NOTIFICATION_RESET); } /* @@ -279,9 +525,16 @@ void app_game_stop( struct app *app ) { - app->emulation.started = false; - app->emulation.running = false; - gba_send_reset(app->emulation.gba, app->emulation.skip_bios); + struct message event; + + app_game_unconfigure(app); + + event.header.kind = MESSAGE_STOP; + event.header.size = sizeof(event); + + channel_lock(&app->emulation.gba->channels.messages); + channel_push(&app->emulation.gba->channels.messages, &event.header); + channel_release(&app->emulation.gba->channels.messages); } /* @@ -291,9 +544,14 @@ void app_game_run( struct app *app ) { - app->emulation.started = true; - app->emulation.running = true; - gba_send_run(app->emulation.gba); + struct message event; + + event.header.kind = MESSAGE_RUN; + event.header.size = sizeof(event); + + channel_lock(&app->emulation.gba->channels.messages); + channel_push(&app->emulation.gba->channels.messages, &event.header); + channel_release(&app->emulation.gba->channels.messages); } /* @@ -303,98 +561,101 @@ void app_game_pause( struct app *app ) { - app->emulation.started = true; - app->emulation.running = false; - gba_send_pause(app->emulation.gba); -} + struct message event; -#ifdef WITH_DEBUGGER + event.header.kind = MESSAGE_PAUSE; + event.header.size = sizeof(event); + + channel_lock(&app->emulation.gba->channels.messages); + channel_push(&app->emulation.gba->channels.messages, &event.header); + channel_release(&app->emulation.gba->channels.messages); +} /* -** Run until the end of the current frame. +** Exit the emulation. */ void -app_game_frame( +app_game_exit( struct app *app ) { - app->emulation.started = true; - app->emulation.running = true; - gba_send_dbg_frame(app->emulation.gba); + struct message event; + + event.header.kind = MESSAGE_EXIT; + event.header.size = sizeof(event); + + channel_lock(&app->emulation.gba->channels.messages); + channel_push(&app->emulation.gba->channels.messages, &event.header); + channel_release(&app->emulation.gba->channels.messages); } /* -** Trace the emulation. +** Update a key's state. */ void -app_game_trace( +app_game_key( struct app *app, - size_t count, - void (*tracer)(struct app *app) + enum keys key, + bool pressed ) { - app->emulation.started = true; - app->emulation.running = true; - gba_send_dbg_trace(app->emulation.gba, count, app, (void (*)(void *))tracer); + struct message_key event; + + event.header.kind = MESSAGE_KEY; + event.header.size = sizeof(event); + event.key = key; + event.pressed = pressed; + + channel_lock(&app->emulation.gba->channels.messages); + channel_push(&app->emulation.gba->channels.messages, &event.header); + channel_release(&app->emulation.gba->channels.messages); } /* -** Step over/in X instructions. +** Update the emulator's speed. */ void -app_game_step( +app_game_speed( struct app *app, - bool over, - size_t count + uint32_t speed ) { - app->emulation.started = true; - app->emulation.running = true; - gba_send_dbg_step(app->emulation.gba, over, count); -} + struct message_speed event; -#endif + event.header.kind = MESSAGE_SPEED; + event.header.size = sizeof(event); + event.speed = speed; + + channel_lock(&app->emulation.gba->channels.messages); + channel_push(&app->emulation.gba->channels.messages, &event.header); + channel_release(&app->emulation.gba->channels.messages); +} /* -** Write the content of the backup storage on the disk. +** Write the content of the backup storage on the disk, only if it's dirty. */ void -app_game_write_backup( +app_game_update_backup( struct app *app ) { - if ( app->file.backup_file - && app->emulation.gba->memory.backup_storage.data - && app->emulation.gba->memory.backup_storage.dirty + bool dirty; + + dirty = atomic_exchange(&app->emulation.gba->shared_data.backup_storage.dirty, 0); + if (dirty + && app->emulation.backup_file + && app->emulation.gba->shared_data.backup_storage.data ) { - fseek(app->file.backup_file, 0, SEEK_SET); + fseek(app->emulation.backup_file, 0, SEEK_SET); fwrite( - app->emulation.gba->memory.backup_storage.data, - backup_storage_sizes[app->emulation.gba->memory.backup_storage.type], + app->emulation.gba->shared_data.backup_storage.data, + app->emulation.gba->shared_data.backup_storage.size, 1, - app->file.backup_file + app->emulation.backup_file ); } - app->emulation.gba->memory.backup_storage.dirty = false; -} - -void -app_game_quicksave( - struct app *app, - size_t idx -) { - if (idx < MAX_QUICKSAVES) { - gba_send_quicksave(app->emulation.gba, app->file.qsaves[idx].path); - app->file.flush_qsaves_cache = true; - } -} - -void -app_game_quickload( - struct app *app, - size_t idx -) { - if (idx < MAX_QUICKSAVES) { - gba_send_quickload(app->emulation.gba, app->file.qsaves[idx].path); - } + app->emulation.gba->shared_data.backup_storage.dirty = false; } +/* +** Take a screenshot of the game and writes it to the disk. +*/ void app_game_screenshot( struct app *app @@ -410,16 +671,16 @@ app_game_screenshot( hs_mkdir("screenshots"); strftime(filename, sizeof(filename), "screenshots/%Y-%m-%d_%Hh%Mm%Ss.png", now_info); - pthread_mutex_lock(&app->emulation.gba->framebuffer_frontend_mutex); + pthread_mutex_lock(&app->emulation.gba->shared_data.framebuffer.lock); out = stbi_write_png( filename, GBA_SCREEN_WIDTH, GBA_SCREEN_HEIGHT, 4, - app->emulation.gba->framebuffer_frontend, + app->emulation.gba->shared_data.framebuffer.data, GBA_SCREEN_WIDTH * sizeof(uint32_t) ); - pthread_mutex_unlock(&app->emulation.gba->framebuffer_frontend_mutex); + pthread_mutex_unlock(&app->emulation.gba->shared_data.framebuffer.lock); if (out) { logln( @@ -440,3 +701,228 @@ app_game_screenshot( ); } } + +void +app_game_quicksave( + struct app *app, + size_t idx +) { + struct message event; + + app->emulation.quicksave_request.enabled = true; + app->emulation.quicksave_request.idx = idx; + + event.header.kind = MESSAGE_QUICKSAVE; + event.header.size = sizeof(event); + + channel_lock(&app->emulation.gba->channels.messages); + channel_push(&app->emulation.gba->channels.messages, &event.header); + channel_release(&app->emulation.gba->channels.messages); +} + +void +app_game_quickload( + struct app *app, + size_t idx +) { + struct message_quickload event; + + char const *path; + FILE *file; + uint8_t *data; + size_t size; + + if (app->emulation.quickload_request.enabled) { + logln(HS_WARNING, "A saved state is already being loaded by the emulator, ignoring the new request."); + return ; + } + + data = NULL; + path = app->file.qsaves[idx].path; + + file = hs_fopen(path, "rb"); + if (!file) { + goto err; + } + + fseek(file, 0, SEEK_END); + size = ftell(file); + rewind(file); + + data = calloc(1, size); + hs_assert(data); + + if (fread(data, size, 1, file) != 1) { + goto err; + } + + app->emulation.quickload_request.enabled = true; + app->emulation.quickload_request.data = data; + + event.header.kind = MESSAGE_QUICKLOAD; + event.header.size = sizeof(event); + event.data = data; + event.size = size; + + channel_lock(&app->emulation.gba->channels.messages); + channel_push(&app->emulation.gba->channels.messages, &event.header); + channel_release(&app->emulation.gba->channels.messages); + + goto finally; + +err: + logln( + HS_INFO, + "%sError: failed to load state from %s: %s%s", + g_light_red, + path, + strerror(errno), + g_reset + ); + + free(data); + +finally: + if (file) { + fclose(file); + } +} + +#ifdef WITH_DEBUGGER + +#include "dbg/dbg.h" + +/* +** Run until the end of the current frame. +*/ +void +app_game_frame( + struct app *app +) { + struct message event; + + event.header.kind = MESSAGE_FRAME; + event.header.size = sizeof(event); + + channel_lock(&app->emulation.gba->channels.messages); + channel_push(&app->emulation.gba->channels.messages, &event.header); + channel_release(&app->emulation.gba->channels.messages); +} + +/* +** Trace the emulation. +*/ +void +app_game_trace( + struct app *app, + size_t count, + void (*tracer_cb)(struct app *app) +) { + struct message_trace event; + + event.header.kind = MESSAGE_TRACE; + event.header.size = sizeof(event); + event.count = count; + event.tracer_cb = (void (*)(void *))tracer_cb; + event.arg = app; + + channel_lock(&app->emulation.gba->channels.messages); + channel_push(&app->emulation.gba->channels.messages, &event.header); + channel_release(&app->emulation.gba->channels.messages); +} + +/* +** Step in `count instructions. +*/ +void +app_game_step_in( + struct app *app, + size_t count +) { + struct message_step event; + + event.header.kind = MESSAGE_STEP_IN; + event.header.size = sizeof(event); + event.count = count; + + channel_lock(&app->emulation.gba->channels.messages); + channel_push(&app->emulation.gba->channels.messages, &event.header); + channel_release(&app->emulation.gba->channels.messages); +} + +/* +** Step over `count overstructions. +*/ +void +app_game_step_over( + struct app *app, + size_t count +) { + struct message_step event; + + event.header.kind = MESSAGE_STEP_OVER; + event.header.size = sizeof(event); + event.count = count; + + channel_lock(&app->emulation.gba->channels.messages); + channel_push(&app->emulation.gba->channels.messages, &event.header); + channel_release(&app->emulation.gba->channels.messages); +} + +/* +** Set the list of breakpoints and wait to make sure it was correctly copied by the emulator. +*/ +void +app_game_set_breakpoints_list( + struct app *app, + struct breakpoint *breakpoints, + size_t len +) { + struct message_set_breakpoints_list event; + + event.header.kind = MESSAGE_SET_BREAKPOINTS_LIST; + event.header.size = sizeof(event); + event.breakpoints = breakpoints; + event.len = len; + + /* + ** Process all notifications before sending the message to make sure the notification we will + ** receive comes from the correct message. + */ + + debugger_process_all_notifs(app); + channel_lock(&app->emulation.gba->channels.messages); + channel_push(&app->emulation.gba->channels.messages, &event.header); + channel_release(&app->emulation.gba->channels.messages); + debugger_wait_for_notif(app, NOTIFICATION_BREAKPOINTS_LIST_SET); +} + +/* +** Set the list of watchpoints and wait to make sure it was correctly copied by the emulator. +*/ +void +app_game_set_watchpoints_list( + struct app *app, + struct watchpoint *watchpoints, + size_t len +) { + struct message_set_watchpoints_list event; + + event.header.kind = MESSAGE_SET_WATCHPOINTS_LIST; + event.header.size = sizeof(event); + event.watchpoints = watchpoints; + event.len = len; + + /* + ** Process all notifications before sending the message to make sure the notification we will + ** receive comes from the correct message. + */ + + debugger_process_all_notifs(app); + channel_lock(&app->emulation.gba->channels.messages); + channel_push(&app->emulation.gba->channels.messages, &event.header); + channel_release(&app->emulation.gba->channels.messages); + debugger_wait_for_notif(app, NOTIFICATION_WATCHPOINTS_LIST_SET); +} + +#endif diff --git a/source/common/meson.build b/source/common/meson.build index d3acf241..0ba510db 100644 --- a/source/common/meson.build +++ b/source/common/meson.build @@ -9,6 +9,7 @@ libcommon = static_library( 'common', + 'channel.c', 'game.c', 'log.c', 'utils.c', diff --git a/source/dbg/cmd/break.c b/source/dbg/cmd/break.c index af74acef..d828c774 100644 --- a/source/dbg/cmd/break.c +++ b/source/dbg/cmd/break.c @@ -39,13 +39,13 @@ debugger_cmd_break( } } else if (argc == 1) { if (!debugger_check_arg_type(CMD_BREAK, &argv[0], ARGS_INTEGER)) { - struct breakpoint *clone; - app->debugger.breakpoints = realloc( app->debugger.breakpoints, sizeof(struct breakpoint) * (app->debugger.breakpoints_len + 1) ); + hs_assert(app->debugger.breakpoints); + app->debugger.breakpoints[app->debugger.breakpoints_len].ptr = argv[0].value.i64; ++app->debugger.breakpoints_len; @@ -56,14 +56,9 @@ debugger_cmd_break( g_reset ); - clone = malloc(sizeof(struct breakpoint) * (app->debugger.breakpoints_len)); - hs_assert(clone); - memcpy(clone, app->debugger.breakpoints, sizeof(struct breakpoint) * (app->debugger.breakpoints_len)); - - gba_send_dbg_breakpoints(app->emulation.gba, clone, app->debugger.breakpoints_len, free); + app_game_set_breakpoints_list(app, app->debugger.breakpoints, app->debugger.breakpoints_len); } } else if (argc == 2) { - struct breakpoint *clone; size_t idx; if (debugger_check_arg_type(CMD_BREAK, &argv[0], ARGS_STRING) @@ -94,14 +89,11 @@ debugger_cmd_break( app->debugger.breakpoints, sizeof(struct breakpoint) * (app->debugger.breakpoints_len - 1) ); - app->debugger.breakpoints_len -= 1; - hs_assert(app->debugger.breakpoints); + --app->debugger.breakpoints_len; - clone = malloc(sizeof(struct breakpoint) * (app->debugger.breakpoints_len)); - hs_assert(clone); - memcpy(clone, app->debugger.breakpoints, sizeof(struct breakpoint) * (app->debugger.breakpoints_len)); + hs_assert(app->debugger.breakpoints); - gba_send_dbg_breakpoints(app->emulation.gba, clone, app->debugger.breakpoints_len, free); + app_game_set_breakpoints_list(app, app->debugger.breakpoints, app->debugger.breakpoints_len); } else { printf("Usage: %s\n", g_commands[CMD_BREAK].usage); } diff --git a/source/dbg/cmd/context.c b/source/dbg/cmd/context.c index 0562a5e7..62309d4c 100644 --- a/source/dbg/cmd/context.c +++ b/source/dbg/cmd/context.c @@ -13,7 +13,7 @@ #include "hades.h" #include "app.h" #include "dbg/dbg.h" -#include "compat.h" +#include "common/compat.h" /* ** Dump the registers' content, a disassembly of instructions around the PC @@ -21,13 +21,8 @@ */ void debugger_dump_context( - struct app *app, - bool force + struct app *app ) { - if (!force && !hs_isatty(STDIN_FILENO)) { - return ; - } - printf("---------------------------------Registers----------------------------------\n"); debugger_cmd_registers( app, @@ -50,6 +45,18 @@ debugger_dump_context( printf("----------------------------------------------------------------------------\n"); } +/* +** Same as `debugger_dump_context`, but is a no-op if stdout isn't a tty. +*/ +void +debugger_dump_context_auto( + struct app *app +) { + if (hs_isatty(STDIN_FILENO)) { + debugger_dump_context(app); + } +} + void debugger_dump_context_compact_header(void) { @@ -120,7 +127,12 @@ debugger_cmd_context( size_t argc __unused, struct arg const *argv __unused ) { - debugger_dump_context(app, true); + if (!app->debugger.is_started) { + logln(HS_ERROR, "%s%s%s", g_red, "This command cannot be used when no game is running.", g_reset); + return; + } + + debugger_dump_context(app); } void @@ -129,6 +141,11 @@ debugger_cmd_context_compact( size_t argc __unused, struct arg const *argv __unused ) { + if (!app->debugger.is_started) { + logln(HS_ERROR, "%s%s%s", g_red, "This command cannot be used when no game is running.", g_reset); + return; + } + debugger_dump_context_compact(app); debugger_dump_context_compact_header(); } diff --git a/source/dbg/cmd/continue.c b/source/dbg/cmd/continue.c index d32540d5..12200893 100644 --- a/source/dbg/cmd/continue.c +++ b/source/dbg/cmd/continue.c @@ -17,7 +17,12 @@ debugger_cmd_continue( size_t argc __unused, struct arg const *argv __unused ) { - app->emulation.gba->debugger.interrupt.flag = false; + if (!app->debugger.is_started) { + logln(HS_ERROR, "%s%s%s", g_red, "This command cannot be used when no game is running.", g_reset); + return; + } + app_game_run(app); - debugger_wait_for_emulator(app, true); + debugger_wait_for_emulator(app); + debugger_dump_context_auto(app); } diff --git a/source/dbg/cmd/disas.c b/source/dbg/cmd/disas.c index 992fd5da..440e885b 100644 --- a/source/dbg/cmd/disas.c +++ b/source/dbg/cmd/disas.c @@ -295,12 +295,17 @@ debugger_cmd_disas( size_t op_len; uint32_t ptr; + if (!app->debugger.is_started) { + logln(HS_ERROR, "%s%s%s", g_red, "This command cannot be used when no game is running.", g_reset); + return; + } + core = &app->emulation.gba->core; thumb = core->cpsr.thumb; op_len = thumb ? 2 : 4; if (argc == 0) { - ptr = core->pc - op_len * 2; + ptr = core->pc >= op_len * 2 ? core->pc - op_len * 2 : 0; } else if (argc == 1) { if (debugger_check_arg_type(CMD_DISAS, &argv[0], ARGS_INTEGER)) { return ; diff --git a/source/dbg/cmd/frame.c b/source/dbg/cmd/frame.c index dbceea7f..165a9420 100644 --- a/source/dbg/cmd/frame.c +++ b/source/dbg/cmd/frame.c @@ -17,7 +17,12 @@ debugger_cmd_frame( size_t argc __unused, struct arg const *argv __unused ) { - app->emulation.gba->debugger.interrupt.flag = false; + if (!app->debugger.is_started) { + logln(HS_ERROR, "%s%s%s", g_red, "This command cannot be used when no game is running.", g_reset); + return; + } + app_game_frame(app); - debugger_wait_for_emulator(app, true); + debugger_wait_for_emulator(app); + debugger_dump_context_auto(app); } diff --git a/source/dbg/cmd/io.c b/source/dbg/cmd/io.c index 6f5c3fe0..1aa6e746 100644 --- a/source/dbg/cmd/io.c +++ b/source/dbg/cmd/io.c @@ -134,6 +134,11 @@ debugger_cmd_io( size_t argc, struct arg const *argv ) { + if (!app->debugger.is_started) { + logln(HS_ERROR, "%s%s%s", g_red, "This command cannot be used when no game is running.", g_reset); + return; + } + if (argc == 0) { uint32_t val; size_t i; diff --git a/source/dbg/cmd/print.c b/source/dbg/cmd/print.c index f15cb355..61f19a06 100644 --- a/source/dbg/cmd/print.c +++ b/source/dbg/cmd/print.c @@ -263,6 +263,11 @@ debugger_cmd_print( size_t quantity; uint32_t addr; + if (!app->debugger.is_started) { + logln(HS_ERROR, "%s%s%s", g_red, "This command cannot be used when no game is running.", g_reset); + return; + } + if (argc != 2 && argc != 3) { printf("Usage: %s\n", g_commands[CMD_PRINT].usage); return ; diff --git a/source/dbg/cmd/registers.c b/source/dbg/cmd/registers.c index 0a13b87c..7ff69b85 100644 --- a/source/dbg/cmd/registers.c +++ b/source/dbg/cmd/registers.c @@ -24,6 +24,11 @@ debugger_cmd_registers( size_t i; struct core *core; + if (!app->debugger.is_started) { + logln(HS_ERROR, "%s%s%s", g_red, "This command cannot be used when no game is running.", g_reset); + return; + } + core = &app->emulation.gba->core; for (i = 0; i < 4; ++i) { printf( diff --git a/source/dbg/cmd/reset.c b/source/dbg/cmd/reset.c index 4e69e9ef..72e26602 100644 --- a/source/dbg/cmd/reset.c +++ b/source/dbg/cmd/reset.c @@ -17,8 +17,10 @@ debugger_cmd_reset( size_t argc __unused, struct arg const *argv __unused ) { - app->emulation.gba->debugger.interrupt.flag = false; + if (!app->debugger.is_started) { + logln(HS_ERROR, "%s%s%s", g_red, "This command cannot be used when no game is running.", g_reset); + return; + } + app_game_reset(app); - app_game_run(app); - debugger_wait_for_emulator(app, true); } diff --git a/source/dbg/cmd/step.c b/source/dbg/cmd/step.c index 11cf1ab5..207db18c 100644 --- a/source/dbg/cmd/step.c +++ b/source/dbg/cmd/step.c @@ -17,19 +17,24 @@ debugger_cmd_step_in( size_t argc, struct arg const *argv ) { + if (!app->debugger.is_started) { + logln(HS_ERROR, "%s%s%s", g_red, "This command cannot be used when no game is running.", g_reset); + return; + } + if (argc == 0) { - app->emulation.gba->debugger.interrupt.flag = false; - app_game_step(app, false, 1); - debugger_wait_for_emulator(app, true); + app_game_step_in(app, 1); + debugger_wait_for_emulator(app); + debugger_dump_context_auto(app); } else if (argc == 1) { if (debugger_check_arg_type(CMD_STEP_IN, &argv[0], ARGS_INTEGER)) { return ; } - app->emulation.gba->debugger.interrupt.flag = false; - app_game_step(app, false, argv[0].value.i64); - debugger_wait_for_emulator(app, true); + app_game_step_in(app, argv[0].value.i64); + debugger_wait_for_emulator(app); + debugger_dump_context_auto(app); } else { printf("Usage: %s\n", g_commands[CMD_STEP_IN].usage); return ; @@ -42,19 +47,24 @@ debugger_cmd_step_over( size_t argc, struct arg const *argv ) { + if (!app->debugger.is_started) { + logln(HS_ERROR, "%s%s%s", g_red, "This command cannot be used when no game is running.", g_reset); + return; + } + if (argc == 0) { - app->emulation.gba->debugger.interrupt.flag = false; - app_game_step(app, true, 1); - debugger_wait_for_emulator(app, true); + app_game_step_over(app, 1); + debugger_wait_for_emulator(app); + debugger_dump_context_auto(app); } else if (argc == 1) { if (debugger_check_arg_type(CMD_STEP_OVER, &argv[0], ARGS_INTEGER)) { return ; } - app->emulation.gba->debugger.interrupt.flag = false; - app_game_step(app, true, argv[0].value.i64); - debugger_wait_for_emulator(app, true); + app_game_step_over(app, argv[0].value.i64); + debugger_wait_for_emulator(app); + debugger_dump_context_auto(app); } else { printf("Usage: %s\n", g_commands[CMD_STEP_OVER].usage); return ; diff --git a/source/dbg/cmd/trace.c b/source/dbg/cmd/trace.c index a52ae743..19028385 100644 --- a/source/dbg/cmd/trace.c +++ b/source/dbg/cmd/trace.c @@ -17,22 +17,24 @@ debugger_cmd_trace( size_t argc, struct arg const *argv ) { + if (!app->debugger.is_started) { + logln(HS_ERROR, "%s%s%s", g_red, "This command cannot be used when no game is running.", g_reset); + return; + } + if (argc == 0) { debugger_dump_context_compact_header(); - app->emulation.gba->debugger.interrupt.flag = false; app_game_trace(app, 1, debugger_dump_context_compact); - debugger_wait_for_emulator(app, false); + debugger_wait_for_emulator(app); debugger_dump_context_compact_header(); } else if (argc == 1) { - if (debugger_check_arg_type(CMD_TRACE, &argv[0], ARGS_INTEGER)) { return ; } debugger_dump_context_compact_header(); - app->emulation.gba->debugger.interrupt.flag = false; app_game_trace(app, argv[0].value.i64, debugger_dump_context_compact); - debugger_wait_for_emulator(app, false); + debugger_wait_for_emulator(app); debugger_dump_context_compact_header(); } else { printf("Usage: %s\n", g_commands[CMD_TRACE].usage); diff --git a/source/dbg/cmd/watch.c b/source/dbg/cmd/watch.c index 9ef2dd32..4fec9950 100644 --- a/source/dbg/cmd/watch.c +++ b/source/dbg/cmd/watch.c @@ -52,8 +52,6 @@ debugger_cmd_watch( write = !strcmp(argv[0].value.s, "write") || !strcmp(argv[0].value.s, "w"); if (read || write) { - struct watchpoint *clone; - app->debugger.watchpoints = realloc( app->debugger.watchpoints, sizeof(struct watchpoint) * (app->debugger.watchpoints_len + 1) @@ -73,13 +71,8 @@ debugger_cmd_watch( g_reset ); - clone = malloc(sizeof(struct watchpoint) * (app->debugger.watchpoints_len)); - hs_assert(clone); - memcpy(clone, app->debugger.watchpoints, sizeof(struct watchpoint) * (app->debugger.watchpoints_len)); - - gba_send_dbg_watchpoints(app->emulation.gba, clone, app->debugger.watchpoints_len, free); + app_game_set_watchpoints_list(app, app->debugger.watchpoints, app->debugger.watchpoints_len); } else if (!strcmp(argv[0].value.s, "delete") || !strcmp(argv[0].value.s, "d")) { - struct watchpoint *clone; size_t idx; idx = argv[1].value.i64; @@ -102,11 +95,7 @@ debugger_cmd_watch( app->debugger.watchpoints_len -= 1; hs_assert(app->debugger.watchpoints); - clone = malloc(sizeof(struct watchpoint) * (app->debugger.watchpoints_len)); - hs_assert(clone); - memcpy(clone, app->debugger.watchpoints, sizeof(struct watchpoint) * (app->debugger.watchpoints_len)); - - gba_send_dbg_watchpoints(app->emulation.gba, clone, app->debugger.watchpoints_len, free); + app_game_set_watchpoints_list(app, app->debugger.watchpoints, app->debugger.watchpoints_len); } else { printf("Usage: %s\n", g_commands[CMD_WATCH].usage); } diff --git a/source/dbg/dbg.c b/source/dbg/dbg.c index a69e49a0..8c7e4a62 100644 --- a/source/dbg/dbg.c +++ b/source/dbg/dbg.c @@ -13,7 +13,6 @@ #include #include "hades.h" #include "app.h" -#include "compat.h" #include "dbg/lang.h" #include "dbg/dbg.h" #include "gba/gba.h" @@ -142,70 +141,189 @@ struct command g_commands[] = { } }; +/* +** Process a single notifiation, updating the content of `app->debugger` accordingly. +*/ void -debugger_wait_for_emulator( +debugger_process_notif( struct app *app, - bool dump_context + struct notification const *notif ) { - while (!app->emulation.gba->debugger.interrupt.flag) { - // This is to ensure the loop has a side-effect (otherwise it's UB) - // and to help the CPU save some energy. - hs_usleep(100000); - } - - if (dump_context) { - debugger_dump_context(app, false); - } + switch (notif->header.kind) { + case NOTIFICATION_RUN: { + app->debugger.is_started = true; + app->debugger.is_running = true; + break; + }; + case NOTIFICATION_STOP: { + app->debugger.is_started = false; + app->debugger.is_running = false; + break; + }; + case NOTIFICATION_RESET: { + app->debugger.is_started = true; + break; + }; + case NOTIFICATION_PAUSE: { + app->debugger.is_running = false; + break; + }; + case NOTIFICATION_BREAKPOINT: { + struct notification_breakpoint const *notif_bp; - switch (app->emulation.gba->debugger.interrupt.reason) { - case GBA_INTERRUPT_REASON_BREAKPOINT_REACHED: { + notif_bp = (struct notification_breakpoint const *)notif; printf( ">>>>> Breakpoint %s0x%08x%s hit! <<<<<\n", g_light_magenta, - app->emulation.gba->debugger.interrupt.data.breakpoint->ptr, + notif_bp->addr, g_reset ); break; }; - case GBA_INTERRUPT_REASON_WATCHPOINT_REACHED: { - if (app->emulation.gba->debugger.interrupt.data.access.write) { + case NOTIFICATION_WATCHPOINT: { + struct notification_watchpoint const *notif_wp; + + notif_wp = (struct notification_watchpoint const *)notif; + if (notif_wp->access.write) { printf( ">>>>> Watchpoint %s0x%08x%s hit with a %swrite%s of %s0x%0*x%s to %s0x%08x%s! <<<<<\n", g_light_magenta, - app->emulation.gba->debugger.interrupt.data.watchpoint->ptr, + notif_wp->addr, g_reset, g_light_green, g_reset, g_light_magenta, - app->emulation.gba->debugger.interrupt.data.access.size * 2, - app->emulation.gba->debugger.interrupt.data.access.val, + notif_wp->access.size, + notif_wp->access.val, g_reset, g_light_magenta, - app->emulation.gba->debugger.interrupt.data.access.ptr, + notif_wp->access.addr, g_reset ); } else { printf( ">>>>> Watchpoint %s0x%08x%s hit with a %sread%s of size %s%i%s to %s0x%08x%s! <<<<<\n", g_light_magenta, - app->emulation.gba->debugger.interrupt.data.watchpoint->ptr, + notif_wp->addr, g_reset, g_light_green, g_reset, g_light_magenta, - app->emulation.gba->debugger.interrupt.data.access.size, + notif_wp->access.size, g_reset, g_light_magenta, - app->emulation.gba->debugger.interrupt.data.access.ptr, + notif_wp->access.addr, g_reset ); } break; }; - default: break; + } + gba_delete_notification(notif); +} + +/* +** Process all remaining notifications in the debug channel. +*/ +void +debugger_process_all_notifs( + struct app *app +) { + struct channel *channel; + + channel = &app->emulation.gba->channels.debug; + channel_lock(channel); + { + struct event_header const *event; + + event = channel_next(channel, NULL); + while (event) { + debugger_process_notif(app, (struct notification const *)event); + event = channel_next(channel, event); + } + channel_clear(channel); + } + channel_release(channel); +} + +/* +** Wait for a specific notification. +*/ +void +debugger_wait_for_notif( + struct app *app, + enum notification_kind kind +) { + struct channel *channel; + bool ok; + + channel = &app->emulation.gba->channels.debug; + ok = false; + + channel_lock(channel); + + while (!ok) { + struct event_header const *event; + + event = channel_next(channel, NULL); + while (event) { + debugger_process_notif(app, (struct notification const *)event); + ok = (event->kind == kind); + event = channel_next(channel, event); + } + + channel_clear(channel); + + if (!ok) { + channel_wait(channel); + } + } + + channel_release(channel); +} + + +/* +** Wait for the emulator to send us a RUN and PAUSE notification in succession. +** +** Used by a lot of commands to wait before the emulator finishes whatever they want it to do. +*/ +void +debugger_wait_for_emulator( + struct app *app +) { + struct channel *channel; + enum gba_states state; + + channel = &app->emulation.gba->channels.debug; + state = GBA_STATE_STOP; + + channel_lock(channel); + + while (state != GBA_STATE_PAUSE) { + struct event_header const *event; + + event = channel_next(channel, NULL); + while (event) { + debugger_process_notif(app, (struct notification const *)event); + + if (event->kind == NOTIFICATION_RUN && state == GBA_STATE_STOP) { + state = GBA_STATE_RUN; + } else if (event->kind == NOTIFICATION_PAUSE && state == GBA_STATE_RUN) { + state = GBA_STATE_PAUSE; + } + + event = channel_next(channel, event); + } + + channel_clear(channel); + + if (state != GBA_STATE_PAUSE) { + channel_wait(channel); + } } - app_game_pause(app); + channel_release(channel); } static @@ -260,6 +378,10 @@ debugger_run_command( // TODO FIXME free stuff } + // Ensure the state of `is_running` and `is_started` is as up-to-date as possible. + debugger_process_all_notifs(app); + + // Call the command. cmd->func(app, len, args); } @@ -321,7 +443,10 @@ debugger_run( /* Build the IO registers table */ debugger_io_init(app->emulation.gba); - debugger_wait_for_emulator(app, true); + debugger_process_all_notifs(app); + if (app->debugger.is_started) { + debugger_dump_context_auto(app); + } while (app->run && (input = readline("$ ")) != NULL) { char *saveptr; @@ -383,7 +508,7 @@ debugger_run( if (cmd->func) { debugger_run_command(app, cmd, &ast); } else { - printf("command \"%s\" isn't implemented yet.\n", input_cmd); + printf("Command \"%s\" isn't implemented yet.\n", input_cmd); } goto cleanup; } diff --git a/source/gba/apu/apu.c b/source/gba/apu/apu.c index 65141de3..a59f8059 100644 --- a/source/gba/apu/apu.c +++ b/source/gba/apu/apu.c @@ -15,37 +15,6 @@ static void apu_sequencer(struct gba *gba, struct event_args args); static void apu_resample(struct gba *gba, struct event_args args); -void -apu_init( - struct gba *gba -) { - memset(gba->apu.fifos, 0, sizeof(gba->apu.fifos)); - memset(&gba->apu.frontend_channels, 0, sizeof(gba->apu.frontend_channels)); - - pthread_mutex_init(&gba->apu.frontend_channels_mutex, NULL); - apu_wave_init(gba); - - sched_add_event( - gba, - NEW_REPEAT_EVENT( - 0, - CYCLES_PER_SECOND / 256, - apu_sequencer - ) - ); - - if (gba->apu.resample_frequency) { - sched_add_event( - gba, - NEW_REPEAT_EVENT( - 0, - gba->apu.resample_frequency, - apu_resample - ) - ); - } -} - void apu_reset_fifo( struct gba *gba, @@ -161,7 +130,6 @@ apu_on_timer_overflow( /* ** Called at a rate of 256Hz to handle the different modulation units (length, envelope and sweep) */ -static void apu_sequencer( struct gba *gba, @@ -181,7 +149,6 @@ apu_sequencer( ** ** The goal here is to feed `apu_rbuffer` with whatever sound the GBA would be playing at this time, which is contained in `gba->apu.latch`. */ -static void apu_resample( struct gba *gba, @@ -216,7 +183,7 @@ apu_resample( sample_l *= 32; // Otherwise we can't hear much sample_r *= 32; - pthread_mutex_lock(&gba->apu.frontend_channels_mutex); - apu_rbuffer_push(&gba->apu.frontend_channels, (int16_t)sample_l, (int16_t)sample_r); - pthread_mutex_unlock(&gba->apu.frontend_channels_mutex); + pthread_mutex_lock(&gba->shared_data.audio_rbuffer_mutex); + apu_rbuffer_push(&gba->shared_data.audio_rbuffer, (int16_t)sample_l, (int16_t)sample_r); + pthread_mutex_unlock(&gba->shared_data.audio_rbuffer_mutex); } diff --git a/source/gba/apu/wave.c b/source/gba/apu/wave.c index f06e3894..4ba6cb8b 100644 --- a/source/gba/apu/wave.c +++ b/source/gba/apu/wave.c @@ -39,7 +39,7 @@ apu_wave_reset( gba->apu.wave.length = 0; } - period = CYCLES_PER_SECOND / (2097152 / (2048 - gba->io.sound3cnt_x.sample_rate)); + period = GBA_CYCLES_PER_SECOND / (2097152 / (2048 - gba->io.sound3cnt_x.sample_rate)); gba->apu.wave.step_handler = sched_add_event( gba, diff --git a/source/gba/core/core.c b/source/gba/core/core.c index 7f526821..be4e87a9 100644 --- a/source/gba/core/core.c +++ b/source/gba/core/core.c @@ -23,39 +23,6 @@ #include "gba/core/thumb.h" #include "gba/gba.h" -/* -** Initialize the core by initializing its registers -** to their default values. -*/ -void -core_init( - struct gba *gba -) { - struct core *core; - int i; - - core = &gba->core; - - memset(core, 0, sizeof(*core)); - - for (i = 0; i < array_length(core->registers); ++i) { - core->registers[i] = 0; - } - - for (i = 0; i < array_length(core->bank_registers); ++i) { - core->bank_registers[i] = 0; - } - - core->r13_irq = 0x03007FA0; - core->r13_svc = 0x03007FE0; - core->sp = 0x03007F00; - core->cpsr.mode = MODE_SYS; - core->prefetch_access_type = NON_SEQUENTIAL; - mem_update_waitstates(gba); - core_interrupt(gba, VEC_RESET, MODE_SVC); - core->cycles = 0; -} - /* ** Fetch, decode and execute the next instruction. */ diff --git a/source/gba/db.c b/source/gba/db.c index cb3d8f8f..ef780a91 100644 --- a/source/gba/db.c +++ b/source/gba/db.c @@ -9,7 +9,6 @@ #include #include "gba/gba.h" -#include "gba/db.h" /* ** Source: @@ -18,1754 +17,1732 @@ ** Thanks Zayd for sharing this list with me :) */ static struct game_entry game_database[] = { - (struct game_entry){.code = "BJB", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "007 - Everything or Nothing"}, - (struct game_entry){.code = "BFB", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "2 Disney Games - Disney Sports Skateboarding + Football"}, - (struct game_entry){.code = "BLQ", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "2 Disney Games - Lilo & Stitch 2 + Peter Pan"}, - (struct game_entry){.code = "BQJ", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "2 Game Pack - Hot Wheels Stunt Track + World Race"}, - (struct game_entry){.code = "BB4", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "2 Game Pack! - Matchbox Missions"}, - (struct game_entry){.code = "BUQ", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "2 Game Pack! Uno + Skip-Bo"}, - (struct game_entry){.code = "BX6", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "2 Games in 1 - Battle for Bikini Bottom + Breakin' Da Rules"}, - (struct game_entry){.code = "BU2", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "2 Games in 1 - Battle for Bikini Bottom + Nicktoons Freeze Frame Frenzy"}, - (struct game_entry){.code = "BL5", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "2 Games in 1 - Bionicle + Knights' Kingdom"}, - (struct game_entry){.code = "BWB", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "2 Games in 1 - Brother Bear + Disney Princess"}, - (struct game_entry){.code = "BLB", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "2 Games in 1 - Brother Bear + The Lion King"}, - (struct game_entry){.code = "BW2", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "2 Games in 1 - Cartoon Network - Block Party + Speedway"}, - (struct game_entry){.code = "BW9", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "2 Games in 1 - Columns Crown + ChuChu Rocket!"}, - (struct game_entry){.code = "BLP", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "2 Games in 1 - Disney Princess + The Lion King"}, - (struct game_entry){.code = "B2E", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "2 Games in 1 - Dora the Explorer - Pirate Pig's Treasure + Super Star Adventures"}, - (struct game_entry){.code = "BZP", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "2 Games in 1 - Dr. Mario + Puzzle League"}, - (struct game_entry){.code = "BUF", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "2 Games in 1 - Dragon Ball Z - Buu's Fury + Dragon Ball GT - Transformation"}, - (struct game_entry){.code = "BFW", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "2 Games in 1 - Finding Nemo + Finding Nemo - The Continuing Adventures"}, - (struct game_entry){.code = "BDZ", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "2 Games in 1 - Finding Nemo + Monsters, Inc."}, - (struct game_entry){.code = "BIN", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "2 Games in 1 - Finding Nemo + The Incredibles"}, - (struct game_entry){.code = "BWC", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "2 Games in 1 - Golden Nugget Casino - Texas Hold'em Poker"}, - (struct game_entry){.code = "BHZ", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "2 Games in 1 - Hot Wheels - World Race + Velocity X"}, - (struct game_entry){.code = "BLD", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "2 Games in 1 - Lizzie McGuire - Disney Princess"}, - (struct game_entry){.code = "BAR", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "2 Games in 1 - Moto GP - GT 3 Advance"}, - (struct game_entry){.code = "BRZ", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "2 Games in 1 - Power Rangers Time Force + Ninja Storm"}, - (struct game_entry){.code = "BWQ", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "2 Games in 1 - Quad Desert Fury + Monster Trucks"}, - (struct game_entry){.code = "BPU", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "2 Games in 1 - Scooby-Doo + Scooby-Doo 2"}, - (struct game_entry){.code = "BCV", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "2 Games in 1 - Scooby-Doo and the Cyber Chase + Mystery Mayhem"}, - (struct game_entry){.code = "BW3", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "2 Games in 1 - Sonic Advance + Chu Chu Rocket"}, - (struct game_entry){.code = "BW7", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "2 Games in 1 - Sonic Battle + ChuChu Rocket!"}, - (struct game_entry){.code = "BW4", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "2 Games in 1 - Sonic Battle + Sonic Advance"}, - (struct game_entry){.code = "BW8", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "2 Games in 1 - Sonic Pinball + Columns Crown"}, - (struct game_entry){.code = "BW6", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "2 Games in 1 - Sonic Pinball Party + Sonic Battle"}, - (struct game_entry){.code = "BSZ", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "2 Games in 1 - SpongeBob SquarePants - Supersponge + Battle for Bikini Bottom"}, - (struct game_entry){.code = "BDF", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "2 Games in 1 - SpongeBob SquarePants - Supersponge + Revenge of the Flying Dutchman"}, - (struct game_entry){.code = "BRS", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "2 Games in 1 - SpongeBob SquarePants - Supersponge + Rugrats - Go Wild"}, - (struct game_entry){.code = "BBJ", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "2 Games in 1 - SpongeBob SquarePants + Jimmy Neutron"}, - (struct game_entry){.code = "BNE", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "2 Games in 1 - The Incredibles + Finding Nemo - The Continuing Adventure"}, - (struct game_entry){.code = "B2B", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "2 Games in 1 - The SpongeBob SquarePants Movie + Freeze Frame Frenzy"}, - (struct game_entry){.code = "B2A", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "2 in 1 - Asterix & Obelix - PAF! Them All! + XXL"}, - (struct game_entry){.code = "BLF", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "2 in 1 - Dragon Ball Z 1 and 2"}, - (struct game_entry){.code = "B94", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "2 in 1 - Pferd & Pony - Mein Pferdehof + Lass Uns Reiten 2"}, - (struct game_entry){.code = "BX2", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "2 in 1 - Spider-Man Mysterio's Menace & X2 Wolverine's Revenge"}, - (struct game_entry){.code = "BX4", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "2 in 1 - Tony Hawk's Underground + Kelly Slater's Pro Surfer"}, - (struct game_entry){.code = "BCS", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "2 in 1 - V-Rally 3 - Stuntman"}, - (struct game_entry){.code = "BXH", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "2 in 1 Fun Pack - Madagascar - Operation Penguin + Shrek 2"}, - (struct game_entry){.code = "BXG", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "2 in 1 Fun Pack -Madagascar + Shrek 2"}, - (struct game_entry){.code = "BS7", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "2 in 1 Game Pack - Shark Tale + Shrek 2"}, - (struct game_entry){.code = "BX3", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "2 in 1 GamePack - Spider-Man + Spider-Man 2"}, - (struct game_entry){.code = "BT5", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "2 Jeux en 1 - Titeuf - Ze Gag Machine + Mega Compet"}, - (struct game_entry){.code = "BC4", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "3 Game Pack - Candy Land + Chutes and Ladders + Memory"}, - (struct game_entry){.code = "B3O", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "3 Game Pack - Mouse Trap + Simon + Operation"}, - (struct game_entry){.code = "B3U", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "3 Game Pack - The Game of Life + Yahtzee + Payday"}, - (struct game_entry){.code = "BXC", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "3 Game Pack! - Ker Plunk! + Toss Across + Tip It"}, - (struct game_entry){.code = "B44", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "3 Games in 1 - Rugrats, SpongeBob, Tak"}, - (struct game_entry){.code = "BRQ", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "3 Games in One - Majesco's Rec Room Challenge"}, - (struct game_entry){.code = "B3N", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "3 Games in One - Majesco's Sports Pack"}, - (struct game_entry){.code = "BI4", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "4 Games on One Game Pak - GT Advance - GT Advance 2 - GT Advance 3 - Moto GP"}, - (struct game_entry){.code = "BI7", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "4 Games on One Game Pak - Nickelodeon"}, - (struct game_entry){.code = "BI6", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "4 Games on One Game Pak (Nickelodeon Movies)"}, - (struct game_entry){.code = "A3Q", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "A Sound of Thunder"}, - (struct game_entry){.code = "BAE", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Ace Combat Advance"}, - (struct game_entry){.code = "ALX", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Ace Lightning"}, - (struct game_entry){.code = "BAC", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Action Man - Robot Atak"}, - (struct game_entry){.code = "BAV", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Activision Anthology"}, - (struct game_entry){.code = "AG7", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Advance GTA"}, - (struct game_entry){.code = "BGC", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Advance Guardian Heroes"}, - (struct game_entry){.code = "BAG", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Advance Guardian Heroes"}, - (struct game_entry){.code = "AR7", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Advance Rally"}, - (struct game_entry){.code = "AWR", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Advance Wars"}, - (struct game_entry){.code = "AW2", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Advance Wars 2 - Black Hole Rising"}, - (struct game_entry){.code = "ADE", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Adventure of Tokyo Disney Sea"}, - (struct game_entry){.code = "AAO", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Aero the Acro-Bat - Rascal Rival Revenge"}, - (struct game_entry){.code = "ACE", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Agassi Tennis Generation"}, - (struct game_entry){.code = "TCH", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "AGB Aging Cartridge"}, - (struct game_entry){.code = "BHQ", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Agent Hugo - Roborumble"}, - (struct game_entry){.code = "AIL", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Aggressive Inline"}, - (struct game_entry){.code = "AAK", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Air Force Delta Storm"}, - (struct game_entry){.code = "BAZ", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Akachan Doubutsu Sono"}, - (struct game_entry){.code = "BZW", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Akagi"}, - (struct game_entry){.code = "BAD", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Aladdin"}, - (struct game_entry){.code = "AJ6", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Aladdin"}, - (struct game_entry){.code = "BAB", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Aleck Bordon Adventure - Tower & Shaft Advance"}, - (struct game_entry){.code = "ATF", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Alex Ferguson's Player Manager 2002"}, - (struct game_entry){.code = "BAW", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Alex Rider - Stormbreaker"}, - (struct game_entry){.code = "BAH", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Alien Hominid"}, - (struct game_entry){.code = "AEV", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Alienators - Evolution Continues"}, - (struct game_entry){.code = "BAL", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "All Grown Up - Express Yourself"}, - (struct game_entry){.code = "AA3", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "All-Star Baseball 2003"}, - (struct game_entry){.code = "AA7", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "All-Star Baseball 2004"}, - (struct game_entry){.code = "AAR", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Altered Beast - Guardian of the Realms"}, - (struct game_entry){.code = "AAB", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "American Bass Challenge"}, - (struct game_entry){.code = "BAP", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "American Dragon - Jake Long"}, - (struct game_entry){.code = "BID", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "American Idol"}, - (struct game_entry){.code = "AFG", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "An American Tail - Fievel's Gold Rush"}, - (struct game_entry){.code = "AFN", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Angel Collection - Mezase! Gakuen no Fashion Leader"}, - (struct game_entry){.code = "BEC", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Angel Collection 2 - Pichimo ni Narou"}, - (struct game_entry){.code = "AAG", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Angelique"}, - (struct game_entry){.code = "AAN", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Animal Mania - DokiDoki Aishou Check"}, - (struct game_entry){.code = "AAQ", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Animal Snap - Rescue Them 2 By 2"}, - (struct game_entry){.code = "BAY", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Animal Yokochou - Doki Doki Kyushutsu Daisakusen No Maki"}, - (struct game_entry){.code = "BAX", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Animal Yokochou - Doki Doki Shinkyuu Shiken! no Kan"}, - (struct game_entry){.code = "ANI", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Animaniacs - Lights, Camera, Action!"}, - (struct game_entry){.code = "ANU", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Antz - Extreme Racing"}, - (struct game_entry){.code = "ANZ", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Antz - Extreme Racing"}, - (struct game_entry){.code = "AAZ", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Ao-Zoura to Nakamatachi - Yume no Bouken"}, - (struct game_entry){.code = "BPL", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Archer Maclean's 3D Pool"}, - (struct game_entry){.code = "AZN", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Archer Maclean's Super Dropzone"}, - (struct game_entry){.code = "BB5", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Arctic Tale"}, - (struct game_entry){.code = "AME", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Army Men - Operation Green"}, - (struct game_entry){.code = "AY3", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Army Men - Turf Wars"}, - (struct game_entry){.code = "ASA", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Army Men Advance"}, - (struct game_entry){.code = "B8D", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Around the World in 80 Days"}, - (struct game_entry){.code = "B2N", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Arthur and the Invisibles"}, - (struct game_entry){.code = "BAM", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Ashita no Joe - Makka ni Moeagare!"}, - (struct game_entry){.code = "AOB", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Asterix & Obelix - Bash Them All!"}, - (struct game_entry){.code = "BLX", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Asterix & Obelix - XXL"}, - (struct game_entry){.code = "BTA", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Astro Boy - Omega Factor"}, - (struct game_entry){.code = "AAV", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Atari Anniversary Advance"}, - (struct game_entry){.code = "ATL", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Atlantis - The Lost Empire"}, - (struct game_entry){.code = "BET", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Atomic Betty"}, - (struct game_entry){.code = "AQR", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "ATV Quad Power Racing"}, - (struct game_entry){.code = "B3B", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "ATV Thunder - Ridge Riders"}, - (struct game_entry){.code = "BQZ", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Avatar - The Last Airbender"}, - (struct game_entry){.code = "BBW", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Avatar - The Last Airbender - The Burning Earth"}, - (struct game_entry){.code = "AZA", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Azumanga Daiou Advance"}, - (struct game_entry){.code = "BBV", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Babar - To the Rescue"}, - (struct game_entry){.code = "BBC", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Back to Stone"}, - (struct game_entry){.code = "ABK", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "BackTrack"}, - (struct game_entry){.code = "ACK", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Backyard Baseball"}, - (struct game_entry){.code = "BCY", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Backyard Baseball 2006"}, - (struct game_entry){.code = "AYB", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Backyard Basketball"}, - (struct game_entry){.code = "AYF", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Backyard Football"}, - (struct game_entry){.code = "BYH", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Backyard Hockey"}, - (struct game_entry){.code = "BYF", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Backyard NFL Football 2006"}, - (struct game_entry){.code = "BS6", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Backyard Skateboarding"}, - (struct game_entry){.code = "BC7", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Backyard Sports - Baseball 2007"}, - (struct game_entry){.code = "BB7", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Backyard Sports - Basketball 2007"}, - (struct game_entry){.code = "BF7", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Backyard Sports - Football 2007"}, - (struct game_entry){.code = "AHE", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Bakuten Shoot Beyblade - Gekitou! Saikyou Blader"}, - (struct game_entry){.code = "AB8", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Bakuten Shoot Beyblade 2002 - Ikuze! Bakutou! Chou Jiryoku Battle!!"}, - (struct game_entry){.code = "A3E", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Bakuten Shoot Beyblade 2002 - Team Battle!! Daichi Hen"}, - (struct game_entry){.code = "A3W", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Bakuten Shoot Beyblade 2002 - Team Battle!! Takao Hen"}, - (struct game_entry){.code = "BGD", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Baldurs Gate - Dark Alliance"}, - (struct game_entry){.code = "AEE", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Ballistic - Ecks vs Sever"}, - (struct game_entry){.code = "BAJ", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Banjo Pilot"}, - (struct game_entry){.code = "BKZ", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Banjo-Kazooie - Grunty's Revenge"}, - (struct game_entry){.code = "BAU", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Barbie - The Princess and the Pauper"}, - (struct game_entry){.code = "BE5", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Barbie and the Magic of Pegasus"}, - (struct game_entry){.code = "BBN", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Barbie as the Island Princess"}, - (struct game_entry){.code = "AVB", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Barbie Groovy Games"}, - (struct game_entry){.code = "AI8", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Barbie Horse Adventures - Blue Ribbon Race"}, - (struct game_entry){.code = "BB3", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Barbie in the 12 Dancing Princesses"}, - (struct game_entry){.code = "BBE", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Barbie Superpack - Secret Agent + Groovy Games"}, - (struct game_entry){.code = "BBY", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Barnyard"}, - (struct game_entry){.code = "ABP", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Baseball Advance"}, - (struct game_entry){.code = "AZB", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Bass Tsuri Shiyouze!"}, - (struct game_entry){.code = "BBG", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Batman Begins"}, - (struct game_entry){.code = "BAT", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Batman Rise of Sin Tzu"}, - (struct game_entry){.code = "ABT", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Batman Vengeance"}, - (struct game_entry){.code = "BDX", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Battle B-Daman"}, - (struct game_entry){.code = "BBM", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Battle B-Daman - Fire Spirits"}, - (struct game_entry){.code = "BBF", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Battle x Battle - Kyoudai Ou Densetsu"}, - (struct game_entry){.code = "ABE", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "BattleBots - Beyond the BattleBox"}, - (struct game_entry){.code = "BBD", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "BattleBots - Design & Destroy"}, - (struct game_entry){.code = "A8L", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "BB Ball"}, - (struct game_entry){.code = "AH5", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Beast Shooter - Mezase Beast King!"}, - (struct game_entry){.code = "BHB", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Best Friends - Dogs & Cats"}, - (struct game_entry){.code = "A8Y", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Best Play Pro Yakyuu"}, - (struct game_entry){.code = "BB2", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Beyblade G-Revolution"}, - (struct game_entry){.code = "BEY", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Beyblade VForce - Ultimate Blader Jam"}, - (struct game_entry){.code = "BBX", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Bibi Blocksberg - Der Magische Hexenkreis"}, - (struct game_entry){.code = "BUX", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Bibi und Tina - Ferien auf dem Martinshof"}, - (struct game_entry){.code = "BIB", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Bible Game, The"}, - (struct game_entry){.code = "B63", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Big Mutha Truckers"}, - (struct game_entry){.code = "BIO", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Bionicle"}, - (struct game_entry){.code = "A5A", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Bionicle - Matoran Adventures"}, - (struct game_entry){.code = "BIL", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Bionicle - Maze of Shadows"}, - (struct game_entry){.code = "BIH", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Bionicle Heroes"}, - (struct game_entry){.code = "BVD", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "bit Generations - Boundish"}, - (struct game_entry){.code = "BVA", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "bit Generations - Coloris"}, - (struct game_entry){.code = "BVB", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "bit Generations - Dial Hex"}, - (struct game_entry){.code = "BVH", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "bit Generations - Digidrive"}, - (struct game_entry){.code = "BVC", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "bit Generations - Dotstream"}, - (struct game_entry){.code = "BVE", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "bit Generations - Orbital"}, - (struct game_entry){.code = "BVG", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "bit Generations - Soundvoyager"}, - (struct game_entry){.code = "AB6", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Black Belt Challenge"}, - (struct game_entry){.code = "AWE", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Black Black - Bura Bura"}, - (struct game_entry){.code = "AXB", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Black Matrix Zero"}, - (struct game_entry){.code = "AQX", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Blackthorne"}, - (struct game_entry){.code = "BBH", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Blades of Thunder"}, - (struct game_entry){.code = "BLE", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Bleach Advance"}, - (struct game_entry){.code = "ABR", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Blender Bros."}, - (struct game_entry){.code = "AT9", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "BMX Trick Racer"}, - (struct game_entry){.code = "B6E", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Board Games Classics"}, - (struct game_entry){.code = "BB9", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Boboboubo Boubobo - 9 Kiwame Senshi Gyagu Yuugou"}, - (struct game_entry){.code = "BOB", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Boboboubo Boubobo - Maji De!! Shinken Battle"}, - (struct game_entry){.code = "A8V", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Boboboubo Boubobo - Ougi 87.5 Bakuretsu Hanage Shinken"}, - (struct game_entry){.code = "BOS", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Boboboubo Boubobo Bakutou Hajike Taisen"}, - (struct game_entry){.code = "U3I", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Boktai - The Sun is in Your Hand"}, - (struct game_entry){.code = "U32", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Boktai 2 - Solar Boy Django"}, - (struct game_entry){.code = "ABC", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Boku ha Koukuu Kanseikan"}, - (struct game_entry){.code = "AJZ", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Bomberman Jetters"}, - (struct game_entry){.code = "BOM", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Bomberman Jetters - Game Collection"}, - (struct game_entry){.code = "AMH", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Bomberman Max 2 - Blue Advance"}, - (struct game_entry){.code = "AMY", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Bomberman Max 2 - Red Advance"}, - (struct game_entry){.code = "ABS", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Bomberman Tournament"}, - (struct game_entry){.code = "BKW", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Bookworm"}, - (struct game_entry){.code = "BPD", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Bouken Yuuki PlaStar World - Densetsu no PlaStar Gate EX"}, - (struct game_entry){.code = "APJ", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Bouken Yuuki Pluster World - Densetsu no PlustoGate"}, - (struct game_entry){.code = "A2P", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Bouken Yuuki Pluster World - Pluston GP"}, - (struct game_entry){.code = "BOV", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Bouken-Ou Beet - Busters Road"}, - (struct game_entry){.code = "BBS", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Boukyaku no Senritsu"}, - (struct game_entry){.code = "ABD", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Boulder Dash EX"}, - (struct game_entry){.code = "ABO", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Boxing Fever"}, - (struct game_entry){.code = "A2R", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Bratz"}, - (struct game_entry){.code = "BBZ", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Bratz - Babyz"}, - (struct game_entry){.code = "BXF", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Bratz - Forever Diamondz"}, - (struct game_entry){.code = "BRR", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Bratz - Rock Angelz"}, - (struct game_entry){.code = "BBU", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Bratz - The Movie"}, - (struct game_entry){.code = "B6Z", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Breakout + Centipede + Warlords"}, - (struct game_entry){.code = "ABF", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Breath of Fire"}, - (struct game_entry){.code = "AB2", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Breath of Fire II"}, - (struct game_entry){.code = "ABY", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Britney's Dance Beat"}, - (struct game_entry){.code = "ABJ", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Broken Sword - The Shadow of the Templars"}, - (struct game_entry){.code = "BBR", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Brother Bear"}, - (struct game_entry){.code = "ALE", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Bruce Lee - Return of the Legend"}, - (struct game_entry){.code = "AON", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Bubble Bobble - Old & New"}, - (struct game_entry){.code = "A2B", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Bubble Bobble - Old & New"}, - (struct game_entry){.code = "AVY", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Buffy - Im Bann der Daemonen"}, - (struct game_entry){.code = "ABW", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Butt-Ugly Martians - B.K.M. Battles"}, - (struct game_entry){.code = "AUQ", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Butt-Ugly Martians - B.K.M. Battles"}, - (struct game_entry){.code = "BCG", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Cabbage Patch Kids - The Patch Puppy Rescue"}, - (struct game_entry){.code = "A8H", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Cabela's Big Game Hunter"}, - (struct game_entry){.code = "BG5", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Cabela's Big Game Hunter - 2005 Adventures"}, - (struct game_entry){.code = "ACP", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Caesars Palace Advance"}, - (struct game_entry){.code = "BIX", .storage = BACKUP_FLASH128, .flags = FLAGS_NONE, .title = "Calciobit"}, - (struct game_entry){.code = "BLC", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Camp Lazlo - Leaky Lake Games"}, - (struct game_entry){.code = "BC6", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Capcom Classics - Mini Mix"}, - (struct game_entry){.code = "AKY", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Captain Tsubasa - Eikou no Kiseki"}, - (struct game_entry){.code = "ACB", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Car Battler Joe"}, - (struct game_entry){.code = "BK3", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Card Captor Sakura - Sakura Card de Mini Game"}, - (struct game_entry){.code = "BKS", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Card Captor Sakura - Sakura to Card to Otomodachi"}, - (struct game_entry){.code = "PEA", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Card E-Reader"}, - (struct game_entry){.code = "A8C", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Card Party"}, - (struct game_entry){.code = "BEA", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Care Bears - The Care Quest"}, - (struct game_entry){.code = "AED", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Carrera Power Slide"}, - (struct game_entry){.code = "BCA", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Cars"}, - (struct game_entry){.code = "BCP", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Cars Mater-National Championship"}, - (struct game_entry){.code = "AC9", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Cartoon Network Block Party"}, - (struct game_entry){.code = "ANR", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Cartoon Network Speedway"}, - (struct game_entry){.code = "ACS", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Casper"}, - (struct game_entry){.code = "A2C", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Castlevania - Aria of Sorrow"}, - (struct game_entry){.code = "AAM", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Castlevania - Circle of the Moon"}, - (struct game_entry){.code = "ACH", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Castlevania - Harmony of Dissonance"}, - (struct game_entry){.code = "BXK", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Castlevania Double Pack"}, - (struct game_entry){.code = "BCW", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Catwoman"}, - (struct game_entry){.code = "AN3", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Catz"}, - (struct game_entry){.code = "BCF", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Charlie and the Chocolate Factory"}, - (struct game_entry){.code = "BCJ", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Charlotte's Web"}, - (struct game_entry){.code = "ACY", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Chessmaster"}, - (struct game_entry){.code = "BCH", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Chicken Little"}, - (struct game_entry){.code = "B6F", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Chicken Shoot"}, - (struct game_entry){.code = "B6G", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Chicken Shoot 2"}, - (struct game_entry){.code = "AOC", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Chobits for GameBoy Advance"}, - (struct game_entry){.code = "A5B", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Chocobo Land - A Game of Dice"}, - (struct game_entry){.code = "ACJ", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Chou Makai-Mura R"}, - (struct game_entry){.code = "ACR", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Chu Chu Rocket!"}, - (struct game_entry){.code = "BCM", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "CIMA - The Enemy"}, - (struct game_entry){.code = "BCD", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Cinderella - Magical Dreams"}, - (struct game_entry){.code = "B2S", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Cinnamon - Yume no Daibouken"}, - (struct game_entry){.code = "B43", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Cinnamon Fuwafuwa Daisakusen"}, - (struct game_entry){.code = "BPS", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Cinnamoroll Kokoniiruyo"}, - (struct game_entry){.code = "FBM", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Classic NES Series - Bomberman"}, - (struct game_entry){.code = "FAD", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Classic NES Series - Castlevania"}, - (struct game_entry){.code = "FDK", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Classic NES Series - Donkey Kong"}, - (struct game_entry){.code = "FDM", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Classic NES Series - Dr. Mario"}, - (struct game_entry){.code = "FEB", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Classic NES Series - ExciteBike"}, - (struct game_entry){.code = "FIC", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Classic NES Series - Ice Climber"}, - (struct game_entry){.code = "FMR", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Classic NES Series - Metroid"}, - (struct game_entry){.code = "FP7", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Classic NES Series - Pac-Man"}, - (struct game_entry){.code = "FSM", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Classic NES Series - Super Mario Bros."}, - (struct game_entry){.code = "FZL", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Classic NES Series - The Legend of Zelda"}, - (struct game_entry){.code = "FXV", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Classic NES Series - Xevious"}, - (struct game_entry){.code = "FLB", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Classic NES Series - Zelda II - The Adventure of Link"}, - (struct game_entry){.code = "BC5", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Cocoto - Kart Racer"}, - (struct game_entry){.code = "BC8", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Cocoto Platform Jumper"}, - (struct game_entry){.code = "BND", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Codename Kids Next Door - Operation S.O.D.A."}, - (struct game_entry){.code = "ACM", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Colin McRae Rally 2.0"}, - (struct game_entry){.code = "ACG", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Columns Crown"}, - (struct game_entry){.code = "AQC", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Combat Choro Q - Advance Daisakusen"}, - (struct game_entry){.code = "BW5", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Combo Pack - Sonic Advance + Sonic Pinball Party"}, - (struct game_entry){.code = "ACZ", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Comix Zone"}, - (struct game_entry){.code = "B65", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Connect Four - Perfection - Trouble"}, - (struct game_entry){.code = "AAW", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Contra Advance - The Alien Wars EX"}, - (struct game_entry){.code = "AVC", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Corvette"}, - (struct game_entry){.code = "B5A", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Crash & Spyro - Super Pack Volume 1"}, - (struct game_entry){.code = "B52", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Crash & Spyro - Super Pack Volume 2"}, - (struct game_entry){.code = "B53", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Crash & Spyro Superpack - Ripto's Rampage + The Cortex Conspiracy"}, - (struct game_entry){.code = "B54", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Crash & Spyro Superpack - The Huge Adventure + Season of Ice"}, - (struct game_entry){.code = "ACQ", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Crash Bandicoot - The Huge Adventure"}, - (struct game_entry){.code = "AC8", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Crash Bandicoot 2 - N-Tranced"}, - (struct game_entry){.code = "ACU", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Crash Bandicoot Advance"}, - (struct game_entry){.code = "BKD", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Crash Bandicoot Advance - Wakuwaku Tomodachi Daisakusen"}, - (struct game_entry){.code = "BD4", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Crash Bandicoot Purple - Ripto's Rampage"}, - (struct game_entry){.code = "BCN", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Crash Nitro Kart"}, - (struct game_entry){.code = "BQC", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Crash of the Titans"}, - (struct game_entry){.code = "B8A", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Crash Superpack - N-Tranced + Nitro Kart"}, - (struct game_entry){.code = "BC2", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Crayon Shin chan - Densetsu wo Yobu Omake no Miyako Shockgaan"}, - (struct game_entry){.code = "BKC", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Crayon Shin-Chan - Arashi no Yobu Cinema-Land no Daibouken!"}, - (struct game_entry){.code = "ACC", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Crazy Chase"}, - (struct game_entry){.code = "BCR", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Crazy Frog Racer"}, - (struct game_entry){.code = "A3C", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Crazy Taxi - Catch a Ride"}, - (struct game_entry){.code = "ACT", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Creatures"}, - (struct game_entry){.code = "A6C", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Croket! - Yume no Banker Survival!"}, - (struct game_entry){.code = "BK2", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Croket! 2 - Yami no Bank to Banqueen"}, - (struct game_entry){.code = "B3K", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Croket! 3 - Guranyuu Oukoku no Nazo"}, - (struct game_entry){.code = "BK4", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Croket! 4 - Bank no Mori no Mamorigami"}, - (struct game_entry){.code = "AQD", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Crouching Tiger Hidden Dragon"}, - (struct game_entry){.code = "ACF", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Cruis'n Velocity"}, - (struct game_entry){.code = "BCB", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Crushed Baseball"}, - (struct game_entry){.code = "AC7", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "CT Special Forces"}, - (struct game_entry){.code = "A9C", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "CT Special Forces 2 - Back in the Trenches"}, - (struct game_entry){.code = "BC3", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "CT Special Forces 3 - Bioterror"}, - (struct game_entry){.code = "ACX", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Cubix - Robots for Everyone - Clash 'N Bash"}, - (struct game_entry){.code = "B3J", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Curious George"}, - (struct game_entry){.code = "ARJ", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Custom Robo GX"}, - (struct game_entry){.code = "AZ3", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Cyberdrive Zoids - Kijuu no Senshi Hyuu"}, - (struct game_entry){.code = "AHM", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Dai-Mahjong"}, - (struct game_entry){.code = "ADS", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Daisenryaku for GameBoy Advance"}, - (struct game_entry){.code = "ATD", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Daisuki Teddy"}, - (struct game_entry){.code = "BDN", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Dan Doh!! - Tobase Shouri no Smile Shot!!"}, - (struct game_entry){.code = "AXH", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Dan Doh!! Xi"}, - (struct game_entry){.code = "A9S", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Dancing Sword - Senkou"}, - (struct game_entry){.code = "BUE", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Danny Phantom - The Ultimate Enemy"}, - (struct game_entry){.code = "BQY", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Danny Phantom - Urban Jungle"}, - (struct game_entry){.code = "AVL", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Daredevil"}, - (struct game_entry){.code = "A2D", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Darius R"}, - (struct game_entry){.code = "ADA", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Dark Arena"}, - (struct game_entry){.code = "AX2", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Dave Mirra Freestyle BMX 2"}, - (struct game_entry){.code = "AB3", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Dave Mirra Freestyle BMX 3"}, - (struct game_entry){.code = "ABQ", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "David Beckham Soccer"}, - (struct game_entry){.code = "AD6", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Davis Cup"}, - (struct game_entry){.code = "BDE", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Dead to Rights"}, - (struct game_entry){.code = "BZN", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Deal or No Deal"}, - (struct game_entry){.code = "A2F", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Defender"}, - (struct game_entry){.code = "ADH", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Defender of the Crown"}, - (struct game_entry){.code = "AC5", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "DemiKids - Dark Version"}, - (struct game_entry){.code = "AL4", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "DemiKids - Light Version"}, - (struct game_entry){.code = "A9A", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Demon Driver - Time to Burn Rubber!"}, - (struct game_entry){.code = "ADB", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Denki Blocks!"}, - (struct game_entry){.code = "AST", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Densetsu no Stafi"}, - (struct game_entry){.code = "AVF", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Densetsu no Stafi 2"}, - (struct game_entry){.code = "B3D", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Densetsu no Stafi 3"}, - (struct game_entry){.code = "A8P", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Derby Stallion Advance"}, - (struct game_entry){.code = "ADI", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Desert Strike Advance"}, - (struct game_entry){.code = "ADX", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Dexter's Laboratory - Chess Challenge"}, - (struct game_entry){.code = "ADL", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Dexter's Laboratory - Deesaster Strikes!"}, - (struct game_entry){.code = "A3O", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Di Gi Charat - DigiCommunication"}, - (struct game_entry){.code = "ADD", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Diadroids World - Evil Teikoku no Yabou"}, - (struct game_entry){.code = "BXW", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Die Wilden Fussball Kerle - Gefahr im Wilde Kerle Land"}, - (struct game_entry){.code = "BWU", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Die wilden Fussballkerle - Entscheidung im Teufelstopf"}, - (struct game_entry){.code = "BDK", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Digi Communication 2 in 1 Datou! Black Gemagema Dan"}, - (struct game_entry){.code = "A8S", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Digimon - Battle Spirit"}, - (struct game_entry){.code = "BDS", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Digimon - Battle Spirit 2"}, - (struct game_entry){.code = "BDG", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Digimon Racing"}, - (struct game_entry){.code = "BDJ", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Digimon Racing"}, - (struct game_entry){.code = "AD3", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Dinotopia - The Timestone Pirates"}, - (struct game_entry){.code = "AQP", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Disney Princess"}, - (struct game_entry){.code = "BQN", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Disney Princess - Royal Adventure"}, - (struct game_entry){.code = "A2A", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Disney Sports - Basketball"}, - (struct game_entry){.code = "A3D", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Disney Sports - Football"}, - (struct game_entry){.code = "AOM", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Disney Sports - Motocross"}, - (struct game_entry){.code = "A4D", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Disney Sports - Skateboarding"}, - (struct game_entry){.code = "A5D", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Disney Sports - Snowboarding"}, - (struct game_entry){.code = "A6D", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Disney Sports - Soccer"}, - (struct game_entry){.code = "BD8", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Disney's Party"}, - (struct game_entry){.code = "BBK", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "DK - King of Swing"}, - (struct game_entry){.code = "B82", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Dogz"}, - (struct game_entry){.code = "BFE", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Dogz - Fashion"}, - (struct game_entry){.code = "BIM", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Dogz 2"}, - (struct game_entry){.code = "ADQ", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Dokapon"}, - (struct game_entry){.code = "A56", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "DokiDoki Cooking Series 1 - Komugi-chan no Happy Cake"}, - (struct game_entry){.code = "A8O", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "DokiDoki Cooking Series 2 - Gourmet Kitchen - Suteki na Obentou"}, - (struct game_entry){.code = "AYA", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Dokodemo Taikyoku - Yakuman Advance"}, - (struct game_entry){.code = "ADO", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Domo-kun no Fushigi Terebi"}, - (struct game_entry){.code = "ADK", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Donald Duck Advance"}, - (struct game_entry){.code = "AAD", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Donald Duck Advance"}, - (struct game_entry){.code = "BDA", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Donchan Puzzle Hanabi de Dohn Advance"}, - (struct game_entry){.code = "A5N", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Donkey Kong Country"}, - (struct game_entry){.code = "B2D", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Donkey Kong Country 2"}, - (struct game_entry){.code = "BDQ", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Donkey Kong Country 3"}, - (struct game_entry){.code = "ADM", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Doom"}, - (struct game_entry){.code = "A9D", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Doom II"}, - (struct game_entry){.code = "BXP", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Dora the Explorer - Dora's World Adventure"}, - (struct game_entry){.code = "BER", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Dora the Explorer - Super Spies"}, - (struct game_entry){.code = "BDO", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Dora the Explorer - Super Star Adventures!"}, - (struct game_entry){.code = "AER", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Dora the Explorer - The Search for the Pirate Pig's Treasure"}, - (struct game_entry){.code = "ADP", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Doraemon - Dokodemo Walker"}, - (struct game_entry){.code = "ADR", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Doraemon - Midori no Wakusei DokiDoki Daikyuushutsu!"}, - (struct game_entry){.code = "BDD", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Double Dragon Advance"}, - (struct game_entry){.code = "A8D", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Doubutsu Shima no Chobi Gurumi"}, - (struct game_entry){.code = "BDC", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Doubutsujima no Chobi Gurumi 2 - Tamachan Monogatari"}, - (struct game_entry){.code = "ADW", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Downforce"}, - (struct game_entry){.code = "A6T", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Dr. Muto"}, - (struct game_entry){.code = "AQT", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Dr. Seuss' - The Cat in the Hat"}, - (struct game_entry){.code = "BUO", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Dr. Sudoku"}, - (struct game_entry){.code = "BDV", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Dragon Ball - Advanced Adventure"}, - (struct game_entry){.code = "BT4", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Dragon Ball GT - Transformation"}, - (struct game_entry){.code = "BG3", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Dragon Ball Z - Buu's Fury"}, - (struct game_entry){.code = "ADZ", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Dragon Ball Z - Collectible Card Game"}, - (struct game_entry){.code = "AZJ", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Dragon Ball Z - Supersonic Warriors"}, - (struct game_entry){.code = "BDB", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Dragon Ball Z - Taiketsu"}, - (struct game_entry){.code = "ALG", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Dragon Ball Z - The Legacy of Goku"}, - (struct game_entry){.code = "ALF", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Dragon Ball Z - The Legacy of Goku II"}, - (struct game_entry){.code = "A5G", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Dragon Drive - World D Break"}, - (struct game_entry){.code = "AT2", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Dragon Quest Characters - Torneko no Daibouken 2 Advance"}, - (struct game_entry){.code = "BD3", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Dragon Quest Characters - Torneko no Daibouken 3 Advance"}, - (struct game_entry){.code = "A9H", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Dragon Quest Monsters - Caravan Heart"}, - (struct game_entry){.code = "BD9", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Dragon Tales - Dragon Adventures"}, - (struct game_entry){.code = "BJD", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Dragon's Rock"}, - (struct game_entry){.code = "AJY", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Drake & Josh"}, - (struct game_entry){.code = "V49", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Drill Dozer"}, - (struct game_entry){.code = "B3R", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Driv3r"}, - (struct game_entry){.code = "ADV", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Driven"}, - (struct game_entry){.code = "ADU", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Driver 2 Advance"}, - (struct game_entry){.code = "AOE", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Drome Racers"}, - (struct game_entry){.code = "AD7", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Droopy's Tennis Open"}, - (struct game_entry){.code = "AB9", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Dual Blades"}, - (struct game_entry){.code = "BD6", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Duel Masters - Kaijudo Showdown"}, - (struct game_entry){.code = "AA9", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Duel Masters - Sempai Legends"}, - (struct game_entry){.code = "BDU", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Duel Masters - Shadow of the Code"}, - (struct game_entry){.code = "BD2", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Duel Masters 2"}, - (struct game_entry){.code = "BD5", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Duel Masters 2 - Kirifuda Shoubu Version"}, - (struct game_entry){.code = "AD9", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Duke Nukem Advance"}, - (struct game_entry){.code = "AD4", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Dungeons & Dragons - Eye of the Beholder"}, - (struct game_entry){.code = "B36", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Dynasty Warriors Advance"}, - (struct game_entry){.code = "AET", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "E.T. - The Extra-Terrestrial"}, - (struct game_entry){.code = "AEJ", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Earthworm Jim"}, - (struct game_entry){.code = "AJ4", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Earthworm Jim 2"}, - (struct game_entry){.code = "AES", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Ecks vs Sever"}, - (struct game_entry){.code = "AE3", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Ed, Edd n Eddy - Jawbreakers!"}, - (struct game_entry){.code = "BED", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Ed, Edd n Eddy - The Mis-Edventures"}, - (struct game_entry){.code = "AEM", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Egg Mania"}, - (struct game_entry){.code = "AEK", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Elemix!"}, - (struct game_entry){.code = "ANW", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Elevator Action - Old & New"}, - (struct game_entry){.code = "BEL", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Elf - The Movie"}, - (struct game_entry){.code = "BEB", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Elf Bowling 1 & 2"}, - (struct game_entry){.code = "BZR", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Enchanted - Once Upon Andalasia"}, - (struct game_entry){.code = "BEN", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Eragon"}, - (struct game_entry){.code = "PSA", .storage = BACKUP_FLASH128, .flags = FLAGS_RTC, .title = "E-Reader"}, - (struct game_entry){.code = "BEJ", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Erementar Gerad"}, - (struct game_entry){.code = "AGR", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "ESPN Final Round Golf 2002"}, - (struct game_entry){.code = "AMG", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "ESPN Great Outdoor Games - Bass 2002"}, - (struct game_entry){.code = "AWI", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "ESPN International Winter Sports 2002"}, - (struct game_entry){.code = "AWX", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "ESPN Winter X-Games Snowboarding 2002"}, - (struct game_entry){.code = "AXS", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "ESPN X-Games Skateboarding"}, - (struct game_entry){.code = "AEL", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "European Super League"}, - (struct game_entry){.code = "BEV", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Ever Girl"}, - (struct game_entry){.code = "AMO", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "EX Monopoly"}, - (struct game_entry){.code = "AEG", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Extreme Ghostbusters - Code Ecto-1"}, - (struct game_entry){.code = "BES", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Extreme Skate Adventure"}, - (struct game_entry){.code = "BE4", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Eyeshield 21 - Devilbats Devildays"}, - (struct game_entry){.code = "A22", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "EZ-Talk - Shokyuu Hen 1"}, - (struct game_entry){.code = "A23", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "EZ-Talk - Shokyuu Hen 2"}, - (struct game_entry){.code = "A24", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "EZ-Talk - Shokyuu Hen 3"}, - (struct game_entry){.code = "A25", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "EZ-Talk - Shokyuu Hen 4"}, - (struct game_entry){.code = "A26", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "EZ-Talk - Shokyuu Hen 5"}, - (struct game_entry){.code = "A27", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "EZ-Talk - Shokyuu Hen 6"}, - (struct game_entry){.code = "AF8", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "F1 2002"}, - (struct game_entry){.code = "AFT", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "F-14 Tomcat"}, - (struct game_entry){.code = "BYA", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "F24 - Stealth Fighter"}, - (struct game_entry){.code = "FSR", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Famicom Mini Series - Dai 2 Ji Super Robot Taisen"}, - (struct game_entry){.code = "FGZ", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Famicom Mini Series - Kido Senshi Z Gundam Hot Scramble"}, - (struct game_entry){.code = "FSO", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Famicom Mini Series 10 - Star Soldier"}, - (struct game_entry){.code = "FMB", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Famicom Mini Series 11 - Mario Bros."}, - (struct game_entry){.code = "FCL", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Famicom Mini Series 12 - Clu Clu Land"}, - (struct game_entry){.code = "FBF", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Famicom Mini Series 13 - Balloon Fight"}, - (struct game_entry){.code = "FWC", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Famicom Mini Series 14 - Wrecking Crew"}, - (struct game_entry){.code = "FDD", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Famicom Mini Series 16 - Dig Dug"}, - (struct game_entry){.code = "FTB", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Famicom Mini Series 17 - Takahashi Meijin no Bouken Jima"}, - (struct game_entry){.code = "FMK", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Famicom Mini Series 18 - Makaimura"}, - (struct game_entry){.code = "FTW", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Famicom Mini Series 19 - TwinBee"}, - (struct game_entry){.code = "FGG", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Famicom Mini Series 20 - Ganbare Goemon! Karakuri Douchuu"}, - (struct game_entry){.code = "FM2", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Famicom Mini Series 21 - Super Mario Bros. 2"}, - (struct game_entry){.code = "FNM", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Famicom Mini Series 22 - Nazo no Murasame Shiro"}, - (struct game_entry){.code = "FPT", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Famicom Mini Series 24 - Hikari Shinwa - Palutena no Kagame"}, - (struct game_entry){.code = "FFM", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Famicom Mini Series 26 - Mukashi Hanashi - Shin Onigashima"}, - (struct game_entry){.code = "FTK", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Famicom Mini Series 27 - Famicom Tantei Club - Kieta Koukeisha"}, - (struct game_entry){.code = "FTU", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Famicom Mini Series 28 - Famicom Tantei Club Part II - Ushiro ni Tatsu Shoujo"}, - (struct game_entry){.code = "FSD", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Famicom Mini Series 30 - SD Gundam World - Gachapon Senshi Scramble Wars"}, - (struct game_entry){.code = "FPM", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Famicom Mini Series 6 - Pac-Man"}, - (struct game_entry){.code = "FMP", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Famicom Mini Series 8 - Mappy"}, - (struct game_entry){.code = "B2F", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Family Feud"}, - (struct game_entry){.code = "AAT", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Family Tennis Advance"}, - (struct game_entry){.code = "AN7", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Famista Advance"}, - (struct game_entry){.code = "AJE", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Fancy Pocket"}, - (struct game_entry){.code = "BFC", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Fantasic Children"}, - (struct game_entry){.code = "BF4", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Fantastic 4"}, - (struct game_entry){.code = "BH4", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Fantastic 4 - Flame On"}, - (struct game_entry){.code = "AAX", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Fantastic Maerchen - Cake-yasan Monogatari"}, - (struct game_entry){.code = "BFU", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Fear Factor Unleashed"}, - (struct game_entry){.code = "AF9", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Field of Nine - Digital Edition 2001"}, - (struct game_entry){.code = "BF6", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "FIFA 06"}, - (struct game_entry){.code = "B7F", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "FIFA 07"}, - (struct game_entry){.code = "AFJ", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "FIFA 2003"}, - (struct game_entry){.code = "BFI", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "FIFA 2004"}, - (struct game_entry){.code = "BF5", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "FIFA 2005"}, - (struct game_entry){.code = "B6W", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "FIFA World Cup 2006"}, - (struct game_entry){.code = "BOX", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "FightBox"}, - (struct game_entry){.code = "AFL", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "FILA Decathlon"}, - (struct game_entry){.code = "BFF", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Final Fantasy I & II - Dawn of Souls"}, - (struct game_entry){.code = "BZ4", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Final Fantasy IV Advance"}, - (struct game_entry){.code = "AFX", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Final Fantasy Tactics Advance"}, - (struct game_entry){.code = "BZ5", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Final Fantasy V Advance"}, - (struct game_entry){.code = "BZ6", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Final Fantasy VI Advance"}, - (struct game_entry){.code = "AFF", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Final Fight One"}, - (struct game_entry){.code = "AFW", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Final Fire Pro Wrestling - Yume no Dantai Unei!"}, - (struct game_entry){.code = "AZI", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Finding Nemo"}, - (struct game_entry){.code = "BFN", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Finding Nemo"}, - (struct game_entry){.code = "BZI", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Finding Nemo - The Continuing Adventures"}, - (struct game_entry){.code = "AE7", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Fire Emblem"}, - (struct game_entry){.code = "AFE", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Fire Emblem - Fuuin no Tsurugi"}, - (struct game_entry){.code = "BE8", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Fire Emblem - The Sacred Stones"}, - (struct game_entry){.code = "AFP", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Fire Pro Wrestling"}, - (struct game_entry){.code = "AFY", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Fire Pro Wrestling 2"}, - (struct game_entry){.code = "BLH", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Flushed Away"}, - (struct game_entry){.code = "BF3", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Ford Racing 3"}, - (struct game_entry){.code = "AFM", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Formation Soccer 2002"}, - (struct game_entry){.code = "AFO", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Fortress"}, - (struct game_entry){.code = "BFY", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Foster's Home for Imaginary Friends"}, - (struct game_entry){.code = "BFK", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Franklin the Turtle"}, - (struct game_entry){.code = "BFL", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Franklin's Great Adventures"}, - (struct game_entry){.code = "BFS", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Freekstyle"}, - (struct game_entry){.code = "AFQ", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Frogger Advance - The Great Quest"}, - (struct game_entry){.code = "AFR", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Frogger's Adventures - Temple of the Frog"}, - (struct game_entry){.code = "AFB", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Frogger's Adventures 2 - The Lost Wand"}, - (struct game_entry){.code = "BFJ", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Frogger's Journey - The Forgotten Relic"}, - (struct game_entry){.code = "ADC", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Fruit Chase"}, - (struct game_entry){.code = "BFD", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Fruit Mura no Doubutsu Tachi"}, - (struct game_entry){.code = "AF4", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Fushigi no Kuni no Alice"}, - (struct game_entry){.code = "AFA", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Fushigi no Kuni no Angelique"}, - (struct game_entry){.code = "BFP", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Futari ha Precure Arienaai Yume no Kuni ha Daimeikyuu"}, - (struct game_entry){.code = "BFM", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Futari wa Precure Max Heart Maji! Maji! Fight de IN Janai"}, - (struct game_entry){.code = "BFT", .storage = BACKUP_FLASH128, .flags = FLAGS_NONE, .title = "F-Zero - Climax"}, - (struct game_entry){.code = "BFZ", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "F-Zero - GP Legends"}, - (struct game_entry){.code = "AFZ", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "F-Zero - Maximum Velocity"}, - (struct game_entry){.code = "A4X", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Gachaste! Dino Device 2 Dragon"}, - (struct game_entry){.code = "A4W", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Gachaste! Dino Device 2 Phoenix"}, - (struct game_entry){.code = "ABI", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Gachasute! Dino Device - Blue"}, - (struct game_entry){.code = "AAI", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Gachasute! Dino Device - Red"}, - (struct game_entry){.code = "ANY", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Gachinko Pro Yakyuu"}, - (struct game_entry){.code = "AQA", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Gadget Racers"}, - (struct game_entry){.code = "AQ2", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Gadget Racers"}, - (struct game_entry){.code = "BGH", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Gakkou no Kaidan - Hyakuyobako no Fuuin"}, - (struct game_entry){.code = "AYS", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Gakkou wo Tsukurou!! Advance"}, - (struct game_entry){.code = "BAS", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Gakuen Alice - DokiDoki Fushigi Taiken"}, - (struct game_entry){.code = "BGS", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Gakuen Senki Muryou"}, - (struct game_entry){.code = "AGZ", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Galaxy Angel GameBoy Advance"}, - (struct game_entry){.code = "AG8", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Galidor - Defenders of the Outer Dimension"}, - (struct game_entry){.code = "ATY", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Gambler Densetsu Tetsuya - Yomigaeru Densetsu"}, - (struct game_entry){.code = "AQW", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Game & Watch Gallery 4"}, - (struct game_entry){.code = "BGW", .storage = BACKUP_FLASH128, .flags = FLAGS_NONE, .title = "Gameboy Wars Advance 1+2"}, - (struct game_entry){.code = "BG7", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Games Explosion!"}, - (struct game_entry){.code = "BG8", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Ganbare! Dodge Fighters"}, - (struct game_entry){.code = "BGO", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Garfield - The Search for Pooky"}, - (struct game_entry){.code = "BG9", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Garfield and His Nine Lives"}, - (struct game_entry){.code = "AYG", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Gauntlet - Dark Legacy"}, - (struct game_entry){.code = "B69", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Gauntlet - Rampart"}, - (struct game_entry){.code = "MGU", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "GBA Video - All Grown Up - Volume 1"}, - (struct game_entry){.code = "MCM", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "GBA Video - Cartoon Network Collection - Limited Edition"}, - (struct game_entry){.code = "MCN", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "GBA Video - Cartoon Network Collection - Platinum Edition"}, - (struct game_entry){.code = "MCP", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "GBA Video - Cartoon Network Collection - Premium Edition"}, - (struct game_entry){.code = "MCS", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "GBA Video - Cartoon Network Collection - Special Edition"}, - (struct game_entry){.code = "MCT", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "GBA Video - Cartoon Network Collection - Volume 1"}, - (struct game_entry){.code = "MC2", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "GBA Video - Cartoon Network Collection - Volume 2"}, - (struct game_entry){.code = "MKD", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "GBA Video - Codename Kids Next Door - Volume 1"}, - (struct game_entry){.code = "MDC", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "GBA Video - Disney Channel Collection - Volume 1"}, - (struct game_entry){.code = "MDS", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "GBA Video - Disney Channel Collection - Volume 2"}, - (struct game_entry){.code = "MDR", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "GBA Video - Dora the Explorer - Volume 1"}, - (struct game_entry){.code = "MDB", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "GBA Video - Dragon Ball GT - Volume 1"}, - (struct game_entry){.code = "MNC", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "GBA Video - Nicktoon's Collection - Volume 1"}, - (struct game_entry){.code = "MN2", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "GBA Video - Nicktoons Collection - Volume 2"}, - (struct game_entry){.code = "MN3", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "GBA Video - Nicktoons Volume 3"}, - (struct game_entry){.code = "MPA", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "GBA Video - Pokemon - Volume 1"}, - (struct game_entry){.code = "MPB", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "GBA Video - Pokemon - Volume 2"}, - (struct game_entry){.code = "MPC", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "GBA Video - Pokemon - Volume 3"}, - (struct game_entry){.code = "MPD", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "GBA Video - Pokemon - Volume 4"}, - (struct game_entry){.code = "MSA", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "GBA Video - Shark Tale"}, - (struct game_entry){.code = "MSK", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "GBA Video - Shrek"}, - (struct game_entry){.code = "MST", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "GBA Video - Shrek + Shark Tale"}, - (struct game_entry){.code = "M2S", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "GBA Video - Shrek 2"}, - (struct game_entry){.code = "MSH", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "GBA Video - Sonic X - Volume 1"}, - (struct game_entry){.code = "MSS", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "GBA Video - SpongeBob SquarePants - Volume 1"}, - (struct game_entry){.code = "MS2", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "GBA Video - SpongeBob SquarePants - Volume 2"}, - (struct game_entry){.code = "MS3", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "GBA Video - SpongeBob SquarePants - Volume 3"}, - (struct game_entry){.code = "MSB", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "GBA Video - Strawberry Shortcake - Volume 1"}, - (struct game_entry){.code = "MSR", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "GBA Video - Super Robot Monkey Team - Volume 1"}, - (struct game_entry){.code = "MTM", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "GBA Video - Teenage Mutant Ninja Turtles - Volume 1"}, - (struct game_entry){.code = "MJM", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "GBA Video - The Adventures of Jimmy Neutron Boy Genius - Volume 1"}, - (struct game_entry){.code = "MFO", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "GBA Video - The Fairly Odd Parents - Volume 1"}, - (struct game_entry){.code = "MF2", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "GBA Video - The Fairly Odd Parents - Volume 2"}, - (struct game_entry){.code = "MFP", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "GBA Video - The Proud Family - Volume 1"}, - (struct game_entry){.code = "MYG", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "GBA Video - Yu-Gi-Oh! - Yugi vs. Joey - Volume 1"}, - (struct game_entry){.code = "AGB", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "GBA-SP AV Adaptor"}, - (struct game_entry){.code = "BGK", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Gegege no Kitarou - Kikiippatsu! Youkai Rettou"}, - (struct game_entry){.code = "AGE", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Gekido Advance - Kintaro's Revenge"}, - (struct game_entry){.code = "ANN", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Gekitou Densetsu Noah - Dream Management"}, - (struct game_entry){.code = "AZS", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Gem Smashers"}, - (struct game_entry){.code = "BGJ", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Genseishin the Justirisers - Souchaku Chikyuu no"}, - (struct game_entry){.code = "BGM", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Gensou Maden Saiyuuki - Hangyaku no Toushin-taishi"}, - (struct game_entry){.code = "AGK", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Gensou Suikoden - Card Stories"}, - (struct game_entry){.code = "BGI", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Get Ride AMDriver - Senkou no Hero Tanjou"}, - (struct game_entry){.code = "BGP", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Get Ride! AMDrive Shutsugeki Battle Party"}, - (struct game_entry){.code = "BGB", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Get! - Boku no Mushi Tsukamaete"}, - (struct game_entry){.code = "BGF", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "GetBackers Dakkanya - Jagan Fuuin!"}, - (struct game_entry){.code = "A8G", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "GetBackers Dakkanya - Metropolis Dakkan Sakusen!"}, - (struct game_entry){.code = "BR8", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Ghost Rider"}, - (struct game_entry){.code = "AGV", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Ghost Trap"}, - (struct game_entry){.code = "B3Z", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Global Star - Suduoku Feber"}, - (struct game_entry){.code = "AGQ", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Go! Go! Beckham! - Adventure on Soccer Island"}, - (struct game_entry){.code = "AG4", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Godzilla - Domination!"}, - (struct game_entry){.code = "AGN", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Goemon - New Age Shutsudou!"}, - (struct game_entry){.code = "BGG", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Golden Nugget Casino"}, - (struct game_entry){.code = "AGS", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Golden Sun"}, - (struct game_entry){.code = "AGF", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Golden Sun - The Lost Age"}, - (struct game_entry){.code = "AGA", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Gradius Galaxies"}, - (struct game_entry){.code = "BGT", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Grand Theft Auto Advance"}, - (struct game_entry){.code = "AG9", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Greatest Nine"}, - (struct game_entry){.code = "BUS", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Green Eggs and Ham by Dr. Seuss"}, - (struct game_entry){.code = "BGQ", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Greg Hastings' Tournament Paintball Max'd"}, - (struct game_entry){.code = "AGG", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Gremlins - Stripe vs Gizmo"}, - (struct game_entry){.code = "ARV", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Groove Adventure Rave - Hikari to Yami no Daikessen"}, - (struct game_entry){.code = "ARI", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Groove Adventure Rave - Hikari to Yami no Daikessen 2"}, - (struct game_entry){.code = "ACA", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "GT Advance - Championship Racing"}, - (struct game_entry){.code = "AGW", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "GT Advance 2 - Rally Racing"}, - (struct game_entry){.code = "A2G", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "GT Advance 3 - Pro Concept Racing"}, - (struct game_entry){.code = "BJA", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "GT Racers"}, - (struct game_entry){.code = "AGX", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Guilty Gear X - Advance Edition"}, - (struct game_entry){.code = "BGV", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Gumby vs. The Astrobots"}, - (struct game_entry){.code = "BHG", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Gunstar Super Heroes"}, - (struct game_entry){.code = "BGX", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Gunstar Super Heroes"}, - (struct game_entry){.code = "AIB", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Guranbo"}, - (struct game_entry){.code = "AGC", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Guru Logic Champ"}, - (struct game_entry){.code = "ASB", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Gyakuten Saiban"}, - (struct game_entry){.code = "A3G", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Gyakuten Saiban 2"}, - (struct game_entry){.code = "A3J", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Gyakuten Saiban 3"}, - (struct game_entry){.code = "A8E", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Hachiemon"}, - (struct game_entry){.code = "BHR", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Hagane no Renkinjutsushi - Meisou no Rondo"}, - (struct game_entry){.code = "BH2", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Hagane no Renkinjutsushi - Omoide no Sonata"}, - (struct game_entry){.code = "A2H", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Hajime no Ippo - The Fighting!"}, - (struct game_entry){.code = "AM7", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Hamepane - Tokyo Mew Mew"}, - (struct game_entry){.code = "A4K", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Hamster Club 4"}, - (struct game_entry){.code = "AHB", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Hamster Monogatari 2 GBA"}, - (struct game_entry){.code = "A83", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Hamster Monogatari 3 GBA"}, - (struct game_entry){.code = "BHS", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Hamster Monogatari 3EX 4 Special"}, - (struct game_entry){.code = "BHC", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Hamster Monogatari Collection"}, - (struct game_entry){.code = "A82", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Hamster Paradise - Pure Heart"}, - (struct game_entry){.code = "AHA", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Hamster Paradise Advance"}, - (struct game_entry){.code = "B85", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Hamtaro - Ham-Ham Games"}, - (struct game_entry){.code = "AH3", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Hamtaro - Ham-Ham Heartbreak"}, - (struct game_entry){.code = "A84", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Hamtaro - Rainbow Rescue"}, - (struct game_entry){.code = "BHA", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Hanabi Hyakkei Advance"}, - (struct game_entry){.code = "ADY", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Hanafuda Trump Mahjong - Depachika Wayouchuu"}, - (struct game_entry){.code = "BH3", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Happy Feet"}, - (struct game_entry){.code = "AH6", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Hardcore Pinball"}, - (struct game_entry){.code = "BHO", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Hardcore Pool"}, - (struct game_entry){.code = "BHN", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Harlem Globetrotters - World Tour"}, - (struct game_entry){.code = "BH6", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Haro no Puyo Puyo"}, - (struct game_entry){.code = "AHQ", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Harobots - Robo Hero Battling!!"}, - (struct game_entry){.code = "BHP", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Harry Potter - Quidditch World Cup"}, - (struct game_entry){.code = "A7H", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Harry Potter and the Chamber of Secrets"}, - (struct game_entry){.code = "BH8", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Harry Potter and the Goblet of Fire"}, - (struct game_entry){.code = "BJX", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Harry Potter and the Order of the Phoenix"}, - (struct game_entry){.code = "BHT", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Harry Potter and the Prisoner of Azkaban"}, - (struct game_entry){.code = "AHR", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Harry Potter and the Sorcerer's Stone"}, - (struct game_entry){.code = "BJP", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Harry Potter Collection"}, - (struct game_entry){.code = "ARN", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Harukanaru Toki no Naka de"}, - (struct game_entry){.code = "A4N", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Harvest Moon - Friends of Mineral Town"}, - (struct game_entry){.code = "BFG", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Harvest Moon - More Friends of Mineral Town"}, - (struct game_entry){.code = "AHS", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Hatena Satena"}, - (struct game_entry){.code = "BHJ", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Heidi"}, - (struct game_entry){.code = "BHD", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Hello Idol Debut"}, - (struct game_entry){.code = "B86", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Hello Kitty - Happy Party Pals"}, - (struct game_entry){.code = "AKT", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Hello Kitty Collection - Miracle Fashion Maker"}, - (struct game_entry){.code = "B8F", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Herbie Fully Loaded"}, - (struct game_entry){.code = "AAE", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Hey Arnold! - The Movie"}, - (struct game_entry){.code = "BHH", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Hi Hi Puffy - AmiYumi Kaznapped"}, - (struct game_entry){.code = "AHZ", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Higanbana"}, - (struct game_entry){.code = "ASS", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "High Heat - Major League Baseball 2002"}, - (struct game_entry){.code = "AHH", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "High Heat - Major League Baseball 2003"}, - (struct game_entry){.code = "AHX", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "High Heat - Major League Baseball 2003"}, - (struct game_entry){.code = "BJ2", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "High School Musical - Livin' the Dream"}, - (struct game_entry){.code = "AHK", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Hikaru no Go"}, - (struct game_entry){.code = "AHT", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Hikaru no Go - Taikenban"}, - (struct game_entry){.code = "AKE", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Hikaru no Go 2"}, - (struct game_entry){.code = "A3H", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Hime Kishi Monogatari - Princess Blue"}, - (struct game_entry){.code = "AHI", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Hitsuji no Kimochi"}, - (struct game_entry){.code = "BHM", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Home on the Range"}, - (struct game_entry){.code = "BYP", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Horse & Pony - Let's Ride 2"}, - (struct game_entry){.code = "BHU", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Horsez"}, - (struct game_entry){.code = "AHP", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Hot Potato!"}, - (struct game_entry){.code = "AHW", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Hot Wheels - Burnin' Rubber"}, - (struct game_entry){.code = "BHE", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Hot Wheels - Stunt Track Challenge"}, - (struct game_entry){.code = "AH8", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Hot Wheels - Velocity X"}, - (struct game_entry){.code = "BHW", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Hot Wheels - World Race"}, - (struct game_entry){.code = "BHX", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Hot Wheels All Out"}, - (struct game_entry){.code = "B7I", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Hudson Best Collection 1"}, - (struct game_entry){.code = "B74", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Hudson Best Collection Vol. 4 - Nazotoki Collection"}, - (struct game_entry){.code = "B75", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Hudson Best Collection Vol. 5 - Shooting Collection"}, - (struct game_entry){.code = "B76", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Hudson Best Collection Vol. 6 - Bouken Jima Collection"}, - (struct game_entry){.code = "B72", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Hudson Collection Vol. 2 - Lode Runner Collection"}, - (struct game_entry){.code = "B73", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Hudson Collection Vol. 3 - Action Collection"}, - (struct game_entry){.code = "AZH", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Hugo - Bukkazoom!"}, - (struct game_entry){.code = "AHJ", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Hugo - The Evil Mirror"}, - (struct game_entry){.code = "B2H", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Hugo 2 in 1 - Bukkazoom! + The Evil Mirror"}, - (struct game_entry){.code = "A8N", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Hunter X Hunter - Minna Tomodachi Daisakusen!!"}, - (struct game_entry){.code = "A4C", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "I Spy Challenger!"}, - (struct game_entry){.code = "AIA", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Ice Age"}, - (struct game_entry){.code = "BIA", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Ice Age 2 - The Meltdown"}, - (struct game_entry){.code = "AR3", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Ice Nine"}, - (struct game_entry){.code = "BIV", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Ignition Collection - Volume 1 (3 Games in 1)"}, - (struct game_entry){.code = "AIN", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Initial D - Another Stage"}, - (struct game_entry){.code = "AIG", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Inspector Gadget - Advance Mission"}, - (struct game_entry){.code = "AIR", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Inspector Gadget Racing"}, - (struct game_entry){.code = "AIK", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "International Karate Advanced"}, - (struct game_entry){.code = "A3K", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "International Karate Plus"}, - (struct game_entry){.code = "AIS", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "International Superstar Soccer"}, - (struct game_entry){.code = "AY2", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "International Superstar Soccer Advance"}, - (struct game_entry){.code = "AI9", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Inukko Club"}, - (struct game_entry){.code = "AIY", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Inuyasha - Naraku no Wana! Mayoi no Mori no Shoutaijou"}, - (struct game_entry){.code = "AIV", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Invader"}, - (struct game_entry){.code = "AI3", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Iridion 3D"}, - (struct game_entry){.code = "AI2", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Iridion II"}, - (struct game_entry){.code = "BIR", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Iron Kid"}, - (struct game_entry){.code = "AXT", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Island Xtreme Stunts"}, - (struct game_entry){.code = "AIE", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Isseki Hattyou - Kore 1ppon de 8syurui!"}, - (struct game_entry){.code = "BPI", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "It's Mr Pants"}, - (struct game_entry){.code = "A2J", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "J.League - Winning Eleven Advance 2002"}, - (struct game_entry){.code = "AJP", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "J.League Pocket"}, - (struct game_entry){.code = "AJ2", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "J.League Pocket 2"}, - (struct game_entry){.code = "AC2", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "J.League Pro Soccer Club wo Tsukurou! Advance"}, - (struct game_entry){.code = "AJC", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Jackie Chan Adventures - Legend of the Darkhand"}, - (struct game_entry){.code = "BNJ", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Jajamaru Jr. Denshouki - Jaleco Memorial"}, - (struct game_entry){.code = "A7O", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "James Bond 007 - NightFire"}, - (struct game_entry){.code = "AJD", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "James Pond - Codename Robocod"}, - (struct game_entry){.code = "AJJ", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Jazz Jackrabbit"}, - (struct game_entry){.code = "AJR", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Jet Set Radio"}, - (struct game_entry){.code = "AGM", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "JGTO Kounin Golf Master Mobile - Japan Golf Tour Game"}, - (struct game_entry){.code = "AJW", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Jikkyou World Soccer Pocket"}, - (struct game_entry){.code = "AJK", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Jikkyou World Soccer Pocket 2"}, - (struct game_entry){.code = "AJN", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Jimmy Neutron - Boy Genius"}, - (struct game_entry){.code = "BJY", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Jimmy Neutron Boy Genius - Attack of the Twonkies"}, - (struct game_entry){.code = "AZG", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Jinsei Game Advance"}, - (struct game_entry){.code = "AJU", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Jissen Pachi-Slot Hisshouhou! - Juuou Advance"}, - (struct game_entry){.code = "AJM", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Jonny Moseley Mad Trix"}, - (struct game_entry){.code = "BJK", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Juka and the Monophonic Menace"}, - (struct game_entry){.code = "AJQ", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Jurassic Park III - Island Attack"}, - (struct game_entry){.code = "AJ3", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Jurassic Park III - Park Builder"}, - (struct game_entry){.code = "ADN", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Jurassic Park III - The DNA Factor"}, - (struct game_entry){.code = "AJ8", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Jurassic Park Institute Tour - Dinosaur Rescue"}, - (struct game_entry){.code = "AJL", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Justice League - Injustice for All"}, - (struct game_entry){.code = "BJL", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Justice League Chronicles"}, - (struct game_entry){.code = "BJH", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Justice League Heroes - The Flash"}, - (struct game_entry){.code = "AKV", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "K-1 Pocket Grand Prix"}, - (struct game_entry){.code = "A2O", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "K-1 Pocket Grand Prix 2"}, - (struct game_entry){.code = "AKD", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Kaeru B Back"}, - (struct game_entry){.code = "BKO", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Kaiketsu Zorori to Mahou no Yuuenchi"}, - (struct game_entry){.code = "AKZ", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Kamaitachi no Yoru Advance"}, - (struct game_entry){.code = "AG2", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Kami no Kijutsu - Illusion of the Evil Eyes"}, - (struct game_entry){.code = "AKK", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Kao the Kangaroo"}, - (struct game_entry){.code = "BK8", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Kappa no Kai-Kata - Katan Daibouken"}, - (struct game_entry){.code = "AYK", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Karnaaj Rally"}, - (struct game_entry){.code = "AN5", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Kawa no Nushi Tsuri 5 - Fushigi no Mori Kara"}, - (struct game_entry){.code = "BN4", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Kawa no Nushitsuri 3 & 4"}, - (struct game_entry){.code = "BKG", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Kawaii Pet Game Gallery"}, - (struct game_entry){.code = "BKP", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Kawaii Pet Game Gallery 2"}, - (struct game_entry){.code = "A63", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Kawaii Pet Shop Monogatari 3"}, - (struct game_entry){.code = "ATP", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Keitai Denjuu Telefang 2 - Power"}, - (struct game_entry){.code = "ATS", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Keitai Denjuu Telefang 2 - Speed"}, - (struct game_entry){.code = "AS3", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Kelly Slater's Pro Surfer"}, - (struct game_entry){.code = "BKJ", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Keroro Gunsou Taiketsu Gekisou"}, - (struct game_entry){.code = "BG2", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Kessakusen Ganbare Goemon 1 and 2"}, - (struct game_entry){.code = "BYL", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Kid Paddle"}, - (struct game_entry){.code = "B42", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Kidou Senshi Gundam Seed Destiny"}, - (struct game_entry){.code = "AAL", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Kidou Tenshi Angelic Layer - Misaki to Yume no Tenshi-tachi"}, - (struct game_entry){.code = "BCX", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Kid's Cards"}, - (struct game_entry){.code = "XXX", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Kien"}, - (struct game_entry){.code = "AKI", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Kiki KaiKai Advance"}, - (struct game_entry){.code = "BKH", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Kill Switch"}, - (struct game_entry){.code = "B3L", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Killer 3D Pool"}, - (struct game_entry){.code = "AEY", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Kim Possible - Revenge of Monkey Fist"}, - (struct game_entry){.code = "BKM", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Kim Possible 2 - Drakken's Demise"}, - (struct game_entry){.code = "BQP", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Kim Possible 3 - Team Possible"}, - (struct game_entry){.code = "B8C", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Kingdom Hearts - Chain of Memories"}, - (struct game_entry){.code = "AK5", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Kinniku Banzuke - Kimero! Kiseki no Kanzen Seiha"}, - (struct game_entry){.code = "AK4", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Kinniku Banzuke - Kongou-kun no Daibouken!"}, - (struct game_entry){.code = "A7K", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Kirby - Nightmare in Dream Land"}, - (struct game_entry){.code = "B8K", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Kirby & the Amazing Mirror"}, - (struct game_entry){.code = "BWA", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Kisekae Angel Series 1 - Wannyan Aidoru Gakuen"}, - (struct game_entry){.code = "BE2", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Kisekae Angel Series 2 - Charisma Tenin Ikusei Game"}, - (struct game_entry){.code = "A2V", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Kisekko Gurumi - Chesty to Nuigurumi-tachi no Mahou no Bouken"}, - (struct game_entry){.code = "B2K", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Kiss x Kiss - Seirei Gakuen"}, - (struct game_entry){.code = "AKM", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Kiwame Mahjong Deluxe - Mirai Senshi 21"}, - (struct game_entry){.code = "AKL", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Klonoa - Empire of Dreams"}, - (struct game_entry){.code = "AN6", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Klonoa 2 - Dream Champ Tournament"}, - (struct game_entry){.code = "AK7", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Klonoa Heroes - Densetsu no Star Medal"}, - (struct game_entry){.code = "BDI", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Koinu to Issho - Aijou Monogatari"}, - (struct game_entry){.code = "BI2", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Koinu to Issho! 2"}, - (struct game_entry){.code = "BIS", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Koinu-Chan no Hajimete no Osanpo - Koinu no Kokoro Ikusei Game"}, - (struct game_entry){.code = "AKC", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Konami Collector's Series - Arcade Advanced"}, - (struct game_entry){.code = "AKW", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Konami Krazy Racers"}, - (struct game_entry){.code = "BQB", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Konchu Monster Battle Master"}, - (struct game_entry){.code = "BQS", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Konchu Monster Battle Stadium"}, - (struct game_entry){.code = "BQK", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Konchuu no Mori no Daibouken"}, - (struct game_entry){.code = "BK7", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Kong - King of Atlantis"}, - (struct game_entry){.code = "BKQ", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Kong - The 8th Wonder of the World"}, - (struct game_entry){.code = "AKQ", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Kong - The Animated Series"}, - (struct game_entry){.code = "BKE", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Konjiki no Gashbell - The Card Battle for GBA"}, - (struct game_entry){.code = "BKB", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Konjiki no Gashbell!! Makai no Bookmark"}, - (struct game_entry){.code = "BGY", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Konjiki no Gashbell!! Unare Yuujou no Dengeki"}, - (struct game_entry){.code = "BUD", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Konjiki no Gashbell!! Yuujou no Dengeki Dream Tag Tournament"}, - (struct game_entry){.code = "KHP", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Koro Koro Puzzle - Happy Panechu!"}, - (struct game_entry){.code = "BK5", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Korokke Great Toki no Boukensha"}, - (struct game_entry){.code = "A8M", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Kotoba no Puzzle - Mojipittan Advance"}, - (struct game_entry){.code = "BK6", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Kouchu Ouja - Mushi King"}, - (struct game_entry){.code = "A54", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Koukou Juken Advance Series Eigo Koubun Hen - 26 Units Shuuroku"}, - (struct game_entry){.code = "A53", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Koukou Juken Advance Series Eijukugo Hen - 650 Phrases Shuuroku"}, - (struct game_entry){.code = "A52", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Koukou Juken Advance Series Eitango Hen - 2000 Words Shuuroku"}, - (struct game_entry){.code = "B9A", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Kunio kun Nekketsu Collection 1"}, - (struct game_entry){.code = "B9B", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Kunio Kun Nekketsu Collection 2"}, - (struct game_entry){.code = "B9C", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Kuniokun Nekketsu Collection 3"}, - (struct game_entry){.code = "AGO", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Kurohige no Golf Shiyouyo"}, - (struct game_entry){.code = "AKU", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Kurohige no Kurutto Jintori"}, - (struct game_entry){.code = "AKR", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Kurukuru Kururin"}, - (struct game_entry){.code = "A9Q", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Kururin Paradise"}, - (struct game_entry){.code = "ALD", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Lady Sia"}, - (struct game_entry){.code = "AVD", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Legend of Dynamic - Goushouden - Houkai no Rondo"}, - (struct game_entry){.code = "A2L", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Legends of Wrestling II"}, - (struct game_entry){.code = "BLV", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Legendz - Sign of Necrom"}, - (struct game_entry){.code = "BLJ", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Legendz - Yomigaeru Shiren no Shima"}, - (struct game_entry){.code = "ALB", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "LEGO Bionicle"}, - (struct game_entry){.code = "AL2", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "LEGO Island 2 - The Brickster's Revenge"}, - (struct game_entry){.code = "BKN", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "LEGO Knights Kingdom"}, - (struct game_entry){.code = "ALR", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "LEGO Racers 2"}, - (struct game_entry){.code = "BLW", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "LEGO Star Wars - The Video Game"}, - (struct game_entry){.code = "BL7", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "LEGO Star Wars II - The Original Trilogy"}, - (struct game_entry){.code = "BLY", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Lemony Snicket's A Series of Unfortunate Events"}, - (struct game_entry){.code = "BEF", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Let's Ride - Friends Forever"}, - (struct game_entry){.code = "B34", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Let's Ride! - Sunshine Stables"}, - (struct game_entry){.code = "BL9", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Let's Ride! Dreamer"}, - (struct game_entry){.code = "BRN", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Licca-Chan no Oshare Nikki"}, - (struct game_entry){.code = "BRP", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Liliput Oukoku"}, - (struct game_entry){.code = "ALT", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Lilo & Stitch"}, - (struct game_entry){.code = "BLS", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Lilo & Stitch 2 - Hamsterveil Havoc"}, - (struct game_entry){.code = "ALQ", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Little Buster Q"}, - (struct game_entry){.code = "BEI", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Little Einsteins"}, - (struct game_entry){.code = "ALC", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Little League Baseball 2002"}, - (struct game_entry){.code = "BLI", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Little Patissier Cake no Oshiro"}, - (struct game_entry){.code = "BLM", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Lizzie McGuire"}, - (struct game_entry){.code = "BL2", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Lizzie McGuire 2 - Lizzie Diaries"}, - (struct game_entry){.code = "BL4", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Lizzie McGuire 2 - Lizzie Diaries - Special Edition"}, - (struct game_entry){.code = "BL3", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Lizzie McGuire 3 - Homecoming Havoc"}, - (struct game_entry){.code = "A39", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Lode Runner"}, - (struct game_entry){.code = "BLT", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Looney Tunes - Back in Action"}, - (struct game_entry){.code = "BLN", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Looney Tunes Double Pack - Dizzy Driving + Acme Antics"}, - (struct game_entry){.code = "ALH", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Love Hina Advance - Shukufuku no Kane ha Naru Kana"}, - (struct game_entry){.code = "ALL", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Lucky Luke - Wanted!"}, - (struct game_entry){.code = "AGD", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Lufia - The Ruins of Lore"}, - (struct game_entry){.code = "ALN", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Lunar Legend"}, - (struct game_entry){.code = "AML", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "M&M's Blast!"}, - (struct game_entry){.code = "BEM", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "M&M's Break' Em"}, - (struct game_entry){.code = "BGZ", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Madagascar"}, - (struct game_entry){.code = "BM7", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Madagascar - Operation Penguin"}, - (struct game_entry){.code = "B6M", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Madden NFL 06"}, - (struct game_entry){.code = "B7M", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Madden NFL 07"}, - (struct game_entry){.code = "A2M", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Madden NFL 2002"}, - (struct game_entry){.code = "ANJ", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Madden NFL 2003"}, - (struct game_entry){.code = "BMD", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Madden NFL 2004"}, - (struct game_entry){.code = "BMF", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Madden NFL 2005"}, - (struct game_entry){.code = "A2I", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Magi Nation"}, - (struct game_entry){.code = "AJO", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Magical Houshin"}, - (struct game_entry){.code = "AQM", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Magical Quest 2 Starring Mickey & Minnie"}, - (struct game_entry){.code = "BMQ", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Magical Quest 3 Starring Mickey and Donald"}, - (struct game_entry){.code = "A3M", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Magical Quest Starring Mickey & Minnie"}, - (struct game_entry){.code = "AMV", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Magical Vacation"}, - (struct game_entry){.code = "AMP", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Mahjong Police"}, - (struct game_entry){.code = "BNG", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Mahou Sensei Negima"}, - (struct game_entry){.code = "BNM", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Mahou Sensei Negima! Private Lesson 2"}, - (struct game_entry){.code = "AMC", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Mail de Cute"}, - (struct game_entry){.code = "B2Y", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Major League Baseball 2k7"}, - (struct game_entry){.code = "ACO", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Manga-ka Debut Monogatari"}, - (struct game_entry){.code = "A4M", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Manic Miner"}, - (struct game_entry){.code = "B68", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Marble Madness - Klax"}, - (struct game_entry){.code = "BQL", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "March of the Penguins"}, - (struct game_entry){.code = "BM9", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Marheaven - Knockin' on Heaven's Door"}, - (struct game_entry){.code = "ANS", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Marie, Elie & Anis no Atelier - Soyokaze Kara no Dengon"}, - (struct game_entry){.code = "A88", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Mario & Luigi - Superstar Saga"}, - (struct game_entry){.code = "BMG", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Mario Golf - Advance Tour"}, - (struct game_entry){.code = "AMK", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Mario Kart - Super Circuit"}, - (struct game_entry){.code = "B8M", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Mario Party Advance"}, - (struct game_entry){.code = "BMV", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Mario Pinball Land"}, - (struct game_entry){.code = "BTM", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Mario Tennis - Power Tour"}, - (struct game_entry){.code = "BM5", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Mario vs. Donkey Kong"}, - (struct game_entry){.code = "B4M", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Marvel - Ultimate Alliance"}, - (struct game_entry){.code = "AKS", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Mary-Kate and Ashley - Girls Night Out"}, - (struct game_entry){.code = "AAY", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Mary-Kate and Ashley Sweet 16 - Licensed to Drive"}, - (struct game_entry){.code = "AGU", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Masters of the Universe - He-Man Power of Grayskull"}, - (struct game_entry){.code = "AHO", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Mat Hoffman's Pro BMX"}, - (struct game_entry){.code = "AH2", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Mat Hoffman's Pro BMX 2"}, - (struct game_entry){.code = "BMR", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Matantei Loki Ragnarok - Gensou no Labyrinth"}, - (struct game_entry){.code = "ARQ", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Matchbox Cross Town Heroes"}, - (struct game_entry){.code = "BIY", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Math Patrol - The Kleptoid Threat"}, - (struct game_entry){.code = "BME", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Max Payne"}, - (struct game_entry){.code = "BEE", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Maya The Bee - Sweet Gold"}, - (struct game_entry){.code = "ABV", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Maya the Bee - The Great Adventure"}, - (struct game_entry){.code = "BFQ", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Mazes of Fate"}, - (struct game_entry){.code = "AKG", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Mech Platoon"}, - (struct game_entry){.code = "A8B", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Medabots - Metabee Version"}, - (struct game_entry){.code = "A9B", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Medabots - Rokusho Version"}, - (struct game_entry){.code = "AK8", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Medabots AX - Metabee Version"}, - (struct game_entry){.code = "AK9", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Medabots AX - Rokusho Version"}, - (struct game_entry){.code = "BMH", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Medal of Honor - Infiltrator"}, - (struct game_entry){.code = "AUG", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Medal of Honor - Underground"}, - (struct game_entry){.code = "A5K", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Medarot 2 Core - Kabuto Version"}, - (struct game_entry){.code = "A5Q", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Medarot 2 Core - Kuwagata Version"}, - (struct game_entry){.code = "AGH", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Medarot G - Kabuto Version"}, - (struct game_entry){.code = "AGI", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Medarot G - Kuwagata Version"}, - (struct game_entry){.code = "ANA", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Medarot Navi - Kabuto"}, - (struct game_entry){.code = "AVI", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Medarot Navi - Kuwagata"}, - (struct game_entry){.code = "BRH", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Meet the Robinsons"}, - (struct game_entry){.code = "A89", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "MegaMan - Battle Chip Challenge"}, - (struct game_entry){.code = "A6M", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "MegaMan & Bass"}, - (struct game_entry){.code = "ARE", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "MegaMan Battle Network"}, - (struct game_entry){.code = "AE2", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "MegaMan Battle Network 2"}, - (struct game_entry){.code = "AM2", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "MegaMan Battle Network 2"}, - (struct game_entry){.code = "A3X", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "MegaMan Battle Network 3 Blue"}, - (struct game_entry){.code = "A6B", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "MegaMan Battle Network 3 White"}, - (struct game_entry){.code = "B4B", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Megaman Battle Network 4 - Blue Moon"}, - (struct game_entry){.code = "B4W", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "MegaMan Battle Network 4 - Red Sun"}, - (struct game_entry){.code = "BRK", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Megaman Battle Network 5 - Team Colonel"}, - (struct game_entry){.code = "BRB", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Megaman Battle Network 5 - Team Protoman"}, - (struct game_entry){.code = "BR6", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "MegaMan Battle Network 6 - Cybeast Falzar"}, - (struct game_entry){.code = "BR5", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "MegaMan Battle Network 6 - Cybeast Gregar"}, - (struct game_entry){.code = "AZC", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "MegaMan Zero"}, - (struct game_entry){.code = "A62", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "MegaMan Zero 2"}, - (struct game_entry){.code = "BZ3", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Megaman Zero 3"}, - (struct game_entry){.code = "B4Z", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Megaman Zero 4"}, - (struct game_entry){.code = "BQV", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Meine Tierarztpraxis"}, - (struct game_entry){.code = "AC4", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Meitantei Conan - Nerawareta Tantei"}, - (struct game_entry){.code = "BQA", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Meitantei Conan Akatsuki no Monument"}, - (struct game_entry){.code = "AMI", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Men in Black - The Series"}, - (struct game_entry){.code = "B3M", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Mermaid Melody - Pichi Pichi Picchi Pichi Pichitto Live Start"}, - (struct game_entry){.code = "BMA", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Mermaid Melody - Pichi Pichi Pitch"}, - (struct game_entry){.code = "BM8", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Mermaid Melody - Pichi Pichi Pitch Pichi Pichi Party"}, - (struct game_entry){.code = "A9T", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Metal Max 2 - Kai Version"}, - (struct game_entry){.code = "BSM", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Metal Slug Advance"}, - (struct game_entry){.code = "AAP", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Metalgun Slinger"}, - (struct game_entry){.code = "BMX", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Metroid - Zero Mission"}, - (struct game_entry){.code = "AMT", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Metroid Fusion"}, - (struct game_entry){.code = "BMK", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Mezase Koushien"}, - (struct game_entry){.code = "BM3", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Mickey to Donald no Magical Quest 3"}, - (struct game_entry){.code = "A29", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Mickey to Minnie no Magical Quest 2"}, - (struct game_entry){.code = "BM4", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Mickey to Pocket Resort"}, - (struct game_entry){.code = "AXZ", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Micro Machines"}, - (struct game_entry){.code = "AMQ", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Midnight Club - Street Racing"}, - (struct game_entry){.code = "AM3", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Midway's Greatest Arcade Hits"}, - (struct game_entry){.code = "BMB", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Mighty Beanz - Pocket Puzzles"}, - (struct game_entry){.code = "AM6", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Mike Tyson Boxing"}, - (struct game_entry){.code = "AM9", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Mike Tyson Boxing"}, - (struct game_entry){.code = "B62", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Millipede - Super Break Out - Lunar Lander"}, - (struct game_entry){.code = "AOD", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Minami no Umi no Odyssey"}, - (struct game_entry){.code = "AHC", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Minimoni - Mika no Happy Morning Chatty"}, - (struct game_entry){.code = "AOH", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Minimoni - Onegai Ohoshi-sama!"}, - (struct game_entry){.code = "BMJ", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Minna no Mahjong"}, - (struct game_entry){.code = "BMO", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Minna no Ouji-sama"}, - (struct game_entry){.code = "BKK", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Minna no Shiiku Series - Boku no Kabuto-Kuwagata"}, - (struct game_entry){.code = "AB7", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Minna no Shiiku Series 1 - Boku no Kabuto Mushi"}, - (struct game_entry){.code = "AW7", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Minna no Shiiku Series 2 - Boku no Kuwagata"}, - (struct game_entry){.code = "BTL", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Minna no Soft Series - Happy Trump 20"}, - (struct game_entry){.code = "BHY", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Minna no Soft Series - Hyokkori Hyoutan-jima - Don Gabacho Daikatsuyaku no Maki"}, - (struct game_entry){.code = "BSG", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Minna no Soft Series - Minna no Shogi"}, - (struct game_entry){.code = "ARM", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Minority Report"}, - (struct game_entry){.code = "B3I", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Mirakuru! Panzou - 7 Tsuno Hosh no Kaizoku"}, - (struct game_entry){.code = "AIH", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Mission Impossible - Operation Surma"}, - (struct game_entry){.code = "A5M", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "MLB SlugFest 20-04"}, - (struct game_entry){.code = "AMB", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Mobile Pro Yakyuu - Kantoku no Saihai"}, - (struct game_entry){.code = "BGN", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Mobile Suit Gundam Seed - Battle Assault"}, - (struct game_entry){.code = "BJC", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Moero! Jaleco Collection"}, - (struct game_entry){.code = "BM2", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Momotarou Densetsu G Gold Deck wo Tsukure!"}, - (struct game_entry){.code = "AMM", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Momotarou Matsuri"}, - (struct game_entry){.code = "BUM", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Monopoly"}, - (struct game_entry){.code = "AM8", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Monster Force"}, - (struct game_entry){.code = "ANF", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Monster Gate"}, - (struct game_entry){.code = "A6G", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Monster Gate - Ooinaru Dungeon - Fuuin no Orb"}, - (struct game_entry){.code = "AMN", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Monster Guardians"}, - (struct game_entry){.code = "BQ7", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Monster House"}, - (struct game_entry){.code = "AJA", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Monster Jam - Maximum Destruction"}, - (struct game_entry){.code = "AA4", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Monster Maker 4 - Flash Card"}, - (struct game_entry){.code = "AA5", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Monster Maker 4 - Killer Dice"}, - (struct game_entry){.code = "AMF", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Monster Rancher Advance"}, - (struct game_entry){.code = "A2Q", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Monster Rancher Advance 2"}, - (struct game_entry){.code = "A3N", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Monster Summoner"}, - (struct game_entry){.code = "BMT", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Monster Truck Madness"}, - (struct game_entry){.code = "BMC", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Monster Trucks"}, - (struct game_entry){.code = "BYM", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Monster Trucks Mayhem"}, - (struct game_entry){.code = "A4B", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Monster! Bass Fishing"}, - (struct game_entry){.code = "AMX", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Monsters, Inc."}, - (struct game_entry){.code = "AU3", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Moorhen 3 - The Chicken Chase!"}, - (struct game_entry){.code = "AMS", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Morita Shougi Advance"}, - (struct game_entry){.code = "AXD", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Mortal Kombat - Deadly Alliance"}, - (struct game_entry){.code = "AW4", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Mortal Kombat - Tournament Edition"}, - (struct game_entry){.code = "AM5", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Mortal Kombat Advance"}, - (struct game_entry){.code = "A2U", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Mother 1+2"}, - (struct game_entry){.code = "A3U", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Mother 3"}, - (struct game_entry){.code = "AM4", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Moto GP"}, - (struct game_entry){.code = "A9M", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Moto Racer Advance"}, - (struct game_entry){.code = "AMR", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Motocross Maniacs Advance"}, - (struct game_entry){.code = "BR2", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Mr. Driller 2"}, - (struct game_entry){.code = "AD2", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Mr. Driller 2"}, - (struct game_entry){.code = "AD5", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Mr. Driller A - Fushigi na Pacteria"}, - (struct game_entry){.code = "AZR", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Mr. Nutz"}, - (struct game_entry){.code = "BPC", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Ms. Pac-Man - Maze Madness"}, - (struct game_entry){.code = "B6P", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Ms. Pac-Man - Maze Madness + Pac-Man World"}, - (struct game_entry){.code = "BML", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Mucha Lucha - Mascaritas of the Lost Code"}, - (struct game_entry){.code = "AG6", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Mugenborg"}, - (struct game_entry){.code = "AMW", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Muppet Pinball Mayhem"}, - (struct game_entry){.code = "AMU", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Mutsu - Water Looper Mutsu"}, - (struct game_entry){.code = "A2X", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "MX 2002 - Featuring Ricky Carmichael"}, - (struct game_entry){.code = "BFR", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "My Animal Centre in Africa"}, - (struct game_entry){.code = "BL6", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "My Little Pony - Crystal Princess - The Runaway Rainbow"}, - (struct game_entry){.code = "BQT", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "My Pet Hotel"}, - (struct game_entry){.code = "AKP", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Nakayoshi Mahjong - Kaburiichi"}, - (struct game_entry){.code = "AH7", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Nakayoshi Pet Advance Series 1 - Kawaii Hamster"}, - (struct game_entry){.code = "AI7", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Nakayoshi Pet Advance Series 2 - Kawaii Koinu"}, - (struct game_entry){.code = "BKI", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Nakayoshi Pet Advance Series 4 - Kawaii Koinu Mini - Wankoto Asobou!! Kogata-ken"}, - (struct game_entry){.code = "AHV", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Nakayoshi Youchien - Sukoyaka Enji Ikusei Game"}, - (struct game_entry){.code = "ANM", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Namco Museum"}, - (struct game_entry){.code = "B5N", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Namco Museum - 50th Anniversary"}, - (struct game_entry){.code = "AND", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Nancy Drew - Message in a Haunted Mansion"}, - (struct game_entry){.code = "ANP", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Napoleon"}, - (struct game_entry){.code = "AYR", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Narikiri Jockey Game - Yuushun Rhapsody"}, - (struct game_entry){.code = "AUE", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Naruto - Konoha Senki"}, - (struct game_entry){.code = "A7A", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Naruto - Ninja Council"}, - (struct game_entry){.code = "BN2", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Naruto Ninja Council 2"}, - (struct game_entry){.code = "BNR", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Naruto RPG - Uketsugareshi Hi no Ishi"}, - (struct game_entry){.code = "ANH", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "NASCAR Heat 2002"}, - (struct game_entry){.code = "AN2", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Natural 2 - Duo"}, - (struct game_entry){.code = "ABN", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "NBA Jam 2002"}, - (struct game_entry){.code = "BNW", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Need for Speed - Most Wanted"}, - (struct game_entry){.code = "AZF", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Need for Speed - Porsche Unleashed"}, - (struct game_entry){.code = "BNS", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Need for Speed - Underground"}, - (struct game_entry){.code = "BNF", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Need for Speed - Underground 2"}, - (struct game_entry){.code = "BN7", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Need for Speed Carbon - Own the City"}, - (struct game_entry){.code = "ABZ", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "NFL Blitz 20-02"}, - (struct game_entry){.code = "ANK", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "NFL Blitz 20-03"}, - (struct game_entry){.code = "ATX", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "NGT - Next Generation Tennis"}, - (struct game_entry){.code = "ANL", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "NHL 2002"}, - (struct game_entry){.code = "AN4", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "NHL Hitz 20-03"}, - (struct game_entry){.code = "BUJ", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Nicktoons - Attack of the Toybots"}, - (struct game_entry){.code = "BNV", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Nicktoons - Battle for Volcano Island"}, - (struct game_entry){.code = "BCC", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Nicktoons - Freeze Frame Frenzy"}, - (struct game_entry){.code = "ANQ", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Nicktoons Racing"}, - (struct game_entry){.code = "BNU", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Nicktoons Unite!"}, - (struct game_entry){.code = "ANX", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Ninja Five-O"}, - (struct game_entry){.code = "ANT", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Nippon Pro Mahjong Renmei Kounin - Tetsuman Advance"}, - (struct game_entry){.code = "AGP", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "No Rules - Get Phat"}, - (struct game_entry){.code = "ANO", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Nobunaga Ibun"}, - (struct game_entry){.code = "ANB", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Nobunaga no Yabou"}, - (struct game_entry){.code = "BNK", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Noddy - A day in Toyland"}, - (struct game_entry){.code = "BKR", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Nonono Puzzle Chailien"}, - (struct game_entry){.code = "BNY", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Nyan Nyan Nyanko no Nyan Collection"}, - (struct game_entry){.code = "BO2", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Ochainu no Bouken Jima"}, - (struct game_entry){.code = "BIK", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Ochainuken Kururin"}, - (struct game_entry){.code = "BDR", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Ochaken no Heya"}, - (struct game_entry){.code = "BCU", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Ochaken no Yumebouken"}, - (struct game_entry){.code = "BOD", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Oddworld - Munch's Oddysee"}, - (struct game_entry){.code = "A87", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Ohanaya-San Monogatari GBA"}, - (struct game_entry){.code = "BOJ", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Ojarumaru - Gekkouchou Sanpo de Ojaru"}, - (struct game_entry){.code = "AOK", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Okumanchouja Game - Nottori Daisakusen!"}, - (struct game_entry){.code = "BON", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "One Piece"}, - (struct game_entry){.code = "BIP", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "One Piece - Dragon Dream"}, - (struct game_entry){.code = "B08", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "One Piece - Going Baseball"}, - (struct game_entry){.code = "BO8", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "One Piece - Going Baseball Haejeok Yaku"}, - (struct game_entry){.code = "AUS", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "One Piece - Mezase! King of Berries"}, - (struct game_entry){.code = "AO7", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "One Piece - Nanatsu Shima no Daihihou"}, - (struct game_entry){.code = "A6O", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Onimusha Tactics"}, - (struct game_entry){.code = "BIT", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Onmyou Taisenki Zeroshik"}, - (struct game_entry){.code = "BOA", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Open Season"}, - (struct game_entry){.code = "BAA", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Operation Armored Liberty"}, - (struct game_entry){.code = "AOR", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Oriental Blue - Ao no Tengai"}, - (struct game_entry){.code = "AIC", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Oshaberi Inko Club"}, - (struct game_entry){.code = "AOP", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Oshare Princess"}, - (struct game_entry){.code = "AO2", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Oshare Princess 2"}, - (struct game_entry){.code = "BO3", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Oshare Princess 3"}, - (struct game_entry){.code = "BO5", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Oshare Princess 5"}, - (struct game_entry){.code = "A5S", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Oshare Wanko"}, - (struct game_entry){.code = "BOF", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Ottifanten Pinball"}, - (struct game_entry){.code = "BH5", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Over the Hedge"}, - (struct game_entry){.code = "BH7", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Over the Hedge - Hammy Goes Nuts"}, - (struct game_entry){.code = "BOZ", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Ozzy & Drix"}, - (struct game_entry){.code = "APC", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Pac-Man Collection"}, - (struct game_entry){.code = "BP8", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Pac-Man Pinball Advance"}, - (struct game_entry){.code = "BPA", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Pac-Man World"}, - (struct game_entry){.code = "B2C", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Pac-Man World 2"}, - (struct game_entry){.code = "B6B", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Paperboy - Rampage"}, - (struct game_entry){.code = "BBQ", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Pawa Poke Dash"}, - (struct game_entry){.code = "BUR", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Paws & Claws - Pet Resort"}, - (struct game_entry){.code = "BPK", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Payback"}, - (struct game_entry){.code = "BPZ", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Pazunin - Uminin No Puzzle de Nimu"}, - (struct game_entry){.code = "APP", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Peter Pan - Return to Neverland"}, - (struct game_entry){.code = "BPT", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Peter Pan - The Motion Picture Event"}, - (struct game_entry){.code = "AJH", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Petz - Hamsterz Life 2"}, - (struct game_entry){.code = "BNB", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Petz Vet"}, - (struct game_entry){.code = "BPV", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Pferd & Pony - Mein Pferdehof"}, - (struct game_entry){.code = "APX", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Phalanx - The Enforce Fighter A-144"}, - (struct game_entry){.code = "AYC", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Phantasy Star Collection"}, - (struct game_entry){.code = "BFX", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Phil of the Future"}, - (struct game_entry){.code = "BP3", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Pia Carrot he Youkoso!! 3.3"}, - (struct game_entry){.code = "A9N", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Piglet's Big Game"}, - (struct game_entry){.code = "BPN", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Pika Pika Nurse Monogatari - Nurse Ikusei Game"}, - (struct game_entry){.code = "APZ", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Pinball Advance"}, - (struct game_entry){.code = "APL", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Pinball Challenge Deluxe"}, - (struct game_entry){.code = "A2T", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Pinball Tycoon"}, - (struct game_entry){.code = "APE", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Pink Panther - Pinkadelic Pursuit"}, - (struct game_entry){.code = "AP7", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Pink Panther - Pinkadelic Pursuit"}, - (struct game_entry){.code = "API", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Pinky and the Brain - The Masterplan"}, - (struct game_entry){.code = "APN", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Pinky Monkey Town"}, - (struct game_entry){.code = "APB", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Pinobee - Wings of Adventure"}, - (struct game_entry){.code = "AP6", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Pinobee & Phoebee"}, - (struct game_entry){.code = "B8Q", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Pirates of the Caribbean - Dead Man's Chest"}, - (struct game_entry){.code = "A8Q", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Pirates of the Caribbean - The Curse of the Black Pearl"}, - (struct game_entry){.code = "BPH", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Pitfall - The Lost Expedition"}, - (struct game_entry){.code = "APF", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Pitfall - The Mayan Adventure"}, - (struct game_entry){.code = "BQ9", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Pixeline i Pixieland"}, - (struct game_entry){.code = "APM", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Planet Monsters"}, - (struct game_entry){.code = "AYN", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Planet of the Apes"}, - (struct game_entry){.code = "ASH", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Play Novel - Silent Hill"}, - (struct game_entry){.code = "BTD", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Pocket Dogs"}, - (struct game_entry){.code = "AP9", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Pocket Music"}, - (struct game_entry){.code = "BPJ", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Pocket Professor - Kwik Notes Vol. 1"}, - (struct game_entry){.code = "APK", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Pocky & Rocky with Becky"}, - (struct game_entry){.code = "BPE", .storage = BACKUP_FLASH128, .flags = FLAGS_RTC, .title = "Pokemon - Emerald Version"}, - (struct game_entry){.code = "BPR", .storage = BACKUP_FLASH128, .flags = FLAGS_RTC, .title = "Pokemon - Fire Red Version"}, - (struct game_entry){.code = "BPG", .storage = BACKUP_FLASH128, .flags = FLAGS_RTC, .title = "Pokemon - Leaf Green Version"}, - (struct game_entry){.code = "AXV", .storage = BACKUP_FLASH128, .flags = FLAGS_RTC, .title = "Pokemon - Ruby Version"}, - (struct game_entry){.code = "AXP", .storage = BACKUP_FLASH128, .flags = FLAGS_RTC, .title = "Pokemon - Sapphire Version"}, - (struct game_entry){.code = "B24", .storage = BACKUP_FLASH128, .flags = FLAGS_NONE, .title = "Pokemon Mystery Dungeon - Red Rescue Team"}, - (struct game_entry){.code = "BPP", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Pokemon Pinball - Ruby & Sapphire"}, - (struct game_entry){.code = "BII", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Polarium Advance"}, - (struct game_entry){.code = "B3F", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Polly Pocket!"}, - (struct game_entry){.code = "AOT", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Polly! Pocket - Super Splash Island"}, - (struct game_entry){.code = "APO", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Popeye - Rush for Spinach"}, - (struct game_entry){.code = "BRO", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Postman Pat and the Greendale Rocket"}, - (struct game_entry){.code = "B8P", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Power Pro Kun Pocket 1&2"}, - (struct game_entry){.code = "AP3", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Power Pro Kun Pocket 3"}, - (struct game_entry){.code = "AP4", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Power Pro Kun Pocket 4"}, - (struct game_entry){.code = "A5P", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Power Pro Kun Pocket 5"}, - (struct game_entry){.code = "BP6", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Power Pro Kun Pocket 6"}, - (struct game_entry){.code = "BP7", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Power Pro Kun Pocket 7"}, - (struct game_entry){.code = "BPO", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Power Rangers - Dino Thunder"}, - (struct game_entry){.code = "BPW", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Power Rangers - Ninja Storm"}, - (struct game_entry){.code = "BRD", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Power Rangers - S.P.D."}, - (struct game_entry){.code = "APR", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Power Rangers - Time Force"}, - (struct game_entry){.code = "APW", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Power Rangers - Wild Force"}, - (struct game_entry){.code = "APH", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Prehistorik Man"}, - (struct game_entry){.code = "BAQ", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Premier Action Soccer"}, - (struct game_entry){.code = "BPM", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Premier Manager 2003-04"}, - (struct game_entry){.code = "BP4", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Premier Manager 2004 - 2005"}, - (struct game_entry){.code = "BP5", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Premier Manager 2005 - 2006"}, - (struct game_entry){.code = "BPY", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Prince of Persia - The Sands of Time"}, - (struct game_entry){.code = "B2Q", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Prince of Persia - The Sands of Time + Tomb Raider - The Prophecy"}, - (struct game_entry){.code = "BNP", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Princess Natasha - Student Secret Agent"}, - (struct game_entry){.code = "B2O", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Pro Mahjong - Tsuwamono GBA"}, - (struct game_entry){.code = "ALM", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Pro Yakyuu Team wo Tsukurou! Advance"}, - (struct game_entry){.code = "APU", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "PukuPuku Tennen Kairanban"}, - (struct game_entry){.code = "BPQ", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "PukuPuku Tennen Kairanban - Koi no Cupid Daisakusen"}, - (struct game_entry){.code = "B3P", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Pukupuku Tennen Kairanban Youkoso Illusion Land"}, - (struct game_entry){.code = "APG", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Punch King - Arcade Boxing"}, - (struct game_entry){.code = "BYX", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Puppy Luv - Spa and Resort"}, - (struct game_entry){.code = "APY", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Puyo Pop"}, - (struct game_entry){.code = "BPF", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Puyo Pop Fever"}, - (struct game_entry){.code = "AEH", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Puzzle & Tantei Collection"}, - (struct game_entry){.code = "BPB", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Pyuu to Fuku! Jaguar - Byo to Deru! Megane Kun"}, - (struct game_entry){.code = "BQD", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Quad Desert Fury"}, - (struct game_entry){.code = "BRW", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Racing Fever"}, - (struct game_entry){.code = "BRA", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Racing Gears Advance"}, - (struct game_entry){.code = "ARX", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Rampage - Puzzle Attack"}, - (struct game_entry){.code = "BRF", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Rapala Pro Fishing"}, - (struct game_entry){.code = "BNL", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Ratatouille"}, - (struct game_entry){.code = "BRM", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Rave Master - Special Attack Force"}, - (struct game_entry){.code = "BX5", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Rayman - 10th Anniversary"}, - (struct game_entry){.code = "BRY", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Rayman - Hoodlum's Revenge"}, - (struct game_entry){.code = "BQ3", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Rayman - Raving Rabbids"}, - (struct game_entry){.code = "AYZ", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Rayman 3"}, - (struct game_entry){.code = "ARY", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Rayman Advance"}, - (struct game_entry){.code = "ARF", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Razor Freestyle Scooter"}, - (struct game_entry){.code = "AR2", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Ready 2 Rumble Boxing - Round 2"}, - (struct game_entry){.code = "BRL", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Rebelstar - Tactical Command"}, - (struct game_entry){.code = "ARH", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Recca no Honoo - The Game"}, - (struct game_entry){.code = "AR9", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Reign of Fire"}, - (struct game_entry){.code = "BR9", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Relaxuma na Mainichi"}, - (struct game_entry){.code = "AQH", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Rescue Heroes - Billy Blazes!"}, - (struct game_entry){.code = "BRI", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Rhythm Tengoku"}, - (struct game_entry){.code = "B66", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Risk - Battleship - Clue"}, - (struct game_entry){.code = "BDT", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "River City Ransom EX"}, - (struct game_entry){.code = "BRE", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Riviera - The Promised Land"}, - (struct game_entry){.code = "A9R", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Road Rash - Jailbreak"}, - (struct game_entry){.code = "ACV", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Robopon 2 - Cross Version"}, - (struct game_entry){.code = "ARP", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Robopon 2 - Ring Version"}, - (struct game_entry){.code = "ARU", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Robot Wars - Advanced Destruction"}, - (struct game_entry){.code = "ARW", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Robot Wars - Advanced Destruction"}, - (struct game_entry){.code = "ARS", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Robot Wars - Extreme Destruction"}, - (struct game_entry){.code = "ARB", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Robotech - The Macross Saga"}, - (struct game_entry){.code = "BRT", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Robots"}, - (struct game_entry){.code = "BR7", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Rock 'Em Sock 'Em Robots"}, - (struct game_entry){.code = "A4R", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Rock N' Roll Racing"}, - (struct game_entry){.code = "AR4", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Rocket Power - Beach Bandits"}, - (struct game_entry){.code = "ARK", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Rocket Power - Dream Scheme"}, - (struct game_entry){.code = "AZZ", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Rocket Power - Zero Gravity Zone"}, - (struct game_entry){.code = "AFC", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "RockMan & Forte"}, - (struct game_entry){.code = "BR4", .storage = BACKUP_FLASH64, .flags = FLAGS_RTC, .title = "Rockman EXE 4.5 - Real Operation"}, - (struct game_entry){.code = "ARZ", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "RockMan Zero"}, - (struct game_entry){.code = "AR8", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Rocky"}, - (struct game_entry){.code = "ARO", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Rocky"}, - (struct game_entry){.code = "A8T", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "RPG Tsukuru Advance"}, - (struct game_entry){.code = "BR3", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "R-Type III"}, - (struct game_entry){.code = "ARG", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Rugrats - Castle Capers"}, - (struct game_entry){.code = "A5W", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Rugrats - Go Wild"}, - (struct game_entry){.code = "AR5", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Rugrats - I Gotta Go Party"}, - (struct game_entry){.code = "AWU", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Sabre Wulf"}, - (struct game_entry){.code = "A3B", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Sabrina - The Teenage Witch - Potion Commotion"}, - (struct game_entry){.code = "ASM", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Saibara Rieko no Dendou Mahjong"}, - (struct game_entry){.code = "ACL", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Sakura Momoko no UkiUki Carnival"}, - (struct game_entry){.code = "AS5", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Salt Lake 2002"}, - (struct game_entry){.code = "AWG", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Salt Lake 2002"}, - (struct game_entry){.code = "AOS", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Samurai Deeper Kyo"}, - (struct game_entry){.code = "AEC", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Samurai Evolution - Oukoku Geist"}, - (struct game_entry){.code = "AJT", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Samurai Jack - The Amulet of Time"}, - (struct game_entry){.code = "ASX", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "San Goku Shi"}, - (struct game_entry){.code = "B3E", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "San Goku Shi Eiketsuden"}, - (struct game_entry){.code = "B3Q", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "San Goku Shi Koumeiden"}, - (struct game_entry){.code = "A85", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Sanrio Puroland All Characters"}, - (struct game_entry){.code = "ASN", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Sansara Naga 1x2"}, - (struct game_entry){.code = "AXX", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Santa Claus Jr. Advance"}, - (struct game_entry){.code = "AUZ", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Santa Claus Saves the Earth"}, - (struct game_entry){.code = "A57", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Scan Hunter - Sennen Kaigyo wo Oe!"}, - (struct game_entry){.code = "AP8", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Scooby-Doo - The Motion Picture"}, - (struct game_entry){.code = "BMU", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Scooby-Doo 2 - Monsters Unleashed"}, - (struct game_entry){.code = "ASD", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Scooby-Doo and the Cyber Chase"}, - (struct game_entry){.code = "BMM", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Scooby-Doo! - Mystery Mayhem"}, - (struct game_entry){.code = "B25", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Scooby-Doo! - Unmasked"}, - (struct game_entry){.code = "AQB", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Scrabble"}, - (struct game_entry){.code = "BLA", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Scrabble Blast!"}, - (struct game_entry){.code = "BHV", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Scurge - Hive"}, - (struct game_entry){.code = "BGE", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "SD Gundam Force"}, - (struct game_entry){.code = "BG4", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "SD Gundam Force"}, - (struct game_entry){.code = "BGA", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "SD Gundam G Generation"}, - (struct game_entry){.code = "ALJ", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Sea Trader - Rise of Taipan"}, - (struct game_entry){.code = "AAH", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Secret Agent Barbie - Royal Jewels Mission"}, - (struct game_entry){.code = "AYP", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Sega Arcade Gallery"}, - (struct game_entry){.code = "AYL", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Sega Rally Championship"}, - (struct game_entry){.code = "A3P", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Sega Smash Pack"}, - (struct game_entry){.code = "A7G", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Sengoku Kakumei Gaiden"}, - (struct game_entry){.code = "BKA", .storage = BACKUP_FLASH128, .flags = FLAGS_NONE, .title = "Sennen Kazoku"}, - (struct game_entry){.code = "BSY", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Sentouin - Yamada Hajime"}, - (struct game_entry){.code = "AEN", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Serious Sam Advance"}, - (struct game_entry){.code = "BHL", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Shaman King - Legacy of the Spirits - Soaring Hawk"}, - (struct game_entry){.code = "BWS", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Shaman King - Legacy of the Spirits - Sprinting Wolf"}, - (struct game_entry){.code = "BSO", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Shaman King - Master of Spirits"}, - (struct game_entry){.code = "AKA", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Shaman King Card Game - Chou Senjiryakketsu 2"}, - (struct game_entry){.code = "AL3", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Shaman King Card Game - Chou Senjiryakketsu 3"}, - (struct game_entry){.code = "BBA", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Shamu's Deep Sea Adventures"}, - (struct game_entry){.code = "BSH", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Shanghai"}, - (struct game_entry){.code = "ASV", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Shanghai Advance"}, - (struct game_entry){.code = "BSU", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Shark Tale"}, - (struct game_entry){.code = "B9T", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Shark Tale"}, - (struct game_entry){.code = "ASC", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Shaun Palmer's Pro Snowboarder"}, - (struct game_entry){.code = "AEP", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Sheep"}, - (struct game_entry){.code = "A6R", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Shifting Gears - Road Trip"}, - (struct game_entry){.code = "B4K", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Shikakui Atama wo Marukusuru Advance - Kanji Keisan"}, - (struct game_entry){.code = "B4R", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Shikakui Atama wo Marukusuru Advance - Kokugo Sansu Rika Shakai"}, - (struct game_entry){.code = "A64", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Shimura Ken no Baka Tonosama"}, - (struct game_entry){.code = "U33", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Shin Bokura no Taiyou - Gyakushuu no Sabata"}, - (struct game_entry){.code = "AAU", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Shin Megami Tensei"}, - (struct game_entry){.code = "BDL", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Shin Megami Tensei - Devil Children Messiah Riser"}, - (struct game_entry){.code = "A5T", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Shin Megami Tensei 2"}, - (struct game_entry){.code = "BDH", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Shin Megami Tensei Devil Children - Honoo no Sho"}, - (struct game_entry){.code = "BDY", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Shin Megami Tensei Devil Children - Koori no Sho"}, - (struct game_entry){.code = "A8Z", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Shin Megami Tensei Devil Children - Puzzle de Call!"}, - (struct game_entry){.code = "ARA", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Shin Nippon Pro Wrestling Toukon Retsuden Advance"}, - (struct game_entry){.code = "BKV", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Shingata Medarot - Kabuto Version"}, - (struct game_entry){.code = "BKU", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Shingata Medarot - Kuwagata Version"}, - (struct game_entry){.code = "AF5", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Shining Force - Resurrection of the Dark Dragon"}, - (struct game_entry){.code = "AHU", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Shining Soul"}, - (struct game_entry){.code = "AU2", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Shining Soul II"}, - (struct game_entry){.code = "ANV", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Shiren Monsters - Netsal"}, - (struct game_entry){.code = "B2M", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Shonen Jump's Shaman King - Master of Spirits 2"}, - (struct game_entry){.code = "AH4", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Shrek - Hassle at the Castle"}, - (struct game_entry){.code = "AOI", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Shrek - Reekin' Havoc"}, - (struct game_entry){.code = "B4I", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Shrek - Smash n' Crash Racing"}, - (struct game_entry){.code = "B4U", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Shrek - Super Slam"}, - (struct game_entry){.code = "AS4", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Shrek - Swamp Kart Speedway"}, - (struct game_entry){.code = "BSE", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Shrek 2"}, - (struct game_entry){.code = "BSI", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Shrek 2 - Beg for Mercy"}, - (struct game_entry){.code = "B3H", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Shrek the Third"}, - (struct game_entry){.code = "B3G", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Sigma Star Saga"}, - (struct game_entry){.code = "AIP", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Silent Scope"}, - (struct game_entry){.code = "A7I", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Silk to Cotton"}, - (struct game_entry){.code = "A5C", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Sim City 2000"}, - (struct game_entry){.code = "AZK", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Simple 2960 Tomodachi Series Vol. 1 - The Table Game Collection"}, - (struct game_entry){.code = "AZ9", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Simple 2960 Tomodachi Series Vol. 2 - The Block Kuzushi"}, - (struct game_entry){.code = "BS3", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Simple 2960 Tomodachi Series Vol. 3 - The Itsudemo Puzzle"}, - (struct game_entry){.code = "BS4", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Simple 2960 Tomodachi Series Vol. 4 - The Trump"}, - (struct game_entry){.code = "AAJ", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Sin Kisekae Monogatari"}, - (struct game_entry){.code = "A4P", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Sister Princess - RePure"}, - (struct game_entry){.code = "BSD", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Sitting Ducks"}, - (struct game_entry){.code = "B4D", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Sky Dancers - They Magically Fly!"}, - (struct game_entry){.code = "A9K", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Slime Morimori Dragon Quest - Shougeki no Shippo Dan"}, - (struct game_entry){.code = "ATB", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Slot! Pro 2 Advance - GoGo Juggler & New Tairyou"}, - (struct game_entry){.code = "ASF", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Slot! Pro Advance - Takarabune & Ooedo Sakurafubuki 2"}, - (struct game_entry){.code = "BSV", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Smashing Drive"}, - (struct game_entry){.code = "ASG", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Smuggler's Run"}, - (struct game_entry){.code = "AEA", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Snap Kid's"}, - (struct game_entry){.code = "ASQ", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Snood"}, - (struct game_entry){.code = "B2V", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Snood 2 - On Vacation"}, - (struct game_entry){.code = "AK6", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Soccer Kid"}, - (struct game_entry){.code = "ALS", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Soccer Mania"}, - (struct game_entry){.code = "ASO", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Sonic Advance"}, - (struct game_entry){.code = "A2N", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Sonic Advance 2"}, - (struct game_entry){.code = "B3S", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Sonic Advance 3"}, - (struct game_entry){.code = "BSB", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Sonic Battle"}, - (struct game_entry){.code = "A3V", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Sonic Pinball Party"}, - (struct game_entry){.code = "A86", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Sonic Pinball Party"}, - (struct game_entry){.code = "BIJ", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Sonic The Hedgehog - Genesis"}, - (struct game_entry){.code = "B67", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Sorry! - Aggravation - Scrabble Junior"}, - (struct game_entry){.code = "A5U", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Space Channel 5 - Ulala's Cosmic Attack"}, - (struct game_entry){.code = "AJS", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Space Hexcite - Maetel Legend EX"}, - (struct game_entry){.code = "AID", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Space Invaders"}, - (struct game_entry){.code = "AS6", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Speedball 2 - Brutal Deluxe"}, - (struct game_entry){.code = "AKX", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Spider-Man"}, - (struct game_entry){.code = "BC9", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Spider-Man - Battle For New York"}, - (struct game_entry){.code = "ASE", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Spider-Man - Mysterio's Menace"}, - (struct game_entry){.code = "BSP", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Spider-Man 2"}, - (struct game_entry){.code = "BI3", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Spider-Man 3"}, - (struct game_entry){.code = "AC6", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Spirit - Stallion of the Cimarron"}, - (struct game_entry){.code = "AWN", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Spirit & Spells"}, - (struct game_entry){.code = "BSQ", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "SpongeBob SquarePants - Battle for Bikini Bottom"}, - (struct game_entry){.code = "BQ4", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "SpongeBob SquarePants - Creature from the Krusty Krab"}, - (struct game_entry){.code = "BQQ", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "SpongeBob SquarePants - Lights, Camera, Pants!"}, - (struct game_entry){.code = "AQ3", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "SpongeBob SquarePants - Revenge of the Flying Dutchman"}, - (struct game_entry){.code = "ASP", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "SpongeBob SquarePants - SuperSponge"}, - (struct game_entry){.code = "BZX", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "SpongeBob's Atlantis Squarepantis"}, - (struct game_entry){.code = "AKB", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Sports Illustrated for Kids - Baseball"}, - (struct game_entry){.code = "AKF", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Sports Illustrated for Kids - Football"}, - (struct game_entry){.code = "B23", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Sportsman's Pack - Cabela's Big Game Hunter + Rapala Pro Fishing"}, - (struct game_entry){.code = "B6A", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Spy Hunter - Super Sprint"}, - (struct game_entry){.code = "AV3", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Spy Kids 3-D - Game Over"}, - (struct game_entry){.code = "A2K", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Spy Kids Challenger"}, - (struct game_entry){.code = "BSS", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Spy Muppets - License to Croak"}, - (struct game_entry){.code = "AHN", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "SpyHunter"}, - (struct game_entry){.code = "AOW", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Spyro - Attack of the Rhynocs"}, - (struct game_entry){.code = "ASY", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Spyro - Season of Ice"}, - (struct game_entry){.code = "A2S", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Spyro 2 - Season of Flame"}, - (struct game_entry){.code = "A4S", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Spyro Advance"}, - (struct game_entry){.code = "BS8", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Spyro Advance - Wakuwaku Tomodachi"}, - (struct game_entry){.code = "BST", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Spyro Orange - The Cortex Conspiracy"}, - (struct game_entry){.code = "B8S", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Spyro Superpack - Season of Ice + Season of Flame"}, - (struct game_entry){.code = "BSX", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "SSX 3"}, - (struct game_entry){.code = "AXY", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "SSX Tricky"}, - (struct game_entry){.code = "A9G", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Stadium Games"}, - (struct game_entry){.code = "BSW", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Star Wars - Flight of the Falcon"}, - (struct game_entry){.code = "ASW", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Star Wars - Jedi Power Battles"}, - (struct game_entry){.code = "A2W", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Star Wars - The New Droid Army"}, - (struct game_entry){.code = "AS2", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Star Wars Episode II - Attack of the Clones"}, - (struct game_entry){.code = "BE3", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Star Wars Episode III - Revenge of the Sith"}, - (struct game_entry){.code = "BCK", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Star Wars Trilogy - Apprentice of the Force"}, - (struct game_entry){.code = "AS8", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Star X"}, - (struct game_entry){.code = "AYH", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Starsky & Hutch"}, - (struct game_entry){.code = "BKT", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Steel Empire"}, - (struct game_entry){.code = "ATU", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Steven Gerrard's Total Soccer 2002"}, - (struct game_entry){.code = "B35", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Strawberry Shortcake - Summertime Adventure"}, - (struct game_entry){.code = "BQW", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Strawberry Shortcake - Summertime Adventure - Special Edition"}, - (struct game_entry){.code = "B4T", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Strawberry Shortcake - Sweet Dreams"}, - (struct game_entry){.code = "AZU", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Street Fighter Alpha 3 - Upper"}, - (struct game_entry){.code = "A3Z", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Street Jam Basketball"}, - (struct game_entry){.code = "BCZ", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Street Racing Syndicate"}, - (struct game_entry){.code = "AFH", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Strike Force Hydra"}, - (struct game_entry){.code = "ASL", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Stuart Little 2"}, - (struct game_entry){.code = "AUX", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Stuntman"}, - (struct game_entry){.code = "B4L", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Sugar Sugar Une - Heart Gaippai! Moegi Gakuen"}, - (struct game_entry){.code = "AB4", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Summon Night - Swordcraft Story"}, - (struct game_entry){.code = "BSK", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Summon Night - Swordcraft Story 2"}, - (struct game_entry){.code = "B3C", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Summon Night Craft Sword Monogatari - Hajimari no Ishi"}, - (struct game_entry){.code = "BG6", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Super Army War"}, - (struct game_entry){.code = "AVZ", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Super Bubble Pop"}, - (struct game_entry){.code = "ABM", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Super Bust-A-Move"}, - (struct game_entry){.code = "BSA", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Super Chinese 1 - 2 Advance"}, - (struct game_entry){.code = "BCL", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Super Collapse! II"}, - (struct game_entry){.code = "ADF", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Super Dodge Ball Advance"}, - (struct game_entry){.code = "BDP", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Super Duper Sumos"}, - (struct game_entry){.code = "AG5", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Super Ghouls 'N Ghosts"}, - (struct game_entry){.code = "BF8", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Super Hornet FA 18F"}, - (struct game_entry){.code = "AMA", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Super Mario Advance"}, - (struct game_entry){.code = "AMZ", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Super Mario Advance (Kiosk Demo)"}, - (struct game_entry){.code = "AX4", .storage = BACKUP_FLASH128, .flags = FLAGS_NONE, .title = "Super Mario Advance 4 - Super Mario Bros. 3"}, - (struct game_entry){.code = "AA2", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Super Mario World - Super Mario Advance 2"}, - (struct game_entry){.code = "ALU", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Super Monkey Ball Jr."}, - (struct game_entry){.code = "AZ8", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Super Puzzle Fighter II Turbo"}, - (struct game_entry){.code = "BDM", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Super Real Mahjong Dousoukai"}, - (struct game_entry){.code = "AOG", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Super Robot Taisen - Original Generation"}, - (struct game_entry){.code = "B2R", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Super Robot Taisen - Original Generation 2"}, - (struct game_entry){.code = "ASR", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Super Robot Taisen A"}, - (struct game_entry){.code = "A6S", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Super Robot Taisen D"}, - (struct game_entry){.code = "B6J", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Super Robot Taisen J"}, - (struct game_entry){.code = "AJ9", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Super Robot Taisen R"}, - (struct game_entry){.code = "AXR", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Super Street Fighter II Turbo - Revival"}, - (struct game_entry){.code = "ASU", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Superman - Countdown to Apokolips"}, - (struct game_entry){.code = "BQX", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Superman Returns - Fortress of Solitude"}, - (struct game_entry){.code = "BXU", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Surf's Up"}, - (struct game_entry){.code = "ASK", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Sutakomi - Star Communicator"}, - (struct game_entry){.code = "ABG", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Sweet Cookie Pie"}, - (struct game_entry){.code = "AVS", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Sword of Mana"}, - (struct game_entry){.code = "BSF", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Sylvania Family - Fashion Designer ni Naritai"}, - (struct game_entry){.code = "A4L", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Sylvania Family 4 - Meguru Kisetsu no Tapestry"}, - (struct game_entry){.code = "BS5", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Sylvanian Family - Yousei no Stick to Fushigi no Ki"}, - (struct game_entry){.code = "ATO", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Tactics Ogre - The Knight of Lodis"}, - (struct game_entry){.code = "BU6", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Taiketsu! Ultra Hero"}, - (struct game_entry){.code = "BJW", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Tak - The Great Juju Challenge"}, - (struct game_entry){.code = "BT9", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Tak 2 - The Staff of Dreams"}, - (struct game_entry){.code = "BJU", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Tak and the Power of Juju"}, - (struct game_entry){.code = "AN8", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Tales of Phantasia"}, - (struct game_entry){.code = "AN9", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Tales of the World - Narikiri Dungeon 2"}, - (struct game_entry){.code = "B3T", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Tales of the World - Narikiri Dungeon 3"}, - (struct game_entry){.code = "A9P", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Tales of the World - Summoner's Lineage"}, - (struct game_entry){.code = "AYM", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Tanbi Musou - Meine Liebe"}, - (struct game_entry){.code = "ATA", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Tang Tang"}, - (struct game_entry){.code = "BTI", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Tantei Gakuen Q - Kyukyoku Trick ni Idome!"}, - (struct game_entry){.code = "BTQ", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Tantei Gakuen Q - Meitantei ha Kimi da!"}, - (struct game_entry){.code = "BT3", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Tantei Jinguuji Saburou Shiroi Kage no Syoujyo"}, - (struct game_entry){.code = "AJG", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Tarzan - Return to the Jungle"}, - (struct game_entry){.code = "AXQ", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Taxi 3"}, - (struct game_entry){.code = "BBL", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Teen Titans"}, - (struct game_entry){.code = "BZU", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Teen Titans 2"}, - (struct game_entry){.code = "BNT", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Teenage Mutant Ninja Turtles"}, - (struct game_entry){.code = "BT2", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Teenage Mutant Ninja Turtles 2 - Battlenexus"}, - (struct game_entry){.code = "BT8", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Teenage Mutant Ninja Turtles Double Pack"}, - (struct game_entry){.code = "ATK", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Tekken Advance"}, - (struct game_entry){.code = "BTP", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Ten Pin Alley 2"}, - (struct game_entry){.code = "AT8", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Tennis Masters Series 2003"}, - (struct game_entry){.code = "AVA", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Tennis no Ouji-sama - Aim at the Victory!"}, - (struct game_entry){.code = "ATI", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Tennis no Ouji-sama - Genius Boys Academy"}, - (struct game_entry){.code = "A9L", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Tennis no Ouji-sama 2003 - Cool Blue"}, - (struct game_entry){.code = "A8R", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Tennis no Ouji-sama 2003 - Passion Red"}, - (struct game_entry){.code = "B4G", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Tennis no Ouji-sama 2004 - Glorious Gold"}, - (struct game_entry){.code = "B4S", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Tennis no Ouji-sama 2004 - Stylish Silver"}, - (struct game_entry){.code = "AO3", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Terminator 3 - Rise of the Machines"}, - (struct game_entry){.code = "BTT", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Tetris Advance"}, - (struct game_entry){.code = "ATW", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Tetris Worlds"}, - (struct game_entry){.code = "BXA", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Texas Hold 'Em Poker"}, - (struct game_entry){.code = "BRV", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "That's So Raven"}, - (struct game_entry){.code = "BZS", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Thats So Raven 2 - Supernatural Style"}, - (struct game_entry){.code = "BJN", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "The Adventures of Jimmy Neutron - Boy Genius - Jet Fusion"}, - (struct game_entry){.code = "AJX", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "The Adventures of Jimmy Neutron vs Jimmy Negatron"}, - (struct game_entry){.code = "A7M", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "The Amazing Virtual Sea Monkeys"}, - (struct game_entry){.code = "BUY", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "The Ant Bully"}, - (struct game_entry){.code = "BBI", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "The Barbie Diaries - High School Mystery"}, - (struct game_entry){.code = "BKF", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "The Bee Game"}, - (struct game_entry){.code = "BBO", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "The Berenstain Bears - And the Spooky Old Tree"}, - (struct game_entry){.code = "BCT", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "The Cat in the Hat by Dr. Seuss"}, - (struct game_entry){.code = "BCQ", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "The Cheetah Girls"}, - (struct game_entry){.code = "B2W", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "The Chronicles of Narnia - The Lion, the Witch and the Wardrobe"}, - (struct game_entry){.code = "AF6", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "The Fairly Odd Parents! - Breakin' da Rules"}, - (struct game_entry){.code = "BFO", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "The Fairly Odd Parents! - Clash with the Anti-World"}, - (struct game_entry){.code = "AFV", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "The Fairly Odd Parents! - Enter the Cleft"}, - (struct game_entry){.code = "BF2", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "The Fairly Odd Parents! - Shadow Showdown"}, - (struct game_entry){.code = "AFS", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "The Flintstones - Big Trouble in Bedrock"}, - (struct game_entry){.code = "BIE", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "The Grim - Adventures of Billy and Mandy"}, - (struct game_entry){.code = "ALI", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "The Haunted Mansion"}, - (struct game_entry){.code = "AH9", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "The Hobbit"}, - (struct game_entry){.code = "AHL", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "The Incredible Hulk"}, - (struct game_entry){.code = "BIC", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "The Incredibles"}, - (struct game_entry){.code = "BIQ", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "The Incredibles - Rise of the Underminer"}, - (struct game_entry){.code = "AIO", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "The Invincible Iron Man"}, - (struct game_entry){.code = "AJF", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "The Jungle Book"}, - (struct game_entry){.code = "AKO", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "The King of Fighters EX - Neo Blood"}, - (struct game_entry){.code = "AEX", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "The King of Fighters EX2 - Howling Blood"}, - (struct game_entry){.code = "BAK", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "The Koala Brothers - Outback Adventures"}, - (struct game_entry){.code = "ALA", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "The Land Before Time"}, - (struct game_entry){.code = "BLO", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "The Land Before Time - Into the Mysterious Beyond"}, - (struct game_entry){.code = "B3Y", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "The Legend of Spyro - A New Beginning"}, - (struct game_entry){.code = "BU7", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "The Legend of Spyro - The Eternal Night"}, - (struct game_entry){.code = "AZL", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "The Legend of Zelda - A Link to the Past & Four Swords"}, - (struct game_entry){.code = "BZM", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "The Legend of Zelda - The Minish Cap"}, - (struct game_entry){.code = "BLK", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "The Lion King 1.5"}, - (struct game_entry){.code = "BN9", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "The Little Mermaid - Magic in Two Kingdoms"}, - (struct game_entry){.code = "ALO", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "The Lord of the Rings - The Fellowship of the Ring"}, - (struct game_entry){.code = "BLR", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "The Lord of the Rings - The Return of the King"}, - (struct game_entry){.code = "B3A", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "The Lord of the Rings - The Third Age"}, - (struct game_entry){.code = "ALP", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "The Lord of the Rings - The Two Towers"}, - (struct game_entry){.code = "ALV", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "The Lost Vikings"}, - (struct game_entry){.code = "AUM", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "The Mummy"}, - (struct game_entry){.code = "AZM", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "The Muppets - On With the Show!"}, - (struct game_entry){.code = "APD", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "The Pinball of the Dead"}, - (struct game_entry){.code = "AZO", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "The Pinball of the Dead"}, - (struct game_entry){.code = "BPX", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "The Polar Express"}, - (struct game_entry){.code = "AP5", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "The Powerpuff Girls - Him and Seek"}, - (struct game_entry){.code = "APT", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "The Powerpuff Girls - Mojo Jojo A-Go-Go"}, - (struct game_entry){.code = "BD7", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "The Proud Family"}, - (struct game_entry){.code = "A3R", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "The Revenge of Shinobi"}, - (struct game_entry){.code = "ARD", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "The Ripping Friends"}, - (struct game_entry){.code = "B33", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "The Santa Clause 3 - The Escape Clause"}, - (struct game_entry){.code = "ASZ", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "The Scorpion King - Sword of Osiris"}, - (struct game_entry){.code = "A4A", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "The Simpsons - Road Rage"}, - (struct game_entry){.code = "B4P", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "The Sims"}, - (struct game_entry){.code = "ASI", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "The Sims - Bustin' Out"}, - (struct game_entry){.code = "B46", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "The Sims 2"}, - (struct game_entry){.code = "B4O", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "The Sims 2 - Pets"}, - (struct game_entry){.code = "A7S", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "The Smurfs - The Revenge of the Smurfs"}, - (struct game_entry){.code = "BSN", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "The SpongeBob SquarePants Movie"}, - (struct game_entry){.code = "BZC", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "The Suite Life of Zack & Cody - Tipton Trouble"}, - (struct game_entry){.code = "AA6", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "The Sum of All Fears"}, - (struct game_entry){.code = "A3T", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "The Three Stooges"}, - (struct game_entry){.code = "BTR", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "The Tower SP"}, - (struct game_entry){.code = "BOC", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "The Urbz - Sims in the City"}, - (struct game_entry){.code = "BWL", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "The Wild"}, - (struct game_entry){.code = "AWT", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "The Wild Thornberrys - Chimp Chase"}, - (struct game_entry){.code = "AWL", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "The Wild Thornberrys Movie"}, - (struct game_entry){.code = "BTH", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Thunder Alley"}, - (struct game_entry){.code = "BTB", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Thunderbirds"}, - (struct game_entry){.code = "ATN", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Thunderbirds - International Rescue"}, - (struct game_entry){.code = "BTW", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Tiger Woods PGA Tour 2004"}, - (struct game_entry){.code = "AT5", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Tiger Woods PGA Tour Golf"}, - (struct game_entry){.code = "BNC", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Tim Burton's The Nightmare Before Christmas - The Pumpkin King"}, - (struct game_entry){.code = "ATT", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Tiny Toon Adventures - Scary Dreams"}, - (struct game_entry){.code = "AWS", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Tiny Toon Adventures - Wacky Stackers"}, - (struct game_entry){.code = "ATV", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Tir et But - Edition Champions du Monde"}, - (struct game_entry){.code = "BTC", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Titeuf - Mega-Compet"}, - (struct game_entry){.code = "BEX", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "TMNT"}, - (struct game_entry){.code = "ATQ", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "TOCA World Touring Cars"}, - (struct game_entry){.code = "AF7", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Tokimeki Yume Series 1 - Ohanaya-san ni Narou!"}, - (struct game_entry){.code = "BTF", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Tokyo Majin Gakuen - Fuju Houroku"}, - (struct game_entry){.code = "BTZ", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Tokyo Xtreme Racer Advance"}, - (struct game_entry){.code = "ATJ", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Tom and Jerry - The Magic Ring"}, - (struct game_entry){.code = "AIF", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Tom and Jerry in Infurnal Escape"}, - (struct game_entry){.code = "BJT", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Tom and Jerry Tales"}, - (struct game_entry){.code = "AR6", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Tom Clancy's Rainbow Six - Rogue Spear"}, - (struct game_entry){.code = "AO4", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Tom Clancy's Splinter Cell"}, - (struct game_entry){.code = "BSL", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Tom Clancy's Splinter Cell - Pandora Tomorrow"}, - (struct game_entry){.code = "AGL", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Tomato Adventure"}, - (struct game_entry){.code = "BL8", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Tomb Raider - Legend"}, - (struct game_entry){.code = "AL9", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Tomb Raider - The Prophecy"}, - (struct game_entry){.code = "AUT", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Tomb Raider - The Prophecy"}, - (struct game_entry){.code = "OPL", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Tomb Raider (OpenLara)"}, - (struct game_entry){.code = "BT7", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Tonka - On the Job"}, - (struct game_entry){.code = "BH9", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Tony Hawk's American Sk8land"}, - (struct game_entry){.code = "BXS", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Tony Hawk's Downhill Jam"}, - (struct game_entry){.code = "ATH", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Tony Hawk's Pro Skater 2"}, - (struct game_entry){.code = "AT3", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Tony Hawk's Pro Skater 3"}, - (struct game_entry){.code = "AT6", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Tony Hawk's Pro Skater 4"}, - (struct game_entry){.code = "BTO", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Tony Hawk's Underground"}, - (struct game_entry){.code = "B2T", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Tony Hawk's Underground 2"}, - (struct game_entry){.code = "AT7", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Tootuff - The Gagmachine"}, - (struct game_entry){.code = "A2Y", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Top Gun - Combat Zones"}, - (struct game_entry){.code = "ATG", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Top Gun - Firestorm Advance"}, - (struct game_entry){.code = "B27", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Top Spin 2"}, - (struct game_entry){.code = "ATC", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "TopGear GT Championship"}, - (struct game_entry){.code = "BTG", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "TopGear Rally"}, - (struct game_entry){.code = "AYE", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "TopGear Rally"}, - (struct game_entry){.code = "BTU", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Totally Spies"}, - (struct game_entry){.code = "B2L", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Totally Spies 2 - Undercover"}, - (struct game_entry){.code = "A59", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Toukon Heat"}, - (struct game_entry){.code = "ATR", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Toyrobo Force"}, - (struct game_entry){.code = "AZQ", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Treasure Planet"}, - (struct game_entry){.code = "B9S", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Trick Star"}, - (struct game_entry){.code = "BTJ", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Tringo"}, - (struct game_entry){.code = "BT6", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Trollz - Hair Affair!"}, - (struct game_entry){.code = "BTN", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Tron 2.0 - Killer App"}, - (struct game_entry){.code = "AK3", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Turbo Turtle Adventure"}, - (struct game_entry){.code = "AT4", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Turok Evolution"}, - (struct game_entry){.code = "ATM", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Tweety and the Magic Gems"}, - (struct game_entry){.code = "AMJ", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Tweety no Hearty Party"}, - (struct game_entry){.code = "BFV", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Twin Series 1 - Fashion Designer Monogatari + Kawaii Pet Game Gallery 2"}, - (struct game_entry){.code = "BOP", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Twin Series 2 - Oshare Princess 4 + Renai Uranai Daisakusen"}, - (struct game_entry){.code = "BQM", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Twin Series 3 - Konchuu Monster + Suchai Labyrinth"}, - (struct game_entry){.code = "BHF", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Twin Series 4 - Ham Ham Monster EX + Fantasy Puzzle Hamster Monogatari"}, - (struct game_entry){.code = "BMW", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Twin Series 5 - Wan Wan Meitantei EX + Mahou no Kuni no Keaki-Okusan Monogatari"}, - (struct game_entry){.code = "BWN", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Twin Series 6 - Wan Nyon Idol Gakuen + Koinu Toissho Special"}, - (struct game_entry){.code = "B2P", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Twin Series 7 - Twin Puzzle - Kisekae Wanko Ex + Puzzle Rainbow Magic 2"}, - (struct game_entry){.code = "BTY", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Ty the Tasmanian Tiger 2 - Bush Rescue"}, - (struct game_entry){.code = "BTV", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Ty the Tasmanian Tiger 3 - Night of the Quinkan"}, - (struct game_entry){.code = "BUV", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Uchu no Stellvia"}, - (struct game_entry){.code = "AUC", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Uchuu Daisakusen Choco Vader - Uchuu Kara no Shinryakusha"}, - (struct game_entry){.code = "BUH", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Ueki no Housoku Shinki Sakuretsu! Nouryokumono Battle"}, - (struct game_entry){.code = "AEW", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Ui-Ire - World Soccer Winning Eleven"}, - (struct game_entry){.code = "BUZ", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Ultimate Arcade Games"}, - (struct game_entry){.code = "AVE", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Ultimate Beach Soccer"}, - (struct game_entry){.code = "ABU", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Ultimate Brain Games"}, - (struct game_entry){.code = "BUC", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Ultimate Card Games"}, - (struct game_entry){.code = "AK2", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Ultimate Muscle - The Kinnikuman Legacy - The Path of the Superhero"}, - (struct game_entry){.code = "BUA", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Ultimate Puzzle Games"}, - (struct game_entry){.code = "BUL", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Ultimate Spider-Man"}, - (struct game_entry){.code = "BUW", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Ultimate Winter Games"}, - (struct game_entry){.code = "BUT", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Ultra Keibitai - Monster Attack"}, - (struct game_entry){.code = "BU4", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Unfabulous"}, - (struct game_entry){.code = "BU5", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Uno 52"}, - (struct game_entry){.code = "BUI", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Uno Freefall"}, - (struct game_entry){.code = "AYI", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Urban Yeti!"}, - (struct game_entry){.code = "AVP", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "V.I.P."}, - (struct game_entry){.code = "BAN", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Van Helsing"}, - (struct game_entry){.code = "BRX", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Vattroller X"}, - (struct game_entry){.code = "BZT", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "VeggieTales - LarryBoy and the Bad Apple"}, - (struct game_entry){.code = "AVT", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Virtua Tennis"}, - (struct game_entry){.code = "AVK", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Virtual Kasparov"}, - (struct game_entry){.code = "AVM", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "V-Master Cross"}, - (struct game_entry){.code = "AVR", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "V-Rally 3"}, - (struct game_entry){.code = "BWT", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "W.i.t.c.h."}, - (struct game_entry){.code = "BSR", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Wade Hixton's Counter Punch"}, - (struct game_entry){.code = "BMI", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Wagamama - Fairy Milmo de Pon! DokiDoki Memorial"}, - (struct game_entry){.code = "BWP", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Wagamama Fairy Mirumo de Pon Nazo no Kagi to Shinjitsu no Tobir"}, - (struct game_entry){.code = "BMY", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Wagamama Fairy Mirumo de Pon! - 8 Nin no Toki no Yousei"}, - (struct game_entry){.code = "AWK", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Wagamama Fairy Mirumo de Pon! - Ougon Maracas no Densetsu"}, - (struct game_entry){.code = "BMP", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Wagamama Fairy Mirumo de Pon! - Taisen Mahoudama"}, - (struct game_entry){.code = "BWF", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Wagamama Fairy Mirumo de Pon! Yume no Kakera"}, - (struct game_entry){.code = "AWD", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Wakeboarding Unleashed featuring Shaun Murray"}, - (struct game_entry){.code = "BWD", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Wan Nyan Doubutsu Byouin"}, - (struct game_entry){.code = "BWK", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Wanko Dekururi! Wankuru"}, - (struct game_entry){.code = "BWX", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Wanko Mix Chiwanko World"}, - (struct game_entry){.code = "BWM", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "WanWan Meitantei"}, - (struct game_entry){.code = "AWA", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Wario Land 4"}, - (struct game_entry){.code = "RZW", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "WarioWare Twisted!"}, - (struct game_entry){.code = "AZW", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "WarioWare, Inc. - Mega Microgames!"}, - (struct game_entry){.code = "AW3", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Watashi no Makesalon"}, - (struct game_entry){.code = "BWE", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Whac-A-Mole"}, - (struct game_entry){.code = "A73", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Whistle! - Dai 37 Kai Tokyo-to Chuugakkou Sougou Taiiku Soccer Taikai"}, - (struct game_entry){.code = "A55", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Who Wants to Be a Millionaire"}, - (struct game_entry){.code = "B55", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Who Wants to Be a Millionaire - 2nd Edition"}, - (struct game_entry){.code = "BWJ", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Who Wants to Be a Millionaire - Junior"}, - (struct game_entry){.code = "AW9", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Wing Commander - Prophecy"}, - (struct game_entry){.code = "AWQ", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Wings"}, - (struct game_entry){.code = "BWH", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Winnie the Pooh's Rumbly Tumbly Adventure"}, - (struct game_entry){.code = "BWZ", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Winnie the Pooh's Rumbly Tumbly Adventure + Rayman 3"}, - (struct game_entry){.code = "AWP", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Winning Post for GameBoy Advance"}, - (struct game_entry){.code = "BWY", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Winter Sports"}, - (struct game_entry){.code = "BWI", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "WinX Club"}, - (struct game_entry){.code = "BWV", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Winx Club - Quest For The Codex"}, - (struct game_entry){.code = "AWZ", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Wizardry Summoner"}, - (struct game_entry){.code = "AWO", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Wolfenstein 3D"}, - (struct game_entry){.code = "AWW", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Woody Woodpecker in Crazy Castle 5"}, - (struct game_entry){.code = "BB8", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Word Safari - The Friendship Totems"}, - (struct game_entry){.code = "AAS", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "World Advance Soccer - Shouri heno Michi"}, - (struct game_entry){.code = "BP9", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "World Championship Poker"}, - (struct game_entry){.code = "B26", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "World Poker Tour"}, - (struct game_entry){.code = "BWO", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "World Poker Tour"}, - (struct game_entry){.code = "BWR", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "World Reborn"}, - (struct game_entry){.code = "AWC", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "World Tennis Stars"}, - (struct game_entry){.code = "AWB", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Worms Blast"}, - (struct game_entry){.code = "AWY", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Worms World Party"}, - (struct game_entry){.code = "ATE", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "WTA Tour Tennis"}, - (struct game_entry){.code = "ACI", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "WTA Tour Tennis Pocket"}, - (struct game_entry){.code = "AW8", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "WWE - Road to WrestleMania X8"}, - (struct game_entry){.code = "BWW", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "WWE Survivor Series"}, - (struct game_entry){.code = "AWF", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "WWF - Road to WrestleMania"}, - (struct game_entry){.code = "AWV", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "X2 - Wolverine's Revenge"}, - (struct game_entry){.code = "AXI", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "X-bladez - Inline Skater"}, - (struct game_entry){.code = "AXM", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "X-Men - Reign of Apocalypse"}, - (struct game_entry){.code = "B3X", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "X-Men - The Official Game"}, - (struct game_entry){.code = "BXM", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "XS Moto"}, - (struct game_entry){.code = "AX3", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "xXx"}, - (struct game_entry){.code = "B64", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Yars' Revenge - Pong - Asteroids"}, - (struct game_entry){.code = "BYU", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Yggdra Union - We'll Never Fight Alone"}, - (struct game_entry){.code = "BYV", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Yo-Gi-Oh! Double Pack 2 - Destiny Board Traveler + Dungeon Dice Monsters"}, - (struct game_entry){.code = "KYG", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Yoshi Topsy-Turvy"}, - (struct game_entry){.code = "A3A", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Yoshi's Island - Super Mario Advance 3"}, - (struct game_entry){.code = "AFU", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Youkaidou"}, - (struct game_entry){.code = "BYY", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Yu Yu Hakusho - Spirit Detective"}, - (struct game_entry){.code = "BYD", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Yu-Gi-Oh! - Destiny Board Traveler"}, - (struct game_entry){.code = "AY8", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Yu-Gi-Oh! - Reshef of Destruction"}, - (struct game_entry){.code = "BY7", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Yu-Gi-Oh! 7 Trials to Glory - World Championship Tournament 2005"}, - (struct game_entry){.code = "BYO", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Yu-Gi-Oh! Day Of The Duelist - World Championship Tournament 2005"}, - (struct game_entry){.code = "BY2", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Yu-Gi-Oh! Double Pack"}, - (struct game_entry){.code = "AY6", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Yu-Gi-Oh! Duel Monsters 6 Expert 2"}, - (struct game_entry){.code = "BY3", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Yu-Gi-Oh! Duel Monsters Expert 3"}, - (struct game_entry){.code = "BYI", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Yu-Gi-Oh! Duel Monsters International 2"}, - (struct game_entry){.code = "AYD", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Yu-Gi-Oh! Dungeon Dice Monsters"}, - (struct game_entry){.code = "BYG", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Yu-Gi-Oh! GX - Duel Academy"}, - (struct game_entry){.code = "BYS", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Yu-Gi-Oh! Sugoroku no Sugoroku"}, - (struct game_entry){.code = "AY5", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Yu-Gi-Oh! The Eternal Duelist Soul"}, - (struct game_entry){.code = "AY7", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Yu-Gi-Oh! The Sacred Cards"}, - (struct game_entry){.code = "BY6", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Yu-Gi-Oh! Ultimate Masters 2006"}, - (struct game_entry){.code = "BYW", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Yu-Gi-Oh! World Championship Tournament 2004"}, - (struct game_entry){.code = "AYW", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Yu-Gi-Oh! Worldwide Edition - Stairway to the Destined Duel"}, - (struct game_entry){.code = "A4V", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Yuujou no Victory Goal 4v4 Arashi - Get the Goal!!"}, - (struct game_entry){.code = "AUY", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Yuureiyashiki no Nijuuyojikan"}, - (struct game_entry){.code = "BRG", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Yu-Yu-Hakusho - Tournament Tactics"}, - (struct game_entry){.code = "AZP", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "Zapper"}, - (struct game_entry){.code = "A4G", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "ZatchBell! - Electric Arena"}, - (struct game_entry){.code = "AGT", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Zen-Nippon GT Senshuken"}, - (struct game_entry){.code = "A2Z", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Zen-Nippon Shounen Soccer Taikai 2 - Mezase Nippon-ichi!"}, - (struct game_entry){.code = "AF3", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Zero One"}, - (struct game_entry){.code = "BZO", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Zero One SP"}, - (struct game_entry){.code = "AZT", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Zero-Tours"}, - (struct game_entry){.code = "BJ3", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Zettai Zetsumei - Dangerous Jiisan 3 Hateshinaki Mamonogatari"}, - (struct game_entry){.code = "BZD", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Zettai Zetsumei Dangerous Jiisan - Shijou Saikyou no Togeza"}, - (struct game_entry){.code = "BZG", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Zettai Zetsumei Dangerous Jiisan - Zettai Okujou Bai Orensu Kouchou"}, - (struct game_entry){.code = "BZ2", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Zettai Zetsumei Den Chara Suji-Sa"}, - (struct game_entry){.code = "AZD", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Zidane Football Generation"}, - (struct game_entry){.code = "BZY", .storage = BACKUP_NONE, .flags = FLAGS_NONE, .title = "Zoey 101"}, - (struct game_entry){.code = "AZ2", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Zoids - Legacy"}, - (struct game_entry){.code = "ATZ", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Zoids Saga"}, - (struct game_entry){.code = "BZF", .storage = BACKUP_SRAM, .flags = FLAGS_NONE, .title = "Zoids Saga - Fuzors"}, - (struct game_entry){.code = "AZE", .storage = BACKUP_FLASH64, .flags = FLAGS_NONE, .title = "Zone of the Enders - The Fist of Mars"}, - (struct game_entry){.code = "ANC", .storage = BACKUP_EEPROM_4K, .flags = FLAGS_NONE, .title = "ZooCube"}, - (struct game_entry){.code = "BMZ", .storage = BACKUP_EEPROM_64K,.flags = FLAGS_NONE, .title = "Zooo"}, + (struct game_entry){.code = "BJB", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "007 - Everything or Nothing"}, + (struct game_entry){.code = "BFB", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "2 Disney Games - Disney Sports Skateboarding + Football"}, + (struct game_entry){.code = "BLQ", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "2 Disney Games - Lilo & Stitch 2 + Peter Pan"}, + (struct game_entry){.code = "BQJ", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "2 Game Pack - Hot Wheels Stunt Track + World Race"}, + (struct game_entry){.code = "BB4", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "2 Game Pack! - Matchbox Missions"}, + (struct game_entry){.code = "BUQ", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "2 Game Pack! Uno + Skip-Bo"}, + (struct game_entry){.code = "BX6", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "2 Games in 1 - Battle for Bikini Bottom + Breakin' Da Rules"}, + (struct game_entry){.code = "BU2", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "2 Games in 1 - Battle for Bikini Bottom + Nicktoons Freeze Frame Frenzy"}, + (struct game_entry){.code = "BL5", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "2 Games in 1 - Bionicle + Knights' Kingdom"}, + (struct game_entry){.code = "BWB", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "2 Games in 1 - Brother Bear + Disney Princess"}, + (struct game_entry){.code = "BLB", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "2 Games in 1 - Brother Bear + The Lion King"}, + (struct game_entry){.code = "BW2", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "2 Games in 1 - Cartoon Network - Block Party + Speedway"}, + (struct game_entry){.code = "BW9", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "2 Games in 1 - Columns Crown + ChuChu Rocket!"}, + (struct game_entry){.code = "BLP", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "2 Games in 1 - Disney Princess + The Lion King"}, + (struct game_entry){.code = "B2E", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "2 Games in 1 - Dora the Explorer - Pirate Pig's Treasure + Super Star Adventures"}, + (struct game_entry){.code = "BZP", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "2 Games in 1 - Dr. Mario + Puzzle League"}, + (struct game_entry){.code = "BUF", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "2 Games in 1 - Dragon Ball Z - Buu's Fury + Dragon Ball GT - Transformation"}, + (struct game_entry){.code = "BFW", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "2 Games in 1 - Finding Nemo + Finding Nemo - The Continuing Adventures"}, + (struct game_entry){.code = "BDZ", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "2 Games in 1 - Finding Nemo + Monsters, Inc."}, + (struct game_entry){.code = "BIN", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "2 Games in 1 - Finding Nemo + The Incredibles"}, + (struct game_entry){.code = "BWC", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "2 Games in 1 - Golden Nugget Casino - Texas Hold'em Poker"}, + (struct game_entry){.code = "BHZ", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "2 Games in 1 - Hot Wheels - World Race + Velocity X"}, + (struct game_entry){.code = "BLD", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "2 Games in 1 - Lizzie McGuire - Disney Princess"}, + (struct game_entry){.code = "BAR", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "2 Games in 1 - Moto GP - GT 3 Advance"}, + (struct game_entry){.code = "BRZ", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "2 Games in 1 - Power Rangers Time Force + Ninja Storm"}, + (struct game_entry){.code = "BWQ", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "2 Games in 1 - Quad Desert Fury + Monster Trucks"}, + (struct game_entry){.code = "BPU", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "2 Games in 1 - Scooby-Doo + Scooby-Doo 2"}, + (struct game_entry){.code = "BCV", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "2 Games in 1 - Scooby-Doo and the Cyber Chase + Mystery Mayhem"}, + (struct game_entry){.code = "BW3", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "2 Games in 1 - Sonic Advance + Chu Chu Rocket"}, + (struct game_entry){.code = "BW7", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "2 Games in 1 - Sonic Battle + ChuChu Rocket!"}, + (struct game_entry){.code = "BW4", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "2 Games in 1 - Sonic Battle + Sonic Advance"}, + (struct game_entry){.code = "BW8", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "2 Games in 1 - Sonic Pinball + Columns Crown"}, + (struct game_entry){.code = "BW6", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "2 Games in 1 - Sonic Pinball Party + Sonic Battle"}, + (struct game_entry){.code = "BSZ", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "2 Games in 1 - SpongeBob SquarePants - Supersponge + Battle for Bikini Bottom"}, + (struct game_entry){.code = "BDF", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "2 Games in 1 - SpongeBob SquarePants - Supersponge + Revenge of the Flying Dutchman"}, + (struct game_entry){.code = "BRS", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "2 Games in 1 - SpongeBob SquarePants - Supersponge + Rugrats - Go Wild"}, + (struct game_entry){.code = "BBJ", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "2 Games in 1 - SpongeBob SquarePants + Jimmy Neutron"}, + (struct game_entry){.code = "BNE", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "2 Games in 1 - The Incredibles + Finding Nemo - The Continuing Adventure"}, + (struct game_entry){.code = "B2B", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "2 Games in 1 - The SpongeBob SquarePants Movie + Freeze Frame Frenzy"}, + (struct game_entry){.code = "B2A", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "2 in 1 - Asterix & Obelix - PAF! Them All! + XXL"}, + (struct game_entry){.code = "BLF", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "2 in 1 - Dragon Ball Z 1 and 2"}, + (struct game_entry){.code = "B94", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "2 in 1 - Pferd & Pony - Mein Pferdehof + Lass Uns Reiten 2"}, + (struct game_entry){.code = "BX2", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "2 in 1 - Spider-Man Mysterio's Menace & X2 Wolverine's Revenge"}, + (struct game_entry){.code = "BX4", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "2 in 1 - Tony Hawk's Underground + Kelly Slater's Pro Surfer"}, + (struct game_entry){.code = "BCS", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "2 in 1 - V-Rally 3 - Stuntman"}, + (struct game_entry){.code = "BXH", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "2 in 1 Fun Pack - Madagascar - Operation Penguin + Shrek 2"}, + (struct game_entry){.code = "BXG", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "2 in 1 Fun Pack -Madagascar + Shrek 2"}, + (struct game_entry){.code = "BS7", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "2 in 1 Game Pack - Shark Tale + Shrek 2"}, + (struct game_entry){.code = "BX3", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "2 in 1 GamePack - Spider-Man + Spider-Man 2"}, + (struct game_entry){.code = "BT5", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "2 Jeux en 1 - Titeuf - Ze Gag Machine + Mega Compet"}, + (struct game_entry){.code = "BC4", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "3 Game Pack - Candy Land + Chutes and Ladders + Memory"}, + (struct game_entry){.code = "B3O", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "3 Game Pack - Mouse Trap + Simon + Operation"}, + (struct game_entry){.code = "B3U", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "3 Game Pack - The Game of Life + Yahtzee + Payday"}, + (struct game_entry){.code = "BXC", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "3 Game Pack! - Ker Plunk! + Toss Across + Tip It"}, + (struct game_entry){.code = "B44", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "3 Games in 1 - Rugrats, SpongeBob, Tak"}, + (struct game_entry){.code = "BRQ", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "3 Games in One - Majesco's Rec Room Challenge"}, + (struct game_entry){.code = "B3N", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "3 Games in One - Majesco's Sports Pack"}, + (struct game_entry){.code = "BI4", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "4 Games on One Game Pak - GT Advance - GT Advance 2 - GT Advance 3 - Moto GP"}, + (struct game_entry){.code = "BI7", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "4 Games on One Game Pak - Nickelodeon"}, + (struct game_entry){.code = "BI6", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "4 Games on One Game Pak (Nickelodeon Movies)"}, + (struct game_entry){.code = "A3Q", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "A Sound of Thunder"}, + (struct game_entry){.code = "BAE", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Ace Combat Advance"}, + (struct game_entry){.code = "ALX", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Ace Lightning"}, + (struct game_entry){.code = "BAC", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Action Man - Robot Atak"}, + (struct game_entry){.code = "BAV", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Activision Anthology"}, + (struct game_entry){.code = "AG7", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Advance GTA"}, + (struct game_entry){.code = "BGC", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Advance Guardian Heroes"}, + (struct game_entry){.code = "BAG", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Advance Guardian Heroes"}, + (struct game_entry){.code = "AR7", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Advance Rally"}, + (struct game_entry){.code = "AWR", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Advance Wars"}, + (struct game_entry){.code = "AW2", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Advance Wars 2 - Black Hole Rising"}, + (struct game_entry){.code = "ADE", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Adventure of Tokyo Disney Sea"}, + (struct game_entry){.code = "AAO", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Aero the Acro-Bat - Rascal Rival Revenge"}, + (struct game_entry){.code = "ACE", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Agassi Tennis Generation"}, + (struct game_entry){.code = "TCH", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "AGB Aging Cartridge"}, + (struct game_entry){.code = "BHQ", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Agent Hugo - Roborumble"}, + (struct game_entry){.code = "AIL", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Aggressive Inline"}, + (struct game_entry){.code = "AAK", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Air Force Delta Storm"}, + (struct game_entry){.code = "BAZ", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Akachan Doubutsu Sono"}, + (struct game_entry){.code = "BZW", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Akagi"}, + (struct game_entry){.code = "BAD", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Aladdin"}, + (struct game_entry){.code = "AJ6", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Aladdin"}, + (struct game_entry){.code = "BAB", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Aleck Bordon Adventure - Tower & Shaft Advance"}, + (struct game_entry){.code = "ATF", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Alex Ferguson's Player Manager 2002"}, + (struct game_entry){.code = "BAW", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Alex Rider - Stormbreaker"}, + (struct game_entry){.code = "BAH", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Alien Hominid"}, + (struct game_entry){.code = "AEV", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Alienators - Evolution Continues"}, + (struct game_entry){.code = "BAL", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "All Grown Up - Express Yourself"}, + (struct game_entry){.code = "AA3", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "All-Star Baseball 2003"}, + (struct game_entry){.code = "AA7", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "All-Star Baseball 2004"}, + (struct game_entry){.code = "AAR", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Altered Beast - Guardian of the Realms"}, + (struct game_entry){.code = "AAB", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "American Bass Challenge"}, + (struct game_entry){.code = "BAP", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "American Dragon - Jake Long"}, + (struct game_entry){.code = "BID", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "American Idol"}, + (struct game_entry){.code = "AFG", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "An American Tail - Fievel's Gold Rush"}, + (struct game_entry){.code = "AFN", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Angel Collection - Mezase! Gakuen no Fashion Leader"}, + (struct game_entry){.code = "BEC", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Angel Collection 2 - Pichimo ni Narou"}, + (struct game_entry){.code = "AAG", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Angelique"}, + (struct game_entry){.code = "AAN", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Animal Mania - DokiDoki Aishou Check"}, + (struct game_entry){.code = "AAQ", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Animal Snap - Rescue Them 2 By 2"}, + (struct game_entry){.code = "BAY", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Animal Yokochou - Doki Doki Kyushutsu Daisakusen No Maki"}, + (struct game_entry){.code = "BAX", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Animal Yokochou - Doki Doki Shinkyuu Shiken! no Kan"}, + (struct game_entry){.code = "ANI", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Animaniacs - Lights, Camera, Action!"}, + (struct game_entry){.code = "ANU", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Antz - Extreme Racing"}, + (struct game_entry){.code = "ANZ", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Antz - Extreme Racing"}, + (struct game_entry){.code = "AAZ", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Ao-Zoura to Nakamatachi - Yume no Bouken"}, + (struct game_entry){.code = "BPL", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Archer Maclean's 3D Pool"}, + (struct game_entry){.code = "AZN", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Archer Maclean's Super Dropzone"}, + (struct game_entry){.code = "BB5", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Arctic Tale"}, + (struct game_entry){.code = "AME", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Army Men - Operation Green"}, + (struct game_entry){.code = "AY3", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Army Men - Turf Wars"}, + (struct game_entry){.code = "ASA", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Army Men Advance"}, + (struct game_entry){.code = "B8D", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Around the World in 80 Days"}, + (struct game_entry){.code = "B2N", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Arthur and the Invisibles"}, + (struct game_entry){.code = "BAM", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Ashita no Joe - Makka ni Moeagare!"}, + (struct game_entry){.code = "AOB", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Asterix & Obelix - Bash Them All!"}, + (struct game_entry){.code = "BLX", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Asterix & Obelix - XXL"}, + (struct game_entry){.code = "BTA", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Astro Boy - Omega Factor"}, + (struct game_entry){.code = "AAV", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Atari Anniversary Advance"}, + (struct game_entry){.code = "ATL", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Atlantis - The Lost Empire"}, + (struct game_entry){.code = "BET", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Atomic Betty"}, + (struct game_entry){.code = "AQR", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "ATV Quad Power Racing"}, + (struct game_entry){.code = "B3B", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "ATV Thunder - Ridge Riders"}, + (struct game_entry){.code = "BQZ", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Avatar - The Last Airbender"}, + (struct game_entry){.code = "BBW", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Avatar - The Last Airbender - The Burning Earth"}, + (struct game_entry){.code = "AZA", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Azumanga Daiou Advance"}, + (struct game_entry){.code = "BBV", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Babar - To the Rescue"}, + (struct game_entry){.code = "BBC", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Back to Stone"}, + (struct game_entry){.code = "ABK", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "BackTrack"}, + (struct game_entry){.code = "ACK", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Backyard Baseball"}, + (struct game_entry){.code = "BCY", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Backyard Baseball 2006"}, + (struct game_entry){.code = "AYB", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Backyard Basketball"}, + (struct game_entry){.code = "AYF", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Backyard Football"}, + (struct game_entry){.code = "BYH", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Backyard Hockey"}, + (struct game_entry){.code = "BYF", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Backyard NFL Football 2006"}, + (struct game_entry){.code = "BS6", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Backyard Skateboarding"}, + (struct game_entry){.code = "BC7", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Backyard Sports - Baseball 2007"}, + (struct game_entry){.code = "BB7", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Backyard Sports - Basketball 2007"}, + (struct game_entry){.code = "BF7", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Backyard Sports - Football 2007"}, + (struct game_entry){.code = "AHE", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Bakuten Shoot Beyblade - Gekitou! Saikyou Blader"}, + (struct game_entry){.code = "AB8", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Bakuten Shoot Beyblade 2002 - Ikuze! Bakutou! Chou Jiryoku Battle!!"}, + (struct game_entry){.code = "A3E", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Bakuten Shoot Beyblade 2002 - Team Battle!! Daichi Hen"}, + (struct game_entry){.code = "A3W", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Bakuten Shoot Beyblade 2002 - Team Battle!! Takao Hen"}, + (struct game_entry){.code = "BGD", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Baldurs Gate - Dark Alliance"}, + (struct game_entry){.code = "AEE", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Ballistic - Ecks vs Sever"}, + (struct game_entry){.code = "BAJ", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Banjo Pilot"}, + (struct game_entry){.code = "BKZ", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Banjo-Kazooie - Grunty's Revenge"}, + (struct game_entry){.code = "BAU", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Barbie - The Princess and the Pauper"}, + (struct game_entry){.code = "BE5", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Barbie and the Magic of Pegasus"}, + (struct game_entry){.code = "BBN", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Barbie as the Island Princess"}, + (struct game_entry){.code = "AVB", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Barbie Groovy Games"}, + (struct game_entry){.code = "AI8", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Barbie Horse Adventures - Blue Ribbon Race"}, + (struct game_entry){.code = "BB3", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Barbie in the 12 Dancing Princesses"}, + (struct game_entry){.code = "BBE", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Barbie Superpack - Secret Agent + Groovy Games"}, + (struct game_entry){.code = "BBY", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Barnyard"}, + (struct game_entry){.code = "ABP", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Baseball Advance"}, + (struct game_entry){.code = "AZB", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Bass Tsuri Shiyouze!"}, + (struct game_entry){.code = "BBG", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Batman Begins"}, + (struct game_entry){.code = "BAT", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Batman Rise of Sin Tzu"}, + (struct game_entry){.code = "ABT", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Batman Vengeance"}, + (struct game_entry){.code = "BDX", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Battle B-Daman"}, + (struct game_entry){.code = "BBM", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Battle B-Daman - Fire Spirits"}, + (struct game_entry){.code = "BBF", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Battle x Battle - Kyoudai Ou Densetsu"}, + (struct game_entry){.code = "ABE", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "BattleBots - Beyond the BattleBox"}, + (struct game_entry){.code = "BBD", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "BattleBots - Design & Destroy"}, + (struct game_entry){.code = "A8L", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "BB Ball"}, + (struct game_entry){.code = "AH5", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Beast Shooter - Mezase Beast King!"}, + (struct game_entry){.code = "BHB", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Best Friends - Dogs & Cats"}, + (struct game_entry){.code = "A8Y", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Best Play Pro Yakyuu"}, + (struct game_entry){.code = "BB2", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Beyblade G-Revolution"}, + (struct game_entry){.code = "BEY", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Beyblade VForce - Ultimate Blader Jam"}, + (struct game_entry){.code = "BBX", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Bibi Blocksberg - Der Magische Hexenkreis"}, + (struct game_entry){.code = "BUX", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Bibi und Tina - Ferien auf dem Martinshof"}, + (struct game_entry){.code = "BIB", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Bible Game, The"}, + (struct game_entry){.code = "B63", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Big Mutha Truckers"}, + (struct game_entry){.code = "BIO", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Bionicle"}, + (struct game_entry){.code = "A5A", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Bionicle - Matoran Adventures"}, + (struct game_entry){.code = "BIL", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Bionicle - Maze of Shadows"}, + (struct game_entry){.code = "BIH", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Bionicle Heroes"}, + (struct game_entry){.code = "BVD", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "bit Generations - Boundish"}, + (struct game_entry){.code = "BVA", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "bit Generations - Coloris"}, + (struct game_entry){.code = "BVB", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "bit Generations - Dial Hex"}, + (struct game_entry){.code = "BVH", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "bit Generations - Digidrive"}, + (struct game_entry){.code = "BVC", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "bit Generations - Dotstream"}, + (struct game_entry){.code = "BVE", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "bit Generations - Orbital"}, + (struct game_entry){.code = "BVG", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "bit Generations - Soundvoyager"}, + (struct game_entry){.code = "AB6", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Black Belt Challenge"}, + (struct game_entry){.code = "AWE", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Black Black - Bura Bura"}, + (struct game_entry){.code = "AXB", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Black Matrix Zero"}, + (struct game_entry){.code = "AQX", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Blackthorne"}, + (struct game_entry){.code = "BBH", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Blades of Thunder"}, + (struct game_entry){.code = "BLE", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Bleach Advance"}, + (struct game_entry){.code = "ABR", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Blender Bros."}, + (struct game_entry){.code = "AT9", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "BMX Trick Racer"}, + (struct game_entry){.code = "B6E", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Board Games Classics"}, + (struct game_entry){.code = "BB9", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Boboboubo Boubobo - 9 Kiwame Senshi Gyagu Yuugou"}, + (struct game_entry){.code = "BOB", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Boboboubo Boubobo - Maji De!! Shinken Battle"}, + (struct game_entry){.code = "A8V", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Boboboubo Boubobo - Ougi 87.5 Bakuretsu Hanage Shinken"}, + (struct game_entry){.code = "BOS", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Boboboubo Boubobo Bakutou Hajike Taisen"}, + (struct game_entry){.code = "U3I", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Boktai - The Sun is in Your Hand"}, + (struct game_entry){.code = "U32", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Boktai 2 - Solar Boy Django"}, + (struct game_entry){.code = "ABC", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Boku ha Koukuu Kanseikan"}, + (struct game_entry){.code = "AJZ", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Bomberman Jetters"}, + (struct game_entry){.code = "BOM", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Bomberman Jetters - Game Collection"}, + (struct game_entry){.code = "AMH", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Bomberman Max 2 - Blue Advance"}, + (struct game_entry){.code = "AMY", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Bomberman Max 2 - Red Advance"}, + (struct game_entry){.code = "ABS", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Bomberman Tournament"}, + (struct game_entry){.code = "BKW", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Bookworm"}, + (struct game_entry){.code = "BPD", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Bouken Yuuki PlaStar World - Densetsu no PlaStar Gate EX"}, + (struct game_entry){.code = "APJ", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Bouken Yuuki Pluster World - Densetsu no PlustoGate"}, + (struct game_entry){.code = "A2P", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Bouken Yuuki Pluster World - Pluston GP"}, + (struct game_entry){.code = "BOV", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Bouken-Ou Beet - Busters Road"}, + (struct game_entry){.code = "BBS", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Boukyaku no Senritsu"}, + (struct game_entry){.code = "ABD", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Boulder Dash EX"}, + (struct game_entry){.code = "ABO", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Boxing Fever"}, + (struct game_entry){.code = "A2R", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Bratz"}, + (struct game_entry){.code = "BBZ", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Bratz - Babyz"}, + (struct game_entry){.code = "BXF", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Bratz - Forever Diamondz"}, + (struct game_entry){.code = "BRR", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Bratz - Rock Angelz"}, + (struct game_entry){.code = "BBU", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Bratz - The Movie"}, + (struct game_entry){.code = "B6Z", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Breakout + Centipede + Warlords"}, + (struct game_entry){.code = "ABF", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Breath of Fire"}, + (struct game_entry){.code = "AB2", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Breath of Fire II"}, + (struct game_entry){.code = "ABY", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Britney's Dance Beat"}, + (struct game_entry){.code = "ABJ", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Broken Sword - The Shadow of the Templars"}, + (struct game_entry){.code = "BBR", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Brother Bear"}, + (struct game_entry){.code = "ALE", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Bruce Lee - Return of the Legend"}, + (struct game_entry){.code = "AON", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Bubble Bobble - Old & New"}, + (struct game_entry){.code = "A2B", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Bubble Bobble - Old & New"}, + (struct game_entry){.code = "AVY", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Buffy - Im Bann der Daemonen"}, + (struct game_entry){.code = "ABW", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Butt-Ugly Martians - B.K.M. Battles"}, + (struct game_entry){.code = "AUQ", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Butt-Ugly Martians - B.K.M. Battles"}, + (struct game_entry){.code = "BCG", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Cabbage Patch Kids - The Patch Puppy Rescue"}, + (struct game_entry){.code = "A8H", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Cabela's Big Game Hunter"}, + (struct game_entry){.code = "BG5", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Cabela's Big Game Hunter - 2005 Adventures"}, + (struct game_entry){.code = "ACP", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Caesars Palace Advance"}, + (struct game_entry){.code = "BIX", .storage = BACKUP_FLASH128, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Calciobit"}, + (struct game_entry){.code = "BLC", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Camp Lazlo - Leaky Lake Games"}, + (struct game_entry){.code = "BC6", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Capcom Classics - Mini Mix"}, + (struct game_entry){.code = "AKY", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Captain Tsubasa - Eikou no Kiseki"}, + (struct game_entry){.code = "ACB", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Car Battler Joe"}, + (struct game_entry){.code = "BK3", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Card Captor Sakura - Sakura Card de Mini Game"}, + (struct game_entry){.code = "BKS", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Card Captor Sakura - Sakura to Card to Otomodachi"}, + (struct game_entry){.code = "PEA", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Card E-Reader"}, + (struct game_entry){.code = "A8C", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Card Party"}, + (struct game_entry){.code = "BEA", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Care Bears - The Care Quest"}, + (struct game_entry){.code = "AED", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Carrera Power Slide"}, + (struct game_entry){.code = "BCA", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Cars"}, + (struct game_entry){.code = "BCP", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Cars Mater-National Championship"}, + (struct game_entry){.code = "AC9", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Cartoon Network Block Party"}, + (struct game_entry){.code = "ANR", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Cartoon Network Speedway"}, + (struct game_entry){.code = "ACS", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Casper"}, + (struct game_entry){.code = "A2C", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Castlevania - Aria of Sorrow"}, + (struct game_entry){.code = "AAM", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Castlevania - Circle of the Moon"}, + (struct game_entry){.code = "ACH", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Castlevania - Harmony of Dissonance"}, + (struct game_entry){.code = "BXK", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Castlevania Double Pack"}, + (struct game_entry){.code = "BCW", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Catwoman"}, + (struct game_entry){.code = "AN3", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Catz"}, + (struct game_entry){.code = "BCF", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Charlie and the Chocolate Factory"}, + (struct game_entry){.code = "BCJ", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Charlotte's Web"}, + (struct game_entry){.code = "ACY", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Chessmaster"}, + (struct game_entry){.code = "BCH", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Chicken Little"}, + (struct game_entry){.code = "B6F", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Chicken Shoot"}, + (struct game_entry){.code = "B6G", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Chicken Shoot 2"}, + (struct game_entry){.code = "AOC", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Chobits for GameBoy Advance"}, + (struct game_entry){.code = "A5B", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Chocobo Land - A Game of Dice"}, + (struct game_entry){.code = "ACJ", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Chou Makai-Mura R"}, + (struct game_entry){.code = "ACR", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Chu Chu Rocket!"}, + (struct game_entry){.code = "BCM", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "CIMA - The Enemy"}, + (struct game_entry){.code = "BCD", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Cinderella - Magical Dreams"}, + (struct game_entry){.code = "B2S", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Cinnamon - Yume no Daibouken"}, + (struct game_entry){.code = "B43", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Cinnamon Fuwafuwa Daisakusen"}, + (struct game_entry){.code = "BPS", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Cinnamoroll Kokoniiruyo"}, + (struct game_entry){.code = "FBM", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Classic NES Series - Bomberman"}, + (struct game_entry){.code = "FAD", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Classic NES Series - Castlevania"}, + (struct game_entry){.code = "FDK", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Classic NES Series - Donkey Kong"}, + (struct game_entry){.code = "FDM", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Classic NES Series - Dr. Mario"}, + (struct game_entry){.code = "FEB", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Classic NES Series - ExciteBike"}, + (struct game_entry){.code = "FIC", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Classic NES Series - Ice Climber"}, + (struct game_entry){.code = "FMR", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Classic NES Series - Metroid"}, + (struct game_entry){.code = "FP7", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Classic NES Series - Pac-Man"}, + (struct game_entry){.code = "FSM", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Classic NES Series - Super Mario Bros."}, + (struct game_entry){.code = "FZL", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Classic NES Series - The Legend of Zelda"}, + (struct game_entry){.code = "FXV", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Classic NES Series - Xevious"}, + (struct game_entry){.code = "FLB", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Classic NES Series - Zelda II - The Adventure of Link"}, + (struct game_entry){.code = "BC5", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Cocoto - Kart Racer"}, + (struct game_entry){.code = "BC8", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Cocoto Platform Jumper"}, + (struct game_entry){.code = "BND", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Codename Kids Next Door - Operation S.O.D.A."}, + (struct game_entry){.code = "ACM", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Colin McRae Rally 2.0"}, + (struct game_entry){.code = "ACG", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Columns Crown"}, + (struct game_entry){.code = "AQC", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Combat Choro Q - Advance Daisakusen"}, + (struct game_entry){.code = "BW5", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Combo Pack - Sonic Advance + Sonic Pinball Party"}, + (struct game_entry){.code = "ACZ", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Comix Zone"}, + (struct game_entry){.code = "B65", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Connect Four - Perfection - Trouble"}, + (struct game_entry){.code = "AAW", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Contra Advance - The Alien Wars EX"}, + (struct game_entry){.code = "AVC", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Corvette"}, + (struct game_entry){.code = "B5A", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Crash & Spyro - Super Pack Volume 1"}, + (struct game_entry){.code = "B52", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Crash & Spyro - Super Pack Volume 2"}, + (struct game_entry){.code = "B53", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Crash & Spyro Superpack - Ripto's Rampage + The Cortex Conspiracy"}, + (struct game_entry){.code = "B54", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Crash & Spyro Superpack - The Huge Adventure + Season of Ice"}, + (struct game_entry){.code = "ACQ", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Crash Bandicoot - The Huge Adventure"}, + (struct game_entry){.code = "AC8", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Crash Bandicoot 2 - N-Tranced"}, + (struct game_entry){.code = "ACU", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Crash Bandicoot Advance"}, + (struct game_entry){.code = "BKD", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Crash Bandicoot Advance - Wakuwaku Tomodachi Daisakusen"}, + (struct game_entry){.code = "BD4", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Crash Bandicoot Purple - Ripto's Rampage"}, + (struct game_entry){.code = "BCN", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Crash Nitro Kart"}, + (struct game_entry){.code = "BQC", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Crash of the Titans"}, + (struct game_entry){.code = "B8A", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Crash Superpack - N-Tranced + Nitro Kart"}, + (struct game_entry){.code = "BC2", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Crayon Shin chan - Densetsu wo Yobu Omake no Miyako Shockgaan"}, + (struct game_entry){.code = "BKC", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Crayon Shin-Chan - Arashi no Yobu Cinema-Land no Daibouken!"}, + (struct game_entry){.code = "ACC", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Crazy Chase"}, + (struct game_entry){.code = "BCR", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Crazy Frog Racer"}, + (struct game_entry){.code = "A3C", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Crazy Taxi - Catch a Ride"}, + (struct game_entry){.code = "ACT", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Creatures"}, + (struct game_entry){.code = "A6C", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Croket! - Yume no Banker Survival!"}, + (struct game_entry){.code = "BK2", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Croket! 2 - Yami no Bank to Banqueen"}, + (struct game_entry){.code = "B3K", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Croket! 3 - Guranyuu Oukoku no Nazo"}, + (struct game_entry){.code = "BK4", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Croket! 4 - Bank no Mori no Mamorigami"}, + (struct game_entry){.code = "AQD", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Crouching Tiger Hidden Dragon"}, + (struct game_entry){.code = "ACF", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Cruis'n Velocity"}, + (struct game_entry){.code = "BCB", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Crushed Baseball"}, + (struct game_entry){.code = "AC7", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "CT Special Forces"}, + (struct game_entry){.code = "A9C", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "CT Special Forces 2 - Back in the Trenches"}, + (struct game_entry){.code = "BC3", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "CT Special Forces 3 - Bioterror"}, + (struct game_entry){.code = "ACX", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Cubix - Robots for Everyone - Clash 'N Bash"}, + (struct game_entry){.code = "B3J", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Curious George"}, + (struct game_entry){.code = "ARJ", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Custom Robo GX"}, + (struct game_entry){.code = "AZ3", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Cyberdrive Zoids - Kijuu no Senshi Hyuu"}, + (struct game_entry){.code = "AHM", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Dai-Mahjong"}, + (struct game_entry){.code = "ADS", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Daisenryaku for GameBoy Advance"}, + (struct game_entry){.code = "ATD", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Daisuki Teddy"}, + (struct game_entry){.code = "BDN", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Dan Doh!! - Tobase Shouri no Smile Shot!!"}, + (struct game_entry){.code = "AXH", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Dan Doh!! Xi"}, + (struct game_entry){.code = "A9S", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Dancing Sword - Senkou"}, + (struct game_entry){.code = "BUE", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Danny Phantom - The Ultimate Enemy"}, + (struct game_entry){.code = "BQY", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Danny Phantom - Urban Jungle"}, + (struct game_entry){.code = "AVL", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Daredevil"}, + (struct game_entry){.code = "A2D", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Darius R"}, + (struct game_entry){.code = "ADA", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Dark Arena"}, + (struct game_entry){.code = "AX2", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Dave Mirra Freestyle BMX 2"}, + (struct game_entry){.code = "AB3", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Dave Mirra Freestyle BMX 3"}, + (struct game_entry){.code = "ABQ", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "David Beckham Soccer"}, + (struct game_entry){.code = "AD6", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Davis Cup"}, + (struct game_entry){.code = "BDE", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Dead to Rights"}, + (struct game_entry){.code = "BZN", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Deal or No Deal"}, + (struct game_entry){.code = "A2F", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Defender"}, + (struct game_entry){.code = "ADH", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Defender of the Crown"}, + (struct game_entry){.code = "AC5", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "DemiKids - Dark Version"}, + (struct game_entry){.code = "AL4", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "DemiKids - Light Version"}, + (struct game_entry){.code = "A9A", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Demon Driver - Time to Burn Rubber!"}, + (struct game_entry){.code = "ADB", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Denki Blocks!"}, + (struct game_entry){.code = "AST", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Densetsu no Stafi"}, + (struct game_entry){.code = "AVF", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Densetsu no Stafi 2"}, + (struct game_entry){.code = "B3D", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Densetsu no Stafi 3"}, + (struct game_entry){.code = "A8P", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Derby Stallion Advance"}, + (struct game_entry){.code = "ADI", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Desert Strike Advance"}, + (struct game_entry){.code = "ADX", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Dexter's Laboratory - Chess Challenge"}, + (struct game_entry){.code = "ADL", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Dexter's Laboratory - Deesaster Strikes!"}, + (struct game_entry){.code = "A3O", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Di Gi Charat - DigiCommunication"}, + (struct game_entry){.code = "ADD", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Diadroids World - Evil Teikoku no Yabou"}, + (struct game_entry){.code = "BXW", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Die Wilden Fussball Kerle - Gefahr im Wilde Kerle Land"}, + (struct game_entry){.code = "BWU", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Die wilden Fussballkerle - Entscheidung im Teufelstopf"}, + (struct game_entry){.code = "BDK", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Digi Communication 2 in 1 Datou! Black Gemagema Dan"}, + (struct game_entry){.code = "A8S", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Digimon - Battle Spirit"}, + (struct game_entry){.code = "BDS", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Digimon - Battle Spirit 2"}, + (struct game_entry){.code = "BDG", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Digimon Racing"}, + (struct game_entry){.code = "BDJ", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Digimon Racing"}, + (struct game_entry){.code = "AD3", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Dinotopia - The Timestone Pirates"}, + (struct game_entry){.code = "AQP", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Disney Princess"}, + (struct game_entry){.code = "BQN", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Disney Princess - Royal Adventure"}, + (struct game_entry){.code = "A2A", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Disney Sports - Basketball"}, + (struct game_entry){.code = "A3D", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Disney Sports - Football"}, + (struct game_entry){.code = "AOM", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Disney Sports - Motocross"}, + (struct game_entry){.code = "A4D", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Disney Sports - Skateboarding"}, + (struct game_entry){.code = "A5D", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Disney Sports - Snowboarding"}, + (struct game_entry){.code = "A6D", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Disney Sports - Soccer"}, + (struct game_entry){.code = "BD8", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Disney's Party"}, + (struct game_entry){.code = "BBK", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "DK - King of Swing"}, + (struct game_entry){.code = "B82", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Dogz"}, + (struct game_entry){.code = "BFE", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Dogz - Fashion"}, + (struct game_entry){.code = "BIM", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Dogz 2"}, + (struct game_entry){.code = "ADQ", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Dokapon"}, + (struct game_entry){.code = "A56", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "DokiDoki Cooking Series 1 - Komugi-chan no Happy Cake"}, + (struct game_entry){.code = "A8O", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "DokiDoki Cooking Series 2 - Gourmet Kitchen - Suteki na Obentou"}, + (struct game_entry){.code = "AYA", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Dokodemo Taikyoku - Yakuman Advance"}, + (struct game_entry){.code = "ADO", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Domo-kun no Fushigi Terebi"}, + (struct game_entry){.code = "ADK", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Donald Duck Advance"}, + (struct game_entry){.code = "AAD", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Donald Duck Advance"}, + (struct game_entry){.code = "BDA", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Donchan Puzzle Hanabi de Dohn Advance"}, + (struct game_entry){.code = "A5N", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Donkey Kong Country"}, + (struct game_entry){.code = "B2D", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Donkey Kong Country 2"}, + (struct game_entry){.code = "BDQ", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Donkey Kong Country 3"}, + (struct game_entry){.code = "ADM", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Doom"}, + (struct game_entry){.code = "A9D", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Doom II"}, + (struct game_entry){.code = "BXP", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Dora the Explorer - Dora's World Adventure"}, + (struct game_entry){.code = "BER", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Dora the Explorer - Super Spies"}, + (struct game_entry){.code = "BDO", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Dora the Explorer - Super Star Adventures!"}, + (struct game_entry){.code = "AER", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Dora the Explorer - The Search for the Pirate Pig's Treasure"}, + (struct game_entry){.code = "ADP", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Doraemon - Dokodemo Walker"}, + (struct game_entry){.code = "ADR", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Doraemon - Midori no Wakusei DokiDoki Daikyuushutsu!"}, + (struct game_entry){.code = "BDD", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Double Dragon Advance"}, + (struct game_entry){.code = "A8D", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Doubutsu Shima no Chobi Gurumi"}, + (struct game_entry){.code = "BDC", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Doubutsujima no Chobi Gurumi 2 - Tamachan Monogatari"}, + (struct game_entry){.code = "ADW", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Downforce"}, + (struct game_entry){.code = "A6T", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Dr. Muto"}, + (struct game_entry){.code = "AQT", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Dr. Seuss' - The Cat in the Hat"}, + (struct game_entry){.code = "BUO", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Dr. Sudoku"}, + (struct game_entry){.code = "BDV", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Dragon Ball - Advanced Adventure"}, + (struct game_entry){.code = "BT4", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Dragon Ball GT - Transformation"}, + (struct game_entry){.code = "BG3", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Dragon Ball Z - Buu's Fury"}, + (struct game_entry){.code = "ADZ", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Dragon Ball Z - Collectible Card Game"}, + (struct game_entry){.code = "AZJ", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Dragon Ball Z - Supersonic Warriors"}, + (struct game_entry){.code = "BDB", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Dragon Ball Z - Taiketsu"}, + (struct game_entry){.code = "ALG", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Dragon Ball Z - The Legacy of Goku"}, + (struct game_entry){.code = "ALF", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Dragon Ball Z - The Legacy of Goku II"}, + (struct game_entry){.code = "A5G", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Dragon Drive - World D Break"}, + (struct game_entry){.code = "AT2", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Dragon Quest Characters - Torneko no Daibouken 2 Advance"}, + (struct game_entry){.code = "BD3", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Dragon Quest Characters - Torneko no Daibouken 3 Advance"}, + (struct game_entry){.code = "A9H", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Dragon Quest Monsters - Caravan Heart"}, + (struct game_entry){.code = "BD9", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Dragon Tales - Dragon Adventures"}, + (struct game_entry){.code = "BJD", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Dragon's Rock"}, + (struct game_entry){.code = "AJY", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Drake & Josh"}, + (struct game_entry){.code = "V49", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Drill Dozer"}, + (struct game_entry){.code = "B3R", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Driv3r"}, + (struct game_entry){.code = "ADV", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Driven"}, + (struct game_entry){.code = "ADU", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Driver 2 Advance"}, + (struct game_entry){.code = "AOE", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Drome Racers"}, + (struct game_entry){.code = "AD7", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Droopy's Tennis Open"}, + (struct game_entry){.code = "AB9", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Dual Blades"}, + (struct game_entry){.code = "BD6", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Duel Masters - Kaijudo Showdown"}, + (struct game_entry){.code = "AA9", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Duel Masters - Sempai Legends"}, + (struct game_entry){.code = "BDU", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Duel Masters - Shadow of the Code"}, + (struct game_entry){.code = "BD2", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Duel Masters 2"}, + (struct game_entry){.code = "BD5", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Duel Masters 2 - Kirifuda Shoubu Version"}, + (struct game_entry){.code = "AD9", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Duke Nukem Advance"}, + (struct game_entry){.code = "AD4", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Dungeons & Dragons - Eye of the Beholder"}, + (struct game_entry){.code = "B36", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Dynasty Warriors Advance"}, + (struct game_entry){.code = "AET", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "E.T. - The Extra-Terrestrial"}, + (struct game_entry){.code = "AEJ", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Earthworm Jim"}, + (struct game_entry){.code = "AJ4", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Earthworm Jim 2"}, + (struct game_entry){.code = "AES", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Ecks vs Sever"}, + (struct game_entry){.code = "AE3", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Ed, Edd n Eddy - Jawbreakers!"}, + (struct game_entry){.code = "BED", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Ed, Edd n Eddy - The Mis-Edventures"}, + (struct game_entry){.code = "AEM", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Egg Mania"}, + (struct game_entry){.code = "AEK", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Elemix!"}, + (struct game_entry){.code = "ANW", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Elevator Action - Old & New"}, + (struct game_entry){.code = "BEL", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Elf - The Movie"}, + (struct game_entry){.code = "BEB", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Elf Bowling 1 & 2"}, + (struct game_entry){.code = "BZR", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Enchanted - Once Upon Andalasia"}, + (struct game_entry){.code = "BEN", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Eragon"}, + (struct game_entry){.code = "PSA", .storage = BACKUP_FLASH128, .flags = GAME_ENTRY_FLAGS_RTC, .title = "E-Reader"}, + (struct game_entry){.code = "BEJ", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Erementar Gerad"}, + (struct game_entry){.code = "AGR", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "ESPN Final Round Golf 2002"}, + (struct game_entry){.code = "AMG", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "ESPN Great Outdoor Games - Bass 2002"}, + (struct game_entry){.code = "AWI", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "ESPN International Winter Sports 2002"}, + (struct game_entry){.code = "AWX", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "ESPN Winter X-Games Snowboarding 2002"}, + (struct game_entry){.code = "AXS", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "ESPN X-Games Skateboarding"}, + (struct game_entry){.code = "AEL", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "European Super League"}, + (struct game_entry){.code = "BEV", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Ever Girl"}, + (struct game_entry){.code = "AMO", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "EX Monopoly"}, + (struct game_entry){.code = "AEG", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Extreme Ghostbusters - Code Ecto-1"}, + (struct game_entry){.code = "BES", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Extreme Skate Adventure"}, + (struct game_entry){.code = "BE4", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Eyeshield 21 - Devilbats Devildays"}, + (struct game_entry){.code = "A22", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "EZ-Talk - Shokyuu Hen 1"}, + (struct game_entry){.code = "A23", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "EZ-Talk - Shokyuu Hen 2"}, + (struct game_entry){.code = "A24", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "EZ-Talk - Shokyuu Hen 3"}, + (struct game_entry){.code = "A25", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "EZ-Talk - Shokyuu Hen 4"}, + (struct game_entry){.code = "A26", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "EZ-Talk - Shokyuu Hen 5"}, + (struct game_entry){.code = "A27", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "EZ-Talk - Shokyuu Hen 6"}, + (struct game_entry){.code = "AF8", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "F1 2002"}, + (struct game_entry){.code = "AFT", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "F-14 Tomcat"}, + (struct game_entry){.code = "BYA", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "F24 - Stealth Fighter"}, + (struct game_entry){.code = "FSR", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Famicom Mini Series - Dai 2 Ji Super Robot Taisen"}, + (struct game_entry){.code = "FGZ", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Famicom Mini Series - Kido Senshi Z Gundam Hot Scramble"}, + (struct game_entry){.code = "FSO", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Famicom Mini Series 10 - Star Soldier"}, + (struct game_entry){.code = "FMB", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Famicom Mini Series 11 - Mario Bros."}, + (struct game_entry){.code = "FCL", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Famicom Mini Series 12 - Clu Clu Land"}, + (struct game_entry){.code = "FBF", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Famicom Mini Series 13 - Balloon Fight"}, + (struct game_entry){.code = "FWC", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Famicom Mini Series 14 - Wrecking Crew"}, + (struct game_entry){.code = "FDD", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Famicom Mini Series 16 - Dig Dug"}, + (struct game_entry){.code = "FTB", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Famicom Mini Series 17 - Takahashi Meijin no Bouken Jima"}, + (struct game_entry){.code = "FMK", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Famicom Mini Series 18 - Makaimura"}, + (struct game_entry){.code = "FTW", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Famicom Mini Series 19 - TwinBee"}, + (struct game_entry){.code = "FGG", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Famicom Mini Series 20 - Ganbare Goemon! Karakuri Douchuu"}, + (struct game_entry){.code = "FM2", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Famicom Mini Series 21 - Super Mario Bros. 2"}, + (struct game_entry){.code = "FNM", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Famicom Mini Series 22 - Nazo no Murasame Shiro"}, + (struct game_entry){.code = "FPT", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Famicom Mini Series 24 - Hikari Shinwa - Palutena no Kagame"}, + (struct game_entry){.code = "FFM", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Famicom Mini Series 26 - Mukashi Hanashi - Shin Onigashima"}, + (struct game_entry){.code = "FTK", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Famicom Mini Series 27 - Famicom Tantei Club - Kieta Koukeisha"}, + (struct game_entry){.code = "FTU", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Famicom Mini Series 28 - Famicom Tantei Club Part II - Ushiro ni Tatsu Shoujo"}, + (struct game_entry){.code = "FSD", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Famicom Mini Series 30 - SD Gundam World - Gachapon Senshi Scramble Wars"}, + (struct game_entry){.code = "FPM", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Famicom Mini Series 6 - Pac-Man"}, + (struct game_entry){.code = "FMP", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Famicom Mini Series 8 - Mappy"}, + (struct game_entry){.code = "B2F", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Family Feud"}, + (struct game_entry){.code = "AAT", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Family Tennis Advance"}, + (struct game_entry){.code = "AN7", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Famista Advance"}, + (struct game_entry){.code = "AJE", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Fancy Pocket"}, + (struct game_entry){.code = "BFC", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Fantasic Children"}, + (struct game_entry){.code = "BF4", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Fantastic 4"}, + (struct game_entry){.code = "BH4", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Fantastic 4 - Flame On"}, + (struct game_entry){.code = "AAX", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Fantastic Maerchen - Cake-yasan Monogatari"}, + (struct game_entry){.code = "BFU", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Fear Factor Unleashed"}, + (struct game_entry){.code = "AF9", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Field of Nine - Digital Edition 2001"}, + (struct game_entry){.code = "BF6", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "FIFA 06"}, + (struct game_entry){.code = "B7F", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "FIFA 07"}, + (struct game_entry){.code = "AFJ", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "FIFA 2003"}, + (struct game_entry){.code = "BFI", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "FIFA 2004"}, + (struct game_entry){.code = "BF5", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "FIFA 2005"}, + (struct game_entry){.code = "B6W", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "FIFA World Cup 2006"}, + (struct game_entry){.code = "BOX", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "FightBox"}, + (struct game_entry){.code = "AFL", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "FILA Decathlon"}, + (struct game_entry){.code = "BFF", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Final Fantasy I & II - Dawn of Souls"}, + (struct game_entry){.code = "BZ4", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Final Fantasy IV Advance"}, + (struct game_entry){.code = "AFX", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Final Fantasy Tactics Advance"}, + (struct game_entry){.code = "BZ5", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Final Fantasy V Advance"}, + (struct game_entry){.code = "BZ6", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Final Fantasy VI Advance"}, + (struct game_entry){.code = "AFF", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Final Fight One"}, + (struct game_entry){.code = "AFW", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Final Fire Pro Wrestling - Yume no Dantai Unei!"}, + (struct game_entry){.code = "AZI", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Finding Nemo"}, + (struct game_entry){.code = "BFN", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Finding Nemo"}, + (struct game_entry){.code = "BZI", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Finding Nemo - The Continuing Adventures"}, + (struct game_entry){.code = "AE7", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Fire Emblem"}, + (struct game_entry){.code = "AFE", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Fire Emblem - Fuuin no Tsurugi"}, + (struct game_entry){.code = "BE8", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Fire Emblem - The Sacred Stones"}, + (struct game_entry){.code = "AFP", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Fire Pro Wrestling"}, + (struct game_entry){.code = "AFY", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Fire Pro Wrestling 2"}, + (struct game_entry){.code = "BLH", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Flushed Away"}, + (struct game_entry){.code = "BF3", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Ford Racing 3"}, + (struct game_entry){.code = "AFM", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Formation Soccer 2002"}, + (struct game_entry){.code = "AFO", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Fortress"}, + (struct game_entry){.code = "BFY", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Foster's Home for Imaginary Friends"}, + (struct game_entry){.code = "BFK", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Franklin the Turtle"}, + (struct game_entry){.code = "BFL", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Franklin's Great Adventures"}, + (struct game_entry){.code = "BFS", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Freekstyle"}, + (struct game_entry){.code = "AFQ", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Frogger Advance - The Great Quest"}, + (struct game_entry){.code = "AFR", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Frogger's Adventures - Temple of the Frog"}, + (struct game_entry){.code = "AFB", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Frogger's Adventures 2 - The Lost Wand"}, + (struct game_entry){.code = "BFJ", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Frogger's Journey - The Forgotten Relic"}, + (struct game_entry){.code = "ADC", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Fruit Chase"}, + (struct game_entry){.code = "BFD", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Fruit Mura no Doubutsu Tachi"}, + (struct game_entry){.code = "AF4", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Fushigi no Kuni no Alice"}, + (struct game_entry){.code = "AFA", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Fushigi no Kuni no Angelique"}, + (struct game_entry){.code = "BFP", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Futari ha Precure Arienaai Yume no Kuni ha Daimeikyuu"}, + (struct game_entry){.code = "BFM", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Futari wa Precure Max Heart Maji! Maji! Fight de IN Janai"}, + (struct game_entry){.code = "BFT", .storage = BACKUP_FLASH128, .flags = GAME_ENTRY_FLAGS_NONE, .title = "F-Zero - Climax"}, + (struct game_entry){.code = "BFZ", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "F-Zero - GP Legends"}, + (struct game_entry){.code = "AFZ", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "F-Zero - Maximum Velocity"}, + (struct game_entry){.code = "A4X", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Gachaste! Dino Device 2 Dragon"}, + (struct game_entry){.code = "A4W", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Gachaste! Dino Device 2 Phoenix"}, + (struct game_entry){.code = "ABI", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Gachasute! Dino Device - Blue"}, + (struct game_entry){.code = "AAI", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Gachasute! Dino Device - Red"}, + (struct game_entry){.code = "ANY", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Gachinko Pro Yakyuu"}, + (struct game_entry){.code = "AQA", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Gadget Racers"}, + (struct game_entry){.code = "AQ2", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Gadget Racers"}, + (struct game_entry){.code = "BGH", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Gakkou no Kaidan - Hyakuyobako no Fuuin"}, + (struct game_entry){.code = "AYS", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Gakkou wo Tsukurou!! Advance"}, + (struct game_entry){.code = "BAS", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Gakuen Alice - DokiDoki Fushigi Taiken"}, + (struct game_entry){.code = "BGS", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Gakuen Senki Muryou"}, + (struct game_entry){.code = "AGZ", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Galaxy Angel GameBoy Advance"}, + (struct game_entry){.code = "AG8", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Galidor - Defenders of the Outer Dimension"}, + (struct game_entry){.code = "ATY", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Gambler Densetsu Tetsuya - Yomigaeru Densetsu"}, + (struct game_entry){.code = "AQW", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Game & Watch Gallery 4"}, + (struct game_entry){.code = "BGW", .storage = BACKUP_FLASH128, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Gameboy Wars Advance 1+2"}, + (struct game_entry){.code = "BG7", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Games Explosion!"}, + (struct game_entry){.code = "BG8", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Ganbare! Dodge Fighters"}, + (struct game_entry){.code = "BGO", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Garfield - The Search for Pooky"}, + (struct game_entry){.code = "BG9", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Garfield and His Nine Lives"}, + (struct game_entry){.code = "AYG", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Gauntlet - Dark Legacy"}, + (struct game_entry){.code = "B69", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Gauntlet - Rampart"}, + (struct game_entry){.code = "MGU", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "GBA Video - All Grown Up - Volume 1"}, + (struct game_entry){.code = "MCM", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "GBA Video - Cartoon Network Collection - Limited Edition"}, + (struct game_entry){.code = "MCN", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "GBA Video - Cartoon Network Collection - Platinum Edition"}, + (struct game_entry){.code = "MCP", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "GBA Video - Cartoon Network Collection - Premium Edition"}, + (struct game_entry){.code = "MCS", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "GBA Video - Cartoon Network Collection - Special Edition"}, + (struct game_entry){.code = "MCT", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "GBA Video - Cartoon Network Collection - Volume 1"}, + (struct game_entry){.code = "MC2", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "GBA Video - Cartoon Network Collection - Volume 2"}, + (struct game_entry){.code = "MKD", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "GBA Video - Codename Kids Next Door - Volume 1"}, + (struct game_entry){.code = "MDC", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "GBA Video - Disney Channel Collection - Volume 1"}, + (struct game_entry){.code = "MDS", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "GBA Video - Disney Channel Collection - Volume 2"}, + (struct game_entry){.code = "MDR", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "GBA Video - Dora the Explorer - Volume 1"}, + (struct game_entry){.code = "MDB", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "GBA Video - Dragon Ball GT - Volume 1"}, + (struct game_entry){.code = "MNC", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "GBA Video - Nicktoon's Collection - Volume 1"}, + (struct game_entry){.code = "MN2", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "GBA Video - Nicktoons Collection - Volume 2"}, + (struct game_entry){.code = "MN3", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "GBA Video - Nicktoons Volume 3"}, + (struct game_entry){.code = "MPA", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "GBA Video - Pokemon - Volume 1"}, + (struct game_entry){.code = "MPB", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "GBA Video - Pokemon - Volume 2"}, + (struct game_entry){.code = "MPC", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "GBA Video - Pokemon - Volume 3"}, + (struct game_entry){.code = "MPD", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "GBA Video - Pokemon - Volume 4"}, + (struct game_entry){.code = "MSA", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "GBA Video - Shark Tale"}, + (struct game_entry){.code = "MSK", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "GBA Video - Shrek"}, + (struct game_entry){.code = "MST", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "GBA Video - Shrek + Shark Tale"}, + (struct game_entry){.code = "M2S", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "GBA Video - Shrek 2"}, + (struct game_entry){.code = "MSH", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "GBA Video - Sonic X - Volume 1"}, + (struct game_entry){.code = "MSS", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "GBA Video - SpongeBob SquarePants - Volume 1"}, + (struct game_entry){.code = "MS2", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "GBA Video - SpongeBob SquarePants - Volume 2"}, + (struct game_entry){.code = "MS3", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "GBA Video - SpongeBob SquarePants - Volume 3"}, + (struct game_entry){.code = "MSB", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "GBA Video - Strawberry Shortcake - Volume 1"}, + (struct game_entry){.code = "MSR", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "GBA Video - Super Robot Monkey Team - Volume 1"}, + (struct game_entry){.code = "MTM", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "GBA Video - Teenage Mutant Ninja Turtles - Volume 1"}, + (struct game_entry){.code = "MJM", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "GBA Video - The Adventures of Jimmy Neutron Boy Genius - Volume 1"}, + (struct game_entry){.code = "MFO", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "GBA Video - The Fairly Odd Parents - Volume 1"}, + (struct game_entry){.code = "MF2", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "GBA Video - The Fairly Odd Parents - Volume 2"}, + (struct game_entry){.code = "MFP", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "GBA Video - The Proud Family - Volume 1"}, + (struct game_entry){.code = "MYG", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "GBA Video - Yu-Gi-Oh! - Yugi vs. Joey - Volume 1"}, + (struct game_entry){.code = "AGB", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "GBA-SP AV Adaptor"}, + (struct game_entry){.code = "BGK", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Gegege no Kitarou - Kikiippatsu! Youkai Rettou"}, + (struct game_entry){.code = "AGE", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Gekido Advance - Kintaro's Revenge"}, + (struct game_entry){.code = "ANN", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Gekitou Densetsu Noah - Dream Management"}, + (struct game_entry){.code = "AZS", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Gem Smashers"}, + (struct game_entry){.code = "BGJ", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Genseishin the Justirisers - Souchaku Chikyuu no"}, + (struct game_entry){.code = "BGM", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Gensou Maden Saiyuuki - Hangyaku no Toushin-taishi"}, + (struct game_entry){.code = "AGK", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Gensou Suikoden - Card Stories"}, + (struct game_entry){.code = "BGI", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Get Ride AMDriver - Senkou no Hero Tanjou"}, + (struct game_entry){.code = "BGP", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Get Ride! AMDrive Shutsugeki Battle Party"}, + (struct game_entry){.code = "BGB", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Get! - Boku no Mushi Tsukamaete"}, + (struct game_entry){.code = "BGF", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "GetBackers Dakkanya - Jagan Fuuin!"}, + (struct game_entry){.code = "A8G", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "GetBackers Dakkanya - Metropolis Dakkan Sakusen!"}, + (struct game_entry){.code = "BR8", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Ghost Rider"}, + (struct game_entry){.code = "AGV", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Ghost Trap"}, + (struct game_entry){.code = "B3Z", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Global Star - Suduoku Feber"}, + (struct game_entry){.code = "AGQ", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Go! Go! Beckham! - Adventure on Soccer Island"}, + (struct game_entry){.code = "AG4", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Godzilla - Domination!"}, + (struct game_entry){.code = "AGN", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Goemon - New Age Shutsudou!"}, + (struct game_entry){.code = "BGG", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Golden Nugget Casino"}, + (struct game_entry){.code = "AGS", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Golden Sun"}, + (struct game_entry){.code = "AGF", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Golden Sun - The Lost Age"}, + (struct game_entry){.code = "AGA", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Gradius Galaxies"}, + (struct game_entry){.code = "BGT", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Grand Theft Auto Advance"}, + (struct game_entry){.code = "AG9", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Greatest Nine"}, + (struct game_entry){.code = "BUS", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Green Eggs and Ham by Dr. Seuss"}, + (struct game_entry){.code = "BGQ", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Greg Hastings' Tournament Paintball Max'd"}, + (struct game_entry){.code = "AGG", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Gremlins - Stripe vs Gizmo"}, + (struct game_entry){.code = "ARV", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Groove Adventure Rave - Hikari to Yami no Daikessen"}, + (struct game_entry){.code = "ARI", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Groove Adventure Rave - Hikari to Yami no Daikessen 2"}, + (struct game_entry){.code = "ACA", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "GT Advance - Championship Racing"}, + (struct game_entry){.code = "AGW", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "GT Advance 2 - Rally Racing"}, + (struct game_entry){.code = "A2G", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "GT Advance 3 - Pro Concept Racing"}, + (struct game_entry){.code = "BJA", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "GT Racers"}, + (struct game_entry){.code = "AGX", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Guilty Gear X - Advance Edition"}, + (struct game_entry){.code = "BGV", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Gumby vs. The Astrobots"}, + (struct game_entry){.code = "BHG", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Gunstar Super Heroes"}, + (struct game_entry){.code = "BGX", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Gunstar Super Heroes"}, + (struct game_entry){.code = "AIB", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Guranbo"}, + (struct game_entry){.code = "AGC", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Guru Logic Champ"}, + (struct game_entry){.code = "ASB", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Gyakuten Saiban"}, + (struct game_entry){.code = "A3G", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Gyakuten Saiban 2"}, + (struct game_entry){.code = "A3J", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Gyakuten Saiban 3"}, + (struct game_entry){.code = "A8E", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Hachiemon"}, + (struct game_entry){.code = "BHR", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Hagane no Renkinjutsushi - Meisou no Rondo"}, + (struct game_entry){.code = "BH2", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Hagane no Renkinjutsushi - Omoide no Sonata"}, + (struct game_entry){.code = "A2H", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Hajime no Ippo - The Fighting!"}, + (struct game_entry){.code = "AM7", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Hamepane - Tokyo Mew Mew"}, + (struct game_entry){.code = "A4K", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Hamster Club 4"}, + (struct game_entry){.code = "AHB", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Hamster Monogatari 2 GBA"}, + (struct game_entry){.code = "A83", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Hamster Monogatari 3 GBA"}, + (struct game_entry){.code = "BHS", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Hamster Monogatari 3EX 4 Special"}, + (struct game_entry){.code = "BHC", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Hamster Monogatari Collection"}, + (struct game_entry){.code = "A82", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Hamster Paradise - Pure Heart"}, + (struct game_entry){.code = "AHA", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Hamster Paradise Advance"}, + (struct game_entry){.code = "B85", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Hamtaro - Ham-Ham Games"}, + (struct game_entry){.code = "AH3", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Hamtaro - Ham-Ham Heartbreak"}, + (struct game_entry){.code = "A84", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Hamtaro - Rainbow Rescue"}, + (struct game_entry){.code = "BHA", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Hanabi Hyakkei Advance"}, + (struct game_entry){.code = "ADY", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Hanafuda Trump Mahjong - Depachika Wayouchuu"}, + (struct game_entry){.code = "BH3", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Happy Feet"}, + (struct game_entry){.code = "AH6", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Hardcore Pinball"}, + (struct game_entry){.code = "BHO", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Hardcore Pool"}, + (struct game_entry){.code = "BHN", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Harlem Globetrotters - World Tour"}, + (struct game_entry){.code = "BH6", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Haro no Puyo Puyo"}, + (struct game_entry){.code = "AHQ", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Harobots - Robo Hero Battling!!"}, + (struct game_entry){.code = "BHP", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Harry Potter - Quidditch World Cup"}, + (struct game_entry){.code = "A7H", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Harry Potter and the Chamber of Secrets"}, + (struct game_entry){.code = "BH8", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Harry Potter and the Goblet of Fire"}, + (struct game_entry){.code = "BJX", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Harry Potter and the Order of the Phoenix"}, + (struct game_entry){.code = "BHT", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Harry Potter and the Prisoner of Azkaban"}, + (struct game_entry){.code = "AHR", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Harry Potter and the Sorcerer's Stone"}, + (struct game_entry){.code = "BJP", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Harry Potter Collection"}, + (struct game_entry){.code = "ARN", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Harukanaru Toki no Naka de"}, + (struct game_entry){.code = "A4N", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Harvest Moon - Friends of Mineral Town"}, + (struct game_entry){.code = "BFG", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Harvest Moon - More Friends of Mineral Town"}, + (struct game_entry){.code = "AHS", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Hatena Satena"}, + (struct game_entry){.code = "BHJ", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Heidi"}, + (struct game_entry){.code = "BHD", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Hello Idol Debut"}, + (struct game_entry){.code = "B86", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Hello Kitty - Happy Party Pals"}, + (struct game_entry){.code = "AKT", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Hello Kitty Collection - Miracle Fashion Maker"}, + (struct game_entry){.code = "B8F", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Herbie Fully Loaded"}, + (struct game_entry){.code = "AAE", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Hey Arnold! - The Movie"}, + (struct game_entry){.code = "BHH", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Hi Hi Puffy - AmiYumi Kaznapped"}, + (struct game_entry){.code = "AHZ", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Higanbana"}, + (struct game_entry){.code = "ASS", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "High Heat - Major League Baseball 2002"}, + (struct game_entry){.code = "AHH", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "High Heat - Major League Baseball 2003"}, + (struct game_entry){.code = "AHX", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "High Heat - Major League Baseball 2003"}, + (struct game_entry){.code = "BJ2", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "High School Musical - Livin' the Dream"}, + (struct game_entry){.code = "AHK", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Hikaru no Go"}, + (struct game_entry){.code = "AHT", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Hikaru no Go - Taikenban"}, + (struct game_entry){.code = "AKE", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Hikaru no Go 2"}, + (struct game_entry){.code = "A3H", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Hime Kishi Monogatari - Princess Blue"}, + (struct game_entry){.code = "AHI", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Hitsuji no Kimochi"}, + (struct game_entry){.code = "BHM", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Home on the Range"}, + (struct game_entry){.code = "BYP", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Horse & Pony - Let's Ride 2"}, + (struct game_entry){.code = "BHU", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Horsez"}, + (struct game_entry){.code = "AHP", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Hot Potato!"}, + (struct game_entry){.code = "AHW", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Hot Wheels - Burnin' Rubber"}, + (struct game_entry){.code = "BHE", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Hot Wheels - Stunt Track Challenge"}, + (struct game_entry){.code = "AH8", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Hot Wheels - Velocity X"}, + (struct game_entry){.code = "BHW", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Hot Wheels - World Race"}, + (struct game_entry){.code = "BHX", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Hot Wheels All Out"}, + (struct game_entry){.code = "B7I", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Hudson Best Collection 1"}, + (struct game_entry){.code = "B74", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Hudson Best Collection Vol. 4 - Nazotoki Collection"}, + (struct game_entry){.code = "B75", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Hudson Best Collection Vol. 5 - Shooting Collection"}, + (struct game_entry){.code = "B76", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Hudson Best Collection Vol. 6 - Bouken Jima Collection"}, + (struct game_entry){.code = "B72", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Hudson Collection Vol. 2 - Lode Runner Collection"}, + (struct game_entry){.code = "B73", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Hudson Collection Vol. 3 - Action Collection"}, + (struct game_entry){.code = "AZH", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Hugo - Bukkazoom!"}, + (struct game_entry){.code = "AHJ", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Hugo - The Evil Mirror"}, + (struct game_entry){.code = "B2H", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Hugo 2 in 1 - Bukkazoom! + The Evil Mirror"}, + (struct game_entry){.code = "A8N", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Hunter X Hunter - Minna Tomodachi Daisakusen!!"}, + (struct game_entry){.code = "A4C", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "I Spy Challenger!"}, + (struct game_entry){.code = "AIA", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Ice Age"}, + (struct game_entry){.code = "BIA", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Ice Age 2 - The Meltdown"}, + (struct game_entry){.code = "AR3", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Ice Nine"}, + (struct game_entry){.code = "BIV", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Ignition Collection - Volume 1 (3 Games in 1)"}, + (struct game_entry){.code = "AIN", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Initial D - Another Stage"}, + (struct game_entry){.code = "AIG", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Inspector Gadget - Advance Mission"}, + (struct game_entry){.code = "AIR", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Inspector Gadget Racing"}, + (struct game_entry){.code = "AIK", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "International Karate Advanced"}, + (struct game_entry){.code = "A3K", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "International Karate Plus"}, + (struct game_entry){.code = "AIS", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "International Superstar Soccer"}, + (struct game_entry){.code = "AY2", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "International Superstar Soccer Advance"}, + (struct game_entry){.code = "AI9", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Inukko Club"}, + (struct game_entry){.code = "AIY", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Inuyasha - Naraku no Wana! Mayoi no Mori no Shoutaijou"}, + (struct game_entry){.code = "AIV", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Invader"}, + (struct game_entry){.code = "AI3", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Iridion 3D"}, + (struct game_entry){.code = "AI2", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Iridion II"}, + (struct game_entry){.code = "BIR", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Iron Kid"}, + (struct game_entry){.code = "AXT", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Island Xtreme Stunts"}, + (struct game_entry){.code = "AIE", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Isseki Hattyou - Kore 1ppon de 8syurui!"}, + (struct game_entry){.code = "BPI", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "It's Mr Pants"}, + (struct game_entry){.code = "A2J", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "J.League - Winning Eleven Advance 2002"}, + (struct game_entry){.code = "AJP", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "J.League Pocket"}, + (struct game_entry){.code = "AJ2", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "J.League Pocket 2"}, + (struct game_entry){.code = "AC2", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "J.League Pro Soccer Club wo Tsukurou! Advance"}, + (struct game_entry){.code = "AJC", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Jackie Chan Adventures - Legend of the Darkhand"}, + (struct game_entry){.code = "BNJ", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Jajamaru Jr. Denshouki - Jaleco Memorial"}, + (struct game_entry){.code = "A7O", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "James Bond 007 - NightFire"}, + (struct game_entry){.code = "AJD", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "James Pond - Codename Robocod"}, + (struct game_entry){.code = "AJJ", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Jazz Jackrabbit"}, + (struct game_entry){.code = "AJR", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Jet Set Radio"}, + (struct game_entry){.code = "AGM", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "JGTO Kounin Golf Master Mobile - Japan Golf Tour Game"}, + (struct game_entry){.code = "AJW", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Jikkyou World Soccer Pocket"}, + (struct game_entry){.code = "AJK", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Jikkyou World Soccer Pocket 2"}, + (struct game_entry){.code = "AJN", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Jimmy Neutron - Boy Genius"}, + (struct game_entry){.code = "BJY", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Jimmy Neutron Boy Genius - Attack of the Twonkies"}, + (struct game_entry){.code = "AZG", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Jinsei Game Advance"}, + (struct game_entry){.code = "AJU", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Jissen Pachi-Slot Hisshouhou! - Juuou Advance"}, + (struct game_entry){.code = "AJM", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Jonny Moseley Mad Trix"}, + (struct game_entry){.code = "BJK", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Juka and the Monophonic Menace"}, + (struct game_entry){.code = "AJQ", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Jurassic Park III - Island Attack"}, + (struct game_entry){.code = "AJ3", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Jurassic Park III - Park Builder"}, + (struct game_entry){.code = "ADN", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Jurassic Park III - The DNA Factor"}, + (struct game_entry){.code = "AJ8", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Jurassic Park Institute Tour - Dinosaur Rescue"}, + (struct game_entry){.code = "AJL", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Justice League - Injustice for All"}, + (struct game_entry){.code = "BJL", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Justice League Chronicles"}, + (struct game_entry){.code = "BJH", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Justice League Heroes - The Flash"}, + (struct game_entry){.code = "AKV", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "K-1 Pocket Grand Prix"}, + (struct game_entry){.code = "A2O", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "K-1 Pocket Grand Prix 2"}, + (struct game_entry){.code = "AKD", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Kaeru B Back"}, + (struct game_entry){.code = "BKO", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Kaiketsu Zorori to Mahou no Yuuenchi"}, + (struct game_entry){.code = "AKZ", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Kamaitachi no Yoru Advance"}, + (struct game_entry){.code = "AG2", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Kami no Kijutsu - Illusion of the Evil Eyes"}, + (struct game_entry){.code = "AKK", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Kao the Kangaroo"}, + (struct game_entry){.code = "BK8", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Kappa no Kai-Kata - Katan Daibouken"}, + (struct game_entry){.code = "AYK", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Karnaaj Rally"}, + (struct game_entry){.code = "AN5", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Kawa no Nushi Tsuri 5 - Fushigi no Mori Kara"}, + (struct game_entry){.code = "BN4", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Kawa no Nushitsuri 3 & 4"}, + (struct game_entry){.code = "BKG", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Kawaii Pet Game Gallery"}, + (struct game_entry){.code = "BKP", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Kawaii Pet Game Gallery 2"}, + (struct game_entry){.code = "A63", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Kawaii Pet Shop Monogatari 3"}, + (struct game_entry){.code = "ATP", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Keitai Denjuu Telefang 2 - Power"}, + (struct game_entry){.code = "ATS", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Keitai Denjuu Telefang 2 - Speed"}, + (struct game_entry){.code = "AS3", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Kelly Slater's Pro Surfer"}, + (struct game_entry){.code = "BKJ", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Keroro Gunsou Taiketsu Gekisou"}, + (struct game_entry){.code = "BG2", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Kessakusen Ganbare Goemon 1 and 2"}, + (struct game_entry){.code = "BYL", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Kid Paddle"}, + (struct game_entry){.code = "B42", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Kidou Senshi Gundam Seed Destiny"}, + (struct game_entry){.code = "AAL", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Kidou Tenshi Angelic Layer - Misaki to Yume no Tenshi-tachi"}, + (struct game_entry){.code = "BCX", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Kid's Cards"}, + (struct game_entry){.code = "XXX", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Kien"}, + (struct game_entry){.code = "AKI", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Kiki KaiKai Advance"}, + (struct game_entry){.code = "BKH", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Kill Switch"}, + (struct game_entry){.code = "B3L", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Killer 3D Pool"}, + (struct game_entry){.code = "AEY", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Kim Possible - Revenge of Monkey Fist"}, + (struct game_entry){.code = "BKM", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Kim Possible 2 - Drakken's Demise"}, + (struct game_entry){.code = "BQP", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Kim Possible 3 - Team Possible"}, + (struct game_entry){.code = "B8C", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Kingdom Hearts - Chain of Memories"}, + (struct game_entry){.code = "AK5", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Kinniku Banzuke - Kimero! Kiseki no Kanzen Seiha"}, + (struct game_entry){.code = "AK4", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Kinniku Banzuke - Kongou-kun no Daibouken!"}, + (struct game_entry){.code = "A7K", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Kirby - Nightmare in Dream Land"}, + (struct game_entry){.code = "B8K", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Kirby & the Amazing Mirror"}, + (struct game_entry){.code = "BWA", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Kisekae Angel Series 1 - Wannyan Aidoru Gakuen"}, + (struct game_entry){.code = "BE2", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Kisekae Angel Series 2 - Charisma Tenin Ikusei Game"}, + (struct game_entry){.code = "A2V", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Kisekko Gurumi - Chesty to Nuigurumi-tachi no Mahou no Bouken"}, + (struct game_entry){.code = "B2K", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Kiss x Kiss - Seirei Gakuen"}, + (struct game_entry){.code = "AKM", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Kiwame Mahjong Deluxe - Mirai Senshi 21"}, + (struct game_entry){.code = "AKL", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Klonoa - Empire of Dreams"}, + (struct game_entry){.code = "AN6", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Klonoa 2 - Dream Champ Tournament"}, + (struct game_entry){.code = "AK7", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Klonoa Heroes - Densetsu no Star Medal"}, + (struct game_entry){.code = "BDI", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Koinu to Issho - Aijou Monogatari"}, + (struct game_entry){.code = "BI2", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Koinu to Issho! 2"}, + (struct game_entry){.code = "BIS", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Koinu-Chan no Hajimete no Osanpo - Koinu no Kokoro Ikusei Game"}, + (struct game_entry){.code = "AKC", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Konami Collector's Series - Arcade Advanced"}, + (struct game_entry){.code = "AKW", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Konami Krazy Racers"}, + (struct game_entry){.code = "BQB", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Konchu Monster Battle Master"}, + (struct game_entry){.code = "BQS", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Konchu Monster Battle Stadium"}, + (struct game_entry){.code = "BQK", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Konchuu no Mori no Daibouken"}, + (struct game_entry){.code = "BK7", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Kong - King of Atlantis"}, + (struct game_entry){.code = "BKQ", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Kong - The 8th Wonder of the World"}, + (struct game_entry){.code = "AKQ", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Kong - The Animated Series"}, + (struct game_entry){.code = "BKE", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Konjiki no Gashbell - The Card Battle for GBA"}, + (struct game_entry){.code = "BKB", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Konjiki no Gashbell!! Makai no Bookmark"}, + (struct game_entry){.code = "BGY", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Konjiki no Gashbell!! Unare Yuujou no Dengeki"}, + (struct game_entry){.code = "BUD", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Konjiki no Gashbell!! Yuujou no Dengeki Dream Tag Tournament"}, + (struct game_entry){.code = "KHP", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Koro Koro Puzzle - Happy Panechu!"}, + (struct game_entry){.code = "BK5", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Korokke Great Toki no Boukensha"}, + (struct game_entry){.code = "A8M", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Kotoba no Puzzle - Mojipittan Advance"}, + (struct game_entry){.code = "BK6", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Kouchu Ouja - Mushi King"}, + (struct game_entry){.code = "A54", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Koukou Juken Advance Series Eigo Koubun Hen - 26 Units Shuuroku"}, + (struct game_entry){.code = "A53", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Koukou Juken Advance Series Eijukugo Hen - 650 Phrases Shuuroku"}, + (struct game_entry){.code = "A52", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Koukou Juken Advance Series Eitango Hen - 2000 Words Shuuroku"}, + (struct game_entry){.code = "B9A", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Kunio kun Nekketsu Collection 1"}, + (struct game_entry){.code = "B9B", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Kunio Kun Nekketsu Collection 2"}, + (struct game_entry){.code = "B9C", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Kuniokun Nekketsu Collection 3"}, + (struct game_entry){.code = "AGO", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Kurohige no Golf Shiyouyo"}, + (struct game_entry){.code = "AKU", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Kurohige no Kurutto Jintori"}, + (struct game_entry){.code = "AKR", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Kurukuru Kururin"}, + (struct game_entry){.code = "A9Q", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Kururin Paradise"}, + (struct game_entry){.code = "ALD", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Lady Sia"}, + (struct game_entry){.code = "AVD", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Legend of Dynamic - Goushouden - Houkai no Rondo"}, + (struct game_entry){.code = "A2L", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Legends of Wrestling II"}, + (struct game_entry){.code = "BLV", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Legendz - Sign of Necrom"}, + (struct game_entry){.code = "BLJ", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Legendz - Yomigaeru Shiren no Shima"}, + (struct game_entry){.code = "ALB", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "LEGO Bionicle"}, + (struct game_entry){.code = "AL2", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "LEGO Island 2 - The Brickster's Revenge"}, + (struct game_entry){.code = "BKN", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "LEGO Knights Kingdom"}, + (struct game_entry){.code = "ALR", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "LEGO Racers 2"}, + (struct game_entry){.code = "BLW", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "LEGO Star Wars - The Video Game"}, + (struct game_entry){.code = "BL7", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "LEGO Star Wars II - The Original Trilogy"}, + (struct game_entry){.code = "BLY", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Lemony Snicket's A Series of Unfortunate Events"}, + (struct game_entry){.code = "BEF", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Let's Ride - Friends Forever"}, + (struct game_entry){.code = "B34", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Let's Ride! - Sunshine Stables"}, + (struct game_entry){.code = "BL9", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Let's Ride! Dreamer"}, + (struct game_entry){.code = "BRN", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Licca-Chan no Oshare Nikki"}, + (struct game_entry){.code = "BRP", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Liliput Oukoku"}, + (struct game_entry){.code = "ALT", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Lilo & Stitch"}, + (struct game_entry){.code = "BLS", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Lilo & Stitch 2 - Hamsterveil Havoc"}, + (struct game_entry){.code = "ALQ", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Little Buster Q"}, + (struct game_entry){.code = "BEI", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Little Einsteins"}, + (struct game_entry){.code = "ALC", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Little League Baseball 2002"}, + (struct game_entry){.code = "BLI", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Little Patissier Cake no Oshiro"}, + (struct game_entry){.code = "BLM", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Lizzie McGuire"}, + (struct game_entry){.code = "BL2", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Lizzie McGuire 2 - Lizzie Diaries"}, + (struct game_entry){.code = "BL4", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Lizzie McGuire 2 - Lizzie Diaries - Special Edition"}, + (struct game_entry){.code = "BL3", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Lizzie McGuire 3 - Homecoming Havoc"}, + (struct game_entry){.code = "A39", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Lode Runner"}, + (struct game_entry){.code = "BLT", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Looney Tunes - Back in Action"}, + (struct game_entry){.code = "BLN", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Looney Tunes Double Pack - Dizzy Driving + Acme Antics"}, + (struct game_entry){.code = "ALH", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Love Hina Advance - Shukufuku no Kane ha Naru Kana"}, + (struct game_entry){.code = "ALL", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Lucky Luke - Wanted!"}, + (struct game_entry){.code = "AGD", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Lufia - The Ruins of Lore"}, + (struct game_entry){.code = "ALN", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Lunar Legend"}, + (struct game_entry){.code = "AML", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "M&M's Blast!"}, + (struct game_entry){.code = "BEM", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "M&M's Break' Em"}, + (struct game_entry){.code = "BGZ", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Madagascar"}, + (struct game_entry){.code = "BM7", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Madagascar - Operation Penguin"}, + (struct game_entry){.code = "B6M", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Madden NFL 06"}, + (struct game_entry){.code = "B7M", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Madden NFL 07"}, + (struct game_entry){.code = "A2M", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Madden NFL 2002"}, + (struct game_entry){.code = "ANJ", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Madden NFL 2003"}, + (struct game_entry){.code = "BMD", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Madden NFL 2004"}, + (struct game_entry){.code = "BMF", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Madden NFL 2005"}, + (struct game_entry){.code = "A2I", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Magi Nation"}, + (struct game_entry){.code = "AJO", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Magical Houshin"}, + (struct game_entry){.code = "AQM", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Magical Quest 2 Starring Mickey & Minnie"}, + (struct game_entry){.code = "BMQ", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Magical Quest 3 Starring Mickey and Donald"}, + (struct game_entry){.code = "A3M", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Magical Quest Starring Mickey & Minnie"}, + (struct game_entry){.code = "AMV", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Magical Vacation"}, + (struct game_entry){.code = "AMP", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Mahjong Police"}, + (struct game_entry){.code = "BNG", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Mahou Sensei Negima"}, + (struct game_entry){.code = "BNM", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Mahou Sensei Negima! Private Lesson 2"}, + (struct game_entry){.code = "AMC", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Mail de Cute"}, + (struct game_entry){.code = "B2Y", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Major League Baseball 2k7"}, + (struct game_entry){.code = "ACO", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Manga-ka Debut Monogatari"}, + (struct game_entry){.code = "A4M", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Manic Miner"}, + (struct game_entry){.code = "B68", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Marble Madness - Klax"}, + (struct game_entry){.code = "BQL", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "March of the Penguins"}, + (struct game_entry){.code = "BM9", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Marheaven - Knockin' on Heaven's Door"}, + (struct game_entry){.code = "ANS", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Marie, Elie & Anis no Atelier - Soyokaze Kara no Dengon"}, + (struct game_entry){.code = "A88", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Mario & Luigi - Superstar Saga"}, + (struct game_entry){.code = "BMG", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Mario Golf - Advance Tour"}, + (struct game_entry){.code = "AMK", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Mario Kart - Super Circuit"}, + (struct game_entry){.code = "B8M", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Mario Party Advance"}, + (struct game_entry){.code = "BMV", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Mario Pinball Land"}, + (struct game_entry){.code = "BTM", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Mario Tennis - Power Tour"}, + (struct game_entry){.code = "BM5", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Mario vs. Donkey Kong"}, + (struct game_entry){.code = "B4M", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Marvel - Ultimate Alliance"}, + (struct game_entry){.code = "AKS", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Mary-Kate and Ashley - Girls Night Out"}, + (struct game_entry){.code = "AAY", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Mary-Kate and Ashley Sweet 16 - Licensed to Drive"}, + (struct game_entry){.code = "AGU", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Masters of the Universe - He-Man Power of Grayskull"}, + (struct game_entry){.code = "AHO", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Mat Hoffman's Pro BMX"}, + (struct game_entry){.code = "AH2", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Mat Hoffman's Pro BMX 2"}, + (struct game_entry){.code = "BMR", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Matantei Loki Ragnarok - Gensou no Labyrinth"}, + (struct game_entry){.code = "ARQ", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Matchbox Cross Town Heroes"}, + (struct game_entry){.code = "BIY", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Math Patrol - The Kleptoid Threat"}, + (struct game_entry){.code = "BME", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Max Payne"}, + (struct game_entry){.code = "BEE", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Maya The Bee - Sweet Gold"}, + (struct game_entry){.code = "ABV", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Maya the Bee - The Great Adventure"}, + (struct game_entry){.code = "BFQ", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Mazes of Fate"}, + (struct game_entry){.code = "AKG", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Mech Platoon"}, + (struct game_entry){.code = "A8B", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Medabots - Metabee Version"}, + (struct game_entry){.code = "A9B", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Medabots - Rokusho Version"}, + (struct game_entry){.code = "AK8", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Medabots AX - Metabee Version"}, + (struct game_entry){.code = "AK9", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Medabots AX - Rokusho Version"}, + (struct game_entry){.code = "BMH", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Medal of Honor - Infiltrator"}, + (struct game_entry){.code = "AUG", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Medal of Honor - Underground"}, + (struct game_entry){.code = "A5K", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Medarot 2 Core - Kabuto Version"}, + (struct game_entry){.code = "A5Q", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Medarot 2 Core - Kuwagata Version"}, + (struct game_entry){.code = "AGH", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Medarot G - Kabuto Version"}, + (struct game_entry){.code = "AGI", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Medarot G - Kuwagata Version"}, + (struct game_entry){.code = "ANA", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Medarot Navi - Kabuto"}, + (struct game_entry){.code = "AVI", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Medarot Navi - Kuwagata"}, + (struct game_entry){.code = "BRH", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Meet the Robinsons"}, + (struct game_entry){.code = "A89", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "MegaMan - Battle Chip Challenge"}, + (struct game_entry){.code = "A6M", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "MegaMan & Bass"}, + (struct game_entry){.code = "ARE", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "MegaMan Battle Network"}, + (struct game_entry){.code = "AE2", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "MegaMan Battle Network 2"}, + (struct game_entry){.code = "AM2", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "MegaMan Battle Network 2"}, + (struct game_entry){.code = "A3X", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "MegaMan Battle Network 3 Blue"}, + (struct game_entry){.code = "A6B", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "MegaMan Battle Network 3 White"}, + (struct game_entry){.code = "B4B", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Megaman Battle Network 4 - Blue Moon"}, + (struct game_entry){.code = "B4W", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "MegaMan Battle Network 4 - Red Sun"}, + (struct game_entry){.code = "BRK", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Megaman Battle Network 5 - Team Colonel"}, + (struct game_entry){.code = "BRB", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Megaman Battle Network 5 - Team Protoman"}, + (struct game_entry){.code = "BR6", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "MegaMan Battle Network 6 - Cybeast Falzar"}, + (struct game_entry){.code = "BR5", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "MegaMan Battle Network 6 - Cybeast Gregar"}, + (struct game_entry){.code = "AZC", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "MegaMan Zero"}, + (struct game_entry){.code = "A62", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "MegaMan Zero 2"}, + (struct game_entry){.code = "BZ3", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Megaman Zero 3"}, + (struct game_entry){.code = "B4Z", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Megaman Zero 4"}, + (struct game_entry){.code = "BQV", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Meine Tierarztpraxis"}, + (struct game_entry){.code = "AC4", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Meitantei Conan - Nerawareta Tantei"}, + (struct game_entry){.code = "BQA", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Meitantei Conan Akatsuki no Monument"}, + (struct game_entry){.code = "AMI", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Men in Black - The Series"}, + (struct game_entry){.code = "B3M", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Mermaid Melody - Pichi Pichi Picchi Pichi Pichitto Live Start"}, + (struct game_entry){.code = "BMA", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Mermaid Melody - Pichi Pichi Pitch"}, + (struct game_entry){.code = "BM8", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Mermaid Melody - Pichi Pichi Pitch Pichi Pichi Party"}, + (struct game_entry){.code = "A9T", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Metal Max 2 - Kai Version"}, + (struct game_entry){.code = "BSM", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Metal Slug Advance"}, + (struct game_entry){.code = "AAP", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Metalgun Slinger"}, + (struct game_entry){.code = "BMX", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Metroid - Zero Mission"}, + (struct game_entry){.code = "AMT", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Metroid Fusion"}, + (struct game_entry){.code = "BMK", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Mezase Koushien"}, + (struct game_entry){.code = "BM3", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Mickey to Donald no Magical Quest 3"}, + (struct game_entry){.code = "A29", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Mickey to Minnie no Magical Quest 2"}, + (struct game_entry){.code = "BM4", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Mickey to Pocket Resort"}, + (struct game_entry){.code = "AXZ", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Micro Machines"}, + (struct game_entry){.code = "AMQ", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Midnight Club - Street Racing"}, + (struct game_entry){.code = "AM3", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Midway's Greatest Arcade Hits"}, + (struct game_entry){.code = "BMB", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Mighty Beanz - Pocket Puzzles"}, + (struct game_entry){.code = "AM6", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Mike Tyson Boxing"}, + (struct game_entry){.code = "AM9", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Mike Tyson Boxing"}, + (struct game_entry){.code = "B62", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Millipede - Super Break Out - Lunar Lander"}, + (struct game_entry){.code = "AOD", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Minami no Umi no Odyssey"}, + (struct game_entry){.code = "AHC", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Minimoni - Mika no Happy Morning Chatty"}, + (struct game_entry){.code = "AOH", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Minimoni - Onegai Ohoshi-sama!"}, + (struct game_entry){.code = "BMJ", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Minna no Mahjong"}, + (struct game_entry){.code = "BMO", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Minna no Ouji-sama"}, + (struct game_entry){.code = "BKK", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Minna no Shiiku Series - Boku no Kabuto-Kuwagata"}, + (struct game_entry){.code = "AB7", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Minna no Shiiku Series 1 - Boku no Kabuto Mushi"}, + (struct game_entry){.code = "AW7", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Minna no Shiiku Series 2 - Boku no Kuwagata"}, + (struct game_entry){.code = "BTL", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Minna no Soft Series - Happy Trump 20"}, + (struct game_entry){.code = "BHY", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Minna no Soft Series - Hyokkori Hyoutan-jima - Don Gabacho Daikatsuyaku no Maki"}, + (struct game_entry){.code = "BSG", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Minna no Soft Series - Minna no Shogi"}, + (struct game_entry){.code = "ARM", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Minority Report"}, + (struct game_entry){.code = "B3I", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Mirakuru! Panzou - 7 Tsuno Hosh no Kaizoku"}, + (struct game_entry){.code = "AIH", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Mission Impossible - Operation Surma"}, + (struct game_entry){.code = "A5M", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "MLB SlugFest 20-04"}, + (struct game_entry){.code = "AMB", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Mobile Pro Yakyuu - Kantoku no Saihai"}, + (struct game_entry){.code = "BGN", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Mobile Suit Gundam Seed - Battle Assault"}, + (struct game_entry){.code = "BJC", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Moero! Jaleco Collection"}, + (struct game_entry){.code = "BM2", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Momotarou Densetsu G Gold Deck wo Tsukure!"}, + (struct game_entry){.code = "AMM", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Momotarou Matsuri"}, + (struct game_entry){.code = "BUM", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Monopoly"}, + (struct game_entry){.code = "AM8", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Monster Force"}, + (struct game_entry){.code = "ANF", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Monster Gate"}, + (struct game_entry){.code = "A6G", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Monster Gate - Ooinaru Dungeon - Fuuin no Orb"}, + (struct game_entry){.code = "AMN", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Monster Guardians"}, + (struct game_entry){.code = "BQ7", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Monster House"}, + (struct game_entry){.code = "AJA", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Monster Jam - Maximum Destruction"}, + (struct game_entry){.code = "AA4", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Monster Maker 4 - Flash Card"}, + (struct game_entry){.code = "AA5", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Monster Maker 4 - Killer Dice"}, + (struct game_entry){.code = "AMF", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Monster Rancher Advance"}, + (struct game_entry){.code = "A2Q", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Monster Rancher Advance 2"}, + (struct game_entry){.code = "A3N", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Monster Summoner"}, + (struct game_entry){.code = "BMT", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Monster Truck Madness"}, + (struct game_entry){.code = "BMC", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Monster Trucks"}, + (struct game_entry){.code = "BYM", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Monster Trucks Mayhem"}, + (struct game_entry){.code = "A4B", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Monster! Bass Fishing"}, + (struct game_entry){.code = "AMX", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Monsters, Inc."}, + (struct game_entry){.code = "AU3", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Moorhen 3 - The Chicken Chase!"}, + (struct game_entry){.code = "AMS", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Morita Shougi Advance"}, + (struct game_entry){.code = "AXD", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Mortal Kombat - Deadly Alliance"}, + (struct game_entry){.code = "AW4", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Mortal Kombat - Tournament Edition"}, + (struct game_entry){.code = "AM5", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Mortal Kombat Advance"}, + (struct game_entry){.code = "A2U", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Mother 1+2"}, + (struct game_entry){.code = "A3U", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Mother 3"}, + (struct game_entry){.code = "AM4", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Moto GP"}, + (struct game_entry){.code = "A9M", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Moto Racer Advance"}, + (struct game_entry){.code = "AMR", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Motocross Maniacs Advance"}, + (struct game_entry){.code = "BR2", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Mr. Driller 2"}, + (struct game_entry){.code = "AD2", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Mr. Driller 2"}, + (struct game_entry){.code = "AD5", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Mr. Driller A - Fushigi na Pacteria"}, + (struct game_entry){.code = "AZR", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Mr. Nutz"}, + (struct game_entry){.code = "BPC", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Ms. Pac-Man - Maze Madness"}, + (struct game_entry){.code = "B6P", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Ms. Pac-Man - Maze Madness + Pac-Man World"}, + (struct game_entry){.code = "BML", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Mucha Lucha - Mascaritas of the Lost Code"}, + (struct game_entry){.code = "AG6", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Mugenborg"}, + (struct game_entry){.code = "AMW", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Muppet Pinball Mayhem"}, + (struct game_entry){.code = "AMU", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Mutsu - Water Looper Mutsu"}, + (struct game_entry){.code = "A2X", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "MX 2002 - Featuring Ricky Carmichael"}, + (struct game_entry){.code = "BFR", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "My Animal Centre in Africa"}, + (struct game_entry){.code = "BL6", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "My Little Pony - Crystal Princess - The Runaway Rainbow"}, + (struct game_entry){.code = "BQT", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "My Pet Hotel"}, + (struct game_entry){.code = "AKP", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Nakayoshi Mahjong - Kaburiichi"}, + (struct game_entry){.code = "AH7", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Nakayoshi Pet Advance Series 1 - Kawaii Hamster"}, + (struct game_entry){.code = "AI7", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Nakayoshi Pet Advance Series 2 - Kawaii Koinu"}, + (struct game_entry){.code = "BKI", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Nakayoshi Pet Advance Series 4 - Kawaii Koinu Mini - Wankoto Asobou!! Kogata-ken"}, + (struct game_entry){.code = "AHV", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Nakayoshi Youchien - Sukoyaka Enji Ikusei Game"}, + (struct game_entry){.code = "ANM", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Namco Museum"}, + (struct game_entry){.code = "B5N", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Namco Museum - 50th Anniversary"}, + (struct game_entry){.code = "AND", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Nancy Drew - Message in a Haunted Mansion"}, + (struct game_entry){.code = "ANP", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Napoleon"}, + (struct game_entry){.code = "AYR", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Narikiri Jockey Game - Yuushun Rhapsody"}, + (struct game_entry){.code = "AUE", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Naruto - Konoha Senki"}, + (struct game_entry){.code = "A7A", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Naruto - Ninja Council"}, + (struct game_entry){.code = "BN2", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Naruto Ninja Council 2"}, + (struct game_entry){.code = "BNR", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Naruto RPG - Uketsugareshi Hi no Ishi"}, + (struct game_entry){.code = "ANH", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "NASCAR Heat 2002"}, + (struct game_entry){.code = "AN2", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Natural 2 - Duo"}, + (struct game_entry){.code = "ABN", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "NBA Jam 2002"}, + (struct game_entry){.code = "BNW", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Need for Speed - Most Wanted"}, + (struct game_entry){.code = "AZF", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Need for Speed - Porsche Unleashed"}, + (struct game_entry){.code = "BNS", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Need for Speed - Underground"}, + (struct game_entry){.code = "BNF", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Need for Speed - Underground 2"}, + (struct game_entry){.code = "BN7", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Need for Speed Carbon - Own the City"}, + (struct game_entry){.code = "ABZ", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "NFL Blitz 20-02"}, + (struct game_entry){.code = "ANK", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "NFL Blitz 20-03"}, + (struct game_entry){.code = "ATX", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "NGT - Next Generation Tennis"}, + (struct game_entry){.code = "ANL", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "NHL 2002"}, + (struct game_entry){.code = "AN4", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "NHL Hitz 20-03"}, + (struct game_entry){.code = "BUJ", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Nicktoons - Attack of the Toybots"}, + (struct game_entry){.code = "BNV", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Nicktoons - Battle for Volcano Island"}, + (struct game_entry){.code = "BCC", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Nicktoons - Freeze Frame Frenzy"}, + (struct game_entry){.code = "ANQ", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Nicktoons Racing"}, + (struct game_entry){.code = "BNU", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Nicktoons Unite!"}, + (struct game_entry){.code = "ANX", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Ninja Five-O"}, + (struct game_entry){.code = "ANT", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Nippon Pro Mahjong Renmei Kounin - Tetsuman Advance"}, + (struct game_entry){.code = "AGP", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "No Rules - Get Phat"}, + (struct game_entry){.code = "ANO", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Nobunaga Ibun"}, + (struct game_entry){.code = "ANB", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Nobunaga no Yabou"}, + (struct game_entry){.code = "BNK", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Noddy - A day in Toyland"}, + (struct game_entry){.code = "BKR", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Nonono Puzzle Chailien"}, + (struct game_entry){.code = "BNY", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Nyan Nyan Nyanko no Nyan Collection"}, + (struct game_entry){.code = "BO2", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Ochainu no Bouken Jima"}, + (struct game_entry){.code = "BIK", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Ochainuken Kururin"}, + (struct game_entry){.code = "BDR", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Ochaken no Heya"}, + (struct game_entry){.code = "BCU", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Ochaken no Yumebouken"}, + (struct game_entry){.code = "BOD", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Oddworld - Munch's Oddysee"}, + (struct game_entry){.code = "A87", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Ohanaya-San Monogatari GBA"}, + (struct game_entry){.code = "BOJ", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Ojarumaru - Gekkouchou Sanpo de Ojaru"}, + (struct game_entry){.code = "AOK", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Okumanchouja Game - Nottori Daisakusen!"}, + (struct game_entry){.code = "BON", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "One Piece"}, + (struct game_entry){.code = "BIP", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "One Piece - Dragon Dream"}, + (struct game_entry){.code = "B08", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "One Piece - Going Baseball"}, + (struct game_entry){.code = "BO8", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "One Piece - Going Baseball Haejeok Yaku"}, + (struct game_entry){.code = "AUS", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "One Piece - Mezase! King of Berries"}, + (struct game_entry){.code = "AO7", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "One Piece - Nanatsu Shima no Daihihou"}, + (struct game_entry){.code = "A6O", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Onimusha Tactics"}, + (struct game_entry){.code = "BIT", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Onmyou Taisenki Zeroshik"}, + (struct game_entry){.code = "BOA", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Open Season"}, + (struct game_entry){.code = "BAA", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Operation Armored Liberty"}, + (struct game_entry){.code = "AOR", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Oriental Blue - Ao no Tengai"}, + (struct game_entry){.code = "AIC", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Oshaberi Inko Club"}, + (struct game_entry){.code = "AOP", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Oshare Princess"}, + (struct game_entry){.code = "AO2", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Oshare Princess 2"}, + (struct game_entry){.code = "BO3", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Oshare Princess 3"}, + (struct game_entry){.code = "BO5", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Oshare Princess 5"}, + (struct game_entry){.code = "A5S", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Oshare Wanko"}, + (struct game_entry){.code = "BOF", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Ottifanten Pinball"}, + (struct game_entry){.code = "BH5", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Over the Hedge"}, + (struct game_entry){.code = "BH7", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Over the Hedge - Hammy Goes Nuts"}, + (struct game_entry){.code = "BOZ", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Ozzy & Drix"}, + (struct game_entry){.code = "APC", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Pac-Man Collection"}, + (struct game_entry){.code = "BP8", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Pac-Man Pinball Advance"}, + (struct game_entry){.code = "BPA", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Pac-Man World"}, + (struct game_entry){.code = "B2C", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Pac-Man World 2"}, + (struct game_entry){.code = "B6B", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Paperboy - Rampage"}, + (struct game_entry){.code = "BBQ", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Pawa Poke Dash"}, + (struct game_entry){.code = "BUR", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Paws & Claws - Pet Resort"}, + (struct game_entry){.code = "BPK", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Payback"}, + (struct game_entry){.code = "BPZ", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Pazunin - Uminin No Puzzle de Nimu"}, + (struct game_entry){.code = "APP", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Peter Pan - Return to Neverland"}, + (struct game_entry){.code = "BPT", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Peter Pan - The Motion Picture Event"}, + (struct game_entry){.code = "AJH", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Petz - Hamsterz Life 2"}, + (struct game_entry){.code = "BNB", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Petz Vet"}, + (struct game_entry){.code = "BPV", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Pferd & Pony - Mein Pferdehof"}, + (struct game_entry){.code = "APX", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Phalanx - The Enforce Fighter A-144"}, + (struct game_entry){.code = "AYC", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Phantasy Star Collection"}, + (struct game_entry){.code = "BFX", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Phil of the Future"}, + (struct game_entry){.code = "BP3", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Pia Carrot he Youkoso!! 3.3"}, + (struct game_entry){.code = "A9N", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Piglet's Big Game"}, + (struct game_entry){.code = "BPN", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Pika Pika Nurse Monogatari - Nurse Ikusei Game"}, + (struct game_entry){.code = "APZ", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Pinball Advance"}, + (struct game_entry){.code = "APL", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Pinball Challenge Deluxe"}, + (struct game_entry){.code = "A2T", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Pinball Tycoon"}, + (struct game_entry){.code = "APE", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Pink Panther - Pinkadelic Pursuit"}, + (struct game_entry){.code = "AP7", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Pink Panther - Pinkadelic Pursuit"}, + (struct game_entry){.code = "API", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Pinky and the Brain - The Masterplan"}, + (struct game_entry){.code = "APN", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Pinky Monkey Town"}, + (struct game_entry){.code = "APB", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Pinobee - Wings of Adventure"}, + (struct game_entry){.code = "AP6", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Pinobee & Phoebee"}, + (struct game_entry){.code = "B8Q", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Pirates of the Caribbean - Dead Man's Chest"}, + (struct game_entry){.code = "A8Q", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Pirates of the Caribbean - The Curse of the Black Pearl"}, + (struct game_entry){.code = "BPH", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Pitfall - The Lost Expedition"}, + (struct game_entry){.code = "APF", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Pitfall - The Mayan Adventure"}, + (struct game_entry){.code = "BQ9", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Pixeline i Pixieland"}, + (struct game_entry){.code = "APM", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Planet Monsters"}, + (struct game_entry){.code = "AYN", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Planet of the Apes"}, + (struct game_entry){.code = "ASH", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Play Novel - Silent Hill"}, + (struct game_entry){.code = "BTD", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Pocket Dogs"}, + (struct game_entry){.code = "AP9", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Pocket Music"}, + (struct game_entry){.code = "BPJ", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Pocket Professor - Kwik Notes Vol. 1"}, + (struct game_entry){.code = "APK", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Pocky & Rocky with Becky"}, + (struct game_entry){.code = "BPE", .storage = BACKUP_FLASH128, .flags = GAME_ENTRY_FLAGS_RTC, .title = "Pokemon - Emerald Version"}, + (struct game_entry){.code = "BPR", .storage = BACKUP_FLASH128, .flags = GAME_ENTRY_FLAGS_RTC, .title = "Pokemon - Fire Red Version"}, + (struct game_entry){.code = "BPG", .storage = BACKUP_FLASH128, .flags = GAME_ENTRY_FLAGS_RTC, .title = "Pokemon - Leaf Green Version"}, + (struct game_entry){.code = "AXV", .storage = BACKUP_FLASH128, .flags = GAME_ENTRY_FLAGS_RTC, .title = "Pokemon - Ruby Version"}, + (struct game_entry){.code = "AXP", .storage = BACKUP_FLASH128, .flags = GAME_ENTRY_FLAGS_RTC, .title = "Pokemon - Sapphire Version"}, + (struct game_entry){.code = "B24", .storage = BACKUP_FLASH128, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Pokemon Mystery Dungeon - Red Rescue Team"}, + (struct game_entry){.code = "BPP", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Pokemon Pinball - Ruby & Sapphire"}, + (struct game_entry){.code = "BII", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Polarium Advance"}, + (struct game_entry){.code = "B3F", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Polly Pocket!"}, + (struct game_entry){.code = "AOT", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Polly! Pocket - Super Splash Island"}, + (struct game_entry){.code = "APO", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Popeye - Rush for Spinach"}, + (struct game_entry){.code = "BRO", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Postman Pat and the Greendale Rocket"}, + (struct game_entry){.code = "B8P", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Power Pro Kun Pocket 1&2"}, + (struct game_entry){.code = "AP3", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Power Pro Kun Pocket 3"}, + (struct game_entry){.code = "AP4", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Power Pro Kun Pocket 4"}, + (struct game_entry){.code = "A5P", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Power Pro Kun Pocket 5"}, + (struct game_entry){.code = "BP6", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Power Pro Kun Pocket 6"}, + (struct game_entry){.code = "BP7", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Power Pro Kun Pocket 7"}, + (struct game_entry){.code = "BPO", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Power Rangers - Dino Thunder"}, + (struct game_entry){.code = "BPW", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Power Rangers - Ninja Storm"}, + (struct game_entry){.code = "BRD", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Power Rangers - S.P.D."}, + (struct game_entry){.code = "APR", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Power Rangers - Time Force"}, + (struct game_entry){.code = "APW", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Power Rangers - Wild Force"}, + (struct game_entry){.code = "APH", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Prehistorik Man"}, + (struct game_entry){.code = "BAQ", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Premier Action Soccer"}, + (struct game_entry){.code = "BPM", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Premier Manager 2003-04"}, + (struct game_entry){.code = "BP4", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Premier Manager 2004 - 2005"}, + (struct game_entry){.code = "BP5", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Premier Manager 2005 - 2006"}, + (struct game_entry){.code = "BPY", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Prince of Persia - The Sands of Time"}, + (struct game_entry){.code = "B2Q", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Prince of Persia - The Sands of Time + Tomb Raider - The Prophecy"}, + (struct game_entry){.code = "BNP", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Princess Natasha - Student Secret Agent"}, + (struct game_entry){.code = "B2O", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Pro Mahjong - Tsuwamono GBA"}, + (struct game_entry){.code = "ALM", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Pro Yakyuu Team wo Tsukurou! Advance"}, + (struct game_entry){.code = "APU", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "PukuPuku Tennen Kairanban"}, + (struct game_entry){.code = "BPQ", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "PukuPuku Tennen Kairanban - Koi no Cupid Daisakusen"}, + (struct game_entry){.code = "B3P", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Pukupuku Tennen Kairanban Youkoso Illusion Land"}, + (struct game_entry){.code = "APG", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Punch King - Arcade Boxing"}, + (struct game_entry){.code = "BYX", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Puppy Luv - Spa and Resort"}, + (struct game_entry){.code = "APY", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Puyo Pop"}, + (struct game_entry){.code = "BPF", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Puyo Pop Fever"}, + (struct game_entry){.code = "AEH", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Puzzle & Tantei Collection"}, + (struct game_entry){.code = "BPB", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Pyuu to Fuku! Jaguar - Byo to Deru! Megane Kun"}, + (struct game_entry){.code = "BQD", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Quad Desert Fury"}, + (struct game_entry){.code = "BRW", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Racing Fever"}, + (struct game_entry){.code = "BRA", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Racing Gears Advance"}, + (struct game_entry){.code = "ARX", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Rampage - Puzzle Attack"}, + (struct game_entry){.code = "BRF", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Rapala Pro Fishing"}, + (struct game_entry){.code = "BNL", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Ratatouille"}, + (struct game_entry){.code = "BRM", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Rave Master - Special Attack Force"}, + (struct game_entry){.code = "BX5", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Rayman - 10th Anniversary"}, + (struct game_entry){.code = "BRY", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Rayman - Hoodlum's Revenge"}, + (struct game_entry){.code = "BQ3", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Rayman - Raving Rabbids"}, + (struct game_entry){.code = "AYZ", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Rayman 3"}, + (struct game_entry){.code = "ARY", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Rayman Advance"}, + (struct game_entry){.code = "ARF", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Razor Freestyle Scooter"}, + (struct game_entry){.code = "AR2", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Ready 2 Rumble Boxing - Round 2"}, + (struct game_entry){.code = "BRL", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Rebelstar - Tactical Command"}, + (struct game_entry){.code = "ARH", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Recca no Honoo - The Game"}, + (struct game_entry){.code = "AR9", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Reign of Fire"}, + (struct game_entry){.code = "BR9", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Relaxuma na Mainichi"}, + (struct game_entry){.code = "AQH", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Rescue Heroes - Billy Blazes!"}, + (struct game_entry){.code = "BRI", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Rhythm Tengoku"}, + (struct game_entry){.code = "B66", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Risk - Battleship - Clue"}, + (struct game_entry){.code = "BDT", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "River City Ransom EX"}, + (struct game_entry){.code = "BRE", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Riviera - The Promised Land"}, + (struct game_entry){.code = "A9R", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Road Rash - Jailbreak"}, + (struct game_entry){.code = "ACV", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Robopon 2 - Cross Version"}, + (struct game_entry){.code = "ARP", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Robopon 2 - Ring Version"}, + (struct game_entry){.code = "ARU", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Robot Wars - Advanced Destruction"}, + (struct game_entry){.code = "ARW", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Robot Wars - Advanced Destruction"}, + (struct game_entry){.code = "ARS", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Robot Wars - Extreme Destruction"}, + (struct game_entry){.code = "ARB", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Robotech - The Macross Saga"}, + (struct game_entry){.code = "BRT", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Robots"}, + (struct game_entry){.code = "BR7", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Rock 'Em Sock 'Em Robots"}, + (struct game_entry){.code = "A4R", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Rock N' Roll Racing"}, + (struct game_entry){.code = "AR4", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Rocket Power - Beach Bandits"}, + (struct game_entry){.code = "ARK", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Rocket Power - Dream Scheme"}, + (struct game_entry){.code = "AZZ", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Rocket Power - Zero Gravity Zone"}, + (struct game_entry){.code = "AFC", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "RockMan & Forte"}, + (struct game_entry){.code = "BR4", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_RTC, .title = "Rockman EXE 4.5 - Real Operation"}, + (struct game_entry){.code = "ARZ", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "RockMan Zero"}, + (struct game_entry){.code = "AR8", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Rocky"}, + (struct game_entry){.code = "ARO", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Rocky"}, + (struct game_entry){.code = "A8T", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "RPG Tsukuru Advance"}, + (struct game_entry){.code = "BR3", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "R-Type III"}, + (struct game_entry){.code = "ARG", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Rugrats - Castle Capers"}, + (struct game_entry){.code = "A5W", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Rugrats - Go Wild"}, + (struct game_entry){.code = "AR5", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Rugrats - I Gotta Go Party"}, + (struct game_entry){.code = "AWU", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Sabre Wulf"}, + (struct game_entry){.code = "A3B", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Sabrina - The Teenage Witch - Potion Commotion"}, + (struct game_entry){.code = "ASM", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Saibara Rieko no Dendou Mahjong"}, + (struct game_entry){.code = "ACL", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Sakura Momoko no UkiUki Carnival"}, + (struct game_entry){.code = "AS5", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Salt Lake 2002"}, + (struct game_entry){.code = "AWG", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Salt Lake 2002"}, + (struct game_entry){.code = "AOS", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Samurai Deeper Kyo"}, + (struct game_entry){.code = "AEC", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Samurai Evolution - Oukoku Geist"}, + (struct game_entry){.code = "AJT", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Samurai Jack - The Amulet of Time"}, + (struct game_entry){.code = "ASX", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "San Goku Shi"}, + (struct game_entry){.code = "B3E", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "San Goku Shi Eiketsuden"}, + (struct game_entry){.code = "B3Q", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "San Goku Shi Koumeiden"}, + (struct game_entry){.code = "A85", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Sanrio Puroland All Characters"}, + (struct game_entry){.code = "ASN", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Sansara Naga 1x2"}, + (struct game_entry){.code = "AXX", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Santa Claus Jr. Advance"}, + (struct game_entry){.code = "AUZ", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Santa Claus Saves the Earth"}, + (struct game_entry){.code = "A57", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Scan Hunter - Sennen Kaigyo wo Oe!"}, + (struct game_entry){.code = "AP8", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Scooby-Doo - The Motion Picture"}, + (struct game_entry){.code = "BMU", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Scooby-Doo 2 - Monsters Unleashed"}, + (struct game_entry){.code = "ASD", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Scooby-Doo and the Cyber Chase"}, + (struct game_entry){.code = "BMM", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Scooby-Doo! - Mystery Mayhem"}, + (struct game_entry){.code = "B25", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Scooby-Doo! - Unmasked"}, + (struct game_entry){.code = "AQB", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Scrabble"}, + (struct game_entry){.code = "BLA", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Scrabble Blast!"}, + (struct game_entry){.code = "BHV", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Scurge - Hive"}, + (struct game_entry){.code = "BGE", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "SD Gundam Force"}, + (struct game_entry){.code = "BG4", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "SD Gundam Force"}, + (struct game_entry){.code = "BGA", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "SD Gundam G Generation"}, + (struct game_entry){.code = "ALJ", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Sea Trader - Rise of Taipan"}, + (struct game_entry){.code = "AAH", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Secret Agent Barbie - Royal Jewels Mission"}, + (struct game_entry){.code = "AYP", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Sega Arcade Gallery"}, + (struct game_entry){.code = "AYL", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Sega Rally Championship"}, + (struct game_entry){.code = "A3P", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Sega Smash Pack"}, + (struct game_entry){.code = "A7G", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Sengoku Kakumei Gaiden"}, + (struct game_entry){.code = "BKA", .storage = BACKUP_FLASH128, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Sennen Kazoku"}, + (struct game_entry){.code = "BSY", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Sentouin - Yamada Hajime"}, + (struct game_entry){.code = "AEN", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Serious Sam Advance"}, + (struct game_entry){.code = "BHL", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Shaman King - Legacy of the Spirits - Soaring Hawk"}, + (struct game_entry){.code = "BWS", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Shaman King - Legacy of the Spirits - Sprinting Wolf"}, + (struct game_entry){.code = "BSO", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Shaman King - Master of Spirits"}, + (struct game_entry){.code = "AKA", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Shaman King Card Game - Chou Senjiryakketsu 2"}, + (struct game_entry){.code = "AL3", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Shaman King Card Game - Chou Senjiryakketsu 3"}, + (struct game_entry){.code = "BBA", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Shamu's Deep Sea Adventures"}, + (struct game_entry){.code = "BSH", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Shanghai"}, + (struct game_entry){.code = "ASV", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Shanghai Advance"}, + (struct game_entry){.code = "BSU", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Shark Tale"}, + (struct game_entry){.code = "B9T", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Shark Tale"}, + (struct game_entry){.code = "ASC", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Shaun Palmer's Pro Snowboarder"}, + (struct game_entry){.code = "AEP", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Sheep"}, + (struct game_entry){.code = "A6R", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Shifting Gears - Road Trip"}, + (struct game_entry){.code = "B4K", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Shikakui Atama wo Marukusuru Advance - Kanji Keisan"}, + (struct game_entry){.code = "B4R", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Shikakui Atama wo Marukusuru Advance - Kokugo Sansu Rika Shakai"}, + (struct game_entry){.code = "A64", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Shimura Ken no Baka Tonosama"}, + (struct game_entry){.code = "U33", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Shin Bokura no Taiyou - Gyakushuu no Sabata"}, + (struct game_entry){.code = "AAU", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Shin Megami Tensei"}, + (struct game_entry){.code = "BDL", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Shin Megami Tensei - Devil Children Messiah Riser"}, + (struct game_entry){.code = "A5T", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Shin Megami Tensei 2"}, + (struct game_entry){.code = "BDH", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Shin Megami Tensei Devil Children - Honoo no Sho"}, + (struct game_entry){.code = "BDY", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Shin Megami Tensei Devil Children - Koori no Sho"}, + (struct game_entry){.code = "A8Z", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Shin Megami Tensei Devil Children - Puzzle de Call!"}, + (struct game_entry){.code = "ARA", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Shin Nippon Pro Wrestling Toukon Retsuden Advance"}, + (struct game_entry){.code = "BKV", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Shingata Medarot - Kabuto Version"}, + (struct game_entry){.code = "BKU", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Shingata Medarot - Kuwagata Version"}, + (struct game_entry){.code = "AF5", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Shining Force - Resurrection of the Dark Dragon"}, + (struct game_entry){.code = "AHU", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Shining Soul"}, + (struct game_entry){.code = "AU2", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Shining Soul II"}, + (struct game_entry){.code = "ANV", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Shiren Monsters - Netsal"}, + (struct game_entry){.code = "B2M", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Shonen Jump's Shaman King - Master of Spirits 2"}, + (struct game_entry){.code = "AH4", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Shrek - Hassle at the Castle"}, + (struct game_entry){.code = "AOI", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Shrek - Reekin' Havoc"}, + (struct game_entry){.code = "B4I", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Shrek - Smash n' Crash Racing"}, + (struct game_entry){.code = "B4U", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Shrek - Super Slam"}, + (struct game_entry){.code = "AS4", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Shrek - Swamp Kart Speedway"}, + (struct game_entry){.code = "BSE", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Shrek 2"}, + (struct game_entry){.code = "BSI", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Shrek 2 - Beg for Mercy"}, + (struct game_entry){.code = "B3H", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Shrek the Third"}, + (struct game_entry){.code = "B3G", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Sigma Star Saga"}, + (struct game_entry){.code = "AIP", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Silent Scope"}, + (struct game_entry){.code = "A7I", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Silk to Cotton"}, + (struct game_entry){.code = "A5C", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Sim City 2000"}, + (struct game_entry){.code = "AZK", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Simple 2960 Tomodachi Series Vol. 1 - The Table Game Collection"}, + (struct game_entry){.code = "AZ9", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Simple 2960 Tomodachi Series Vol. 2 - The Block Kuzushi"}, + (struct game_entry){.code = "BS3", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Simple 2960 Tomodachi Series Vol. 3 - The Itsudemo Puzzle"}, + (struct game_entry){.code = "BS4", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Simple 2960 Tomodachi Series Vol. 4 - The Trump"}, + (struct game_entry){.code = "AAJ", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Sin Kisekae Monogatari"}, + (struct game_entry){.code = "A4P", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Sister Princess - RePure"}, + (struct game_entry){.code = "BSD", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Sitting Ducks"}, + (struct game_entry){.code = "B4D", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Sky Dancers - They Magically Fly!"}, + (struct game_entry){.code = "A9K", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Slime Morimori Dragon Quest - Shougeki no Shippo Dan"}, + (struct game_entry){.code = "ATB", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Slot! Pro 2 Advance - GoGo Juggler & New Tairyou"}, + (struct game_entry){.code = "ASF", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Slot! Pro Advance - Takarabune & Ooedo Sakurafubuki 2"}, + (struct game_entry){.code = "BSV", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Smashing Drive"}, + (struct game_entry){.code = "ASG", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Smuggler's Run"}, + (struct game_entry){.code = "AEA", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Snap Kid's"}, + (struct game_entry){.code = "ASQ", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Snood"}, + (struct game_entry){.code = "B2V", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Snood 2 - On Vacation"}, + (struct game_entry){.code = "AK6", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Soccer Kid"}, + (struct game_entry){.code = "ALS", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Soccer Mania"}, + (struct game_entry){.code = "ASO", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Sonic Advance"}, + (struct game_entry){.code = "A2N", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Sonic Advance 2"}, + (struct game_entry){.code = "B3S", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Sonic Advance 3"}, + (struct game_entry){.code = "BSB", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Sonic Battle"}, + (struct game_entry){.code = "A3V", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Sonic Pinball Party"}, + (struct game_entry){.code = "A86", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Sonic Pinball Party"}, + (struct game_entry){.code = "BIJ", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Sonic The Hedgehog - Genesis"}, + (struct game_entry){.code = "B67", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Sorry! - Aggravation - Scrabble Junior"}, + (struct game_entry){.code = "A5U", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Space Channel 5 - Ulala's Cosmic Attack"}, + (struct game_entry){.code = "AJS", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Space Hexcite - Maetel Legend EX"}, + (struct game_entry){.code = "AID", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Space Invaders"}, + (struct game_entry){.code = "AS6", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Speedball 2 - Brutal Deluxe"}, + (struct game_entry){.code = "AKX", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Spider-Man"}, + (struct game_entry){.code = "BC9", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Spider-Man - Battle For New York"}, + (struct game_entry){.code = "ASE", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Spider-Man - Mysterio's Menace"}, + (struct game_entry){.code = "BSP", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Spider-Man 2"}, + (struct game_entry){.code = "BI3", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Spider-Man 3"}, + (struct game_entry){.code = "AC6", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Spirit - Stallion of the Cimarron"}, + (struct game_entry){.code = "AWN", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Spirit & Spells"}, + (struct game_entry){.code = "BSQ", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "SpongeBob SquarePants - Battle for Bikini Bottom"}, + (struct game_entry){.code = "BQ4", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "SpongeBob SquarePants - Creature from the Krusty Krab"}, + (struct game_entry){.code = "BQQ", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "SpongeBob SquarePants - Lights, Camera, Pants!"}, + (struct game_entry){.code = "AQ3", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "SpongeBob SquarePants - Revenge of the Flying Dutchman"}, + (struct game_entry){.code = "ASP", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "SpongeBob SquarePants - SuperSponge"}, + (struct game_entry){.code = "BZX", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "SpongeBob's Atlantis Squarepantis"}, + (struct game_entry){.code = "AKB", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Sports Illustrated for Kids - Baseball"}, + (struct game_entry){.code = "AKF", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Sports Illustrated for Kids - Football"}, + (struct game_entry){.code = "B23", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Sportsman's Pack - Cabela's Big Game Hunter + Rapala Pro Fishing"}, + (struct game_entry){.code = "B6A", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Spy Hunter - Super Sprint"}, + (struct game_entry){.code = "AV3", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Spy Kids 3-D - Game Over"}, + (struct game_entry){.code = "A2K", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Spy Kids Challenger"}, + (struct game_entry){.code = "BSS", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Spy Muppets - License to Croak"}, + (struct game_entry){.code = "AHN", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "SpyHunter"}, + (struct game_entry){.code = "AOW", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Spyro - Attack of the Rhynocs"}, + (struct game_entry){.code = "ASY", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Spyro - Season of Ice"}, + (struct game_entry){.code = "A2S", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Spyro 2 - Season of Flame"}, + (struct game_entry){.code = "A4S", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Spyro Advance"}, + (struct game_entry){.code = "BS8", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Spyro Advance - Wakuwaku Tomodachi"}, + (struct game_entry){.code = "BST", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Spyro Orange - The Cortex Conspiracy"}, + (struct game_entry){.code = "B8S", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Spyro Superpack - Season of Ice + Season of Flame"}, + (struct game_entry){.code = "BSX", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "SSX 3"}, + (struct game_entry){.code = "AXY", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "SSX Tricky"}, + (struct game_entry){.code = "A9G", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Stadium Games"}, + (struct game_entry){.code = "BSW", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Star Wars - Flight of the Falcon"}, + (struct game_entry){.code = "ASW", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Star Wars - Jedi Power Battles"}, + (struct game_entry){.code = "A2W", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Star Wars - The New Droid Army"}, + (struct game_entry){.code = "AS2", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Star Wars Episode II - Attack of the Clones"}, + (struct game_entry){.code = "BE3", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Star Wars Episode III - Revenge of the Sith"}, + (struct game_entry){.code = "BCK", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Star Wars Trilogy - Apprentice of the Force"}, + (struct game_entry){.code = "AS8", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Star X"}, + (struct game_entry){.code = "AYH", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Starsky & Hutch"}, + (struct game_entry){.code = "BKT", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Steel Empire"}, + (struct game_entry){.code = "ATU", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Steven Gerrard's Total Soccer 2002"}, + (struct game_entry){.code = "B35", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Strawberry Shortcake - Summertime Adventure"}, + (struct game_entry){.code = "BQW", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Strawberry Shortcake - Summertime Adventure - Special Edition"}, + (struct game_entry){.code = "B4T", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Strawberry Shortcake - Sweet Dreams"}, + (struct game_entry){.code = "AZU", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Street Fighter Alpha 3 - Upper"}, + (struct game_entry){.code = "A3Z", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Street Jam Basketball"}, + (struct game_entry){.code = "BCZ", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Street Racing Syndicate"}, + (struct game_entry){.code = "AFH", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Strike Force Hydra"}, + (struct game_entry){.code = "ASL", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Stuart Little 2"}, + (struct game_entry){.code = "AUX", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Stuntman"}, + (struct game_entry){.code = "B4L", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Sugar Sugar Une - Heart Gaippai! Moegi Gakuen"}, + (struct game_entry){.code = "AB4", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Summon Night - Swordcraft Story"}, + (struct game_entry){.code = "BSK", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Summon Night - Swordcraft Story 2"}, + (struct game_entry){.code = "B3C", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Summon Night Craft Sword Monogatari - Hajimari no Ishi"}, + (struct game_entry){.code = "BG6", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Super Army War"}, + (struct game_entry){.code = "AVZ", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Super Bubble Pop"}, + (struct game_entry){.code = "ABM", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Super Bust-A-Move"}, + (struct game_entry){.code = "BSA", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Super Chinese 1 - 2 Advance"}, + (struct game_entry){.code = "BCL", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Super Collapse! II"}, + (struct game_entry){.code = "ADF", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Super Dodge Ball Advance"}, + (struct game_entry){.code = "BDP", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Super Duper Sumos"}, + (struct game_entry){.code = "AG5", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Super Ghouls 'N Ghosts"}, + (struct game_entry){.code = "BF8", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Super Hornet FA 18F"}, + (struct game_entry){.code = "AMA", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Super Mario Advance"}, + (struct game_entry){.code = "AMZ", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Super Mario Advance (Kiosk Demo)"}, + (struct game_entry){.code = "AX4", .storage = BACKUP_FLASH128, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Super Mario Advance 4 - Super Mario Bros. 3"}, + (struct game_entry){.code = "AA2", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Super Mario World - Super Mario Advance 2"}, + (struct game_entry){.code = "ALU", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Super Monkey Ball Jr."}, + (struct game_entry){.code = "AZ8", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Super Puzzle Fighter II Turbo"}, + (struct game_entry){.code = "BDM", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Super Real Mahjong Dousoukai"}, + (struct game_entry){.code = "AOG", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Super Robot Taisen - Original Generation"}, + (struct game_entry){.code = "B2R", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Super Robot Taisen - Original Generation 2"}, + (struct game_entry){.code = "ASR", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Super Robot Taisen A"}, + (struct game_entry){.code = "A6S", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Super Robot Taisen D"}, + (struct game_entry){.code = "B6J", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Super Robot Taisen J"}, + (struct game_entry){.code = "AJ9", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Super Robot Taisen R"}, + (struct game_entry){.code = "AXR", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Super Street Fighter II Turbo - Revival"}, + (struct game_entry){.code = "ASU", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Superman - Countdown to Apokolips"}, + (struct game_entry){.code = "BQX", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Superman Returns - Fortress of Solitude"}, + (struct game_entry){.code = "BXU", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Surf's Up"}, + (struct game_entry){.code = "ASK", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Sutakomi - Star Communicator"}, + (struct game_entry){.code = "ABG", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Sweet Cookie Pie"}, + (struct game_entry){.code = "AVS", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Sword of Mana"}, + (struct game_entry){.code = "BSF", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Sylvania Family - Fashion Designer ni Naritai"}, + (struct game_entry){.code = "A4L", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Sylvania Family 4 - Meguru Kisetsu no Tapestry"}, + (struct game_entry){.code = "BS5", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Sylvanian Family - Yousei no Stick to Fushigi no Ki"}, + (struct game_entry){.code = "ATO", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Tactics Ogre - The Knight of Lodis"}, + (struct game_entry){.code = "BU6", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Taiketsu! Ultra Hero"}, + (struct game_entry){.code = "BJW", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Tak - The Great Juju Challenge"}, + (struct game_entry){.code = "BT9", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Tak 2 - The Staff of Dreams"}, + (struct game_entry){.code = "BJU", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Tak and the Power of Juju"}, + (struct game_entry){.code = "AN8", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Tales of Phantasia"}, + (struct game_entry){.code = "AN9", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Tales of the World - Narikiri Dungeon 2"}, + (struct game_entry){.code = "B3T", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Tales of the World - Narikiri Dungeon 3"}, + (struct game_entry){.code = "A9P", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Tales of the World - Summoner's Lineage"}, + (struct game_entry){.code = "AYM", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Tanbi Musou - Meine Liebe"}, + (struct game_entry){.code = "ATA", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Tang Tang"}, + (struct game_entry){.code = "BTI", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Tantei Gakuen Q - Kyukyoku Trick ni Idome!"}, + (struct game_entry){.code = "BTQ", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Tantei Gakuen Q - Meitantei ha Kimi da!"}, + (struct game_entry){.code = "BT3", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Tantei Jinguuji Saburou Shiroi Kage no Syoujyo"}, + (struct game_entry){.code = "AJG", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Tarzan - Return to the Jungle"}, + (struct game_entry){.code = "AXQ", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Taxi 3"}, + (struct game_entry){.code = "BBL", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Teen Titans"}, + (struct game_entry){.code = "BZU", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Teen Titans 2"}, + (struct game_entry){.code = "BNT", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Teenage Mutant Ninja Turtles"}, + (struct game_entry){.code = "BT2", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Teenage Mutant Ninja Turtles 2 - Battlenexus"}, + (struct game_entry){.code = "BT8", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Teenage Mutant Ninja Turtles Double Pack"}, + (struct game_entry){.code = "ATK", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Tekken Advance"}, + (struct game_entry){.code = "BTP", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Ten Pin Alley 2"}, + (struct game_entry){.code = "AT8", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Tennis Masters Series 2003"}, + (struct game_entry){.code = "AVA", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Tennis no Ouji-sama - Aim at the Victory!"}, + (struct game_entry){.code = "ATI", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Tennis no Ouji-sama - Genius Boys Academy"}, + (struct game_entry){.code = "A9L", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Tennis no Ouji-sama 2003 - Cool Blue"}, + (struct game_entry){.code = "A8R", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Tennis no Ouji-sama 2003 - Passion Red"}, + (struct game_entry){.code = "B4G", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Tennis no Ouji-sama 2004 - Glorious Gold"}, + (struct game_entry){.code = "B4S", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Tennis no Ouji-sama 2004 - Stylish Silver"}, + (struct game_entry){.code = "AO3", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Terminator 3 - Rise of the Machines"}, + (struct game_entry){.code = "BTT", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Tetris Advance"}, + (struct game_entry){.code = "ATW", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Tetris Worlds"}, + (struct game_entry){.code = "BXA", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Texas Hold 'Em Poker"}, + (struct game_entry){.code = "BRV", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "That's So Raven"}, + (struct game_entry){.code = "BZS", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Thats So Raven 2 - Supernatural Style"}, + (struct game_entry){.code = "BJN", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Adventures of Jimmy Neutron - Boy Genius - Jet Fusion"}, + (struct game_entry){.code = "AJX", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Adventures of Jimmy Neutron vs Jimmy Negatron"}, + (struct game_entry){.code = "A7M", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Amazing Virtual Sea Monkeys"}, + (struct game_entry){.code = "BUY", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Ant Bully"}, + (struct game_entry){.code = "BBI", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Barbie Diaries - High School Mystery"}, + (struct game_entry){.code = "BKF", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Bee Game"}, + (struct game_entry){.code = "BBO", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Berenstain Bears - And the Spooky Old Tree"}, + (struct game_entry){.code = "BCT", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Cat in the Hat by Dr. Seuss"}, + (struct game_entry){.code = "BCQ", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Cheetah Girls"}, + (struct game_entry){.code = "B2W", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Chronicles of Narnia - The Lion, the Witch and the Wardrobe"}, + (struct game_entry){.code = "AF6", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Fairly Odd Parents! - Breakin' da Rules"}, + (struct game_entry){.code = "BFO", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Fairly Odd Parents! - Clash with the Anti-World"}, + (struct game_entry){.code = "AFV", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Fairly Odd Parents! - Enter the Cleft"}, + (struct game_entry){.code = "BF2", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Fairly Odd Parents! - Shadow Showdown"}, + (struct game_entry){.code = "AFS", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Flintstones - Big Trouble in Bedrock"}, + (struct game_entry){.code = "BIE", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Grim - Adventures of Billy and Mandy"}, + (struct game_entry){.code = "ALI", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Haunted Mansion"}, + (struct game_entry){.code = "AH9", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Hobbit"}, + (struct game_entry){.code = "AHL", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Incredible Hulk"}, + (struct game_entry){.code = "BIC", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Incredibles"}, + (struct game_entry){.code = "BIQ", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Incredibles - Rise of the Underminer"}, + (struct game_entry){.code = "AIO", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Invincible Iron Man"}, + (struct game_entry){.code = "AJF", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Jungle Book"}, + (struct game_entry){.code = "AKO", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The King of Fighters EX - Neo Blood"}, + (struct game_entry){.code = "AEX", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The King of Fighters EX2 - Howling Blood"}, + (struct game_entry){.code = "BAK", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Koala Brothers - Outback Adventures"}, + (struct game_entry){.code = "ALA", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Land Before Time"}, + (struct game_entry){.code = "BLO", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Land Before Time - Into the Mysterious Beyond"}, + (struct game_entry){.code = "B3Y", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "The Legend of Spyro - A New Beginning"}, + (struct game_entry){.code = "BU7", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Legend of Spyro - The Eternal Night"}, + (struct game_entry){.code = "AZL", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "The Legend of Zelda - A Link to the Past & Four Swords"}, + (struct game_entry){.code = "BZM", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "The Legend of Zelda - The Minish Cap"}, + (struct game_entry){.code = "BLK", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Lion King 1.5"}, + (struct game_entry){.code = "BN9", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Little Mermaid - Magic in Two Kingdoms"}, + (struct game_entry){.code = "ALO", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "The Lord of the Rings - The Fellowship of the Ring"}, + (struct game_entry){.code = "BLR", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Lord of the Rings - The Return of the King"}, + (struct game_entry){.code = "B3A", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "The Lord of the Rings - The Third Age"}, + (struct game_entry){.code = "ALP", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Lord of the Rings - The Two Towers"}, + (struct game_entry){.code = "ALV", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Lost Vikings"}, + (struct game_entry){.code = "AUM", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Mummy"}, + (struct game_entry){.code = "AZM", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Muppets - On With the Show!"}, + (struct game_entry){.code = "APD", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Pinball of the Dead"}, + (struct game_entry){.code = "AZO", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Pinball of the Dead"}, + (struct game_entry){.code = "BPX", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Polar Express"}, + (struct game_entry){.code = "AP5", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Powerpuff Girls - Him and Seek"}, + (struct game_entry){.code = "APT", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Powerpuff Girls - Mojo Jojo A-Go-Go"}, + (struct game_entry){.code = "BD7", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Proud Family"}, + (struct game_entry){.code = "A3R", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Revenge of Shinobi"}, + (struct game_entry){.code = "ARD", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Ripping Friends"}, + (struct game_entry){.code = "B33", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Santa Clause 3 - The Escape Clause"}, + (struct game_entry){.code = "ASZ", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Scorpion King - Sword of Osiris"}, + (struct game_entry){.code = "A4A", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Simpsons - Road Rage"}, + (struct game_entry){.code = "B4P", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "The Sims"}, + (struct game_entry){.code = "ASI", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "The Sims - Bustin' Out"}, + (struct game_entry){.code = "B46", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Sims 2"}, + (struct game_entry){.code = "B4O", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Sims 2 - Pets"}, + (struct game_entry){.code = "A7S", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Smurfs - The Revenge of the Smurfs"}, + (struct game_entry){.code = "BSN", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The SpongeBob SquarePants Movie"}, + (struct game_entry){.code = "BZC", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Suite Life of Zack & Cody - Tipton Trouble"}, + (struct game_entry){.code = "AA6", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Sum of All Fears"}, + (struct game_entry){.code = "A3T", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Three Stooges"}, + (struct game_entry){.code = "BTR", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Tower SP"}, + (struct game_entry){.code = "BOC", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Urbz - Sims in the City"}, + (struct game_entry){.code = "BWL", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Wild"}, + (struct game_entry){.code = "AWT", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Wild Thornberrys - Chimp Chase"}, + (struct game_entry){.code = "AWL", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "The Wild Thornberrys Movie"}, + (struct game_entry){.code = "BTH", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Thunder Alley"}, + (struct game_entry){.code = "BTB", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Thunderbirds"}, + (struct game_entry){.code = "ATN", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Thunderbirds - International Rescue"}, + (struct game_entry){.code = "BTW", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Tiger Woods PGA Tour 2004"}, + (struct game_entry){.code = "AT5", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Tiger Woods PGA Tour Golf"}, + (struct game_entry){.code = "BNC", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Tim Burton's The Nightmare Before Christmas - The Pumpkin King"}, + (struct game_entry){.code = "ATT", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Tiny Toon Adventures - Scary Dreams"}, + (struct game_entry){.code = "AWS", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Tiny Toon Adventures - Wacky Stackers"}, + (struct game_entry){.code = "ATV", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Tir et But - Edition Champions du Monde"}, + (struct game_entry){.code = "BTC", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Titeuf - Mega-Compet"}, + (struct game_entry){.code = "BEX", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "TMNT"}, + (struct game_entry){.code = "ATQ", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "TOCA World Touring Cars"}, + (struct game_entry){.code = "AF7", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Tokimeki Yume Series 1 - Ohanaya-san ni Narou!"}, + (struct game_entry){.code = "BTF", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Tokyo Majin Gakuen - Fuju Houroku"}, + (struct game_entry){.code = "BTZ", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Tokyo Xtreme Racer Advance"}, + (struct game_entry){.code = "ATJ", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Tom and Jerry - The Magic Ring"}, + (struct game_entry){.code = "AIF", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Tom and Jerry in Infurnal Escape"}, + (struct game_entry){.code = "BJT", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Tom and Jerry Tales"}, + (struct game_entry){.code = "AR6", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Tom Clancy's Rainbow Six - Rogue Spear"}, + (struct game_entry){.code = "AO4", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Tom Clancy's Splinter Cell"}, + (struct game_entry){.code = "BSL", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Tom Clancy's Splinter Cell - Pandora Tomorrow"}, + (struct game_entry){.code = "AGL", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Tomato Adventure"}, + (struct game_entry){.code = "BL8", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Tomb Raider - Legend"}, + (struct game_entry){.code = "AL9", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Tomb Raider - The Prophecy"}, + (struct game_entry){.code = "AUT", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Tomb Raider - The Prophecy"}, + (struct game_entry){.code = "OPL", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Tomb Raider (OpenLara)"}, + (struct game_entry){.code = "BT7", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Tonka - On the Job"}, + (struct game_entry){.code = "BH9", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Tony Hawk's American Sk8land"}, + (struct game_entry){.code = "BXS", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Tony Hawk's Downhill Jam"}, + (struct game_entry){.code = "ATH", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Tony Hawk's Pro Skater 2"}, + (struct game_entry){.code = "AT3", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Tony Hawk's Pro Skater 3"}, + (struct game_entry){.code = "AT6", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Tony Hawk's Pro Skater 4"}, + (struct game_entry){.code = "BTO", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Tony Hawk's Underground"}, + (struct game_entry){.code = "B2T", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Tony Hawk's Underground 2"}, + (struct game_entry){.code = "AT7", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Tootuff - The Gagmachine"}, + (struct game_entry){.code = "A2Y", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Top Gun - Combat Zones"}, + (struct game_entry){.code = "ATG", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Top Gun - Firestorm Advance"}, + (struct game_entry){.code = "B27", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Top Spin 2"}, + (struct game_entry){.code = "ATC", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "TopGear GT Championship"}, + (struct game_entry){.code = "BTG", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "TopGear Rally"}, + (struct game_entry){.code = "AYE", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "TopGear Rally"}, + (struct game_entry){.code = "BTU", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Totally Spies"}, + (struct game_entry){.code = "B2L", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Totally Spies 2 - Undercover"}, + (struct game_entry){.code = "A59", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Toukon Heat"}, + (struct game_entry){.code = "ATR", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Toyrobo Force"}, + (struct game_entry){.code = "AZQ", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Treasure Planet"}, + (struct game_entry){.code = "B9S", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Trick Star"}, + (struct game_entry){.code = "BTJ", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Tringo"}, + (struct game_entry){.code = "BT6", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Trollz - Hair Affair!"}, + (struct game_entry){.code = "BTN", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Tron 2.0 - Killer App"}, + (struct game_entry){.code = "AK3", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Turbo Turtle Adventure"}, + (struct game_entry){.code = "AT4", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Turok Evolution"}, + (struct game_entry){.code = "ATM", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Tweety and the Magic Gems"}, + (struct game_entry){.code = "AMJ", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Tweety no Hearty Party"}, + (struct game_entry){.code = "BFV", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Twin Series 1 - Fashion Designer Monogatari + Kawaii Pet Game Gallery 2"}, + (struct game_entry){.code = "BOP", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Twin Series 2 - Oshare Princess 4 + Renai Uranai Daisakusen"}, + (struct game_entry){.code = "BQM", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Twin Series 3 - Konchuu Monster + Suchai Labyrinth"}, + (struct game_entry){.code = "BHF", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Twin Series 4 - Ham Ham Monster EX + Fantasy Puzzle Hamster Monogatari"}, + (struct game_entry){.code = "BMW", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Twin Series 5 - Wan Wan Meitantei EX + Mahou no Kuni no Keaki-Okusan Monogatari"}, + (struct game_entry){.code = "BWN", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Twin Series 6 - Wan Nyon Idol Gakuen + Koinu Toissho Special"}, + (struct game_entry){.code = "B2P", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Twin Series 7 - Twin Puzzle - Kisekae Wanko Ex + Puzzle Rainbow Magic 2"}, + (struct game_entry){.code = "BTY", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Ty the Tasmanian Tiger 2 - Bush Rescue"}, + (struct game_entry){.code = "BTV", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Ty the Tasmanian Tiger 3 - Night of the Quinkan"}, + (struct game_entry){.code = "BUV", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Uchu no Stellvia"}, + (struct game_entry){.code = "AUC", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Uchuu Daisakusen Choco Vader - Uchuu Kara no Shinryakusha"}, + (struct game_entry){.code = "BUH", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Ueki no Housoku Shinki Sakuretsu! Nouryokumono Battle"}, + (struct game_entry){.code = "AEW", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Ui-Ire - World Soccer Winning Eleven"}, + (struct game_entry){.code = "BUZ", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Ultimate Arcade Games"}, + (struct game_entry){.code = "AVE", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Ultimate Beach Soccer"}, + (struct game_entry){.code = "ABU", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Ultimate Brain Games"}, + (struct game_entry){.code = "BUC", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Ultimate Card Games"}, + (struct game_entry){.code = "AK2", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Ultimate Muscle - The Kinnikuman Legacy - The Path of the Superhero"}, + (struct game_entry){.code = "BUA", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Ultimate Puzzle Games"}, + (struct game_entry){.code = "BUL", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Ultimate Spider-Man"}, + (struct game_entry){.code = "BUW", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Ultimate Winter Games"}, + (struct game_entry){.code = "BUT", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Ultra Keibitai - Monster Attack"}, + (struct game_entry){.code = "BU4", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Unfabulous"}, + (struct game_entry){.code = "BU5", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Uno 52"}, + (struct game_entry){.code = "BUI", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Uno Freefall"}, + (struct game_entry){.code = "AYI", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Urban Yeti!"}, + (struct game_entry){.code = "AVP", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "V.I.P."}, + (struct game_entry){.code = "BAN", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Van Helsing"}, + (struct game_entry){.code = "BRX", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Vattroller X"}, + (struct game_entry){.code = "BZT", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "VeggieTales - LarryBoy and the Bad Apple"}, + (struct game_entry){.code = "AVT", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Virtua Tennis"}, + (struct game_entry){.code = "AVK", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Virtual Kasparov"}, + (struct game_entry){.code = "AVM", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "V-Master Cross"}, + (struct game_entry){.code = "AVR", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "V-Rally 3"}, + (struct game_entry){.code = "BWT", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "W.i.t.c.h."}, + (struct game_entry){.code = "BSR", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Wade Hixton's Counter Punch"}, + (struct game_entry){.code = "BMI", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Wagamama - Fairy Milmo de Pon! DokiDoki Memorial"}, + (struct game_entry){.code = "BWP", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Wagamama Fairy Mirumo de Pon Nazo no Kagi to Shinjitsu no Tobir"}, + (struct game_entry){.code = "BMY", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Wagamama Fairy Mirumo de Pon! - 8 Nin no Toki no Yousei"}, + (struct game_entry){.code = "AWK", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Wagamama Fairy Mirumo de Pon! - Ougon Maracas no Densetsu"}, + (struct game_entry){.code = "BMP", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Wagamama Fairy Mirumo de Pon! - Taisen Mahoudama"}, + (struct game_entry){.code = "BWF", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Wagamama Fairy Mirumo de Pon! Yume no Kakera"}, + (struct game_entry){.code = "AWD", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Wakeboarding Unleashed featuring Shaun Murray"}, + (struct game_entry){.code = "BWD", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Wan Nyan Doubutsu Byouin"}, + (struct game_entry){.code = "BWK", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Wanko Dekururi! Wankuru"}, + (struct game_entry){.code = "BWX", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Wanko Mix Chiwanko World"}, + (struct game_entry){.code = "BWM", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "WanWan Meitantei"}, + (struct game_entry){.code = "AWA", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Wario Land 4"}, + (struct game_entry){.code = "RZW", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "WarioWare Twisted!"}, + (struct game_entry){.code = "AZW", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "WarioWare, Inc. - Mega Microgames!"}, + (struct game_entry){.code = "AW3", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Watashi no Makesalon"}, + (struct game_entry){.code = "BWE", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Whac-A-Mole"}, + (struct game_entry){.code = "A73", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Whistle! - Dai 37 Kai Tokyo-to Chuugakkou Sougou Taiiku Soccer Taikai"}, + (struct game_entry){.code = "A55", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Who Wants to Be a Millionaire"}, + (struct game_entry){.code = "B55", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Who Wants to Be a Millionaire - 2nd Edition"}, + (struct game_entry){.code = "BWJ", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Who Wants to Be a Millionaire - Junior"}, + (struct game_entry){.code = "AW9", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Wing Commander - Prophecy"}, + (struct game_entry){.code = "AWQ", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Wings"}, + (struct game_entry){.code = "BWH", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Winnie the Pooh's Rumbly Tumbly Adventure"}, + (struct game_entry){.code = "BWZ", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Winnie the Pooh's Rumbly Tumbly Adventure + Rayman 3"}, + (struct game_entry){.code = "AWP", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Winning Post for GameBoy Advance"}, + (struct game_entry){.code = "BWY", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Winter Sports"}, + (struct game_entry){.code = "BWI", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "WinX Club"}, + (struct game_entry){.code = "BWV", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Winx Club - Quest For The Codex"}, + (struct game_entry){.code = "AWZ", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Wizardry Summoner"}, + (struct game_entry){.code = "AWO", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Wolfenstein 3D"}, + (struct game_entry){.code = "AWW", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Woody Woodpecker in Crazy Castle 5"}, + (struct game_entry){.code = "BB8", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Word Safari - The Friendship Totems"}, + (struct game_entry){.code = "AAS", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "World Advance Soccer - Shouri heno Michi"}, + (struct game_entry){.code = "BP9", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "World Championship Poker"}, + (struct game_entry){.code = "B26", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "World Poker Tour"}, + (struct game_entry){.code = "BWO", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "World Poker Tour"}, + (struct game_entry){.code = "BWR", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "World Reborn"}, + (struct game_entry){.code = "AWC", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "World Tennis Stars"}, + (struct game_entry){.code = "AWB", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Worms Blast"}, + (struct game_entry){.code = "AWY", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Worms World Party"}, + (struct game_entry){.code = "ATE", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "WTA Tour Tennis"}, + (struct game_entry){.code = "ACI", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "WTA Tour Tennis Pocket"}, + (struct game_entry){.code = "AW8", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "WWE - Road to WrestleMania X8"}, + (struct game_entry){.code = "BWW", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "WWE Survivor Series"}, + (struct game_entry){.code = "AWF", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "WWF - Road to WrestleMania"}, + (struct game_entry){.code = "AWV", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "X2 - Wolverine's Revenge"}, + (struct game_entry){.code = "AXI", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "X-bladez - Inline Skater"}, + (struct game_entry){.code = "AXM", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "X-Men - Reign of Apocalypse"}, + (struct game_entry){.code = "B3X", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "X-Men - The Official Game"}, + (struct game_entry){.code = "BXM", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "XS Moto"}, + (struct game_entry){.code = "AX3", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "xXx"}, + (struct game_entry){.code = "B64", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Yars' Revenge - Pong - Asteroids"}, + (struct game_entry){.code = "BYU", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Yggdra Union - We'll Never Fight Alone"}, + (struct game_entry){.code = "BYV", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Yo-Gi-Oh! Double Pack 2 - Destiny Board Traveler + Dungeon Dice Monsters"}, + (struct game_entry){.code = "KYG", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Yoshi Topsy-Turvy"}, + (struct game_entry){.code = "A3A", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Yoshi's Island - Super Mario Advance 3"}, + (struct game_entry){.code = "AFU", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Youkaidou"}, + (struct game_entry){.code = "BYY", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Yu Yu Hakusho - Spirit Detective"}, + (struct game_entry){.code = "BYD", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Yu-Gi-Oh! - Destiny Board Traveler"}, + (struct game_entry){.code = "AY8", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Yu-Gi-Oh! - Reshef of Destruction"}, + (struct game_entry){.code = "BY7", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Yu-Gi-Oh! 7 Trials to Glory - World Championship Tournament 2005"}, + (struct game_entry){.code = "BYO", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Yu-Gi-Oh! Day Of The Duelist - World Championship Tournament 2005"}, + (struct game_entry){.code = "BY2", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Yu-Gi-Oh! Double Pack"}, + (struct game_entry){.code = "AY6", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Yu-Gi-Oh! Duel Monsters 6 Expert 2"}, + (struct game_entry){.code = "BY3", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Yu-Gi-Oh! Duel Monsters Expert 3"}, + (struct game_entry){.code = "BYI", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Yu-Gi-Oh! Duel Monsters International 2"}, + (struct game_entry){.code = "AYD", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Yu-Gi-Oh! Dungeon Dice Monsters"}, + (struct game_entry){.code = "BYG", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Yu-Gi-Oh! GX - Duel Academy"}, + (struct game_entry){.code = "BYS", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Yu-Gi-Oh! Sugoroku no Sugoroku"}, + (struct game_entry){.code = "AY5", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Yu-Gi-Oh! The Eternal Duelist Soul"}, + (struct game_entry){.code = "AY7", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Yu-Gi-Oh! The Sacred Cards"}, + (struct game_entry){.code = "BY6", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Yu-Gi-Oh! Ultimate Masters 2006"}, + (struct game_entry){.code = "BYW", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Yu-Gi-Oh! World Championship Tournament 2004"}, + (struct game_entry){.code = "AYW", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Yu-Gi-Oh! Worldwide Edition - Stairway to the Destined Duel"}, + (struct game_entry){.code = "A4V", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Yuujou no Victory Goal 4v4 Arashi - Get the Goal!!"}, + (struct game_entry){.code = "AUY", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Yuureiyashiki no Nijuuyojikan"}, + (struct game_entry){.code = "BRG", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Yu-Yu-Hakusho - Tournament Tactics"}, + (struct game_entry){.code = "AZP", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Zapper"}, + (struct game_entry){.code = "A4G", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "ZatchBell! - Electric Arena"}, + (struct game_entry){.code = "AGT", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Zen-Nippon GT Senshuken"}, + (struct game_entry){.code = "A2Z", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Zen-Nippon Shounen Soccer Taikai 2 - Mezase Nippon-ichi!"}, + (struct game_entry){.code = "AF3", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Zero One"}, + (struct game_entry){.code = "BZO", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Zero One SP"}, + (struct game_entry){.code = "AZT", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Zero-Tours"}, + (struct game_entry){.code = "BJ3", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Zettai Zetsumei - Dangerous Jiisan 3 Hateshinaki Mamonogatari"}, + (struct game_entry){.code = "BZD", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Zettai Zetsumei Dangerous Jiisan - Shijou Saikyou no Togeza"}, + (struct game_entry){.code = "BZG", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Zettai Zetsumei Dangerous Jiisan - Zettai Okujou Bai Orensu Kouchou"}, + (struct game_entry){.code = "BZ2", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Zettai Zetsumei Den Chara Suji-Sa"}, + (struct game_entry){.code = "AZD", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Zidane Football Generation"}, + (struct game_entry){.code = "BZY", .storage = BACKUP_NONE, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Zoey 101"}, + (struct game_entry){.code = "AZ2", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Zoids - Legacy"}, + (struct game_entry){.code = "ATZ", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Zoids Saga"}, + (struct game_entry){.code = "BZF", .storage = BACKUP_SRAM, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Zoids Saga - Fuzors"}, + (struct game_entry){.code = "AZE", .storage = BACKUP_FLASH64, .flags = GAME_ENTRY_FLAGS_NONE, .title = "Zone of the Enders - The Fist of Mars"}, + (struct game_entry){.code = "ANC", .storage = BACKUP_EEPROM_4K, .flags = GAME_ENTRY_FLAGS_NONE, .title = "ZooCube"}, + (struct game_entry){.code = "BMZ", .storage = BACKUP_EEPROM_64K,.flags = GAME_ENTRY_FLAGS_NONE, .title = "Zooo"}, }; -void +struct game_entry const * db_lookup_game( - struct gba *gba + uint8_t const *game_code ) { - char const *name; size_t i; - gba->game_entry = NULL; - name = (char *)gba->memory.rom + 0xAC; - for (i = 0; i < array_length(game_database); ++i) { - if (!strncmp(name, game_database[i].code, 3)) { - gba->game_entry = game_database + i; - logln( - HS_INFO, - "Game code %s%.3s%s identified as %s%s%s.", - g_light_magenta, - name, - g_reset, - g_light_magenta, - gba->game_entry->title, - g_reset - ); - return; + if (!strncmp((char const *)game_code, game_database[i].code, 3)) { + return (game_database + i); } } - - logln( - HS_WARNING, - "No game with the code \"%s%.3s%s\" could be found in the Hades game database.", - g_light_magenta, - name, - g_reset - ); + return (NULL); } diff --git a/source/gba/debugger.c b/source/gba/debugger.c index f81eed1f..2694ce57 100644 --- a/source/gba/debugger.c +++ b/source/gba/debugger.c @@ -13,19 +13,15 @@ #include "hades.h" #include "gba/gba.h" #include "gba/core.h" +#include "common/channel/event.h" + +void gba_state_pause(struct gba *); +void gba_send_notification_raw(struct gba *gba, struct event_header const *notif_header); void debugger_init( struct debugger *debugger ) { - if (debugger->breakpoints.cleanup) { - debugger->breakpoints.cleanup(debugger->breakpoints.list); - } - - if (debugger->watchpoints.cleanup) { - debugger->watchpoints.cleanup(debugger->watchpoints.list); - } - memset(debugger, 0, sizeof(*debugger)); } @@ -39,9 +35,16 @@ debugger_eval_breakpoints( pc = gba->core.pc - (gba->core.cpsr.thumb ? 2 : 4) * 2; for (bp = gba->debugger.breakpoints.list; bp && bp < gba->debugger.breakpoints.list + gba->debugger.breakpoints.len; ++bp) { if (bp->ptr == pc) { - gba->debugger.interrupt.reason = GBA_INTERRUPT_REASON_BREAKPOINT_REACHED; - gba->debugger.interrupt.data.breakpoint = bp; - gba->debugger.interrupt.flag = true; + struct notification_breakpoint notif; + + notif.header.kind = NOTIFICATION_BREAKPOINT; + notif.header.size = sizeof(notif); + notif.addr = pc; + + gba->debugger.interrupted = true; + + gba_send_notification_raw(gba, ¬if.header); + gba_state_pause(gba); break; } } @@ -58,13 +61,21 @@ debugger_eval_write_watchpoints( for (wp = gba->debugger.watchpoints.list; wp && wp < gba->debugger.watchpoints.list + gba->debugger.watchpoints.len; ++wp) { if (wp->ptr >= addr && wp->ptr < addr + size && wp->write) { - gba->debugger.interrupt.reason = GBA_INTERRUPT_REASON_WATCHPOINT_REACHED; - gba->debugger.interrupt.data.watchpoint = wp; - gba->debugger.interrupt.data.access.ptr = addr; - gba->debugger.interrupt.data.access.write = true; - gba->debugger.interrupt.data.access.val = new_value; - gba->debugger.interrupt.data.access.size = size; - gba->debugger.interrupt.flag = true; + struct notification_watchpoint notif; + + notif.header.kind = NOTIFICATION_WATCHPOINT; + notif.header.size = sizeof(notif); + + notif.addr = wp->ptr; + notif.access.addr = addr; + notif.access.val = new_value; + notif.access.size = size; + notif.access.write = true; + + gba->debugger.interrupted = true; + + gba_send_notification_raw(gba, ¬if.header); + gba_state_pause(gba); break; } } @@ -80,16 +91,98 @@ debugger_eval_read_watchpoints( for (wp = gba->debugger.watchpoints.list; wp && wp < gba->debugger.watchpoints.list + gba->debugger.watchpoints.len; ++wp) { if (wp->ptr >= addr && wp->ptr < addr + size && !wp->write) { - gba->debugger.interrupt.reason = GBA_INTERRUPT_REASON_WATCHPOINT_REACHED; - gba->debugger.interrupt.data.watchpoint = wp; - gba->debugger.interrupt.data.access.ptr = addr; - gba->debugger.interrupt.data.access.write = false; - gba->debugger.interrupt.data.access.val = 0; - gba->debugger.interrupt.data.access.size = size; - gba->debugger.interrupt.flag = true; + struct notification_watchpoint notif; + + notif.header.kind = NOTIFICATION_WATCHPOINT; + notif.header.size = sizeof(notif); + + notif.addr = wp->ptr; + notif.access.addr = addr; + notif.access.val = 0; + notif.access.size = size; + notif.access.write = false; + + gba->debugger.interrupted = true; + + gba_send_notification_raw(gba, ¬if.header); + gba_state_pause(gba); break; } } } +void +debugger_execute_run_mode( + struct gba *gba +) { + switch (gba->debugger.run_mode) { + case GBA_RUN_MODE_NORMAL: { + sched_run_for(gba, GBA_CYCLES_PER_PIXEL * GBA_SCREEN_REAL_WIDTH); + break; + }; + case GBA_RUN_MODE_FRAME: { + sched_run_for(gba, GBA_CYCLES_PER_PIXEL * GBA_SCREEN_REAL_WIDTH * GBA_SCREEN_HEIGHT); + gba_state_pause(gba); + break; + }; + case GBA_RUN_MODE_TRACE: { + size_t cnt; + + cnt = 4096; // Split the process in chunks of 4096 insns. + + while (cnt && gba->debugger.trace.count) { + sched_run_for(gba, 1); + gba->debugger.trace.tracer_cb(gba->debugger.trace.arg); + + --gba->debugger.trace.count; + --cnt; + } + + if (!gba->debugger.trace.count) { + gba_state_pause(gba); + } + break; + + }; + case GBA_RUN_MODE_STEP_IN: { + size_t cnt; + + cnt = 4096; // Split the process in chunks of 4096 insns. + + while (cnt && gba->debugger.step.count) { + sched_run_for(gba, 1); + --gba->debugger.step.count; + --cnt; + } + + if (!gba->debugger.step.count) { + gba_state_pause(gba); + } + break; + }; + case GBA_RUN_MODE_STEP_OVER: { + size_t cnt; + + cnt = 4096; // Split the process in chunks of 4096 insns. + + while (cnt && gba->debugger.step.count) { + while (cnt && gba->core.pc != gba->debugger.step.next_pc) { + sched_run_for(gba, 1); + --cnt; + } + + if (gba->core.pc == gba->debugger.step.next_pc) { + --gba->debugger.step.count; + gba->debugger.step.next_pc += (gba->core.cpsr.thumb ? 2 : 4); + } + } + + if (!gba->debugger.step.count) { + gba_state_pause(gba); + } + break; + }; + } +} + #endif diff --git a/source/gba/gba.c b/source/gba/gba.c index c1dda3bc..8a55d00e 100644 --- a/source/gba/gba.c +++ b/source/gba/gba.c @@ -9,852 +9,637 @@ #include #include "hades.h" -#include "compat.h" +#include "gba/gba.h" #include "gba/core/arm.h" #include "gba/core/thumb.h" -#include "gba/gba.h" -#include "gba/db.h" +#include "common/compat.h" +#include "common/channel/channel.h" +#include "common/channel/event.h" /* -** Initialize the `gba` structure with sane, default values. +** Create a new GBA emulator. */ -void -gba_init( - struct gba *gba -) { +struct gba * +gba_create(void) +{ + struct gba *gba; + + gba = malloc(sizeof(struct gba)); + hs_assert(gba); + memset(gba, 0, sizeof(*gba)); - /* Initialize the ARM decoder */ - core_arm_decode_insns(); - core_thumb_decode_insns(); + // Initialize the ARM and Thumb decoder + { + core_arm_decode_insns(); + core_thumb_decode_insns(); + } + + // Channels + { + channel_init(&gba->channels.messages); + channel_init(&gba->channels.notifications); +#ifdef WITH_DEBUGGER + channel_init(&gba->channels.debug); +#endif + } - pthread_mutex_init(&gba->message_queue.lock, NULL); - pthread_cond_init(&gba->message_queue.ready, NULL); + // Shared Data + { + pthread_mutex_init(&gba->shared_data.framebuffer.lock, NULL); + pthread_mutex_init(&gba->shared_data.audio_rbuffer_mutex, NULL); + } + + return (gba); } -/* -** Reset the GBA system to its initial state. -*/ -static void -gba_reset( - struct gba *gba +gba_send_notification_raw( + struct gba *gba, + struct event_header const *notif_header ) { - gba->started = false; - gba->state = GBA_STATE_PAUSE; - - sched_cleanup(gba); + switch (notif_header->kind) { + case NOTIFICATION_RESET: + case NOTIFICATION_PAUSE: + case NOTIFICATION_STOP: + case NOTIFICATION_RUN: { + channel_lock(&gba->channels.notifications); + channel_push(&gba->channels.notifications, notif_header); + channel_release(&gba->channels.notifications); - sched_init(gba); - mem_reset(&gba->memory); - io_init(&gba->io); - ppu_init(gba); - apu_init(gba); - core_init(gba); - gpio_init(gba); +#ifdef WITH_DEBUGGER + channel_lock(&gba->channels.debug); + channel_push(&gba->channels.debug, notif_header); + channel_release(&gba->channels.debug); +#endif + break; + }; + case NOTIFICATION_QUICKSAVE: + case NOTIFICATION_QUICKLOAD: { + channel_lock(&gba->channels.notifications); + channel_push(&gba->channels.notifications, notif_header); + channel_release(&gba->channels.notifications); + break; + }; #ifdef WITH_DEBUGGER - debugger_init(&gba->debugger); + case NOTIFICATION_BREAKPOINTS_LIST_SET: + case NOTIFICATION_WATCHPOINTS_LIST_SET: + case NOTIFICATION_WATCHPOINT: + case NOTIFICATION_BREAKPOINT: { + channel_lock(&gba->channels.debug); + channel_push(&gba->channels.debug, notif_header); + channel_release(&gba->channels.debug); + break; + } #endif + default: { + unimplemented(HS_ERROR, "Unimplemented notification kind %i.", notif_header->kind); + break; + } + } } -/* -** Skip the BIOS, setting all the registers to their final state. -** -** This is meant to be called right after `gba_reset()`. -*/ -static void -gba_skip_bios( +gba_send_notification( + struct gba *gba, + enum notification_kind kind +) { + struct notification notif; + + notif.header.kind = kind; + notif.header.size = sizeof(notif); + gba_send_notification_raw(gba, ¬if.header); +} + +static void +gba_state_stop( struct gba *gba ) { - core_switch_mode(&gba->core, MODE_SYS); - gba->core.cpsr.raw &= 0x1F; - gba->core.r13_svc = 0x03007FE0; - gba->core.r13_irq = 0x03007FA0; - gba->core.sp = 0X03007F00; - gba->core.pc = 0x08000000; - gba->io.postflg = 1; - core_reload_pipeline(gba); + free(gba->scheduler.events); + gba->scheduler.events = NULL; + + free(gba->shared_data.backup_storage.data); + gba->shared_data.backup_storage.data = NULL; + + gba->state = GBA_STATE_STOP; + gba_send_notification(gba, NOTIFICATION_STOP); } -/* -** Run the emulator, consuming messages that dictate what the emulator should do. -** -** Messages are used as a mono-directional communication between the frontend and the emulator. -** -** Those messages can be: -** - A new key was pressed -** - The user requested a quickload/quicksave -** - The emulator must run until the next frame, for one instruction, etc. -** - The emulator must pause, reset, etc. -*/ void -gba_main_loop( +gba_state_pause( struct gba *gba ) { - uint64_t last_measured_time; - uint64_t accumulated_time; - uint64_t time_per_frame; - - last_measured_time = hs_tick_count(); - accumulated_time = 0; - time_per_frame = 0; - while (true) { - struct message_queue *mqueue; - struct message *message; - - pthread_mutex_lock(&gba->message_queue.lock); - - mqueue = &gba->message_queue; - message = mqueue->messages; - while (mqueue->length) { - switch (message->type) { - case MESSAGE_EXIT: { - pthread_mutex_unlock(&gba->message_queue.lock); - return ; - }; - case MESSAGE_BIOS: { - struct message_data *message_data; - - message_data = (struct message_data *)message; - memset(gba->memory.bios, 0, BIOS_MASK); - memcpy(gba->memory.bios, message_data->data, min(message_data->size, BIOS_MASK)); - if (message_data->cleanup) { - message_data->cleanup(message_data->data); - } - break; - }; - case MESSAGE_ROM: { - struct message_data *message_data; - - message_data = (struct message_data *)message; - memset(gba->memory.rom, 0, CART_SIZE); - gba->memory.rom_size = min(message_data->size, CART_SIZE); - memcpy(gba->memory.rom, message_data->data, gba->memory.rom_size); - if (message_data->cleanup) { - message_data->cleanup(message_data->data); - } - db_lookup_game(gba); - break; - }; - case MESSAGE_BACKUP: { - struct message_data *message_data; - - message_data = (struct message_data *)message; - memset(gba->memory.backup_storage.data, 0, backup_storage_sizes[gba->memory.backup_storage.type]); - memcpy( - gba->memory.backup_storage.data, - message_data->data, - min(message_data->size, backup_storage_sizes[gba->memory.backup_storage.type]) - ); - if (message_data->cleanup) { - message_data->cleanup(message_data->data); - } - break; - }; - case MESSAGE_BACKUP_TYPE: { - struct message_backup_type *message_backup_type; - - /* Ignore if emulation is already started. */ - if (gba->started) { - break; - } - - message_backup_type = (struct message_backup_type *)message; - if (message_backup_type->type == BACKUP_AUTO_DETECT) { - mem_backup_storage_detect(gba); - } else { - gba->memory.backup_storage.type = message_backup_type->type; - gba->memory.backup_storage.source = BACKUP_SOURCE_MANUAL; - } - mem_backup_storage_init(gba); - break; - }; - case MESSAGE_RESET: { - struct message_reset *message_reset; - - message_reset = (struct message_reset *)message; - - gba_reset(gba); - last_measured_time = hs_tick_count(); - accumulated_time = 0; - - if (message_reset->skip_bios) { - gba_skip_bios(gba); - } - break; - }; - case MESSAGE_SPEED: { - struct message_speed *message_run; - - message_run = (struct message_speed *)message; - gba->speed = message_run->speed; - if (message_run->speed) { - time_per_frame = 1.f / 59.737f * 1000.f * 1000.f / (float)gba->speed; - accumulated_time = 0; - } else { - time_per_frame = 0.f; - } - break; - }; - case MESSAGE_RUN: { - gba->started = true; - gba->state = GBA_STATE_RUN; - break; - }; - case MESSAGE_PAUSE: { - gba->state = GBA_STATE_PAUSE; -#ifdef WITH_DEBUGGER - gba->debugger.interrupt.reason = GBA_INTERRUPT_REASON_PAUSE; - gba->debugger.interrupt.flag = true; -#endif - break; - }; - case MESSAGE_KEYINPUT: { - struct message_keyinput *message_keyinput; - - message_keyinput = (struct message_keyinput *)message; - switch (message_keyinput->key) { - case KEY_A: gba->io.keyinput.a = !message_keyinput->pressed; break; - case KEY_B: gba->io.keyinput.b = !message_keyinput->pressed; break; - case KEY_L: gba->io.keyinput.l = !message_keyinput->pressed; break; - case KEY_R: gba->io.keyinput.r = !message_keyinput->pressed; break; - case KEY_UP: gba->io.keyinput.up = !message_keyinput->pressed; break; - case KEY_DOWN: gba->io.keyinput.down = !message_keyinput->pressed; break; - case KEY_RIGHT: gba->io.keyinput.right = !message_keyinput->pressed; break; - case KEY_LEFT: gba->io.keyinput.left = !message_keyinput->pressed; break; - case KEY_START: gba->io.keyinput.start = !message_keyinput->pressed; break; - case KEY_SELECT: gba->io.keyinput.select = !message_keyinput->pressed; break; - }; - - io_scan_keypad_irq(gba); - break; - }; - case MESSAGE_QUICKLOAD: { - struct message_data *message_data; - - message_data = (struct message_data *)message; - quickload(gba, (char const *)message_data->data); - if (message_data->cleanup) { - message_data->cleanup(message_data->data); - } - break; - }; - case MESSAGE_QUICKSAVE: { - struct message_data *message_data; - - message_data = (struct message_data *)message; - quicksave(gba, (char const *)message_data->data); - if (message_data->cleanup) { - message_data->cleanup(message_data->data); - } - break; - }; - case MESSAGE_AUDIO_RESAMPLE_FREQ: { - struct message_audio_freq *message_audio_freq; - - message_audio_freq = (struct message_audio_freq *)message; - gba->apu.resample_frequency = message_audio_freq->resample_frequency; - break; - }; - case MESSAGE_SETTINGS_COLOR_CORRECTION: { - struct message_color_correction *message_color_correction; - - message_color_correction = (struct message_color_correction *)message; - gba->color_correction = message_color_correction->color_correction; - break; - }; - case MESSAGE_SETTINGS_RTC: { - struct message_device_state *message_device_state; - - /* Ignore if emulation is already started. */ - if (gba->started) { - break; - } - - message_device_state = (struct message_device_state *)message; - switch (message_device_state->state) { - case DEVICE_AUTO_DETECT: { - gba->rtc_auto_detect = true; - gba->rtc_enabled = false; - break; - }; - case DEVICE_ENABLED: { - gba->rtc_auto_detect = false; - gba->rtc_enabled = true; - break; - }; - case DEVICE_DISABLED: { - gba->rtc_auto_detect = false; - gba->rtc_enabled = false; - break; - }; - } - break; - }; -#ifdef WITH_DEBUGGER - case MESSAGE_DBG_FRAME: { - gba->started = true; - gba->state = GBA_STATE_FRAME; - break; - }; - case MESSAGE_DBG_TRACE: { - struct message_dbg_trace *message_dbg_trace; - - message_dbg_trace = (struct message_dbg_trace *)message; - gba->debugger.trace.count = message_dbg_trace->count; - gba->debugger.trace.data = message_dbg_trace->data; - gba->debugger.trace.tracer = message_dbg_trace->tracer; - - gba->started = true; - gba->state = GBA_STATE_TRACE; - break; - }; - case MESSAGE_DBG_STEP: { - struct message_dbg_step *message_dbg_step; - - message_dbg_step = (struct message_dbg_step *)message; - - gba->started = true; - gba->state = message_dbg_step->over ? GBA_STATE_STEP_OVER : GBA_STATE_STEP_IN; - gba->debugger.step.count = message_dbg_step->count; - gba->debugger.step.next_pc = gba->core.pc + (gba->core.cpsr.thumb ? 2 : 4); - break; - }; - case MESSAGE_DBG_BREAKPOINTS: { - struct message_dbg_breakpoints *message_dbg_breakpoints; - - message_dbg_breakpoints = (struct message_dbg_breakpoints *)message; - if (gba->debugger.breakpoints.cleanup) { - gba->debugger.breakpoints.cleanup(gba->debugger.breakpoints.list); - } - gba->debugger.breakpoints.list = message_dbg_breakpoints->breakpoints; - gba->debugger.breakpoints.len = message_dbg_breakpoints->len; - gba->debugger.breakpoints.cleanup = message_dbg_breakpoints->cleanup; - break; - }; - case MESSAGE_DBG_WATCHPOINTS: { - struct message_dbg_watchpoints *message_dbg_watchpoints; - - message_dbg_watchpoints = (struct message_dbg_watchpoints *)message; - if (gba->debugger.watchpoints.cleanup) { - gba->debugger.watchpoints.cleanup(gba->debugger.watchpoints.list); - } - gba->debugger.watchpoints.list = message_dbg_watchpoints->watchpoints; - gba->debugger.watchpoints.len = message_dbg_watchpoints->len; - gba->debugger.watchpoints.cleanup = message_dbg_watchpoints->cleanup; - break; - }; -#endif - default: unimplemented(HS_CORE, "GBA message type with ID %i unimplemented.", message->type); - } - mqueue->allocated_size -= message->size; - --mqueue->length; - message = (struct message *)((uint8_t *)message + message->size); - } - free(mqueue->messages); - mqueue->messages = NULL; - - /* - ** Wait until there's new messages in the message queue. - ** - ** We must do this here and not in the switch/case below because `gba->message_queue.lock` - ** must be locked when calling `pthread_cond_wait()`. - */ - if (gba->state == GBA_STATE_PAUSE) { - pthread_cond_wait(&gba->message_queue.ready, &gba->message_queue.lock); - last_measured_time = hs_tick_count(); - accumulated_time = 0; - } + gba->state = GBA_STATE_PAUSE; + gba_send_notification(gba, NOTIFICATION_PAUSE); +} - pthread_mutex_unlock(&gba->message_queue.lock); +void +gba_state_run( + struct gba *gba +) { + gba->state = GBA_STATE_RUN; + gba_send_notification(gba, NOTIFICATION_RUN); +} - switch (gba->state) { - case GBA_STATE_PAUSE: break; - case GBA_STATE_RUN: { - sched_run_for(gba, CYCLES_PER_FRAME); - break; - }; -#ifdef WITH_DEBUGGER - case GBA_STATE_FRAME: { - sched_run_for(gba, CYCLES_PER_FRAME - (gba->core.cycles % CYCLES_PER_FRAME)); - gba->state = GBA_STATE_PAUSE; - gba->debugger.interrupt.reason = GBA_INTERRUPT_REASON_FRAME_FINISHED; - gba->debugger.interrupt.flag = true; - break; - }; - case GBA_STATE_TRACE: { - size_t cnt; +static void +gba_state_reset( + struct gba *gba, + struct launch_config const *config +) { + // Scheduler + { + struct scheduler *scheduler; + + scheduler = &gba->scheduler; + memset(scheduler, 0, sizeof(*scheduler)); + + scheduler->events_size = 64; + scheduler->events = calloc(scheduler->events_size, sizeof(struct scheduler_event)); + hs_assert(scheduler->events); + + sched_update_speed(gba, config->speed); + scheduler->time_last_frame = hs_time(); + + // Frame limiter + sched_add_event( + gba, + NEW_REPEAT_EVENT( + GBA_CYCLES_PER_PIXEL * GBA_SCREEN_REAL_WIDTH * GBA_SCREEN_REAL_HEIGHT, // Timing of first trigger + GBA_CYCLES_PER_PIXEL * GBA_SCREEN_REAL_WIDTH * GBA_SCREEN_REAL_HEIGHT, // Period + sched_frame_limiter + ) + ); + } - cnt = 1000; // Split the process in chunks of 1000 insns. + // Memory + { + struct memory *memory; - while (cnt && gba->debugger.trace.count) { - sched_run_for(gba, 1); - gba->debugger.trace.tracer(gba->debugger.trace.data); + memory = &gba->memory; + memset(memory, 0, sizeof(*memory)); - --gba->debugger.trace.count; - --cnt; - } + // Copy the BIOS and ROM to memory + memcpy(gba->memory.bios, config->bios.data, min(config->bios.size, BIOS_SIZE)); + memcpy(gba->memory.rom, config->rom.data, min(config->rom.size, CART_SIZE)); + gba->memory.rom_size = config->rom.size; + } - if (!gba->debugger.trace.count) { - gba->state = GBA_STATE_PAUSE; - gba->debugger.interrupt.reason = GBA_INTERRUPT_REASON_TRACE_FINISHED; - gba->debugger.interrupt.flag = true; - } - break; - }; - case GBA_STATE_STEP_IN: { - size_t cnt; - - cnt = 1000; // Split the process in chunks of 1000 insns. - - while (cnt && gba->debugger.step.count) { - sched_run_for(gba, 1); - --gba->debugger.step.count; - --cnt; - } - - if (!gba->debugger.step.count) { - gba->state = GBA_STATE_PAUSE; - gba->debugger.interrupt.reason = GBA_INTERRUPT_REASON_STEP_FINISHED; - gba->debugger.interrupt.flag = true; - } + // IO + { + struct io *io; + + io = &gba->io; + memset(io, 0, sizeof(*io)); + + io->keyinput.raw = 0x3FF; // Every button set to "released" + io->soundbias.bias = 0x200; + io->bg_pa[0].raw = 0x100; + io->bg_pd[0].raw = 0x100; + io->bg_pa[1].raw = 0x100; + io->bg_pd[1].raw = 0x100; + io->timers[0].handler = INVALID_EVENT_HANDLE; + io->timers[1].handler = INVALID_EVENT_HANDLE; + io->timers[2].handler = INVALID_EVENT_HANDLE; + io->timers[3].handler = INVALID_EVENT_HANDLE; + io->dma[0].enable_event_handle = INVALID_EVENT_HANDLE; + io->dma[1].enable_event_handle = INVALID_EVENT_HANDLE; + io->dma[2].enable_event_handle = INVALID_EVENT_HANDLE; + io->dma[3].enable_event_handle = INVALID_EVENT_HANDLE; + io->dma[0].index = 0; + io->dma[1].index = 1; + io->dma[2].index = 2; + io->dma[3].index = 3; + } + + // APU + { + struct apu *apu; + + apu = &gba->apu; + memset(apu, 0, sizeof(*apu)); + + // Wave Channel + gba->apu.wave.step_handler = INVALID_EVENT_HANDLE; + gba->apu.wave.counter_handler = INVALID_EVENT_HANDLE; + + sched_add_event( + gba, + NEW_REPEAT_EVENT( + 0, + GBA_CYCLES_PER_SECOND / 256, + apu_sequencer + ) + ); + + if (config->audio_frequency) { + sched_add_event( + gba, + NEW_REPEAT_EVENT( + 0, + config->audio_frequency, + apu_resample + ) + ); + } + } + + // PPU + { + struct ppu *ppu; + + ppu = &gba->ppu; + memset(ppu, 0, sizeof(*ppu)); + + // HDraw + sched_add_event( + gba, + NEW_REPEAT_EVENT( + GBA_CYCLES_PER_PIXEL * GBA_SCREEN_REAL_WIDTH, // Timing of first trigger + GBA_CYCLES_PER_PIXEL * GBA_SCREEN_REAL_WIDTH, // Period + ppu_hdraw + ) + ); + + // HBlank + sched_add_event( + gba, + NEW_REPEAT_EVENT( + GBA_CYCLES_PER_PIXEL * GBA_SCREEN_WIDTH + 46, // Timing of first trigger + GBA_CYCLES_PER_PIXEL * GBA_SCREEN_REAL_WIDTH, // Period + ppu_hblank + ) + ); + } + + // GPIO + { + struct gpio *gpio; + + gpio = &gba->gpio; + memset(gpio, 0, sizeof(*gpio)); + + if (config->rtc) { + gpio->rtc.enabled = true; + gpio->rtc.state = RTC_COMMAND; + gpio->rtc.data_len = 8; + } + } + + // Backup storage + { + gba->memory.backup_storage.type = config->backup_storage.type; + switch (gba->memory.backup_storage.type) { + case BACKUP_EEPROM_4K: { + gba->memory.backup_storage.chip.eeprom.mask = (gba->memory.rom_size > 16 * 1024 * 1024) ? 0x01FFFF00 : 0xFF000000; + gba->memory.backup_storage.chip.eeprom.range = (gba->memory.rom_size > 16 * 1024 * 1024) ? 0x01FFFF00 : 0x0d000000; + gba->memory.backup_storage.chip.eeprom.address_mask = EEPROM_4K_ADDR_MASK; + gba->memory.backup_storage.chip.eeprom.address_len = EEPROM_4K_ADDR_LEN; + gba->shared_data.backup_storage.size = EEPROM_4K_SIZE; break; }; - case GBA_STATE_STEP_OVER: { - size_t cnt; - - cnt = 1000; // Split the process in chunks of 1000 insns. - - while (cnt && gba->debugger.step.count) { - while (cnt && gba->core.pc != gba->debugger.step.next_pc) { - sched_run_for(gba, 1); - --cnt; - } - - if (gba->core.pc == gba->debugger.step.next_pc) { - --gba->debugger.step.count; - gba->debugger.step.next_pc += (gba->core.cpsr.thumb ? 2 : 4); - } - } - - if (!gba->debugger.step.count) { - gba->state = GBA_STATE_PAUSE; - gba->debugger.interrupt.reason = GBA_INTERRUPT_REASON_STEP_FINISHED; - gba->debugger.interrupt.flag = true; - } + case BACKUP_EEPROM_64K: { + gba->memory.backup_storage.chip.eeprom.mask = (gba->memory.rom_size > 16 * 1024 * 1024) ? 0x01FFFF00 : 0xFF000000; + gba->memory.backup_storage.chip.eeprom.range = (gba->memory.rom_size > 16 * 1024 * 1024) ? 0x01FFFF00 : 0x0d000000; + gba->memory.backup_storage.chip.eeprom.address_mask = EEPROM_64K_ADDR_MASK; + gba->memory.backup_storage.chip.eeprom.address_len = EEPROM_64K_ADDR_LEN; + gba->shared_data.backup_storage.size = EEPROM_64K_SIZE; break; }; -#endif - default: unimplemented(HS_DEBUG, "Unimplemented GBA run operation %i.", gba->state); + case BACKUP_SRAM: gba->shared_data.backup_storage.size = SRAM_SIZE; break; + case BACKUP_FLASH64: gba->shared_data.backup_storage.size = FLASH64_SIZE; break; + case BACKUP_FLASH128:gba->shared_data.backup_storage.size = FLASH128_SIZE; break; + case BACKUP_NONE: gba->shared_data.backup_storage.size = 0; break; + default: panic(HS_CORE, "Unknown backup type %i", gba->memory.backup_storage.type); break; } - /* Limit FPS */ - if (gba->speed) { - uint64_t now; + if (gba->shared_data.backup_storage.size) { + gba->shared_data.backup_storage.data = calloc(1, gba->shared_data.backup_storage.size); + hs_assert(gba->shared_data.backup_storage.data); - now = hs_tick_count(); - accumulated_time += now - last_measured_time; - last_measured_time = now; - - if (accumulated_time < time_per_frame) { - hs_usleep(time_per_frame - accumulated_time); - now = hs_tick_count(); - accumulated_time += now - last_measured_time; - last_measured_time = now; + if (config->backup_storage.data && config->backup_storage.size) { + memcpy(gba->shared_data.backup_storage.data, config->backup_storage.data, min(gba->shared_data.backup_storage.size, config->backup_storage.size)); } - accumulated_time -= time_per_frame; - } else { - last_measured_time = hs_tick_count(); - accumulated_time = 0; } } -} -/* -** Put the given message in the message queue. -*/ -static -void -gba_message_push( - struct gba *gba, - struct message *message -) { - size_t new_size; - struct message_queue *mqueue; + // Core + { + struct core *core; - mqueue = &gba->message_queue; - pthread_mutex_lock(&gba->message_queue.lock); + core = &gba->core; - new_size = mqueue->allocated_size + message->size; + memset(core, 0, sizeof(*core)); - mqueue->messages = realloc(mqueue->messages, new_size); - hs_assert(mqueue->messages); - memcpy((uint8_t *)mqueue->messages + mqueue->allocated_size, message, message->size); + mem_update_waitstates(gba); - mqueue->length += 1; - mqueue->allocated_size = new_size; + core->cpsr.mode = MODE_SYS; + core->prefetch[0] = 0xF0000000; + core->prefetch[1] = 0xF0000000; + core->prefetch_access_type = NON_SEQUENTIAL; - pthread_cond_broadcast(&gba->message_queue.ready); - pthread_mutex_unlock(&gba->message_queue.lock); -} + if (config->skip_bios) { + core->r13_irq = 0x03007FA0; + core->r13_svc = 0x03007FE0; + core->sp = 0x03007F00; + core->pc = 0x08000000; + gba->io.postflg = 1; + core_reload_pipeline(gba); + } else { + core_interrupt(gba, VEC_RESET, MODE_SVC); + } + } -void -gba_send_exit( - struct gba *gba -) { - gba_message_push( - gba, - &((struct message) { - .type = MESSAGE_EXIT, - .size = sizeof(struct message), - }) - ); + gba_send_notification(gba, NOTIFICATION_RESET); } +static void -gba_send_bios( +gba_process_message( struct gba *gba, - uint8_t *data, - void (*cleanup)(void *) + struct message const *message ) { - gba_message_push( - gba, - (struct message *)&((struct message_data) { - .super = (struct message){ - .size = sizeof(struct message_data), - .type = MESSAGE_BIOS, - }, - .data = data, - .size = BIOS_SIZE, - .cleanup = cleanup, - }) - ); -} + switch (message->header.kind) { + case MESSAGE_EXIT: { + gba->exit = true; + break; + }; + case MESSAGE_RESET: { + struct message_reset const *msg_reset; + + msg_reset = (struct message_reset const *)message; + + gba_state_stop(gba); + gba_state_reset(gba, &msg_reset->config); + break; + }; + case MESSAGE_RUN: { +#ifdef WITH_DEBUGGER + gba->debugger.run_mode = GBA_RUN_MODE_NORMAL; +#endif + gba_state_run(gba); + break; + }; + case MESSAGE_STOP: { + gba_state_stop(gba); + break; + }; + case MESSAGE_PAUSE: { + gba_state_pause(gba); + break; + }; + case MESSAGE_KEY: { + struct message_key const *msg_key; + + msg_key = (struct message_key const *)message; + switch (msg_key->key) { + case KEY_A: gba->io.keyinput.a = !msg_key->pressed; break; + case KEY_B: gba->io.keyinput.b = !msg_key->pressed; break; + case KEY_L: gba->io.keyinput.l = !msg_key->pressed; break; + case KEY_R: gba->io.keyinput.r = !msg_key->pressed; break; + case KEY_UP: gba->io.keyinput.up = !msg_key->pressed; break; + case KEY_DOWN: gba->io.keyinput.down = !msg_key->pressed; break; + case KEY_RIGHT: gba->io.keyinput.right = !msg_key->pressed; break; + case KEY_LEFT: gba->io.keyinput.left = !msg_key->pressed; break; + case KEY_START: gba->io.keyinput.start = !msg_key->pressed; break; + case KEY_SELECT: gba->io.keyinput.select = !msg_key->pressed; break; + }; -void -gba_send_rom( - struct gba *gba, - uint8_t *data, - size_t size, - void (*cleanup)(void *) -) { - gba_message_push( - gba, - (struct message *)&((struct message_data) { - .super = (struct message){ - .type = MESSAGE_ROM, - .size = sizeof(struct message_data), - }, - .data = data, - .size = size, - .cleanup = cleanup, - }) - ); + io_scan_keypad_irq(gba); + break; + }; + case MESSAGE_SPEED: { + struct message_speed const *msg_speed; + + msg_speed = (struct message_speed const *)message; + sched_update_speed(gba, msg_speed->speed); + break; + }; + case MESSAGE_QUICKSAVE: { + struct notification_quicksave notif; + + notif.header.kind = NOTIFICATION_QUICKSAVE; + notif.header.size = sizeof(struct notification_quicksave); + quicksave(gba, ¬if.data, ¬if.size); + gba_send_notification_raw(gba, ¬if.header); + break; + }; + case MESSAGE_QUICKLOAD: { + struct message_quickload const *msg_quickload; + + msg_quickload = (struct message_quickload const *)message; + quickload(gba, msg_quickload->data, msg_quickload->size); // TODO FIXME Send back & handle any errors when loading the save state. + gba_send_notification(gba, NOTIFICATION_QUICKLOAD); + break; + }; +#ifdef WITH_DEBUGGER + case MESSAGE_FRAME: { + gba->debugger.run_mode = GBA_RUN_MODE_FRAME; + + gba_state_run(gba); + break; + }; + case MESSAGE_TRACE: { + struct message_trace const *msg_trace; + + msg_trace = (struct message_trace const *)message; + + gba->debugger.trace.count = msg_trace->count; + gba->debugger.trace.tracer_cb = msg_trace->tracer_cb; + gba->debugger.trace.arg = msg_trace->arg; + + gba->debugger.run_mode = GBA_RUN_MODE_TRACE; + gba_state_run(gba); + break; + }; + case MESSAGE_STEP_IN: + case MESSAGE_STEP_OVER: { + struct message_step const *msg_step; + + msg_step = (struct message_step const *)message; + + gba->debugger.step.count = msg_step->count; + gba->debugger.step.next_pc = gba->core.pc + (gba->core.cpsr.thumb ? 2 : 4); + + gba->debugger.run_mode = message->header.kind == MESSAGE_STEP_OVER ? GBA_RUN_MODE_STEP_OVER : GBA_RUN_MODE_STEP_IN; + gba_state_run(gba); + break; + }; + case MESSAGE_SET_BREAKPOINTS_LIST: { + struct message_set_breakpoints_list const *msg_set_breakpoints_list; + + msg_set_breakpoints_list = (struct message_set_breakpoints_list const *)message; + + free(gba->debugger.breakpoints.list); + gba->debugger.breakpoints.len = msg_set_breakpoints_list->len; + gba->debugger.breakpoints.list = calloc(gba->debugger.breakpoints.len, sizeof(struct breakpoint)); + hs_assert(gba->debugger.breakpoints.list); + memcpy(gba->debugger.breakpoints.list, msg_set_breakpoints_list->breakpoints, sizeof(struct breakpoint) * gba->debugger.breakpoints.len); + + gba_send_notification(gba, NOTIFICATION_BREAKPOINTS_LIST_SET); + break; + }; + case MESSAGE_SET_WATCHPOINTS_LIST: { + struct message_set_watchpoints_list const *msg_set_watchpoints_list; + + msg_set_watchpoints_list = (struct message_set_watchpoints_list const *)message; + + free(gba->debugger.watchpoints.list); + gba->debugger.watchpoints.len = msg_set_watchpoints_list->len; + gba->debugger.watchpoints.list = calloc(gba->debugger.watchpoints.len, sizeof(struct watchpoint)); + hs_assert(gba->debugger.watchpoints.list); + memcpy(gba->debugger.watchpoints.list, msg_set_watchpoints_list->watchpoints, sizeof(struct watchpoint) * gba->debugger.watchpoints.len); + + gba_send_notification(gba, NOTIFICATION_WATCHPOINTS_LIST_SET); + break; + }; +#endif + } } +/* +** Run the given GBA emulator. +** This will process all the message sent to the gba until an exit message is sent. +*/ void -gba_send_backup( - struct gba *gba, - uint8_t *data, - size_t size, - void (*cleanup)(void *) +gba_run( + struct gba *gba ) { - gba_message_push( - gba, - (struct message *)&((struct message_data) { - .super = (struct message){ - .type = MESSAGE_BACKUP, - .size = sizeof(struct message_data), - }, - .data = data, - .size = size, - .cleanup = cleanup, - }) - ); -} + struct channel *messages; -void -gba_send_backup_type( - struct gba *gba, - enum backup_storage_types backup_type -) { - gba_message_push( - gba, - (struct message *)&((struct message_backup_type) { - .super = (struct message){ - .type = MESSAGE_BACKUP_TYPE, - .size = sizeof(struct message_backup_type), - }, - .type = backup_type, - }) - ); -} + messages = &gba->channels.messages; -void -gba_send_speed( - struct gba *gba, - uint32_t speed -) { - gba_message_push( - gba, - (struct message *)&((struct message_speed) { - .super = (struct message){ - .type = MESSAGE_SPEED, - .size = sizeof(struct message_speed), - }, - .speed = speed, - }) - ); -} + while (!gba->exit) { + // Consume all messages + { + struct message const *msg; -void -gba_send_reset( - struct gba *gba, - bool skip_bios -) { - gba_message_push( - gba, - (struct message *)&((struct message_reset) { - .super = (struct message){ - .type = MESSAGE_RESET, - .size = sizeof(struct message_reset), - }, - .skip_bios = skip_bios, - }) - ); -} + channel_lock(messages); -void -gba_send_run( - struct gba *gba -) { - gba_message_push( - gba, - &((struct message) { - .type = MESSAGE_RUN, - .size = sizeof(struct message), - }) - ); -} + msg = (struct message const *)channel_next(messages, NULL); + while (msg) { + gba_process_message(gba, msg); + msg = (struct message const *)channel_next(messages, &msg->header); + } -void -gba_send_pause( - struct gba *gba -) { - gba_message_push( - gba, - &((struct message) { - .type = MESSAGE_PAUSE, - .size = sizeof(struct message), - }) - ); -} + channel_clear(messages); -void -gba_send_keyinput( - struct gba *gba, - enum keyinput key, - bool pressed -) { - gba_message_push( - gba, - (struct message *)&((struct message_keyinput) { - .super = (struct message){ - .type = MESSAGE_KEYINPUT, - .size = sizeof(struct message_keyinput), - }, - .key = key, - .pressed = pressed, - }) - ); -} + // If the exit flag was raised, leave now + if (gba->exit) { + return ; + } -void -gba_send_quickload( - struct gba *gba, - char const *path -) { - gba_message_push( - gba, - (struct message *)&((struct message_data) { - .super = (struct message){ - .type = MESSAGE_QUICKLOAD, - .size = sizeof(struct message_data), - }, - .data = (unsigned char *)strdup(path), - .size = strlen(path), - .cleanup = free, - }) - ); -} + // Wait until there's new messages in the message queue. + if (gba->state == GBA_STATE_PAUSE) { + channel_wait(messages); + } -void -gba_send_quicksave( - struct gba *gba, - char const *path -) { - gba_message_push( - gba, - (struct message *)&((struct message_data) { - .super = (struct message){ - .type = MESSAGE_QUICKSAVE, - .size = sizeof(struct message_data), - }, - .data = (unsigned char *)strdup(path), - .size = strlen(path), - .cleanup = free, - }) - ); + channel_release(messages); + } + + // Process the current state + switch (gba->state) { + case GBA_STATE_STOP: + case GBA_STATE_PAUSE: { + break; + } + case GBA_STATE_RUN: { +#ifdef WITH_DEBUGGER + debugger_execute_run_mode(gba); +#else + sched_run_for(gba, GBA_CYCLES_PER_PIXEL * GBA_SCREEN_REAL_WIDTH); +#endif + break; + }; + } + } } +/* +** Delete the given GBA and all its resources. +*/ void -gba_send_audio_resample_freq( - struct gba *gba, - uint64_t resample_freq +gba_delete( + struct gba *gba ) { - gba_message_push( - gba, - (struct message *)&((struct message_audio_freq) { - .super = (struct message){ - .type = MESSAGE_AUDIO_RESAMPLE_FREQ, - .size = sizeof(struct message_audio_freq), - }, - .resample_frequency = resample_freq, - }) - ); + free(gba); } +/* +** Lock the mutex protecting the framebuffer shared with the frontend. +*/ void -gba_send_settings_color_correction( - struct gba *gba, - bool color_correction +gba_shared_framebuffer_lock( + struct gba *gba ) { - gba_message_push( - gba, - (struct message *)&((struct message_color_correction) { - .super = (struct message){ - .type = MESSAGE_SETTINGS_COLOR_CORRECTION, - .size = sizeof(struct message_color_correction), - }, - .color_correction = color_correction, - }) - ); + pthread_mutex_lock(&gba->shared_data.framebuffer.lock); } +/* +** Release the mutex protecting the framebuffer shared with the frontend. +*/ void -gba_send_settings_rtc( - struct gba *gba, - enum device_states state +gba_shared_framebuffer_release( + struct gba *gba ) { - gba_message_push( - gba, - (struct message *)&((struct message_device_state) { - .super = (struct message){ - .type = MESSAGE_SETTINGS_RTC, - .size = sizeof(struct message_device_state), - }, - .state = state, - }) - ); + pthread_mutex_unlock(&gba->shared_data.framebuffer.lock); } -#ifdef WITH_DEBUGGER - +/* +** Lock the mutex protecting the audio ring buffer shared with the frontend. +*/ void -gba_send_dbg_frame( +gba_shared_audio_rbuffer_lock( struct gba *gba ) { - gba_message_push( - gba, - &((struct message) { - .type = MESSAGE_DBG_FRAME, - .size = sizeof(struct message), - }) - ); + pthread_mutex_lock(&gba->shared_data.audio_rbuffer_mutex); } +/* +** Release the mutex protecting the audio ring buffer shared with the frontend. +*/ void -gba_send_dbg_trace( - struct gba *gba, - size_t count, - void *data, - void (*tracer)(void *gba) +gba_shared_audio_rbuffer_release( + struct gba *gba ) { - gba_message_push( - gba, - (struct message *)&((struct message_dbg_trace) { - .super = (struct message){ - .type = MESSAGE_DBG_TRACE, - .size = sizeof(struct message_dbg_trace), - }, - .count = count, - .data = data, - .tracer = tracer, - }) - ); + pthread_mutex_unlock(&gba->shared_data.audio_rbuffer_mutex); } -void -gba_send_dbg_step( - struct gba *gba, - bool over, - size_t count +/* +** Release the mutex protecting the audio ring buffer shared with the frontend. +*/ +uint32_t +gba_shared_audio_rbuffer_pop_sample( + struct gba *gba ) { - gba_message_push( - gba, - (struct message *)&((struct message_dbg_step) { - .super = (struct message){ - .type = MESSAGE_DBG_STEP, - .size = sizeof(struct message_dbg_step), - }, - .over = over, - .count = count, - }) - ); + return (apu_rbuffer_pop(&gba->shared_data.audio_rbuffer)); } -void -gba_send_dbg_breakpoints( - struct gba *gba, - struct breakpoint *breakpoints, - size_t len, - void (*cleanup)(void *) +/* +** Reset the frame counter and return its old value. +*/ +uint32_t +gba_shared_reset_frame_counter( + struct gba *gba ) { - gba_message_push( - gba, - (struct message *)&((struct message_dbg_breakpoints) { - .super = (struct message){ - .type = MESSAGE_DBG_BREAKPOINTS, - .size = sizeof(struct message_dbg_breakpoints), - }, - .breakpoints = breakpoints, - .len = len, - .cleanup = cleanup, - }) - ); + return (atomic_exchange(&gba->shared_data.frame_counter, 0)); } +/* +** Delete a notification. +** Must be called by the frontend/debugger for each received notifications. +*/ void -gba_send_dbg_watchpoints( - struct gba *gba, - struct watchpoint *watchpoints, - size_t len, - void (*cleanup)(void *) +gba_delete_notification( + struct notification const *notif ) { - gba_message_push( - gba, - (struct message *)&((struct message_dbg_watchpoints) { - .super = (struct message){ - .type = MESSAGE_DBG_WATCHPOINTS, - .size = sizeof(struct message_dbg_watchpoints), - }, - .watchpoints = watchpoints, - .len = len, - .cleanup = cleanup, - }) - ); -} + switch (notif->header.kind) { + case NOTIFICATION_QUICKSAVE: { + struct notification_quicksave *qsave; -#endif + qsave = (struct notification_quicksave *)notif; + free(qsave->data); + break; + } + } +} diff --git a/source/gba/gpio/gpio.c b/source/gba/gpio/gpio.c index 8499643a..0fab8d93 100644 --- a/source/gba/gpio/gpio.c +++ b/source/gba/gpio/gpio.c @@ -10,18 +10,6 @@ #include #include "gba/gba.h" #include "gba/gpio.h" -#include "gba/db.h" - -void -gpio_init( - struct gba *gba -) { - memset(&gba->gpio, 0, sizeof(gba->gpio)); - if (gba->rtc_enabled || (gba->rtc_auto_detect && gba->game_entry && gba->game_entry->flags & FLAGS_RTC)) { - gpio_rtc_init(gba); - gba->rtc_enabled = true; - } -} uint8_t gpio_read_u8( @@ -35,7 +23,7 @@ gpio_read_u8( case GPIO_REG_DATA: { uint8_t val; - if (gba->rtc_enabled) { + if (gba->gpio.rtc.enabled) { val = gpio_rtc_read(gba); } else { val = 0; @@ -61,7 +49,7 @@ gpio_write_u8( break; }; case GPIO_REG_DATA: { - if (gba->rtc_enabled) { + if (gba->gpio.rtc.enabled) { gpio_rtc_write(gba, val); } break; diff --git a/source/gba/gpio/rtc.c b/source/gba/gpio/rtc.c index e888e948..802b0f72 100644 --- a/source/gba/gpio/rtc.c +++ b/source/gba/gpio/rtc.c @@ -11,23 +11,6 @@ #include "gba/gba.h" #include "gba/gpio.h" -void -gpio_rtc_init( - struct gba *gba -) { - struct rtc *rtc; - - rtc = &gba->gpio.rtc; - rtc->state = RTC_COMMAND; - rtc->data_len = 8; - rtc->data_count = 0; - rtc->data = 0; - rtc->sck = 0; - rtc->sio = 0; - rtc->cs = 0; - rtc->control.raw = 0x0; -} - static inline bool gpio_rtc_write_sio( diff --git a/source/gba/memory/memory.c b/source/gba/memory/memory.c index 7ec8064d..4c396f53 100644 --- a/source/gba/memory/memory.c +++ b/source/gba/memory/memory.c @@ -48,28 +48,6 @@ static uint32_t access_time32[2][16] = { static uint32_t gamepak_nonseq_waitstates[4] = { 4, 3, 2, 8 }; -/* -** Initialize the memory to its initial state, before the system is up. -*/ -void -mem_reset( - struct memory *memory -) { - memset(memory->ewram, 0, sizeof(memory->ewram)); - memset(memory->iwram, 0, sizeof(memory->iwram)); - memset(memory->palram, 0, sizeof(memory->palram)); - memset(memory->vram, 0, sizeof(memory->vram)); - memset(memory->oam, 0, sizeof(memory->oam)); - memset(&memory->pbuffer, 0, sizeof(memory->pbuffer)); - memset(&memory->backup_storage.chip.flash, 0, sizeof(memory->backup_storage.chip.flash)); - memory->gamepak_bus_in_use = false; - memory->bios_bus = 0; - memory->backup_storage.chip.eeprom.state = EEPROM_STATE_READY; - memory->backup_storage.chip.eeprom.transfer_address = 0; - memory->backup_storage.chip.eeprom.transfer_data = 0; - memory->backup_storage.chip.eeprom.transfer_len = 0; -} - /* ** Set the waitstates for ROM/SRAM memory according to the content of REG_WAITCNT. */ diff --git a/source/gba/memory/storage/eeprom.c b/source/gba/memory/storage/eeprom.c index baf5e742..fa3a0c21 100644 --- a/source/gba/memory/storage/eeprom.c +++ b/source/gba/memory/storage/eeprom.c @@ -96,7 +96,7 @@ mem_eeprom_write8( eeprom->transfer_data = 0; for (i = 0; i < 8; ++i) { eeprom->transfer_data <<= 8; - eeprom->transfer_data |= gba->memory.backup_storage.data[eeprom->transfer_address + i]; + eeprom->transfer_data |= gba->shared_data.backup_storage.data[eeprom->transfer_address + i]; } break; @@ -122,9 +122,9 @@ mem_eeprom_write8( eeprom->transfer_len = 0; for (i = 0; i < 8; ++i) { - gba->memory.backup_storage.data[eeprom->transfer_address + i] = (eeprom->transfer_data >> (56 - 8 * i)) & 0xFF; + gba->shared_data.backup_storage.data[eeprom->transfer_address + i] = (eeprom->transfer_data >> (56 - 8 * i)) & 0xFF; } - gba->memory.backup_storage.dirty = true; + gba->shared_data.backup_storage.dirty = true; eeprom->state = EEPROM_STATE_END; } diff --git a/source/gba/memory/storage/flash.c b/source/gba/memory/storage/flash.c index c9d0f0b8..1a53fb23 100644 --- a/source/gba/memory/storage/flash.c +++ b/source/gba/memory/storage/flash.c @@ -29,7 +29,7 @@ mem_flash_read8( return (gba->memory.backup_storage.type == BACKUP_FLASH64 ? 0x1b : 0x13); } } - return (gba->memory.backup_storage.data[addr + flash->bank * FLASH64_SIZE]); + return (gba->shared_data.backup_storage.data[addr + flash->bank * FLASH64_SIZE]); } void @@ -55,8 +55,8 @@ mem_flash_write8( case FLASH_CMD_PREP_ERASE: flash->state = FLASH_STATE_ERASE; break; case FLASH_CMD_ERASE_CHIP: { if (flash->state == FLASH_STATE_ERASE) { - memset(gba->memory.backup_storage.data, 0xFF, backup_storage_sizes[gba->memory.backup_storage.type]); - gba->memory.backup_storage.dirty = true; + memset(gba->shared_data.backup_storage.data, 0xFF, gba->shared_data.backup_storage.size); + gba->shared_data.backup_storage.dirty = true; } break; }; @@ -72,12 +72,12 @@ mem_flash_write8( // Erase the desired sector addr &= 0xF000; - memset(gba->memory.backup_storage.data + addr + flash->bank * FLASH64_SIZE, 0xFF, 0x1000); - gba->memory.backup_storage.dirty = true; + memset(gba->shared_data.backup_storage.data + addr + flash->bank * FLASH64_SIZE, 0xFF, 0x1000); + gba->shared_data.backup_storage.dirty = true; flash->state = FLASH_STATE_READY; } else if (flash->state == FLASH_STATE_WRITE) { - gba->memory.backup_storage.data[addr + flash->bank * FLASH64_SIZE] = val; - gba->memory.backup_storage.dirty = true; + gba->shared_data.backup_storage.data[addr + flash->bank * FLASH64_SIZE] = val; + gba->shared_data.backup_storage.dirty = true; flash->state = FLASH_STATE_READY; } else if (flash->state == FLASH_STATE_BANK && addr == 0x0) { flash->bank = val; diff --git a/source/gba/memory/storage/storage.c b/source/gba/memory/storage/storage.c index 2314c95e..d8d4e3fe 100644 --- a/source/gba/memory/storage/storage.c +++ b/source/gba/memory/storage/storage.c @@ -17,8 +17,9 @@ #include #include #include "gba/gba.h" -#include "gba/db.h" +// TODO FIXME +#if 0 size_t backup_storage_sizes[] = { [BACKUP_NONE] = 0, [BACKUP_EEPROM_4K] = EEPROM_4K_SIZE, @@ -89,7 +90,6 @@ mem_backup_storage_detect( gba->memory.backup_storage.type = BACKUP_NONE; } } - void mem_backup_storage_init( struct gba *gba @@ -146,6 +146,7 @@ mem_backup_storage_init( gba->memory.backup_storage.data = NULL; } } +#endif uint8_t mem_backup_storage_read8( @@ -158,7 +159,7 @@ mem_backup_storage_read8( return (mem_flash_read8(gba, addr)); break; case BACKUP_SRAM: - return (gba->memory.backup_storage.data[addr & SRAM_MASK]); + return (gba->shared_data.backup_storage.data[addr & SRAM_MASK]); break; default: return (0); @@ -177,8 +178,8 @@ mem_backup_storage_write8( mem_flash_write8(gba, addr, val); break; case BACKUP_SRAM: - gba->memory.backup_storage.data[addr & SRAM_MASK] = val; - gba->memory.backup_storage.dirty = true; + gba->shared_data.backup_storage.data[addr & SRAM_MASK] = val; + gba->shared_data.backup_storage.dirty = true; break; default: break; diff --git a/source/gba/ppu/ppu.c b/source/gba/ppu/ppu.c index 56554718..86bb2699 100644 --- a/source/gba/ppu/ppu.c +++ b/source/gba/ppu/ppu.c @@ -289,7 +289,7 @@ ppu_draw_scanline( struct rich_color c; c = scanline->result[x]; - gba->framebuffer[GBA_SCREEN_WIDTH * y + x] = 0xFF000000 + gba->ppu.framebuffer[GBA_SCREEN_WIDTH * y + x] = 0xFF000000 | (((uint32_t)c.red << 3 ) | (((uint32_t)c.red >> 2) & 0b111)) << 0 | (((uint32_t)c.green << 3 ) | (((uint32_t)c.green >> 2) & 0b111)) << 8 | (((uint32_t)c.blue << 3 ) | (((uint32_t)c.blue >> 2) & 0b111)) << 16 @@ -297,49 +297,10 @@ ppu_draw_scanline( } } -/* -** Compose the content of the framebuffer based on the content of `scanline->result` and/or the backdrop color. -** This algorithm applies a color correction. -** -** NOTE: lcd_gamma is 4.0, out_gamma is 2.0. -** Reference: -** - https://near.sh/articles/video/color-emulation -*/ -static -void -ppu_draw_scanline_color_correction( - struct gba *gba, - struct scanline const *scanline -) { - uint32_t x; - uint32_t y; - - y = gba->io.vcount.raw; - for (x = 0; x < GBA_SCREEN_WIDTH; ++x) { - struct rich_color c; - float r; - float g; - float b; - - c = scanline->result[x]; - - r = c.red * c.red * c.red * c.red / (31.0 * 31.0 * 31.0 * 31.0); // <=> pow(c.red / 31.0, lcd_gamma); - g = c.green * c.green * c.green * c.green / (31.0 * 31.0 * 31.0 * 31.0); // <=> pow(c.green / 31.0, lcd_gamma); - b = c.blue * c.blue * c.blue * c.blue / (31.0 * 31.0 * 31.0 * 31.0); // <=> pow(c.blue / 31.0, lcd_gamma); - - gba->framebuffer[GBA_SCREEN_WIDTH * y + x] = 0xFF000000 - | (uint32_t)(sqrt( 0.196 * g + 1.000 * r) * 213.0) << 0 // <=> pow(r, 1.0 / out_gamma); - | (uint32_t)(sqrt(0.118 * b + 0.902 * g + 0.039 * r) * 240.0) << 8 // <=> pow(g, 1.0 / out_gamma); - | (uint32_t)(sqrt(0.863 * b + 0.039 * g + 0.196 * r) * 232.0) << 16 // <=> pow(b, 1.0 / out_gamma); - ; - } -} - /* ** Called when the PPU enters HDraw, this function updates some IO registers ** to reflect the progress of the PPU and eventually triggers an IRQ. */ -static void ppu_hdraw( struct gba *gba, @@ -354,7 +315,7 @@ ppu_hdraw( if (io->vcount.raw >= GBA_SCREEN_REAL_HEIGHT) { io->vcount.raw = 0; - ++gba->framecounter; + atomic_fetch_add(&gba->shared_data.frame_counter, 1); } else if (io->vcount.raw == GBA_SCREEN_HEIGHT) { /* ** Now that the frame is finished, we can copy the current framebuffer to @@ -362,9 +323,9 @@ ppu_hdraw( ** ** Doing it now will avoid tearing. */ - pthread_mutex_lock(&gba->framebuffer_frontend_mutex); - memcpy(gba->framebuffer_frontend, gba->framebuffer, sizeof(gba->framebuffer)); - pthread_mutex_unlock(&gba->framebuffer_frontend_mutex); + pthread_mutex_lock(&gba->shared_data.framebuffer.lock); + memcpy(gba->shared_data.framebuffer.data, gba->ppu.framebuffer, sizeof(gba->ppu.framebuffer)); + pthread_mutex_unlock(&gba->shared_data.framebuffer.lock); } io->dispstat.vcount_eq = (io->vcount.raw == io->dispstat.vcount_val); @@ -397,7 +358,6 @@ ppu_hdraw( ** Called when the PPU enters HBlank, this function updates some IO registers ** to reflect the progress of the PPU and eventually triggers an IRQ. */ -static void ppu_hblank( struct gba *gba, @@ -418,11 +378,7 @@ ppu_hblank( ppu_render_scanline(gba, &scanline); } - if (gba->color_correction) { - ppu_draw_scanline_color_correction(gba, &scanline); - } else { - ppu_draw_scanline(gba, &scanline); - } + ppu_draw_scanline(gba, &scanline); ppu_step_affine_internal_registers(gba); } @@ -446,34 +402,6 @@ ppu_hblank( } } -/* -** Initialize the PPU. -*/ -void -ppu_init( - struct gba *gba -) { - // HDraw - sched_add_event( - gba, - NEW_REPEAT_EVENT( - CYCLES_PER_PIXEL * GBA_SCREEN_REAL_WIDTH, // Timing of first trigger - CYCLES_PER_PIXEL * GBA_SCREEN_REAL_WIDTH, // Period - ppu_hdraw - ) - ); - - // HBlank - sched_add_event( - gba, - NEW_REPEAT_EVENT( - CYCLES_PER_PIXEL * GBA_SCREEN_WIDTH + 46, // Timing of first trigger - CYCLES_PER_PIXEL * GBA_SCREEN_REAL_WIDTH, // Period - ppu_hblank - ) - ); -} - /* ** Called when the CPU enters stop-mode to render the screen black. */ @@ -481,7 +409,7 @@ void ppu_render_black_screen( struct gba *gba ) { - pthread_mutex_lock(&gba->framebuffer_frontend_mutex); - memset(gba->framebuffer_frontend, 0x00, sizeof(gba->framebuffer)); - pthread_mutex_unlock(&gba->framebuffer_frontend_mutex); + pthread_mutex_lock(&gba->shared_data.framebuffer.lock); + memset(gba->shared_data.framebuffer.data, 0x00, sizeof(gba->ppu.framebuffer)); + pthread_mutex_unlock(&gba->shared_data.framebuffer.lock); } diff --git a/source/gba/quicksave.c b/source/gba/quicksave.c index 9faa9b5a..aca75833 100644 --- a/source/gba/quicksave.c +++ b/source/gba/quicksave.c @@ -8,130 +8,141 @@ \******************************************************************************/ #include -#include -#include -#include #include "gba/gba.h" -#include "gba/scheduler.h" -#include "compat.h" + +// Not always true, but it's for optimization purposes so it's not a big deal +// if the page size isn't 4k. +#define PAGE_SIZE 4096u +#define PAGE_MASK (PAGE_SIZE - 1) +#define PAGE_ALIGN(size) ((size + PAGE_SIZE) & ~PAGE_MASK) + +struct quicksave_buffer { + uint8_t *data; + size_t size; // Allocated size + size_t index; // Read/Write index +}; + +static +void +quicksave_write( + struct quicksave_buffer *buffer, + uint8_t const *data, + size_t length +) { + if (buffer->index + length > buffer->size) { + buffer->size = PAGE_ALIGN(buffer->size + length); + buffer->data = realloc(buffer->data, buffer->size); + hs_assert(buffer->data); + } + + hs_assert(buffer->size >= buffer->index + length); + + memcpy(buffer->data + buffer->index, data, length); + buffer->index += length; +} + +static +bool +quicksave_read( + struct quicksave_buffer *buffer, + uint8_t *data, + size_t length +) { + if (buffer->size < buffer->index + length) { + return (true); + } + + memcpy(data, buffer->data + buffer->index, length); + buffer->index += length; + return (false); +} /* -** Save the current state of the emulator in the file pointed by `path`. +** Save the current state of the emulator in the given buffer. */ void quicksave( struct gba const *gba, - char const *path + uint8_t **data, + size_t *size ) { - FILE *file; + struct quicksave_buffer buffer; size_t i; - file = hs_fopen(path, "wb"); - if (!file) { - goto err; - } - - if ( - fwrite(&gba->core, sizeof(gba->core), 1, file) != 1 - || fwrite(gba->memory.ewram, sizeof(gba->memory.ewram), 1, file) != 1 - || fwrite(gba->memory.iwram, sizeof(gba->memory.iwram), 1, file) != 1 - || fwrite(gba->memory.palram, sizeof(gba->memory.palram), 1, file) != 1 - || fwrite(gba->memory.vram, sizeof(gba->memory.vram), 1, file) != 1 - || fwrite(gba->memory.oam, sizeof(gba->memory.oam), 1, file) != 1 - || fwrite(&gba->memory.backup_storage.chip, sizeof(gba->memory.backup_storage.chip), 1, file) != 1 - || fwrite(&gba->memory.pbuffer, sizeof(gba->memory.pbuffer), 1, file) != 1 - || fwrite(&gba->memory.bios_bus, sizeof(gba->memory.bios_bus), 1, file) != 1 - || fwrite(&gba->memory.gamepak_bus_in_use, sizeof(gba->memory.gamepak_bus_in_use), 1, file) != 1 - || fwrite(&gba->io, sizeof(gba->io), 1, file) != 1 - || fwrite(&gba->ppu, sizeof(gba->ppu), 1, file) != 1 - || fwrite(&gba->gpio, sizeof(gba->gpio), 1, file) != 1 - || fwrite(&gba->apu.fifos, sizeof(gba->apu.fifos), 1, file) != 1 - || fwrite(&gba->apu.wave, sizeof(gba->apu.wave), 1, file) != 1 - || fwrite(&gba->apu.latch, sizeof(gba->apu.latch), 1, file) != 1 - || fwrite(&gba->scheduler.next_event, sizeof(uint64_t), 1, file) != 1 - ) { - goto err; - } + buffer.data = NULL; + buffer.size = 0; + buffer.index = 0; + + quicksave_write(&buffer, (uint8_t *)&gba->core, sizeof(gba->core)); + quicksave_write(&buffer, (uint8_t *)gba->memory.ewram, sizeof(gba->memory.ewram)); + quicksave_write(&buffer, (uint8_t *)gba->memory.iwram, sizeof(gba->memory.iwram)); + quicksave_write(&buffer, (uint8_t *)gba->memory.palram, sizeof(gba->memory.palram)); + quicksave_write(&buffer, (uint8_t *)gba->memory.vram, sizeof(gba->memory.vram)); + quicksave_write(&buffer, (uint8_t *)gba->memory.oam, sizeof(gba->memory.oam)); + quicksave_write(&buffer, (uint8_t *)&gba->memory.backup_storage.chip, sizeof(gba->memory.backup_storage.chip)); + quicksave_write(&buffer, (uint8_t *)&gba->memory.pbuffer, sizeof(gba->memory.pbuffer)); + quicksave_write(&buffer, (uint8_t *)&gba->memory.bios_bus, sizeof(gba->memory.bios_bus)); + quicksave_write(&buffer, (uint8_t *)&gba->memory.gamepak_bus_in_use, sizeof(gba->memory.gamepak_bus_in_use)); + quicksave_write(&buffer, (uint8_t *)&gba->io, sizeof(gba->io)); + quicksave_write(&buffer, (uint8_t *)&gba->ppu, sizeof(gba->ppu)); + quicksave_write(&buffer, (uint8_t *)&gba->gpio, sizeof(gba->gpio)); + quicksave_write(&buffer, (uint8_t *)&gba->apu.fifos, sizeof(gba->apu.fifos)); + quicksave_write(&buffer, (uint8_t *)&gba->apu.wave, sizeof(gba->apu.wave)); + quicksave_write(&buffer, (uint8_t *)&gba->apu.latch, sizeof(gba->apu.latch)); + quicksave_write(&buffer, (uint8_t *)&gba->scheduler.next_event, sizeof(uint64_t)); // Serialize the scheduler's event list for (i = 0; i < gba->scheduler.events_size; ++i) { struct scheduler_event *event; event = gba->scheduler.events + i; - if ( - fwrite(&event->active, sizeof(bool), 1, file) != 1 - || fwrite(&event->repeat, sizeof(bool), 1, file) != 1 - || fwrite(&event->at, sizeof(uint64_t), 1, file) != 1 - || fwrite(&event->period, sizeof(uint64_t), 1, file) != 1 - || fwrite(&event->args, sizeof(struct event_args), 1, file) != 1 - ) { - goto err; - } + quicksave_write(&buffer, (uint8_t *)&event->active, sizeof(bool)); + quicksave_write(&buffer, (uint8_t *)&event->repeat, sizeof(bool)); + quicksave_write(&buffer, (uint8_t *)&event->at, sizeof(uint64_t)); + quicksave_write(&buffer, (uint8_t *)&event->period, sizeof(uint64_t)); + quicksave_write(&buffer, (uint8_t *)&event->args, sizeof(struct event_args)); } - fflush(file); - - logln( - HS_INFO, - "State saved to %s%s%s", - g_light_magenta, - path, - g_reset - ); - - goto finally; - -err: - logln( - HS_INFO, - "%sError: failed to save state to %s: %s%s", - g_light_red, - path, - strerror(errno), - g_reset - ); - -finally: - - fclose(file); + *data = buffer.data; + *size = buffer.size; } /* -** Load a new state for the emulator from the content of the file pointed by `path`. +** Load a new state for the emulator from the given save state. */ -void +bool quickload( struct gba *gba, - char const *path + uint8_t *data, + size_t size ) { - FILE *file; + struct quicksave_buffer buffer; size_t i; - file = hs_fopen(path, "rb"); - if (!file) { - goto err; - } + buffer.data = data; + buffer.size = size; + buffer.index = 0; if ( - fread(&gba->core, sizeof(gba->core), 1, file) != 1 - || fread(gba->memory.ewram, sizeof(gba->memory.ewram), 1, file) != 1 - || fread(gba->memory.iwram, sizeof(gba->memory.iwram), 1, file) != 1 - || fread(gba->memory.palram, sizeof(gba->memory.palram), 1, file) != 1 - || fread(gba->memory.vram, sizeof(gba->memory.vram), 1, file) != 1 - || fread(gba->memory.oam, sizeof(gba->memory.oam), 1, file) != 1 - || fread(&gba->memory.backup_storage.chip, sizeof(gba->memory.backup_storage.chip), 1, file) != 1 - || fread(&gba->memory.pbuffer, sizeof(gba->memory.pbuffer), 1, file) != 1 - || fread(&gba->memory.bios_bus, sizeof(gba->memory.bios_bus), 1, file) != 1 - || fread(&gba->memory.gamepak_bus_in_use, sizeof(gba->memory.gamepak_bus_in_use), 1, file) != 1 - || fread(&gba->io, sizeof(gba->io), 1, file) != 1 - || fread(&gba->ppu, sizeof(gba->ppu), 1, file) != 1 - || fread(&gba->gpio, sizeof(gba->gpio), 1, file) != 1 - || fread(&gba->apu.fifos, sizeof(gba->apu.fifos), 1, file) != 1 - || fread(&gba->apu.wave, sizeof(gba->apu.wave), 1, file) != 1 - || fread(&gba->apu.latch, sizeof(gba->apu.latch), 1, file) != 1 - || fread(&gba->scheduler.next_event, sizeof(uint64_t), 1, file) != 1 + quicksave_read(&buffer, (uint8_t *)&gba->core, sizeof(gba->core)) + || quicksave_read(&buffer, (uint8_t *)gba->memory.ewram, sizeof(gba->memory.ewram)) + || quicksave_read(&buffer, (uint8_t *)gba->memory.iwram, sizeof(gba->memory.iwram)) + || quicksave_read(&buffer, (uint8_t *)gba->memory.palram, sizeof(gba->memory.palram)) + || quicksave_read(&buffer, (uint8_t *)gba->memory.vram, sizeof(gba->memory.vram)) + || quicksave_read(&buffer, (uint8_t *)gba->memory.oam, sizeof(gba->memory.oam)) + || quicksave_read(&buffer, (uint8_t *)&gba->memory.backup_storage.chip, sizeof(gba->memory.backup_storage.chip)) + || quicksave_read(&buffer, (uint8_t *)&gba->memory.pbuffer, sizeof(gba->memory.pbuffer)) + || quicksave_read(&buffer, (uint8_t *)&gba->memory.bios_bus, sizeof(gba->memory.bios_bus)) + || quicksave_read(&buffer, (uint8_t *)&gba->memory.gamepak_bus_in_use, sizeof(gba->memory.gamepak_bus_in_use)) + || quicksave_read(&buffer, (uint8_t *)&gba->io, sizeof(gba->io)) + || quicksave_read(&buffer, (uint8_t *)&gba->ppu, sizeof(gba->ppu)) + || quicksave_read(&buffer, (uint8_t *)&gba->gpio, sizeof(gba->gpio)) + || quicksave_read(&buffer, (uint8_t *)&gba->apu.fifos, sizeof(gba->apu.fifos)) + || quicksave_read(&buffer, (uint8_t *)&gba->apu.wave, sizeof(gba->apu.wave)) + || quicksave_read(&buffer, (uint8_t *)&gba->apu.latch, sizeof(gba->apu.latch)) + || quicksave_read(&buffer, (uint8_t *)&gba->scheduler.next_event, sizeof(uint64_t)) ) { - goto err; + return (true); } // Serialize the scheduler's event list @@ -140,39 +151,15 @@ quickload( event = gba->scheduler.events + i; if ( - fread(&event->active, sizeof(bool), 1, file) != 1 - || fread(&event->repeat, sizeof(bool), 1, file) != 1 - || fread(&event->at, sizeof(uint64_t), 1, file) != 1 - || fread(&event->period, sizeof(uint64_t), 1, file) != 1 - || fread(&event->args, sizeof(struct event_args), 1, file) != 1 + quicksave_read(&buffer, (uint8_t *)&event->active, sizeof(bool)) + || quicksave_read(&buffer, (uint8_t *)&event->repeat, sizeof(bool)) + || quicksave_read(&buffer, (uint8_t *)&event->at, sizeof(uint64_t)) + || quicksave_read(&buffer, (uint8_t *)&event->period, sizeof(uint64_t)) + || quicksave_read(&buffer, (uint8_t *)&event->args, sizeof(struct event_args)) ) { - goto err; + return (true); } } - logln( - HS_INFO, - "State loaded from %s%s%s", - g_light_magenta, - path, - g_reset - ); - - goto finally; - -err: - logln( - HS_INFO, - "%sError: failed to load state from %s: %s%s", - g_light_red, - path, - strerror(errno), - g_reset - ); - -finally: - - if (file) { - fclose(file); - } + return (false); } diff --git a/source/gba/scheduler.c b/source/gba/scheduler.c index adb07c85..e427563b 100644 --- a/source/gba/scheduler.c +++ b/source/gba/scheduler.c @@ -11,34 +11,7 @@ #include "gba/gba.h" #include "gba/scheduler.h" #include "gba/memory.h" - -void -sched_init( - struct gba *gba -) { - struct scheduler *scheduler; - - scheduler = &gba->scheduler; - - memset(scheduler, 0, sizeof(*scheduler)); - - // Pre-allocate 64 events - scheduler->events_size = 64; - scheduler->events = calloc(scheduler->events_size, sizeof(struct scheduler_event)); - hs_assert(scheduler->events); -} - -void -sched_cleanup( - struct gba *gba -) { - struct scheduler *scheduler; - - scheduler = &gba->scheduler; - free(scheduler->events); - scheduler->events = NULL; - scheduler->events_size = 0; -} +#include "common/compat.h" void sched_process_events( @@ -166,7 +139,9 @@ sched_run_for( target = core->cycles + cycles; #ifdef WITH_DEBUGGER - while (core->cycles < target && !gba->debugger.interrupt.flag) { + gba->debugger.interrupted = false; + + while (core->cycles < target && !gba->debugger.interrupted) { #else while (core->cycles < target) { #endif @@ -185,3 +160,37 @@ sched_run_for( } } } + +void +sched_frame_limiter( + struct gba *gba, + struct event_args args __unused +) { + if (gba->scheduler.speed) { + uint64_t now; + + now = hs_time(); + gba->scheduler.accumulated_time += now - gba->scheduler.time_last_frame; + gba->scheduler.time_last_frame = now; + + if (gba->scheduler.accumulated_time < gba->scheduler.time_per_frame) { + hs_usleep(gba->scheduler.time_per_frame - gba->scheduler.accumulated_time); + } + gba->scheduler.accumulated_time -= gba->scheduler.time_per_frame; + } else { + gba->scheduler.time_last_frame = hs_time(); + gba->scheduler.accumulated_time = 0; + } +} + +void +sched_update_speed( + struct gba *gba, + uint32_t speed +) { + struct scheduler *scheduler; + + scheduler = &gba->scheduler; + scheduler->speed = speed; + scheduler->time_per_frame = speed ? (1.f / 59.737f * 1000.f * 1000.f / (float)speed) : 0; +} diff --git a/source/gui/config.c b/source/gui/config.c index 7c643e61..aca579d4 100644 --- a/source/gui/config.c +++ b/source/gui/config.c @@ -12,7 +12,7 @@ #include "hades.h" #include "app.h" #include "gui/gui.h" -#include "compat.h" +#include "common/compat.h" void gui_config_load( @@ -74,17 +74,20 @@ gui_config_load( app->emulation.speed = max(1, min(app->emulation.speed, 5)); } - if (mjson_get_number(data, data_len, "$.emulation.backup_type", &d)) { - app->emulation.backup_type = (int)d; - app->emulation.backup_type = max(BACKUP_MIN, min(app->emulation.backup_type, BACKUP_MAX)); + if (mjson_get_bool(data, data_len, "$.emulation.backup_storage.autodetect", &b)) { + app->emulation.backup_storage.autodetect = b; } - if (mjson_get_bool(data, data_len, "$.emulation.rtc_autodetect", &b)) { - app->emulation.rtc_autodetect = b; + if (mjson_get_number(data, data_len, "$.emulation.backup_storage.type", &d)) { + app->emulation.backup_storage.type = max(BACKUP_MIN, min((int)d, BACKUP_MAX)); } - if (mjson_get_bool(data, data_len, "$.emulation.rtc_force_enabled", &b)) { - app->emulation.rtc_force_enabled = b; + if (mjson_get_bool(data, data_len, "$.emulation.rtc.autodetect", &b)) { + app->emulation.rtc.autodetect = b; + } + + if (mjson_get_bool(data, data_len, "$.emulation.rtc.enabled", &b)) { + app->emulation.rtc.enabled = b; } if (mjson_get_bool(data, data_len, "$.emulation.skip_bios", &b)) { @@ -116,9 +119,8 @@ gui_config_load( } if (mjson_get_number(data, data_len, "$.video.texture_filter", &d)) { - app->video.texture_filter.kind = (int)d; - app->video.texture_filter.kind = max(TEXTURE_FILTER_MIN, min(app->video.texture_filter.kind, TEXTURE_FILTER_MAX)); - app->video.texture_filter.refresh = true; + app->gfx.texture_filter = (int)d; + app->gfx.texture_filter = max(TEXTURE_FILTER_MIN, min(app->gfx.texture_filter, TEXTURE_FILTER_MAX)); } } @@ -209,9 +211,14 @@ gui_config_save( "skip_bios": %B, "speed": %d, "unbounded": %B, - "backup_type": %d, - "rtc_autodetect": %B, - "rtc_force_enabled": %B + "backup_storage": { + "autodetect": %B, + "type": %d + }, + "rtc": { + "autodetect": %B, + "enabled": %B + } }, // Video @@ -238,14 +245,15 @@ gui_config_save( (int)app->emulation.skip_bios, (int)app->emulation.speed, (int)app->emulation.unbounded, - (int)app->emulation.backup_type, - (int)app->emulation.rtc_autodetect, - (int)app->emulation.rtc_force_enabled, + (int)app->emulation.backup_storage.autodetect, + (int)app->emulation.backup_storage.type, + (int)app->emulation.rtc.autodetect, + (int)app->emulation.rtc.enabled, (int)app->video.display_size, (int)app->video.aspect_ratio, (int)app->video.vsync, (int)app->video.color_correction, - (int)app->video.texture_filter.kind, + (int)app->gfx.texture_filter, (int)app->audio.mute, app->audio.level ); @@ -334,18 +342,19 @@ gui_config_save( */ void gui_config_push_recent_rom( - struct app *app + struct app *app, + char const *rom_path ) { char *new_recent_roms[MAX_RECENT_ROMS]; int32_t i; int32_t j; memset(new_recent_roms, 0, sizeof(new_recent_roms)); - new_recent_roms[0] = strdup(app->file.game_path); + new_recent_roms[0] = strdup(rom_path); j = 0; for (i = 1; i < MAX_RECENT_ROMS && j < MAX_RECENT_ROMS; ++j) { - if (!app->file.recent_roms[j] || strcmp(app->file.recent_roms[j], app->file.game_path)) { + if (!app->file.recent_roms[j] || strcmp(app->file.recent_roms[j], rom_path)) { new_recent_roms[i] = app->file.recent_roms[j]; ++i; } else { diff --git a/source/gui/meson.build b/source/gui/meson.build index 3201e3ba..163f1900 100644 --- a/source/gui/meson.build +++ b/source/gui/meson.build @@ -14,6 +14,8 @@ libgui = static_library( 'sdl/init.c', 'sdl/input.c', 'sdl/video.c', + 'shaders/frag-color-correction.c', + 'shaders/vertex-common.c', 'windows/error.c', 'windows/game.c', 'windows/keybinds.c', diff --git a/source/gui/sdl/audio.c b/source/gui/sdl/audio.c index 9d4cd79e..070ca2a8 100644 --- a/source/gui/sdl/audio.c +++ b/source/gui/sdl/audio.c @@ -35,13 +35,13 @@ gui_sdl_audio_callback( stream = (int16_t *)raw_stream; len = raw_stream_len / (2 * sizeof(*stream)); - pthread_mutex_lock(&gba->apu.frontend_channels_mutex); + pthread_mutex_lock(&gba->shared_data.audio_rbuffer_mutex); for (i = 0; i < len; ++i) { uint32_t val; int16_t left; int16_t right; - val = apu_rbuffer_pop(&gba->apu.frontend_channels); + val = apu_rbuffer_pop(&gba->shared_data.audio_rbuffer); left = (int16_t)((val >> 16) & 0xFFFF); right = (int16_t)(val & 0xFFFF); @@ -49,7 +49,7 @@ gui_sdl_audio_callback( stream[1] = (int16_t)(right * !app->audio.mute * app->audio.level); stream += 2; } - pthread_mutex_unlock(&gba->apu.frontend_channels_mutex); + pthread_mutex_unlock(&gba->shared_data.audio_rbuffer_mutex); } void @@ -73,7 +73,7 @@ gui_sdl_audio_init( exit(EXIT_FAILURE); } - gba_send_audio_resample_freq(app->emulation.gba, CYCLES_PER_SECOND / have.freq); + app->audio.resample_frequency = have.freq; SDL_PauseAudioDevice(app->sdl.audio_device, SDL_FALSE); } diff --git a/source/gui/sdl/input.c b/source/gui/sdl/input.c index 3d62ff89..164f14fd 100644 --- a/source/gui/sdl/input.c +++ b/source/gui/sdl/input.c @@ -15,6 +15,7 @@ #include #include "hades.h" #include "app.h" +#include "common/channel/event.h" #include "gui/gui.h" void @@ -129,19 +130,19 @@ gui_sdl_handle_bind( bool pressed ) { switch (bind) { - case BIND_GBA_UP: gba_send_keyinput(app->emulation.gba, KEY_UP, pressed); break; - case BIND_GBA_DOWN: gba_send_keyinput(app->emulation.gba, KEY_DOWN, pressed); break; - case BIND_GBA_LEFT: gba_send_keyinput(app->emulation.gba, KEY_LEFT, pressed); break; - case BIND_GBA_RIGHT: gba_send_keyinput(app->emulation.gba, KEY_RIGHT, pressed); break; - case BIND_GBA_A: gba_send_keyinput(app->emulation.gba, KEY_A, pressed); break; - case BIND_GBA_B: gba_send_keyinput(app->emulation.gba, KEY_B, pressed); break; - case BIND_GBA_L: gba_send_keyinput(app->emulation.gba, KEY_L, pressed); break; - case BIND_GBA_R: gba_send_keyinput(app->emulation.gba, KEY_R, pressed); break; - case BIND_GBA_SELECT: gba_send_keyinput(app->emulation.gba, KEY_SELECT, pressed); break; - case BIND_GBA_START: gba_send_keyinput(app->emulation.gba, KEY_START, pressed); break; + case BIND_GBA_UP: app_game_key(app, KEY_UP, pressed); break; + case BIND_GBA_DOWN: app_game_key(app, KEY_DOWN, pressed); break; + case BIND_GBA_LEFT: app_game_key(app, KEY_LEFT, pressed); break; + case BIND_GBA_RIGHT: app_game_key(app, KEY_RIGHT, pressed); break; + case BIND_GBA_A: app_game_key(app, KEY_A, pressed); break; + case BIND_GBA_B: app_game_key(app, KEY_B, pressed); break; + case BIND_GBA_L: app_game_key(app, KEY_L, pressed); break; + case BIND_GBA_R: app_game_key(app, KEY_R, pressed); break; + case BIND_GBA_SELECT: app_game_key(app, KEY_SELECT, pressed); break; + case BIND_GBA_START: app_game_key(app, KEY_START, pressed); break; case BIND_EMULATOR_SPEED_MAX_HOLD: { app->emulation.unbounded = pressed; - gba_send_speed(app->emulation.gba, app->emulation.speed * !app->emulation.unbounded); + app_game_speed(app, app->emulation.speed * !app->emulation.unbounded); break; }; default: break; @@ -160,12 +161,12 @@ gui_sdl_handle_bind( case BIND_EMULATOR_SPEED_X5: { app->emulation.unbounded = false; app->emulation.speed = 1 + (bind - BIND_EMULATOR_SPEED_X1); - gba_send_speed(app->emulation.gba, app->emulation.speed); + app_game_speed(app, app->emulation.speed * !app->emulation.unbounded); break; }; case BIND_EMULATOR_SPEED_MAX_TOGGLE: { app->emulation.unbounded ^= true; - gba_send_speed(app->emulation.gba, app->emulation.speed * !app->emulation.unbounded); + app_game_speed(app, app->emulation.speed * !app->emulation.unbounded); break; }; case BIND_EMULATOR_SCREENSHOT: app_game_screenshot(app); break; diff --git a/source/gui/sdl/video.c b/source/gui/sdl/video.c index 4e10655e..e54947ee 100644 --- a/source/gui/sdl/video.c +++ b/source/gui/sdl/video.c @@ -10,6 +10,7 @@ #define SDL_MAIN_HANDLED #define CIMGUI_DEFINE_ENUMS_AND_STRUCTS +#include #include #include #include @@ -19,6 +20,8 @@ #include "gui/gui.h" #include "gba/gba.h" +static GLuint build_shader_program(char const *name, char const *frag_path, char const *vertex_path); + void gui_sdl_video_init( struct app *app @@ -107,8 +110,8 @@ gui_sdl_video_init( /* Create the OpenGL context */ - app->sdl.gl_context = SDL_GL_CreateContext(app->sdl.window); - SDL_GL_MakeCurrent(app->sdl.window, app->sdl.gl_context); + app->gfx.gl_context = SDL_GL_CreateContext(app->sdl.window); + SDL_GL_MakeCurrent(app->sdl.window, app->gfx.gl_context); /* Enable VSync */ SDL_GL_SetSwapInterval(app->video.vsync); @@ -139,11 +142,38 @@ gui_sdl_video_init( ImFontAtlas_AddFontDefault(app->ui.ioptr->Fonts, cfg); ImGuiStyle_ScaleAllSizes(igGetStyle(), app->ui.scale); - ImGui_ImplSDL2_InitForOpenGL(app->sdl.window, app->sdl.gl_context); + ImGui_ImplSDL2_InitForOpenGL(app->sdl.window, app->gfx.gl_context); ImGui_ImplOpenGL3_Init(glsl_version); - /* Create the OpenGL texture that will hold the game's output */ - glGenTextures(1, &app->sdl.game_texture); + /* Create the OpenGL objects required to build the pipeline */ + glGenTextures(1, &app->gfx.game_texture_in); + glGenTextures(1, &app->gfx.game_texture_out); + app->gfx.program_color_correction = build_shader_program("color_correction", SHADER_FRAG_COLOR_CORRECTION, SHADER_VERTEX_COMMON); + glGenFramebuffers(1, &app->gfx.fbo); + glGenVertexArrays(1, &app->gfx.vao); + glGenBuffers(1, &app->gfx.vbo); + + float vertices[] = { + // position | UV coord + -1., 1., 0., 1., // Top left + 1., 1., 1., 1., // Top right + 1., -1., 1., 0., // Bottom right + 1., -1., 1., 0., // Bottom right + -1., -1., 0., 0., // Bottom left + -1., 1., 0., 1., // Top left + }; + + /* Setup the OpenGL objects */ + glBindVertexArray(app->gfx.vao); + glBindBuffer(GL_ARRAY_BUFFER, app->gfx.vbo); + glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); + glVertexAttribPointer(0, 2, GL_FLOAT, false, 4 * sizeof(float), 0); // position + glEnableVertexAttribArray(0); + glVertexAttribPointer(1, 2, GL_FLOAT, false, 4 * sizeof(float), (void *)(2 * sizeof(float))); // UV + glEnableVertexAttribArray(1); + + /* Build the OpenGL pipeline. */ + gui_sdl_video_rebuild_pipeline(app); /* Setup the game controller stuff */ app->sdl.controller.ptr = NULL; @@ -154,6 +184,181 @@ gui_sdl_video_init( NFD_Init(); } +void +gui_sdl_video_rebuild_pipeline( + struct app *app +) { + GLint texture_filter; + + switch (app->gfx.texture_filter) { + case TEXTURE_FILTER_LINEAR: texture_filter = GL_LINEAR; break; + case TEXTURE_FILTER_NEAREST: texture_filter = GL_NEAREST; break; + default: texture_filter = GL_NEAREST; break; + } + + // Setup the input texture (RGBA) + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, app->gfx.game_texture_in); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + glTexImage2D( + GL_TEXTURE_2D, + 0, + GL_RGBA, + GBA_SCREEN_WIDTH, + GBA_SCREEN_HEIGHT, + 0, + GL_RGBA, + GL_UNSIGNED_BYTE, + NULL + ); + + // Setup the output texture (RGBA) + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, app->gfx.game_texture_out); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, texture_filter); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, texture_filter); + glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + glTexImage2D( + GL_TEXTURE_2D, + 0, + GL_RGBA, + GBA_SCREEN_WIDTH, + GBA_SCREEN_HEIGHT, + 0, + GL_RGBA, + GL_UNSIGNED_BYTE, + NULL + ); + + app->gfx.active_programs_length = 0; + + if (app->video.color_correction) { + app->gfx.active_programs[app->gfx.active_programs_length] = app->gfx.program_color_correction; + ++app->gfx.active_programs_length; + } + + glBindFramebuffer(GL_FRAMEBUFFER, app->gfx.fbo); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, app->gfx.game_texture_out, 0); + + glBindFramebuffer(GL_FRAMEBUFFER, 0); + glBindTexture(GL_TEXTURE_2D, 0); +} + +struct shader_descriptor { + char const *path; + GLenum type; + char *src; + GLuint shader; +}; + +static +GLuint +build_shader_program( + char const *name, + char const *frag_src, + char const *vertex_src +) { + GLuint program; + GLuint frag; + GLuint vertex; + GLint status; + GLint len; + + // Create the program + program = glCreateProgram(); + + // Compile the fragment shader + frag = glCreateShader(GL_FRAGMENT_SHADER); + len = strlen(frag_src); + glShaderSource(frag, 1, &frag_src, &len); + glCompileShader(frag); + + // Check the fragment shader compiled correctly + glGetShaderiv(frag, GL_COMPILE_STATUS, &status); + if (status != GL_TRUE) { + GLint log_len; + GLchar *error; + + log_len = 0; + glGetShaderiv(frag, GL_INFO_LOG_LENGTH, &log_len); + + error = calloc(log_len, 1); + hs_assert(error); + + glGetShaderInfoLog(frag, log_len, &log_len, error); + + panic( + HS_ERROR, + "Failed to compile the \"%s%s%s/fragment%s\" shader:\n" + "====== BEGIN ======\n" + "%s" + "====== END ======", + g_bold, + g_magenta, + name, + g_reset, + error + ); + } + + // Attach the fragment shader to the program + glAttachShader(program, frag); + + // Compile the vertex shader + vertex = glCreateShader(GL_VERTEX_SHADER); + len = strlen(vertex_src); + glShaderSource(vertex, 1, &vertex_src, &len); + glCompileShader(vertex); + + // Check the vertex shader compiled correctly + glGetShaderiv(vertex, GL_COMPILE_STATUS, &status); + if (status != GL_TRUE) { + GLint log_len; + GLchar *error; + + log_len = 0; + glGetShaderiv(vertex, GL_INFO_LOG_LENGTH, &log_len); + + error = calloc(log_len, 1); + hs_assert(error); + + glGetShaderInfoLog(vertex, log_len, &log_len, error); + + panic( + HS_ERROR, + "Failed to compile the \"%s%s%s/vertex%s\" shader:\n" + "====== BEGIN ======\n" + "%s" + "====== END ======", + g_bold, + g_magenta, + name, + g_reset, + error + ); + } + + // Attach the vertex shader to the program + glAttachShader(program, vertex); + + // Link the program + glLinkProgram(program); + glGetShaderiv(program, GL_LINK_STATUS, &status); + if (status != GL_TRUE) { + panic(HS_ERROR, "Failed to link shader."); + } + + // Detach and delete both shaders + glDetachShader(program, frag); + glDetachShader(program, vertex); + glDeleteShader(frag); + glDeleteShader(vertex); + + return program; +} + void gui_sdl_video_cleanup( struct app *app @@ -167,8 +372,13 @@ gui_sdl_video_cleanup( igDestroyContext(NULL); // Cleanup OpenGL - glDeleteTextures(1, &app->sdl.game_texture); - SDL_GL_DeleteContext(app->sdl.gl_context); + glDeleteProgram(app->gfx.program_color_correction); + glDeleteBuffers(1, &app->gfx.vbo); + glDeleteVertexArrays(1, &app->gfx.vbo); + glDeleteFramebuffers(1, &app->gfx.fbo); + glDeleteTextures(1, &app->gfx.game_texture_in); + glDeleteTextures(1, &app->gfx.game_texture_out); + SDL_GL_DeleteContext(app->gfx.gl_context); // Close the Wingowd SDL_DestroyWindow(app->sdl.window); @@ -187,7 +397,7 @@ gui_sdl_video_render_frame( gui_win_menubar(app); - if (app->emulation.started) { + if (app->emulation.is_started) { gui_win_game(app); } @@ -198,11 +408,11 @@ gui_sdl_video_render_frame( /* Render the imGui frame */ igRender(); - SDL_GL_MakeCurrent(app->sdl.window, app->sdl.gl_context); + SDL_GL_MakeCurrent(app->sdl.window, app->gfx.gl_context); glViewport(0, 0, (int)app->ui.ioptr->DisplaySize.x, (int)app->ui.ioptr->DisplaySize.y); /* Change the background color if the game is running */ - if (app->emulation.started) { + if (app->emulation.is_started) { glClearColor(0.f, 0.f, 0.f, 1.f); } else { glClearColor(176.f / 255.f, 124.f / 255.f, 223.f / 255.f, 1.f); diff --git a/source/gui/shaders/frag-color-correction.c b/source/gui/shaders/frag-color-correction.c new file mode 100644 index 00000000..8a6f6abc --- /dev/null +++ b/source/gui/shaders/frag-color-correction.c @@ -0,0 +1,33 @@ +#include "gui/gui.h" + +/* +** Color correction algorithm by Higan Emu. +** +** Reference: +** - https://github.com/higan-emu/emulation-articles/tree/master/video/color-emulation +*/ +char const *SHADER_FRAG_COLOR_CORRECTION = GLSL( + layout(location = 0) out vec4 frag_color; + + in vec2 v_uv; + + uniform sampler2D u_screen_map; + + void main() { + vec4 color = texture(u_screen_map, v_uv); + float lcd_gamma = 4.0; + float out_gamma = 2.2; + + color.rgb = pow(color.rgb, vec3(lcd_gamma)); + + color.rgb = vec3( + 1.000 * color.r + 0.196 * color.g + 0.000 * color.b, + 0.039 * color.r + 0.902 * color.g + 0.118 * color.b, + 0.196 * color.r + 0.039 * color.g + 0.863 * color.b + ); + + color.rgb = pow(color.rgb, vec3(1.0 / out_gamma)); + + frag_color = vec4(color.rgb, 1.0); + } +); diff --git a/source/gui/shaders/vertex-common.c b/source/gui/shaders/vertex-common.c new file mode 100644 index 00000000..da086994 --- /dev/null +++ b/source/gui/shaders/vertex-common.c @@ -0,0 +1,13 @@ +#include "gui/gui.h" + +char const *SHADER_VERTEX_COMMON = GLSL( + layout(location = 0) in vec2 position; + layout(location = 1) in vec2 uv; + + out vec2 v_uv; + + void main() { + v_uv = uv; + gl_Position = vec4(position, 0.0, 1.0); + } +); diff --git a/source/gui/windows/error.c b/source/gui/windows/error.c index c3ed1b20..a6e2ea03 100644 --- a/source/gui/windows/error.c +++ b/source/gui/windows/error.c @@ -18,6 +18,8 @@ gui_new_error( struct app *app, char *msg ) { + logln(HS_ERROR, "Error: %s", msg); + free(app->ui.error.msg); app->ui.error.msg = msg; app->ui.error.active = true; @@ -32,7 +34,6 @@ gui_win_error( if (app->ui.error.active) { app->ui.error.active = false; igOpenPopup("Error", ImGuiPopupFlags_None); - logln(HS_ERROR, "Error: %s", app->ui.error.msg); } // #B2354E diff --git a/source/gui/windows/game.c b/source/gui/windows/game.c index 238a6bf1..be20a912 100644 --- a/source/gui/windows/game.c +++ b/source/gui/windows/game.c @@ -19,12 +19,56 @@ void gui_win_game( struct app *app ) { - GLint last_texture; float game_pos_x; float game_pos_y; float game_size_x; float game_size_y; + if (!app->gfx.active_programs_length) { + // If there's no shaders loaded, we shortcut the pipeline and simply load the game's framebuffer in the corresponding texture + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, app->gfx.game_texture_out); + + pthread_mutex_lock(&app->emulation.gba->shared_data.framebuffer.lock); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, GBA_SCREEN_WIDTH, GBA_SCREEN_HEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE, (uint8_t *)app->emulation.gba->shared_data.framebuffer.data); + pthread_mutex_unlock(&app->emulation.gba->shared_data.framebuffer.lock); + + glBindTexture(GL_TEXTURE_2D, 0); + } else { + size_t i; + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, app->gfx.game_texture_in); + + pthread_mutex_lock(&app->emulation.gba->shared_data.framebuffer.lock); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, GBA_SCREEN_WIDTH, GBA_SCREEN_HEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE, (uint8_t *)app->emulation.gba->shared_data.framebuffer.data); + pthread_mutex_unlock(&app->emulation.gba->shared_data.framebuffer.lock); + + glViewport(0, 0, GBA_SCREEN_WIDTH, GBA_SCREEN_HEIGHT); + glBindVertexArray(app->gfx.vao); + glBindFramebuffer(GL_FRAMEBUFFER, app->gfx.fbo); + + for (i = 0; i < app->gfx.active_programs_length; ++i) { + GLuint target_texture; + + glUseProgram(app->gfx.active_programs[i]); + if (i == app->gfx.active_programs_length - 1) { + target_texture = app->gfx.game_texture_out; + } else { + target_texture = app->gfx.game_texture_in; + } + + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, target_texture, 0); + glDrawArrays(GL_TRIANGLES, 0, 6); + } + + glUseProgram(0); + glBindFramebuffer(GL_FRAMEBUFFER, 0); + glBindVertexArray(0); + glBindTexture(GL_TEXTURE_2D, 0); + } + /* Resize the game to keep the correct aspect ratio */ switch (app->video.aspect_ratio) { case ASPECT_RATIO_RESIZE: @@ -62,35 +106,8 @@ gui_win_game( ImGuiWindowFlags_NoBackground ); - glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture); - glBindTexture(GL_TEXTURE_2D, app->sdl.game_texture); - - if (app->video.texture_filter.refresh) { - switch (app->video.texture_filter.kind) { - case TEXTURE_FILTER_NEAREST: { - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - break; - }; - case TEXTURE_FILTER_LINEAR: { - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - break; - }; - - } - app->video.texture_filter.refresh = false; - } - - glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); - pthread_mutex_lock(&app->emulation.gba->framebuffer_frontend_mutex); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, GBA_SCREEN_WIDTH, GBA_SCREEN_HEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE, (uint8_t *)app->emulation.gba->framebuffer_frontend); - pthread_mutex_unlock(&app->emulation.gba->framebuffer_frontend_mutex); - - glBindTexture(GL_TEXTURE_2D, last_texture); - igImage( - (void *)(uintptr_t)app->sdl.game_texture, + (void *)(uintptr_t)app->gfx.game_texture_out, (ImVec2){.x = game_size_x, .y = game_size_y}, (ImVec2){.x = 0, .y = 0}, (ImVec2){.x = 1, .y = 1}, diff --git a/source/gui/windows/menubar.c b/source/gui/windows/menubar.c index d452126a..2292c50b 100644 --- a/source/gui/windows/menubar.c +++ b/source/gui/windows/menubar.c @@ -18,7 +18,7 @@ #include "hades.h" #include "app.h" #include "gui/gui.h" -#include "compat.h" +#include "common/compat.h" static void @@ -38,8 +38,7 @@ gui_win_menubar_file( ); if (result == NFD_OKAY) { - free(app->file.game_path); - app->file.game_path = strdup(path); + app_game_configure(app, path); NFD_FreePath(path); app_game_reset(app); app_game_run(app); @@ -51,10 +50,17 @@ gui_win_menubar_file( for (x = 0; x < array_length(app->file.recent_roms) && app->file.recent_roms[x]; ++x) { if (igMenuItemBool(hs_basename(app->file.recent_roms[x]), NULL, false, true)) { - free(app->file.game_path); - app->file.game_path = strdup(app->file.recent_roms[x]); + char *path; + + // app->file.recent_roms[] is modified by `app_game_configure()` so we need to copy + // the path to a safe space first. + path = strdup(app->file.recent_roms[x]); + + app_game_configure(app, path); app_game_reset(app); app_game_run(app); + + free(path); } } igEndMenu(); @@ -98,7 +104,7 @@ gui_win_menubar_emulation( app->emulation.skip_bios ^= 1; } - if (igBeginMenu("Speed", app->emulation.started)) { + if (igBeginMenu("Speed", app->emulation.is_started)) { uint32_t x; char const *speed[] = { "Unbounded", @@ -116,13 +122,13 @@ gui_win_menubar_emulation( bind = SDL_GetKeyName(app->binds.keyboard[BIND_EMULATOR_SPEED_MAX_TOGGLE]); if (igMenuItemBool(speed[x], bind ? bind : "", app->emulation.unbounded, true)) { app->emulation.unbounded ^= 1; - gba_send_speed(app->emulation.gba, app->emulation.speed * !app->emulation.unbounded); + app_game_speed(app, app->emulation.speed * !app->emulation.unbounded); } igSeparator(); } else { if (igMenuItemBool(speed[x], NULL, app->emulation.speed == x, !app->emulation.unbounded)) { app->emulation.speed = x; - gba_send_speed(app->emulation.gba, app->emulation.speed * !app->emulation.unbounded); + app_game_speed(app, app->emulation.speed * !app->emulation.unbounded); } } } @@ -132,18 +138,12 @@ gui_win_menubar_emulation( igSeparator(); - if (igBeginMenu("Quick Save", app->emulation.started)) { + if (igBeginMenu("Quick Save", app->emulation.is_started)) { size_t i; for (i = 0; i < MAX_QUICKSAVES; ++i) { char *text; - if (app->file.flush_qsaves_cache) { - free(app->file.qsaves[i].mtime); - app->file.qsaves[i].exist = hs_fexists(app->file.qsaves[i].path); - app->file.qsaves[i].mtime = hs_fmtime(app->file.qsaves[i].path); - } - if (app->file.qsaves[i].exist && app->file.qsaves[i].mtime) { hs_assert(asprintf(&text, "%zu: %s", i + 1, app->file.qsaves[i].mtime) != -1); } else { @@ -159,25 +159,15 @@ gui_win_menubar_emulation( free(text); } - app->file.flush_qsaves_cache = false; - igEndMenu(); - } else { - app->file.flush_qsaves_cache = true; } - if (igBeginMenu("Quick Load", app->emulation.started)) { + if (igBeginMenu("Quick Load", app->emulation.is_started)) { size_t i; for (i = 0; i < MAX_QUICKSAVES; ++i) { char *text; - if (app->file.flush_qsaves_cache) { - free(app->file.qsaves[i].mtime); - app->file.qsaves[i].exist = hs_fexists(app->file.qsaves[i].path); - app->file.qsaves[i].mtime = hs_fmtime(app->file.qsaves[i].path); - } - if (app->file.qsaves[i].exist && app->file.qsaves[i].mtime) { hs_assert(asprintf(&text, "%zu: %s", i + 1, app->file.qsaves[i].mtime) != -1); } else { @@ -193,71 +183,60 @@ gui_win_menubar_emulation( free(text); } - app->file.flush_qsaves_cache = false; - igEndMenu(); - } else { - app->file.flush_qsaves_cache = true; } igSeparator(); - if (igBeginMenu("Backup type", !app->emulation.started)) { + if (igBeginMenu("Backup Storage", !app->emulation.is_started)) { uint32_t x; - char const *backup_types[] = { - "None", - "EEPROM 4k", - "EEPROM 64k", - "SRAM", - "Flash 64k", - "Flash 128k" - }; - if (igMenuItemBool("Auto-detect", NULL, app->emulation.backup_type == BACKUP_AUTO_DETECT, true)) { - app->emulation.backup_type = BACKUP_AUTO_DETECT; + if (igMenuItemBool("Auto-detect", NULL, app->emulation.backup_storage.autodetect, true)) { + app->emulation.backup_storage.autodetect ^= 1; } igSeparator(); - for (x = 0; x < array_length(backup_types); ++x) { - if (igMenuItemBool(backup_types[x], NULL, app->emulation.backup_type == x, true)) { - app->emulation.backup_type = x; + for (x = BACKUP_MIN; x < BACKUP_LEN; ++x) { + if (igMenuItemBool(backup_storage_names[x], NULL, !app->emulation.backup_storage.autodetect && app->emulation.backup_storage.type == x, true)) { + app->emulation.backup_storage.type = x; + app->emulation.backup_storage.autodetect = false; } } igEndMenu(); } - /* GPIO */ - if (igBeginMenu("Devices", !app->emulation.started)) { + /* Backup storage & GPIO */ + if (igBeginMenu("Devices", !app->emulation.is_started)) { igText("RTC"); igSeparator(); - if (igMenuItemBool("Auto-detect", NULL, app->emulation.rtc_autodetect, true)) { - app->emulation.rtc_autodetect ^= 1; + if (igMenuItemBool("Auto-detect", NULL, app->emulation.rtc.autodetect, true)) { + app->emulation.rtc.autodetect ^= 1; } - if (igMenuItemBool("Enable", NULL, app->emulation.rtc_force_enabled, !app->emulation.rtc_autodetect)) { - app->emulation.rtc_force_enabled ^= 1; + if (igMenuItemBool("Enable", NULL, app->emulation.rtc.enabled, !app->emulation.rtc.autodetect)) { + app->emulation.rtc.enabled ^= 1; } igEndMenu(); } igSeparator(); - if (igMenuItemBool("Pause", NULL, !app->emulation.running, app->emulation.started)) { - if (app->emulation.running) { + if (igMenuItemBool("Pause", NULL, !app->emulation.is_running, app->emulation.is_started)) { + if (app->emulation.is_running) { app_game_pause(app); } else { app_game_run(app); } } - if (igMenuItemBool("Stop", NULL, false, app->emulation.started)) { + if (igMenuItemBool("Stop", NULL, false, app->emulation.is_started)) { app_game_stop(app); } - if (igMenuItemBool("Reset", NULL, false, app->emulation.started)) { + if (igMenuItemBool("Reset", NULL, false, app->emulation.is_started)) { app_game_reset(app); app_game_run(app); } @@ -347,14 +326,14 @@ gui_win_menubar_video( /* Texture Filter */ if (igBeginMenu("Texture Filter", true)) { - if (igMenuItemBool("Nearest", NULL, app->video.texture_filter.kind == TEXTURE_FILTER_NEAREST, true)) { - app->video.texture_filter.kind = TEXTURE_FILTER_NEAREST; - app->video.texture_filter.refresh = true; + if (igMenuItemBool("Nearest", NULL, app->gfx.texture_filter == TEXTURE_FILTER_NEAREST, true)) { + app->gfx.texture_filter = TEXTURE_FILTER_NEAREST; + gui_sdl_video_rebuild_pipeline(app); } - if (igMenuItemBool("Linear", NULL, app->video.texture_filter.kind == TEXTURE_FILTER_LINEAR, true)) { - app->video.texture_filter.kind = TEXTURE_FILTER_LINEAR; - app->video.texture_filter.refresh = true; + if (igMenuItemBool("Linear", NULL, app->gfx.texture_filter == TEXTURE_FILTER_LINEAR, true)) { + app->gfx.texture_filter = TEXTURE_FILTER_LINEAR; + gui_sdl_video_rebuild_pipeline(app); } igEndMenu(); @@ -363,7 +342,7 @@ gui_win_menubar_video( /* Color Correction */ if (igMenuItemBool("Color correction", NULL, app->video.color_correction, true)) { app->video.color_correction ^= 1; - gba_send_settings_color_correction(app->emulation.gba, app->video.color_correction); + gui_sdl_video_rebuild_pipeline(app); } /* VSync */ @@ -376,7 +355,7 @@ gui_win_menubar_video( /* Take a screenshot */ bind = SDL_GetKeyName(app->binds.keyboard[BIND_EMULATOR_SCREENSHOT]); - if (igMenuItemBool("Screenshot", bind ? bind : "", false, app->emulation.started)) { + if (igMenuItemBool("Screenshot", bind ? bind : "", false, app->emulation.is_started)) { app_game_screenshot(app); } @@ -477,7 +456,7 @@ gui_win_menubar_fps_counter( struct app *app ) { /* FPS Counter */ - if (app->emulation.started && app->emulation.running) { + if (app->emulation.is_started && app->emulation.is_running) { float spacing; ImVec2 out; diff --git a/source/main.c b/source/main.c index 365e475a..eeda2d6a 100644 --- a/source/main.c +++ b/source/main.c @@ -40,10 +40,9 @@ #include #include "hades.h" #include "app.h" -#include "compat.h" #include "gba/gba.h" -#include "gba/db.h" #include "gui/gui.h" +#include "common/compat.h" #ifdef WITH_DEBUGGER # include "dbg/dbg.h" @@ -136,21 +135,23 @@ args_parse( } switch (c) { - case 0: + case 0: { switch (option_index) { - case CLI_HELP: // --help + case CLI_HELP: { // --help print_usage(stdout, name); exit(EXIT_SUCCESS); break; - case CLI_VERSION: // --version + }; + case CLI_VERSION: { // --version printf("Hades v" HADES_VERSION "\n"); exit(EXIT_SUCCESS); break; - case CLI_BIOS: // --bios - free(app->file.bios_path); - app->file.bios_path = strdup(optarg); + }; + case CLI_BIOS: { // --bios + app->args.bios_path = optarg; break; - case CLI_COLOR: // --color + }; + case CLI_COLOR: { // --color if (optarg) { if (!strcmp(optarg, "auto")) { color = 0; @@ -169,40 +170,49 @@ args_parse( color = 0; } break; - default: + }; + default: { print_usage(stderr, name); exit(EXIT_FAILURE); break; + }; } break; - case 'b': - free(app->file.bios_path); - app->file.bios_path = strdup(optarg); + }; + case 'b': { + app->args.bios_path = optarg; break; - case 'h': + }; + case 'h': { print_usage(stdout, name); exit(EXIT_SUCCESS); break; - case 'v': + }; + case 'v': { printf("Hades v" HADES_VERSION "\n"); exit(EXIT_SUCCESS); break; - default: + }; + default: { print_usage(stderr, name); exit(EXIT_FAILURE); break; + }; } } switch (argc - optind) { - case 0: + case 0: { break; - case 1: - app->file.game_path = strdup(argv[optind]); + }; + case 1: { + app->args.rom_path = argv[optind]; break; - default: + }; + default: { print_usage(stderr, name); exit(EXIT_FAILURE); + }; } switch (color) { @@ -229,29 +239,27 @@ main( #endif memset(&app, 0, sizeof(app)); - app.emulation.gba = calloc(1, sizeof(*app.emulation.gba)); - hs_assert(app.emulation.gba); - gba_init(app.emulation.gba); + app.emulation.gba = gba_create(); /* Default value for all options, before config and argument parsing. */ app.run = true; app.file.bios_path = strdup("./bios.bin"); app.file.config_path = strdup("./config.json"); - app.emulation.started = false; - app.emulation.running = false; + app.emulation.is_started = false; + app.emulation.is_running = false; app.emulation.speed = 1; app.emulation.unbounded = false; - app.emulation.backup_type = BACKUP_AUTO_DETECT; - app.emulation.rtc_autodetect = true; - app.emulation.rtc_force_enabled = true; + app.emulation.backup_storage.autodetect = true; + app.emulation.backup_storage.type = BACKUP_NONE; + app.emulation.rtc.autodetect = true; + app.emulation.rtc.enabled = true; app.video.color_correction = true; app.video.vsync = false; app.video.display_size = 3; app.video.aspect_ratio = ASPECT_RATIO_RESIZE; app.audio.mute = false; app.audio.level = 1.0f; - app.video.texture_filter.kind = TEXTURE_FILTER_NEAREST; - app.video.texture_filter.refresh = true; + app.gfx.texture_filter = TEXTURE_FILTER_NEAREST; app.ui.win.resize = true; app.ui.win.resize_with_ratio = false; gui_sdl_setup_default_binds(&app); @@ -283,19 +291,26 @@ main( pthread_create( &gba_thread, NULL, - (void *(*)(void *))gba_main_loop, + (void *(*)(void *))gba_run, app.emulation.gba ); -#ifdef WITH_DEBUGGER - signal(SIGINT, &sighandler); + if (app.args.rom_path) { + app_game_configure(&app, app.args.rom_path); + if (app.emulation.launch_config) { + app_game_reset(&app); - app_game_stop(&app); - if (app.file.game_path) { - app_game_reset(&app); - app_game_pause(&app); +#ifdef WITH_DEBUGGER + app_game_pause(&app); +#else + app_game_run(&app); +#endif + } } +#ifdef WITH_DEBUGGER + signal(SIGINT, &sighandler); + /* Start the debugger thread */ pthread_create( &dbg_thread, @@ -303,12 +318,6 @@ main( (void *(*)(void *))debugger_run, &app ); -#else - app_game_stop(&app); - if (app.file.game_path) { - app_game_reset(&app); - app_game_run(&app); - } #endif while (app.run) { @@ -317,6 +326,8 @@ main( sdl_counters[0] = SDL_GetPerformanceCounter(); + app_game_process_all_notifs(&app); + gui_sdl_handle_inputs(&app); gui_sdl_video_render_frame(&app); @@ -327,25 +338,25 @@ main( } #endif - if (app.emulation.started && app.emulation.running) { + if (app.emulation.is_started && app.emulation.is_running) { uint32_t now; now = SDL_GetTicks(); if ((now - app.ui.ticks_last_frame) >= 1000) { - app.emulation.fps = atomic_exchange(&app.emulation.gba->framecounter, 0); + app.emulation.fps = gba_shared_reset_frame_counter(app.emulation.gba); app.ui.ticks_last_frame = now; /* ** We also want to store the content of the backup storage ** on the disk every second (if it is dirty). */ - app_game_write_backup(&app); + app_game_update_backup(&app); /* ** We also update the Window's name with the game title */ - if (app.emulation.gba->game_entry) { - SDL_SetWindowTitle(app.sdl.window, app.emulation.gba->game_entry->title); + if (app.emulation.game_entry) { + SDL_SetWindowTitle(app.sdl.window, app.emulation.game_entry->title); } else { SDL_SetWindowTitle(app.sdl.window, "Hades"); } @@ -378,7 +389,12 @@ main( sdl_counters[1] = SDL_GetPerformanceCounter(); elapsed_ms = ((float)(sdl_counters[1] - sdl_counters[0]) / (float)SDL_GetPerformanceFrequency()) * 1000.f; - if (app.emulation.started && app.emulation.running) { + /* + ** Handle the power-save mode. + ** + ** Required because imgui uses quite a lot of CPU even when nothing is happening. + */ + if (app.emulation.is_started && app.emulation.is_running) { // If the emulator is running without vsync, cap the gui's FPS to 4x the display's refresh rate if (!app.video.vsync) { SDL_Delay(max(0.f, floor((1000.f / (4.0 * app.ui.refresh_rate)) - elapsed_ms))); @@ -403,9 +419,24 @@ main( SDL_Delay(max(0.f, floor((1000.f / 60.0f) - elapsed_ms))); } } + + // Flush the quick save cache + if (app.file.flush_qsaves_cache) { + size_t i; + + for (i = 0; i < MAX_QUICKSAVES; ++i) { + free(app.file.qsaves[i].mtime); + app.file.qsaves[i].exist = hs_fexists(app.file.qsaves[i].path); + app.file.qsaves[i].mtime = hs_fmtime(app.file.qsaves[i].path); + app.file.flush_qsaves_cache = false; + } + + app.file.flush_qsaves_cache = false; + } + } - gba_send_exit(app.emulation.gba); + app_game_exit(&app); pthread_join(gba_thread, NULL); #ifdef WITH_DEBUGGER @@ -416,5 +447,8 @@ main( gui_config_save(&app); + gba_delete(app.emulation.gba); + app.emulation.gba = NULL; + return (EXIT_SUCCESS); }