diff --git a/.dockerignore b/.dockerignore
index baa891e..b9e9d6d 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -1,5 +1,6 @@
# Don't send build artifacts to Docker daemon
vendor/
+!vendor/rcheevos/
coverage/
tmp/
**/*.gem
diff --git a/.github/workflows/dep-check.yml b/.github/workflows/dep-check.yml
index ab4c26a..4a4ef9d 100644
--- a/.github/workflows/dep-check.yml
+++ b/.github/workflows/dep-check.yml
@@ -10,7 +10,7 @@ jobs:
name: Check mGBA version
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v6
- name: Check for new mGBA release
run: |
diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
index a9df05b..71f8147 100644
--- a/.github/workflows/docs.yml
+++ b/.github/workflows/docs.yml
@@ -19,7 +19,7 @@ jobs:
build:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v6
- name: Fetch coverage data
run: |
diff --git a/.github/workflows/smoke.yml b/.github/workflows/smoke.yml
index 56e7860..e2e948b 100644
--- a/.github/workflows/smoke.yml
+++ b/.github/workflows/smoke.yml
@@ -8,7 +8,10 @@ jobs:
name: smoke test
runs-on: ubuntu-24.04
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v6
+ with:
+ submodules: true
+
- name: Set up Ruby
uses: ruby/setup-ruby@v1
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index a132ef7..2c41de1 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -7,11 +7,15 @@ on:
- '**.md'
- 'docs/**'
- 'docs_site/**'
+ - '.github/workflows/windows-test.yml'
+ - '.github/workflows/smoke.yml'
pull_request:
paths-ignore:
- '**.md'
- 'docs/**'
- 'docs_site/**'
+ - '.github/workflows/windows-test.yml'
+ - '.github/workflows/smoke.yml'
schedule:
# Run weekly to keep Docker cache fresh (expires after 7 days of no access)
- cron: '0 4 * * 0' # Sundays at 4am UTC
@@ -28,7 +32,10 @@ jobs:
matrix:
ruby: ['4.0']
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v6
+ with:
+ submodules: true
+
- name: Set up Docker Buildx
id: buildx
@@ -106,7 +113,10 @@ jobs:
matrix:
ruby: ['4.0']
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v6
+ with:
+ submodules: true
+
- name: Set up Docker Buildx
id: buildx
diff --git a/.github/workflows/windows-test.yml b/.github/workflows/windows-test.yml
index c6cf07f..aa196c2 100644
--- a/.github/workflows/windows-test.yml
+++ b/.github/workflows/windows-test.yml
@@ -18,7 +18,9 @@ jobs:
name: test (ruby ${{ github.event.inputs.ruby_version }}, Windows)
runs-on: windows-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v6
+ with:
+ submodules: true
- name: Set up Ruby
uses: ruby/setup-ruby@v1
diff --git a/.gitignore b/.gitignore
index 73d28b7..c4da48d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,7 +8,11 @@
Makefile
# Vendor build artifacts (rebuilt with `rake deps`)
-vendor/
+# Ignore specific build artifact dirs; vendor/rcheevos is a tracked submodule
+vendor/install
+vendor/mgba
+vendor/install/
+vendor/mgba/
# Gem build
*.gem
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..4142150
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "vendor/rcheevos"]
+ path = vendor/rcheevos
+ url = git@github.com:RetroAchievements/rcheevos.git
diff --git a/CHANGELOG.md b/CHANGELOG.md
index bad7f65..248961e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -10,6 +10,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
### Added
+- RetroAchievements integration — earn achievements while you play; progress tracked and submitted in real time
+- Rich Presence support — reports current game activity to your RetroAchievements profile
+- Achievements window showing earned/unearned status, points, and descriptions for the current game
+- `gemba ra` CLI commands: `login`, `verify`, `logout`, and `achievements` (list a ROM's achievements without launching the emulator)
+- Loading a save state while paused now renders the frame the state was captured at, so you can see exactly where you are before resuming
- Game Boy and Game Boy Color ROM support (160×144 resolution, correct aspect ratio)
- Input recording and replay — record button inputs to `.gir` files and replay them deterministically
- Video/audio capture to `.grec` files (F10 hotkey)
diff --git a/Dockerfile.ci-test b/Dockerfile.ci-test
index 61308b6..ed2395c 100644
--- a/Dockerfile.ci-test
+++ b/Dockerfile.ci-test
@@ -127,6 +127,7 @@ RUN --mount=type=cache,target=/bundle-cache \
COPY Rakefile ./
COPY ext/ ext/
COPY lib/ lib/
+COPY vendor/rcheevos/ vendor/rcheevos/
# Compile gemba C extension
RUN MAKEFLAGS="-j$(nproc)" bundle exec rake compile
diff --git a/THIRD_PARTY_NOTICES b/THIRD_PARTY_NOTICES
index 6126c02..ff59e08 100644
--- a/THIRD_PARTY_NOTICES
+++ b/THIRD_PARTY_NOTICES
@@ -1,5 +1,40 @@
-gemba bundles the following third-party fonts in the assets/ directory.
-Both are licensed under the SIL Open Font License, Version 1.1.
+gemba bundles the following third-party libraries and fonts.
+
+================================================================================
+rcheevos
+================================================================================
+
+Copyright (c) 2018 RetroAchievements.org
+https://github.com/RetroAchievements/rcheevos
+
+Licensed under the MIT License.
+
+Used for: RetroAchievements runtime — achievement condition evaluation,
+Rich Presence string evaluation, and rcheevos network protocol helpers.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+================================================================================
+Fonts (assets/ directory)
+================================================================================
+
+Both fonts below are licensed under the SIL Open Font License, Version 1.1.
================================================================================
JetBrains Mono NL
diff --git a/docs_site/_includes/nav.html b/docs_site/_includes/nav.html
index d500490..9e3337d 100644
--- a/docs_site/_includes/nav.html
+++ b/docs_site/_includes/nav.html
@@ -19,12 +19,126 @@
+ -
+
+
+
+
+
+
+
+
+ -
+
+ BusEmitter
+
+
+
-
ChildWindow
+ -
+
+ Headless
+
+
+
-
@@ -45,9 +159,217 @@
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+ AchievementsWindow
+
+
+
+ -
+
+ AppController
+
+
+
+ -
+
+ Bios
+
+
+
+ -
+
+
+
+
+
+
+
+
-
- CLI
+
+
+
+
@@ -77,39 +399,155 @@
+ -
+
+ EmulatorFrame
+
+
+
+ -
+
+ EventBus
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+ GameIndex
+
+
+
-
GamepadMap
+ -
+
+ GamePickerFrame
+
+
+
-
HeadlessPlayer
+ -
+
+ HelpWindow
+
+
+
-
HotkeyMap
+ -
+
+ InputRecorder
+
+
+
+ -
+
+
+
+
+
+
+
+
-
KeyboardMap
+ -
+
+ MainWindow
+
+
+
+ -
+
+
+
+
+
+
+
+
-
OverlayRenderer
- -
+
-
+
+
- Player
+
+
@@ -145,49 +583,105 @@
+ -
+
+ ReplayPlayer
+
+
+
+ -
+
+ RomInfo
+
+
+
-
RomInfoWindow
- -
+
-
+
+ RomLibrary
+
+
+
+ -
+
+ RomOverrides
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+ BPS
+
+
+
+ -
+
+ IPS
+
+
+
+ -
+
+ UPS
+
+
+
+
+
+
+
+ -
-
+ -
+
+ SessionLogger
+
+
+
-
SettingsWindow
diff --git a/docs_site/_includes/stats.html b/docs_site/_includes/stats.html
index 3327d13..b5a7de8 100644
--- a/docs_site/_includes/stats.html
+++ b/docs_site/_includes/stats.html
@@ -1,4 +1,4 @@
-v0.1.0
-4 modules
-27 classes
-248 methods
\ No newline at end of file
+v0.1.1
+14 modules
+83 classes
+638 methods
\ No newline at end of file
diff --git a/docs_site/assets/js/search-data.json b/docs_site/assets/js/search-data.json
index 8d79adf..16c5774 100644
--- a/docs_site/assets/js/search-data.json
+++ b/docs_site/assets/js/search-data.json
@@ -3,46 +3,337 @@
"title": "Gemba",
"type": "module",
"url": "/api/Gemba/",
- "methods": "load_locale user_config user_config=",
+ "methods": "load_locale log open_directory",
"method_docs": {
"load_locale": "Load translations based on the config locale setting.",
- "user_config": "Lazily loaded user config — shared across the application.",
- "user_config=": "Override the user config (useful for tests)."
+ "log": "Log a message at the given level.",
+ "open_directory": "Open a directory in the platform's file manager."
},
- "content": "Gemba Load translations based on the config locale setting. Lazily loaded user config — shared across the application. Override the user config (useful for tests)."
+ "content": "Gemba Define the Gemba module before loader.setup so Zeitwerk can register autoloads directly on it (e.g. Gemba.autoload(:ChildWindow, ...)). Without this, Gemba doesn't exist yet and Zeitwerk proxies through lib/gemba.rb — which is never loaded in the headless path. Load translations based on the config locale setting. Log a message at the given level. Open a directory in the platform's file manager."
},
"1": {
+ "title": "Gemba::Achievements",
+ "type": "module",
+ "url": "/api/Gemba/Achievements/",
+ "methods": "backend_for",
+ "method_docs": {
+ "backend_for": "Build the appropriate backend based on config.\nReturns NullBackend if RA is disabled.\nRequires app: (Teek app) for Retro"
+ },
+ "content": "Gemba Achievements Build the appropriate backend based on config. Returns NullBackend if RA is disabled. Requires app: (Teek app) for RetroAchievements::Backend's BackgroundWork HTTP calls."
+ },
+ "2": {
+ "title": "Gemba::Achievements::Achievement",
+ "type": "class",
+ "url": "/api/Gemba/Achievements/Achievement/",
+ "methods": "earn earned?",
+ "method_docs": {
+ "earn": "Return a copy marked as earned right now."
+ },
+ "content": "Gemba Achievements Achievement Represents a single achievement (earned or unearned). Return a copy marked as earned right now."
+ },
+ "3": {
+ "title": "Gemba::Achievements::Backend",
+ "type": "module",
+ "url": "/api/Gemba/Achievements/Backend/",
+ "methods": "achievement_list authenticated? do_frame earned_count enabled? fetch_for_display include_unofficial= load_game login_with_password login_with_token logout on_achievements_changed on_auth_change on_rich_presence_changed on_unlock reset_runtime rich_presence_enabled= rich_presence_message sync_unlocks token_test total_count unload_game",
+ "method_docs": {
+ "do_frame": "Called once per emulated frame. Evaluate achievement conditions and\nfire on_unlock callbacks for any newly earned achiev",
+ "fetch_for_display": "Fetch the full achievement list for a given ROM (by RomInfo) purely for\ndisplay — does not affect live game state. Calls",
+ "include_unofficial=": "Set whether unofficial (Flags=5) achievements are included in\ndisplay syncs and live evaluation. No-op for backends that",
+ "load_game": "Called when a new ROM is loaded. Backend should reset per-game state\nand re-identify the game.",
+ "login_with_password": "Initiate login with username + password (first-time auth).\nOn success the on_auth_change callback fires with :ok and the",
+ "login_with_token": "Resume a session using a previously stored API token.\nCalled automatically at startup when credentials are already saved",
+ "logout": "Clear authentication state and stored session.",
+ "on_achievements_changed": "Register a callback invoked when the achievement list changes in bulk\n(e.g. after a game loads or sync_unlocks completes",
+ "on_auth_change": "Register a callback invoked when authentication state changes.\nFired with `status` (:ok or :error) and an optional `erro",
+ "on_rich_presence_changed": "Register a callback fired when the Rich Presence string changes.\nCalled with the new message string.",
+ "on_unlock": "Register a callback invoked when an achievement is unlocked.\nMultiple callbacks can be registered; all are called in ord",
+ "reset_runtime": "Called when a save state is loaded. Memory jumped to an arbitrary saved\nstate; all achievements must restart their prim",
+ "rich_presence_enabled=": "Enable or disable Rich Presence evaluation for the current game.\nPushed from AppController when per-game config is resol",
+ "rich_presence_message": "Current Rich Presence display string for the active game, or nil if\nnot loaded / not supported. Updated by do_frame in r",
+ "sync_unlocks": "Fetch already-earned achievements from the server and merge them into\nthe local earned state so the UI reflects prior pr",
+ "token_test": "Verify the stored token is still valid. Result fires on_auth_change.\nUsed by the \"Verify Token\" button in settings.",
+ "unload_game": "Called when the ROM is unloaded / emulator stops."
+ },
+ "content": "Gemba Achievements Backend Abstract interface for achievement backends. All methods have no-op defaults so backends only need to override what they support. Concrete backends: NullBackend, FakeBackend, and the future RetroAchievements backend. Thread safety: do_frame is called from the emulation thread (Tk after-loop). on_unlock and on_auth_change callbacks fire on the same thread. Authentication lifecycle (decoupled from the real network): 1. call login(username:, token:) — may be async 2. on_a"
+ },
+ "4": {
+ "title": "Gemba::Achievements::Cache",
+ "type": "module",
+ "url": "/api/Gemba/Achievements/Cache/",
+ "methods": "read write",
+ "method_docs": {},
+ "content": "Gemba Achievements Cache Persistent per-ROM achievement cache. Stores the full achievement list (definitions + earned status) for each ROM as a JSON file under Config.achievements_cache_dir/.json. Written after every successful sync; read on demand by the window when a game is selected that isn't currently loaded in the emulator. Format: { \"synced_at\": \"\", \"achievements\": [ { \"id\":, \"title\":, \"description\":, \"points\":, \"earned_at\": \"|null\" }, … ] }"
+ },
+ "5": {
+ "title": "Gemba::Achievements::CredentialsPresenter",
+ "type": "class",
+ "url": "/api/Gemba/Achievements/CredentialsPresenter/",
+ "methods": "clear_transient dispose enabled= enabled? feedback fields_state initialize logged_in? login_button_state logout_button_state reset_button_state show_transient verify_button_state",
+ "method_docs": {
+ "dispose": "Remove bus subscription. Call before discarding the presenter.",
+ "enabled=": "-- UI mutations ---------------------------------------------------------",
+ "feedback": "Feedback descriptor. key drives locale lookup in SystemTab.\n:empty → blank label\n:not_logged_in → \"Not logged ",
+ "fields_state": "-- Widget state queries -------------------------------------------------",
+ "show_transient": "Transient feedback (e.g. \"Connection OK ✓\") that disappears after a delay.\nCaller is responsible for scheduling clear_tr"
+ },
+ "content": "Gemba Achievements CredentialsPresenter Presents credential state for the RetroAchievements settings UI. Read-only view of state — never writes to disk or config. Initialized from persisted config. Mutated by: - UI interactions (checkbox, keystrokes) via setters - Backend auth results via :ra_auth_result bus events Emits :credentials_changed on the bus whenever state changes. SystemTab listens and calls apply_presenter_state to refresh widgets. Call dispose when discarding the presenter to remov"
+ },
+ "6": {
+ "title": "Gemba::Achievements::FakeBackend",
+ "type": "class",
+ "url": "/api/Gemba/Achievements/FakeBackend/",
+ "methods": "achievement_list add_achievement authenticated? do_frame enabled? fetch_for_display initialize load_game login_with_password login_with_token logout reset_earned rich_presence_message set_rich_presence stub_fetch_for_display token_test unload_game",
+ "method_docs": {
+ "add_achievement": "Define an achievement. The block receives a read_mem callable\nand must return truthy when the unlock condition is met.",
+ "do_frame": "Evaluate all unearned achievements against current memory state.\nFires on_unlock callbacks for newly met conditions (ris",
+ "login_with_password": "Resolves immediately. Succeeds if credentials are non-empty and match\nthe configured valid pair (or any non-empty creds ",
+ "reset_earned": "Clear earned state (for test reuse).",
+ "set_rich_presence": "Set a Rich Presence message for testing.\n\nPass a static string to return a fixed message:\n backend.set_rich_presence(\"P",
+ "stub_fetch_for_display": "Configure what fetch_for_display returns. Pass an Array (returned for\nevery rom_info) or a block that receives rom_info "
+ },
+ "content": "Gemba Achievements FakeBackend Pure-Ruby achievement backend for development and testing. Achievements are defined programmatically with a condition block that receives a memory-read helper. No HTTP, no hashing, no server. Authentication behaviour: - By default any non-empty credentials succeed immediately. - Pass `valid_username:` and `valid_token:` to restrict: only that exact pair succeeds; anything else fails. Useful in tests that verify the \"bad credentials\" error path. Used in two ways: 1."
+ },
+ "7": {
+ "title": "Gemba::Achievements::NullBackend",
+ "type": "class",
+ "url": "/api/Gemba/Achievements/NullBackend/",
+ "methods": "",
+ "method_docs": {},
+ "content": "Gemba Achievements NullBackend No-op backend used when RetroAchievements is disabled. All methods are inherited no-ops from Backend."
+ },
+ "8": {
+ "title": "Gemba::Achievements::OfflineBackend",
+ "type": "class",
+ "url": "/api/Gemba/Achievements/OfflineBackend/",
+ "methods": "achievement_list authenticated? do_frame enabled? initialize load_game login_with_password login_with_token logout rich_presence_message store store_rich_presence token_test unload_game",
+ "method_docs": {
+ "achievement_list": "-- Achievement list -----------------------------------------------------",
+ "do_frame": "-- Per-frame evaluation (memory-condition achievements) -----------------",
+ "load_game": "-- Game lifecycle -------------------------------------------------------",
+ "login_with_password": "-- Authentication (no-op — offline backend is always authenticated) ------",
+ "store": "Merge achievement definitions for a ROM into the in-memory DB.\nIntended for use by RcheevosBackend to seed the offline c",
+ "store_rich_presence": "Store a static Rich Presence message for a ROM.\nIntended for use by RcheevosBackend when caching patch data offline."
+ },
+ "content": "Gemba Achievements OfflineBackend Achievement backend backed by a local database — no HTTP, no rcheevos. Auth is a no-op: always authenticated. The DB maps ROM checksum → array of achievement definition Hashes: { id:, title:, description:, points:, trigger: :on_load | :memory, condition: ->(mem) { bool } # :memory trigger only } :on_load achievements fire immediately in load_game. :memory achievements are evaluated each frame in do_frame (rising edge). Long-term this DB can be populated by Rchee"
+ },
+ "9": {
+ "title": "Gemba::Achievements::RetroAchievements",
+ "type": "module",
+ "url": "/api/Gemba/Achievements/RetroAchievements/",
+ "methods": "",
+ "method_docs": {},
+ "content": "Gemba Achievements RetroAchievements"
+ },
+ "10": {
+ "title": "Gemba::Achievements::RetroAchievements::Backend",
+ "type": "class",
+ "url": "/api/Gemba/Achievements/RetroAchievements/Backend/",
+ "methods": "achievement_list authenticated? do_frame enabled? fetch_for_display initialize load_game login_with_password login_with_token logout reset_runtime sync_unlocks token_test unload_game",
+ "method_docs": {
+ "achievement_list": "-- Achievement list -----------------------------------------------------",
+ "fetch_for_display": "Fetch the full achievement list for any ROM by its RomInfo, purely for\ndisplay. Does not touch the live game state (@ach",
+ "load_game": "-- Game lifecycle -------------------------------------------------------",
+ "login_with_password": "-- Authentication -------------------------------------------------------",
+ "reset_runtime": "Called after a save state is loaded. Memory just jumped to an arbitrary\nsaved state, so every achievement must go back "
+ },
+ "content": "Gemba Achievements RetroAchievements Backend Achievement backend that talks to retroachievements.org. All requests are HTTP POSTs to /dorequest.php. The 'r' parameter tells the server what you want — it's RA's own naming, not ours: r=login2 authenticate (password or token) r=gameid \"here's a ROM MD5 hash — what game ID is it?\" r=patch \"give me the achievement definitions for this game\" (called 'patch' because RA's original concept was that achievements are a 'patch' bolted on top of a ROM — extr"
+ },
+ "11": {
+ "title": "Gemba::Achievements::RetroAchievements::CliSyncRequester",
+ "type": "class",
+ "url": "/api/Gemba/Achievements/RetroAchievements/CliSyncRequester/",
+ "methods": "call",
+ "method_docs": {
+ "call": "Called by ra_request with the same signature as the DEFAULT_REQUESTER\nlambda. Ignores the BackgroundWork block (which us"
+ },
+ "content": "Gemba Achievements RetroAchievements CliSyncRequester Synchronous HTTP requester for CLI use. Implements the same interface as FakeRequester and the DEFAULT_REQUESTER lambda in Backend — call() returns a Result that fires on_progress synchronously — but makes a real blocking Net::HTTP POST instead of delegating to Teek::BackgroundWork. This means CLI commands get their result back in-line with no event loop. Called by ra_request with the same signature as the DEFAULT_REQUESTER lambda. Ignores th"
+ },
+ "12": {
+ "title": "Gemba::Achievements::RetroAchievements::CliSyncRequester::Result",
+ "type": "class",
+ "url": "/api/Gemba/Achievements/RetroAchievements/CliSyncRequester/Result/",
+ "methods": "initialize on_done on_progress",
+ "method_docs": {},
+ "content": "Gemba Achievements RetroAchievements CliSyncRequester Result Mirrors FakeRequester::Result so the calling code (ra_request) is identical regardless of whether it's running in CLI or GUI mode."
+ },
+ "13": {
+ "title": "Gemba::Achievements::RetroAchievements::PingWorker",
+ "type": "class",
+ "url": "/api/Gemba/Achievements/RetroAchievements/PingWorker/",
+ "methods": "call",
+ "method_docs": {},
+ "content": "Gemba Achievements RetroAchievements PingWorker Background worker for the RA session ping heartbeat. Defined as a named class (not a closure) so it is Ractor-safe on Ruby 4+. All state is passed through the data hash; no captured variables."
+ },
+ "14": {
+ "title": "Gemba::AchievementsWindow",
+ "type": "class",
+ "url": "/api/Gemba/AchievementsWindow/",
+ "methods": "hide initialize refresh show show_modal update_game withdraw",
+ "method_docs": {
+ "refresh": "Called by AppController when on_achievements_changed fires.",
+ "show_modal": "ModalStack protocol (non-modal — no grab)",
+ "update_game": "Called by AppController when a ROM loads or the backend is swapped.\nUpdates internal state and refreshes the window if i"
+ },
+ "content": "Gemba AchievementsWindow Displays achievements for the currently loaded GBA game. Non-modal window accessible from View > Achievements. Shows a treeview of all achievements with name, points, and earned date. A Sync button pulls the latest earned state from the RA server. Only the currently loaded game has live data; other GBA games in the library show empty. Called by AppController when on_achievements_changed fires. ModalStack protocol (non-modal — no grab) Called by AppController when a ROM l"
+ },
+ "15": {
+ "title": "Gemba::AppController",
+ "type": "class",
+ "url": "/api/Gemba/AppController/",
+ "methods": "current_view disable_confirmations! frame initialize ready? run",
+ "method_docs": {
+ "frame": "Current active frame (for tests and external access)"
+ },
+ "content": "Gemba AppController Application controller — the brain of the app. Owns menus, hotkeys, modals, config, rom library, input maps, frame lifecycle, and mode tracking. MainWindow is a pure Tk shell that this controller drives. This is what CLI instantiates. Current active frame (for tests and external access)"
+ },
+ "16": {
+ "title": "Gemba::Bios",
+ "type": "class",
+ "url": "/api/Gemba/Bios/",
+ "methods": "from_config_name checksum ds_mode? exists? filename initialize known? label official? size status_text valid?",
+ "method_docs": {
+ "from_config_name": "Build a Bios from a bare filename stored in config."
+ },
+ "content": "Gemba Bios Immutable value object representing a GBA BIOS file. The stored config value is just the filename; this object resolves it to a full path and computes metadata on demand (memoized). Build a Bios from a bare filename stored in config."
+ },
+ "17": {
+ "title": "Gemba::BoxartFetcher",
+ "type": "class",
+ "url": "/api/Gemba/BoxartFetcher/",
+ "methods": "cached? cached_path fetch initialize",
+ "method_docs": {
+ "fetch": "Fetch box art for a game code. If cached, yields the path immediately.\nOtherwise kicks off an async download and yields "
+ },
+ "content": "Gemba BoxartFetcher Fetches and caches box art images for ROMs. Delegates URL resolution to a pluggable backend (anything responding to +#url_for(game_code)+). Downloads happen off the main thread via +Teek::BackgroundWork+ so the UI stays responsive. Cache layout: {cache_dir}/{game_code}/boxart.png Usage: fetcher = BoxartFetcher.new(app: app, cache_dir: Config.boxart_dir, backend: backend) fetcher.fetch(\"AGB-BPEE\") { |path| update_card_image(path) } Fetch box art for a game code. If cached, yie"
+ },
+ "18": {
+ "title": "Gemba::BoxartFetcher::LibretroBackend",
+ "type": "class",
+ "url": "/api/Gemba/BoxartFetcher/LibretroBackend/",
+ "methods": "url_for",
+ "method_docs": {},
+ "content": "Gemba BoxartFetcher LibretroBackend Resolves box art URLs from the LibRetro thumbnails CDN. URL pattern: https://thumbnails.libretro.com/{system}/Named_Boxarts/{encoded_name}.png Requires game_code → canonical name mapping via GameIndex."
+ },
+ "19": {
+ "title": "Gemba::BoxartFetcher::NullBackend",
+ "type": "class",
+ "url": "/api/Gemba/BoxartFetcher/NullBackend/",
+ "methods": "url_for",
+ "method_docs": {},
+ "content": "Gemba BoxartFetcher NullBackend No-op backend that never resolves URLs. Used in tests and offline mode."
+ },
+ "20": {
+ "title": "Gemba::BusEmitter",
+ "type": "module",
+ "url": "/api/Gemba/BusEmitter/",
+ "methods": "",
+ "method_docs": {},
+ "content": "Gemba BusEmitter Include in any class that emits events via Gemba.bus. No constructor changes needed — just include and call emit."
+ },
+ "21": {
"title": "Gemba::CLI",
"type": "class",
"url": "/api/Gemba/CLI/",
- "methods": "apply parse parse_decode parse_record run",
+ "methods": "main_help run",
"method_docs": {
- "apply": "Apply parsed CLI options to the user config (session-only overrides).",
- "parse": "Parse player (default) command options.",
- "parse_decode": "--- decode subcommand ---",
- "parse_record": "--- record subcommand ---",
- "run": "Entry point: dispatch to subcommand or player."
+ "main_help": "Main help text listing all subcommands.",
+ "run": "Entry point: dispatch to subcommand or default to play."
},
- "content": "Gemba CLI Apply parsed CLI options to the user config (session-only overrides). Parse player (default) command options. --- decode subcommand --- --- record subcommand --- Entry point: dispatch to subcommand or player."
+ "content": "Gemba CLI Main help text listing all subcommands. Entry point: dispatch to subcommand or default to play."
},
- "2": {
+ "22": {
+ "title": "Gemba::CLI::Commands",
+ "type": "module",
+ "url": "/api/Gemba/CLI/Commands/",
+ "methods": "",
+ "method_docs": {},
+ "content": "Gemba CLI Commands"
+ },
+ "23": {
+ "title": "Gemba::CLI::Commands::ConfigCmd",
+ "type": "class",
+ "url": "/api/Gemba/CLI/Commands/ConfigCmd/",
+ "methods": "call initialize parse",
+ "method_docs": {},
+ "content": "Gemba CLI Commands ConfigCmd"
+ },
+ "24": {
+ "title": "Gemba::CLI::Commands::Decode",
+ "type": "class",
+ "url": "/api/Gemba/CLI/Commands/Decode/",
+ "methods": "call initialize parse",
+ "method_docs": {},
+ "content": "Gemba CLI Commands Decode"
+ },
+ "25": {
+ "title": "Gemba::CLI::Commands::Patch",
+ "type": "class",
+ "url": "/api/Gemba/CLI/Commands/Patch/",
+ "methods": "call initialize parse",
+ "method_docs": {},
+ "content": "Gemba CLI Commands Patch"
+ },
+ "26": {
+ "title": "Gemba::CLI::Commands::Play",
+ "type": "class",
+ "url": "/api/Gemba/CLI/Commands/Play/",
+ "methods": "apply call initialize parse",
+ "method_docs": {},
+ "content": "Gemba CLI Commands Play"
+ },
+ "27": {
+ "title": "Gemba::CLI::Commands::Record",
+ "type": "class",
+ "url": "/api/Gemba/CLI/Commands/Record/",
+ "methods": "call initialize parse",
+ "method_docs": {},
+ "content": "Gemba CLI Commands Record"
+ },
+ "28": {
+ "title": "Gemba::CLI::Commands::Replay",
+ "type": "class",
+ "url": "/api/Gemba/CLI/Commands/Replay/",
+ "methods": "call initialize parse",
+ "method_docs": {},
+ "content": "Gemba CLI Commands Replay"
+ },
+ "29": {
+ "title": "Gemba::CLI::Commands::RetroAchievements",
+ "type": "class",
+ "url": "/api/Gemba/CLI/Commands/RetroAchievements/",
+ "methods": "call initialize parse",
+ "method_docs": {},
+ "content": "Gemba CLI Commands RetroAchievements"
+ },
+ "30": {
+ "title": "Gemba::CLI::Commands::Version",
+ "type": "class",
+ "url": "/api/Gemba/CLI/Commands/Version/",
+ "methods": "call initialize",
+ "method_docs": {},
+ "content": "Gemba CLI Commands Version"
+ },
+ "31": {
"title": "Gemba::ChildWindow",
"type": "module",
"url": "/api/Gemba/ChildWindow/",
- "methods": "build_toplevel hide_window position_near_parent show_window",
+ "methods": "build_toplevel hide_window position_near_parent show_modal show_window withdraw",
"method_docs": {
"build_toplevel": "Create and configure a toplevel window with standard boilerplate.\nHides the window at the end — call show_window to reve",
"hide_window": "Withdraw the window, release grab if modal, fire on_close callback.",
"position_near_parent": "Position this window to the right of the main application window.",
- "show_window": "Reveal the window, optionally grabbing focus (modal)."
+ "show_modal": "Show the window for ModalStack (deiconify, grab, position).\nOverride in subclasses to accept additional keyword argument",
+ "show_window": "Reveal the window, optionally grabbing focus (modal).",
+ "withdraw": "Withdraw the window for ModalStack (release grab, withdraw — NO callback)."
},
"content": "Gemba ChildWindow Shared helpers for child windows (Settings, Save State Picker, ROM Info). Including classes must define a TOP constant and an @app instance variable. Modal windows (grab focus) use show_window/hide_window. Non-modal windows (like ROM Info) use show_window(modal: false)/hide_window(modal: false). Create and configure a toplevel window with standard boilerplate. Hides the window at the end — call show_window to reveal it. Withdraw the window, release grab if modal, fire on_close "
},
- "3": {
+ "32": {
"title": "Gemba::Config",
"type": "class",
"url": "/api/Gemba/Config/",
- "methods": "config_dir default_path default_recordings_dir default_saves_dir default_screenshots_dir default_states_dir game_config_path reset! rom_id activate_game add_recent_rom clear_recent_roms color_correction= color_correction? deactivate_game dead_zone disable_per_game enable_per_game frame_blending= frame_blending? gamepad hotkeys initialize integer_scale= integer_scale? keep_aspect_ratio= keep_aspect_ratio? locale locale= mappings muted= muted? per_game_settings= per_game_settings? pixel_filter pixel_filter= quick_save_slot quick_save_slot= recent_roms recording_compression recording_compression= recordings_dir recordings_dir= reload! remove_recent_rom reset_gamepad reset_hotkeys rewind_enabled= rewind_enabled? rewind_seconds rewind_seconds= save! save_state_backup= save_state_backup? save_state_debounce save_state_debounce= saves_dir saves_dir= scale scale= set_dead_zone set_hotkey set_mapping show_fps= show_fps? states_dir states_dir= tip_dismiss_ms tip_dismiss_ms= toast_duration toast_duration= turbo_speed turbo_speed= turbo_volume_pct turbo_volume_pct= volume volume=",
+ "methods": "achievements_cache_dir bios_dir boxart_dir config_dir default_logs_dir default_patches_dir default_path default_recordings_dir default_saves_dir default_screenshots_dir default_states_dir game_config_path reset! rom_id rom_overrides_path activate_game add_recent_rom bios_path bios_path= clear_recent_roms color_correction= color_correction? deactivate_game dead_zone disable_per_game enable_per_game frame_blending= frame_blending? gamepad hotkeys initialize integer_scale= integer_scale? keep_aspect_ratio= keep_aspect_ratio? locale locale= log_level log_level= mappings muted= muted? pause_on_focus_loss= pause_on_focus_loss? per_game_settings= per_game_settings? pixel_filter pixel_filter= quick_save_slot quick_save_slot= ra_enabled= ra_enabled? ra_hardcore= ra_hardcore? ra_rich_presence= ra_rich_presence? ra_token ra_token= ra_unofficial= ra_unofficial? ra_username ra_username= recent_roms recording_compression recording_compression= recordings_dir recordings_dir= reload! remove_recent_rom reset_gamepad reset_hotkeys resubscribe rewind_enabled= rewind_enabled? rewind_seconds rewind_seconds= save! save_state_backup= save_state_backup? save_state_debounce save_state_debounce= saves_dir saves_dir= scale scale= set_dead_zone set_hotkey set_mapping show_fps= show_fps? skip_bios= skip_bios? states_dir states_dir= tip_dismiss_ms tip_dismiss_ms= toast_duration toast_duration= turbo_speed turbo_speed= turbo_volume_pct turbo_volume_pct= volume volume=",
"method_docs": {
"default_path": "-- Platform paths ----------------------------------------------------",
"reset!": "Delete the settings file at the given path (or the default).",
@@ -52,13 +343,15 @@
"deactivate_game": "Deactivate per-game settings (e.g. when ROM is unloaded).",
"disable_per_game": "Disable per-game settings. Reverts to global values.\nDoes NOT delete the game-specific file on disk.",
"enable_per_game": "Enable per-game settings for the currently loaded ROM.\nCopies current global values to game file on first enable.",
+ "ra_enabled?": "-- RetroAchievements ----------------------------------------------------",
"remove_recent_rom": "Remove a specific ROM path from the recent list.",
+ "resubscribe": "Re-wire bus subscriptions onto the current Gemba.bus.\nCalled by AppController after it creates a fresh EventBus, because",
"save!": "-- Persistence -------------------------------------------------------",
"scale": "-- Global settings ---------------------------------------------------"
},
"content": "Gemba Config Persists mGBA Player settings to a JSON file in the platform-appropriate config directory. Config file location: macOS: ~/Library/Application Support/gemba/settings.json Linux: $XDG_CONFIG_HOME/gemba/settings.json (~/.config/gemba/) Windows: %APPDATA%/gemba/settings.json Gamepad mappings are keyed by SDL GUID (identifies controller model/type), so different controller types keep separate configs. Per-game settings: when enabled, a subset of settings (video, audio, save state) can be"
},
- "4": {
+ "33": {
"title": "Gemba::Config::PerGameProxy",
"type": "class",
"url": "/api/Gemba/Config/PerGameProxy/",
@@ -66,7 +359,7 @@
"method_docs": {},
"content": "Gemba Config PerGameProxy Transparent proxy that routes per-game keys to a game-specific hash and everything else to the base (global) hash. Config getters/setters call global['key'] — this intercepts those calls so no other code needs to know whether per-game settings are active."
},
- "5": {
+ "34": {
"title": "Gemba::Core",
"type": "class",
"url": "/api/Gemba/Core/",
@@ -93,7 +386,84 @@
},
"content": "Gemba Core GBA emulator core wrapping libmgba's mCore API. Core loads a GBA ROM, emulates one frame at a time, and provides access to the video and audio output buffers. Pair with {Teek::SDL2::Renderer} for display and {Teek::SDL2::AudioStream} for sound. Drain the audio output for the most recent frame(s). Returns interleaved stereo signed 16-bit PCM samples (L R L R ...). The number of samples varies per frame (~548 at 32768 Hz). CRC32 checksum of the loaded ROM. Shut down the emulator core an"
},
- "6": {
+ "35": {
+ "title": "Gemba::EmulatorFrame",
+ "type": "class",
+ "url": "/api/Gemba/EmulatorFrame/",
+ "methods": "apply_fade_ramp apply_aspect_ratio apply_backup apply_color_correction apply_frame_blending apply_integer_scale apply_mute apply_pause_on_focus_loss apply_pixel_filter apply_quick_slot apply_recording_compression apply_rewind_toggle apply_show_fps apply_toast_duration apply_turbo_speed apply_volume aspect_ratio cleanup dismiss_toast do_rewind fast_forward? hide init_sdl2 initialize input_recording? load_core load_state muted? paused? quick_load quick_save receive recording? refresh_from_config rom_loaded? save_state sdl2_ready? show show_fps? show_toast start_animate start_input_recording start_recording stop_input_recording stop_recording take_screenshot toggle_fast_forward toggle_input_recording toggle_pause toggle_recording write_config",
+ "method_docs": {
+ "apply_fade_ramp": "Apply a linear fade-in ramp to int16 stereo PCM data.\nPure function: takes remaining/total counters, returns [pcm, new_r",
+ "apply_volume": "-- Config appliers --------------------------------------------------------",
+ "cleanup": "-- Cleanup ----------------------------------------------------------------",
+ "init_sdl2": "Create the SDL2 viewport, audio stream, fonts, and input bindings.\nMust be called once before load_core.",
+ "load_core": "Load (or reload) a ROM core. Creates Core + SaveStateManager.",
+ "receive": "Single entry point for AppController → EmulatorFrame communication.\nAppController calls @frame.receive(:event_name, **ar",
+ "refresh_from_config": "Sync all config-derived state from a config object after per-game switch.",
+ "save_state": "-- Save states (delegated to SaveStateManager) ----------------------------",
+ "sdl2_ready?": "emulator drives its own geometry via apply_scale",
+ "show": "FrameStack protocol",
+ "show_toast": "-- Toast helpers (called by AppController via receive) ----------------------",
+ "start_animate": "Start the emulation animate loop. Call once after first load_core.",
+ "take_screenshot": "-- Screenshot -------------------------------------------------------------",
+ "toggle_input_recording": "-- Input recording --------------------------------------------------------",
+ "toggle_pause": "-- Emulation control ------------------------------------------------------",
+ "toggle_recording": "-- Recording --------------------------------------------------------------",
+ "write_config": "Write all config-derived state back to the config object.\nCalled by AppController before config.save!"
+ },
+ "content": "Gemba EmulatorFrame SDL2 emulation frame — owns the mGBA core, viewport, audio stream, frame loop, and all rendering. Designed to be packed/unpacked inside a host window (AppController) so it can coexist with other \"frames\" like a game picker or replay viewer. Communication: AppController → EmulatorFrame: @frame.receive(:event_name, **args) EmulatorFrame → AppController: EventBus events (pause_changed, request_quit, etc.) Settings → EmulatorFrame: bus events subscribed directly Apply a linear fa"
+ },
+ "36": {
+ "title": "Gemba::EventBus",
+ "type": "class",
+ "url": "/api/Gemba/EventBus/",
+ "methods": "emit initialize off on",
+ "method_docs": {
+ "emit": "Emit a named event to all subscribers.",
+ "off": "Unsubscribe a specific block.",
+ "on": "Subscribe to a named event."
+ },
+ "content": "Gemba EventBus Publish/subscribe event bus for decoupled communication. Emitters fire named events, subscribers listen — no intermediaries. Lives at Gemba.bus (module-level). Player creates it at startup; any class does Gemba.bus.emit / Gemba.bus.on. For tests, replace with Gemba.bus = EventBus.new (or a mock). Emit a named event to all subscribers. Unsubscribe a specific block. Subscribe to a named event."
+ },
+ "37": {
+ "title": "Gemba::FrameStack",
+ "type": "class",
+ "url": "/api/Gemba/FrameStack/",
+ "methods": "active? current current_frame initialize pop push size",
+ "method_docs": {
+ "pop": "Pop the current frame off the stack.\n\nThe popped frame is hidden. If there's a previous frame, it is re-shown.",
+ "push": "Push a frame onto the stack.\n\nThe previous frame (if any) is hidden before the new one is shown."
+ },
+ "content": "Gemba FrameStack Push/pop stack for content frames inside the main window. Mirrors the ModalStack pattern. When a new frame is pushed, the previous frame is hidden and the new one is shown. Popping reverses the transition. Frames must implement the FrameStack protocol: show — pack/display the frame hide — unpack/remove the frame from view cleanup — release resources (SDL2, etc.) Pop the current frame off the stack. The popped frame is hidden. If there's a previous frame, it is re-shown. Push a f"
+ },
+ "38": {
+ "title": "Gemba::FrameStack::Entry",
+ "type": "class",
+ "url": "/api/Gemba/FrameStack/Entry/",
+ "methods": "",
+ "method_docs": {},
+ "content": "Gemba FrameStack Entry"
+ },
+ "39": {
+ "title": "Gemba::GameIndex",
+ "type": "class",
+ "url": "/api/Gemba/GameIndex/",
+ "methods": "lookup lookup_by_md5 reset!",
+ "method_docs": {
+ "lookup": "Look up a canonical game name by serial code.",
+ "lookup_by_md5": "Look up a canonical game name by MD5 hex digest.",
+ "reset!": "Force-reload all indexes (useful after re-baking)."
+ },
+ "content": "Gemba GameIndex Lookup table mapping ROM serial codes to canonical game names. Data is pre-baked from No-Intro DAT files via script/bake_game_index.rb and stored as JSON in lib/gemba/data/{platform}_games.json. Loaded lazily on first lookup per platform. GameIndex.lookup(\"AGB-AXVE\") # => \"Pokemon - Ruby Version (USA)\" GameIndex.lookup(\"CGB-BYTE\") # => nil (unknown) Look up a canonical game name by serial code. Look up a canonical game name by MD5 hex digest. Force-reload all indexes (useful afte"
+ },
+ "40": {
+ "title": "Gemba::GamePickerFrame",
+ "type": "class",
+ "url": "/api/Gemba/GamePickerFrame/",
+ "methods": "aspect_ratio cleanup hide initialize paused? receive rom_loaded? sdl2_ready? show",
+ "method_docs": {},
+ "content": "Gemba GamePickerFrame Startup frame showing a 4×4 grid of ROM cards. Each card displays box art (if available), ROM title, and platform. Clicking a populated card emits :rom_selected on the bus. Right-clicking a populated card shows a context menu (Play / Set Boxart). Pure Tk — no SDL2."
+ },
+ "41": {
"title": "Gemba::GamepadMap",
"type": "class",
"url": "/api/Gemba/GamepadMap/",
@@ -101,23 +471,40 @@
"method_docs": {},
"content": "Gemba GamepadMap Manages SDL gamepad button → GBA bitmask mappings. Shares the same interface as {KeyboardMap} so that Player can delegate to either without knowing which device type is active."
},
- "7": {
+ "42": {
+ "title": "Gemba::Headless",
+ "type": "module",
+ "url": "/api/Gemba/Headless/",
+ "methods": "",
+ "method_docs": {},
+ "content": "Gemba Headless Marker — signals the headless stack is loaded without Tk/SDL2."
+ },
+ "43": {
"title": "Gemba::HeadlessPlayer",
"type": "class",
"url": "/api/Gemba/HeadlessPlayer/",
- "methods": "open audio_buffer checksum close closed? game_code height initialize load_state maker_code platform press recording? release_all rewind_count rewind_deinit rewind_init rewind_pop rewind_push rom_size save_state start_recording step stop_recording title video_buffer_argb width",
+ "methods": "open audio_buffer checksum close closed? game_code height initialize load_state maker_code platform press recording? release_all replay rewind_count rewind_deinit rewind_init rewind_pop rewind_push rom_size save_state start_recording step stop_recording title video_buffer_argb width",
"method_docs": {
"open": "Open a HeadlessPlayer, yield it, and close when done.",
"close": "Shut down the core and free resources.",
"press": "Set currently pressed buttons as a bitmask.\nUse KEY_* constants: `player.press(KEY_A | KEY_START)`",
"release_all": "Release all buttons.",
+ "replay": "Replay a .gir input recording. Loads the anchor save state, validates\nthe ROM checksum, then feeds each recorded bitmask",
"start_recording": "Start recording video + audio to a .grec file.",
"step": "Run one or more frames. Captures to recorder if recording.",
"stop_recording": "Stop recording and finalize the file."
},
- "content": "Gemba HeadlessPlayer Headless mGBA player for scripting and automated testing. Wraps Core with a simple API — no Tk, no SDL2, no event loop. Open a HeadlessPlayer, yield it, and close when done. Shut down the core and free resources. Set currently pressed buttons as a bitmask. Use KEY_* constants: `player.press(KEY_A | KEY_START)` Release all buttons. Start recording video + audio to a .grec file. Run one or more frames. Captures to recorder if recording. Stop recording and finalize the file."
+ "content": "Gemba HeadlessPlayer Headless mGBA player for scripting and automated testing. Wraps Core with a simple API — no Tk, no SDL2, no event loop. Open a HeadlessPlayer, yield it, and close when done. Shut down the core and free resources. Set currently pressed buttons as a bitmask. Use KEY_* constants: `player.press(KEY_A | KEY_START)` Release all buttons. Replay a .gir input recording. Loads the anchor save state, validates the ROM checksum, then feeds each recorded bitmask to the core. Start record"
},
- "8": {
+ "44": {
+ "title": "Gemba::HelpWindow",
+ "type": "class",
+ "url": "/api/Gemba/HelpWindow/",
+ "methods": "hide initialize show visible?",
+ "method_docs": {},
+ "content": "Gemba HelpWindow Floating hotkey reference panel toggled by pressing '?'. Non-modal — no grab, no focus steal. Positioned to the right of the main window via ChildWindow#position_near_parent. AppController pauses emulation while the panel is visible and restores play on close."
+ },
+ "45": {
"title": "Gemba::HotkeyMap",
"type": "class",
"url": "/api/Gemba/HotkeyMap/",
@@ -137,7 +524,38 @@
},
"content": "Gemba HotkeyMap Maps player actions (quit, pause, etc.) to keyboard hotkeys. A hotkey is either a plain keysym String (\"F5\") or an Array of modifier(s) + key ([\"Control\", \"s\"]). Provides reverse lookup for efficient dispatch in the input loop. Human-readable display name for a hotkey. Extract active modifier names from a Tk event state bitmask. Normalize a hotkey: sort modifiers canonically. Normalize variant Tk keysyms to their canonical form. Handles: ISO_Left_Tab → Tab, Shift+letter uppercase"
},
- "9": {
+ "46": {
+ "title": "Gemba::InputRecorder",
+ "type": "class",
+ "url": "/api/Gemba/InputRecorder/",
+ "methods": "anchor_state_path capture initialize recording? start stop",
+ "method_docs": {
+ "capture": "Capture one frame's input bitmask.",
+ "start": "Start recording. Saves an anchor save state and opens the .gir file.",
+ "stop": "Stop recording and close the file."
+ },
+ "content": "Gemba InputRecorder Records per-frame input bitmasks to a .gir (Gemba Input Recording) file. Each GBA frame's pressed-button bitmask is stored as a 3-char hex line. An anchor save state is written alongside so replays start from the exact same emulator state. The header's frame_count is a best-effort hint (correct on clean stop, zero on crash). The replayer counts lines for the authoritative count. Capture one frame's input bitmask. Start recording. Saves an anchor save state and opens the .gir "
+ },
+ "47": {
+ "title": "Gemba::InputReplayer",
+ "type": "class",
+ "url": "/api/Gemba/InputReplayer/",
+ "methods": "anchor_state_path bitmask_at each_bitmask frame_count game_code initialize rom_checksum rom_path validate!",
+ "method_docs": {
+ "each_bitmask": "Iterate over all recorded bitmasks.",
+ "validate!": "Validate that the recording matches the loaded ROM."
+ },
+ "content": "Gemba InputReplayer Replays a .gir (Gemba Input Recording) file by feeding recorded per-frame bitmasks back to the emulator core. The authoritative frame count comes from counting bitmask lines, not the header (which is best-effort and may be zero on crash). Iterate over all recorded bitmasks. Validate that the recording matches the loaded ROM."
+ },
+ "48": {
+ "title": "Gemba::InputReplayer::ChecksumMismatch",
+ "type": "class",
+ "url": "/api/Gemba/InputReplayer/ChecksumMismatch/",
+ "methods": "",
+ "method_docs": {},
+ "content": "Gemba InputReplayer ChecksumMismatch"
+ },
+ "49": {
"title": "Gemba::KeyboardMap",
"type": "class",
"url": "/api/Gemba/KeyboardMap/",
@@ -145,7 +563,7 @@
"method_docs": {},
"content": "Gemba KeyboardMap Manages keyboard keysym → GBA bitmask mappings. Shares the same interface as {GamepadMap} so that Player can delegate to either without knowing which device type is active."
},
- "10": {
+ "50": {
"title": "Gemba::Locale",
"type": "module",
"url": "/api/Gemba/Locale/",
@@ -156,7 +574,7 @@
},
"content": "Gemba Locale Lightweight YAML-backed localization. No external gem dependencies. Load translations for the given language code. Falls back to English if the requested locale file doesn't exist. Look up a translation by dot-separated key, with optional variable interpolation. Returns the key itself if no translation is found."
},
- "11": {
+ "51": {
"title": "Gemba::Locale::Translatable",
"type": "module",
"url": "/api/Gemba/Locale/Translatable/",
@@ -164,7 +582,34 @@
"method_docs": {},
"content": "Gemba Locale Translatable Mixin for classes that need translation access. Include this to call `translate` / `t` as instance methods."
},
- "12": {
+ "52": {
+ "title": "Gemba::MainWindow",
+ "type": "class",
+ "url": "/api/Gemba/MainWindow/",
+ "methods": "fullscreen= initialize mainloop reset_aspect_ratio reset_minsize set_aspect set_geometry set_minsize set_timer_speed set_title",
+ "method_docs": {},
+ "content": "Gemba MainWindow Pure Tk shell — creates the app window and hosts a FrameStack. MainWindow knows nothing about ROMs, emulation, menus, or config. It provides geometry/title/fullscreen primitives that the AppController drives. Its only structural contribution is the FrameStack, which manages show/hide transitions to prevent visual flash (FOUC)."
+ },
+ "53": {
+ "title": "Gemba::ModalStack",
+ "type": "class",
+ "url": "/api/Gemba/ModalStack/",
+ "methods": "active? current initialize pop push size",
+ "method_docs": {
+ "pop": "Pop the current modal off the stack.\n\nIf the stack still has entries, the previous modal is re-shown.\nIf the stack is no",
+ "push": "Push a modal onto the stack.\n\nIf another modal is on top, it is withdrawn (without callback).\nIf the stack was empty, on"
+ },
+ "content": "Gemba ModalStack Push/pop stack for modal child windows. One modal can push another (e.g. Settings → Replay Player) and the previous modal is automatically re-shown on pop. Windows must implement the ModalWindow protocol: show_modal(**args) — reveal the window (deiconify, grab, position) withdraw — hide the window (release grab, withdraw — NO callback) Pop the current modal off the stack. If the stack still has entries, the previous modal is re-shown. If the stack is now empty, on_exit is fired "
+ },
+ "54": {
+ "title": "Gemba::ModalStack::Entry",
+ "type": "class",
+ "url": "/api/Gemba/ModalStack/Entry/",
+ "methods": "",
+ "method_docs": {},
+ "content": "Gemba ModalStack Entry"
+ },
+ "55": {
"title": "Gemba::OverlayRenderer",
"type": "class",
"url": "/api/Gemba/OverlayRenderer/",
@@ -179,17 +624,58 @@
},
"content": "Gemba OverlayRenderer Renders inverse-blend HUD overlays (FPS counter, fast-forward indicator) on top of the game viewport. White source pixels invert the destination, so the text is always readable regardless of the game's background color. Transparent regions pass through unchanged. Free all textures. Draw all active overlays. FPS is positioned top-right; FF label is positioned top-left. Both are inset from the game area defined by +dest+. Whether the fast-forward label is currently showing. W"
},
- "13": {
- "title": "Gemba::Player",
+ "56": {
+ "title": "Gemba::PatcherWindow",
+ "type": "class",
+ "url": "/api/Gemba/PatcherWindow/",
+ "methods": "hide initialize show visible?",
+ "method_docs": {},
+ "content": "Gemba PatcherWindow Floating window for applying IPS/BPS/UPS patches to ROM files. Non-modal — no grab. Shows three file pickers (ROM, patch, output dir) and runs the patch in a background thread so the UI stays responsive."
+ },
+ "57": {
+ "title": "Gemba::PatcherWindow::PatchWorker",
"type": "class",
- "url": "/api/Gemba/Player/",
- "methods": "apply_fade_ramp initialize muted? recording? run",
+ "url": "/api/Gemba/PatcherWindow/PatchWorker/",
+ "methods": "call",
+ "method_docs": {},
+ "content": "Gemba PatcherWindow PatchWorker Worker class for Ractor-based patching. Defined as a class so Ractor.shareable_proc never sees nested closures — the lambda and rescue are created at runtime inside the Ractor."
+ },
+ "58": {
+ "title": "Gemba::Platform",
+ "type": "module",
+ "url": "/api/Gemba/Platform/",
+ "methods": "default for",
"method_docs": {
- "apply_fade_ramp": "Apply a linear fade-in ramp to int16 stereo PCM data.\nPure function: takes remaining/total counters, returns [pcm, new_r"
+ "default": "Default platform before any ROM is loaded (most common case).",
+ "for": "Build a Platform from a loaded Core."
},
- "content": "Gemba Player Full-featured GBA player with SDL2 video/audio rendering, keyboard and gamepad input, save states, and recording. Apply a linear fade-in ramp to int16 stereo PCM data. Pure function: takes remaining/total counters, returns [pcm, new_remaining]."
+ "content": "Gemba Platform Default platform before any ROM is loaded (most common case). Build a Platform from a loaded Core."
},
- "14": {
+ "59": {
+ "title": "Gemba::Platform::GB",
+ "type": "class",
+ "url": "/api/Gemba/Platform/GB/",
+ "methods": "== aspect buttons eql? fps fps_fraction hash height name short_name thumb_size width",
+ "method_docs": {},
+ "content": "Gemba Platform GB"
+ },
+ "60": {
+ "title": "Gemba::Platform::GBA",
+ "type": "class",
+ "url": "/api/Gemba/Platform/GBA/",
+ "methods": "== aspect buttons eql? fps fps_fraction hash height name short_name thumb_size width",
+ "method_docs": {},
+ "content": "Gemba Platform GBA"
+ },
+ "61": {
+ "title": "Gemba::Platform::GBC",
+ "type": "class",
+ "url": "/api/Gemba/Platform/GBC/",
+ "methods": "== aspect buttons eql? fps fps_fraction hash height name short_name thumb_size width",
+ "method_docs": {},
+ "content": "Gemba Platform GBC Same hardware specs as GB (resolution, FPS, buttons). Separate class for distinct name and future color-specific behavior."
+ },
+ "62": {
"title": "Gemba::Recorder",
"type": "class",
"url": "/api/Gemba/Recorder/",
@@ -201,7 +687,7 @@
},
"content": "Gemba Recorder Records emulator video + audio to a .grec file. Video is delta-compressed (XOR with previous frame) then zlib level 1. Audio is stored as raw PCM. A background thread handles disk I/O so the frame loop stays fast. Capture one frame of video + audio. Start recording. Writes header and spawns writer thread. Stop recording. Flushes remaining data, writes footer, closes file."
},
- "15": {
+ "63": {
"title": "Gemba::RecorderDecoder",
"type": "class",
"url": "/api/Gemba/RecorderDecoder/",
@@ -212,7 +698,7 @@
},
"content": "Gemba RecorderDecoder Decodes a .grec file and encodes it to a playable video via ffmpeg. Two-pass approach to avoid writing massive intermediate files: Pass 1: Extract audio to a small tempfile (~10MB/min), count frames, collect per-frame change percentages. Pass 2: Decode video frames one at a time and pipe to ffmpeg's stdin. Only one decoded video frame is in memory at a time, so RAM usage stays constant regardless of recording length. Decode a .grec file and encode to a playable video file. "
},
- "16": {
+ "64": {
"title": "Gemba::RecorderDecoder::FfmpegNotFound",
"type": "class",
"url": "/api/Gemba/RecorderDecoder/FfmpegNotFound/",
@@ -220,7 +706,7 @@
"method_docs": {},
"content": "Gemba RecorderDecoder FfmpegNotFound"
},
- "17": {
+ "65": {
"title": "Gemba::RecorderDecoder::FormatError",
"type": "class",
"url": "/api/Gemba/RecorderDecoder/FormatError/",
@@ -228,69 +714,155 @@
"method_docs": {},
"content": "Gemba RecorderDecoder FormatError"
},
- "18": {
+ "66": {
+ "title": "Gemba::ReplayPlayer",
+ "type": "class",
+ "url": "/api/Gemba/ReplayPlayer/",
+ "methods": "frame_index hide initialize pause paused? ready? replay_ended? resume run show show_modal withdraw",
+ "method_docs": {
+ "hide": "Hide the child window (child mode only).",
+ "pause": "Pause the replay (no-op if already paused).",
+ "resume": "Resume the replay (no-op if not paused).",
+ "show": "Show the child window (child mode only).",
+ "show_modal": "ModalStack protocol"
+ },
+ "content": "Gemba ReplayPlayer Non-interactive GBA replay viewer with SDL2 video/audio. Opens a window to play back a .gir input recording with full audio and video rendering. No game input is accepted — the bitmasks come from the .gir file. Supports pause, fast-forward, fullscreen, and screenshot hotkeys. Pauses on the last frame when the replay ends. Hide the child window (child mode only). Pause the replay (no-op if already paused). Resume the replay (no-op if not paused). Show the child window (child mo"
+ },
+ "67": {
+ "title": "Gemba::RomInfo",
+ "type": "class",
+ "url": "/api/Gemba/RomInfo/",
+ "methods": "from_rom boxart_path",
+ "method_docs": {
+ "from_rom": "Build a RomInfo from a raw rom_library entry hash.",
+ "boxart_path": "Effective cover image path: custom override wins, then fetched cache, then nil."
+ },
+ "content": "Gemba RomInfo Immutable snapshot of everything known about a single ROM. Aggregates data from multiple sources: - RomLibrary entry (title, path, game_code, platform, rom_id) - GameIndex (has_official_entry — whether libretro knows about it) - BoxartFetcher (cached_boxart_path — auto-fetched cover art) - RomOverrides (custom_boxart_path — user-chosen cover art) Use RomInfo.from_rom to construct from a raw library entry hash. Use #boxart_path to get the effective cover image (custom beats cache). "
+ },
+ "68": {
"title": "Gemba::RomInfoWindow",
"type": "class",
"url": "/api/Gemba/RomInfoWindow/",
- "methods": "publisher_name hide initialize show",
+ "methods": "publisher_name hide initialize show show_modal withdraw",
"method_docs": {
"publisher_name": "Look up a publisher name from a 2-char maker code.",
- "show": "Show the ROM Info window, populating it with data from the given core."
+ "show": "Show the ROM Info window, populating it with data from the given core.",
+ "show_modal": "ModalStack protocol (non-modal — no grab)"
},
- "content": "Gemba RomInfoWindow Displays ROM metadata in a read-only window. Shown via View > ROM Info when a ROM is loaded. Contains a two-column grid of labels: field name on the left, value on the right. Look up a publisher name from a 2-char maker code. Show the ROM Info window, populating it with data from the given core."
+ "content": "Gemba RomInfoWindow Displays ROM metadata in a read-only window. Shown via View > ROM Info when a ROM is loaded. Contains a two-column grid of labels: field name on the left, value on the right. Look up a publisher name from a 2-char maker code. Show the ROM Info window, populating it with data from the given core. ModalStack protocol (non-modal — no grab)"
},
- "19": {
- "title": "Gemba::RomLoader",
+ "69": {
+ "title": "Gemba::RomLibrary",
+ "type": "class",
+ "url": "/api/Gemba/RomLibrary/",
+ "methods": "default_path add all find initialize remove save! size touch",
+ "method_docs": {
+ "add": "Add or update a ROM entry. Upserts by rom_id.",
+ "all": "All known ROMs, sorted by last_played descending (most recent first).",
+ "find": "Find a ROM entry by rom_id.",
+ "remove": "Remove a ROM entry by rom_id.",
+ "save!": "Persist to disk.",
+ "touch": "Update last_played timestamp for a ROM."
+ },
+ "content": "Gemba RomLibrary Persistent catalog of known ROMs. Stored as JSON at Config.config_dir/rom_library.json. Each entry records the ROM's path, title, game code, rom_id, platform, and timestamps. The library is loaded once on boot and updated whenever a ROM is loaded. Add or update a ROM entry. Upserts by rom_id. All known ROMs, sorted by last_played descending (most recent first). Find a ROM entry by rom_id. Remove a ROM entry by rom_id. Persist to disk. Update last_played timestamp for a ROM."
+ },
+ "70": {
+ "title": "Gemba::RomOverrides",
+ "type": "class",
+ "url": "/api/Gemba/RomOverrides/",
+ "methods": "custom_boxart initialize set_custom_boxart",
+ "method_docs": {
+ "set_custom_boxart": "Copies src_path into the gemba boxart cache and records the dest path."
+ },
+ "content": "Gemba RomOverrides Persists per-ROM user overrides to config_dir/rom_overrides.json. Keyed by rom_id (game_code + CRC32 checksum) — the most stable identifier for a ROM across renames or moves. Currently tracks: custom_boxart — absolute path to a user-chosen cover image Custom images are copied into config_dir/boxart/{rom_id}/custom.{ext} so they remain accessible even if the original file is moved or deleted. Copies src_path into the gemba boxart cache and records the dest path."
+ },
+ "71": {
+ "title": "Gemba::RomPatcher",
+ "type": "class",
+ "url": "/api/Gemba/RomPatcher/",
+ "methods": "detect_format patch safe_out_path",
+ "method_docs": {
+ "patch": "Auto-detect format, apply patch, write output file.\n\nProgress budget:\n 0–15% read ROM\n 15–25% read patch\n 25–90% ",
+ "safe_out_path": "Return a path that does not collide with existing files.\nIf +path+ exists, appends -(2), -(3), ... before the extension."
+ },
+ "content": "Gemba RomPatcher Applies IPS, BPS, or UPS patch files to GBA ROM files. Format support: IPS — simplest; no checksums; RLE support BPS — Beat Patch System; delta encoding with CRC32 verification UPS — Universal Patching System; XOR hunks with CRC32 verification Usage: RomPatcher.patch(rom_path: \"game.gba\", patch_path: \"fix.ips\", out_path: \"patched.gba\") # or invoke a format class directly: RomPatcher::IPS.apply(rom_bytes, patch_bytes) # => patched_bytes Auto-detect format, apply patch, write outp"
+ },
+ "72": {
+ "title": "Gemba::RomPatcher::BPS",
+ "type": "class",
+ "url": "/api/Gemba/RomPatcher/BPS/",
+ "methods": "apply",
+ "method_docs": {},
+ "content": "Gemba RomPatcher BPS Applies a BPS (Beat Patch System) patch. File layout: ┌──────────────────────────────────────────────────────┐ │ \"BPS1\" (4 bytes, magic) │ ├──────────────────────────────────────────────────────┤ │ source_size (varint) │ │ target_size (varint) │ │ metadata_size (varint) │ │ metadata ( bytes, skipped) │ ├──────────────────────────────────────────────────────┤ │ actions … (repeated until patch.size - 12) │ ├──────────────────────────────────────────────────────┤"
+ },
+ "73": {
+ "title": "Gemba::RomPatcher::IPS",
"type": "class",
- "url": "/api/Gemba/RomLoader/",
+ "url": "/api/Gemba/RomPatcher/IPS/",
+ "methods": "apply",
+ "method_docs": {},
+ "content": "Gemba RomPatcher IPS Applies an IPS (International Patching System) patch. File layout: ┌─────────────────────────────────────────────┐ │ \"PATCH\" (5 bytes, magic) │ ├─────────────────────────────────────────────┤ │ Record 1 │ │ Record 2 │ │ ... │ ├─────────────────────────────────────────────┤ │ \"EOF\" (3 bytes, terminator) │ └─────────────────────────────────────────────┘ Record formats: Normal record: ┌────────────────────┬───────────────────┬─────────────────────┐ │ offset │ size │ data │ │ 3 "
+ },
+ "74": {
+ "title": "Gemba::RomPatcher::UPS",
+ "type": "class",
+ "url": "/api/Gemba/RomPatcher/UPS/",
+ "methods": "apply",
+ "method_docs": {},
+ "content": "Gemba RomPatcher UPS Applies a UPS (Universal Patching System) patch. File layout: ┌──────────────────────────────────────────────────────┐ │ \"UPS1\" (4 bytes, magic) │ ├──────────────────────────────────────────────────────┤ │ source_size (varint) │ │ target_size (varint) │ ├──────────────────────────────────────────────────────┤ │ hunks … (repeated until patch.size - 12) │ ├──────────────────────────────────────────────────────┤ │ src_crc32 4B LE │ tgt_crc32 4B LE │ patch │ ← footer └──────────"
+ },
+ "75": {
+ "title": "Gemba::RomResolver",
+ "type": "class",
+ "url": "/api/Gemba/RomResolver/",
"methods": "cleanup_temp resolve tmp_dir",
"method_docs": {
"cleanup_temp": "Remove previously extracted temp files.",
"resolve": "Resolve a path to a loadable ROM file.\nFor ROM files, returns the path unchanged.\nFor ZIP files, extracts the single ROM"
},
- "content": "Gemba RomLoader Resolves ROM paths for the player. Handles both bare ROM files and .zip archives containing a single ROM at the zip root. Remove previously extracted temp files. Resolve a path to a loadable ROM file. For ROM files, returns the path unchanged. For ZIP files, extracts the single ROM inside to a temp directory."
+ "content": "Gemba RomResolver Resolves ROM paths for the player. Handles both bare ROM files and .zip archives containing a single ROM at the zip root. Remove previously extracted temp files. Resolve a path to a loadable ROM file. For ROM files, returns the path unchanged. For ZIP files, extracts the single ROM inside to a temp directory."
},
- "20": {
- "title": "Gemba::RomLoader::Error",
+ "76": {
+ "title": "Gemba::RomResolver::Error",
"type": "class",
- "url": "/api/Gemba/RomLoader/Error/",
+ "url": "/api/Gemba/RomResolver/Error/",
"methods": "",
"method_docs": {},
- "content": "Gemba RomLoader Error"
+ "content": "Gemba RomResolver Error"
},
- "21": {
- "title": "Gemba::RomLoader::MultipleRomsInZip",
+ "77": {
+ "title": "Gemba::RomResolver::MultipleRomsInZip",
"type": "class",
- "url": "/api/Gemba/RomLoader/MultipleRomsInZip/",
+ "url": "/api/Gemba/RomResolver/MultipleRomsInZip/",
"methods": "",
"method_docs": {},
- "content": "Gemba RomLoader MultipleRomsInZip"
+ "content": "Gemba RomResolver MultipleRomsInZip"
},
- "22": {
- "title": "Gemba::RomLoader::NoRomInZip",
+ "78": {
+ "title": "Gemba::RomResolver::NoRomInZip",
"type": "class",
- "url": "/api/Gemba/RomLoader/NoRomInZip/",
+ "url": "/api/Gemba/RomResolver/NoRomInZip/",
"methods": "",
"method_docs": {},
- "content": "Gemba RomLoader NoRomInZip"
+ "content": "Gemba RomResolver NoRomInZip"
},
- "23": {
- "title": "Gemba::RomLoader::UnsupportedFormat",
+ "79": {
+ "title": "Gemba::RomResolver::UnsupportedFormat",
"type": "class",
- "url": "/api/Gemba/RomLoader/UnsupportedFormat/",
+ "url": "/api/Gemba/RomResolver/UnsupportedFormat/",
"methods": "",
"method_docs": {},
- "content": "Gemba RomLoader UnsupportedFormat"
+ "content": "Gemba RomResolver UnsupportedFormat"
},
- "24": {
- "title": "Gemba::RomLoader::ZipReadError",
+ "80": {
+ "title": "Gemba::RomResolver::ZipReadError",
"type": "class",
- "url": "/api/Gemba/RomLoader/ZipReadError/",
+ "url": "/api/Gemba/RomResolver/ZipReadError/",
"methods": "",
"method_docs": {},
- "content": "Gemba RomLoader ZipReadError"
+ "content": "Gemba RomResolver ZipReadError"
},
- "25": {
+ "81": {
"title": "Gemba::SaveStateManager",
"type": "class",
"url": "/api/Gemba/SaveStateManager/",
@@ -305,31 +877,125 @@
},
"content": "Gemba SaveStateManager Manages save state persistence: save, load, screenshot capture, debounce, and backup rotation. All dependencies are injected via the constructor so the class can be tested with lightweight mocks (no real mGBA Core or Tk interpreter). Load the emulator state from the given slot. Load from the quick save slot. Save to the quick save slot. Save a PNG screenshot of the current frame via Tk photo image. Uses @app.command() to drive Tk's image subsystem. Save the emulator state "
},
- "26": {
+ "82": {
"title": "Gemba::SaveStatePicker",
"type": "class",
"url": "/api/Gemba/SaveStatePicker/",
- "methods": "hide initialize show",
+ "methods": "hide initialize show show_modal withdraw",
+ "method_docs": {
+ "show_modal": "ModalStack protocol"
+ },
+ "content": "Gemba SaveStatePicker Grid picker window for save state slots. Displays up to 10 slots in a 2×5 grid. Each cell shows a PNG thumbnail screenshot, the slot number, and the save timestamp — or an \"Empty\" placeholder. Left-click a populated slot to load, click an empty slot to save. The current quick-save slot is highlighted with a distinct border. Uses native Tk photo images for thumbnails (loaded via `image create photo -file`). Pure Tk — no SDL2. ModalStack protocol"
+ },
+ "83": {
+ "title": "Gemba::SessionLogger",
+ "type": "class",
+ "url": "/api/Gemba/SessionLogger/",
+ "methods": "initialize log log_dir",
+ "method_docs": {
+ "log": "Log a message at the given level. Uses block form to avoid\nallocating the message string when the level is filtered."
+ },
+ "content": "Gemba SessionLogger Session logger that writes to the user config logs/ directory. File and directory are created lazily on first write. Log a message at the given level. Uses block form to avoid allocating the message string when the level is filtered."
+ },
+ "84": {
+ "title": "Gemba::Settings",
+ "type": "module",
+ "url": "/api/Gemba/Settings/",
+ "methods": "",
"method_docs": {},
- "content": "Gemba SaveStatePicker Grid picker window for save state slots. Displays up to 10 slots in a 2×5 grid. Each cell shows a PNG thumbnail screenshot, the slot number, and the save timestamp — or an \"Empty\" placeholder. Left-click a populated slot to load, click an empty slot to save. The current quick-save slot is highlighted with a distinct border. Uses native Tk photo images for thumbnails (loaded via `image create photo -file`). Pure Tk — no SDL2."
+ "content": "Gemba Settings"
},
- "27": {
+ "85": {
+ "title": "Gemba::Settings::AudioTab",
+ "type": "class",
+ "url": "/api/Gemba/Settings/AudioTab/",
+ "methods": "build initialize load_from_config",
+ "method_docs": {},
+ "content": "Gemba Settings AudioTab"
+ },
+ "86": {
+ "title": "Gemba::Settings::GamepadTab",
+ "type": "class",
+ "url": "/api/Gemba/Settings/GamepadTab/",
+ "methods": "build capture_mapping initialize keyboard_mode? refresh_gamepad update_gamepad_list",
+ "method_docs": {
+ "refresh_gamepad": "Refresh the gamepad tab widgets from external state (e.g. after undo)."
+ },
+ "content": "Gemba Settings GamepadTab Refresh the gamepad tab widgets from external state (e.g. after undo)."
+ },
+ "87": {
+ "title": "Gemba::Settings::HotkeysTab",
+ "type": "class",
+ "url": "/api/Gemba/Settings/HotkeysTab/",
+ "methods": "build capture_hk_mapping finalize_hk initialize refresh_hotkeys",
+ "method_docs": {
+ "capture_hk_mapping": "Capture a hotkey during listen mode. Called by the Tk \nbind script, or directly by tests.",
+ "finalize_hk": "Finalize a captured hotkey (plain key or combo).",
+ "refresh_hotkeys": "Refresh the hotkeys tab widgets from external state (e.g. after undo)."
+ },
+ "content": "Gemba Settings HotkeysTab Capture a hotkey during listen mode. Called by the Tk bind script, or directly by tests. Finalize a captured hotkey (plain key or combo). Refresh the hotkeys tab widgets from external state (e.g. after undo)."
+ },
+ "88": {
+ "title": "Gemba::Settings::Paths",
+ "type": "module",
+ "url": "/api/Gemba/Settings/Paths/",
+ "methods": "",
+ "method_docs": {},
+ "content": "Gemba Settings Paths Shared Tk widget path roots for all settings tabs."
+ },
+ "89": {
+ "title": "Gemba::Settings::RecordingTab",
+ "type": "class",
+ "url": "/api/Gemba/Settings/RecordingTab/",
+ "methods": "build initialize load_from_config",
+ "method_docs": {},
+ "content": "Gemba Settings RecordingTab"
+ },
+ "90": {
+ "title": "Gemba::Settings::SaveStatesTab",
+ "type": "class",
+ "url": "/api/Gemba/Settings/SaveStatesTab/",
+ "methods": "build initialize load_from_config",
+ "method_docs": {},
+ "content": "Gemba Settings SaveStatesTab"
+ },
+ "91": {
+ "title": "Gemba::Settings::SystemTab",
+ "type": "class",
+ "url": "/api/Gemba/Settings/SystemTab/",
+ "methods": "build initialize load_from_config save_to_config",
+ "method_docs": {
+ "load_from_config": "Called by SettingsWindow via :config_loaded bus event",
+ "save_to_config": "Called by AppController#save_config"
+ },
+ "content": "Gemba Settings SystemTab Called by SettingsWindow via :config_loaded bus event Called by AppController#save_config"
+ },
+ "92": {
+ "title": "Gemba::Settings::VideoTab",
+ "type": "class",
+ "url": "/api/Gemba/Settings/VideoTab/",
+ "methods": "build initialize load_from_config",
+ "method_docs": {},
+ "content": "Gemba Settings VideoTab"
+ },
+ "93": {
"title": "Gemba::SettingsWindow",
"type": "class",
"url": "/api/Gemba/SettingsWindow/",
- "methods": "capture_hk_mapping capture_mapping finalize_hk hide initialize keyboard_mode? mark_dirty refresh_gamepad refresh_hotkeys set_per_game_active set_per_game_available show update_gamepad_list",
+ "methods": "capture_hk_mapping capture_mapping finalize_hk hide hk_listening_for initialize keyboard_mode? listening_for mark_dirty refresh_gamepad refresh_hotkeys set_per_game_active set_per_game_available show show_modal subscribe_to_bus system_tab update_gamepad_list",
"method_docs": {
- "capture_hk_mapping": "Capture a hotkey during listen mode. Called by the Tk \nbind script, or directly by tests.\n\nModifier keys (Ctrl, Shi",
- "finalize_hk": "Finalize a captured hotkey (plain key or combo). Also called by\ntests that want to bypass the modifier settle timer.",
+ "hk_listening_for": "Delegates to HotkeysTab",
+ "listening_for": "Delegates to GamepadTab",
"mark_dirty": "Enable the Save button (called when any setting changes)",
- "refresh_gamepad": "Refresh the gamepad tab widgets from external state (e.g. after undo).",
- "refresh_hotkeys": "Refresh the hotkeys tab widgets from external state (e.g. after undo).",
"set_per_game_active": "Sync the per-game checkbox to the current config state.",
- "set_per_game_available": "Enable/disable the per-game checkbox (called when ROM loads/unloads)."
+ "set_per_game_available": "Enable/disable the per-game checkbox (called when ROM loads/unloads).",
+ "show_modal": "ModalStack protocol",
+ "subscribe_to_bus": "Subscribe to bus events this object cares about.",
+ "system_tab": "Exposes SystemTab for AppController save_config"
},
- "content": "Gemba SettingsWindow Settings window for the mGBA Player. Opens a Toplevel with a ttk::notebook containing Video, Audio, and Gamepad tabs. Closing the window hides it (withdraw) rather than destroying it. Widget paths and Tcl variable names are exposed as constants so tests can interact with the UI the same way a user would (set variable, generate event, assert result). Capture a hotkey during listen mode. Called by the Tk bind script, or directly by tests. Modifier keys (Ctrl, Shift, Alt)"
+ "content": "Gemba SettingsWindow Settings window for the mGBA Player. Thin coordinator that builds a Toplevel with a ttk::notebook, delegates each tab to its own class under Settings::*, and manages shared concerns (per-game bar, save button, key-conflict dialog). Delegates to HotkeysTab Delegates to GamepadTab Enable the Save button (called when any setting changes) Sync the per-game checkbox to the current config state. Enable/disable the per-game checkbox (called when ROM loads/unloads). ModalStack proto"
},
- "28": {
+ "94": {
"title": "Gemba::TipService",
"type": "class",
"url": "/api/Gemba/TipService/",
@@ -341,7 +1007,7 @@
},
"content": "Gemba TipService Click-to-show tooltip service for Tk widgets. Labels registered with {#register} get an underlined font (like HTML ). Clicking them shows a tooltip popup below the label. Only one tooltip is visible at a time; it auto-dismisses after {#dismiss_ms} unless the mouse hovers over the tip or its label. The tooltip is rendered as a frame inside the parent window (not a toplevel), so it draws as a true rectangle on all platforms. Hide the current tooltip. Register a widget for cl"
},
- "29": {
+ "95": {
"title": "Gemba::ToastOverlay",
"type": "class",
"url": "/api/Gemba/ToastOverlay/",
@@ -354,7 +1020,7 @@
},
"content": "Gemba ToastOverlay Renders timed notification toasts at the bottom of the game viewport. One toast at a time; showing a new one replaces the old. The background is a pre-rendered anti-aliased rounded rectangle (generated in C). All SDL2 objects (renderer, font, textures) are injected or created internally, so the class can be tested with lightweight mocks. Remove the current toast and free textures. Draw the toast centered at the bottom of the game area. Display a toast message. Replaces any exi"
},
- "30": {
+ "96": {
"title": "Gemba::VirtualKeyboard",
"type": "class",
"url": "/api/Gemba/VirtualKeyboard/",
diff --git a/ext/gemba/extconf.rb b/ext/gemba/extconf.rb
index 8c8df07..b463eeb 100644
--- a/ext/gemba/extconf.rb
+++ b/ext/gemba/extconf.rb
@@ -181,6 +181,28 @@ def find_mgba
MSG
end
-$srcs = ['gemba_ext.c']
+rcheevos_root = File.expand_path('../../vendor/rcheevos', __dir__)
+abort "vendor/rcheevos submodule not initialised — run: git submodule update --init" \
+ unless File.exist?("#{rcheevos_root}/src/rcheevos/runtime.c")
+
+$INCFLAGS << " -I#{rcheevos_root}/include"
+$INCFLAGS << " -I#{rcheevos_root}/src/rcheevos"
+$INCFLAGS << " -I#{rcheevos_root}/src"
+
+# Tell mkmf where to find the rcheevos source files.
+$VPATH << "#{rcheevos_root}/src/rcheevos"
+$VPATH << "#{rcheevos_root}/src"
+$VPATH << "#{rcheevos_root}/src/rhash"
+
+# Core evaluation engine + md5 (needed by runtime.c / runtime_progress.c).
+# Excludes HTTP client, ROM hash, and rapi.
+$srcs = %w[
+ gemba_ext.c
+ alloc.c condition.c condset.c format.c lboard.c memref.c
+ operand.c richpresence.c runtime.c runtime_progress.c
+ trigger.c value.c
+ rc_compat.c rc_util.c
+ md5.c
+]
create_makefile('gemba_ext')
diff --git a/ext/gemba/gemba_ext.c b/ext/gemba/gemba_ext.c
index 8203ff9..a776d60 100644
--- a/ext/gemba/gemba_ext.c
+++ b/ext/gemba/gemba_ext.c
@@ -1,4 +1,5 @@
#include "gemba_ext.h"
+#include "rc_runtime.h"
#include
#include
#include
@@ -19,6 +20,7 @@ void blip_set_rates(struct blip_t *, double clock_rate, double sample_rate);
VALUE mGemba;
static VALUE cCore;
+static VALUE ra_empty_array; /* frozen [] returned by do_frame when nothing triggered */
/* No-op logger — prevents segfault when mGBA tries to log
* without a logger configured (the default is NULL). */
@@ -647,6 +649,50 @@ mgba_core_maker_code(VALUE self)
}
/* --------------------------------------------------------- */
+/* Core#bus_read8(address) */
+/* Read one byte from the GBA address bus. */
+/* Returns 0..255 as an Integer. */
+/* Primarily used by the achievement subsystem to evaluate */
+/* memory conditions (IWRAM, EWRAM, registers). */
+/* --------------------------------------------------------- */
+
+static VALUE
+mgba_core_bus_read8(VALUE self, VALUE addr)
+{
+ struct mgba_core *mc = get_mgba_core(self);
+ uint32_t address = (uint32_t)NUM2UINT(addr);
+ uint8_t val = (uint8_t)mc->core->busRead8(mc->core, address);
+ return UINT2NUM(val);
+}
+
+/* Core#bus_read16(address) */
+/* Read two bytes (little-endian) from the GBA address bus. */
+/* Returns 0..65535 as an Integer. */
+/* --------------------------------------------------------- */
+
+static VALUE
+mgba_core_bus_read16(VALUE self, VALUE addr)
+{
+ struct mgba_core *mc = get_mgba_core(self);
+ uint32_t address = (uint32_t)NUM2UINT(addr);
+ uint16_t val = (uint16_t)mc->core->busRead16(mc->core, address);
+ return UINT2NUM(val);
+}
+
+/* Core#bus_read32(address) */
+/* Read four bytes (little-endian) from the GBA address bus. */
+/* Returns 0..4294967295 as an Integer. */
+/* --------------------------------------------------------- */
+
+static VALUE
+mgba_core_bus_read32(VALUE self, VALUE addr)
+{
+ struct mgba_core *mc = get_mgba_core(self);
+ uint32_t address = (uint32_t)NUM2UINT(addr);
+ uint32_t val = mc->core->busRead32(mc->core, address);
+ return UINT2NUM(val);
+}
+
/* Core#save_state_to_file(path) */
/* Save the complete emulator state to a file. */
/* Returns true on success, false on failure. */
@@ -1046,6 +1092,252 @@ mgba_core_bios_loaded_p(VALUE self)
return gba->biosVf ? Qtrue : Qfalse;
}
+/* --------------------------------------------------------- */
+/* Gemba::RARuntime — thin wrapper around rc_runtime_t */
+/* (RetroAchievements/rcheevos) */
+/* --------------------------------------------------------- */
+
+/* Achievement IDs arrive from Ruby as numeric strings ("12345").
+ * rcheevos uses uint32_t internally. ra_id_to_u32 parses them;
+ * ra_id_to_str converts back for the do_frame return array. */
+static uint32_t
+ra_id_to_u32(VALUE rb_id)
+{
+ Check_Type(rb_id, T_STRING);
+ return (uint32_t)strtoul(StringValueCStr(rb_id), NULL, 10);
+}
+
+/* GBA RA-address-space → mGBA bus address.
+ * 0x000000–0x07FFFF → IWRAM 0x03000000
+ * 0x080000+ → EWRAM 0x02000000 + (addr - 0x080000)
+ * rcheevos passes raw RA addresses to the peek callback. */
+static inline uint32_t
+ra_to_gba_addr(uint32_t ra_addr)
+{
+ if (ra_addr < 0x08000)
+ return 0x03000000 + ra_addr;
+ else
+ return 0x02000000 + (ra_addr - 0x08000);
+}
+
+/* rcheevos peek callback — called by rc_runtime_do_frame for every
+ * memory read. Translates RA addresses to GBA bus addresses and
+ * reads 1, 2, or 4 bytes in little-endian order. */
+static uint32_t
+ra_peek(uint32_t ra_addr, uint32_t num_bytes, void *ud)
+{
+ struct mCore *core = (struct mCore *)ud;
+ uint32_t gba = ra_to_gba_addr(ra_addr);
+ switch (num_bytes) {
+ case 1: return (uint32_t)core->busRead8(core, gba);
+ case 2: return (uint32_t)core->busRead16(core, gba);
+ case 4: return core->busRead32(core, gba);
+ default: return 0;
+ }
+}
+
+/* Triggered-ID collection for do_frame.
+ * rc_runtime_event_handler_t has no userdata parameter, so we stash
+ * a pointer to frame-local storage in a static before each call and
+ * clear it after. Ruby's GVL ensures single-threaded execution here. */
+typedef struct {
+ uint32_t ids[256];
+ int count;
+} ra_frame_ctx_t;
+
+static ra_frame_ctx_t *s_ra_frame_ctx = NULL;
+
+static void
+ra_event_handler(const rc_runtime_event_t *event)
+{
+ if (!s_ra_frame_ctx) return;
+ if (event->type == RC_RUNTIME_EVENT_ACHIEVEMENT_TRIGGERED &&
+ s_ra_frame_ctx->count < 256)
+ s_ra_frame_ctx->ids[s_ra_frame_ctx->count++] = event->id;
+}
+
+/* Wrapper struct — embeds rc_runtime_t by value so a single allocation
+ * covers both our bookkeeping and the rcheevos runtime internals. */
+typedef struct {
+ rc_runtime_t rc;
+ int count; /* number of currently activated achievements */
+} ra_wrapper_t;
+
+static void
+ra_wrapper_free(void *ptr)
+{
+ ra_wrapper_t *w = (ra_wrapper_t *)ptr;
+ rc_runtime_destroy(&w->rc);
+ xfree(w);
+}
+
+static VALUE cRARuntime;
+
+static const rb_data_type_t ra_runtime_type = {
+ .wrap_struct_name = "Gemba::RARuntime",
+ .function = {
+ .dmark = NULL,
+ .dfree = ra_wrapper_free,
+ .dsize = NULL,
+ },
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY,
+};
+
+static VALUE
+ra_runtime_alloc(VALUE klass)
+{
+ ra_wrapper_t *w = ALLOC(ra_wrapper_t);
+ rc_runtime_init(&w->rc);
+ w->count = 0;
+ return TypedData_Wrap_Struct(klass, &ra_runtime_type, w);
+}
+
+static ra_wrapper_t *
+get_ra_wrapper(VALUE self)
+{
+ ra_wrapper_t *w;
+ TypedData_Get_Struct(self, ra_wrapper_t, &ra_runtime_type, w);
+ return w;
+}
+
+/*
+ * RARuntime#activate(id, memaddr) → nil
+ * Parse memaddr and register the achievement in the rcheevos runtime.
+ * Raises ArgumentError if rcheevos rejects the condition string.
+ */
+static VALUE
+ra_runtime_rb_activate(VALUE self, VALUE rb_id, VALUE rb_memaddr)
+{
+ Check_Type(rb_memaddr, T_STRING);
+ ra_wrapper_t *w = get_ra_wrapper(self);
+ uint32_t id = ra_id_to_u32(rb_id);
+ int rc = rc_runtime_activate_achievement(&w->rc, id,
+ StringValueCStr(rb_memaddr),
+ NULL, 0);
+ if (rc != RC_OK)
+ rb_raise(rb_eArgError,
+ "RARuntime: rcheevos rejected memaddr (err %d): %s",
+ rc, StringValueCStr(rb_memaddr));
+ w->count++;
+ return Qnil;
+}
+
+/*
+ * RARuntime#deactivate(id) → nil
+ */
+static VALUE
+ra_runtime_rb_deactivate(VALUE self, VALUE rb_id)
+{
+ ra_wrapper_t *w = get_ra_wrapper(self);
+ rc_runtime_deactivate_achievement(&w->rc, ra_id_to_u32(rb_id));
+ if (w->count > 0) w->count--;
+ return Qnil;
+}
+
+/*
+ * RARuntime#reset_all → nil
+ * Reset every achievement to WAITING state (as if freshly activated).
+ * Call this after loading a save state so delta/prior histories are
+ * discarded and achievements can't fire spuriously.
+ */
+static VALUE
+ra_runtime_rb_reset_all(VALUE self)
+{
+ rc_runtime_reset(&get_ra_wrapper(self)->rc);
+ return Qnil;
+}
+
+/*
+ * RARuntime#clear → nil
+ * Destroy all achievements and reinitialise the runtime from scratch.
+ */
+static VALUE
+ra_runtime_rb_clear(VALUE self)
+{
+ ra_wrapper_t *w = get_ra_wrapper(self);
+ rc_runtime_destroy(&w->rc);
+ rc_runtime_init(&w->rc);
+ w->count = 0;
+ return Qnil;
+}
+
+/*
+ * RARuntime#do_frame(core) → Array
+ * Evaluate all active achievements against current emulator memory.
+ * Returns an array of string IDs for achievements that triggered.
+ */
+static VALUE
+ra_runtime_rb_do_frame(VALUE self, VALUE rb_core)
+{
+ struct mgba_core *mc;
+ TypedData_Get_Struct(rb_core, struct mgba_core, &mgba_core_type, mc);
+ if (mc->destroyed || !mc->core)
+ rb_raise(rb_eRuntimeError, "mGBA core has been destroyed");
+
+ ra_wrapper_t *w = get_ra_wrapper(self);
+ ra_frame_ctx_t ctx = { .count = 0 };
+
+ s_ra_frame_ctx = &ctx;
+ rc_runtime_do_frame(&w->rc, ra_event_handler, ra_peek, mc->core, NULL);
+ s_ra_frame_ctx = NULL;
+
+ if (ctx.count == 0) return ra_empty_array;
+
+ VALUE result = rb_ary_new_capa(ctx.count);
+ char buf[16];
+ for (int i = 0; i < ctx.count; i++) {
+ snprintf(buf, sizeof(buf), "%u", ctx.ids[i]);
+ rb_ary_push(result, rb_str_new_cstr(buf));
+ }
+ return result;
+}
+
+/*
+ * RARuntime#count → Integer
+ * Number of currently activated achievements.
+ */
+static VALUE
+ra_runtime_rb_count(VALUE self)
+{
+ return INT2NUM(get_ra_wrapper(self)->count);
+}
+
+/*
+ * RARuntime#activate_richpresence(script) → true | false
+ * Load a Rich Presence script into the runtime.
+ * Returns true on success, false if the script failed to parse.
+ */
+static VALUE
+ra_runtime_rb_activate_richpresence(VALUE self, VALUE rb_script)
+{
+ ra_wrapper_t *w = get_ra_wrapper(self);
+ const char *script = StringValueCStr(rb_script);
+ int rc;
+
+ rc = rc_runtime_activate_richpresence(&w->rc, script, NULL, 0);
+ return rc == RC_OK ? Qtrue : Qfalse;
+}
+
+/*
+ * RARuntime#get_richpresence(core) → String | nil
+ * Evaluate the active Rich Presence script against current memory and
+ * return the display string, or nil if no script is loaded / empty result.
+ */
+static VALUE
+ra_runtime_rb_get_richpresence(VALUE self, VALUE rb_core)
+{
+ ra_wrapper_t *w = get_ra_wrapper(self);
+ struct mgba_core *mc;
+ char buf[512];
+ int len;
+
+ TypedData_Get_Struct(rb_core, struct mgba_core, &mgba_core_type, mc);
+ len = rc_runtime_get_richpresence(&w->rc, buf, sizeof(buf), ra_peek, mc->core, NULL);
+ if (len <= 0)
+ return Qnil;
+ return rb_str_new(buf, len);
+}
+
/* --------------------------------------------------------- */
/* Init */
/* --------------------------------------------------------- */
@@ -1132,6 +1424,9 @@ Init_gemba_ext(void)
rb_define_method(cCore, "destroyed?", mgba_core_destroyed_p, 0);
rb_define_method(cCore, "load_bios", mgba_core_load_bios, 1);
rb_define_method(cCore, "bios_loaded?", mgba_core_bios_loaded_p, 0);
+ rb_define_method(cCore, "bus_read8", mgba_core_bus_read8, 1);
+ rb_define_method(cCore, "bus_read16", mgba_core_bus_read16, 1);
+ rb_define_method(cCore, "bus_read32", mgba_core_bus_read32, 1);
/* BIOS checksum utility */
rb_define_module_function(mGemba, "gba_bios_checksum", mgba_gba_bios_checksum, 1);
@@ -1165,6 +1460,22 @@ Init_gemba_ext(void)
OBJ_FREEZE(btn_bits);
rb_define_const(mGemba, "GBA_BTN_BITS", btn_bits);
+ /* Frozen empty array returned by RARuntime#do_frame when nothing triggered */
+ ra_empty_array = rb_ary_freeze(rb_ary_new_capa(0));
+ rb_gc_register_mark_object(ra_empty_array);
+
+ /* Gemba::RARuntime — RA condition evaluator */
+ cRARuntime = rb_define_class_under(mGemba, "RARuntime", rb_cObject);
+ rb_define_alloc_func(cRARuntime, ra_runtime_alloc);
+ rb_define_method(cRARuntime, "activate", ra_runtime_rb_activate, 2);
+ rb_define_method(cRARuntime, "deactivate", ra_runtime_rb_deactivate, 1);
+ rb_define_method(cRARuntime, "reset_all", ra_runtime_rb_reset_all, 0);
+ rb_define_method(cRARuntime, "clear", ra_runtime_rb_clear, 0);
+ rb_define_method(cRARuntime, "do_frame", ra_runtime_rb_do_frame, 1);
+ rb_define_method(cRARuntime, "count", ra_runtime_rb_count, 0);
+ rb_define_method(cRARuntime, "activate_richpresence", ra_runtime_rb_activate_richpresence, 1);
+ rb_define_method(cRARuntime, "get_richpresence", ra_runtime_rb_get_richpresence, 1);
+
/* Toast background generator */
rb_define_module_function(mGemba, "toast_background", mgba_toast_background, 3);
diff --git a/lib/gemba/achievements.rb b/lib/gemba/achievements.rb
new file mode 100644
index 0000000..6597104
--- /dev/null
+++ b/lib/gemba/achievements.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module Gemba
+ module Achievements
+ # Build the appropriate backend based on config.
+ # Returns NullBackend if RA is disabled.
+ # Requires app: (Teek app) for RetroAchievements::Backend's BackgroundWork HTTP calls.
+ #
+ # @param config [Config]
+ # @param app [Teek::App, nil]
+ # @return [Backend]
+ def self.backend_for(config, app: nil)
+ return NullBackend.new unless config.ra_enabled?
+ return NullBackend.new unless app
+
+ RetroAchievements::Backend.new(app: app)
+ end
+ end
+end
diff --git a/lib/gemba/achievements/achievement.rb b/lib/gemba/achievements/achievement.rb
new file mode 100644
index 0000000..ff862ca
--- /dev/null
+++ b/lib/gemba/achievements/achievement.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+module Gemba
+ module Achievements
+ # Represents a single achievement (earned or unearned).
+ #
+ # @attr [String] id Unique identifier (string, arbitrary)
+ # @attr [String] title Short display name
+ # @attr [String] description What the player must do to earn it
+ # @attr [Integer] points RA point value (or custom weight)
+ # @attr [Time, nil] earned_at When it was unlocked; nil if unearned
+ Achievement = Data.define(:id, :title, :description, :points, :earned_at) do
+ def earned?
+ !earned_at.nil?
+ end
+
+ # Return a copy marked as earned right now.
+ def earn
+ with(earned_at: Time.now)
+ end
+ end
+ end
+end
diff --git a/lib/gemba/achievements/backend.rb b/lib/gemba/achievements/backend.rb
new file mode 100644
index 0000000..627bb27
--- /dev/null
+++ b/lib/gemba/achievements/backend.rb
@@ -0,0 +1,186 @@
+# frozen_string_literal: true
+
+module Gemba
+ module Achievements
+ # Abstract interface for achievement backends.
+ #
+ # All methods have no-op defaults so backends only need to override
+ # what they support. Concrete backends: NullBackend, FakeBackend,
+ # and the future RetroAchievements backend.
+ #
+ # Thread safety: do_frame is called from the emulation thread (Tk
+ # after-loop). on_unlock and on_auth_change callbacks fire on the
+ # same thread.
+ #
+ # Authentication lifecycle (decoupled from the real network):
+ # 1. call login(username:, token:) — may be async
+ # 2. on_auth_change callback fires with status :ok or :error
+ # 3. authenticated? reflects the current state
+ # 4. call logout to clear credentials
+ module Backend
+ # -- Authentication -------------------------------------------------------
+
+ # Initiate login with username + password (first-time auth).
+ # On success the on_auth_change callback fires with :ok and the
+ # returned API token is yielded so the caller can persist it:
+ # on_auth_change { |status, token_or_error| ... }
+ # NullBackend ignores this call.
+ #
+ # @param username [String]
+ # @param password [String]
+ def login_with_password(username:, password:); end
+
+ # Resume a session using a previously stored API token.
+ # Called automatically at startup when credentials are already saved.
+ #
+ # @param username [String]
+ # @param token [String]
+ def login_with_token(username:, token:); end
+
+ # Clear authentication state and stored session.
+ def logout; end
+
+ # @return [Boolean] true when authenticated and ready to serve achievements
+ def authenticated?
+ false
+ end
+
+ # Register a callback invoked when authentication state changes.
+ # Fired with `status` (:ok or :error) and an optional `error` message.
+ #
+ # @yield [Symbol, String, nil] status, error (nil on success)
+ def on_auth_change(&block)
+ @auth_callbacks ||= []
+ @auth_callbacks << block
+ end
+
+ # -- Game lifecycle -------------------------------------------------------
+
+ # Called once per emulated frame. Evaluate achievement conditions and
+ # fire on_unlock callbacks for any newly earned achievements.
+ #
+ # @param core [Gemba::Core] the live mGBA core
+ def do_frame(core); end
+
+ # Called when a new ROM is loaded. Backend should reset per-game state
+ # and re-identify the game.
+ #
+ # @param core [Gemba::Core]
+ # @param rom_path [String, nil] path to the ROM file (used for MD5 hashing by network backends)
+ def load_game(core, rom_path = nil, md5 = nil); end
+
+ # Called when the ROM is unloaded / emulator stops.
+ def unload_game; end
+
+ # Called when a save state is loaded. Memory jumped to an arbitrary saved
+ # state; all achievements must restart their priming/waiting sequence.
+ def reset_runtime; end
+
+ # -- Rich Presence --------------------------------------------------------
+
+ # Current Rich Presence display string for the active game, or nil if
+ # not loaded / not supported. Updated by do_frame in real backends.
+ def rich_presence_message
+ nil
+ end
+
+ # Enable or disable Rich Presence evaluation for the current game.
+ # Pushed from AppController when per-game config is resolved at ROM load.
+ def rich_presence_enabled=(val); end
+
+ # Register a callback fired when the Rich Presence string changes.
+ # Called with the new message string.
+ #
+ # @yield [String] the new rich presence message
+ def on_rich_presence_changed(&block)
+ @rp_callbacks ||= []
+ @rp_callbacks << block
+ end
+
+ # -- Achievement list -----------------------------------------------------
+
+ # Register a callback invoked when an achievement is unlocked.
+ # Multiple callbacks can be registered; all are called in order.
+ #
+ # @yield [Achievement] the newly earned achievement
+ def on_unlock(&block)
+ @unlock_callbacks ||= []
+ @unlock_callbacks << block
+ end
+
+ # @return [Array] all achievements for the current game
+ def achievement_list
+ []
+ end
+
+ # @return [Integer] number of earned achievements
+ def earned_count
+ achievement_list.count(&:earned?)
+ end
+
+ # @return [Integer] total achievements for the current game
+ def total_count
+ achievement_list.size
+ end
+
+ # Verify the stored token is still valid. Result fires on_auth_change.
+ # Used by the "Verify Token" button in settings.
+ def token_test; end
+
+ # @return [Boolean] true if this backend is active / enabled
+ def enabled?
+ false
+ end
+
+ # Fetch already-earned achievements from the server and merge them into
+ # the local earned state so the UI reflects prior progress. No-op for
+ # backends that have no server. Fires on_achievements_changed on
+ # completion.
+ def sync_unlocks; end
+
+ # Fetch the full achievement list for a given ROM (by RomInfo) purely for
+ # display — does not affect live game state. Calls the block with
+ # Array on success, or nil on failure/unsupported.
+ # No-op (calls block with nil) for backends without a server.
+ #
+ # @param rom_info [RomInfo]
+ # @yield [Array, nil]
+ def fetch_for_display(rom_info:, &callback)
+ callback&.call(nil)
+ end
+
+ # Set whether unofficial (Flags=5) achievements are included in
+ # display syncs and live evaluation. No-op for backends that don't
+ # distinguish official vs unofficial.
+ def include_unofficial=(val); end
+
+ # Register a callback invoked when the achievement list changes in bulk
+ # (e.g. after a game loads or sync_unlocks completes). Use this to
+ # refresh list UI without wiring individual on_unlock callbacks.
+ #
+ # @yield called with no arguments
+ def on_achievements_changed(&block)
+ @achievements_changed_callbacks ||= []
+ @achievements_changed_callbacks << block
+ end
+
+ private
+
+ def fire_unlock(achievement)
+ @unlock_callbacks&.each { |cb| cb.call(achievement) }
+ end
+
+ def fire_auth_change(status, error = nil)
+ @auth_callbacks&.each { |cb| cb.call(status, error) }
+ end
+
+ def fire_achievements_changed
+ @achievements_changed_callbacks&.each(&:call)
+ end
+
+ def fire_rich_presence_changed(message)
+ @rp_callbacks&.each { |cb| cb.call(message) }
+ end
+ end
+ end
+end
diff --git a/lib/gemba/achievements/cache.rb b/lib/gemba/achievements/cache.rb
new file mode 100644
index 0000000..fd6a798
--- /dev/null
+++ b/lib/gemba/achievements/cache.rb
@@ -0,0 +1,70 @@
+# frozen_string_literal: true
+
+require 'json'
+require 'fileutils'
+require 'time'
+
+module Gemba
+ module Achievements
+ # Persistent per-ROM achievement cache.
+ #
+ # Stores the full achievement list (definitions + earned status) for each
+ # ROM as a JSON file under Config.achievements_cache_dir/.json.
+ # Written after every successful sync; read on demand by the window when
+ # a game is selected that isn't currently loaded in the emulator.
+ #
+ # Format:
+ # { "synced_at": "",
+ # "achievements": [ { "id":, "title":, "description":, "points":,
+ # "earned_at": "|null" }, … ] }
+ module Cache
+ def self.write(rom_id, achievements)
+ path = cache_path(rom_id)
+ FileUtils.mkdir_p(File.dirname(path))
+ data = {
+ 'synced_at' => Time.now.utc.iso8601,
+ 'achievements' => achievements.map { |a|
+ {
+ 'id' => a.id,
+ 'title' => a.title,
+ 'description' => a.description,
+ 'points' => a.points,
+ 'earned_at' => a.earned_at&.utc&.iso8601,
+ }
+ },
+ }
+ File.write(path, JSON.generate(data))
+ Gemba.log(:info) { "Achievements cache written: #{rom_id} (#{achievements.size} achievements)" }
+ rescue => e
+ Gemba.log(:warn) { "Achievements cache write failed for #{rom_id}: #{e.message}" }
+ end
+
+ # @return [Array, nil] cached list, or nil if no cache exists
+ def self.read(rom_id)
+ path = cache_path(rom_id)
+ return nil unless File.exist?(path)
+
+ data = JSON.parse(File.read(path))
+ list = (data['achievements'] || []).map do |a|
+ Achievement.new(
+ id: a['id'].to_s,
+ title: a['title'].to_s,
+ description: a['description'].to_s,
+ points: a['points'].to_i,
+ earned_at: a['earned_at'] ? Time.iso8601(a['earned_at']) : nil,
+ )
+ end
+ Gemba.log(:info) { "Achievements cache read: #{rom_id} (#{list.size} achievements, synced #{data['synced_at']})" }
+ list
+ rescue => e
+ Gemba.log(:warn) { "Achievements cache read failed for #{rom_id}: #{e.message}" }
+ nil
+ end
+
+ def self.cache_path(rom_id)
+ File.join(Config.achievements_cache_dir, "#{rom_id}.json")
+ end
+ private_class_method :cache_path
+ end
+ end
+end
diff --git a/lib/gemba/achievements/credentials_presenter.rb b/lib/gemba/achievements/credentials_presenter.rb
new file mode 100644
index 0000000..19be81e
--- /dev/null
+++ b/lib/gemba/achievements/credentials_presenter.rb
@@ -0,0 +1,142 @@
+# frozen_string_literal: true
+
+module Gemba
+ module Achievements
+ # Presents credential state for the RetroAchievements settings UI.
+ # Read-only view of state — never writes to disk or config.
+ #
+ # Initialized from persisted config. Mutated by:
+ # - UI interactions (checkbox, keystrokes) via setters
+ # - Backend auth results via :ra_auth_result bus events
+ #
+ # Emits :credentials_changed on the bus whenever state changes.
+ # SystemTab listens and calls apply_presenter_state to refresh widgets.
+ #
+ # Call dispose when discarding the presenter to remove the bus subscription.
+ class CredentialsPresenter
+ include BusEmitter
+
+ def initialize(config)
+ @enabled = config.ra_enabled?
+ @username = config.ra_username.to_s
+ @token = config.ra_token.to_s
+ @password = ''
+ @feedback_override = nil
+
+ @auth_handler = ->(status:, token: nil, message: nil) {
+ handle_auth_result(status, token, message)
+ }
+ Gemba.bus.on(:ra_auth_result, &@auth_handler)
+ end
+
+ # Remove bus subscription. Call before discarding the presenter.
+ def dispose
+ Gemba.bus.off(:ra_auth_result, @auth_handler)
+ end
+
+ # -- UI mutations ---------------------------------------------------------
+
+ def enabled=(val)
+ @enabled = val ? true : false
+ emit(:credentials_changed)
+ end
+
+ def username=(val)
+ @username = val.to_s
+ emit(:credentials_changed)
+ end
+
+ def password=(val)
+ @password = val.to_s
+ emit(:credentials_changed)
+ end
+
+ # Transient feedback (e.g. "Connection OK ✓") that disappears after a delay.
+ # Caller is responsible for scheduling clear_transient via Tk after.
+ def show_transient(key, **kwargs)
+ @feedback_override = { key: key, **kwargs }
+ emit(:credentials_changed)
+ end
+
+ def clear_transient
+ @feedback_override = nil
+ emit(:credentials_changed)
+ end
+
+ # -- Read-only accessors --------------------------------------------------
+
+ attr_reader :username, :password, :token
+ def enabled? = @enabled
+ def logged_in? = !@token.strip.empty?
+
+ # -- Widget state queries -------------------------------------------------
+
+ def fields_state
+ return :disabled unless @enabled
+ return :readonly if logged_in?
+ :normal
+ end
+
+ def login_button_state
+ return :disabled unless @enabled
+ return :disabled if logged_in?
+ fields_filled? ? :normal : :disabled
+ end
+
+ def verify_button_state
+ (@enabled && logged_in?) ? :normal : :disabled
+ end
+
+ def logout_button_state
+ (@enabled && logged_in?) ? :normal : :disabled
+ end
+
+ def reset_button_state
+ (@enabled && logged_in?) ? :normal : :disabled
+ end
+
+ # Feedback descriptor. key drives locale lookup in SystemTab.
+ # :empty → blank label
+ # :not_logged_in → "Not logged in"
+ # :logged_in_as → "Logged in as {username}" (also carries username:)
+ # :test_ok → "Connection OK ✓"
+ # :error → error text (carries message:)
+ def feedback
+ return @feedback_override if @feedback_override
+ return { key: :empty } unless @enabled
+ return { key: :logged_in_as, username: @username } if logged_in?
+ { key: :not_logged_in }
+ end
+
+ private
+
+ def handle_auth_result(status, token, message)
+ case status
+ when :ok
+ if token
+ # Login success — store token, clear password
+ @token = token.to_s
+ @password = ''
+ @feedback_override = nil
+ else
+ # Ping success — show transient then let SystemTab schedule clear
+ @feedback_override = { key: :test_ok }
+ emit(:ra_token_test_ok)
+ end
+ when :error
+ @feedback_override = { key: :error, message: message.to_s }
+ when :logout
+ @token = ''
+ @password = ''
+ @feedback_override = nil
+ # username intentionally kept so user can re-enter password quickly
+ end
+ emit(:credentials_changed)
+ end
+
+ def fields_filled?
+ !@username.strip.empty? && !@password.strip.empty?
+ end
+ end
+ end
+end
diff --git a/lib/gemba/achievements/fake_backend.rb b/lib/gemba/achievements/fake_backend.rb
new file mode 100644
index 0000000..449cd5a
--- /dev/null
+++ b/lib/gemba/achievements/fake_backend.rb
@@ -0,0 +1,205 @@
+# frozen_string_literal: true
+
+module Gemba
+ module Achievements
+ # Pure-Ruby achievement backend for development and testing.
+ #
+ # Achievements are defined programmatically with a condition block
+ # that receives a memory-read helper. No HTTP, no hashing, no server.
+ #
+ # Authentication behaviour:
+ # - By default any non-empty credentials succeed immediately.
+ # - Pass `valid_username:` and `valid_token:` to restrict: only that
+ # exact pair succeeds; anything else fails. Useful in tests that
+ # verify the "bad credentials" error path.
+ #
+ # Used in two ways:
+ # 1. Automated tests — add achievements, step frames, assert unlocks
+ # 2. Integration dev — iterate on UI (toasts, list) without rcheevos
+ #
+ # @example Basic usage
+ # backend = FakeBackend.new
+ # backend.add_achievement(id: 'btn_b', title: 'Press B',
+ # description: 'Press the B button',
+ # points: 5) do |mem|
+ # mem.call(0x02000000) == 0x42
+ # end
+ # backend.on_unlock { |ach| puts "Unlocked: #{ach.title}" }
+ # backend.do_frame(core) # call each frame
+ #
+ # @example Restricted credentials (for testing failure path)
+ # backend = FakeBackend.new(valid_username: 'alice', valid_token: 'secret')
+ # backend.login(username: 'bob', token: 'wrong') # → fires :error
+ # backend.login(username: 'alice', token: 'secret') # → fires :ok
+ class FakeBackend
+ include Backend
+
+ # @param valid_username [String, nil] when set, only this username passes
+ # @param valid_token [String, nil] when set, only this token passes
+ def initialize(valid_username: nil, valid_token: nil)
+ @definitions = {} # id → { achievement:, condition: }
+ @earned = {} # id → Achievement (earned copy)
+ @prev_state = {} # id → bool (condition result last frame)
+ @valid_username = valid_username
+ @valid_token = valid_token
+ @authenticated = false
+ @rich_presence_message = nil
+ @rich_presence_block = nil
+ end
+
+ # -- Authentication -------------------------------------------------------
+
+ # Resolves immediately. Succeeds if credentials are non-empty and match
+ # the configured valid pair (or any non-empty creds if none configured).
+ # On success fires on_auth_change(:ok, fake_token) where fake_token is
+ # a deterministic stand-in so callers can exercise the token-persist path.
+ def login_with_password(username:, password:)
+ ok = !username.to_s.empty? && !password.to_s.empty? &&
+ (@valid_username.nil? || username == @valid_username) &&
+ (@valid_token.nil? || password == @valid_token)
+
+ if ok
+ @authenticated = true
+ fire_auth_change(:ok, "fake_token_for_#{username}")
+ else
+ @authenticated = false
+ fire_auth_change(:error, 'Invalid credentials (fake backend)')
+ end
+ end
+
+ def login_with_token(username:, token:)
+ ok = !username.to_s.empty? && !token.to_s.empty? &&
+ (@valid_username.nil? || username == @valid_username) &&
+ (@valid_token.nil? || token == @valid_token)
+
+ if ok
+ @authenticated = true
+ fire_auth_change(:ok, token)
+ else
+ @authenticated = false
+ fire_auth_change(:error, 'Invalid credentials (fake backend)')
+ end
+ end
+
+ def logout
+ @authenticated = false
+ fire_auth_change(:logout)
+ end
+
+ def token_test
+ if @authenticated
+ fire_auth_change(:ok, nil)
+ else
+ fire_auth_change(:error, 'Not authenticated (fake backend)')
+ end
+ end
+
+ def authenticated?
+ @authenticated
+ end
+
+ # Define an achievement. The block receives a read_mem callable
+ # and must return truthy when the unlock condition is met.
+ #
+ # @param id [String] unique identifier
+ # @param title [String]
+ # @param description [String]
+ # @param points [Integer]
+ # @yield [read_mem] called each frame; read_mem is ->(address) { Integer }
+ # @yieldreturn [Boolean] true when condition is satisfied
+ def add_achievement(id:, title:, description:, points: 0, &condition)
+ raise ArgumentError, "condition block required" unless condition
+ ach = Achievement.new(id: id, title: title,
+ description: description,
+ points: points, earned_at: nil)
+ @definitions[id] = { achievement: ach, condition: condition }
+ @prev_state[id] = false
+ end
+
+ # Evaluate all unearned achievements against current memory state.
+ # Fires on_unlock callbacks for newly met conditions (rising edge).
+ # Also evaluates the rich presence block if one is set.
+ #
+ # @param core [Gemba::Core]
+ def do_frame(core)
+ read_mem = ->(addr) { core.bus_read8(addr) }
+ @definitions.each do |id, defn|
+ next if @earned.key?(id)
+
+ current = defn[:condition].call(read_mem) ? true : false
+ if current && !@prev_state[id]
+ earned = defn[:achievement].earn
+ @earned[id] = earned
+ fire_unlock(earned)
+ end
+ @prev_state[id] = current
+ end
+
+ @rich_presence_message = @rich_presence_block.call if @rich_presence_block
+ end
+
+ def load_game(_core, rom_path = nil, md5 = nil)
+ @rich_presence_message = nil
+ @rich_presence_block = nil
+ reset_earned
+ end
+
+ def unload_game
+ reset_earned
+ end
+
+ # @return [Array] all achievements, earned ones updated
+ def achievement_list
+ @definitions.map do |id, defn|
+ @earned[id] || defn[:achievement]
+ end
+ end
+
+ def enabled?
+ true
+ end
+
+ # Clear earned state (for test reuse).
+ def reset_earned
+ @earned = {}
+ @prev_state = @prev_state.transform_values { false }
+ end
+
+ # Set a Rich Presence message for testing.
+ #
+ # Pass a static string to return a fixed message:
+ # backend.set_rich_presence("Playing World 1-1")
+ #
+ # Pass a block for dynamic messages evaluated each do_frame:
+ # backend.set_rich_presence { "Frame #{frame_count}" }
+ #
+ # Call with no arguments to clear.
+ def set_rich_presence(string = nil, &block)
+ @rich_presence_block = block || (string ? -> { string } : nil)
+ @rich_presence_message = string unless block
+ end
+
+ def rich_presence_message
+ @rich_presence_message
+ end
+
+ # Configure what fetch_for_display returns. Pass an Array (returned for
+ # every rom_info) or a block that receives rom_info and returns an Array
+ # or nil. Without calling this, fetch_for_display always calls back with nil.
+ #
+ # @example Always return a fixed list
+ # backend.stub_fetch_for_display([ach1, ach2])
+ #
+ # @example Vary by rom_info
+ # backend.stub_fetch_for_display { |rom_info| rom_info.rom_id == 'X' ? [ach1] : [] }
+ def stub_fetch_for_display(list = nil, &block)
+ @fetch_display_stub = block || ->(_) { list }
+ end
+
+ def fetch_for_display(rom_info:, &callback)
+ result = @fetch_display_stub ? @fetch_display_stub.call(rom_info) : nil
+ callback&.call(result)
+ end
+ end
+ end
+end
diff --git a/lib/gemba/achievements/null_backend.rb b/lib/gemba/achievements/null_backend.rb
new file mode 100644
index 0000000..6a5a2e8
--- /dev/null
+++ b/lib/gemba/achievements/null_backend.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+module Gemba
+ module Achievements
+ # No-op backend used when RetroAchievements is disabled.
+ # All methods are inherited no-ops from Backend.
+ class NullBackend
+ include Backend
+ end
+ end
+end
diff --git a/lib/gemba/achievements/offline_backend.rb b/lib/gemba/achievements/offline_backend.rb
new file mode 100644
index 0000000..e27ebaa
--- /dev/null
+++ b/lib/gemba/achievements/offline_backend.rb
@@ -0,0 +1,168 @@
+# frozen_string_literal: true
+
+module Gemba
+ module Achievements
+ # Achievement backend backed by a local database — no HTTP, no rcheevos.
+ # Auth is a no-op: always authenticated.
+ #
+ # The DB maps ROM checksum → array of achievement definition Hashes:
+ # {
+ # id:, title:, description:, points:,
+ # trigger: :on_load | :memory,
+ # condition: ->(mem) { bool } # :memory trigger only
+ # }
+ #
+ # :on_load achievements fire immediately in load_game.
+ # :memory achievements are evaluated each frame in do_frame (rising edge).
+ #
+ # Long-term this DB can be populated by RcheevosBackend after a successful
+ # server sync, enabling offline play. For now it ships with a small
+ # built-in set (one achievement for the GEMBATEST fixture ROM).
+ #
+ # Tests assign this backend directly:
+ # frame.achievement_backend = Achievements::OfflineBackend.new
+ class OfflineBackend
+ include Backend
+
+ # Built-in achievement definitions, keyed by ROM checksum.
+ BUILTIN_DB = {
+ # test/fixtures/test.gba — checksum 3369266971, title "GEMBATEST"
+ 3369266971 => [
+ {
+ id: 'gembatest_loaded',
+ title: 'Ready to Play',
+ description: 'Loaded the Gemba test ROM',
+ points: 1,
+ trigger: :on_load,
+ },
+ ],
+ }.freeze
+
+ # @param db [Hash, nil] fully replaces BUILTIN_DB when provided.
+ # Pass BUILTIN_DB.merge(extras) explicitly if you want both.
+ def initialize(db: nil)
+ @db = db || BUILTIN_DB
+ @achievements = []
+ @earned = {}
+ @prev_state = {}
+ @rp_db = {} # checksum → String
+ @rich_presence_message = nil
+ end
+
+ # -- Authentication (no-op — offline backend is always authenticated) ------
+
+ def login_with_password(username:, password:)
+ return fire_auth_change(:error, 'Username and password required') if username.to_s.strip.empty? || password.to_s.strip.empty?
+ # Offline backend accepts any credentials — real auth happens via rcheevos
+ fire_auth_change(:ok, "offline_token_#{username.strip}")
+ end
+
+ def login_with_token(username:, token:)
+ return if token.to_s.strip.empty?
+ fire_auth_change(:ok, nil)
+ end
+
+ def logout
+ fire_auth_change(:logout)
+ end
+
+ def authenticated? = true
+
+ def token_test
+ fire_auth_change(:ok, nil)
+ end
+
+ # -- Game lifecycle -------------------------------------------------------
+
+ def load_game(core, rom_path = nil, md5 = nil)
+ @achievements = []
+ @earned = {}
+ @prev_state = {}
+ @rich_presence_message = @rp_db[core.checksum]
+
+ (@db[core.checksum] || []).each do |defn|
+ ach = Achievement.new(
+ id: defn[:id],
+ title: defn[:title],
+ description: defn[:description],
+ points: defn[:points],
+ earned_at: nil,
+ )
+ @achievements << ach
+ @prev_state[ach.id] = false
+
+ if defn[:trigger] == :on_load
+ earned = ach.earn
+ @earned[ach.id] = earned
+ fire_unlock(earned)
+ end
+ end
+ end
+
+ def unload_game
+ @achievements = []
+ @earned = {}
+ @prev_state = {}
+ @rich_presence_message = nil
+ end
+
+ # -- Per-frame evaluation (memory-condition achievements) -----------------
+
+ def do_frame(core)
+ (@db[core.checksum] || []).each do |defn|
+ next unless defn[:trigger] == :memory
+ next if @earned.key?(defn[:id])
+
+ condition = defn[:condition]
+ next unless condition
+
+ read_mem = ->(addr) { core.bus_read8(addr) }
+ current = condition.call(read_mem) ? true : false
+
+ if current && !@prev_state[defn[:id]]
+ ach = @achievements.find { |a| a.id == defn[:id] }
+ if ach
+ earned = ach.earn
+ @earned[ach.id] = earned
+ fire_unlock(earned)
+ end
+ end
+
+ @prev_state[defn[:id]] = current
+ end
+ end
+
+ # -- Achievement list -----------------------------------------------------
+
+ def achievement_list
+ @achievements.map { |a| @earned[a.id] || a }
+ end
+
+ def enabled? = true
+
+ def rich_presence_message
+ @rich_presence_message
+ end
+
+ # -- DB management --------------------------------------------------------
+
+ # Merge achievement definitions for a ROM into the in-memory DB.
+ # Intended for use by RcheevosBackend to seed the offline cache.
+ #
+ # @param checksum [Integer]
+ # @param defs [Array]
+ def store(checksum, defs)
+ @db = @db.merge(checksum => defs)
+ end
+
+ # Store a static Rich Presence message for a ROM.
+ # Intended for use by RcheevosBackend when caching patch data offline.
+ #
+ # @param checksum [Integer]
+ # @param message [String]
+ def store_rich_presence(checksum, message)
+ @rp_db = @rp_db.merge(checksum => message.to_s)
+ end
+ end
+ end
+end
diff --git a/lib/gemba/achievements/retro_achievements/backend.rb b/lib/gemba/achievements/retro_achievements/backend.rb
new file mode 100644
index 0000000..0b0ee83
--- /dev/null
+++ b/lib/gemba/achievements/retro_achievements/backend.rb
@@ -0,0 +1,453 @@
+# frozen_string_literal: true
+
+require "net/http"
+require "json"
+require "digest"
+
+module Gemba
+ module Achievements
+ module RetroAchievements
+ # Achievement backend that talks to retroachievements.org.
+ #
+ # All requests are HTTP POSTs to /dorequest.php. The 'r' parameter tells
+ # the server what you want — it's RA's own naming, not ours:
+ #
+ # r=login2 authenticate (password or token)
+ # r=gameid "here's a ROM MD5 hash — what game ID is it?"
+ # r=patch "give me the achievement definitions for this game"
+ # (called 'patch' because RA's original concept was that
+ # achievements are a 'patch' bolted on top of a ROM —
+ # extra behaviour injected into the game. the name stuck.)
+ # r=unlocks "which of these achievements has the player already earned?"
+ # r=awardachievement "the player just earned this achievement, record it"
+ #
+ # Most HTTP is done off the main thread via Teek::BackgroundWork (thread mode).
+ # The ping heartbeat uses PING_BG_MODE which selects ractor mode on Ruby 4+.
+ #
+ # Authentication flow:
+ # login_with_password → r=login2 + password → stores token, fires :ok
+ # login_with_token → r=login2 + token → verifies token, fires :ok/:error
+ # token_test → same as login_with_token using stored creds
+ #
+ # Game load flow (all requests are chained — each fires when the previous
+ # HTTP response comes back):
+ #
+ # load_game(core, rom_path)
+ # → MD5 hash the ROM file
+ # → r=gameid (MD5) — server tells us the RA game ID
+ # → r=patch (game ID) — server sends achievement definitions
+ # → r=unlocks (game ID) — server says which the player already has
+ # → activate each un-earned achievement in the C runtime
+ # (parse conditions, load into hash table so do_frame checks them)
+ #
+ # Achievements are not loaded into the runtime until AFTER the unlocks
+ # response arrives. This means @achievements stays empty during the
+ # network round-trips, and do_frame's early-return guard prevents any
+ # evaluation before we know what the player has already earned.
+ class Backend
+ include Achievements::Backend
+
+ RA_HOST = "retroachievements.org"
+ RA_PATH = "/dorequest.php"
+ PING_BG_MODE = (RUBY_VERSION >= "4.0" ? :ractor : :thread).freeze
+
+ # Frames between Rich Presence evaluations (~4 s at 60 fps).
+ RP_EVAL_INTERVAL = 240
+ # Seconds between session ping heartbeats.
+ PING_INTERVAL_SEC = 120
+
+ # Default requester: delegates to Teek::BackgroundWork.
+ # Extracted so tests can inject a synchronous fake with the same interface.
+ DEFAULT_REQUESTER = lambda do |app, params, mode: :thread, **opts, &block|
+ Teek::BackgroundWork.new(app, params, mode: mode, **opts, &block)
+ end.freeze
+
+ def initialize(app:, runtime: nil, requester: nil)
+ @app = app
+ @requester = requester || DEFAULT_REQUESTER
+ @username = nil
+ @token = nil
+ @game_id = nil
+ @achievements = []
+ @earned = {}
+ @authenticated = false
+ @include_unofficial = false
+ @rich_presence_enabled = false
+ @rich_presence_message = nil
+ @rp_eval_frame = 0
+ @ping_last_at = nil
+ @ra_runtime = runtime || Gemba::RARuntime.new
+ end
+
+ attr_writer :include_unofficial
+ attr_writer :rich_presence_enabled
+ attr_reader :rich_presence_message
+
+ # -- Authentication -------------------------------------------------------
+
+ def login_with_password(username:, password:)
+ ra_request(r: "login2", u: username, p: password) do |json, ok|
+ if ok && json&.dig("Success")
+ @username = username
+ @token = json["Token"]
+ @authenticated = true
+ Gemba.log(:info) { "RA: authenticated as #{username}" }
+ fire_auth_change(:ok, @token)
+ else
+ msg = json&.dig("Error") || "Login failed"
+ Gemba.log(:warn) { "RA: authentication failed for #{username}: #{msg}" }
+ fire_auth_change(:error, msg)
+ end
+ end
+ end
+
+ def login_with_token(username:, token:)
+ @username = username
+ @token = token
+ ra_request(r: "login2", u: username, t: token) do |json, ok|
+ if ok && json&.dig("Success")
+ @authenticated = true
+ Gemba.log(:info) { "RA: token verified for #{username}" }
+ fire_auth_change(:ok, nil)
+ else
+ @authenticated = false
+ msg = json&.dig("Error") || "Token invalid"
+ Gemba.log(:warn) { "RA: token verification failed for #{username}: #{msg}" }
+ fire_auth_change(:error, msg)
+ end
+ end
+ end
+
+ def token_test
+ ra_request(r: "login2", u: @username, t: @token) do |json, ok|
+ if ok && json&.dig("Success")
+ fire_auth_change(:ok, nil)
+ else
+ @authenticated = false
+ fire_auth_change(:error, json&.dig("Error") || "Token invalid")
+ end
+ end
+ end
+
+ def logout
+ @username = nil
+ @token = nil
+ @authenticated = false
+ @game_id = nil
+ @achievements = []
+ @earned = {}
+ @ra_runtime.clear
+ fire_auth_change(:logout)
+ end
+
+ def authenticated? = @authenticated
+ def enabled? = true
+
+ # -- Game lifecycle -------------------------------------------------------
+
+ def load_game(core, rom_path = nil, md5 = nil)
+ return unless @authenticated
+ return unless rom_path && File.exist?(rom_path.to_s)
+
+ @achievements = []
+ @earned = {}
+ @game_id = nil
+ @rich_presence_message = nil
+ @rp_eval_frame = 0
+ @ping_last_at = nil
+
+ # Use pre-computed digest if available (computed at ROM load time and
+ # cached in rom_library.json); fall back to computing it here for entries
+ # that pre-date MD5 storage.
+ md5 ||= Digest::MD5.file(rom_path).hexdigest
+
+ ra_request(r: "gameid", m: md5) do |json, ok|
+ next unless ok
+ game_id = json&.dig("GameID")&.to_i
+ next if !game_id || game_id == 0
+
+ @game_id = game_id
+ fetch_patch_data(game_id)
+ end
+ end
+
+ # Called after a save state is loaded. Memory just jumped to an arbitrary
+ # saved state, so every achievement must go back through the priming and
+ # waiting startup sequence — otherwise achievements that were already active
+ # fire instantly if the saved memory happens to satisfy their conditions.
+ def reset_runtime
+ @ra_runtime.reset_all
+ end
+
+ def unload_game
+ @game_id = nil
+ @achievements = []
+ @earned = {}
+ @rich_presence_message = nil
+ @rp_eval_frame = 0
+ @ping_last_at = nil
+ @ra_runtime.clear
+ fire_achievements_changed
+ end
+
+ def sync_unlocks
+ return unless @authenticated
+ Gemba.bus.emit(:ra_sync_started)
+ unless @game_id
+ Gemba.bus.emit(:ra_sync_done, ok: false, reason: :no_game)
+ return
+ end
+ @earned = {}
+ @achievements = []
+ @ra_runtime.reset_all
+ fetch_patch_data(@game_id, emit_sync_done: true)
+ end
+
+ def do_frame(core)
+ return if @achievements.empty?
+
+ triggered_ids = @ra_runtime.do_frame(core)
+ triggered_ids.each do |id|
+ next if @earned.key?(id)
+ ach = @achievements.find { |a| a.id == id }
+ next unless ach
+
+ earned = ach.earn
+ @earned[id] = earned
+ fire_unlock(earned)
+ submit_unlock(id)
+ end
+
+ return unless @rich_presence_enabled
+
+ @rp_eval_frame = (@rp_eval_frame + 1) % RP_EVAL_INTERVAL
+ return unless @rp_eval_frame == 0
+
+ msg = @ra_runtime.get_richpresence(core)
+ if msg && msg != @rich_presence_message
+ @rich_presence_message = msg
+ fire_rich_presence_changed(msg)
+ end
+
+ now = Time.now
+ if @game_id && @authenticated && (@ping_last_at.nil? || now - @ping_last_at >= PING_INTERVAL_SEC)
+ @ping_last_at = now
+ ping_game_session
+ end
+ end
+
+ # -- Achievement list -----------------------------------------------------
+
+ def achievement_list
+ @achievements.map { |a| @earned[a.id] || a }
+ end
+
+ # Fetch the full achievement list for any ROM by its RomInfo, purely for
+ # display. Does not touch the live game state (@achievements, @earned,
+ # @ra_runtime). Calls the block on the main thread with Array
+ # on success or nil on failure.
+ #
+ # Request chain (all POST to /dorequest.php):
+ # r=gameid m=
+ # r=patch u= t= g=
+ # r=unlocks u= t= g= h=0
+ def fetch_for_display(rom_info:, &callback)
+ return unless @authenticated && rom_info.md5
+
+ Gemba.log(:info) { "RA fetch_for_display: gameid lookup md5=#{rom_info.md5[0, 8]}… (#{rom_info.title})" }
+
+ ra_request(r: "gameid", m: rom_info.md5) do |json, ok|
+ game_id = ok ? json&.dig("GameID")&.to_i : nil
+ Gemba.log(game_id&.positive? ? :info : :warn) {
+ "RA fetch_for_display: gameid → #{game_id.inspect} ok=#{ok}"
+ }
+ unless game_id && game_id > 0
+ callback.call(nil)
+ next
+ end
+
+ ra_request(r: "patch", u: @username, t: @token, g: game_id) do |patch_json, patch_ok|
+ Gemba.log(patch_ok ? :info : :warn) {
+ "RA fetch_for_display: patch g=#{game_id} ok=#{patch_ok} achievements=#{patch_json&.dig("PatchData", "Achievements")&.size.inspect}"
+ }
+ unless patch_ok && patch_json
+ callback.call(nil)
+ next
+ end
+
+ achievements = (patch_json.dig("PatchData", "Achievements") || []).filter_map do |a|
+ next if a["MemAddr"].to_s.empty?
+ next if a["Flags"].to_i != 3 && !(a["Flags"].to_i == 5 && @include_unofficial)
+ next if a["ID"].to_i > 100_000_000 # skip RA-injected system messages
+ Achievement.new(
+ id: a["ID"].to_s,
+ title: a["Title"].to_s,
+ description: a["Description"].to_s,
+ points: a["Points"].to_i,
+ earned_at: nil,
+ )
+ end
+
+ ra_request(r: "unlocks", u: @username, t: @token, g: game_id, h: 0) do |ul_json, ul_ok|
+ earned_ids = ul_ok && ul_json&.dig("Success") ?
+ (ul_json.dig("UserUnlocks") || []).map(&:to_s) : []
+ Gemba.log(ul_ok ? :info : :warn) {
+ "RA fetch_for_display: unlocks g=#{game_id} ok=#{ul_ok} earned=#{earned_ids.size} total=#{achievements.size}"
+ }
+ result = achievements.map { |a| earned_ids.include?(a.id) ? a.earn : a }
+ callback.call(result)
+ end
+ end
+ end
+ end
+
+ private
+
+ # Fetch patch data (achievement definitions). Does NOT activate the runtime
+ # or populate @achievements — that happens only after unlocks are known,
+ # in activate_from_patch. This ensures do_frame can never evaluate and
+ # award achievements during the window between patch data and unlocks.
+ def fetch_patch_data(game_id, emit_sync_done: false)
+ ra_request(r: "patch", u: @username, t: @token, g: game_id) do |json, ok|
+ unless ok && json
+ Gemba.log(:warn) { "RA: failed to fetch patch data for game #{game_id}" }
+ Gemba.bus.emit(:ra_sync_done, ok: false) if emit_sync_done
+ next
+ end
+
+ rp_script = json.dig("PatchData", "RichPresencePatch").to_s
+
+ raw = (json.dig("PatchData", "Achievements") || []).select do |a|
+ !a["MemAddr"].to_s.empty? &&
+ (a["Flags"].to_i == 3 || (a["Flags"].to_i == 5 && @include_unofficial)) &&
+ a["ID"].to_i <= 100_000_000
+ end
+
+ fetch_unlocks(game_id, raw_ach_data: raw, rp_script: rp_script, emit_sync_done: emit_sync_done)
+ end
+ end
+
+ # Fetch already-earned achievement IDs, then activate the runtime with
+ # all achievements, immediately deactivating the already-earned ones.
+ # Only after this step is @achievements populated — so do_frame's
+ # `return if @achievements.empty?` guard covers the entire window.
+ def fetch_unlocks(game_id, raw_ach_data: nil, rp_script: nil, emit_sync_done: false)
+ ra_request(r: "unlocks", u: @username, t: @token, g: game_id, h: 0) do |json, ok|
+ unless ok && json&.dig("Success")
+ Gemba.log(:warn) { "RA: failed to fetch unlocks for game #{game_id}" }
+ Gemba.bus.emit(:ra_sync_done, ok: false) if emit_sync_done
+ next
+ end
+
+ earned_ids = (json.dig("UserUnlocks") || []).map(&:to_s)
+
+ if raw_ach_data
+ # Fresh load / re-sync: activate runtime now that we know earned set.
+ @ra_runtime.clear
+ @achievements = raw_ach_data.filter_map do |a|
+ id = a["ID"].to_s
+ memaddr = a["MemAddr"].to_s
+ begin
+ @ra_runtime.activate(id, memaddr)
+ rescue ArgumentError => e
+ Gemba.log(:warn) { "RA: skipping achievement #{id} — #{e.message}" }
+ next
+ end
+ @ra_runtime.deactivate(id) if earned_ids.include?(id)
+ Achievement.new(
+ id: id,
+ title: a["Title"].to_s,
+ description: a["Description"].to_s,
+ points: a["Points"].to_i,
+ earned_at: nil,
+ )
+ end
+ Gemba.log(:info) { "RA: loaded #{@achievements.size} achievements for game #{game_id}" }
+
+ if rp_script && !rp_script.empty?
+ ok = @ra_runtime.activate_richpresence(rp_script)
+ Gemba.log(ok ? :info : :warn) { "RA: rich presence script #{ok ? "activated" : "failed to parse"} for game #{game_id}" }
+ end
+ end
+
+ newly_marked = 0
+ earned_ids.each do |id|
+ next if @earned.key?(id)
+ ach = @achievements.find { |a| a.id == id }
+ next unless ach
+ earned = ach.earn
+ @earned[id] = earned
+ newly_marked += 1
+ end
+
+ Gemba.log(:info) { "RA: synced #{newly_marked} pre-earned achievements for game #{game_id}" } if newly_marked > 0
+ fire_achievements_changed
+ Gemba.bus.emit(:ra_sync_done, ok: true) if emit_sync_done
+ end
+ end
+
+ # POST r=ping heartbeat — keeps the RA session alive and records
+ # the current Rich Presence string on the server.
+ # Runs via PingWorker which is Ractor-safe on Ruby 4+.
+ def ping_game_session
+ data = {
+ host: RA_HOST,
+ path: RA_PATH,
+ params: {
+ "r" => "ping",
+ "u" => @username,
+ "t" => @token,
+ "g" => @game_id.to_s,
+ "m" => @rich_presence_message.to_s,
+ },
+ }
+ data = Ractor.make_shareable(data) if PING_BG_MODE == :ractor
+ game_id = @game_id
+ @requester.call(@app, data, mode: PING_BG_MODE, worker: PingWorker)
+ .on_progress { |ok| Gemba.log(ok ? :info : :warn) { "RA: ping g=#{game_id} ok=#{ok}" } }
+ end
+
+ # Best-effort unlock submission — fires and forgets, result only logged.
+ def submit_unlock(achievement_id, hardcore: false)
+ ra_request(r: "awardachievement", u: @username, t: @token,
+ a: achievement_id, h: hardcore ? 1 : 0) do |json, ok|
+ if ok && json&.dig("Success")
+ Gemba.log(:info) { "RA: submitted unlock for achievement #{achievement_id}" }
+ else
+ Gemba.log(:warn) { "RA: unlock submission failed for #{achievement_id}: #{json&.dig("Error")}" }
+ end
+ end
+ end
+
+ # POST to dorequest.php via @requester (BackgroundWork in production,
+ # a synchronous fake in tests). Calls on_done with (json_or_nil, ok_bool).
+ def ra_request(params, &on_done)
+ @requester.call(@app, params, mode: :thread) do |t, req_params|
+ uri = URI::HTTPS.build(host: RA_HOST, path: RA_PATH)
+ http = Net::HTTP.new(uri.host, uri.port)
+ http.use_ssl = true
+ http.read_timeout = 15
+ req = Net::HTTP::Post.new(uri.path)
+ safe = req_params.reject { |k, _| [:t, :p, "t", "p"].include?(k) }
+ Gemba.log(:info) { "RA request: r=#{params[:r]} #{safe.map { |k, v| "#{k}=#{v}" }.join(" ")}" }
+ req.set_form_data(req_params.transform_keys(&:to_s).transform_values(&:to_s))
+ resp = http.request(req)
+ if resp.is_a?(Net::HTTPSuccess)
+ body = resp.body
+ Gemba.log(:info) { "RA response: r=#{params[:r]} HTTP #{resp.code} body=#{body.length}b" }
+ t.yield([JSON.parse(body), true])
+ else
+ Gemba.log(:warn) { "RA response: r=#{params[:r]} HTTP #{resp.code} #{resp.message} body=#{resp.body.to_s[0, 200]}" }
+ t.yield([nil, false])
+ end
+ rescue => e
+ Gemba.log(:warn) { "RA: request error (#{params[:r]}): #{e.class} #{e.message}" }
+ t.yield([nil, false])
+ end.on_progress do |result|
+ on_done.call(*result) if on_done && result
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gemba/achievements/retro_achievements/cli_sync_requester.rb b/lib/gemba/achievements/retro_achievements/cli_sync_requester.rb
new file mode 100644
index 0000000..81207ea
--- /dev/null
+++ b/lib/gemba/achievements/retro_achievements/cli_sync_requester.rb
@@ -0,0 +1,64 @@
+# frozen_string_literal: true
+
+require "net/http"
+require "json"
+
+module Gemba
+ module Achievements
+ module RetroAchievements
+ # Synchronous HTTP requester for CLI use.
+ #
+ # Implements the same interface as FakeRequester and the DEFAULT_REQUESTER
+ # lambda in Backend — call() returns a Result that fires on_progress
+ # synchronously — but makes a real blocking Net::HTTP POST instead of
+ # delegating to Teek::BackgroundWork.
+ #
+ # This means CLI commands get their result back in-line with no event loop.
+ class CliSyncRequester
+ # Mirrors FakeRequester::Result so the calling code (ra_request) is
+ # identical regardless of whether it's running in CLI or GUI mode.
+ class Result
+ def initialize(value)
+ @value = value
+ end
+
+ def on_progress(&block)
+ block.call(@value)
+ self
+ end
+
+ def on_done(&block)
+ self
+ end
+ end
+
+ # Called by ra_request with the same signature as the DEFAULT_REQUESTER
+ # lambda. Ignores the BackgroundWork block (which uses t.yield / Ractor
+ # protocol) and performs a direct synchronous HTTP POST instead.
+ def call(_app, params, mode: nil, **_opts, &_block)
+ Result.new(perform(params))
+ end
+
+ private
+
+ def perform(params)
+ uri = URI::HTTPS.build(host: Backend::RA_HOST, path: Backend::RA_PATH)
+ http = Net::HTTP.new(uri.host, uri.port)
+ http.use_ssl = true
+ http.read_timeout = 15
+ req = Net::HTTP::Post.new(uri.path)
+ req.set_form_data(params.transform_keys(&:to_s).transform_values(&:to_s))
+ resp = http.request(req)
+ if resp.is_a?(Net::HTTPSuccess)
+ [JSON.parse(resp.body), true]
+ else
+ [nil, false]
+ end
+ rescue => e
+ $stderr.puts "RA request error (#{params[:r]}): #{e.class} #{e.message}"
+ [nil, false]
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gemba/achievements/retro_achievements/ping_worker.rb b/lib/gemba/achievements/retro_achievements/ping_worker.rb
new file mode 100644
index 0000000..c734bdb
--- /dev/null
+++ b/lib/gemba/achievements/retro_achievements/ping_worker.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+module Gemba
+ module Achievements
+ module RetroAchievements
+ # Background worker for the RA session ping heartbeat.
+ #
+ # Defined as a named class (not a closure) so it is Ractor-safe on
+ # Ruby 4+. All state is passed through the data hash; no captured
+ # variables.
+ class PingWorker
+ def call(t, data)
+ require "net/http"
+ uri = URI::HTTPS.build(host: data[:host], path: data[:path])
+ http = Net::HTTP.new(uri.host, uri.port)
+ http.use_ssl = true
+ http.read_timeout = 10
+ req = Net::HTTP::Post.new(uri.path)
+ req.set_form_data(data[:params])
+ t.yield(http.request(req).is_a?(Net::HTTPSuccess))
+ rescue
+ t.yield(false)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gemba/achievements_window.rb b/lib/gemba/achievements_window.rb
new file mode 100644
index 0000000..5e37a4a
--- /dev/null
+++ b/lib/gemba/achievements_window.rb
@@ -0,0 +1,556 @@
+# frozen_string_literal: true
+
+module Gemba
+ # Displays achievements for the currently loaded GBA game.
+ #
+ # Non-modal window accessible from View > Achievements. Shows a treeview
+ # of all achievements with name, points, and earned date. A Sync button
+ # pulls the latest earned state from the RA server. Only the currently
+ # loaded game has live data; other GBA games in the library show empty.
+ class AchievementsWindow
+ include ChildWindow
+ include Locale::Translatable
+
+ TOP = '.gemba_achievements'
+
+ VAR_UNOFFICIAL = '::gemba_ach_unofficial'
+
+ def initialize(app:, rom_library:, config:, callbacks: {})
+ @app = app
+ @rom_library = rom_library
+ @config = config
+ @callbacks = callbacks
+ @built = false
+ @backend = nil
+ @current_rom_id = nil
+ @game_entries = []
+ @tree_items = []
+ @item_descriptions = {}
+ @tip_item = nil
+ @tip_timer = nil
+ @current_list = []
+ @sort_col = nil # nil = default order
+ @sort_asc = true
+ @bulk_syncing = false
+ @bulk_cancelled = false
+ end
+
+ # Called by AppController when a ROM loads or the backend is swapped.
+ # Updates internal state and refreshes the window if it's visible.
+ def update_game(rom_id:, backend:)
+ @current_rom_id = rom_id
+ @backend = backend
+ return unless @built
+
+ refresh_game_list
+ select_game(rom_id)
+ populate_tree
+ update_title
+ update_rich_presence
+ end
+
+ # Called by AppController when on_achievements_changed fires.
+ def refresh(backend = @backend)
+ @backend = backend
+ @display_list = nil # live backend data takes precedence over cached sync
+ return unless @built
+
+ populate_tree
+ update_rich_presence
+ end
+
+ def show
+ build_ui unless @built
+ refresh_game_list
+ select_game(@current_rom_id)
+ # For non-current games (or when no game is loaded), seed from cache so
+ # previously-synced data appears without requiring another network hit.
+ if @display_list.nil? && @current_rom_id
+ cached = Achievements::Cache.read(@current_rom_id)
+ @display_list = cached if cached && @backend&.achievement_list.to_a.empty?
+ end
+ populate_tree
+ refresh_auth_state unless @backend&.authenticated?
+ update_title
+ show_window(modal: false)
+ end
+
+ def hide
+ if @bulk_syncing
+ result = @app.command('tk_messageBox',
+ parent: TOP,
+ title: translate('dialog.cancel_bulk_sync_title'),
+ message: translate('dialog.cancel_bulk_sync_msg'),
+ type: :yesno,
+ icon: :warning)
+ return unless result == 'yes'
+ @bulk_cancelled = true
+ @bulk_syncing = false
+ unlock_ui_after_bulk_sync
+ end
+ hide_window(modal: false)
+ end
+
+ # ModalStack protocol (non-modal — no grab)
+ def show_modal(**_args)
+ build_ui unless @built
+ refresh_game_list
+ select_game(@current_rom_id)
+ populate_tree
+ update_title
+ position_near_parent
+ @app.command(:wm, 'deiconify', TOP)
+ @app.command(:raise, TOP)
+ end
+
+ def withdraw
+ @app.command(:wm, 'withdraw', TOP)
+ end
+
+ private
+
+ def build_ui
+ build_toplevel(translate('achievements.title'), geometry: '560x440') do
+ build_toolbar
+ build_tree
+ build_status
+ end
+ setup_bus_subscriptions
+ @built = true
+ end
+
+ def setup_bus_subscriptions
+ Gemba.bus.on(:ra_sync_started) do
+ @app.command(@sync_btn, :configure, state: :disabled)
+ set_status(translate('achievements.sync_pending'))
+ end
+
+ Gemba.bus.on(:ra_sync_done) do |ok:, reason: nil, **|
+ # Re-enable only if still authenticated; logout during an in-flight
+ # request should leave the button disabled.
+ refresh_auth_state
+ unless ok
+ key = case reason
+ when :no_game then 'achievements.sync_no_game'
+ when :timeout then 'achievements.sync_timeout'
+ else 'achievements.sync_failed'
+ end
+ set_status(translate(key))
+ end
+ end
+
+ Gemba.bus.on(:ra_auth_result) do |status:, **|
+ refresh_auth_state
+ end
+
+ Gemba.bus.on(:ra_rich_presence_changed) do |message:, **|
+ next unless @rp_lbl
+ @app.command(@rp_lbl, :configure, text: message)
+ end
+ end
+
+ def refresh_auth_state
+ authenticated = @backend&.authenticated?
+ state = authenticated ? :normal : :disabled
+ @app.command(@sync_btn, :configure, state: state)
+ @app.command(@unofficial_check, :configure, state: state) if @unofficial_check
+ set_status(translate('achievements.not_logged_in')) unless authenticated
+ end
+
+ def build_toolbar
+ f = "#{TOP}.toolbar"
+ @app.command('ttk::frame', f, padding: [8, 8, 8, 4])
+ @app.command(:pack, f, fill: :x)
+
+ lbl = "#{f}.lbl"
+ @app.command('ttk::label', lbl, text: translate('achievements.game_label'))
+ @app.command(:pack, lbl, side: :left, padx: [0, 4])
+
+ @combo = "#{f}.combo"
+ @app.command('ttk::combobox', @combo, state: :readonly, width: 36)
+ @app.command(:pack, @combo, side: :left)
+ @app.command(:bind, @combo, '<>', proc { |*| on_game_selected })
+
+ @sync_btn = "#{f}.sync"
+ @app.command('ttk::button', @sync_btn,
+ text: translate('achievements.sync'),
+ state: @backend&.authenticated? ? :normal : :disabled,
+ command: proc { sync })
+ @app.command(:pack, @sync_btn, side: :left, padx: [8, 0])
+
+ @unofficial_check = "#{f}.unofficial"
+ @app.set_variable(VAR_UNOFFICIAL, @config.ra_unofficial? ? '1' : '0')
+ @app.command('ttk::checkbutton', @unofficial_check,
+ text: translate('achievements.include_unofficial'),
+ variable: VAR_UNOFFICIAL,
+ command: proc { on_unofficial_toggled })
+ @app.command(:pack, @unofficial_check, side: :left, padx: [12, 0])
+ end
+
+ def build_tree
+ f = "#{TOP}.tf"
+ @app.command('ttk::frame', f, padding: [8, 0, 8, 4])
+ @app.command(:pack, f, fill: :both, expand: 1)
+
+ @tree = "#{f}.tree"
+ @scrollbar = "#{f}.sb"
+
+ @app.command('ttk::treeview', @tree,
+ columns: Teek.make_list('name', 'points', 'earned'),
+ show: :headings,
+ height: 16,
+ selectmode: :browse)
+
+ @app.command(@tree, :heading, 'name',
+ text: translate('achievements.name_col'), anchor: :w,
+ command: proc { sort_tree('name') })
+ @app.command(@tree, :heading, 'points',
+ text: translate('achievements.points_col'),
+ command: proc { sort_tree('points') })
+ @app.command(@tree, :heading, 'earned',
+ text: translate('achievements.earned_col'),
+ command: proc { sort_tree('earned') })
+
+ @app.command(@tree, :column, 'name', width: 270)
+ @app.command(@tree, :column, 'points', width: 55)
+ @app.command(@tree, :column, 'earned', width: 145)
+
+ @app.command('ttk::scrollbar', @scrollbar, orient: :vertical,
+ command: "#{@tree} yview")
+ @app.command(@tree, :configure, yscrollcommand: "#{@scrollbar} set")
+
+ @app.command(:pack, @scrollbar, side: :right, fill: :y)
+ @app.command(:pack, @tree, side: :left, fill: :both, expand: 1)
+
+ setup_tree_tooltip
+ end
+
+ def build_status
+ bar = "#{TOP}.status_bar"
+ @app.command('ttk::frame', bar)
+ @app.command(:pack, bar, fill: :x)
+
+ @status_lbl = "#{bar}.status"
+ @app.command('ttk::label', @status_lbl,
+ text: translate('achievements.none'),
+ anchor: :w, padding: [8, 2, 8, 6])
+ @app.command(:pack, @status_lbl, side: :left)
+
+ @rp_lbl = "#{bar}.rich_presence"
+ @app.command('ttk::label', @rp_lbl,
+ text: '',
+ anchor: :e, padding: [8, 2, 8, 6],
+ foreground: '#666666')
+ @app.command(:pack, @rp_lbl, side: :right)
+ end
+
+ def refresh_game_list
+ entries = @rom_library.all.select { |r| r['platform']&.downcase == 'gba' }
+ @game_entries = entries
+ titles = entries.map { |r|
+ GameIndex.lookup(r['game_code']) || r['title'] || File.basename(r['path'].to_s, '.*')
+ }
+ @app.command(@combo, :configure, values: Teek.make_list(*titles))
+ end
+
+ def select_game(rom_id)
+ idx = @game_entries.index { |r| r['rom_id'] == rom_id }
+ return unless idx
+
+ @app.command(@combo, :current, idx)
+ end
+
+ def on_game_selected
+ @display_list = nil
+ idx = @app.command(@combo, :current).to_i
+ selected_id = @game_entries.dig(idx, 'rom_id')
+
+ if selected_id == @current_rom_id
+ populate_tree
+ else
+ @display_list = Achievements::Cache.read(selected_id)
+ populate_tree
+ end
+ end
+
+ def populate_tree
+ @current_list = @display_list || @backend&.achievement_list || []
+ @sort_col = nil # reset to default order when data changes
+ @sort_asc = true
+ update_heading_indicators
+ render_list(default_sorted(@current_list))
+ end
+
+ def sort_tree(col)
+ return if @current_list.empty?
+ if @sort_col == col
+ @sort_asc = !@sort_asc
+ else
+ @sort_col = col
+ @sort_asc = col != 'earned' # earned defaults desc (newest first)
+ end
+ update_heading_indicators
+ render_list(apply_sort(@current_list))
+ end
+
+ def render_list(list)
+ clear_tree
+
+ if list.empty?
+ update_status(0, 0)
+ return
+ end
+
+ list.each do |ach|
+ earned_str = ach.earned? && ach.earned_at ?
+ ach.earned_at.strftime('%Y-%m-%d %H:%M') : ''
+ item_id = @app.command(@tree, :insert, '', :end,
+ values: Teek.make_list(ach.title, ach.points.to_s, earned_str)).to_s
+ @tree_items << item_id
+ @item_descriptions[item_id] = ach.description unless ach.description.to_s.empty?
+ end
+
+ earned_count = list.count(&:earned?)
+ update_status(earned_count, list.size)
+ end
+
+ def default_sorted(list)
+ earned, unearned = list.partition(&:earned?)
+ earned.sort_by! { |a| -(a.earned_at&.to_i || 0) }
+ unearned.sort_by!(&:title)
+ earned + unearned
+ end
+
+ def apply_sort(list)
+ case @sort_col
+ when 'name'
+ sorted = list.sort_by { |a| a.title.downcase }
+ @sort_asc ? sorted : sorted.reverse
+ when 'points'
+ sorted = list.sort_by { |a| a.points }
+ @sort_asc ? sorted : sorted.reverse
+ when 'earned'
+ # Nulls (unearned) always last regardless of direction
+ earned, unearned = list.partition(&:earned?)
+ sorted_earned = earned.sort_by { |a| a.earned_at.to_i }
+ sorted_earned.reverse! unless @sort_asc
+ sorted_earned + unearned
+ else
+ default_sorted(list)
+ end
+ end
+
+ SORT_ASC = ' ▲'
+ SORT_DESC = ' ▼'
+
+ def update_heading_indicators
+ {
+ 'name' => translate('achievements.name_col'),
+ 'points' => translate('achievements.points_col'),
+ 'earned' => translate('achievements.earned_col'),
+ }.each do |col, base_text|
+ indicator = if @sort_col == col
+ @sort_asc ? SORT_ASC : SORT_DESC
+ else
+ ''
+ end
+ @app.command(@tree, :heading, col, text: "#{base_text}#{indicator}")
+ end
+ end
+
+ def clear_tree
+ return if @tree_items.empty?
+
+ hide_tip
+ @app.command(@tree, :delete, Teek.make_list(*@tree_items))
+ @tree_items.clear
+ @item_descriptions.clear
+ end
+
+ def update_status(earned, total)
+ text = if total == 0
+ translate('achievements.none')
+ else
+ translate('achievements.earned_label', earned: earned, total: total)
+ end
+ set_status(text)
+ end
+
+ def set_status(text)
+ return unless @status_lbl
+ @app.command(@status_lbl, :configure, text: text)
+ end
+
+ def update_rich_presence
+ return unless @rp_lbl
+ msg = @backend&.rich_presence_message.to_s
+ @app.command(@rp_lbl, :configure, text: msg)
+ end
+
+ def update_title
+ entry = @game_entries.find { |r| r['rom_id'] == @current_rom_id }
+ game_title = entry && (GameIndex.lookup(entry['game_code']) || entry['title'])
+ window_title = if game_title
+ "#{translate('achievements.title')} \u2014 #{game_title}"
+ else
+ translate('achievements.title')
+ end
+ @app.command(:wm, 'title', TOP, window_title)
+ end
+
+ def selected_rom_info
+ idx = @app.command(@combo, :current).to_i
+ entry = @game_entries[idx]
+ return nil unless entry
+ RomInfo.from_rom(entry)
+ end
+
+ SYNC_TIMEOUT_MS = 60_000
+
+ def sync
+ return unless @backend
+ rom_info = selected_rom_info
+ return unless rom_info
+
+ Gemba.log(:info) { "Achievements: sync started for #{rom_info.title} (#{rom_info.rom_id})" }
+ Gemba.bus.emit(:ra_sync_started)
+
+ @sync_timeout = @app.after(SYNC_TIMEOUT_MS) do
+ Gemba.log(:warn) { "Achievements: sync timed out after #{SYNC_TIMEOUT_MS / 1000}s" }
+ @sync_timeout = nil
+ Gemba.bus.emit(:ra_sync_done, ok: false, reason: :timeout)
+ end
+
+ @backend.fetch_for_display(rom_info: rom_info) do |list|
+ @app.after_cancel(@sync_timeout) if @sync_timeout
+ @sync_timeout = nil
+ Gemba.log(list ? :info : :warn) {
+ "Achievements: fetch_for_display returned #{list ? "#{list.size} achievements" : 'nil'}"
+ }
+ Achievements::Cache.write(rom_info.rom_id, list) if list
+ @display_list = list
+ populate_tree
+ Gemba.bus.emit(:ra_sync_done, ok: !list.nil?)
+ end
+ end
+
+ # -- Include unofficial toggle ------------------------------------------
+
+ def on_unofficial_toggled
+ return unless @backend&.authenticated?
+
+ value = @app.get_variable(VAR_UNOFFICIAL) == '1'
+ Gemba.bus.emit(:ra_unofficial_changed, value: value)
+
+ # Bulk re-sync every library game that has an MD5
+ games = @rom_library.all.select { |r|
+ !r['md5'].to_s.empty?
+ }
+ return if games.empty?
+
+ lock_ui_for_bulk_sync
+ sync_games_sequentially(games, 0)
+ end
+
+ def lock_ui_for_bulk_sync
+ @bulk_syncing = true
+ @bulk_cancelled = false
+ @app.command(@sync_btn, :configure, state: :disabled)
+ @app.command(@unofficial_check, :configure, state: :disabled)
+ end
+
+ def unlock_ui_after_bulk_sync
+ @bulk_syncing = false
+ refresh_auth_state
+ end
+
+ def sync_games_sequentially(games, idx)
+ return if @bulk_cancelled
+
+ if idx >= games.size
+ unlock_ui_after_bulk_sync
+ # Refresh display for the currently selected game
+ on_game_selected
+ set_status(translate('achievements.bulk_sync_done', count: games.size))
+ return
+ end
+
+ rom = games[idx]
+ rom_info = RomInfo.from_rom(rom)
+ title = rom_info.title
+ set_status(translate('achievements.bulk_syncing',
+ title: title, n: idx + 1, total: games.size))
+
+ @backend.fetch_for_display(rom_info: rom_info) do |list|
+ next if @bulk_cancelled
+ Achievements::Cache.write(rom_info.rom_id, list) if list
+ sync_games_sequentially(games, idx + 1)
+ end
+ end
+
+ # -- Achievement description tooltip ------------------------------------
+
+ TIP_DELAY_MS = 500
+ TIP_PATH = "#{TOP}.__tip"
+ TIP_BG = '#FFFFEE'
+ TIP_FG = '#333333'
+ TIP_BORDER = '#999999'
+
+ def setup_tree_tooltip
+ @app.command(:bind, @tree, '', proc {
+ # Identify treeview row under the pointer
+ px = @app.tcl_eval("winfo pointerx #{@tree}").to_i
+ py = @app.tcl_eval("winfo pointery #{@tree}").to_i
+ tx = @app.tcl_eval("winfo rootx #{@tree}").to_i
+ ty = @app.tcl_eval("winfo rooty #{@tree}").to_i
+ item = @app.tcl_eval("#{@tree} identify row #{px - tx} #{py - ty}").strip
+
+ next if item == @tip_item
+ @tip_item = item
+ hide_tip
+
+ next if item.empty?
+ desc = @item_descriptions[item]
+ next unless desc
+
+ cancel_tip_timer
+ @tip_timer = @app.after(TIP_DELAY_MS) { show_tip(desc) }
+ })
+
+ @app.command(:bind, @tree, '', proc {
+ @tip_item = nil
+ cancel_tip_timer
+ hide_tip
+ })
+ end
+
+ def show_tip(text)
+ hide_tip
+ px = @app.tcl_eval("winfo pointerx .").to_i
+ py = @app.tcl_eval("winfo pointery .").to_i
+ wx = @app.tcl_eval("winfo rootx #{TOP}").to_i
+ wy = @app.tcl_eval("winfo rooty #{TOP}").to_i
+ rel_x = px - wx + 14
+ rel_y = py - wy + 18
+
+ @app.command(:frame, TIP_PATH, background: TIP_BORDER, borderwidth: 0)
+ @app.command(:label, "#{TIP_PATH}.l",
+ text: text, background: TIP_BG, foreground: TIP_FG,
+ padx: 8, pady: 5, justify: :left, wraplength: 320)
+ @app.command(:pack, "#{TIP_PATH}.l", padx: 1, pady: 1)
+ @app.command(:place, TIP_PATH, x: rel_x, y: rel_y)
+ @app.command(:raise, TIP_PATH)
+ end
+
+ def hide_tip
+ cancel_tip_timer
+ @app.tcl_eval("catch {destroy #{TIP_PATH}}")
+ end
+
+ def cancel_tip_timer
+ return unless @tip_timer
+ @app.command(:after, :cancel, @tip_timer)
+ @tip_timer = nil
+ end
+ end
+end
diff --git a/lib/gemba/app_controller.rb b/lib/gemba/app_controller.rb
index 19f9200..05305d5 100644
--- a/lib/gemba/app_controller.rb
+++ b/lib/gemba/app_controller.rb
@@ -1,6 +1,7 @@
# frozen_string_literal: true
require 'fileutils'
+require 'digest'
module Gemba
# Application controller — the brain of the app.
@@ -39,6 +40,11 @@ def initialize(rom_path = nil, sound: true, fullscreen: false, frames: nil)
@sound = sound
@config = Gemba.user_config
+ # Config may have been created (and subscribed to the bus) before this
+ # point — e.g. the CLI calls Gemba.user_config before AppController runs.
+ # Re-subscribe now that the real bus is in place so bus events like
+ # :rom_loaded actually reach it (fixes recent ROMs not updating).
+ @config.resubscribe
@scale = @config.scale
@fullscreen = fullscreen
@frame_limit = frames
@@ -87,6 +93,8 @@ def initialize(rom_path = nil, sound: true, fullscreen: false, frames: nil)
@settings_window.refresh_hotkeys(@hotkeys.labels)
push_settings_to_ui
+ setup_achievement_backend
+
boxart_backend = BoxartFetcher::LibretroBackend.new
@boxart_fetcher = BoxartFetcher.new(app: @app, cache_dir: Config.boxart_dir, backend: boxart_backend)
@rom_overrides = RomOverrides.new
@@ -134,6 +142,14 @@ def disable_confirmations!
private
+ def confirm_quit
+ return true unless @rom_path
+ confirm(
+ title: translate('dialog.quit_title'),
+ message: translate('dialog.quit_msg'),
+ )
+ end
+
def confirm(title:, message:)
return true if @disable_confirmations
result = @app.command('tk_messageBox',
@@ -181,7 +197,27 @@ def setup_bus_subscriptions
end
bus.on(:recording_changed) { update_recording_menu }
bus.on(:input_recording_changed) { update_input_recording_menu }
- bus.on(:request_quit) { self.running = false }
+ bus.on(:request_quit) { self.running = false if confirm_quit }
+ bus.on(:achievement_unlocked) do |achievement:|
+ frame&.receive(:show_toast, message: "#{achievement.title} (#{achievement.points}pts)")
+ end
+ bus.on(:ra_login) do |username:, password:|
+ achievement_backend.login_with_password(username: username, password: password)
+ end
+ bus.on(:ra_verify) do
+ achievement_backend.token_test
+ end
+ bus.on(:ra_logout) do
+ achievement_backend.logout
+ @config.ra_token = ''
+ @config.ra_username = ''
+ @config.save!
+ end
+ bus.on(:ra_unofficial_changed) do |value:|
+ @config.ra_unofficial = value
+ @config.save!
+ @achievement_backend.include_unofficial = value
+ end
bus.on(:request_escape) { @fullscreen ? toggle_fullscreen : (self.running = false) }
bus.on(:request_fullscreen) { toggle_fullscreen }
bus.on(:request_save_states) { show_state_picker }
@@ -202,10 +238,16 @@ def setup_bus_subscriptions
refresh_from_config
end
- bus.on(:rom_loaded) do |title:, path:, saves_dir:, **|
- @window.set_title("gemba \u2014 #{title}")
+ bus.on(:rom_loaded) do |rom_id:, title:, path:, saves_dir:, game_code: nil, md5: nil, platform: 'gba', **|
+ friendly = GameIndex.lookup(game_code) ||
+ GameIndex.lookup_by_md5(md5, platform) ||
+ title
+ @window.set_title("gemba \u2014 #{friendly}")
@app.command(@view_menu, :entryconfigure, 0, state: :normal) # Game Library
@app.command(@view_menu, :entryconfigure, 2, state: :normal) # ROM Info
+ @current_rom_id = rom_id
+ @achievement_backend.rich_presence_enabled = @config.ra_rich_presence?
+ @achievements_window&.update_game(rom_id: rom_id, backend: @achievement_backend) # only if open
[3, 4, 6, 8, 9].each { |i| @app.command(@emu_menu, :entryconfigure, i, state: :normal) }
rebuild_recent_menu
@@ -243,7 +285,7 @@ def build_menu
@app.command("#{menubar}.file", :add, :separator)
@app.command("#{menubar}.file", :add, :command,
label: translate('menu.quit'), accelerator: 'Cmd+Q',
- command: proc { self.running = false })
+ command: proc { self.running = false if confirm_quit })
@app.command(:bind, '.', '', proc { handle_open_rom })
@app.command(:bind, '.', '', proc { show_settings })
@@ -275,6 +317,9 @@ def build_menu
@app.command(view_menu, :add, :command,
label: translate('menu.rom_info'), state: :disabled,
command: proc { show_rom_info })
+ @app.command(view_menu, :add, :command,
+ label: translate('menu.achievements'),
+ command: proc { show_achievements })
@app.command(view_menu, :add, :command,
label: translate('menu.patch_rom'),
command: proc { show_patcher })
@@ -404,6 +449,19 @@ def show_rom_info
show_args: { core: frame.core, rom_path: @rom_path, save_path: sav_path })
end
+ def show_achievements
+ achievements_window.update_game(rom_id: @current_rom_id, backend: @achievement_backend)
+ achievements_window.show
+ end
+
+ def achievements_window
+ @achievements_window ||= AchievementsWindow.new(
+ app: @app,
+ rom_library: @rom_library,
+ config: @config,
+ )
+ end
+
def show_replay_player
@replay_player ||= ReplayPlayer.new(
app: @app,
@@ -474,9 +532,15 @@ def load_rom(path)
apply_frame_aspect(@emulator_frame)
end
- saves = @config.saves_dir
+ saves = @config.saves_dir
bios_path = resolve_bios_path
- loaded_core = @emulator_frame.load_core(rom_path, saves_dir: saves, bios_path: bios_path, rom_source_path: path)
+ md5 = Digest::MD5.file(rom_path).hexdigest
+
+ # Set backend before load_core so load_game fires on the real backend, not NullBackend
+ @emulator_frame.achievement_backend = @achievement_backend
+
+ loaded_core = @emulator_frame.load_core(rom_path, saves_dir: saves, bios_path: bios_path,
+ rom_source_path: path, md5: md5)
@rom_path = path
new_platform = @emulator_frame.platform
@@ -487,12 +551,13 @@ def load_rom(path)
rom_id = Config.rom_id(loaded_core.game_code, loaded_core.checksum)
emit(:rom_loaded,
- rom_id: rom_id,
- path: path,
- title: loaded_core.title,
+ rom_id: rom_id,
+ path: path,
+ title: loaded_core.title,
game_code: loaded_core.game_code,
- platform: @platform.short_name,
+ platform: @platform.short_name,
saves_dir: saves,
+ md5: md5,
)
@emulator_frame.start_animate
@@ -608,7 +673,50 @@ def save_config
bios_name = @app.get_variable(SettingsWindow::VAR_BIOS_PATH).to_s.strip
@config.bios_path = bios_name.empty? ? nil : bios_name
@config.skip_bios = @app.get_variable(SettingsWindow::VAR_SKIP_BIOS) == '1'
+ @settings_window&.system_tab&.save_to_config(@config)
@config.save!
+ setup_achievement_backend
+ end
+
+ def achievement_backend
+ @achievement_backend ||= Achievements::NullBackend.new
+ end
+
+ def setup_achievement_backend
+ @achievement_backend = Achievements.backend_for(@config, app: @app)
+ @achievement_backend.include_unofficial = @config.ra_unofficial?
+ @achievement_backend.on_achievements_changed do
+ @achievements_window&.refresh(@achievement_backend) # only if already open
+ end
+ @achievement_backend.on_unlock do |_ach|
+ @achievements_window&.refresh(@achievement_backend) # only if already open
+ end
+ @achievement_backend.on_rich_presence_changed do |msg|
+ Gemba.bus.emit(:ra_rich_presence_changed, message: msg.to_s)
+ end
+ @achievement_backend.on_auth_change do |status, token_or_error|
+ case status
+ when :ok
+ if token_or_error
+ emit(:ra_auth_result, status: :ok, token: token_or_error.to_s)
+ @config.ra_token = token_or_error.to_s
+ @config.save!
+ else
+ emit(:ra_auth_result, status: :ok)
+ end
+ when :error
+ emit(:ra_auth_result, status: :error, message: token_or_error.to_s)
+ when :logout
+ emit(:ra_auth_result, status: :logout)
+ @config.ra_token = ''
+ @config.save!
+ end
+ end
+ # Resume existing session if token already stored
+ if @config.ra_enabled? && !@config.ra_token.to_s.strip.empty?
+ @achievement_backend.login_with_token(username: @config.ra_username, token: @config.ra_token)
+ end
+ @emulator_frame&.achievement_backend = @achievement_backend
end
def push_settings_to_ui
@@ -799,17 +907,18 @@ def show_cursor
def setup_global_hotkeys
# '?' toggles the hotkey reference panel. Bound on 'all' so it fires even
# when the help window itself has focus after being shown.
- @app.bind('all', 'KeyPress-question') { toggle_help }
+ @app.bind('all', 'KeyPress-question') { @app.command(:event, 'generate', '.', '<>') }
+ @app.command(:bind, '.', '<>', proc { toggle_help })
@app.bind('.', 'KeyPress', :keysym, '%s') do |k, state_str|
next if frame&.sdl2_ready? || @modal_stack.active?
if k == 'Escape'
- self.running = false
+ self.running = false if confirm_quit
else
mods = HotkeyMap.modifiers_from_state(state_str.to_i)
case @hotkeys.action_for(k, modifiers: mods)
- when :quit then self.running = false
+ when :quit then self.running = false if confirm_quit
when :open_rom then handle_open_rom
end
end
diff --git a/lib/gemba/cli.rb b/lib/gemba/cli.rb
index 19872df..749ca47 100644
--- a/lib/gemba/cli.rb
+++ b/lib/gemba/cli.rb
@@ -4,7 +4,7 @@
module Gemba
class CLI
- SUBCOMMANDS = %w[play record decode replay config version patch].freeze
+ SUBCOMMANDS = %w[play record decode replay config version patch ra].freeze
# Entry point: dispatch to subcommand or default to play.
# @param argv [Array]
@@ -18,7 +18,33 @@ def self.run(argv = ARGV, dry_run: false)
end
cmd = SUBCOMMANDS.include?(args.first) ? args.shift : 'play'
- send(:"run_#{cmd}", args, dry_run: dry_run)
+
+ case cmd
+ when 'play'
+ require 'gemba/cli/commands/play'
+ Commands::Play.new(args, dry_run: dry_run).call
+ when 'record'
+ require 'gemba/cli/commands/record'
+ Commands::Record.new(args, dry_run: dry_run).call
+ when 'decode'
+ require 'gemba/cli/commands/decode'
+ Commands::Decode.new(args, dry_run: dry_run).call
+ when 'replay'
+ require 'gemba/cli/commands/replay'
+ Commands::Replay.new(args, dry_run: dry_run).call
+ when 'config'
+ require 'gemba/cli/commands/config_cmd'
+ Commands::ConfigCmd.new(args, dry_run: dry_run).call
+ when 'version'
+ require 'gemba/cli/commands/version'
+ Commands::Version.new(args, dry_run: dry_run).call
+ when 'patch'
+ require 'gemba/cli/commands/patch'
+ Commands::Patch.new(args, dry_run: dry_run).call
+ when 'ra'
+ require 'gemba/cli/commands/retro_achievements'
+ Commands::RetroAchievements.new(args, dry_run: dry_run).call
+ end
end
# Main help text listing all subcommands.
@@ -36,691 +62,11 @@ def self.main_help
patch Apply an IPS/BPS/UPS patch to a ROM
config Show or reset configuration
version Show version
+ ra RetroAchievements — login, verify, achievements
Run 'gemba --help' for command-specific options.
HELP
end
- # --- play (default command) ---
-
- def self.parse_play(argv)
- options = {}
-
- parser = OptionParser.new do |o|
- o.banner = "Usage: gemba [play] [options] [ROM_FILE]"
- o.separator ""
- o.separator "Launch the GBA emulator. ROM_FILE is optional."
- o.separator ""
-
- o.on("-s", "--scale N", Integer, "Window scale (1-4)") do |v|
- options[:scale] = v.clamp(1, 4)
- end
-
- o.on("-v", "--volume N", Integer, "Volume (0-100)") do |v|
- options[:volume] = v.clamp(0, 100)
- end
-
- o.on("-m", "--mute", "Start muted") do
- options[:mute] = true
- end
-
- o.on("--no-sound", "Disable audio entirely") do
- options[:sound] = false
- end
-
- o.on("-f", "--fullscreen", "Start in fullscreen") do
- options[:fullscreen] = true
- end
-
- o.on("--show-fps", "Show FPS counter") do
- options[:show_fps] = true
- end
-
- o.on("--turbo-speed N", Integer, "Fast-forward speed (0=uncapped, 2-4)") do |v|
- options[:turbo_speed] = v.clamp(0, 4)
- end
-
- o.on("--bios PATH", "Path to GBA BIOS file (overrides saved setting)") do |v|
- options[:bios] = File.expand_path(v)
- end
-
- o.on("--locale LANG", "Language (en, ja, auto)") do |v|
- options[:locale] = v
- end
-
- o.on("-h", "--help", "Show this help") do
- options[:help] = true
- end
- end
-
- parser.parse!(argv)
- options[:rom] = File.expand_path(argv.first) if argv.first
- options[:parser] = parser
- options
- end
-
- # Apply parsed CLI options to the user config (session-only overrides).
- # @param config [Gemba::Config]
- # @param options [Hash]
- def self.apply(config, options)
- config.scale = options[:scale] if options[:scale]
- config.volume = options[:volume] if options[:volume]
- config.muted = true if options[:mute]
- config.show_fps = true if options[:show_fps]
- config.turbo_speed = options[:turbo_speed] if options[:turbo_speed]
- config.locale = options[:locale] if options[:locale]
- config.bios_path = options[:bios] if options[:bios]
- end
-
- def self.run_play(argv, dry_run: false)
- options = parse_play(argv)
-
- if options[:help]
- puts options[:parser] unless dry_run
- return { command: :play, help: true }
- end
-
- result = {
- command: :play,
- rom: options[:rom],
- sound: options.fetch(:sound, true),
- fullscreen: options[:fullscreen],
- options: options.except(:parser)
- }
- return result if dry_run
-
- require "gemba"
-
- apply(Gemba.user_config, options)
- Gemba.load_locale if options[:locale]
-
- Gemba::AppController.new(result[:rom], sound: result[:sound], fullscreen: result[:fullscreen]).run
- end
-
- # --- record subcommand ---
-
- def self.parse_record(argv)
- options = {}
-
- parser = OptionParser.new do |o|
- o.banner = "Usage: gemba record [options] ROM_FILE"
- o.separator ""
- o.separator "Record video+audio to a .grec file (headless, no GUI)."
- o.separator ""
-
- o.on("--frames N", Integer, "Number of frames to record (required)") do |v|
- options[:frames] = v
- end
-
- o.on("-o", "--output PATH", "Output .grec path (default: ROM_ID.grec)") do |v|
- options[:output] = v
- end
-
- o.on("-c", "--compression N", Integer, "Zlib level 1-9 (default: 1)") do |v|
- options[:compression] = v.clamp(1, 9)
- end
-
- o.on("--progress", "Show recording progress") do
- options[:progress] = true
- end
-
- o.on("-h", "--help", "Show this help") do
- options[:help] = true
- end
- end
-
- parser.parse!(argv)
- options[:rom] = File.expand_path(argv.first) if argv.first
- options[:parser] = parser
- options
- end
-
- def self.run_record(argv, dry_run: false)
- options = parse_record(argv)
-
- if options[:help]
- puts options[:parser] unless dry_run
- return { command: :record, help: true }
- end
-
- unless options[:frames] && options[:rom]
- $stderr.puts "Error: record requires --frames N and a ROM file"
- $stderr.puts "Run 'gemba record --help' for usage"
- exit 1
- end
-
- result = {
- command: :record,
- rom: options[:rom],
- frames: options[:frames],
- output: options[:output],
- compression: options[:compression],
- progress: options[:progress],
- options: options.except(:parser)
- }
- return result if dry_run
-
- require "gemba/headless"
-
- total = options[:frames]
-
- HeadlessPlayer.open(options[:rom]) do |player|
- rec_path = options[:output] ||
- "#{Config.rom_id(player.game_code, player.checksum)}.grec"
-
- rec_opts = {}
- rec_opts[:compression] = options[:compression] if options[:compression]
- player.start_recording(rec_path, **rec_opts)
-
- if options[:progress]
- last_print = Process.clock_gettime(Process::CLOCK_MONOTONIC)
- player.step(total) do |frame|
- now = Process.clock_gettime(Process::CLOCK_MONOTONIC)
- if frame == total || now - last_print >= 0.5
- pct = frame * 100.0 / total
- $stderr.print "\rRecording: #{frame}/#{total} (#{'%.1f' % pct}%)\e[K"
- last_print = now
- end
- end
- $stderr.print "\r\e[K"
- else
- player.step(total)
- end
-
- player.stop_recording
-
- info = RecorderDecoder.stats(rec_path)
- puts "Recorded #{info[:frame_count]} frames to #{rec_path}"
- puts " Duration: #{'%.1f' % info[:duration]}s"
- puts " Avg change: #{'%.1f' % info[:avg_change_pct]}%/frame"
- puts " Uncompressed: #{format_size(info[:raw_video_size])} (encode input)"
- puts " .grec size: #{format_size(File.size(rec_path))}"
- end
- end
-
- # --- decode subcommand ---
-
- def self.parse_decode(argv)
- options = {}
-
- parser = OptionParser.new do |o|
- o.banner = "Usage: gemba decode [options] GREC_FILE [-- FFMPEG_ARGS...]"
- o.separator ""
- o.separator "Encode a .grec recording to a playable video via ffmpeg."
- o.separator "Args after -- replace the default codec flags."
- o.separator ""
-
- o.on("-o", "--output PATH", "Output path (default: INPUT.mp4)") do |v|
- options[:output] = v
- end
-
- o.on("--video-codec CODEC", "Video codec (default: libx264)") do |v|
- options[:video_codec] = v
- end
-
- o.on("--audio-codec CODEC", "Audio codec (default: aac)") do |v|
- options[:audio_codec] = v
- end
-
- o.on("-s", "--scale N", Integer, "Scale factor (default: native)") do |v|
- options[:scale] = v.clamp(1, 10)
- end
-
- o.on("-l", "--list", "List available .grec recordings") do
- options[:list] = true
- end
-
- o.on("--stats", "Show recording stats (no ffmpeg needed)") do
- options[:stats] = true
- end
-
- o.on("--no-progress", "Disable progress indicator") do
- options[:progress] = false
- end
-
- o.on("-h", "--help", "Show this help") do
- options[:help] = true
- end
- end
-
- parser.parse!(argv)
- options[:grec] = argv.shift
- options[:ffmpeg_args] = argv unless argv.empty?
- options[:parser] = parser
- options
- end
-
- def self.run_decode(argv, dry_run: false)
- options = parse_decode(argv)
-
- if options[:help]
- puts options[:parser] unless dry_run
- return { command: :decode, help: true }
- end
-
- if options[:list]
- list_grec_recordings unless dry_run
- return { command: :decode_list }
- end
-
- unless options[:grec]
- list_grec_recordings unless dry_run
- return { command: :decode_list }
- end
-
- result = {
- command: options[:stats] ? :decode_stats : :decode,
- grec: options[:grec],
- stats: options[:stats],
- output: options[:output],
- video_codec: options[:video_codec],
- audio_codec: options[:audio_codec],
- scale: options[:scale],
- ffmpeg_args: options[:ffmpeg_args],
- options: options.except(:parser)
- }
- return result if dry_run
-
- require "gemba/headless"
-
- grec_path = options[:grec]
-
- if options[:stats]
- info = RecorderDecoder.stats(grec_path)
- puts "Recording: #{grec_path}"
- puts " Frames: #{info[:frame_count]}"
- puts " Resolution: #{info[:width]}x#{info[:height]}"
- puts " FPS: #{'%.2f' % info[:fps]}"
- puts " Duration: #{'%.1f' % info[:duration]}s"
- puts " Avg change: #{'%.1f' % info[:avg_change_pct]}%/frame"
- puts " Uncompressed: #{format_size(info[:raw_video_size])} (encode input)"
- puts " Audio: #{info[:audio_rate]} Hz, #{info[:audio_channels]}ch"
- return
- end
-
- output_path = options[:output] || grec_path.sub(/\.grec\z/, '') + '.mp4'
- codec_opts = {}
- codec_opts[:video_codec] = options[:video_codec] if options[:video_codec]
- codec_opts[:audio_codec] = options[:audio_codec] if options[:audio_codec]
- codec_opts[:scale] = options[:scale] if options[:scale]
- codec_opts[:ffmpeg_args] = options[:ffmpeg_args] if options[:ffmpeg_args]
- codec_opts[:progress] = options.fetch(:progress, true)
-
- info = RecorderDecoder.decode(grec_path, output_path, **codec_opts)
- puts "Encoded #{info[:frame_count]} frames " \
- "(#{info[:width]}x#{info[:height]} @ #{'%.2f' % info[:fps]} fps, " \
- "avg #{'%.1f' % info[:avg_change_pct]}% change/frame)"
- puts "Output: #{info[:output_path]}"
- end
-
- # --- replay subcommand ---
-
- def self.parse_replay(argv)
- options = {}
-
- parser = OptionParser.new do |o|
- o.banner = "Usage: gemba replay [options] GIR_FILE [ROM_FILE]"
- o.separator ""
- o.separator "Replay a .gir input recording."
- o.separator "ROM is read from the .gir header; override with ROM_FILE."
- o.separator ""
-
- o.on("-l", "--list", "List available .gir recordings") do
- options[:list] = true
- end
-
- o.on("--headless", "Run without GUI (print summary and exit)") do
- options[:headless] = true
- end
-
- o.on("--progress", "Show progress (headless only)") do
- options[:progress] = true
- end
-
- o.on("-f", "--fullscreen", "Start in fullscreen") do
- options[:fullscreen] = true
- end
-
- o.on("--no-sound", "Disable audio") do
- options[:sound] = false
- end
-
- o.on("-h", "--help", "Show this help") do
- options[:help] = true
- end
- end
-
- parser.parse!(argv)
- options[:gir] = argv.shift
- options[:rom] = argv.shift
- options[:parser] = parser
- options
- end
-
- def self.run_replay(argv, dry_run: false)
- options = parse_replay(argv)
-
- if options[:help]
- puts options[:parser] unless dry_run
- return { command: :replay, help: true }
- end
-
- if options[:list]
- list_recordings unless dry_run
- return { command: :replay_list }
- end
-
- unless options[:gir]
- $stderr.puts "Error: replay requires a .gir file"
- $stderr.puts "Run 'gemba replay --help' for usage"
- exit 1
- end
-
- gir_path = File.expand_path(options[:gir])
-
- result = {
- command: options[:headless] ? :replay_headless : :replay,
- gir: gir_path,
- rom: options[:rom],
- sound: options.fetch(:sound, true),
- fullscreen: options[:fullscreen],
- headless: options[:headless],
- progress: options[:progress],
- options: options.except(:parser)
- }
- return result if dry_run
-
- if options[:headless]
- run_replay_headless(gir_path, options)
- else
- run_replay_gui(gir_path, options)
- end
- end
-
- # --- config subcommand ---
-
- def self.parse_config(argv)
- options = {}
-
- parser = OptionParser.new do |o|
- o.banner = "Usage: gemba config [options]"
- o.separator ""
- o.separator "Show or reset configuration."
- o.separator ""
-
- o.on("--reset", "Delete settings file (keeps saves)") do
- options[:reset] = true
- end
-
- o.on("-y", "--yes", "Skip confirmation prompts") do
- options[:yes] = true
- end
-
- o.on("-h", "--help", "Show this help") do
- options[:help] = true
- end
- end
-
- parser.parse!(argv)
- options[:parser] = parser
- options
- end
-
- def self.run_config(argv, dry_run: false)
- options = parse_config(argv)
-
- if options[:help]
- puts options[:parser] unless dry_run
- return { command: :config, help: true }
- end
-
- result = {
- command: options[:reset] ? :config_reset : :config_show,
- reset: options[:reset],
- yes: options[:yes],
- options: options.except(:parser)
- }
- return result if dry_run
-
- require "gemba"
-
- if options[:reset]
- path = Config.default_path
- unless File.exist?(path)
- puts "No config file found at #{path}"
- return
- end
- unless options[:yes]
- print "Delete #{path}? [y/N] "
- return unless $stdin.gets&.strip&.downcase == 'y'
- end
- Config.reset!(path: path)
- puts "Deleted #{path}"
- return
- end
-
- # Default: show config info
- path = Config.default_path
- puts "Config: #{path}"
- puts " Exists: #{File.exist?(path)}"
- if File.exist?(path)
- config = Gemba.user_config
- puts " Scale: #{config.scale}"
- puts " Volume: #{config.volume}"
- puts " Muted: #{config.muted?}"
- puts " Locale: #{config.locale}"
- puts " Show FPS: #{config.show_fps?}"
- puts " Turbo speed: #{config.turbo_speed}"
- end
- end
-
- # --- version subcommand ---
-
- def self.run_version(_argv, dry_run: false)
- result = { command: :version, version: Gemba::VERSION }
- return result if dry_run
-
- puts "gemba #{Gemba::VERSION}"
- end
-
- # --- patch subcommand ---
-
- def self.parse_patch(argv)
- options = {}
-
- parser = OptionParser.new do |o|
- o.banner = "Usage: gemba patch [options] ROM_FILE PATCH_FILE"
- o.separator ""
- o.separator "Apply an IPS, BPS, or UPS patch to a ROM file."
- o.separator ""
- o.separator "The output file is written to --output or, by default, next to the ROM."
- o.separator "If the output path already exists, -(2), -(3) etc. are appended."
- o.separator ""
-
- o.on("-o", "--output PATH", "Output ROM path") do |v|
- options[:output] = File.expand_path(v)
- end
-
- o.on("-h", "--help", "Show this help") do
- options[:help] = true
- end
- end
-
- parser.parse!(argv)
- options[:rom] = File.expand_path(argv[0]) if argv[0]
- options[:patch] = File.expand_path(argv[1]) if argv[1]
- options[:parser] = parser
- options
- end
-
- def self.run_patch(argv, dry_run: false)
- options = parse_patch(argv)
-
- if options[:help]
- puts options[:parser] unless dry_run
- return { command: :patch, help: true }
- end
-
- unless options[:rom] && options[:patch]
- $stderr.puts "gemba patch: ROM_FILE and PATCH_FILE are required"
- $stderr.puts options[:parser]
- return { command: :patch, error: :missing_args }
- end
-
- rom_path = options[:rom]
- patch_path = options[:patch]
- out_path = if options[:output]
- options[:output]
- else
- ext = File.extname(rom_path)
- base = rom_path.chomp(ext)
- "#{base}-patched#{ext}"
- end
-
- result = { command: :patch, rom: rom_path, patch: patch_path, out: out_path }
- return result if dry_run
-
- require_relative "rom_patcher"
- require_relative "rom_patcher/ips"
- require_relative "rom_patcher/bps"
- require_relative "rom_patcher/ups"
-
- safe_out = RomPatcher.safe_out_path(out_path)
- puts "Patching #{File.basename(rom_path)} with #{File.basename(patch_path)}…"
- RomPatcher.patch(rom_path: rom_path, patch_path: patch_path, out_path: safe_out)
- puts "Written: #{safe_out}"
- end
-
- # --- helpers ---
-
- def self.run_replay_headless(gir_path, options)
- require "gemba/headless"
-
- rom_path = options[:rom]
- unless rom_path
- replayer = Gemba::InputReplayer.new(gir_path)
- rom_path = replayer.rom_path
- unless rom_path
- $stderr.puts "Error: .gir has no rom_path in header; pass ROM_FILE explicitly"
- exit 1
- end
- end
- rom_path = File.expand_path(rom_path)
-
- Gemba::HeadlessPlayer.open(rom_path) do |player|
- if options[:progress]
- replayer = Gemba::InputReplayer.new(gir_path)
- total = replayer.frame_count
- last_print = Process.clock_gettime(Process::CLOCK_MONOTONIC)
-
- player.replay(gir_path) do |_mask, idx|
- now = Process.clock_gettime(Process::CLOCK_MONOTONIC)
- frame = idx + 1
- if frame == total || now - last_print >= 0.5
- pct = frame * 100.0 / total
- $stderr.print "\rReplaying: #{frame}/#{total} (#{'%.1f' % pct}%)\e[K"
- last_print = now
- end
- end
- $stderr.print "\r\e[K"
- else
- player.replay(gir_path)
- end
-
- puts "Replayed #{gir_path} (#{Gemba::InputReplayer.new(gir_path).frame_count} frames)"
- end
- end
- private_class_method :run_replay_headless
-
- def self.run_replay_gui(gir_path, options)
- require "gemba"
-
- sound = options.fetch(:sound, true)
- ReplayPlayer.new(gir_path,
- sound: sound,
- fullscreen: options[:fullscreen]).run
- end
- private_class_method :run_replay_gui
-
- def self.list_recordings
- require_relative "config"
- require_relative "input_replayer"
-
- dir = Config.default_recordings_dir
- unless File.directory?(dir)
- puts "No recordings directory found at #{dir}"
- return
- end
-
- gir_files = Dir.glob(File.join(dir, '*.gir')).sort
- if gir_files.empty?
- puts "No .gir recordings in #{dir}"
- return
- end
-
- by_rom = {}
- gir_files.each do |path|
- replayer = InputReplayer.new(path)
- key = replayer.game_code || "unknown"
- (by_rom[key] ||= []) << { path: path, frames: replayer.frame_count }
- end
-
- by_rom.each do |game_code, entries|
- puts "#{game_code}:"
- entries.each do |entry|
- puts " #{entry[:path]} (#{entry[:frames]} frames)"
- end
- end
- end
- private_class_method :list_recordings
-
- def self.list_grec_recordings
- require_relative "config"
- require_relative "recorder"
- require_relative "recorder_decoder"
-
- dir = Config.default_recordings_dir
- unless File.directory?(dir)
- puts "No recordings directory found at #{dir}"
- return
- end
-
- grec_files = Dir.glob(File.join(dir, '*.grec')).sort
- if grec_files.empty?
- puts "No .grec recordings in #{dir}"
- return
- end
-
- entries = grec_files.map do |path|
- info = RecorderDecoder.stats(path)
- {
- path: path,
- frames: "#{info[:frame_count]} frames",
- duration: "#{'%.1f' % info[:duration]}s",
- size: format_size(File.size(path))
- }
- end
-
- path_w = entries.map { |e| e[:path].length }.max
- frames_w = entries.map { |e| e[:frames].length }.max
- dur_w = entries.map { |e| e[:duration].length }.max
- size_w = entries.map { |e| e[:size].length }.max
-
- entries.each do |e|
- puts "#{e[:path].ljust(path_w)} #{e[:frames].rjust(frames_w)} #{e[:duration].rjust(dur_w)} #{e[:size].rjust(size_w)}"
- end
- end
- private_class_method :list_grec_recordings
-
- def self.format_size(bytes)
- if bytes >= 1_073_741_824
- "#{'%.1f' % (bytes / 1_073_741_824.0)} GB"
- elsif bytes >= 1_048_576
- "#{'%.1f' % (bytes / 1_048_576.0)} MB"
- else
- "#{'%.1f' % (bytes / 1024.0)} KB"
- end
- end
- private_class_method :format_size
end
end
diff --git a/lib/gemba/cli/commands/config_cmd.rb b/lib/gemba/cli/commands/config_cmd.rb
new file mode 100644
index 0000000..48bb890
--- /dev/null
+++ b/lib/gemba/cli/commands/config_cmd.rb
@@ -0,0 +1,83 @@
+# frozen_string_literal: true
+
+require 'optparse'
+
+module Gemba
+ class CLI
+ module Commands
+ class ConfigCmd
+ def initialize(argv, dry_run: false)
+ @argv = argv
+ @dry_run = dry_run
+ end
+
+ def call
+ options = parse
+
+ if options[:help]
+ puts options[:parser] unless @dry_run
+ return { command: :config, help: true }
+ end
+
+ result = {
+ command: options[:reset] ? :config_reset : :config_show,
+ reset: options[:reset],
+ yes: options[:yes],
+ options: options.except(:parser)
+ }
+ return result if @dry_run
+
+ require "gemba"
+
+ if options[:reset]
+ path = Config.default_path
+ unless File.exist?(path)
+ puts "No config file found at #{path}"
+ return
+ end
+ unless options[:yes]
+ print "Delete #{path}? [y/N] "
+ return unless $stdin.gets&.strip&.downcase == 'y'
+ end
+ Config.reset!(path: path)
+ puts "Deleted #{path}"
+ return
+ end
+
+ path = Config.default_path
+ puts "Config: #{path}"
+ puts " Exists: #{File.exist?(path)}"
+ if File.exist?(path)
+ config = Gemba.user_config
+ puts " Scale: #{config.scale}"
+ puts " Volume: #{config.volume}"
+ puts " Muted: #{config.muted?}"
+ puts " Locale: #{config.locale}"
+ puts " Show FPS: #{config.show_fps?}"
+ puts " Turbo speed: #{config.turbo_speed}"
+ end
+ end
+
+ def parse
+ options = {}
+ argv = @argv.dup
+
+ parser = OptionParser.new do |o|
+ o.banner = "Usage: gemba config [options]"
+ o.separator ""
+ o.separator "Show or reset configuration."
+ o.separator ""
+
+ o.on("--reset", "Delete settings file (keeps saves)") { options[:reset] = true }
+ o.on("-y", "--yes", "Skip confirmation prompts") { options[:yes] = true }
+ o.on("-h", "--help", "Show this help") { options[:help] = true }
+ end
+
+ parser.parse!(argv)
+ options[:parser] = parser
+ options
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gemba/cli/commands/decode.rb b/lib/gemba/cli/commands/decode.rb
new file mode 100644
index 0000000..478fc49
--- /dev/null
+++ b/lib/gemba/cli/commands/decode.rb
@@ -0,0 +1,154 @@
+# frozen_string_literal: true
+
+require 'optparse'
+
+module Gemba
+ class CLI
+ module Commands
+ class Decode
+ def initialize(argv, dry_run: false)
+ @argv = argv
+ @dry_run = dry_run
+ end
+
+ def call
+ options = parse
+
+ if options[:help]
+ puts options[:parser] unless @dry_run
+ return { command: :decode, help: true }
+ end
+
+ if options[:list]
+ list_grec_recordings unless @dry_run
+ return { command: :decode_list }
+ end
+
+ unless options[:grec]
+ list_grec_recordings unless @dry_run
+ return { command: :decode_list }
+ end
+
+ result = {
+ command: options[:stats] ? :decode_stats : :decode,
+ grec: options[:grec],
+ stats: options[:stats],
+ output: options[:output],
+ video_codec: options[:video_codec],
+ audio_codec: options[:audio_codec],
+ scale: options[:scale],
+ ffmpeg_args: options[:ffmpeg_args],
+ options: options.except(:parser)
+ }
+ return result if @dry_run
+
+ require "gemba/headless"
+
+ grec_path = options[:grec]
+
+ if options[:stats]
+ info = RecorderDecoder.stats(grec_path)
+ puts "Recording: #{grec_path}"
+ puts " Frames: #{info[:frame_count]}"
+ puts " Resolution: #{info[:width]}x#{info[:height]}"
+ puts " FPS: #{'%.2f' % info[:fps]}"
+ puts " Duration: #{'%.1f' % info[:duration]}s"
+ puts " Avg change: #{'%.1f' % info[:avg_change_pct]}%/frame"
+ puts " Uncompressed: #{format_size(info[:raw_video_size])} (encode input)"
+ puts " Audio: #{info[:audio_rate]} Hz, #{info[:audio_channels]}ch"
+ return
+ end
+
+ output_path = options[:output] || grec_path.sub(/\.grec\z/, '') + '.mp4'
+ codec_opts = {}
+ codec_opts[:video_codec] = options[:video_codec] if options[:video_codec]
+ codec_opts[:audio_codec] = options[:audio_codec] if options[:audio_codec]
+ codec_opts[:scale] = options[:scale] if options[:scale]
+ codec_opts[:ffmpeg_args] = options[:ffmpeg_args] if options[:ffmpeg_args]
+ codec_opts[:progress] = options.fetch(:progress, true)
+
+ info = RecorderDecoder.decode(grec_path, output_path, **codec_opts)
+ puts "Encoded #{info[:frame_count]} frames " \
+ "(#{info[:width]}x#{info[:height]} @ #{'%.2f' % info[:fps]} fps, " \
+ "avg #{'%.1f' % info[:avg_change_pct]}% change/frame)"
+ puts "Output: #{info[:output_path]}"
+ end
+
+ def parse
+ options = {}
+ argv = @argv.dup
+
+ parser = OptionParser.new do |o|
+ o.banner = "Usage: gemba decode [options] GREC_FILE [-- FFMPEG_ARGS...]"
+ o.separator ""
+ o.separator "Encode a .grec recording to a playable video via ffmpeg."
+ o.separator "Args after -- replace the default codec flags."
+ o.separator ""
+
+ o.on("-o", "--output PATH", "Output path (default: INPUT.mp4)") { |v| options[:output] = v }
+ o.on("--video-codec CODEC", "Video codec (default: libx264)") { |v| options[:video_codec] = v }
+ o.on("--audio-codec CODEC", "Audio codec (default: aac)") { |v| options[:audio_codec] = v }
+ o.on("-s", "--scale N", Integer, "Scale factor (default: native)") { |v| options[:scale] = v.clamp(1, 10) }
+ o.on("-l", "--list", "List available .grec recordings") { options[:list] = true }
+ o.on("--stats", "Show recording stats (no ffmpeg needed)") { options[:stats] = true }
+ o.on("--no-progress", "Disable progress indicator") { options[:progress] = false }
+ o.on("-h", "--help", "Show this help") { options[:help] = true }
+ end
+
+ parser.parse!(argv)
+ options[:grec] = argv.shift
+ options[:ffmpeg_args] = argv unless argv.empty?
+ options[:parser] = parser
+ options
+ end
+
+ private
+
+ def list_grec_recordings
+ require "gemba/headless"
+
+ dir = Config.default_recordings_dir
+ unless File.directory?(dir)
+ puts "No recordings directory found at #{dir}"
+ return
+ end
+
+ grec_files = Dir.glob(File.join(dir, '*.grec')).sort
+ if grec_files.empty?
+ puts "No .grec recordings in #{dir}"
+ return
+ end
+
+ entries = grec_files.map do |path|
+ info = RecorderDecoder.stats(path)
+ {
+ path: path,
+ frames: "#{info[:frame_count]} frames",
+ duration: "#{'%.1f' % info[:duration]}s",
+ size: format_size(File.size(path))
+ }
+ end
+
+ path_w = entries.map { |e| e[:path].length }.max
+ frames_w = entries.map { |e| e[:frames].length }.max
+ dur_w = entries.map { |e| e[:duration].length }.max
+ size_w = entries.map { |e| e[:size].length }.max
+
+ entries.each do |e|
+ puts "#{e[:path].ljust(path_w)} #{e[:frames].rjust(frames_w)} #{e[:duration].rjust(dur_w)} #{e[:size].rjust(size_w)}"
+ end
+ end
+
+ def format_size(bytes)
+ if bytes >= 1_073_741_824
+ "#{'%.1f' % (bytes / 1_073_741_824.0)} GB"
+ elsif bytes >= 1_048_576
+ "#{'%.1f' % (bytes / 1_048_576.0)} MB"
+ else
+ "#{'%.1f' % (bytes / 1024.0)} KB"
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gemba/cli/commands/patch.rb b/lib/gemba/cli/commands/patch.rb
new file mode 100644
index 0000000..3b6ce04
--- /dev/null
+++ b/lib/gemba/cli/commands/patch.rb
@@ -0,0 +1,78 @@
+# frozen_string_literal: true
+
+require 'optparse'
+
+module Gemba
+ class CLI
+ module Commands
+ class Patch
+ def initialize(argv, dry_run: false)
+ @argv = argv
+ @dry_run = dry_run
+ end
+
+ def call
+ options = parse
+
+ if options[:help]
+ puts options[:parser] unless @dry_run
+ return { command: :patch, help: true }
+ end
+
+ unless options[:rom] && options[:patch]
+ $stderr.puts "gemba patch: ROM_FILE and PATCH_FILE are required"
+ $stderr.puts options[:parser]
+ return { command: :patch, error: :missing_args }
+ end
+
+ rom_path = options[:rom]
+ patch_path = options[:patch]
+ out_path = if options[:output]
+ options[:output]
+ else
+ ext = File.extname(rom_path)
+ base = rom_path.chomp(ext)
+ "#{base}-patched#{ext}"
+ end
+
+ result = { command: :patch, rom: rom_path, patch: patch_path, out: out_path }
+ return result if @dry_run
+
+ require "gemba/rom_patcher"
+ require "gemba/rom_patcher/ips"
+ require "gemba/rom_patcher/bps"
+ require "gemba/rom_patcher/ups"
+
+ safe_out = RomPatcher.safe_out_path(out_path)
+ puts "Patching #{File.basename(rom_path)} with #{File.basename(patch_path)}…"
+ RomPatcher.patch(rom_path: rom_path, patch_path: patch_path, out_path: safe_out)
+ puts "Written: #{safe_out}"
+ end
+
+ def parse
+ options = {}
+ argv = @argv.dup
+
+ parser = OptionParser.new do |o|
+ o.banner = "Usage: gemba patch [options] ROM_FILE PATCH_FILE"
+ o.separator ""
+ o.separator "Apply an IPS, BPS, or UPS patch to a ROM file."
+ o.separator ""
+ o.separator "The output file is written to --output or, by default, next to the ROM."
+ o.separator "If the output path already exists, -(2), -(3) etc. are appended."
+ o.separator ""
+
+ o.on("-o", "--output PATH", "Output ROM path") { |v| options[:output] = File.expand_path(v) }
+ o.on("-h", "--help", "Show this help") { options[:help] = true }
+ end
+
+ parser.parse!(argv)
+ options[:rom] = File.expand_path(argv[0]) if argv[0]
+ options[:patch] = File.expand_path(argv[1]) if argv[1]
+ options[:parser] = parser
+ options
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gemba/cli/commands/play.rb b/lib/gemba/cli/commands/play.rb
new file mode 100644
index 0000000..0786f6b
--- /dev/null
+++ b/lib/gemba/cli/commands/play.rb
@@ -0,0 +1,78 @@
+# frozen_string_literal: true
+
+require 'optparse'
+
+module Gemba
+ class CLI
+ module Commands
+ class Play
+ def initialize(argv, dry_run: false)
+ @argv = argv
+ @dry_run = dry_run
+ end
+
+ def call
+ options = parse
+
+ if options[:help]
+ puts options[:parser] unless @dry_run
+ return { command: :play, help: true }
+ end
+
+ result = {
+ command: :play,
+ rom: options[:rom],
+ sound: options.fetch(:sound, true),
+ fullscreen: options[:fullscreen],
+ options: options.except(:parser)
+ }
+ return result if @dry_run
+
+ require "gemba"
+
+ apply(Gemba.user_config, options)
+ Gemba.load_locale if options[:locale]
+ Gemba::AppController.new(result[:rom], sound: result[:sound], fullscreen: result[:fullscreen]).run
+ end
+
+ def parse
+ options = {}
+ argv = @argv.dup
+
+ parser = OptionParser.new do |o|
+ o.banner = "Usage: gemba [play] [options] [ROM_FILE]"
+ o.separator ""
+ o.separator "Launch the GBA emulator. ROM_FILE is optional."
+ o.separator ""
+
+ o.on("-s", "--scale N", Integer, "Window scale (1-4)") { |v| options[:scale] = v.clamp(1, 4) }
+ o.on("-v", "--volume N", Integer, "Volume (0-100)") { |v| options[:volume] = v.clamp(0, 100) }
+ o.on("-m", "--mute", "Start muted") { options[:mute] = true }
+ o.on("--no-sound", "Disable audio entirely") { options[:sound] = false }
+ o.on("-f", "--fullscreen", "Start in fullscreen") { options[:fullscreen] = true }
+ o.on("--show-fps", "Show FPS counter") { options[:show_fps] = true }
+ o.on("--turbo-speed N", Integer, "Fast-forward speed (0=uncapped, 2-4)") { |v| options[:turbo_speed] = v.clamp(0, 4) }
+ o.on("--bios PATH", "Path to GBA BIOS file (overrides saved setting)") { |v| options[:bios] = File.expand_path(v) }
+ o.on("--locale LANG", "Language (en, ja, auto)") { |v| options[:locale] = v }
+ o.on("-h", "--help", "Show this help") { options[:help] = true }
+ end
+
+ parser.parse!(argv)
+ options[:rom] = File.expand_path(argv.first) if argv.first
+ options[:parser] = parser
+ options
+ end
+
+ def apply(config, options)
+ config.scale = options[:scale] if options[:scale]
+ config.volume = options[:volume] if options[:volume]
+ config.muted = true if options[:mute]
+ config.show_fps = true if options[:show_fps]
+ config.turbo_speed = options[:turbo_speed] if options[:turbo_speed]
+ config.locale = options[:locale] if options[:locale]
+ config.bios_path = options[:bios] if options[:bios]
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gemba/cli/commands/record.rb b/lib/gemba/cli/commands/record.rb
new file mode 100644
index 0000000..518b1d0
--- /dev/null
+++ b/lib/gemba/cli/commands/record.rb
@@ -0,0 +1,114 @@
+# frozen_string_literal: true
+
+require 'optparse'
+
+module Gemba
+ class CLI
+ module Commands
+ class Record
+ def initialize(argv, dry_run: false)
+ @argv = argv
+ @dry_run = dry_run
+ end
+
+ def call
+ options = parse
+
+ if options[:help]
+ puts options[:parser] unless @dry_run
+ return { command: :record, help: true }
+ end
+
+ unless options[:frames] && options[:rom]
+ $stderr.puts "Error: record requires --frames N and a ROM file"
+ $stderr.puts "Run 'gemba record --help' for usage"
+ exit 1
+ end
+
+ result = {
+ command: :record,
+ rom: options[:rom],
+ frames: options[:frames],
+ output: options[:output],
+ compression: options[:compression],
+ progress: options[:progress],
+ options: options.except(:parser)
+ }
+ return result if @dry_run
+
+ require "gemba/headless"
+
+ total = options[:frames]
+
+ HeadlessPlayer.open(options[:rom]) do |player|
+ rec_path = options[:output] ||
+ "#{Config.rom_id(player.game_code, player.checksum)}.grec"
+
+ rec_opts = {}
+ rec_opts[:compression] = options[:compression] if options[:compression]
+ player.start_recording(rec_path, **rec_opts)
+
+ if options[:progress]
+ last_print = Process.clock_gettime(Process::CLOCK_MONOTONIC)
+ player.step(total) do |frame|
+ now = Process.clock_gettime(Process::CLOCK_MONOTONIC)
+ if frame == total || now - last_print >= 0.5
+ pct = frame * 100.0 / total
+ $stderr.print "\rRecording: #{frame}/#{total} (#{'%.1f' % pct}%)\e[K"
+ last_print = now
+ end
+ end
+ $stderr.print "\r\e[K"
+ else
+ player.step(total)
+ end
+
+ player.stop_recording
+
+ info = RecorderDecoder.stats(rec_path)
+ puts "Recorded #{info[:frame_count]} frames to #{rec_path}"
+ puts " Duration: #{'%.1f' % info[:duration]}s"
+ puts " Avg change: #{'%.1f' % info[:avg_change_pct]}%/frame"
+ puts " Uncompressed: #{format_size(info[:raw_video_size])} (encode input)"
+ puts " .grec size: #{format_size(File.size(rec_path))}"
+ end
+ end
+
+ def parse
+ options = {}
+ argv = @argv.dup
+
+ parser = OptionParser.new do |o|
+ o.banner = "Usage: gemba record [options] ROM_FILE"
+ o.separator ""
+ o.separator "Record video+audio to a .grec file (headless, no GUI)."
+ o.separator ""
+
+ o.on("--frames N", Integer, "Number of frames to record (required)") { |v| options[:frames] = v }
+ o.on("-o", "--output PATH", "Output .grec path (default: ROM_ID.grec)") { |v| options[:output] = v }
+ o.on("-c", "--compression N", Integer, "Zlib level 1-9 (default: 1)") { |v| options[:compression] = v.clamp(1, 9) }
+ o.on("--progress", "Show recording progress") { options[:progress] = true }
+ o.on("-h", "--help", "Show this help") { options[:help] = true }
+ end
+
+ parser.parse!(argv)
+ options[:rom] = File.expand_path(argv.first) if argv.first
+ options[:parser] = parser
+ options
+ end
+
+ private
+
+ def format_size(bytes)
+ if bytes >= 1_073_741_824
+ "#{'%.1f' % (bytes / 1_073_741_824.0)} GB"
+ elsif bytes >= 1_048_576
+ "#{'%.1f' % (bytes / 1_048_576.0)} MB"
+ else
+ "#{'%.1f' % (bytes / 1024.0)} KB"
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gemba/cli/commands/replay.rb b/lib/gemba/cli/commands/replay.rb
new file mode 100644
index 0000000..1f8dccd
--- /dev/null
+++ b/lib/gemba/cli/commands/replay.rb
@@ -0,0 +1,161 @@
+# frozen_string_literal: true
+
+require 'optparse'
+
+module Gemba
+ class CLI
+ module Commands
+ class Replay
+ def initialize(argv, dry_run: false)
+ @argv = argv
+ @dry_run = dry_run
+ end
+
+ def call
+ options = parse
+
+ if options[:help]
+ puts options[:parser] unless @dry_run
+ return { command: :replay, help: true }
+ end
+
+ if options[:list]
+ list_recordings unless @dry_run
+ return { command: :replay_list }
+ end
+
+ unless options[:gir]
+ $stderr.puts "Error: replay requires a .gir file"
+ $stderr.puts "Run 'gemba replay --help' for usage"
+ exit 1
+ end
+
+ gir_path = File.expand_path(options[:gir])
+
+ result = {
+ command: options[:headless] ? :replay_headless : :replay,
+ gir: gir_path,
+ rom: options[:rom],
+ sound: options.fetch(:sound, true),
+ fullscreen: options[:fullscreen],
+ headless: options[:headless],
+ progress: options[:progress],
+ options: options.except(:parser)
+ }
+ return result if @dry_run
+
+ if options[:headless]
+ run_headless(gir_path, options)
+ else
+ run_gui(gir_path, options)
+ end
+ end
+
+ def parse
+ options = {}
+ argv = @argv.dup
+
+ parser = OptionParser.new do |o|
+ o.banner = "Usage: gemba replay [options] GIR_FILE [ROM_FILE]"
+ o.separator ""
+ o.separator "Replay a .gir input recording."
+ o.separator "ROM is read from the .gir header; override with ROM_FILE."
+ o.separator ""
+
+ o.on("-l", "--list", "List available .gir recordings") { options[:list] = true }
+ o.on("--headless", "Run without GUI (print summary and exit)") { options[:headless] = true }
+ o.on("--progress", "Show progress (headless only)") { options[:progress] = true }
+ o.on("-f", "--fullscreen", "Start in fullscreen") { options[:fullscreen] = true }
+ o.on("--no-sound", "Disable audio") { options[:sound] = false }
+ o.on("-h", "--help", "Show this help") { options[:help] = true }
+ end
+
+ parser.parse!(argv)
+ options[:gir] = argv.shift
+ options[:rom] = argv.shift
+ options[:parser] = parser
+ options
+ end
+
+ private
+
+ def run_headless(gir_path, options)
+ require "gemba/headless"
+
+ rom_path = options[:rom]
+ unless rom_path
+ replayer = Gemba::InputReplayer.new(gir_path)
+ rom_path = replayer.rom_path
+ unless rom_path
+ $stderr.puts "Error: .gir has no rom_path in header; pass ROM_FILE explicitly"
+ exit 1
+ end
+ end
+ rom_path = File.expand_path(rom_path)
+
+ Gemba::HeadlessPlayer.open(rom_path) do |player|
+ if options[:progress]
+ replayer = Gemba::InputReplayer.new(gir_path)
+ total = replayer.frame_count
+ last_print = Process.clock_gettime(Process::CLOCK_MONOTONIC)
+
+ player.replay(gir_path) do |_mask, idx|
+ now = Process.clock_gettime(Process::CLOCK_MONOTONIC)
+ frame = idx + 1
+ if frame == total || now - last_print >= 0.5
+ pct = frame * 100.0 / total
+ $stderr.print "\rReplaying: #{frame}/#{total} (#{'%.1f' % pct}%)\e[K"
+ last_print = now
+ end
+ end
+ $stderr.print "\r\e[K"
+ else
+ player.replay(gir_path)
+ end
+
+ puts "Replayed #{gir_path} (#{Gemba::InputReplayer.new(gir_path).frame_count} frames)"
+ end
+ end
+
+ def run_gui(gir_path, options)
+ require "gemba"
+
+ sound = options.fetch(:sound, true)
+ ReplayPlayer.new(gir_path,
+ sound: sound,
+ fullscreen: options[:fullscreen]).run
+ end
+
+ def list_recordings
+ require "gemba/headless"
+
+ dir = Config.default_recordings_dir
+ unless File.directory?(dir)
+ puts "No recordings directory found at #{dir}"
+ return
+ end
+
+ gir_files = Dir.glob(File.join(dir, '*.gir')).sort
+ if gir_files.empty?
+ puts "No .gir recordings in #{dir}"
+ return
+ end
+
+ by_rom = {}
+ gir_files.each do |path|
+ replayer = InputReplayer.new(path)
+ key = replayer.game_code || "unknown"
+ (by_rom[key] ||= []) << { path: path, frames: replayer.frame_count }
+ end
+
+ by_rom.each do |game_code, entries|
+ puts "#{game_code}:"
+ entries.each do |entry|
+ puts " #{entry[:path]} (#{entry[:frames]} frames)"
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gemba/cli/commands/retro_achievements.rb b/lib/gemba/cli/commands/retro_achievements.rb
new file mode 100644
index 0000000..4f9f923
--- /dev/null
+++ b/lib/gemba/cli/commands/retro_achievements.rb
@@ -0,0 +1,213 @@
+# frozen_string_literal: true
+
+require 'optparse'
+
+module Gemba
+ class CLI
+ module Commands
+ class RetroAchievements
+ RA_SUBCOMMANDS = %w[login verify logout achievements].freeze
+
+ def initialize(argv, dry_run: false, config: nil, requester: nil)
+ @argv = argv
+ @dry_run = dry_run
+ @config = config
+ @requester = requester
+ end
+
+ def call
+ options = parse
+
+ if options[:help] || options[:subcommand].nil?
+ puts options[:parser] unless @dry_run
+ return { command: :ra, help: true, subcommand: options[:subcommand] }
+ end
+
+ result = { command: :"ra_#{options[:subcommand]}", **options.except(:parser) }
+ return result if @dry_run
+
+ require "gemba"
+ require "gemba/achievements/retro_achievements/cli_sync_requester"
+
+ config = @config || Gemba.user_config
+ requester = @requester || Gemba::Achievements::RetroAchievements::CliSyncRequester.new
+
+ case options[:subcommand]
+ when :login then login(options, config: config, requester: requester)
+ when :verify then verify( config: config, requester: requester)
+ when :logout then logout( config: config)
+ when :achievements then achievements(options, config: config, requester: requester)
+ end
+ end
+
+ def parse
+ argv = @argv.dup
+ sub = RA_SUBCOMMANDS.include?(argv.first) ? argv.shift.to_sym : nil
+
+ options = { subcommand: sub }
+
+ parser = OptionParser.new do |o|
+ case sub
+ when :login
+ o.banner = "Usage: gemba ra login --username USER [--password PASS]"
+ o.separator ""
+ o.separator "Log in to RetroAchievements and save credentials."
+ o.separator "Prompts for password if --password is not given."
+ o.separator ""
+ o.on("--username USER", "RetroAchievements username") { |v| options[:username] = v }
+ o.on("--password PASS", "Password (prompts if omitted)") { |v| options[:password] = v }
+ when :verify
+ o.banner = "Usage: gemba ra verify"
+ o.separator ""
+ o.separator "Verify stored RetroAchievements credentials are still valid."
+ o.separator ""
+ when :logout
+ o.banner = "Usage: gemba ra logout"
+ o.separator ""
+ o.separator "Clear stored RetroAchievements credentials."
+ o.separator ""
+ when :achievements
+ o.banner = "Usage: gemba ra achievements --rom PATH [--json]"
+ o.separator ""
+ o.separator "List achievements for a ROM."
+ o.separator ""
+ o.on("--rom PATH", "Path to the GBA ROM file") { |v| options[:rom] = File.expand_path(v) }
+ o.on("--json", "Output as JSON") { options[:json] = true }
+ else
+ o.banner = "Usage: gemba ra [options]"
+ o.separator ""
+ o.separator "Subcommands: #{RA_SUBCOMMANDS.join(', ')}"
+ o.separator ""
+ end
+ o.on("-h", "--help", "Show this help") { options[:help] = true }
+ end
+
+ parser.parse!(argv)
+ options[:parser] = parser
+ options
+ end
+
+ private
+
+ def login(options, config:, requester:)
+ username = options[:username]
+ unless username
+ $stderr.puts "Error: --username USER is required"
+ $stderr.puts "Run 'gemba ra login --help' for usage"
+ exit 1
+ end
+
+ password = options[:password] || begin
+ require "io/console"
+ $stderr.print "Password: "
+ pwd = $stdin.noecho(&:gets)&.chomp
+ $stderr.puts
+ pwd
+ end
+
+ backend = Gemba::Achievements::RetroAchievements::Backend.new(
+ app: nil, requester: requester
+ )
+ result = nil
+ backend.on_auth_change { |status, payload| result = [status, payload] }
+ backend.login_with_password(username: username, password: password)
+
+ if result&.first == :ok
+ config.ra_username = username
+ config.ra_token = result[1]
+ config.ra_enabled = true
+ config.save!
+ puts "Logged in as #{username}"
+ else
+ $stderr.puts "Login failed: #{result&.[](1) || 'unknown error'}"
+ exit 1
+ end
+ end
+
+ def verify(config:, requester:)
+ username = config.ra_username
+ token = config.ra_token
+
+ if username.empty? || token.empty?
+ $stderr.puts "Not logged in. Run: gemba ra login --username USER"
+ exit 1
+ end
+
+ backend = Gemba::Achievements::RetroAchievements::Backend.new(
+ app: nil, requester: requester
+ )
+ result = nil
+ backend.on_auth_change { |status, _| result = status }
+ backend.login_with_token(username: username, token: token)
+
+ if result == :ok
+ puts "Token valid for #{username}"
+ else
+ $stderr.puts "Token invalid or expired. Run: gemba ra login --username USER"
+ exit 1
+ end
+ end
+
+ def logout(config:)
+ config.ra_username = ""
+ config.ra_token = ""
+ config.ra_enabled = false
+ config.save!
+ puts "Logged out"
+ end
+
+ def achievements(options, config:, requester:)
+ username = config.ra_username
+ token = config.ra_token
+
+ if username.empty? || token.empty?
+ $stderr.puts "Not logged in. Run: gemba ra login --username USER"
+ exit 1
+ end
+
+ unless options[:rom]
+ $stderr.puts "Error: --rom PATH is required"
+ $stderr.puts "Run 'gemba ra achievements --help' for usage"
+ exit 1
+ end
+
+ require "digest"
+
+ backend = Gemba::Achievements::RetroAchievements::Backend.new(
+ app: nil, requester: requester
+ )
+ backend.login_with_token(username: username, token: token)
+
+ rom_path = options[:rom]
+ md5 = Digest::MD5.file(rom_path).hexdigest
+ rom_info = Struct.new(:md5, :title).new(md5, File.basename(rom_path, ".*"))
+
+ list = nil
+ backend.fetch_for_display(rom_info: rom_info) { |result| list = result }
+
+ if list.nil?
+ $stderr.puts "No achievements found (game not recognized by RetroAchievements)"
+ exit 1
+ end
+
+ if options[:json]
+ require "json"
+ puts JSON.generate(list.map { |a|
+ { id: a.id, title: a.title, description: a.description,
+ points: a.points, earned: a.earned?, earned_at: a.earned_at }
+ })
+ else
+ earned = list.count(&:earned?)
+ puts "#{earned}/#{list.size} achievements — #{rom_info.title}"
+ puts
+ list.each do |a|
+ mark = a.earned? ? "X" : " "
+ puts " [#{mark}] #{a.title} (#{a.points}pts)"
+ puts " #{a.description}"
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gemba/cli/commands/version.rb b/lib/gemba/cli/commands/version.rb
new file mode 100644
index 0000000..3b95f34
--- /dev/null
+++ b/lib/gemba/cli/commands/version.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+require 'gemba/version'
+
+module Gemba
+ class CLI
+ module Commands
+ class Version
+ def initialize(argv, dry_run: false)
+ @dry_run = dry_run
+ end
+
+ def call
+ result = { command: :version, version: Gemba::VERSION }
+ return result if @dry_run
+
+ puts "gemba #{Gemba::VERSION}"
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gemba/config.rb b/lib/gemba/config.rb
index 7c4bcec..587848b 100644
--- a/lib/gemba/config.rb
+++ b/lib/gemba/config.rb
@@ -52,6 +52,12 @@ class Config
'log_level' => 'info',
'bios_path' => nil,
'skip_bios' => false,
+ 'ra_enabled' => false,
+ 'ra_username' => '',
+ 'ra_token' => '',
+ 'ra_hardcore' => false,
+ 'ra_unofficial' => false,
+ 'ra_rich_presence' => false,
}.freeze
# Settings that can be overridden per ROM. Maps config key → locale key.
@@ -67,6 +73,7 @@ class Config
'turbo_speed' => 'settings.turbo_speed',
'quick_save_slot' => 'settings.quick_save_slot',
'save_state_backup' => 'settings.keep_backup',
+ 'ra_rich_presence' => 'settings.ra_rich_presence',
}.freeze
PER_GAME_KEYS = PER_GAME_SETTINGS.keys.to_set.freeze
@@ -132,6 +139,14 @@ def initialize(path: nil, subscribe: true)
subscribe_to_bus if subscribe
end
+ # Re-wire bus subscriptions onto the current Gemba.bus.
+ # Called by AppController after it creates a fresh EventBus, because the
+ # Config may have been instantiated earlier (e.g. by the CLI) and subscribed
+ # to whatever bus existed at that time (possibly nil).
+ def resubscribe
+ subscribe_to_bus
+ end
+
# @return [String] path to the config file
attr_accessor :path
@@ -431,6 +446,56 @@ def log_level=(val)
global['log_level'] = val.to_s
end
+ # -- RetroAchievements ----------------------------------------------------
+
+ def ra_enabled?
+ global['ra_enabled']
+ end
+
+ def ra_enabled=(val)
+ global['ra_enabled'] = val ? true : false
+ end
+
+ def ra_username
+ global['ra_username'] || ''
+ end
+
+ def ra_username=(val)
+ global['ra_username'] = val.to_s
+ end
+
+ def ra_token
+ global['ra_token'] || ''
+ end
+
+ def ra_token=(val)
+ global['ra_token'] = val.to_s
+ end
+
+ def ra_hardcore?
+ global['ra_hardcore']
+ end
+
+ def ra_hardcore=(val)
+ global['ra_hardcore'] = val ? true : false
+ end
+
+ def ra_unofficial?
+ global['ra_unofficial']
+ end
+
+ def ra_unofficial=(val)
+ global['ra_unofficial'] = val ? true : false
+ end
+
+ def ra_rich_presence?
+ global['ra_rich_presence']
+ end
+
+ def ra_rich_presence=(val)
+ global['ra_rich_presence'] = val ? true : false
+ end
+
# @return [String] directory for .grec recording files
def recordings_dir
global['recordings_dir'] || self.class.default_recordings_dir
@@ -608,6 +673,11 @@ def self.boxart_dir
File.join(config_dir, 'boxart')
end
+ # @return [String] directory for cached RA achievement lists (one JSON per rom_id)
+ def self.achievements_cache_dir
+ File.join(config_dir, 'achievements')
+ end
+
# @return [String] default directory for patched ROMs
def self.default_patches_dir
File.join(config_dir, 'patches')
diff --git a/lib/gemba/data/gb_md5.json b/lib/gemba/data/gb_md5.json
new file mode 100644
index 0000000..7643917
--- /dev/null
+++ b/lib/gemba/data/gb_md5.json
@@ -0,0 +1 @@
+{"003417c3bef9a0d3a801d8ae5199c4fd":"Home Alone 2 - Kevin's Dream (USA) (Proto)","00378c0ae45e106454346d4874c0e041":"SD Hiryuu no Ken Gaiden 2 (Japan) (SGB Enhanced)","003943c85b2332615386dcc4810248ba":"Palamedes (USA) (Proto)","00408b7c09c99b8ea15b8ebb66e69130":"Spy vs Spy - Operation Boobytrap (USA)","0040b5bd11a936063a0dc9a30b9a8727":"Pagemaster, The (USA) (SGB Enhanced)","0068d12e8a75cf18b9d0b34ffcbd119b":"Jungle Wars (Japan)","008ea3be93c0e1d808431dc8728e01f6":"Kaisen Game - Navyblue 90 (Japan)","009aea0ac7f214ff6f3c8c070d4a6421":"Goal! (USA)","011b74bbfe8b5268416f488b60263f3c":"Dennis (Europe) (Beta)","01214c42aa62b421e7cef6b3e4511a5f":"Championship Pool (USA)","0127c54d0bd22db6ecda3796e68861c6":"Spider-Man 3 - Invasion of the Spider-Slayers (USA, Europe) (Beta 2)","012ee0a196c03cca91a43a9eadbecfb6":"Altered Space - A 3-D Alien Adventure (USA)","016c0eece553cc6114b115ca805dbef1":"Little Tales of Alexandria, The - Mr Meows Dance Party! (World) (MBC5) (SGB Enhanced) (Batteryless)","017ace47f4970576043075f7ba86073c":"Legend of Prince Valiant, The (Europe) (En,Fr,De)","019db3e93fa9583a04366a4e4597c618":"Rubble Saver II (Japan) (En)","01c580d873fd929b8a47837a0c6f91ff":"Cave Fighter (World)","01dedf212717562bbc2730a4f5947cd4":"Mikeneko Holmes no Kishidou (Japan)","02069fbf36f31f5d01adc1ac4d9d0770":"Lawnmower Man, The (USA) (Proto 2)","0221de99d11f50f79430c8ff9b430994":"Teenage Mutant Ninja Turtles II - Back from the Sewers (USA)","022f61999868aa209e0a2f66ba4ee710":"Choplifter II (Japan) (En)","022fd2b0cbaac8c7551a7db1cc861f5b":"Taiyou no Tenshi Marlowe - Ohanabatake wa Dai-panic (Japan)","023a8fd8eacad0656b5110da26dcdd44":"Battle Unit Zeoth (USA, Europe)","0263b14f7089bf543c4a8016d1597840":"Treasure Island (World)","026d4ae446271173ce797e93e8cff4b5":"Kuusou Kagaku Sekai Gulliver Boy - Kuusou Kagaku Puzzle Purittopon!! (Japan) (SGB Enhanced)","0281fd8061d82472e242954513805196":"Dr. Mario (World)","02d7df9a5ac5d859672b56be46343be1":"Xenon 2 (USA, Europe)","0325e6464931dce2a777635e71eee877":"TwinBee da!! (Japan)","033c219483ec7766517c94635b3a43f8":"Getaway, The - High Speed II (USA)","035d06c80ccbbf2d7ff49a4d5b98301e":"Rhythm Land (World) (v1.0.1)","037fcc5f7d7750b9dfd1c8946b64cf4f":"Shin Nihon Pro Wrestling - Toukon Sanjuushi (Japan)","038ba19b06f5d3b56e9bda495b609c54":"Tiny Toon Adventures - Wacky Sports (USA)","0397dd31e902a4a04f04b847ad21317d":"Cool Hand (Europe)","03be859e5b1448e7508aa4d83b424f07":"Dropzone (Europe) (Beta)","03c6d84a951be6703b7458478f4277b9":"Batman - The Video Game (World)","03ce24437224ff296a71f402663a0ee9":"Castle Quest (Europe)","040056615586a58260910fc9f7cb7f30":"Do I Pass (World) (En) (v1.5)","040a7f4b500fb47dc5896cc52128940f":"Super 69 in 1 (Europe)","0434a1320607ce8e79de69b10c7a1245":"Bart no Survival Camp (Japan) (En)","044c71562429da60891a93a131a0304a":"Battle of Olympus, The (Europe) (En,Fr,De,Es,It)","046fcc2d70cc6c9195c166f862ef4745":"ever - Lucid Space Program (World)","047215bf30c78267d37c26006a22ef92":"Die And Retry (World)","0482efb6afa8ef213f7fe92510ca3ade":"Goukaku Boy GOLD - Shikakui Atama o Maruku Suru - Zukei no Tatsujin (Japan)","04a6e77d1fabcbe325882e4bd79d6d4b":"Choplifter III (Europe)","04aedaba42fdb90f6226b7f9a0b9319f":"4 in 1 (Europe) (4B-007, Sachen)","04bde16beda3f9d7cec4509a04a75946":"Stargate (USA, Europe)","04c358cbb32898d5e8feed8bc0fe27ff":"Downtown - Nekketsu Koushinkyoku - Dokodemo Daiundoukai (Japan)","04ccc6858164bc24c4eb0e6469164dc0":"Teenage Mutant Ninja Turtles 2 (Japan) (En) (Cowabunga Collection, The)","04ec032cd1f6dab8f7737d422d129c70":"Mini 4 Boy (Japan) (SGB Enhanced)","052bd7a432452c0e811d1ea8bb6d9b21":"Pro Mahjong Kiwame GB (Japan) (SGB Enhanced)","05919b282f38abb78c82740733f4df79":"Super Chinese Land (Japan)","05abf83f5e7c30675801ec0d7648e03f":"Money Idol Exchanger (Japan) (SGB Enhanced)","05ba7f165dab1ffd49b63b4f5c704c02":"Faceball 2000 (USA)","05c256d964e31bd02a23f27e812cfd78":"Star Sweep (Japan) (SGB Enhanced)","05d5cf3404868efc22ac06e22ab5ba89":"Pop'n TwinBee (Europe)","05f432506ab629713f40b8d5fc3a5098":"Mega Man III (USA) (Sample)","05f5f5534c0d7e8100edf07a494f16e8":"Doraemon no Study Boy 3 - Ku Ku Master (Japan)","05f7b63c25b4871440968fd4ce25440a":"Star Wars - The Empire Strikes Back (USA)","060caa70249d12da3cf53d6d48323b08":"Gluecksrad (Germany)","0611b365116b22c1aaa7e3ce4faed5ed":"Home Alone 2 - Lost in New York (USA, Europe)","0631158ead23bfed84cd3a5010eb9295":"Micro Machines (USA, Europe)","066c7301810022d1232386b4eeab6de3":"Gauntlet II (USA, Europe) (Beta)","067d21b969c06ae9d9376106b91fb374":"Triumph (USA) (Proto)","06ad6e6281b355040575aad2ee22c9a6":"Zen-Nihon Pro Wrestling Jet (Japan) (SGB Enhanced)","06b75e657debd1568f18d369cc2422dd":"Magic Knight Rayearth (Japan) (SGB Enhanced)","06e7b8ce1781560c482d5f935c56a5bb":"Hammerin' Harry - Ghost Building Company (USA) (Proto)","07006fe2f7363d475e34fbf63e4e94d1":"WWF Superstars 2 (USA, Europe)","0713854b6893ed13a6edd19ea94b6caa":"Stick Man Guy (World)","072e25973dc896758749c55d2698be88":"Smurfs Travel the World, The (Europe) (En,Fr,De,Es)","073e6a0f2fdae655760aaf6db81da3b2":"Puzzle Nintama Rantarou GB (Japan) (SGB Enhanced)","073f048ebea0012bca0649ed1277078d":"Urusei Yatsura - Miss Tomobiki o Sagase! (Japan)","07b7e552a4100eba61a6415c4c897542":"Little Tales of Alexandria, The - Mr Meows Dance Party! (World) (MBC3) (SGB Enhanced) (Batteryless)","07c383f24c790b204a24c0c0164bbb49":"Makai Toushi Sa-Ga (World) (Ja) (Rev 1) (Collection of SaGa)","0841a527b116a52ad26de023b20b1a42":"Ghostbusters II (USA, Europe)","084bd732797939ad697b9a3d51f01ba4":"Rewind Time (World)","084f1e457749cdec86183189bd88ce69":"Tetris (Japan) (En)","08b5ea1083e8e62b5bf7a75823fe5b33":"Tesserae (Europe) (En,Fr,De,Es,It)","08c8ef36fd4979e404dfe041adddfca5":"Velious II - Fukushuu no Jashin (Japan)","08db8175b8903f68c3f874e0a39bed39":"Battle Ships (Spain) (En,Fr,De,Es) (Beta)","08f46bb59e52562f08c76f4e6c0040c5":"Arcade Classic No. 3 - Galaga & Galaxian (Europe) (SGB Enhanced)","09066099d74c7398f6f99ea8ccefa479":"Pit-Fighter (USA, Europe)","091e5208fbd182f3a9685990eb736b35":"Star Wars - The Empire Strikes Back (World) (Limited Run Games)","0937c8fc7c7b5470acb80f2462f49d48":"Kandume Monsters (Japan) (SGB Enhanced)","0941c6d463d971d56eee8e368a0abbb3":"Prince of Persia (USA) (Beta)","095cfb0c56a564bc13239787b01c525d":"Super Chinese Land 3 (Japan) (SGB Enhanced)","096206e2cce6b234c3d157c6cb2e1ee8":"Yvonne Goes to Carbonic (World) (v4.2)","0980a1650ad5e23a27202a58fc792ec8":"FIFA - Road to World Cup 98 (Europe) (Rev 1) (SGB Enhanced)","099d768c3541f4cbb6362c914e97f667":"Snow Bros. Jr. (Japan)","09ab7a431e216c65a0cfd9ae2f558a2e":"Shougi (Japan)","09acb679f68373c9853a4e215d627527":"Konami GB Collection Vol.3 (Japan) (SGB Enhanced)","09dbad535406168486b8b688caf33a9c":"Bubble Bobble Junior (Japan) (En)","09fd1f730709b1248f7382e3374578b5":"Space Trouble (World) (Proto)","0a1cbc05d75c2bd3e01aad3acb4e4019":"Ultra Golf (USA)","0a1ea6552eb8daf756824adb1f498559":"NBA All-Star Challenge 2 (USA, Europe)","0a2e27e279ee4faac326b0cf620b269b":"Tetris 2 (USA, Europe) (SGB Enhanced)","0a323bddc4f0159cea76cf44ed0c1a3c":"Hello Kitty - Pocket Camera (Japan) (Proto) (SGB Enhanced)","0a3304bdadddadc6c6b1d7cc8425d566":"Elite Soccer (USA) (SGB Enhanced)","0a5cc3c3bc487534740aca1db4da6575":"Plants Eat My Zombies (World) (v1.1)","0a7c71ce47cdc63550934037541019a6":"Shinseiki GPX - Cyber Formula (Japan)","0a96c9c737a07148fd065b3c121dcbb2":"Taito Chase H.Q. (Japan)","0acefb175380637bf0d49ad96da23d52":"Jelly Boy (Europe)","0affc9df2e1220ea4573deb6cb2d4b32":"Tetris Blast (USA, Europe) (SGB Enhanced)","0b10a49804c027c57201c61835acad77":"Zoop (Japan) (En)","0b4410c6b94d6359dba5609ae9a32909":"Castlevania - The Adventure (USA)","0b5127a54cc8581acfabe0413378ca3d":"Sneaky Snakes (USA, Europe)","0b72b9f0c2ce0b832c650bbcc974b023":"Virtual Wars (Japan)","0b7cbe56d1cf6370e60699e553d091a1":"Out of Gas (USA)","0bd1cf9c439b7095a64b4f76a5d16021":"Lawnmower Man, The (Europe)","0beb67de765ef358d50c28836a39bfb0":"Fish Dude (USA)","0bf2f0fe9537a2a6b6f8f2e037cb66b7":"Street Racer (USA, Europe)","0c3674c5020982b054d10449c5988092":"Minolta 2419 Adj. Program (USA)","0c7beead4f65e97a23b718ce20a1bf55":"Brain Drain (USA) (SGB Enhanced)","0cc70045da0c0cae54892684af4c0202":"Popeye 2 (Europe)","0ccb1e6beb86d79a7a5dad81eb6c73a9":"Yoshi no Tamago (Japan)","0d1406d83d25d417b8de92be3f302eba":"PGA Tour 96 (USA, Europe) (SGB Enhanced)","0d189c53d017a4a68b836a82cb1d9780":"Minolta 2440 Adj. Program (USA) (Alt)","0d24eeff28040ff2a8f63de5bc8cbea2":"Earthworm Jim (USA)","0d3d2b3bbca0a8d6f43968e12940b356":"Taz-Mania (Europe) (Beta)","0d7ca0b0355f8eddc2846eaa8dac218c":"Star Trek - The Next Generation (Spain)","0d9906e172c6143432b20706f44ac03e":"Monster Max (Europe) (En,Fr,De,Es,It,Nl) (Beta)","0dba2a8555c44fd7dcfa4a712353e7f4":"Song of Morus - Ghostly Night (World)","0ded2a31627c29a285637aae52b51427":"Konchuu Hakase (Japan) (SGB Enhanced)","0e142d46356ee6818c8fd35654eb5732":"Monty on the Run (World)","0e18f103fa102dafdcd695a9208770c5":"Eddie's Puzzle Time (USA) (Proto)","0e197969c69b529ebed89cfb736d1478":"StarHawk (World) (Limited Run Games)","0e29f0434b7bd4d806afbdea1c92ae7e":"The Light, The Fire (World)","0e4a3a1f29f20dea45638b2b72bc8a68":"Totsugeki! Ponkotsu Tank (Japan)","0e6d310f979c83bf1dfa01da803038d4":"NFL Quarterback Club 96 (USA, Europe)","0e82b5210966e9eb53d5b7ef906a0f40":"RoboCop Versus The Terminator (USA)","0e837cca81c48f18671751491b9c4c29":"Kinin Koumaroku Oni (Japan) (Rev 1)","0ea0896db6476d0d07cf3d35e0993849":"Monde Perdu, Le - Jurassic Park (France) (En) (SGB Enhanced)","0ea7e8a0d43a880c4c875b6fd0fb2a3d":"Lasama Chuanqi - Story of Lasama (Taiwan) (Alt)","0eb1920c5559f8a87b416739f192ba98":"Bouken! Puzzle Road (Japan)","0edf8501b8c2567371ae4f8747a27d63":"Double Dragon (Japan) (En)","0efe8e1f415ca008202be92566efdf75":"Pocket Golf (Japan)","0f021462180b18436c21299e923cca91":"Pipe Dream (USA)","0f497d937f8ce4fde2bb0f02d0929344":"Art School Pocket (World) (Fr)","0f539db976d8d272ed7067560b7c7e6c":"Darkwing Duck (USA) (Beta)","0fef748262bf93d67036a80e23cb42d1":"Dino Breeder 2 (Japan) (SGB Enhanced)","1054dd4e5dcedc72c27072d2c5b2f814":"Card Games (USA) (Proto)","1080141c1b99b5b92d187990bdc85c6a":"Nectaris GB (Japan) (SGB Enhanced)","10c1170d5b5416a217eb66821060421d":"Sa-Ga 2 - Hihou Densetsu (Japan)","10c581e4d5b612831c79724434f93e9f":"Rubble Saver (Japan) (En)","10cc4382f2c77400d7e2a0ccffbecdf2":"Zerd no Densetsu 2 - Xerd!! Gishin no Ryouiki (Japan)","10d92861e262069ce31559e12b927aa0":"Cave Noire (Japan)","10f18723a1ecf3c4c9d311c02f28a18b":"Dr. Franken (Europe) (En,Fr,De,Es,It,Nl,Sv) (Beta)","10fd41703b816fcb2a3d6766574b98f9":"Wave Race (USA, Europe)","1107c6ec10eba471045548919e7c114e":"Shippuu! Iron Leaguer (Japan)","1123060cb5177d576c191d774ebe403a":"Othello (Japan) (En)","113d8f894df6b8c3641b2ba1fe60c250":"Pinball - Revenge of the 'Gator (USA, Europe)","11829a41718f6ddef1bbf2e9eb6587fd":"Footballer of the Year (World) (v1.1)","11922d8a4f3c5bd68acdc18f0579ea57":"Final Fantasy Legend, The (World) (Collection of SaGa)","11be7ff8141f8d7a5c8cca903151f0ba":"Yoshi no Panepon (Japan) (SGB Enhanced)","11c49d405eef2174d9c14682204bb458":"Bubble Bobble (USA, Europe)","121cf07d369ed7fd45d21537855d3c34":"Asteroids Chasers (World)","12454fbcb38432e26f280282e7196e73":"Soccer Mania (USA)","127fd88142d69ac75368e9b59be70e05":"Konamic Ice Hockey (Japan)","1294651ee0bcdaf1a0724e7fa9ffe557":"Robin Hood - Prince of Thieves (Europe)","12add4ed6963a6cd303ca0fea892148f":"Nemesis (USA) (Rev 1) (Beta)","12d88fa2c0e6707f05beb556b661702d":"Ranma 1-2 (Japan)","12e9e43481d38003a4f1e2c2ce596aee":"Mysterium (USA)","131993b986f3ba1f682d8d74f050487b":"Hammerin' Harry (Europe)","1337510dc9de85723ff1778524c5007f":"Yogi Bear's Gold Rush (USA)","133ae23114bf442fef6acccd1b8e187a":"Terminator 2 - Judgment Day (USA, Europe)","133df46d4944261c84e8b411bef8b2cc":"Star Trek - The Next Generation (USA, Europe) (Beta)","13749826df12da4574e34ccb6d9c780d":"Asteroids (USA, Europe)","137d38365425885d5d86b16dc380d5c5":"Game Boy Datenlogger 1 (Germany)","13dd6801246da226b0c2db339df4a246":"Shadow Warriors (Europe)","13ec0c660b5a963a07b39ecabf0e0ab5":"Battletoads-Double Dragon (USA)","1425bc943f215cba23f1ec8c4bc22bbc":"Zool - Ninja of the 'Nth' Dimension (Europe)","142d1f9f4b868780824cca20010ad4d8":"Picross 2 (Japan) (SGB Enhanced)","14547035e8c7af31af08781d2691c20f":"Little Tales of Alexandria, The (World) (MBC3) (SGB Enhanced)","1475824e7262c0d6359f43c287e034a5":"Castlevania Legends (USA, Europe) (SGB Enhanced)","14a8e0bdb9f2b16d354ca0209e35aedb":"Oni V - Oni wo Tsugumono (Japan) (SGB Enhanced)","14d6a5e430452dca394bd3e641dc327b":"Wizardry Gaiden I - Joou no Junan (Japan)","14fe7234ee4bcb14adf20c743f084a35":"Wario Blast Featuring Bomberman! (USA, Europe) (SGB Enhanced)","15819cb3a6571eb67b52ce06f1972ef9":"Mystic Quest (World) (Collection of Mana)","159c8ca77e153b1cc5fe6d5d82a091c2":"Barbie - Game Girl (USA, Europe)","15c77caea8eb8fadd4a1ace65942168f":"Little Tales of Alexandria, The (World) (MBC3) (SGB Enhanced) (Batteryless)","15cd267d7805fe9f1769e9644a9cec2e":"Ultima - Runes of Virtue II (USA)","15d9979ace470a0abf9c83bc1f81dabf":"Blaster Master Jr. (Europe)","15db12b81db55364a5c0b064b22e569f":"Black Castle (World)","15f0b057ab8b7b53914129b3bbab6610":"Trappers Tengoku - Spy vs Spy (Japan)","15f1a2a703e632bbd4f311fe12279249":"Lion King, The (USA, Europe) (Beta)","1621182f6c8e762462aedb2b69c5e5ec":"Porklike (World) (v1.0.9) (SGB Enhanced)","1636d766639525de9fe1ef335808cdfb":"Robin Hood - Prince of Thieves (Germany)","1660f7937b4edde47f6fc3a7c4fc857e":"Footballer of the Year (World) (v1.0)","1695655af0d4320bc657cc5d3b26f4c3":"Flappy Special (USA) (Proto)","16a03da1364c683b73742dc3e6c0e788":"Kinnikuman - The Dream Match (Japan)","16af858484041d572299b501ead2b788":"Gear Works (USA, Europe)","16bc18ef00088094e9fad502e613be5e":"Mickey's Dangerous Chase (USA)","16bdc21f67f8226e1168983a46b65441":"Ciao Nonna (World) (v2.1)","16d86ec93f9aad85edcec7e6db18b435":"Pokonyan! - Yume no Daibouken (Japan) (SGB Enhanced)","16ddd8897092936fbc0e286c6a6b23a2":"Pocket Monsters - Midori (Japan) (Rev 1) (SGB Enhanced)","16ee9b10c27c136d2959ae87105a8a2e":"Nettou The King of Fighters '96 (Japan) (SGB Enhanced)","17142af806c86f45808a94550f2303d8":"World Cup USA 94 (Japan) (En,Fr,De,Es,It,Nl,Pt,Sv)","173896fb9f93fb39ed87a58981e82e36":"Sumou Fighter - Toukaidou Basho (Japan)","173da3188b302c34d882b798f468d741":"Sonic 6 (USA) (Pirate)","1752014c81020e4dbce44c47c301daf9":"Raging Fighter (USA, Europe)","17792b7924aa9275a5a4655e8b9bbc27":"Jungle no Ouja Tar-chan (Japan) (SGB Enhanced)","177f5fc642f650e45bae33b10ba1fe48":"Wizardry Gaiden II - Kodai Koutei no Noroi (Japan)","17998c241ec03d97f0c9ecac41f06db1":"Rodland (Europe) (Beta)","17d4f6ddb2996d989040b1881b0573bb":"Joe & Mac - Caveman Ninja (Europe) (En,Fr,De,Es,It,Nl,Sv) (Beta)","1897e54ca0af5f6c83fdb92ae6d02e2f":"Star Trek Generations - Beyond the Nexus (Europe) (SGB Enhanced)","18b83c9003caee31ed0e843a92c119a9":"Turn and Burn - The F-14 Dogfight Simulator (USA)","18e5146097aa9dfcb91b128e87dbff72":"Jeep Jamboree - Off-Road Adventure (Europe) (Proto)","18fe3526f170f47a277e0fac17d90170":"Kung-Fu Master (USA, Europe)","19058077b12ac22580aae17b3dd1233f":"Simpsons, The - Bart & the Beanstalk (USA, Europe)","1905ff1a339e777237edc66b59969f4c":"Goukaku Boy GOLD - Shikakui Atama o Maruku Suru - Keisan no Tatsujin (Japan) (Imagineer)","1967d7ddff33c292b5f935bc0acc1d25":"Bounce (World) (v1.1)","19b046ba344fc465306bd6e4be027719":"Joe Blade 2 (World)","19e07948889d06150ca84d5cbd606b83":"Goukaku Boy GOLD - Shikakui Atama o Maruku Suru - Nanmon no Sho (Japan) (Proto) (IE Institute)","19ef2657130f5e477393f8551dc7b23a":"Ciao Nonna (World) (v2.0)","19fd29efaf7ea9e314bd613954a92169":"Arcade Classic No. 3 - Galaga & Galaxian (USA) (SGB Enhanced)","1a181f068d715c4ca350fb168fb9dd8a":"Puyo Puyo (Japan) (SGB Enhanced)","1a316519500424ae9a2649746c4c83ab":"Stop That Roach! (USA)","1a4777d04e6cc718fd7e2499b9c23c55":"Takahashi Meijin no Bouken-jima II (Japan)","1a4aaf4af4b3610ca74ef3b307b6b2a9":"NBA Jam (USA, Europe)","1a52fb8f767e24dc75c3bb2d08679f6c":"Ninja Taro (USA)","1a583eda068a03bab68786f0d8f70597":"Marzipan Beef Reverser (World) (v2.0)","1a76705a7617c4f2c54ecf60d89bd0ae":"Pac-Man (Japan) (En)","1a851b27609bedcb993be91bff5978b0":"Barbie - Game Girl (USA) (Beta)","1a9c3966c0c2d17c1d67a0a49409db29":"Peetan (Japan)","1ab4aad28745a9a4c875e8bef7ea3ffa":"Castelian (USA) (Beta)","1b3e05519f7bdce7cc5a18a108e55888":"Kenzie's Birthday Dash (World)","1b5aebb54d59121d8dc3188929295607":"Ultraman (Japan)","1bcace7d7315f384cd853df51e8bbef7":"Family Jockey (Japan)","1bd6b416a5bdfcc3aa60bbd472d1d914":"Wordtris (France) (Fr) (Proto)","1bef0270ab12af28e694906cf934480a":"Momoiro Zousan (Japan) (Proto)","1bfc3e94193d95c4e1145fd6cbf8fd1b":"Goukaku Boy Series - Eiken 2kyuu Level no Kaiwa Hyougen 333 (Japan)","1c031ba472ef04cf76dc63b15d96aac2":"Xenon 2 - Megablast (Japan) (En)","1c04158b8c2408523620e73d88b0d8d5":"Goukaku Boy Series - Shikakui Atama o Maruku Suru - Shakai Battle Hen (Japan) (Imagineer)","1c0fab1d2d046bee898372bed404c31a":"Collection Pocket (Japan) (SGB Enhanced)","1c1619f1caef49132e87160aa20a0a4d":"Pyramids of Ra (USA)","1c1911e4a8d299fcc5df4180f33b69e6":"Q-bert for Game Boy (Japan)","1c94dccdfaaa0c3e1d6bda5969704885":"QIX (World)","1cb08c8447160f9757d1a48331fb05a2":"Wedding Peach - Jamapii Panic (Japan) (SGB Enhanced)","1cdea2beb1f8f1f4a3fb0c939112267e":"Puzzle Boy II (Japan)","1ceb3148a1b68b2ba9eada0393f987fc":"Tiny Toon Adventures (Japan)","1d0889833ed086c6b11c1fc4d40f9f3a":"Who Framed Roger Rabbit (Spain)","1d225e54ac782c4f4c44faf26ecfbd37":"Super James Pond (USA) (Proto)","1d2c316f9f32727261328c7a49b22e2c":"Super Mario Land 2 - 6 Golden Coins (USA, Europe) (Rev 1)","1d2fed99f9f478f404f161940e53cea6":"Indien dans la Ville, Un (Europe) (SGB Enhanced)","1d44f2b3c1e0a1cb65bcd4d5d0486776":"Pinball Mania (Europe)","1d5c3627f001d863e42dfa67c6c02ebc":"Monopoly (Japan)","1d5e05159b0ac6a5119bd6f743c7eb9e":"Simpsons, The - Bart no Jack to Mame no Ki (Japan) (En)","1d63b86c857ea92d23ca6d261cfeec68":"Edd the Duck (Europe) (Proto)","1d67ab62a74e22663b84da92c58aa501":"Dash (World)","1d69e97aff3c67471b6030c72a8833e1":"Crayon Shin-chan 3 - Ora no Gokigen Athletic (Japan)","1d776c87664d061fea24576b52528acf":"Aladdin (World) (Disney Classic Games) (SGB Enhanced)","1d94024621b825e9fbe7e46ed4e0a567":"Nekketsu Koukou Dodgeball-bu - Kyouteki! Dodge Soldier no Maki (Japan)","1dc2f1492fb4e2ecb1f1008ce19e3833":"Muncher (World)","1dd179d971829c8a9ca55100390a26f5":"Tsumeshougi - Mondai Teikyou Shougi Sekai (Japan)","1ddff2c150456069776f8c79671cb9f7":"Cool Spot (Europe)","1e0c5af7d66e1acb389ecd93b572e38a":"Cherry Rescue! (World)","1e3de154e6081d695b3446a5ceb8fff3":"Puzznic (USA) (Proto)","1e5fe428068d8e051e20874ce7c38349":"Castlevania - The Adventure (USA) (Castlevania Anniversary Collection)","1e639b34e71bfd910d682fc829e6d863":"Dragonborne (World)","1eb7ff636e532321a18885eea660604a":"Nemesis (USA)","1eba3db17024be2bc5a51d627bcc6bff":"Slurpee Cycle (World)","1ec4506aef73c1be2412b39d2ba3681c":"Game Boy Wars (Japan)","1ed313c4fd78b81a8ca3613e6234da7e":"Frogger (USA)","1ee7e23af0663dd66af62276917974b6":"F1 Boy (Japan)","1efbb42c4db24e5e42e778d969ba1f5d":"Mr. Chin's Gourmet Paradise (USA)","1efea4210026a8d733a5b2ade2b005f1":"Ikari no Yousai 2 (Japan)","1f406d44b61098883bbaafc076e994e9":"Soccer (Japan) (En)","1f66f1de0dc183d58e47cafdc414ec2b":"Sa-Ga 2 - Hihou Densetsu (Japan) (Rev 1)","1f8089ca53d6e9aff6d1907710d28bc8":"Heavyweight Championship Boxing (USA)","1f93249c298f3ecdc4099602d9dedbb5":"Milon's Secret Castle (USA, Europe)","1fad0b21e68bd05e2f29b2e5fd861719":"Takeda Nobuhiro no Ace Striker (Japan)","1fb76bb7f55ca19340fe8c7d1007e7ff":"Kachiuma Yosou Keiba Kizoku EX '95 (Japan)","1fcbb5903a90fb4875fdf2fc128f0d7f":"Twin (Japan)","1fe5ddbb6502baf81b9cee0ae7446728":"Super Mario 4 (Unknown) (Ja) (Pirate)","1ff86f10d1104200bf316cdc6612b63c":"Nintama Rantarou GB - Eawase Challenge Puzzle (Japan) (SGB Enhanced)","1ffa46f368917656a1590abae6112e79":"Lunar Lander (Japan) (En)","200626cc703cebb4e3f31b725a705220":"Metal Masters (USA) (Beta)","203db7ddc72359e4db5e9ab42a6f0ba8":"Kirby's Block Ball (USA, Europe) (SGB Enhanced)","203fd4178ee332d1b2cf24504716c885":"Mani 4 in 1 - R-Type II + Saigo no Nindou + Ganso!! Yancha Maru + Shisenshou - Match-Mania (China) (Ja)","20477830fcdbe53ebae93a2ae90c72c9":"Goukaku Boy Series - Shikakui Atama o Maruku Suru - Suuji de Asobou Sansuu Hen (Japan) (Rev 1)","2057201d3fd4a137ee8c74c73b0a7b03":"Yu Yu Hakusho Dai-3-dan - Makai no Tobira Hen (Japan)","208b978e1ee53efa875cd6dfc42223f2":"Animal Breeder 2 (Japan) (SGB Enhanced)","20b436fc3c9621eb4ee82bc3ef3687fb":"Doraemon Kart (Japan) (SGB Enhanced)","20d658fa55a9a61c59f888537039d8a7":"Cosmo Tank (USA) (Beta)","20e16379b6667ab17c512780bd9ae757":"NFL Football (USA)","20ef0111690cf16339f7eaaf79e0e71d":"Lawn Mower Land (World)","20ff18d9957c612ac6fb0fa688d2ea1e":"Ciao Nonna (World)","211a15218fa66e4a09bc253ae064991c":"Arcade Classic No. 4 - Defender & Joust (USA, Europe) (SGB Enhanced)","21268f9f405be70c218da9e43f36bbdf":"Snaky Pocket (World)","214f461d32073e12f0f8be8f25d0f4ed":"Monster Maker 2 - Uru no Hiken (Japan)","214f8ac98a8c9d78359d71c47cf46df5":"Shock Lobster (World) (v1.3)","216bfb10081e721be7ed5628785e094f":"Long Xing Tianxia (Taiwan)","2183b40217571843d08e132119324ddd":"Harbour Attack (World)","21cc47b68fc7c9c56ef3393dbe528600":"Castelian (USA)","21ced1aa8a0875e91fdfefc9ef1c1bf3":"ZAS (Europe) (Proto)","2204aecc6784ab2e6c5f063c8584e0d2":"Dragon's Lair (Japan) (En)","2215684318211e85135c4cd8e55f91a4":"Megami Tensei Gaiden - Last Bible (Japan)","2232ee0598c7b953b38b1bf4f7bf8ecf":"Goukaku Boy Series - Shikakui Atama o Maruku Suru - Kokugo Battle Hen (Japan) (IE Institute)","22ef15c88a371718d81b36f957f4f664":"Red October o Oe! (Japan) (En)","230b96e98d05cf0385cfaa5b75f1735c":"Goukaku Boy Series - Koukou Nyuushi Derujun - Kanji Mondai no Seifuku (Japan)","23824d72928a05e9fcf052d42f3c91c6":"Go! Go! Tank (USA)","2387654e0e8e63bfc5f85d9bd7aa6ac3":"Zoop (USA, Europe)","239cb2527756a4b509dcc45ba6bd1d75":"Pixel Who - The Lost Legions (World)","239fd20f424ee53d2f11018dbd942df4":"Boxxle (USA, Europe) (Rev 1)","23c7be98ac9a4d3b046ad1be3f0965e4":"Kid Icarus - Of Myths and Monsters (USA, Europe)","24186cb8ef3210c00b9c227c71b9db73":"Pri Pri - Primitive Princess! (Japan) (En)","2486ac22ff1ed53b4c8fa4f2d5226749":"Battle Unit Zeoth (Japan)","248dac256ccd86a224e7b28d86fa8bde":"PGA European Tour (USA, Europe) (SGB Enhanced)","24a6b4457a511cc667e9ac25417401ab":"Kid Dracula (USA, Europe)","24b4f33417fc95fe6b092bcd30605cb2":"Bo Jackson - Two Games in One (USA)","24c35f0158e14746d45251b4216d8693":"Choplifter II - Rescue & Survive (Europe)","24c5cec170f19493c6013b4ccaee1e35":"Megalit (Japan)","24cd3bdf490ef2e1aa6a8af380eccd78":"Final Fantasy Adventure (USA)","24d19f1069ac583462713060df18a753":"Sunsoft Grand Prix (Europe)","24db7b8d9080b1626dd949331ac40aca":"Asmik-kun World 2 (Japan)","24e14958adc385b04bdac3da02bed4c7":"Felix the Cat (USA, Europe) (Beta)","24f96821369540f25dc3768053569029":"Dai-2-ji Super Robot Taisen G (Japan) (SGB Enhanced)","2524230d0300f46ebf423ae1b37747eb":"Spot - The Video Game (USA)","254554a4412d0fba81c2ece8e094d30f":"Shin Keiba Kizoku Pocket Jockey (Japan) (SGB Enhanced)","2554c7f6365dbf59ec1a73f0124a70b4":"Binding of Isaac, The - Game Boy Edition (World)","255948255eda904e376e6435636b100f":"Coat Man (World)","255bca32093336ccbacdd185951c8727":"Gekitou Power Modeller (Japan) (SGB Enhanced)","25693d62f14011ed543a273e34e92ce5":"Go! Go! Hitchhike (Japan) (SGB Enhanced)","256f34df36549fb877101d28a7b92688":"Nihon Daihyou Team - Eikou no Eleven (Japan) (SGB Enhanced)","259aa674ac5634e47a642d024cfbdc66":"Gojira-kun - Kaijuu Daikoushin (Japan)","25b34ebece0e2c54baf9dee4f5845292":"New Chessmaster, The (Japan) (En,Ja)","25bc75255fdc90ba6ad00636d968dd2a":"Lemmings (USA)","25dfaca5120462af05532aaf4756776a":"Flintstones, The - King Rock Treasure Island (USA, Europe)","25e0dcb19fa8967455e0a3668b33edf7":"Minolta SLR Data Copy (USA)","25ec0916ff6f24a1878a9f30991d301d":"Arcade Classic No. 1 - Asteroids & Missile Command (USA, Europe) (SGB Enhanced)","25fbb082dc9bb9e86c0abb03ca5cc168":"Populous (Europe) (Sample)","261ec744fcf7a4eb5a6025c48c0538a3":"Monster Max (Europe) (En,Fr,De,Es,It,Nl)","26c65da146faa09505c554447792e493":"TaleSpin (USA)","27334d7717d8e3dc953ba733ef1853c4":"Magnetic Soccer (Europe)","27493f4aa1a94db0686de77e0e81e7b0":"Woolball's Backyard (World)","275dc0712e83f34252c2fcd2eaefb72f":"Bokujou Monogatari GB (Japan) (Rev 1) (SGB Enhanced)","276fea4acd820b304d41aa5c974e99af":"Ciao Nonna (World) (v1.1)","279022f2b918cbe8148b6f2c1a5f9acf":"Oyatsu Quiz Mogu Mogu Q (Japan) (SGB Enhanced)","27a131651700b396d593af89e625325f":"Umi no Nushi Tsuri 2 (Japan) (SGB Enhanced)","27b8724d17aaba0ffb4d3b8d79cde2ac":"SD Sengokuden 2 - Tenka Touitsu Hen (Japan)","27bcef0893a0848b25fc69be177db1e3":"Kaisen Game - Navyblue (Japan) (En)","27d7c8ae7cc36c1d5dfd8bd15df57e8d":"Cool Spot (USA)","27e8623a411f04fdf53b43508a0d2a7b":"Palamedes (Japan) (En)","27ebab8b364e10cb8ceb552d3bf24647":"Penguin Migrants (World) (v1.2)","27f2c99b13cbdb5a5be4afce87b9039b":"Rolan's Curse II (USA)","27ff412b4909f2b20e28a629ca91feee":"Madden 96 (USA, Europe) (SGB Enhanced)","2815ff13131712bcd00c3852d461b414":"Robin Hood - Prince of Thieves (USA)","2843796abf7cba23556b0006f398c4fb":"Chibi Maruko-chan - Okozukai Daisakusen! (Japan)","286caf661b28f99b7c8aca10c75c7bc5":"Nyghtmare - Betrayed (World) (Alpha A)","28737a5c760938a9746fa9e1a2fcefc6":"Batman Forever (USA, Europe)","28a4e2d989d55f654bba6ca6e0c7f047":"Dangan GB (World)","28a8263bb19b7ef3ddcac5ee83f62aee":"Hoshi no Kirby 2 (Japan) (SGB Enhanced)","28c1ef075f37bcf4951ac11385a1104f":"Ninja Boy (USA, Europe)","28e1605572aec89f7d210775e51cb8da":"Diablo (USA) (Proto)","290be7fd63076e4373f322900542c1b1":"Goukaku Boy Series - Gakken - Kanyouku Kotowaza 210 (Japan)","290f699f6c5b5b648aac43751de07ea1":"Bionic Commando (Europe)","296cb17655e184bb65c1cd2a3bc68d8a":"Pocket Puyo Puyo Tsuu (Japan) (SGB Enhanced)","29790c2fecde95caade0fd68bd97781a":"Tetris 2 (USA, Europe) (Rev 1) (SGB Enhanced)","298c80fe568bb2ff8bb7e4dfe5862a9d":"Probotector (Europe)","29962ef94473a677ee26eee90b16dc6d":"Maerchen Club (Japan)","2997dd5d6d1a50ac5a72a2bb42931de6":"CutThroat Island (Japan) (En) (Proto)","29b84d4b87c7f6120998a775f29535cb":"Eclipse (Europe) (Proto)","29c71c474c2fa00eeac79ddb55c2c174":"Wordtris (USA)","29d9ba6b3724a8de14f1f66dbe2e4aec":"Kikou Keisatsu Metal Jack (Japan)","29fe84cfca35b651a0bb86abf4b08792":"Yuuto Ichika Makes Friends (World) (En,Ja)","2a0465c954847a7dc00dbcf5d363cd16":"Otogibanashi Taisen (Japan) (SGB Enhanced)","2a2ae531b2cebd995508707b0e82b1b1":"B.C. Kid 2 (Europe) (SGB Enhanced)","2a457900607b2bf87d1377f066d7aa44":"Phantasm (Japan)","2a5fc7ed564d290e04fbb5968480db52":"Momotarou Dentetsu jr. - Zenkoku Ramen Meguri no Maki (Japan) (SGB Enhanced)","2a76ab00f041ec61ea08899021a4c07e":"Ponta to Hinako no Chindouchuu - Yuujou Hen (Japan)","2a7d9044b9bdbc133d1a9bb5c0f9b2a1":"Dr. Franken (Europe) (En,Fr,De,Es,It,Nl,Sv)","2aaa6042a1d6c7fe2f3300c8a1158ef0":"Minolta 2098 Adj. Program (USA)","2ac6a2561254ad50284f4c9650b30447":"Super Hunchback (Japan)","2acfc8d0213b186552124fb8b3085fa1":"Yakuman (Japan)","2aff6ad314aa6833e558f2b8b8cdac91":"Mortal Kombat 3 (Europe)","2b04dbc9b7dbddd456f56282f36f58ce":"Rockman World (Japan) (En) (Beta)","2b1221e85b545bba7e2291fede03fd96":"Bust-A-Move 3 DX (Europe)","2b3c9ee51f0e89df14c3698b293ba531":"Pagemaster, The (Europe) (SGB Enhanced)","2b42dbc0934fdd90bca3a4965520bf37":"Jungle Strike (Europe)","2b42e312afbee6599ce413a8784e4e68":"Torpedo Range (USA)","2b589e58d8821c59b7af702723361db5":"Momotarou Collection 2 (Japan) (SGB Enhanced)","2b992d2bd90db504bf4357b4f77b4604":"Asterix (USA) (Proto 3)","2ba27abe03688caa433e9e3d500db4a0":"Game Boy Aging Cartridge (World) (En,Ja) (v1.1)","2bb0df1b672253aaa5f9caf9aab78224":"Final Fantasy Legend II (USA)","2bda57560f54fe854ea5d53b60bd22a8":"Olympic Summer Games (USA, Europe) (SGB Enhanced)","2be2472951eb4e25ab0c70fdee298130":"Dracula Densetsu II (Japan)","2be59d4c20728300c84a71fcfcb565f9":"Wizardry Gaiden III - Yami no Seiten (Japan)","2c07caee51a1f0c91c72c7c6f380b0f6":"Joshua & the Battle of Jericho (USA)","2c1358474573c9dd38d6a128f4714a86":"Mega Man - Dr. Wily's Revenge (Europe)","2c4922faac9fb989ab556282598f8ec0":"Prince of Persia (Europe) (En,Fr,De,Es,It) (Beta)","2cad6ee6df3402aeb8f8ab7921517779":"Bomberman GB (Japan) (SGB Enhanced)","2cb38b3b78f755bcc5cd2aa059a7d2ed":"Asteroids (USA, Europe) (Beta)","2cc322a27530f6aaa09a35b2f14aebd5":"Contra (Japan) (En)","2cd8171d2c0d6695f6c4159476d459e7":"Hong Kong (Japan)","2cf73ae0ef2b62e9d20b5432b2f6c5de":"Purikura Pocket - Fukanzen Joshikousei Manual (Japan) (SGB Enhanced)","2cf83df10495ad163c88698c6c44f1ef":"Street Fighter II (USA, Europe) (Rev 1) (SGB Enhanced)","2d07ba7a88c2daff07da53831166500a":"Ken Griffey Jr. Presents Major League Baseball (USA, Europe) (SGB Enhanced)","2d0db8848754773c85ef1d9eab7318c9":"Track Meet (USA, Europe) (Beta)","2d56a7413fb73ad307d399af4c06a8d5":"Pokemon - Yellow Version - Special Pikachu Edition (USA, Europe) (Beta) (CGB+SGB Enhanced) (Alt)","2d7edcd2bb9fab77364011f6043b4b73":"Doctor GB Card 4M (World)","2d83537ba548e4118ea3e8ae0a309dfe":"Bubble Ghost (USA, Europe) (Beta)","2d932dc975fc98d294dfab7d70e553ef":"Tom to Jerry Part 2 (Japan) (En)","2dcdb3808c2ccef569b215e0a35800a7":"Castlevania II - Belmont's Revenge (USA, Europe) (Castlevania Anniversary Collection)","2dd28f8f43df06327c04a51959ac526e":"Muhammad Ali Heavyweight Boxing (USA, Europe)","2dd7cac468422231ae2aba980e4c4691":"Bomber King - Scenario 2 (Japan) (En)","2df6b439a35e0d511d52fa75c6a7849a":"Pokemon - Version Jaune - Edition Speciale Pikachu (France) (CGB+SGB Enhanced)","2dfaeaf059179602d692b92ebb9a1dfe":"4 in 1 (Europe) (4B-005, Sachen-Commin)","2e3a0305f79b058cc4618565bc2db745":"Parodius Da! (Japan)","2e46072ce2416feb18f4bd1e9943546c":"Donkey Kong Land III (USA, Europe) (SGB Enhanced)","2e4bd75723b0bc4f56c8e7077030b45a":"Counting Sheep (World)","2e5943f9e984fa4aed26542eacf2d9f4":"Goukaku Boy Series - Shikakui Atama o Maruku Suru - Suuji de Asobou Sansuu Hen (Japan)","2e85bbfc5bc2aaa51955f0fcbcda0842":"Cult Master - Ultraman ni Miserarete (Japan)","2e8d69bd73c3deee6c076c0a2da25617":"Yakuman (Japan) (Rev 1)","2eb9a6891fc79cd878d8bc12d04a0790":"Dynablaster (Europe)","2ebbf49d18833d07d6dae4e128ca1136":"Track Meet - Mezase! Barcelona (Japan) (En)","2ec376fb2b9565f20475d7007134b9e2":"Bubble Bobble (Japan) (En)","2eee88360aa199b7adc9d9c6647e0809":"DuckTales 2 (Europe)","2efe1569e3be81e7e19b13eafc60cd24":"Mystic Quest (France)","2f1f67663193e3107e028e570a7ccd86":"Centipede (USA, Europe) (Accolade)","2f24a29e157b1b06f731fb5e63e96168":"Alien Olympics (Europe) (Beta 3)","2f367a3ffd68a90d45909f89ed835e2c":"F1 Pole Position (USA, Europe)","2f53a8739acac44fe6400dfdaed01a81":"Hudson Hawk (Japan)","2f77e4293fd0a2197aca5d62751c3e33":"David Crane's The Rescue of Princess Blobette (World) (Limited Run Games)","2fa251041a892a57966806db01ad85ac":"Laser Squad Alter (World)","2fa78f748aa9bced4cedd95f330c9a11":"Dennis (Europe)","2fc634a297bee6e1109d9ca2197cc8d2":"Cryohazard (World)","2fc9be5fa50cfa9c660a2ceaa55344ae":"Soukoban (Japan)","300c72aa607aac5126dd791884233691":"Flash, The (USA, Europe)","300ea2593b2c29c3950fed23d672e11e":"Puyo Puyo (Japan) (Rev 1) (SGB Enhanced)","3029c962c483df174fc6f5c9202326e3":"Monster Race (Japan) (SGB Enhanced)","302caa3ceddccc5fba36787b44d25da7":"Blades of Steel (USA)","302f773a39fe0e45756b050ee94f0918":"Bakenou TV '94 (Japan) (SGB Enhanced)","303ca5fa5dcf4abbf2e18429d7241ecb":"Nigel Mansell's World Championship Racing (USA)","3050cdf055b1d036f85c9c629b03fbf2":"Pocket Bomberman (Europe) (SGB Enhanced)","305576b40d3f801e9ea23fa27939d5f1":"Bobby's World (Europe) (Proto) (SGB Enhanced)","307889b908a3954b224493486e4c4294":"Lucky Luke (Europe) (En,Fr,De,Es)","308abd707a48ee9d69c287d818469fd6":"Boxxle II (USA, Europe)","308f35e84b1984aba38814db00a4e769":"Volley Fire (Japan)","309fc69d5ab1d2b17d0bbc127faf04c1":"Rockman World 5 (Japan) (SGB Enhanced)","30b579d82ae755bd37c1d4157a96129c":"Popeye 2 (USA)","30c2d9a5370f10c02e1ab84bceb43fcb":"Pogo Pete (World)","30c998cf3a2c60d580a75989af6f39fb":"Lion King, The (USA, Europe) (Beta)","30e941af5b21d0e462e3d00cba0df409":"Sword of Hope II, The (USA) (Beta)","3103cc297e3d83ada597024b60a2c1e6":"Pokemon - Yellow Version - Special Pikachu Edition (USA, Europe) (Beta) (CGB+SGB Enhanced)","31223019b126dbcc85f14905588d053b":"Mortal Kombat II - Kyuukyoku Shinken (Japan) (En)","312ea1fe2d4734f33ffa617dd4a7676b":"Boxxle (USA)","3132b823343c82dacece721452612812":"Blues Brothers, The - Jukebox Adventure (Europe)","31424c11298bc10d4976e201ba504c9e":"Smickeonn 2 - The Game (World)","314884ad3ab74002863b3192796c1be5":"Tintin in Tibet (Europe) (En,Es,It,Sv) (Beta) (SGB Enhanced)","314ca1610e00861bc97611c8f874503a":"Mulan (Europe) (SGB Enhanced)","3164121570d96f879a1426df2826269d":"Pachi-Slot Kids 3 (Japan)","3172f2d0c417107da132f8437c43763b":"Teenage Mutant Hero Turtles - Fall of the Foot Clan (Europe)","31749ebd037d4d83c91255dd9a7482c5":"Zuigao Jimi (Top Secret) (Taiwan)","31adc9a8f9f1619e736bfc533e4ed2dd":"SmartCom (Europe)","3208775b434d8228d1bf950b91a39e70":"Tottemo! Lucky Man - Lucky Cookie Minna Daisuki!! (Japan) (SGB Enhanced)","3208cc9ee33a163cd7cad242db3e1f4a":"Altered Space - A 3-D Alien Adventure (Japan) (En)","322965849b9103a3d6906c9697a19c09":"Saigo no Nindou (Japan) (En)","32628dd7b39919a3a5ab77b245cd6b63":"Bugs Bunny Collection (Japan) (SGB Enhanced)","32731c8db5e2a1e91ed583e67f89bb6b":"Mulan (USA) (SGB Enhanced)","328402b9ea5ef55e155d7fdbdebd46a5":"Minolta 2166 Adj. Program (USA)","32b497a8d8d21b82aa9c71ed07231b34":"Smickeonn - The Game (World)","32db3b2ef7a88bee1352f1da1fde1154":"Illuminated (World)","3322ce4e576a33df834bbff80e627047":"Nontan to Issho - Kurukuru Puzzle (Japan)","333444e90c0bfb99c4ff89fdcb920fe4":"Donkey Kong Land III (USA, Europe) (Rev 1) (SGB Enhanced)","33349ad9019762b79c467cd241d79344":"Masakari Densetsu - Kintarou Action Hen (Japan)","3343ceca5dd6586e4774609526167d55":"Pokemon - Versione Gialla - Speciale Edizione Pikachu (Italy) (CGB+SGB Enhanced)","3353653e75b9110afdd37452b27cd312":"Head On (Japan) (En)","33d428bd17848c4cfa7dc1b7f16644ec":"Lemmings (Europe) (Rev 1)","340e4ab12d1151b68ec6425f509d115c":"Legend of Zelda, The - Link's Awakening DX (France) (Proto)","3418b37cc4ab9bbd8b416ba27be2f8f7":"Knight Quest (USA)","341b155413d2253886d8f188625cc1c3":"Joe & Mac - Caveman Ninja (Europe) (En,Fr,De,Es,It,Nl,Sv)","341d925720680e94fdaadfc10458d07f":"Kingyo Chuuihou! - Wapiko no Wakuwaku Stamp Rally! (Japan)","34310686415c87dfe69882a6ad3f548f":"Who Framed Roger Rabbit (Europe)","344ed70fe1a7a8cc904eda886543252c":"Toy Story (USA) (Rev 1) (SGB Enhanced)","3485e210e798df389e4ffc1270f86382":"Tarzan - Lord of the Jungle (USA, Europe)","3488999b749038efa076ea7b2fcc99bc":"Game de Hakken!! Tamagotchi - Osutchi to Mesutchi (Japan) (SGB Enhanced)","3496b0cab86ae1981142c0ddb9ae6183":"Pinball Fantasies (USA, Europe)","34b3d0f0843b83e5b0e00bc3d0669793":"Daedalian Opus (USA)","3502be0da5d444ec144aae9ce1409e0d":"Castelian (Europe)","3552eada6ea2db722fab1048e3ec654f":"FIFA - Road to World Cup 98 (Europe) (SGB Enhanced)","3593f45c94d5b612c7864e5181c7aeff":"Nekketsu Koukou Soccer-bu - World Cup Hen (Japan)","35b1621d14b27cace027bd710ed6040b":"Masakari Densetsu - Kintarou RPG Hen (Japan) (SGB Enhanced)","35c4eb1f0d7058f7d559056d5cfa945c":"Binary Monsters II - Adventure of Hell (Taiwan) (En)","35c8154c81abb2ab850689fd28a03515":"Pokemon - Version Bleue (France) (SGB Enhanced)","3620fd4985e916064d5f6560e54605e3":"Borruga - Neo Pinball (World)","369bc7cde60ac3f97f72ff605502797f":"Nettou Samurai Spirits (Japan) (Rev 1) (SGB Enhanced)","36ce150459099b9a7fccbc2ee46ac22c":"Last Action Hero (USA, Europe)","36dbbefd222bdb0921189c4be4fa1ead":"Legend of the Sea King GB (USA) (Proto) (SGB Enhanced)","3701cf0841b45c7b2c546fc4e303aaf1":"Goukaku Boy Series - Gakken - Rekishi 512 (Japan)","371625f3dea030998225754d56ebe81c":"Shootris (World)","375d65b184ec4a689a6477c46363d224":"Tesserae (USA) (Beta)","376c0f79da62cc677817fe119c3db2c4":"Small Town Emo (World)","378236df6a7c686dfaa6743b63d1f757":"Spirou (Europe) (En,Fr,De,Es) (Beta) (SGB Enhanced)","379c0c424093a74a915ad444a966307c":"Trip World (World) (Limited Run Games)","37c69c73c81e221189a672938b5f30ab":"Puzzle Bobble GB (Japan)","37e017c8d1a45bab609fb5b43fb64337":"Spiritual Warfare (USA)","37f2e18c9c015c6578ef3dd404dafe26":"Pinocchio (Europe)","37f377c7b462b69f01bc365177fb1ff8":"Minolta 2463 Adj. Program (USA)","3801f065c93f6ad62e5d895a03f6ee75":"Cyberlice (World) (Proto)","38412ba58b750d1a838137ade975f62a":"Yannick Noah Tennis (France) (En)","38b05e5167a24089cb18cc95e3911019":"Krusty's Fun House (USA, Europe)","38b65d28ac0bd619f5dee5a45d5fc542":"Mickey Mouse - Magic Wands! (USA, Europe) (SGB Enhanced)","38bd3f2ee51fbd6882b5c76d6f5dd18b":"Goukaku Boy GOLD - Shikakui Atama o Maruku Suru - Keisan no Tatsujin (Japan) (IE Institute)","3910ce6b44b689a06889693771ded6dc":"Attack of the Killer Tomatoes (USA, Europe)","399fa899194542c7bd5ba92969795ac5":"Oni IV - Kijin no Ketsuzoku (Japan)","39f9e3e6f9b12259e49908f4fab488fc":"Blade Warrior (Europe) (Proto)","3a40efba91af743006aa093c6ed44638":"Super Ayanami Discovery SlideShow (Japan) (v1.1)","3a4bb57e9fbd4ef563c0c7b59a1c82a5":"Kwirk - He's A-maze-ing! (USA, Europe)","3ab483b3042f9096582c16191b3a3448":"Hit the Ice - VHL - The Official Video Hockey League (USA, Europe) (Beta)","3aba896b1761f25d558b2ee409e0137f":"Ultraman Club - Tekikaijuu o Hakken seyo! (Japan)","3ad6a2e9c2872cd8f92d86e18332262c":"F-1 Race (World)","3addab2611566ab072fc996f8a81b224":"Bomberman GB 3 (Japan) (SGB Enhanced)","3ae6b09a78535d902a5969ca99b9ee73":"Teenage Mutant Ninja Turtles II - Back from the Sewers (USA) (Cowabunga Collection, The)","3ae8eceb23913aeb1a655da481541a6b":"Sensible Soccer - European Champions (Europe)","3afbe0cf110fc6ad8def8377ecffc34d":"Zelda no Densetsu - Yume o Miru Shima (Japan) (Rev 1)","3b051df77605172195dcff97c2c935cc":"Boomer's Adventure in ASMIK World (USA)","3b16ccb118f4959886ab5cbc14041002":"NFL Quarterback Club (USA, Europe)","3b1d442a7b54cc4faf27f6f67d96c892":"Shock Lobster (World)","3b359e9fec183bff5f964e25b599b246":"Seiken Densetsu - Final Fantasy Gaiden (Japan)","3b3ee80272479464698200ad712d4152":"Ren & Stimpy Show, The - Space Cadet Adventures (USA)","3b3fa3dd77c2aec53856210d8311fa6d":"GB Basketball (Japan) (En) (Beta)","3b5827de23512ae2aad56a071e9ae3a1":"TripleA (USA) (Proto)","3b710442b0a0e792e43dd98cb079dc5e":"Hyper Black Bass (Japan) (En,Ja)","3b716f2729fb25ef75ba53c5115bff89":"Minolta 2156 Adj. Program (USA)","3ba194e36ddefbd8585d9e567e9f494d":"Monopoly (Europe) (En,Fr,De)","3ba766a3d32b765bb038d2ef6b49ead4":"Sacred Meat (World) (v1.3)","3c0025edba53399e4fece1811d8e2be2":"Legend of Zelda, The - Link's Awakening DX (USA, Europe) (Proto)","3c239f6409e4c15fbec69ef5459954a2":"Yelu Wangzi (Prince Yeh Rude) (Taiwan) (En)","3c268409bf6869a8707839a7dd1ee1c7":"Spanky's Quest (USA)","3c8dfc25fd8d2691cfe1cb2c375e097c":"Power Mission (USA)","3ce1af74e7f2d498d08ff797dde87a1e":"Bomb Jack (Europe) (Beta 2)","3cf985dde797f178b8446aefedf5cd20":"Bouncing Ball, The (World)","3d02cb66bdeea139aaa1f9d91d092a21":"Heiankyou Alien (Japan) (En)","3d08d0dbe1fa865e3d2e87578cced5f5":"WWF Superstars (Japan)","3d0d05e30fc2d0f7cb6a956dd5154590":"Into the Blue (World)","3d1c4d68c6ef613b919f32303bce6beb":"Sacred Meat (World) (v1.1)","3d2eae10e026ca03f6a7a91ae089eb20":"Jungle Strike (USA)","3d4537f6a0542f781e408bd5440d23dd":"Dragon Ball Z - Gokuu Hishouden (Japan) (SGB Enhanced)","3d45c1ee9abd5738df46d2bdda8b57dc":"Pokemon - Red Version (USA, Europe) (SGB Enhanced)","3d57e0391c8191c105a4f015a0c103e9":"Battletoads (Japan)","3d8f6eccc13f3344c8d971b7e141f064":"Snoopy - Magic Show (Japan) (En)","3d9099f5c9822d771f461c20a153a59b":"Scotland Yard (Japan)","3db9f9f0c5913d3c9f7b5d5fbf7b5e02":"Chessmaster, The (USA, Europe)","3dbe9be772ca50da3a76d8860c7b08e2":"Side Pocket (World)","3dcbd16d3f9da153dca926f200ca1725":"Kachiuma Yosou Keiba Kizoku (Japan)","3de5424cbdc270c965487a614a360828":"Kachiuma Yosou Keiba Kizoku EX '94 (Japan)","3defa1c909af45963f3ad867ec5f3414":"Ray-Thunder (Japan)","3e0790735fcbfa6f2cd2c5c850eeed1e":"Mogu Mogu Gombo - Harukanaru Chou Ryouri Densetsu (Japan) (SGB Enhanced)","3e35ece810eaa26bb027a18f58cf6dba":"Game Boy Gallery 2 (Japan) (SGB Enhanced)","3e7d080982af3aedb9c7e9dc5486b468":"Teenage Mutant Ninja Turtles (Japan)","3e986cf3598e0a690fed48aa8c7d95b1":"Battle Arena Toshinden (Europe) (SGB Enhanced)","3eade561a44103622a0aff7b176d3207":"Nettou The King of Fighters '95 (Japan) (SGB Enhanced)","3eb476d0c6347ce9034246f826866a58":"RoboCop 2 (USA, Europe)","3eb5ebda098635b2da0021f46a959de4":"Mani 4 in 1 - Takahashi Meijin no Bouken-jima II + GB Genjin + Bomber Boy + Milon no Meikyuu Kumikyoku (China) (Ja)","3ef00d0a0b1e7e359b0246c2cff30477":"Jimmy Connors Tennis (USA, Europe) (Beta)","3efc6c34d89a19a434dcf2e8f45e67b9":"Jankenman (Japan)","3f2335f849fd02769099ac3bd6d81337":"Milon no Meikyuu Kumikyoku (Japan)","3f2f5ec07a222c281796691bb43249f9":"Jet Pak Man (Europe) (Proto)","3f33f45c37f962307be4be041f8e0766":"Little Tales of Alexandria, The - Mr Meows Dance Party! (World) (MBC5) (SGB Enhanced)","3f55fde8e05a4d372f7f30a1f7398fb5":"Hunchback of Notre Dame, The - 5 Foolishly Fun Topsy Turvy Games (USA, Europe) (SGB Enhanced)","3fc426ca2907b73a43c9ff63f78e1105":"Tower of Hanoi (World) (v1.1)","3fdfe480a8cd859fb682f32b6da2fb5b":"A Fairy Without Wings (World) (v1.3.0)","400cb2ad3d7ee30483b28f5f098a5bb7":"Double Yakuman II (Japan)","401647ad59208d67507245ac13e3894c":"Rockman World 4 (Japan)","4019ad36149883be86fb3ee45f79c042":"Roommate Simulator (World)","401e3778fb24a2af4bce7a3189fcfdd3":"Namco Gallery Vol.3 (Japan) (SGB Enhanced)","4057131cb9cedfb2fcdbc36904e7896d":"God Medicine - Fukkokuban (Japan) (SGB Enhanced)","4067f70f9def39ceb49a258540ce3d66":"Ghostbusters II (Japan) (En)","4072bd18c72755b15a3ae712202807fc":"Super Off Road (USA, Europe) (Beta)","4097f89b7f66168fd977f2df42db15ec":"Matthias Sammer Soccer (Germany) (SGB Enhanced)","409da59eb0050f04834bd2d7a83368ab":"Gargoyle's Quest II - The Demon Darkness (Europe) (Proto)","40b4238e683eea908a09f978ce5aff2a":"Tom to Jerry (Japan) (En)","40c38735c8f225ca8de749efceab6ceb":"Bikkuri Nekketsu Shin Kiroku! - Dokodemo Kin Medal (Japan)","411c3d168141d10eddd93243f2a7765f":"Ultima - Runes of Virtue (USA)","412075e19f160df8c3571ae37184d827":"Turok - Battle of the Bionosaurs (Japan)","4150508f6882f691dc6dd3f28bc4d48f":"Onigashima Pachinkoten (Japan)","41ac9bd50237cbd54f13b50abf30973a":"Dino's Offline Adventure (World)","41b56cdbf28fc78f4e3d6f66907214ff":"Dracula Densetsu II (Japan) (Castlevania Anniversary Collection)","41e5a302c648373565f7fde4ca7e4ff9":"Spot - The Video Game (Europe)","4202e3486b95ab9a5718830b2aa9b7f6":"Pingu - Sekai de 1ban Genki na Penguin (Japan)","42048ce08886f2adcc4f004e002bed50":"Sword of Hope, The (Spain)","421a923ba483f65a967b8455500b8880":"RoboCop (USA)","422652c9f3474cb89f8eee38808ebfb4":"Little Master 2 - Raikou no Kishi (Japan)","426f96e31186b3a6e73a624d97b3b2dc":"Super Black Bass (USA)","42926474038e4d82e2b7a5e60fbd46c6":"Hook (Japan)","4297f98b9b8354e34e7fdd237bbf3265":"Conefuse (World) (Rev 1)","42b8ce5b0d54f4565ba99e02f09fe115":"Fighting Simulator 2 in 1 - Flying Warriors (USA, Europe)","42d2f65e2549be9d1d126a6828b5d1c1":"Game Boy Camera (USA, Europe) (SGB Enhanced)","42f06d0e5fa65bf245f52249385b94a6":"Super Bikkuriman - Densetsu no Sekiban (Japan)","43189b859c0036119f233d46b1f2e9fd":"Bugs Bunny Crazy Castle, The (USA, Europe)","435b566a4b3745b0acc5a976bedd9245":"Chuck Rock (USA, Europe)","437fec3b28d28314d580ec1e4d0bc9ae":"Aa Harimanada (Japan)","4390a7431c78dac56220c336d4ec0507":"Mofa Qiu - Magic Ball (Taiwan) (Multicart Rip)","43a4301aa781930da85273605ab87cab":"Minolta 2468 Adj. Program (USA)","43d2867db7f523f597f911f7021766db":"Nick Faldo Championship Golf (USA) (Proto)","43e26f216d50106a8fccbcc04cda0c29":"T2 - The Arcade Game (USA, Europe)","43f73771d3141a522c5c6c8617042d6f":"Spot (Japan)","440e6ef612c2ff60511550ca4ff7e023":"Death Track (Europe) (Proto)","4426b35ef04094f9c5518d6fb6414d55":"Nettou Samurai Spirits - Zankurou Musouken (Japan) (SGB Enhanced)","442c13b1747376782d1dae3f8877f94d":"Sanrio Uranai Party (Japan) (Rev 1)","4479ff0178814ad277eec712aa1cc2af":"Super Mario World 7 (Taiwan)","447b9245e591aa2f17a2a1fe85982bf1":"Pokemon - Blue Version (Hong Kong) (SGB Enhanced) (Pirate)","44817f21754034ffb70e37f59fc3e2b6":"R-Type II (USA) (Proto)","448a0f127123e88dd4c0e98450f0fed0":"Jumpy (World)","44dd0f3f4488c7660e432f0da4a01a1f":"4 in 1 (Europe) (4B-009, Sachen)","44f9973289c92ac906d06ab7ead244ad":"Speedball 2 - Brutal Deluxe (Japan) (En) (Possible Proto)","4511333eeecb3c9f20874d595424447c":"Tetris Plus (USA, Europe) (SGB Enhanced)","4523452d7dde5e486187b384fee751a7":"Do I Pass (World) (Fr) (v1.4.2)","4528d42eae39a3fa756eefa29d52ef55":"Smurfs, The (Europe) (En,Fr,De,Es)","454e1f0a2af6070b408694e7e05482be":"Tiny Toon Adventures (Japan) (Beta)","454f4506873737eece69fab4aa60eed7":"TwinBee da!! (Japan) (Beta)","455ed49f293e09e38ac654fb334fcc7c":"Pocket Monsters Yellow (Hong Kong) (SGB Enhanced) (Pirate)","4599627050687063da3f5cf804dc16f6":"Dr. Mario (World) (Beta)","45ae101994d2dfb0cec87e8a97e2b5a8":"Solomon's Club (Europe)","45b5142059907dbd92aaf3f8d003721b":"Megalit (USA, Europe)","45cb9cd406f53033e0fbfc5413797192":"Goukaku Boy Series - Shikakui Atama o Maruku Suru - Shakai Battle Hen (Japan) (IE Institute)","45d69d4632914671de114f6f1f607e80":"Heart Knight (World)","45dcc259728a00118fe86f841d48564f":"Worms (Europe)","45f764bf05abe6102a641642c71cede3":"Pitman (Japan) (En)","46031cac5d2280d74dda7471ab23c06e":"Magical Taruruuto-kun (Japan)","4625fce9752df3666f19efd2a6f03748":"Pachio-kun - Puzzle Castle (Japan)","463c241c8721ab1d1da17c91de9f8a32":"Pokemon - Edicion Roja (Spain) (SGB Enhanced)","4668b13913dfb14e43c263a7015eb9ab":"NBA Jam - Tournament Edition (Japan) (En)","46853483281d6b04cf94eb541480f8e3":"Shinri Game, The (Japan)","469605e02eb10652f8f2afa8c7ebffd5":"Double Dragon 3 - The Arcade Game (USA, Europe)","46972f66b5c73b6b19fe21077b195669":"Tasmania Story (USA)","46b681a7873d130be35e2115263baa6e":"NHL Hockey 95 (USA, Europe) (SGB Enhanced)","46b6ae39b3140f81d66be8338a8bcea3":"Small Soldiers (USA, Europe) (SGB Enhanced)","46d234cdf252280777412a5db98e05d5":"Bug Bites! (World)","473da7ca1a6a8ad23ec28c2f838bce20":"Yu Yu Hakusho Dai-2-dan - Ankoku Bujutsukai Hen (Japan)","4781664e85368b224abfa7c01a421f18":"Pachio-kun Game Gallery (Japan)","47900027fcbc2f749b3c0b1ce7fa3372":"Montezuma's Return! (Europe) (En,Fr,De,Es,It)","47a5ddf39068d624743455c0c64571d4":"Robot Ponkots - Sun Version - Comic Bom Bom Special Version (Japan) (SGB Enhanced)","47b2627e14592a8c5b53c84c5f06400b":"Jeep Jamboree - Off-Road Adventure (USA)","484d70a54f125271a24c5ec870cf8a32":"InfoGenius Productivity Pak - Berlitz German Translator (USA, Europe) (Proto)","4859ec2b18c4fabf489eb570c1d7d326":"Donkey Kong (World) (Rev 1) (SGB Enhanced)","486143fef63cbc535deb928eeade5555":"Dungeon Warrior (Europe) (Proto)","4866ea7bdaa92c6986d4847209ebbd20":"Battletoads in Ragnarok's World (USA)","48855f13b18a474dede333f005750ea9":"Bill & Ted's Excellent Portable Adventure - A Bogus Journey! (World) (Retro Collection)","489f52a2761dcb6f01567ef5de14cb8a":"Bionic Commando (Japan)","48b4c5f65705b2d3fd9fb0643d754326":"Interblocked (World)","48c32dce8fbd6af3fef42a787ef7aa17":"Jane in the Jungle (World)","48cca9e48b1546b24a077645b5c7c5db":"Gun Law (World)","48e73c1d813366e16e2cb0f9ac2e89b1":"Aqua (World) (v1.1)","48ea776eace6f2582b70dc965cf2df1f":"Tobu Tobu Girl (World)","48fa05f3c1e7546a30c546c0a141c034":"Chachamaru Panic (Japan)","48fe5119e80f17e9663af671922abea2":"Year After, The (World) (Fr) (Proto)","49bcb33470df757847eef5e170c9b6bd":"Garfield Labyrinth (Europe)","49c8eaa9801c56b432beb6cf51d7fde0":"Pinball Dreams (USA, Europe)","49cce431c6aa61f97e650cfd83724f6e":"FIFA International Soccer (USA, Europe) (En,Fr,De,Es) (SGB Enhanced)","49ced6bdb72265570d8889485af252f7":"Minolta 2181 Adj. Program (USA)","49e512bb8b0dcc6a8d26d873623d0590":"Game Genie (USA) (v2.1)","49eff735e839f8a57f75afcbf2c11ae4":"Ginga - Card & Puzzle Collection (Japan) (En,Ja)","49f8ba40e521bb0451ac5c6c1d00af77":"Galaga & Galaxian (Japan) (En) (SGB Enhanced)","49ff7673c52b1d747320e0b59b0e79aa":"Another Push Game (World) (v1.07) (Proto)","4a1ecc8ccc706ed5fdce2fdab2aaf03e":"Humans, The (USA)","4a3309be521df2ca7645363a88d1f2b4":"Robin Hood - Prince of Thieves (France)","4a50476f83a1755918d43b41dc869110":"Minolta 2162 Adj. Program (USA) (Alt)","4a967a8f1dd6f627e8b72950739c26d4":"Amazing Spider-Man, The (USA, Europe)","4ab6bd9d417355938a5197941863d98f":"Pachinko Saiyuuki (Japan)","4ab78239e79ba059d0d7aa7a629a9474":"Bomberman GB 2 (Japan) (SGB Enhanced)","4adf20cf4ced9fa2512578c133ad269f":"Capcom Quiz - Hatena no Daibouken (Japan)","4ae40f313df9273c961cac9b25e16bde":"Song of Morus - Gala of Battle (World) (En,Ja) (Beta) (Digital)","4b1a8bfc3b492a00d4473993d3512b44":"Little Tales of Alexandria, The - Mr Meows Dance Party! (World) (MBC3) (SGB Enhanced)","4b248813c7f2317e55690b5c95f163b2":"RoboCop (Japan) (En)","4b49017d182635c587ef2e3001769785":"Golf Classic (Europe) (SGB Enhanced)","4b4d6e6d4870d36a26e6fe6ad73b0eac":"Aerostar (Japan) (En)","4b5732e16d985d6ccac614aaad171c9d":"Alphamax (World)","4ba0ac0dfb3bcee737db0971105f468c":"World Beach Volley - 1992 GB Cup (Europe) (Beta)","4ba4398181d98958fa7434ba7716f11a":"Mega Man - Dr. Wily's Revenge (USA)","4bd6e929ec716a5c7fe7dc684860d551":"Super Mario Land 2 - 6 Golden Coins (USA, Europe) (Rev 2)","4c24f644e70f0786d20d8ca9ffcea51c":"Nettou Real Bout Garou Densetsu Special (Japan) (SGB Enhanced)","4c30d454b5520414fd81d5ffa51375c5":"Super Momotarou Dentetsu II (Japan)","4c44844f8d5aa3305a0cf2c95cf96333":"Pocket Monsters - Aka (Japan) (Rev 1) (SGB Enhanced)","4c614f884a07872f12056ad1a421e1f9":"Mega Man III (USA)","4c76f3947ec093275c65eb3932678712":"From TV Animation Slam Dunk 2 - Zenkoku e no Tip Off (Japan) (SGB Enhanced)","4cee4e93651d9468e7ef47975b71aca2":"Play Action Football (USA)","4cfa25f0cc297fd5f98faa1ddae083f0":"Goukaku Boy Series - Yamakawa Ichimonittou - Nihonshi B Yougo Mondaishuu (Japan)","4d07686c9fda0b9ce82b67d8c5ba90ce":"Deadeus (World) (v1.2.5)","4d2ec4da71d11f95367d9163c89b70f9":"Seisenshi - Saint Paradise - Saikyou no Senshitachi (Japan)","4d4eae6560062b9a12d9770653f1a53f":"Nemesis (Europe)","4d606ab4ffd5c3d3ecf914a6af1c1f90":"Felix the Cat (USA, Europe)","4d82905d5f9b2b3a7add5269e3133c1d":"Ninja Spirit (USA) (Proto)","4d949294f3cda07f2d12e5f73e6caeaa":"Star Trek - The Next Generation (Germany)","4e493ada5353cf6eb1c0f009d6a5ac13":"Nettou Garou Densetsu 2 - Aratanaru Tatakai (Japan) (SGB Enhanced)","4e4d51039cce43b11f51191dc7a6bcd9":"Race Days (USA)","4e6788188fd7e6bab9b6974b308a38eb":"Shounen Ashibe - Yuuenchi Panic (Japan)","4ea04ab8fcea4c41f26e44bb4f50d73e":"SD Lupin Sansei - Kinko Yaburi Daisakusen (Japan)","4ea0a34a76da9ed232d514987ba89d90":"Street Racer (Japan) (En)","4ead57f6fb441fb86a78922f1288ee40":"Panel no Ninja Kesamaru (Japan)","4eb8d56e6cf1e54665e995cf0cb30108":"Pinball - Revenge of the 'Gator (USA, Europe) (Beta)","4ebe14c4c51555908c0e4cabb66dc813":"Kaeru no Tame ni Kane wa Naru (Japan)","4ec2df5bc21a4dc75b79ee929723dc39":"Garfield Labyrinth (Europe) (Beta)","4ed480f8974e938c01be3b410ebec3df":"Downtown Special - Kunio-kun no Jidaigeki Da yo Zenin Shuugou! (Japan)","4f0349eca35c2dbb3b810e2ca9c9c94b":"Doraemon no Study Boy 5 - Shou 2 Sansuu Keisan (Japan)","4f1b689127635cebe5145926e0e24fbb":"Spy vs Spy - Operation Boobytrap (Europe)","4f3b84eb325f9162086fac77ac577e7c":"Double Dragon II (USA, Europe)","4f597338777cc0b67465bd0dde285645":"Snoopy no Hajimete no Otsukai (Japan) (SGB Enhanced)","4f5c4c439f1134177e02d72c794882ba":"Alien 3 (Japan) (En)","4f99d49908e027125473445ea1937817":"WWF War Zone (USA, Europe)","4fcc13db8144687e6b28200387aed25c":"Flipull (USA)","4ff223851bc7e3d19acdbf8034e4829f":"Moguranya (Japan) (SGB Enhanced)","504e1a39167c467b15d5ad56b744ad48":"Ninja Boy 2 (USA, Europe)","5062da78cdf359a8e0cf0f6a6239698a":"Monster Truck (Japan) (En)","506ccd75db221acbf26f1681f3c97efd":"Spider-Man 2 (USA, Europe)","5070aaf41d5ae9ee08f988b9aad26af5":"Lolo no Daibouken (Japan)","508e937dc634f36d738d65734f3ae0ab":"Toy Story (Europe) (SGB Enhanced)","508f13c91c125dfc8ea0334d3bd9b2fd":"Pachinko Monogatari Gaiden (Japan) (SGB Enhanced)","50927e843568814f7ed45ec4f944bd8b":"Pokemon - Blue Version (USA, Europe) (SGB Enhanced)","50971f6cbb3e4395cb66213d7f096b46":"Pocket Bomberman (Japan) (SGB Enhanced)","50a208bd0a223c037e01ffe07b04fa5b":"Alien vs Predator - The Last of His Clan (USA)","50d0748e807295cfb01335c58fc9b520":"InfoGenius Productivity Pak - Berlitz Japanese Translator (USA, Europe) (Proto)","512b5b0ce0933a8c3217d810b23bea0a":"Oira Jajamaru! Sekai Daibouken (Japan)","514688df17c1f7bcf978a13c83d0c22c":"Q-bert for Game Boy (USA, Europe)","516085555e451966b9dd5166dfe6c728":"Arcade Classic No. 2 - Centipede & Millipede (USA, Europe) (SGB Enhanced)","517373dfec43ebaedccb2fa62307ff87":"Kitchen Panic (Japan)","51de6f0697d2bbc53ccb5727dcdc884b":"Goukaku Boy Series - Yamakawa Ichimonittou - Sekaishi B Yougo Mondaishuu (Japan)","51dff0233c9d348ab59341d8afbb6275":"Monster Maker (Japan)","521d2aa473f4e740a6938861f70511cc":"Nail 'n Scale (USA, Europe)","522c139d757a5f5aef530c60ef3c5502":"Magic Knight Rayearth 2nd. - The Missing Colors (Japan) (SGB Enhanced)","523e5c08731617a2826a3772126045cb":"J.League Fighting Soccer - The King of Ace Strikers (Japan)","52700ea227c3a31f170ccbc6a052a7a8":"Zool - Ninja of the 'Nth' Dimension (USA)","5294a5fed7e88a6f76707979c83017d6":"Undercover Cops Gaiden - Hakaishin Garumaa (Japan)","52e110882a9f42c8b5c97489a29005f5":"God Medicine - Fantasy Sekai no Tanjou (Japan)","530220b702b6e1cc4d0ca9fec3749646":"Quarth (Japan)","531a63f17ebd140ed15b382c0c13eebb":"Sports Illustrated - Golf Classic (USA) (SGB Enhanced)","5354465291244e5a035807c2666d185e":"Asterix & Obelix (Europe) (Fr,De) (SGB Enhanced)","53797d020821b171f9909bc300ed5ad1":"4 in 1 (Europe) (4B-002, Sachen)","53b746bff74c50cd3ebcf41161c66cf3":"A-mazing Tater (USA)","53caa3d63f1db9059cabe555e18cf2ff":"Goukaku Boy Series - Shikakui Atama o Maruku Suru - Sansuu Battle Hen (Japan) (IE Institute)","53d8596868fe081cef40ecc02d463ea3":"Batman Forever (Japan) (En)","53e19693d3d1dfb2160e66742bacdb87":"Tekkyu Fight! - The Great Battle Gaiden (Japan) (Beta)","5401647a784df1dcced7e5feaa38b37f":"Space Invaders (Europe) (Beta) (SGB Enhanced)","545277c74a3fbeda2c9213d49659ffdd":"Universal Soldier (USA, Europe)","545c852f0c3f40ab57585b9269f7a32b":"Pokemon - Yellow Version - Special Pikachu Edition (USA, Europe) (Beta) (CGB+SGB Enhanced) (Alt)","545de5c311259b7f7ec313a9d58cf4b4":"Double Dragon (USA, Europe)","54cdfd90c8038846714643b2a68c6bb8":"World Beach Volley - 1992 GB Cup (Europe)","54cead768696a61b7cd31f91c0c58021":"Animal Breeder (Japan) (SGB Enhanced)","54ef4bb8c3d272af5bb78b4306f37248":"Pac-In-Time (USA) (SGB Enhanced)","5526c1396e574e92ec8f467c0de80377":"Momotarou Densetsu Gaiden (Japan)","5544efa64429127007aa3779beaa654e":"Beethoven (Europe) (SGB Enhanced)","557235db1fd8abdf216260693239ab00":"My World (World)","55945a517d1e89003003d51c7ec938be":"Super Star Wars - Return of the Jedi (USA, Europe) (SGB Enhanced)","55a2ca284b3b42f6c55d59f9e11c196c":"Popeye (Japan) (En)","55ad8dd2a99a840f3726600380b44315":"Legend of the River King GB (Australia) (SGB Enhanced)","55cee72182f73704ac2240a971887210":"Pachio-kun 3 (Japan)","55ef8421492242c2726e355c41aef000":"Block Kuzushi GB (Japan) (SGB Enhanced)","560c9262b03cf479b6ee544e09c161b4":"Winter Gold (Europe)","563c4c81878db48d8a0b6091f4c1cd92":"Teke Teke! Asmik-kun World (Japan)","5664cdc54d539374c8d318c6da06969e":"Star Wars - The Empire Strikes Back (USA, Europe)","5675d1b55cf842bf6919bdcc69f2f311":"Goukaku Boy GOLD - Shikakui Atama o Maruku Suru - Kanji no Tatsujin (Japan) (IE Institute)","567b0045cc26135a54ca025b0af7e9ef":"Gargoyle's Quest (Europe) (Rev 1)","5683738a97c8de47b1c485bddf97b46b":"seaQuest DSV (USA, Europe) (Beta)","56a1787b8a2dde07756b3cc36e79a9a0":"Gargoyle's Quest II - The Demon Darkness (USA) (Proto)","56c494cd7737f51ee2c3aeb50406e51a":"Sports Illustrated - Championship Football & Baseball (USA)","56e82954ece9a4a247ccd531ec6aa1ea":"Minolta 2085 Adj. Program (USA)","56f304dbd0045521271de857ffc77fbe":"Brain Drain (Europe) (SGB Enhanced)","57726c28dc09949029a154f63b891dd0":"Addams Family, The - Pugsley's Scavenger Hunt (USA, Europe)","57b192b42b4e1945cc7f20c98f7e1dab":"Cool Ball (USA)","57d60f97e42d24835b6723d9b7a3c0db":"Motocross Maniacs (Japan) (En)","57e9f964e17ebbdbf929968cbb42cf62":"Perfect Blend (World) (v0.9) (Bugfix)","5816ae497c301dd88eb0a8c0f64d3fd1":"Beta Soul (World) (v1.1)","588b4e9ee2cbf179734c6e71379cd144":"Honoo no Toukyuuji - Dodge Danpei (Japan)","58a854ee2aacdf5190b603ffcd55fd84":"Jungle Book, The (World) (Disney Classic Games)","58d063c39a469f4cc56e94775cbe4af3":"Krezber (World)","58e1cd396548b0e57b0514d8bec066d9":"Spot - The Cool Adventure (USA)","596b9a0ca8ed82011a83aca42119c6bf":"Super Black Bass Pocket (Japan) (SGB Enhanced)","59e50b2e9db32167f7293c4614bf7add":"Make Way (World)","59e6f8f432d4c0b99a3fb6432a2cdad7":"Splitz - Nigaoe 15 Game (Japan) (En)","59f6995b8b6bf9a65aac966d039a2b27":"TaleSpin (Spain) (Proto)","5a11855f9184ab27fa8127f2effc9950":"Rap Quest (USA) (Proto)","5a1bf3838705acb4d829572adedd708b":"Sword of Hope, The (Europe) (Proto)","5a4d3e46edae34a7dd6acd01d4b1c843":"Calculator (Unknown) (Proto)","5a75fe8de54e4cbd09cae23f050f6965":"Catrap (USA)","5a88b67ed5475e591747bc7956642456":"Astro Rabby (Japan) (En)","5aa012cf540a5267d6adea6659764441":"Spirou (Europe) (En,Fr,De,Es) (SGB Enhanced)","5aa4ece6d3fd99e7ce0682b92c55d25b":"Goukaku Boy GOLD - Shikakui Atama o Maruku Suru - Nanmon no Sho (Japan) (Imagineer)","5ac712759de3b6d6f7760272d62e2f53":"Hon Shougi (Japan) (SGB Enhanced)","5add36377363b6e8b38d5f69a33b4ed2":"Jack Nicklaus Golf (France)","5af4d81459e7e34adfc4e065c98dd643":"Tom & Jerry (USA, Europe)","5b47f714dc337db2dd9972383e6d0805":"Motocross Maniacs (Europe) (Rev 1)","5b52c57d9cffe2ada5fadb5ae841faea":"Sarakon (Europe) (Proto)","5b83db9958eefbd72a82c4893e79d9e1":"Mighty Morphin Power Rangers (USA, Europe) (SGB Enhanced)","5bc0913d533000522c7c9cac1ef6f97f":"Legend of Zelda, The - Link's Awakening (France)","5bd352e85f75a8314e4dce538cb956c6":"Taiyou no Yuusha - Fighbird GB (Japan)","5c39c161b85481d7154f19081ff40f42":"Super Scrabble (USA)","5c3a589a29530df94a09d96d463f6a79":"Dexterity (USA, Europe) (Beta)","5c3c43fdc01ce3296baac197dc53b060":"Super Donkey Kong GB (Japan) (SGB Enhanced)","5c4ed53347a60e467df77024f05e23ba":"InfoGenius Productivity Pak - Frommer's Travel Guide (USA)","5c63962225ae9f8738305dc281ebbfb0":"Game Boy Gallery 2 (Australia) (SGB Enhanced)","5c815764df1d3c04d99a9bc5b298aa2c":"SD Gundam Gaiden - Lacroan' Heroes (Japan)","5c837aeba2aa844d4cd34653d4e332ea":"Darkwing Duck (Europe)","5ca71cd4ceace3cb6650ff05d679d149":"Oddworld Adventures (USA, Europe)","5cbd186af88b167c2a972ddac81ae756":"Popeye 2 (Japan)","5cfa323ad8d8e4a6d50022d5c64b46fd":"Ms. Pac-Man (Europe)","5cff00db388d27727a1c9fb4c303f40b":"Mario & Yoshi (Europe)","5d07f39b93c83683c2c77ed31ec66048":"Seaside Volley (Japan)","5d1d8fef74ca8a35e1b09705ab3df3d8":"Spot - Cool Adventure (Japan) (En)","5d516b5de2bf54fb6c687f1838b628cc":"Power Mission (Japan) (En) (Rev 1)","5d6221ea6ece7491e8f6761f5c36dd24":"Super Ayanami Discovery SlideShow (Japan)","5d9607f5fdaee714bb14fdfe0fdcab59":"My Dinner with Andre (World) (v1.1)","5d9c071cf6eb5f3a697bbcd9311b4d04":"Pocket Monsters - Pikachu (Japan) (Rev 2) (SGB Enhanced)","5da2f3f6cbdffc96c2604f0954717e15":"Shapeshifter, The (World)","5dbf99aae7f4c2c36e3ceff27d85d4ff":"Duck (World)","5dcc16e0c5caf4c5c610c02b6a5746bf":"Jeopardy! - Sports Edition (USA)","5df1a8fcc6e4b05779c8e12f300cb1fe":"Tip Off (Europe) (Beta 2)","5e022adf9659a754a6c2a8e1ce1de117":"Top Gun - Guts & Glory (USA, Europe)","5e0703f8fc08728544f4f2594ee93e81":"Janshirou (Japan)","5e3005e18f030f58e8b919d35cb297d7":"Blodia (Japan) (En)","5e411c0f57b2d867f16084251e677d1c":"Malibu Beach Volleyball (USA)","5e6f8e10c3854f0768ab6b1fd9ceb12a":"Xin Shuma Baobei Huang (China) (Pirate)","5eb0cc0785adbc6ad8c1dfa09fe4a692":"GBKiss Mini Games (Japan)","5ece0017f734e6a813b622b8b455cfe9":"Lemmings (Europe) (Beta)","5f09960bc839e94957f44ebebb70e920":"Alfred Chicken (Europe) (Beta)","5f2ee96647b5274d343db91f4561c628":"Doraemon no Study Boy 6 - Gakushuu Kanji Master 1006 (Japan)","5f41a4de9f480c72cbc6eaad6bcc3753":"Mystic Quest (Europe)","5f855203b56886fcb88c54692144c553":"Zen - Intergalactic Ninja (Europe)","60397234f56fdf4eb39c07ca62e62679":"Great Detention Getaway, The (World)","6064c32bcf58c67966231e0ecbc76bfd":"Quiz Sekai wa Show by Shoubai!! (Japan)","6073cb28e651b48f0bf19e654aab8c7d":"Power Racer (USA)","60aff2b753df13e3702895300687dada":"Mani 4 in 1 - Tetris + Alleyway + Yakuman + Tennis (China) (Ja)","60e55697da19bb160316ec290a7a7437":"Donkey Kong (Japan, USA) (En) (SGB Enhanced)","60ef5ffc3af0ac5110c2b31e83570494":"Jeopardy! (USA)","60f66390bef3ec6e5a84e299d2261f73":"Jeopardy! - Platinum Edition (USA) (SGB Enhanced)","613c2336e19ea8f958f66c3e7dfef3c5":"Goal! (Europe)","614c8e744c8f07c6e3b29480478600d4":"Bakenou V3 (Japan)","615b1b2e4135363df4f0faae5e98aafd":"Remute - Living Electronics (World) (Album)","615c8d01fed90d40d6bf00a873dfdb71":"Popeye (USA) (Proto)","6175a5ef55a1998944267e75d8ebf79d":"Golf (World)","61e363e80ac331a3d5f71c59044862f9":"King of the Zoo (Europe)","62151973748a8a10aea1fee442c6e78b":"Small Town Emo (World)","629275bbcb97ef74b0a9138f70bd6cd7":"Pachi-Slot Kids 2 (Japan)","62b8be3a8e17972051897da4796ba69d":"Lethal Weapon (USA, Europe) (Beta)","62cc2571732bb10a5bc6dbdd7876b5dc":"Minolta 2440 Adj. Program (USA)","62d484bc4988823a143e50fddaadae2f":"Contra (World) (Contra Anniversary Collection)","62f6b0c1c7eed0af0cb7d9f15d14e7c8":"Penguin Land (Japan)","63098fde8f2dcb977c9a8f0389e0d033":"Star Wars (USA)","634532de88aa7c35bd9231ee5356ae8a":"Spider-Man - X-Men - Arcade's Revenge (USA, Europe)","63811bc7f768c0de33fb2c4c702e9533":"Titus the Fox (USA, Europe)","63bbfce4fb22f4b77e68cc67f02c4b05":"Brain Bender (USA)","63c858be7cc05e2cb7a8d3ccddce5dff":"Ganbare Goemon - Sarawareta Ebisumaru (Japan)","63e3f5f4b90f17bdf6d2f2aed515e248":"Gargoyle's Quest (USA, Europe)","63f593e38a526a10ff3fa5aec1c8ccb0":"Akumajou Special - Boku Dracula-kun (Japan)","64080619789f154ee057f2946a98c61c":"Miracle Adventure of Esparks - Ushinawareta Seiseki Perivron (Japan)","6468fb0652dde30eb968a44f17c686f1":"Pokemon - Versione Rossa (Italy) (SGB Enhanced)","647563deb5535d2394d7f757571c7487":"Road Rash (USA, Europe) (Beta)","6483f35f0c0c520a46c133dbae83fa77":"Wily & Right no Rockboard - That's Paradise (Japan) (Proto)","648770b4fe55dbcd0d834536bb8685b0":"Chibi Maruko-chan - Maruko Deluxe Theater (Japan) (SGB Enhanced)","6496801345d1597b7dc1c27143e6b9d8":"DX Bakenou Z (Japan) (Rev 1)","64b18855b9f342ab623bcecbf2865cb8":"Kaseki Sousei Reborn (Japan) (SGB Enhanced)","64e365d21f0e58d80749a50e26330ddb":"Tekichuu Rush (Japan)","64f43161eb16eb1be99262c36867bc79":"Prehistorik Man (USA, Europe)","64f7f8af18f75a9b3767e4637e693be7":"Sword of Hope II, The (USA)","6534eff4dff0000f66a0059f0b84e71e":"Turrican (USA, Europe)","654615505816982cdc6446d5af319d6b":"Porklike (World) (v1.05) (SGB Enhanced)","6550d03ed6c62fade08ca7647e57a068":"Ultra Golf (USA) (Beta)","6560b1ba5589509eff4d1edf318fbe58":"Phantom Air Mission (Europe)","656df80c44a1cad7cae382d3bd94a74b":"Teenage Mutant Ninja Turtles III - Radical Rescue (USA) (Rev 1) (Beta)","65d1553ef8e972be46c142a6e713d3df":"Coucou (World)","65e455737df458e59cc7b0892b95e6cd":"Mr. Do! (USA)","65ef3652202749d5d281c9c9641e0e19":"Quiz Nihon Mukashibanashi - Athena no Hatena (Japan)","6600bce6e5a74f8551261d4e68331cae":"Pokemon - Yellow Version - Special Pikachu Edition (USA, Europe) (Beta) (CGB+SGB Enhanced)","660a98b774e7d136e302dfe6557405e9":"Max (Europe)","6633ea57f86c4a117f0b027da68bda92":"Bokujou Monogatari GB (Japan) (SGB Enhanced)","664c613eaaae388d828261fe8a7edbb6":"Tiny Toon Adventures - Wacky Sports (Europe)","665b9ef961ee82edb8db54b3eb5152fd":"DuckTales 2 (Japan)","669700657cb06ed09371cdbdef69e8a3":"Pokemon - Version Rouge (France) (SGB Enhanced)","669a4ecf89794505591b36d617e51f8a":"James Bond 007 (USA, Europe) (SGB Enhanced)","66c924c9f21ab1feddc65fa923dc1f4d":"Cult Jump (Japan)","66db9a375eddbdb8439d8c361b836a45":"Birdie Bartender (World)","66fc892b9682e8e2981fa83fa681ccad":"Hit the Ice - VHL - The Official Video Hockey League (USA, Europe)","66fca02e9bce40162bc76b1f56e5f0e7":"Dragon Ball Z 3 (USA) (SGB Enhanced)","675f64cbcc158260dc8652cbe1dbcdb6":"Year After, The (World) (En) (Proto)","6761f77e6daa82120dd7c73adeec777e":"Akumajou Dracula - Shikkoku Taru Zensoukyoku - Dark Night Prelude (Japan) (SGB Enhanced)","6776c3cf0ef69035529d05342f072446":"Tetris Flash (Japan) (SGB Enhanced)","679555396bce8beab58d4b79acb966bf":"Cadillac II (Japan)","680c8fbb0bc15c850121ef2c929df177":"Metal Masters (USA)","6832c643107d2966e17b3a52cf80a485":"Momotarou Collection (Japan) (SGB Enhanced)","6847a0af37237bbadcf582ed59fcabce":"Janshirou II - Sekai Saikyou no Janshi (Japan)","688312aedbdf646403ddda248263d9aa":"Purikura Pocket 3 - Talent Debut Daisakusen (Japan) (Rev 1) (SGB Enhanced) (NP)","6884a31366f565ca25935e1fba52efbc":"Chase H.Q. (USA, Europe)","68a06792ae4401f9fc09d460120ec2a1":"Lazlos' Leap (USA)","68b8c7756da95ca6173e532be047299a":"8-in-1 (Taiwan) (En)","6917ae35a6ee08108a6e5e7d6a11048b":"Quick Draw (World)","692fc5a0b6a9893d6ea25326c55caae5":"Who Framed Roger Rabbit (USA)","6949e7e7307b0885898e5330e8a7e9cc":"Gerry Anderson's Thunderbirds (Japan)","6993211741eea010f51b1c20b05d4c43":"Home Alone (USA, Europe)","69a775ea530e2390f2f97cb648a567a8":"WCW - The Main Event (USA, Europe)","69c43603ad7718b7b2ec0c48b63cdc49":"Sutte Hakkun (Japan) (Proto) (SGB Enhanced)","69c7619c9f48a97ddbe76e4b21b44172":"Super Mario Land 4 (Unknown) (Ja) (Pirate)","69cb8cf8e86d7fdf3995620f2507ae78":"Mofa Qiu - Magic Ball (Taiwan)","69d05c64157f105855171eeb027eccb3":"Chibi Maruko-chan 4 - Kore ga Nihon Da yo! Ouji-sama (Japan)","69d643bf4e37b3c133518517338b6a1c":"Legend of Zelda, The - Link's Awakening (USA, Europe) (Rev 2)","6a007fe1dea71768f1b0c933ba25554f":"Cheesy Town (World) (En,Ja)","6a0f10c18d253a68ba5d33256c8ccf4c":"Teenage Mutant Ninja Turtles 3 - Turtles Kikiippatsu (Japan)","6a10eb4a1d02d21c0b2a865d464246c3":"Goukaku Boy Series - 99 Nendo Ban Eitango Center 1500 (Japan)","6a268131029986557c75e559622a3c87":"Itsudemo! Nyan to Wonderful (Japan) (SGB Enhanced)","6a3e04a78132d5daab4ee4df860cf48a":"Boxing (Japan) (En)","6a7cb6e2df241e843569c539b724bb5d":"Gunship (World)","6add9bf46fd945f6635419ad60988334":"Splitz (Europe) (Beta)","6ae068044245ff7d873111e27ef4ad95":"Battleship (USA, Europe) (Beta)","6afac3034f2a07a58c1d08b69ed43b9b":"NBA All-Star Challenge 2 (Japan) (En)","6b09cc03750b853bb67845b667d0185e":"Kirby no Block Ball (Japan) (SGB Enhanced)","6b2da5147d5f362a26be59f4d5286cc9":"Alien Olympics (Europe) (Beta 1)","6b371b815a02c5e90836f314b1625b21":"Desert Strike - Return to the Gulf (Europe) (SGB Enhanced)","6b4a1224f2ad4d862cdba8b34429ab23":"Tech and Blood (World)","6b6d4a25d3c1e2890b22271c44e62dbf":"Chessmaster, The (USA) (Rev 1)","6b9ccdc2b6611c87dd5425ebcf95185c":"Hitori de Dekirumon! - Cooking Densetsu (Japan)","6bf40d108ca2eb5d7efc495832880f24":"Minolta 2420 Adj. Program (USA)","6c06369e6d6ecbf2d7b5a5254a11e541":"Philip & Marlowe in Bloomland (USA) (Proto)","6c11e7ad5b93d5eab86957cbc5cbe853":"Teenage Mutant Ninja Turtles 2 (Japan) (En) (Beta)","6c1f80a396a47bb145814d2ce0e08cfd":"Pyro la Chronoflamme (World) (Fr) (Proto)","6c4d2f2a4aa7029759441d2c16d8c931":"Ring Rage (USA)","6c5c276f68bea365821172927706cc0b":"Windows93 Adventure (World)","6c960f0e87a857a7b49ef08484f79ce0":"Hugo (Europe) (SGB Enhanced)","6cbaaf40726a834ba7b3d7f179a140fe":"Aoki Densetsu Shoot! (Japan) (SGB Enhanced)","6cc281134629c13a543bce77cb408f4f":"Beethoven (USA) (Proto) (SGB Enhanced)","6cdbf3cdde7defc8d81d5bf2afb9fddd":"Kuma no Puutarou - Takara Sagashi da Ooiri Game Battle! (Japan) (SGB Enhanced)","6cdea29accd2c7c1b2af1822f142be4d":"Lemmings (Japan) (En)","6ceb30c99e4642b62533f6f9101d59e5":"Shikinjou (Japan)","6d0fdfd7dfb144f37afa346bd02518be":"Porklike (World) (v1.0.3)","6d22cab0cbb831bc64abf4f5bad464ff":"Sheep It Up (World) (Digital)","6d24c94d3acd89b4b703f7bd2a504833":"Battletoads (USA, Europe)","6d2ab72fc3f632493a04fd432508067d":"WWF Raw (USA, Europe)","6d301bbecadb7d4cd064a97751d642c5":"Fleet Commander VS. (Japan)","6db7aa2399e9b6723e41e47c73379216":"Tokyo Disneyland - Fantasy Tour (Japan) (SGB Enhanced)","6dfcaebffc8e2645bb2b1e5be69e1514":"Maui Mallard in Cold Shadow (USA)","6e20cfac9f66ab55bfb5e7524ef4c144":"Sports Illustrated for Kids - The Ultimate Triple Dare! (USA)","6e2ab82a7e2348ba9753af34f11892e4":"Dr. Franken II (USA, Europe) (En,Fr,De,Es,It,Nl,Sv)","6e30394fd7ef4a4dc3fe1edd9fc69f72":"Donkey Kong Land 2 (USA, Europe) (SGB Enhanced)","6e3ad0b363bad39886733b17a3e19015":"Rolan's Curse II (USA) (Beta)","6e3fa61e265eff43bdc928d59b2938c1":"Dirty Racing (Europe) (Proto)","6e47b388dffae893ff1fc33ca552cf9a":"Probotector 2 (Europe) (Beta) (SGB Enhanced)","6e7663f908334724548a66fc9c386002":"Pokemon - Edicion Azul (Spain) (SGB Enhanced)","6e8166c3783d1807d0a8c3b649e583c1":"Blades of Steel (Europe)","6e8ea043087f4ca441866b03389575e2":"Total Carnage (USA, Europe)","6e98954e48579451c8bdef80eaafaa54":"Minolta 2428 Adj. Program (USA)","6e9dd3c1fb169da79292a1962e95a884":"Looney Tunes (USA, Europe)","6edab4cbbfeb6f5a04af669a31559f1c":"Penguin-kun Wars VS. (Japan)","6ee9c4e484b70bbecaaffafb963f004b":"Mogura de Pon! (Japan)","6ef878ebc023775f09437a2588ac5e7d":"Makai Toushi Sa-Ga (Japan)","6f26a0d050c67741bf7cc65aa86772f7":"Life's Too Short (World)","6f32e45cc1829ab2fc3048634b68d749":"America Oudan Ultra Quiz Part 4 (Japan)","6f72b0b3dd1d0939b1ccf7e9a8b05a04":"Lemmings (Europe)","6f898c606275dbe71ede0179574ad9f2":"NFL Quarterback Club II (USA, Europe)","6f94ad4f3761bf5c6f85f28fe4ff0ed6":"Famista 2 (Japan)","702ae9f811d191b73adc3f5fbcfa8aaa":"Riddick Bowe Boxing (USA) (Beta)","70436283ac6d8b8ab84f256134159ab9":"Shin SD Gundam Gaiden - Knight Gundam Monogatari (Japan) (SGB Enhanced)","704c6f2d6eabf59ada905613c06cca5b":"Goukaku Boy Series - Z-Kai Kyuukyoku no Eigo Koubun 285 (Japan)","704cefb5c77dc74631b9acbaa2b19435":"Space Invaders (Europe) (SGB Enhanced)","7068df6f82ec8cba4cbe36cc21b86df0":"Boulder Dash (Japan) (En)","706e32f1228b6bb7dbab839aa7af758b":"Bourgogne Game Show 2022 (World)","707e941e70f9a0c3dbd112cbf4c88f36":"Tiny Toon Adventures - Babs' Big Break (USA, Europe) (Beta)","709726eb6de8d45e63a88063529605bc":"NBA All-Star Challenge (USA, Europe)","709d59a30863336c26a48001c23af729":"Mr. Go no Baken Tekichuu Jutsu (Japan)","70a552e27767205b4d9be337b419c05f":"Jikuu Senki Mu (Japan)","70a9ef90ad443881ca90cdd8d910ae66":"Sagaia (Japan) (En)","70cd582d3b1f15cb251620203d8b00c9":"Jetsons, The - Robot Panic (USA, Europe)","70cf0bbc9f4a2bbc4c89649406b09e59":"InfoGenius Productivity Pak - Spell Checker and Calculator (USA)","70d0944bf4b877734d059ccf022d83fb":"Nakajima Satoru - F-1 Hero GB - World Championship '91 (Japan)","70d54771dde507f26713fba445f49a4f":"Chou Mashin Eiyuu Den Wataru - Mazekko Monster (Japan) (Beta) (SGB Enhanced)","70daec5b8cdf7e870a8b21a1b1253945":"World Bowling (Japan) (En)","710ee7da860fb18a29a929db1198c1bb":"Prince of Persia (Europe) (En,Fr,De,Es,It)","712b4b22dc5674e33c68bf0001af8b34":"Pocket Love 2 (Japan) (SGB Enhanced)","7133284150e899fc2bcd2bec719eaaa6":"Simpsons, The - Itchy & Scratchy - Miniature Golf Madness (USA, Europe) (Beta)","7138d95583fc38ee7b3cf18de5e09e89":"Sword of Hope, The (USA)","7172c397cb5d45e28b615c26e518a107":"Rampart (Japan)","7173cecc94bcdb7aeb7240ae87491044":"Jurassic Park (Europe) (En,Fr,De,Es,It)","7178b4386827602226f40f2cd264e322":"Super Chinese Fighter GB (Japan) (SGB Enhanced)","71af355cbf7b8c7fe30f509803bbced6":"Road Rash (USA, Europe)","71d7c219ed1cc63bfc6d77e62f6e2227":"Yomihon Yumegoyomi - Tenjin Kaisen 2 (Japan)","71feb6c7d5b764d5192c28efe74d13c6":"4-in-1 Funpak - Volume II (USA, Europe)","72c0a7eb38ffc2ef65c0e2ffb1729aa5":"Shanghai (Japan)","72dfa391aabb34d0a047443ee11c83ac":"Tiny Toon Adventures 3 - Dokidoki Sport Festival (Japan)","72f7848571d4048d95ef2063a856d820":"Final Fantasy Legend II (World) (Collection of SaGa)","73354c52e0315a279a4162d4f6c0586d":"Lion King, The (World) (Disney Classic Games)","73377222a76829e02c9a32b569862bde":"Kakomunja (Japan)","736608579d192dc138b07bbc1ce80158":"Jetsons, The - Robot Panic (Japan) (Proto)","73dbcd6a642ed4c751aa27ff08fbef3e":"Minolta 2429 Adj. Program (USA)","74110eed9c357f1749c4a8f82d637908":"World Soccer GB (Japan) (SGB Enhanced)","741890cbdeefe98175a56a87b9e9ef8e":"Pro Soccer (Japan)","744dc7e4b03d16b8b6dd35a697c77892":"Mickey Mouse IV - Mahou no Labyrinth (Japan) (En)","74b8d0c410c9579ab69b3550b2134df6":"Higashio Osamu Kanshuu Pro Yakyuu Stadium '92 (Japan)","74d409740ce00448d42b25ebb31e7bcd":"Race Drivin' (USA, Europe)","74d96840a5c09cd88c862a5647465b81":"Dropzone (Europe)","74ec77e1cfbdc05bba5381b3f78d5dd9":"Konami GB Collection Vol.1 (Japan) (SGB Enhanced)","750d2af7347fb539698655ae946a880a":"Micro Machines 2 - Turbo Tournament (Europe)","75143dc6628b92b1eaaf72b39891506c":"Goukaku Boy Series - Eitango Target 1900 (Japan)","7522878c2206817ec8440d442a65c306":"Blaster Master Boy (USA) (Beta)","7526469fda70432da606f67f144a8f4e":"TimberMan (World)","754398219a3ab38394cdac543d8deb47":"Fushigi no Dungeon - Fuurai no Shiren GB - Tsukikage Mura no Kaibutsu (Japan) (SGB Enhanced)","75963dd8e91147452bfa88f0d608d554":"Gem Gem (Japan)","75a63837a87a9c598fcee293d68513cd":"Mad Monster (World)","75b5f31fbacb972fc104b3e77d09003b":"Battle Arena Toshinden (USA) (SGB Enhanced)","75e4ced55fe6dc29561c54e613848b23":"Magipanels (World)","75e82151fabd244af2ab355132a7d895":"Witchscape (World) (Proto)","76010c6ff6bd0c4e8ac934dc69fb96ab":"Atomic Punk (USA)","7615154dc9afb1a7d7d2fe63b76c68e4":"Bomb Jack (Europe)","7616285ddcb0a1834770cacd20c2b2fe":"10-Pin Bowling (USA) (Proto)","763111e514ae572a530eb9465b9bc2ef":"Super Chinese Land 2 (Japan)","76be24b2a33617dad679f40a29b0b0ff":"David Crane's The Rescue of Princess Blobette (Europe)","770a5daeb07a68be86e72ed16e1a38d9":"Super Snakey (Japan) (SGB Enhanced)","770a917f18e0aa1f3bb027d0783f548b":"Yu-Gi-Oh! Duel Monsters (Japan) (SGB Enhanced)","77257c9ea85a0fdf36cba3e2a7fb5270":"Dragon Slayer Gaiden - Nemuri no Oukan (Japan)","7727f43d66a77fe0284bf1b8ffede7dd":"Game & Watch Gallery (USA) (Rev 1) (SGB Enhanced)","7768609b189e788ab08c8aac165b9f4c":"Teenage Mutant Hero Turtles III - Radical Rescue (Europe)","779dce075e652bea5bbecf89bb5b04df":"Castle Quest (Europe) (Beta)","77c1e3543a7f4a75a50efbb91c2718c2":"Brain Bender (Europe)","77f89e919dace1f5b989e0dbedc1ab8b":"FIFA Soccer 97 (USA, Europe) (SGB Enhanced)","780bbec4b26617b3a1a4fcdfa5a731e4":"Darkwing Duck (Spain)","781f768d5211aba1e4cf383d4585c1bd":"Aladdin (Europe) (SGB Enhanced)","7850d8aa9f97272f359500fb7be66383":"Asterix & Obelix (Europe) (Fr,De) (Beta) (SGB Enhanced)","785441d3d75913393807b10b3194dc48":"DuckTales (USA)","7864d91f0a7ca1eec93667ba88ec1dfc":"Bakuchou Retsuden Shou - Hyper Fishing (Japan) (SGB Enhanced)","78667e88a568b44115cb76dfe63a74a3":"Double Yakuman Jr. (Japan)","7876945a990ea94ac6b1fe5cf01bc00f":"Elevator Action (USA, Europe)","787eb7309113bf855201da4084fe7ede":"Leak, The (World)","78a200d2ba6cf13f965fa773e2071ffe":"Wordtris (Germany) (De) (Proto)","78c568cbfff6314b1416880d9efaeca6":"Medarot - Kabuto Version (Japan) (Rev 1) (SGB Enhanced)","78da1015ca2b5b4e83f7aea41214e779":"Solitaire FunPak (USA, Europe)","78fb0bd56717488e313aeb3e47f936c8":"Migrain (Japan) (En)","78ff544ada44bf6832e970f78ee2c8a9":"Raffles (World)","792c706a0addebed39d177077a1caac0":"Casper (USA)","79444f0a72363167fc340060eb02301c":"Doraemon no Study Boy 4 - Shou ni Kokugo Kanji (Japan)","79492ce68c61ae8e29b96db1d2e2bf6f":"All-Star Baseball 99 (USA)","794c58249c77f3b43012592bd386ad52":"Ninja Spirit (Europe) (Proto)","79603fd837abd36b72d73f959e0ae749":"Kingdom Crusade (USA)","797580a91cf9dc710c37f5af04dbbca5":"BreakThru! (USA)","79bb2ba29c937253dd964142713a7869":"Cool World (USA, Europe)","79d6e6515905ec3fbcbd9e50ff469000":"Bonk's Adventure (USA)","79ede10e81d8697137f6fff7bb322a30":"Tamagotchi (France) (SGB Enhanced)","7a1db9950b7fb12499df822b32ef1ed9":"Painter Momopie (Japan)","7a1ed5c273362a56eaec07a1ddd6b195":"Prince of Persia (Japan)","7a60b2dca975ecd7166fd390cb9e3238":"Casino FunPak (USA, Europe)","7a8e19e290ee3a6bc2687e331cd0db06":"Panty Hunty (World) (v1.4)","7aa389f71808dc989a38b41009a32851":"Tiny Toon Adventures 2 - Montana's Movie Madness (USA, Europe)","7ab8eb19c5356f62bcc3fa2a8f1aba1f":"Meitantei Conan - Chika Yuuenchi Satsujin Jiken (Japan) (SGB Enhanced)","7ac8443eefc33432b989f00cb984b9a1":"HAL Wrestling (USA)","7ae0d384ad38a528bed9c76e07671126":"Honmei Boy (Japan)","7af2043d1766513dc576b549d104fa2a":"Yousei Monogatari - Rod Land (Japan)","7afb675171d58105112dbacf2ced77cb":"Bishoujo Senshi Sailor Moon (Japan)","7b024fd92a4db7959d98d729d459cb8e":"Teenage Mutant Ninja Turtles 3 - Turtles Kikiippatsu (Japan) (Cowabunga Collection, The)","7b040899fa8b62f4c27115c21a4ea881":"MVP Baseball (Japan) (En)","7b1e0dd44871aa990780d93565fdb565":"Contra Spirits (Japan) (SGB Enhanced)","7b622d314e82f49e57a14aca3435f814":"Super Hunchback (Europe)","7b96adfd6d3576cb2bab2afd06d8bd6e":"Lemmings 2 - The Tribes (Europe)","7ba282030e65d7974863bf129ce60155":"Do I Pass (World) (En) (v1.4) (Web)","7bb8a5bc9e55a05eba1a3fcbf460a9b5":"Super Robot Taisen (Japan)","7bd22f707c9264fa6c94c0248576167d":"Power Pro GB (Japan) (Rev 1) (SGB Enhanced)","7c0cbb81025deed9e32ecdca5f1bb482":"Castlevania - The Adventure (Europe)","7c1ab6fe16bcf564c7f8e13e40f2b87d":"Space Invaders (Japan) (En)","7c2419bddfd72711e90f54ef63695b07":"Super Mario Land 2 - 6-tsu no Kinka (Japan) (Rev 1)","7c5d6459e8d716cca69c4438d2440a1a":"Commando (World)","7c65e9da405d2225d079f75e56276822":"Castlevania II - Belmont's Revenge (USA, Europe)","7c9cef32db758d3f6b8a8a23b6902e2d":"Daffy Duck (USA, Europe) (SGB Enhanced)","7cc78ea5dbc099e8f89849a11a08c38e":"Nobunaga's Ambition (USA)","7cdf7645bd8116284c4f40b01ce4d088":"Bubble Bobble (USA, Europe) (Beta)","7d2c84bf29ec10488c8ae3b8018edc8a":"Chousoku Spinner (Japan) (SGB Enhanced)","7d3bff19f269a9b0c52338ccd0e654ae":"Goukaku Boy Series - Gakken - Yojijukugo 288 (Japan) (Rev 1)","7d4a7d9315eb017c2af3b22d6290dc26":"Spider-Man 3 - Invasion of the Spider-Slayers (USA, Europe) (Beta 1)","7d4f3bf92bbff701583eb74f36951bb9":"Klax (USA) (Mindscape)","7d5928376a16252833a1eda86fb65448":"Welcome Nakayoshi Park (Japan)","7d621dcbbce12b73574c42f40deec275":"Tennis (World)","7d6eb2f521febcf05cb445f6f37b3ba3":"Super Kick Off (Europe) (En,Fr,De,It,Nl)","7d76d2a9eaada93dc846efe1b2a815cc":"Kenyuu Densetsu Yaiba (Japan)","7d775680308fc232d1c6547124bab089":"Bakuchou Retrieve Master (Japan) (SGB Enhanced)","7d776329212fa7cc2b00c5a46f06dd92":"Darkwing Duck (USA)","7d7fbbcd73f1c220dd9fb2c428bbe758":"Alien Invasion (World)","7d8e0dc0cc90b414488fe7df3d9151e5":"G Arms - Operation Gundam (Japan)","7d908ba84a5ff43a3622a917b07d8b3a":"Solitaire (Japan) (En)","7d99006d00431ac246817d4f61e49b59":"Famista (Japan)","7db13139bc32e2aadb732d610f4c1604":"Mr. Nutz (Europe)","7dbd16112ebef871062660808b5a0cd4":"Sakigake!! Otoko Juku - Meioutou Kessen (Japan)","7dec3abb455de5bb503e8801bf22c742":"Aqua (World) (v1.0)","7e05d529985b34741bf1c8b909c96d8a":"Goukaku Boy Series - Z-Kai Reibun de Oboeru - Chuugaku Eitango 1132 (Japan)","7e17b120b34823d2e6bd61cdd08ecc2a":"Mini Yonku GB Let's & Go!! - All-Star Battle Max (Japan) (SGB Enhanced)","7e1bedf88581ee7370c8eb86c6863e2c":"Speedy Gonzales (USA, Europe)","7e4c9c3620bea7b633394beb67e9680b":"Bomberman GB (USA, Europe) (SGB Enhanced)","7e5cd07ccb647c0c281309630d70af68":"Tom and Jerry - Frantic Antics! (USA, Europe) (Beta)","7e68c061d77a2e8925442a9b6fa0a0ed":"Loopz (World)","7e6c999c8b4bd0e7030977c7fa73c75c":"Hiden Inyou Kikouhou - Ca Da (Japan)","7e893bd4b6c404843df52288ff681325":"Tiny Toon Adventures 2 - Buster Bunny no Kattobi Daibouken (Japan)","7e9d69eacd6b4c82527065bcf63e474b":"Judge Dredd (USA, Europe)","7eb5d2c44ee56aa96fdb8e4968700953":"4 in 1 (Europe) (4B-004, Sachen-Commin)","7ec2171517a50bbe35b319e0bcfa625c":"InfoGenius Productivity Pak - Berlitz French Translator (USA, Europe)","7eca7a38f204dfa33dc3a4c039a92176":"World Beach Volley - 1991 GB Cup (Japan) (En)","7ef69878c3b5bc5532c69a51a2dd42f3":"Harvest Moon GB (USA) (SGB Enhanced)","7f1e1ce56aca694b46da2ba407b60cb3":"Soukoban 2 (Japan)","7f26dd90f8e80b52ead8fc0e3609d4f2":"Maru's Mission (USA)","7f7df6b53d2c01c2c2fe9ce20a8eebe5":"Jaleco J.Cup Soccer (Japan)","7f896b5e5e27eda1b08251ebe581c885":"Ninja Ryuuken Den - Matenrou Kessen (Japan)","7f8f8620460a38f0422591fa0b6414e0":"Purikura Pocket - Fukanzen Joshikousei Manual (Japan) (Rev 1) (NP)","7f970d79f06cfb4270dea4b051277098":"Bubble Ghost (USA, Europe)","7fbda0c87af7701bb5e75c2a77bb0143":"Tetris Attack (USA, Europe) (SGB Enhanced)","7fc2dadd7ae98064febaa30a0d35112f":"Riddick Bowe Boxing (Europe)","7fe07271d04ed9e0bc0663dde55a2ae4":"Mega Man II (USA)","7fed5d5e548d9a4c1f61a47f1a6692a9":"GB Pachi-Slot Hisshouhou! Jr. (Japan)","80034da43f35307291714ae2553d9ddf":"Prince of Persia (USA)","800c1a8f99bea585490673352b5f11f4":"Boulder Dash (Europe)","801548b89f31101653539988d7635dba":"Uchuu no Kishi Tekkaman Blade (Japan)","802cfbc386bb79b0889d7dd2b6abdc13":"NBA Jam - Tournament Edition (USA, Europe)","802fbe246099f42c3177d6ff54afe6eb":"Art School Pocket (World) (De)","80644b75f16dc41b5b474807fa2fa765":"Pocket Family GB (Japan) (SGB Enhanced)","8076db86c921743aedd82b12d139c3c3":"Master Karateka (Japan) (En)","808058b66a16e497aab979ba53bbe37e":"Pachinko Data Card - Chou Ataru-kun (Japan) (SGB Enhanced)","80bc594310a940feb9512cf3233bed71":"Versus Hero - Kakutou Ou e no Michi (Japan)","80c2bf17e6c42110cbe0e4c220befacf":"Super Hard Bouncer (World) (v1.0)","80cf143705cd8cad268a94b19a953ed9":"Ghost Town (World)","812db832566202610bb1e42e643e2b93":"Asterix (Europe) (En,Fr,De,Es,It)","813755de3d7338c9442f072ed52f52b3":"Vattle Giuce (Japan) (En)","813fc943982d8a24085097d395994ccf":"Ring Rage (Japan) (En)","81abf5cdc935e97246a914a723649b6d":"Primal Rage (USA, Europe) (Beta)","81ad77f41587aab8e452f42cc0252e26":"Lost World, The - Jurassic Park (USA, Europe) (SGB Enhanced)","81efa6be1ee143fbe8634aff615ea1ad":"Mahoujin GuruGuru - Yuusha to Kukuri no Daibouken (Japan) (SGB Enhanced)","81f7dee7546e630de075a3397349efb8":"David Crane's The Rescue of Princess Blobette (USA)","8272e012f5c953450a3e2efd88d41aeb":"World Heroes 2 Jet (USA, Europe) (SGB Enhanced)","82d3fade3edbdd033752b8c1dd72481b":"Uno 2 - Small World (Japan) (SGB Enhanced)","82d650a781ef372126a863d519c01aae":"Radar Mission (USA, Europe)","82e7321afed96c7639a817de1f88a6f8":"Crayon Shin-chan - Ora no Gokigen Collection (Japan) (SGB Enhanced)","82ffec2fa00b08e001aa73bdc8ffa60a":"InfoGenius Productivity Pak - Berlitz Spanish Translator (USA, Europe)","831fcf7c33d4605271c2a3f67c7cca5b":"Penguin Migrants (World) (v1.1)","833c2c1990eab0f9f09a6471ffeb24de":"Goukaku Boy Series - Shikakui Atama o Maruku Suru - Sansuu Battle Hen (Japan) (Imagineer)","835d8f147210c87fd0b0cb8416adade0":"Pachi-Slot Hisshou Guide GB (Japan) (SGB Enhanced)","836c4e027f8a2bfc593ce3032cbb40d9":"Sloth Story (World)","83747bb1b6245c67241b9002861397b8":"Bonk's Adventure (USA) (Beta)","837f3b25d5864b631dff52e0f2b8cbd3":"Genki Bakuhatsu Gambaruger (Japan)","83899b533f9c71d96222c4a977bce9ad":"Baby's Day Out (USA) (Proto)","83bed4ebefeece45748258fd2ef105b3":"SolarStriker (World)","83d0886e246045cfa5b12b7861521c04":"World Cup USA 94 (Europe) (En,Fr,De,Es,It,Nl,Pt,Sv)","83d20a9c3f88f9faa27c076cefd38bc1":"F-15 Strike Eagle II (USA, Europe) (Beta) (July, 1992)","83e0f56f6315f46aaf4e7b77576b00e9":"Wishing Sarah (World) (v1.1)","83ef6dc979ee752513a3b2c794d4cbff":"Initial D Gaiden (Japan) (SGB Enhanced)","83f05d3ff8da7e340a75d8e1234d8834":"Spartan X (Japan)","83f5da7271a970c28cb2a1f366e89616":"T2 - The Arcade Game (Japan) (En)","83f8254d367e2b58b26f07a965654b4b":"Just Fishing (World)","83fc53defeb7b05ac619c9918797ee83":"Sam Mallard - The Case of the Missing Swan (World) (SGB Enhanced)","84133af3324fc1aaf00c0769e15708c0":"Punisher, The - The Ultimate Payback (USA)","8425e6aa8e841b8a6192476ac600ea81":"Caesars Palace (Europe) (En,Fr,De,Es,It)","844633e79ccfe6b7d8d2da958e708e7c":"Captain Tsubasa VS (Japan)","844b2475d463154caf57fe10ad8fab15":"Keitai Keiba Eight Special (Japan)","84634fb36156bb1b9e54bc62fbaf3525":"Bishoujo Senshi Sailor Moon R (Japan)","849c5fe4002dd4240020e9ec84c8dc29":"Darkman (USA, Europe)","84fc4878829fdff7d1c6d92c67ae35ea":"Yogi Bear's Gold Rush (Europe)","84ff06249f96442626cdd75a5fa440ce":"Animaniacs (USA) (SGB Enhanced)","85082bcbda4febf4e9e05fa0679940b4":"Sangokushi - Game Boy Ban (Japan)","8517ac370fc46971d8a8c106bde4d4c4":"Tetris Attack (USA, Europe) (Rev 1) (SGB Enhanced)","852c764440f29205099716c4500ce222":"Doraemon no Game Boy de Asobouyo Deluxe 10 (Japan) (SGB Enhanced)","853b7ef83c8dc9dea361303766fea360":"Ganbare Goemon - Kurofunetou no Nazo (Japan) (SGB Enhanced)","855f9c1d01a967d171cbd88fa8bf58ac":"Lasama Chuanqi - Story of Lasama (Taiwan)","857fdafb5ababd641cc832cfb8fabd58":"Extra Bases (USA)","85ac741a34b971dfc107c15c8a902f07":"Mystical Ninja Starring Goemon (Europe) (SGB Enhanced)","85b010930ccbb4a7e1bd2adaadcf00a5":"Super Battletank (USA)","85ccd61e2298b5f9b26312e8e182f10e":"Swamp Thing (USA, Europe)","85d05f95c07ed1b7d787062fe4d2e251":"Super Off Road (USA, Europe)","85de1b03170ac56fbc07403511cfa137":"Breakout Lava-Lamp (World)","85fc0640de39ee331b710cdeac5918b2":"Decline (World) (v1.1)","86e22a57cf0055f858acc9a4062ebc30":"Paperboy 2 (USA, Europe)","87250cc05b201c48af8d7043c084666a":"Rod Land (World) (Retro-Bit)","872b72113281dc0a906b033b8f8e4e76":"Momotarou Dengeki 2 (Japan) (SGB Enhanced)","872b8eb18385ed6b1937b42436af56fd":"Mini-Putt (Japan) (En)","872e582831a17faee1df663c39a73e99":"InfoGenius Systems - Personal Organizer with Phone Book (Europe)","87f730d486bdc4685bcc6e91a7124c35":"Funny Field (Japan) (En)","8814b9ec76241a6ac4deefa00ebebad8":"Addams Family, The (Europe) (En,Fr,De)","8831343566e891e0176b6781594a1c15":"Makai Toushi Sa-Ga (Japan) (Rev 1)","8833ae0fd3b4c47b8249a12708c98a98":"Spider-Man 3 - Invasion of the Spider-Slayers (USA, Europe)","88908153a898e5d91a02206dbb03713a":"Black Bass - Lure Fishing (USA)","88a6585dfe6214d694c87dd09ce814f5":"Lucy and the Gem Dungeon (World)","88c33c0fc3dbdc848b9be604cdda5744":"Gamera - Daikaijuu Kuuchuu Kessen (Japan) (SGB Enhanced)","893a3f2daf828dd2c09c6cb3dc1e57d3":"Pushingo (World)","894dc0498b1527deddf7c6fcc75a6b25":"GI King! - Sanbiki no Yosouya (Japan)","8963803e642dbfbe4f5f3bc5a567785d":"Bugs Bunny Crazy Castle 2, The (USA)","896bf34f506a55b726e8a4edbc78c443":"Mai Nurse (World) (v1.01)","89bb0d67d5af35c2ebf09d9aef2e34ad":"Donkey Kong Land (USA, Europe) (SGB Enhanced)","89bdc38fd17a6c969306f756edef8a70":"R-Type (Japan) (En)","89cbbda4899d5fea755026d671ed08d7":"NHL 96 (USA, Europe) (SGB Enhanced)","89dae4a6f82d2e603af41a4499a3360b":"Roger Clemens' MVP Baseball (USA)","89ecf5b28d5cc84208cfc39dc2d96598":"Trax (USA, Europe)","8a00f627b8902c92327435901c249e19":"Mega Man IV (USA)","8a0430cf49abda1fc055c16d2bbea387":"Pac-Attack (USA) (SGB Enhanced)","8a06994b2e265244147a4d6d0e80623f":"Snoopy's Magic Show (USA, Europe)","8a240c7018703f232c654cdbc169c653":"Super Donkey Kong 3 (Taiwan)","8a4245cbeb1d6400b4cb586790400b60":"George Foreman's KO Boxing (USA, Europe)","8a54d5d6c4938661ab6b015369f7b12b":"Meteorite (World)","8a5ccf172f31a0dbfa0600d40b388fdc":"Solomon's Club (USA)","8a6963239d50b262e3579359f0a24f78":"Earthworm Jim (Europe)","8a7aaf3afcd00348730c86ddc926e30a":"Fushigi na Blobby - Princess Blob o Sukue! (Japan)","8a874449c207af6e4726337ca899e35a":"Star Wars (Europe)","8aa55e4347527c8780243bc6ae3d7e02":"Game of Harmony, The (USA)","8abc199792edadfc3f42822b33c912d8":"Pocket Puyo Puyo Tsuu (Japan) (Rev 1) (SGB Enhanced) (NP)","8ac5c061641b2a8b4c44b46ef693aeef":"F-1 Race (World) (Rev 1)","8b4d9ea149c4cd156bd4ce0db1127943":"Zelda's Adventure (World) (v1.3.0)","8b7af1a8ca96c74301d633e0ce83ba0b":"Legend of Zelda, The - Link's Awakening (Germany)","8b7cd9501263bff7ea31389d78df8ca4":"Winter Olympic Games (USA) (Rev 1) (Beta)","8bb31f539e8999d5c4e9449fe1befad6":"Lock n' Chase (World)","8bbb9ba0d72548706e4e5eba1b3a9fe1":"Bubble Bobble Part 2 (USA, Europe)","8bca6330273282546d0e74ad5c699590":"Kidou Keisatsu Patlabor - Nerawareta Machi 1990 (Japan)","8bea8cf270169a042bdae88f694c90b4":"Super Chinese Land 1-2-3' (Japan) (SGB Enhanced)","8c0f8cfbc339c2a2dea15b6f50793ae2":"Kirby no Kirakira Kids (Japan) (SGB Enhanced)","8c1c4b2e451fb7d695441b9be03e4d30":"Final Fantasy Adventure (World) (Collection of Mana)","8c34e1879b4f81a22515d82aa9d0bb68":"Soccer Boy (Japan) (En)","8c464aaeb8920878e1b7ec2f0d6bbe4e":"Navyblue 98 (Japan)","8c69230b2e8bbe15cee83e89a7cb19dc":"Tenchi o Kurau (Japan)","8ca4b92850c06465fa7bacad00314cf0":"Kaisen Game - Radarmission (Japan) (En)","8ca82943c26210c92bc451015d6670a4":"4 in 1 (Europe) (4B-001, Sachen-Commin)","8cbbfda8754ccacaae46ac571f46a034":"Kung-Fu Master (USA, Europe) (Beta)","8cddb8b2dcd3ec1a3fdd770df8bda07c":"NIV Bible & the 20 Lost Levels of Joshua (USA)","8cfce7b63aa070b5bcdc2e1bcb56e18e":"Little Mermaid, The (Europe)","8d0454b8cce374e863d535e2654f326b":"TaleSpin (Europe)","8d885e185ad2a0cb5c9e3b152bd24583":"Contra - The Alien Wars (USA) (SGB Enhanced)","8de5e624fe203a7b65c48e5994cc9bf0":"In the Dark (World)","8e012973051e41bb2c14fb33cae38ddc":"Kawa no Nushi Tsuri 3 (Japan) (SGB Enhanced)","8e027062ca63072336eca6010efd0e84":"Dr. Franken 3 (USA, Europe) (Proto)","8e1d2e3b4f20361c496e93f8d2e08339":"Chiki Chiki Machine Mou Race (Japan)","8e38119ff769303a771aeab01cd3905c":"Parasol Islands (World)","8e71bf57156f52e57bb593966728d6ec":"Tintin in Tibet (Europe) (En,Es,It,Sv) (SGB Enhanced)","8e76d1ce4b251e3a31056feddda92e9b":"Power Racer (Europe)","8eab3ebbc0fa9e7465ed11289868e564":"If (World)","8ed0e8d45a81ca34de625d930148a512":"Pokemon - Rote Edition (Germany) (SGB Enhanced)","8f160aa0b2f69a019911fd57ac8c5b31":"Beavis and Butt-head (USA, Europe)","8f29087400dd29a867682f22e7470b45":"Jet Set Willy (World)","8f3095c4d98694f19270d8c2788d5e46":"Ayakashi no Shiro (Japan)","8f4262923e4a4a9c4f5074841bdce103":"Daisenryaku (Japan)","8f6b6ef366a787852f664d945c86eb72":"Adventures of Lolo (Europe) (SGB Enhanced)","8f86db5ca5019627325f722761db3015":"Vampire Night Shift (World)","8fa0d3974375c863bf301b4455ef3a18":"Minolta 2476 Adj. Program (USA)","8fb0ba004cd7c2646913c0d007b73e0d":"Bork Paw Kisses (World)","8fc6e8e0f47d0fff71e1fc5e0bc67964":"Wizard of Wor (World)","8fdffb08770609255ec3cd314f79f976":"Banishing Racer (Japan)","8fdffde2db7f8da5cdb60a49d77a6b32":"Tintin - Prisoners of the Sun (Europe) (En,Fr,De)","8ffab7c16a215d3e2cce01fa24fbdf4f":"WWF King of the Ring (USA, Europe)","9013cecbec67b980010ac3979a042d8c":"Flintstones, The - King Rock Treasure Island (Japan) (Proto)","9038a85be1595de2a4f16b6f6db0f3fd":"Tumble Pop (USA, Europe)","9057925ed2531251d494f76d3b8bb471":"DuckTales (Japan)","906e42e643b65ddf4497cea6b0efb0a0":"Oni III - Kuro no Hakaishin (Japan)","908d9537a9a76f3c9f2b2a92ae11e5e9":"Super Connard (World) (Fr) (Digital)","909d684debea0c9fb04435178c55ced7":"Klustar (Europe) (Proto)","90a0bc783fbe56748989d8fad9ae48ed":"Ultraman Ball (Japan) (SGB Enhanced)","90a34d9897acb1e78e00d6d5a2af419f":"Burai Senshi Deluxe (Japan) (En)","90ae2ea218f8e21afa678c6a4e7b6013":"Pocket Monsters - Pikachu (Japan) (Rev 3) (SGB Enhanced)","90fa7375fc98c498dcf3f09ae7b91ec7":"Busty Bunny the Bounty Babe (World) (v1.02)","91128778a332495f77699eaf3a37fe30":"Alleyway (World)","9116e4fa652b09b181f547ae0e782022":"Crayon Shin-chan 2 - Ora to Wanpaku Gokko Dazo (Japan)","912d4f77d118390a2e2c42b2016a19d4":"Pocket Monsters - Aka (Japan) (SGB Enhanced)","9148245e7196c286506ad6b8bef73e35":"America Oudan Ultra Quiz Part 2 (Japan)","9155b2da7a68a39742ed1c80f1b007a8":"Dog's Muck Island (World)","9155b3e2a243be1703a09934b2b80724":"Battle Dodge Ball (Japan)","915d5d1c4ddef2c39fdb0131a34b83a4":"Bill Elliott's NASCAR Fast Tracks (USA)","916bfe72657aa44faff938d55720f8db":"Penguin Migrants (World) (v1.0)","91e47c8966a0da555e211be583987a1f":"Krusty World (Japan) (En)","91ecec5f8d06f18724bd1462b53c4b3d":"Adventures of Star Saver, The (USA, Europe)","91f7654109afd261df2b27bfdcd86898":"Best of the Best - Championship Karate (USA)","921bdff008475aa2c5344e1a0d110910":"Dr. Mario (World) (Rev 1)","92b87220f7f18afd29be272df70563b0":"Sword of Hope, The (Germany)","92e724d9ae8e6ad79442c95fe434c998":"Dragon Tail (Japan) (En)","933feecc92bf118bbe99bf6ff7ffb97a":"Konami GB Collection Vol.4 (Japan) (SGB Enhanced)","93660017f0af0589e3ce0869ebbe9bdc":"Pro Wrestling (Japan)","9381c3d1e8a7fa971555183126833858":"Marron Helps a Friend (World)","93bd30dc9a63696dc8a07f0353566fe7":"Super Pachinko Taisen (Japan) (SGB Enhanced)","93cea7134db2a28b06d30729ad460dd6":"3 Choume no Tama - Tama and Friends - 3 Choume Obake Panic!! (Japan)","93e66350ffd7403827914b80d233c989":"Waterworld (Europe)","940e815091b9d370789fde2e68bfac5a":"Kuru Kuru Pixel Logic (World)","94135fb63d77d48d2396c60ca8823b69":"Dracula Densetsu (Japan)","943a21195afc5abefb3f925b84a9f19f":"P-Man GB (Japan)","944242d3443f676bb569bbd07c47390f":"Kick Attack (Japan) (Proto)","94c8529c51540babc5fc0b3fa2c50153":"Mick & Mack as the Global Gladiators (USA) (Proto)","94d72bf09aa55761cfa723882dafc131":"Donkey Kong Land (Japan) (SGB Enhanced)","9550fadc917db38cacd0ecfb694f816c":"Batman - Return of the Joker (Japan) (En)","95517367dd10f6476bcb39a2329ef55a":"Tesserae (USA)","959834b1d0acefcf840134fae4c49fde":"Tekkyu Fight! - The Great Battle Gaiden (Japan)","95a0f644d8778b1c934ac5ae8791d80f":"Adulting! (World) (v2.0)","95d3b0c6316a9fd3a55390fde2b89a13":"4 in 1 (Europe) (4B-008, Sachen)","95e0ce560fe647b955fa1d3b2808acfa":"Yoshi no Cookie (Japan)","95fe4d5f8da42dacba0818bb7c2d786e":"Wordtris (Europe) (Proto)","9617c8babf4d714a3cbf5c9e644a67ff":"Rolan's Curse (USA) (Beta)","9627134ca3ea6e885275d30460ce3563":"BurgerTime Deluxe (World)","9628273ad4d1ee609255f4c8768733b1":"Nyghtmare - Betrayed (World) (v0.1.1) (Beta)","9639948ad274fa15281f549e5f9c4d87":"Metroid II - Return of Samus (World)","9642b7c599b47135cbd4e45e039d608d":"Amida (Japan) (En)","966cc6df20d8c5d42f690f28bbcc8caa":"Pocahontas (USA, Europe) (SGB Enhanced)","967030223fa85f7ba4ac71f26837f831":"R-Type II (Europe)","967473063a55634223f15e4c0a79dc44":"Mighty Morphin Power Rangers - The Movie (USA, Europe) (SGB Enhanced)","967d5fc3ab464c465c04d55bc1747768":"Lamborghini American Challenge (USA, Europe)","96851490451ceee8c683d33abcf0ae40":"Cyber Dreamscape Battle-Deckers 2199 (World)","96c1f411671b6e1761cf31884dde0dbb":"Pocket Monsters - Pikachu (Japan) (Rev 1) (SGB Enhanced)","9719eaada417782a236a9d84805a512a":"Dig Dug (USA)","972dc35b3b2bd0762999b1ae48da94f6":"R-Type (USA, Europe)","9751c86209191763aadf5fc290263b75":"Out on a Limb (World)","976a32b5043c440b9eca90b085ba747b":"InfoGenius Productivity Pak - Personal Organizer and Phone Book (USA)","97bc907deba1e7d7c9bc72fca0310822":"Batman - Return of the Joker (USA, Europe)","97c000e7b02914512ee05b1159371483":"DragonHeart (France)","97fecf5ab824825b781771a40e1c60bf":"Pinocchio (USA)","9810ef4294bfde29ec0bfc6c41d2f58c":"Dungeon Land (Japan)","982ed5d2b12a0377eb14bcdc4123744e":"Tetris (World) (Rev 1)","9832ab77352fd51d2c38fb6c75d1c4a4":"SD Sengokuden 3 - Chijou Saikyou Hen (Japan)","9835dfeddb332a9c9e1c2269e7863af9":"Mini Yonku GB Let's & Go!! (Japan) (SGB Enhanced)","985bf1d3fdf54038dbde36fd372fbe2c":"Taz-Mania 2 (USA)","988516a3d733132af304b1c6710a923a":"X (Japan)","98ccedc1e48c22c6f505b6ac79a944ff":"Totsugeki Valations (Japan)","98dab710bdf256c1f1cf92c31d58d632":"Super Mario Land 2 - 6-tsu no Kinka (Japan)","98e7d7fe08be476b3e8d5989fb8b301c":"World Ice Hockey (Japan) (En)","99155040191ca1da4d3b346d0d12ed7c":"Mortal Kombat (USA, Europe) (Beta)","9927d7e4de4dbe690080f35c269b7c98":"World Cup Striker (Europe) (En,Fr,De) (Possible Proto)","99314aee7dea4221cb38c03216239a51":"Jordan vs Bird - One on One (USA, Europe)","995ce81fe91162cff295badd94e366f3":"Hoshi no Kirby (Japan) (Rev 1)","996f21d850fa8d9b8b15205493976650":"Goukaku Boy Series - Koukou Nyuushi Derujun - Chuugaku Eitango 1700 (Japan) (Imagineer)","99d9043a801704007d7ad227676fa6f1":"Ren & Stimpy Show, The - Veediots! (USA, Europe)","9a16724978b9c9fbd69999bd29ff1d03":"Doomsayer - A Hero's Crusade (USA) (Proto)","9a5215658c60a1802b11f728c292b536":"Akazukin Chacha (Japan) (SGB Enhanced)","9a777d82cd7a8913ba1aed2cc854fa50":"Puzznic (Japan) (En)","9aa480224f43cbcc71bb2f4c51da2507":"DiaMaze (World)","9ab4e706b5dd1bb68b4e29a0174c330d":"Track Meet (USA, Europe)","9add23b6cf3a5b76305192da693dfd21":"Hyper Dunk (Europe)","9af91c7e344a9048f0f4037a8abcbe54":"HAL Wrestling (USA) (Beta)","9b36afc6d25cd720b091dd71596ce231":"Porklike (World) (v1.0.13)","9b66b6cfa9bdb791709b3a30722c7dff":"Spanky's Quest (Europe)","9b68b316b7af37e1428e899e90e7f7a9":"Mind Bender (USA) (Beta)","9b7768644978e51e316841b57da510f0":"Pocket Mahjong (Japan)","9b80d7dbb1eaaa379cfb59fcb032e819":"Astro-Jump (World)","9ba2999ef3ecf9e27ac6c88e995c9d7a":"Super R.C. Pro-Am (USA, Europe)","9be2b2635bd25b97a7599ab1df84a49a":"Ultraman Chou Toushi Gekiden (Japan) (SGB Enhanced)","9bfa774d2474d63fdacdbe951573375a":"Lunar Chase (USA) (Proto 1)","9c0708921c8a290857b0abd98fa2a00b":"Pocket Monsters - Green Version - English Edition (Taiwan) (En) (Pirate)","9c17a77f10f8c8024addc299cfd74b8b":"Penguin Wars (USA)","9c189413f62b92172b0bb95e81731465":"Pocket Kyoro-chan (Japan) (SGB Enhanced)","9c1efb1bd07fd91765f680e7e9bc44f1":"Hudson Hawk (USA)","9c23d37d51a593e82378dad038a52ef2":"Aretha (Japan)","9c3aff83a957d13e393f99cff8445271":"Centipede (USA) (Majesco)","9c6535574996d4b95a7e8f074ec6376a":"Space Date (Europe) (Proto)","9c9679e4da4daa2ee22f1c35eef03cad":"Caesars Palace (USA) (Rev 1)","9cbd5ff8ff720dfdf4580338626d353b":"WorkBoy (USA) (Proto)","9cc5c4335f6f233c6b0000178871e457":"Zool (Japan) (En) (Proto)","9ccc41fe3fb0ac407440cb8ea9fb3d0a":"Game Boy Wars Turbo - Famitsu Version (Japan) (SGB Enhanced)","9cd7f210ae2680349078aca844be5354":"Mickey's Chase (Japan)","9d20f9cc539c953a3da5962bea455d18":"Hyper Lode Runner (Japan) (En) (Possible Proto)","9d3d554ace962a9dc4e87544dfa76ed2":"Go! Go! Tank (Japan) (En) (Beta)","9d4d9a346158fcda7221c853b13bd19d":"Shaq Fu (USA) (SGB Enhanced)","9d94d01d3133165d4469bb27d58f0f6c":"Bill & Ted's Excellent Game Boy Adventure - A Bogus Journey! (USA, Europe)","9da5066fed7d826101a92688aa03059a":"Outburst (Japan)","9db0e1e39aa5a40471911a40e12ba739":"Looney Tunes 2 - Tasmanian Devil in Island Chase (USA, Europe)","9db11a12e5721bfecca10ac782f55247":"What Friends Are For (World)","9ddc6f4f0dc369008cbd2ac4ec561e75":"Tetris 2 (USA)","9e6e3cc5a71ee19204028f13feae395a":"Tokoro's Mahjong Jr. (Japan) (SGB Enhanced)","9e71577a809bbef83abd02596cb00913":"NBA Live 96 (USA, Europe) (SGB Enhanced)","9ea97e9f74d1059510e37736ddc65536":"Goukaku Boy Series - Koukou Nyuushi Derujun - Chuugaku Eijukugo 350 (Japan) (Possible Proto) (IE Institute)","9eb0a55ab94e3bd83d3cfc87c28c0107":"Hugo (World)","9ecb13a68c8c58d90dd15157440d5b10":"Splitz (Europe)","9ed711b8fc6602b1fcb41232e8cc43cc":"Goukaku Boy Series - Koukou Nyuushi Derujun - Chuugaku Eitango 1700 (Japan) (Possible Proto) (IE Institute)","9efef8cea73bafbaaeb779b97356149f":"Super Mario Land 2 - 6-tsu no Kinka (Japan) (Rev 2)","9effa81d3ba96812459bd6e76726371a":"Nigel Mansell's World Championship (Europe)","9f2b62d971705e147745dc2bffb99cc1":"Selection - Erabareshi Mono (Japan)","9f53c54e829ecdbd15baa3faafebb25e":"Race Drivin' (USA, Europe) (Beta)","9f5ddc6ee110a6843b1d9d9a08514c71":"Mickey Mouse II (Japan) (En)","9f7c06f90401599c5b4b2690565a29bb":"Marzipan Beef Reverser (World)","9fa5ce9c87d949dfbd5d8ff46ece63eb":"Sanrio Uranai Party (Japan)","9fae2cc970ba45b0d7ba79a68e0e9104":"Jet Pak Jak (Europe) (Proto)","9fb9c42cf52dcfdcfbad5e61ae1b5777":"Bomberman Collection (Japan) (SGB Enhanced)","9fc7d7525963a0029fcd15aa05e4cebf":"Jantaku Boy (Japan)","9fcf969d7d4554997ca902bbf9033287":"Game Boy Controller Kensa Cartridge (Japan)","a093e160d18423bdaa2d6bf22f5f32a0":"Nettou Toushinden (Japan) (Rev 1) (SGB Enhanced)","a09ca996d31ac59d76a7c156d38c02ed":"Hoi Hoi - Game Boy Ban (Japan)","a0cbb8db8757203fe42d47591c5ca982":"Seiken Densetsu - Final Fantasy Gaiden (Japan) (Seiken Densetsu Collection)","a0f5378a7c89b4c423db56204cbfcc31":"Konamic Sports in Barcelona (Japan)","a126f0ee58e0b47c405c15dd314d279b":"Jack Nicklaus Golf (USA, Europe)","a17431d0f77f14fa8339d6f9fde0f006":"Cosmic Courier - Trapped in Limbo (World)","a1b98dad8650552a7133e786d319c95d":"Ferrari (Japan) (En)","a1c0e2a4a653d2dd99cc0a7e8ef312fe":"Minolta 2420 Adj. Program2 (USA)","a1d55314d4d98e93eaf8de42e1ac5bc8":"Phobos Dere .GB (World)","a1ec7f07c7b4251d5fafc50622d546f8":"Pokemon - Blaue Edition (Germany) (SGB Enhanced)","a230f5ea1f13b2f1ee94ea05ed494a7c":"Doctor GB Card 16M Loader (World)","a23c6961d22f0d01257e64050341e480":"Pull of the Void (World)","a2431eacf48073f83bfc8e193c595f3e":"Sword of Hope, The (USA) (Beta)","a26406088504fdbde82e6783492388db":"Aladdin (Europe) (Sample) (SGB Enhanced)","a27e15cde0a8fbfc4489e0f599a53a9a":"Indiana Jones and the Last Crusade (USA, Europe)","a291dd1f541fac1d57019e4a3d0ffd08":"Takahashi Meijin no Bouken-jima III (Japan)","a2a6f4af9e87d6e34d92398a28d05149":"4 in 1 (Europe) (4B-006, Sachen)","a2b68b9472bde2d2fee32c2ec87ff017":"Wayne's World (USA)","a3059206ef517091a475249ce6c0db4f":"Aretha II (Japan)","a33a6aae3b61ef7ea70a9438e9c65b0d":"Minolta 2472-73 Adj. Program (USA)","a349929d5f66d6b7f637a4c8070fff18":"Humans, The (USA) (QUByte Classics)","a35f069f57eac92b4289b6cb45376963":"Friend of the Void (World)","a36b4c6c13d1dc9a98af66f963858ba9":"Minesweeper - Soukaitei (Japan) (En)","a379bbfbec2845fff956c18f9b743ee5":"My Husband is a WITCH (World) (v1.1)","a3ee0ae53bdbddd093304cb566a48eda":"Fidgetts, The (Japan) (En)","a446427cf79799deeba1ad63183765c0":"Mystic Quest (World) (De) (Collection of Mana)","a4627fb86c2b91fc0ace4f628aa607e4":"Joe & Mac (USA)","a46ded16cdf9308ed765e857203a59e7":"Daiku no Gen-san - Robot Teikoku no Yabou (Japan)","a477ac86be35d1fa70b708ad08dc88b8":"RoboCop (USA, Europe) (Rev 1)","a4dee5de1b4c3d9083f307d910fa0c3f":"Little Mermaid, The (USA)","a4fc8158d1f2b6359ddac6c66d747a95":"In Your Face (USA)","a517826d1cc3984a141f0f08d3ad72ee":"Zen - Intergalactic Ninja (USA)","a55e4143925f5cbe2b929cc5f598bbe9":"Superman (USA, Europe) (SGB Enhanced)","a574e5f7119b31e5112221c3a0ada813":"Smurfs, The (USA, Europe) (En,Fr,De) (Rev 1) (SGB Enhanced)","a580ee4e1fc4dde0d3b8c11b62a4d77b":"Rentaiou (Japan)","a58397c62d44a60fa08d3f51cd8385c6":"Mini 4 Boy II (Japan) (SGB Enhanced)","a58ad38354f16e3e6777e91dedd9ce28":"Battle Bull (Japan) (En)","a58f2b1a317cfb1d60b59f3875f6a9c2":"Dexterity (USA, Europe)","a5ab8800c82e4cac4e59fb4cf848a520":"Super Covid Go Get Biscuits Adventure (World)","a5ccb24492f40038cd5c2bb00ef6e150":"Chachamaru Boukenki 3 - Abyss no Tou (Japan)","a5d383a5f6e9d61b505429257f2c44c1":"Crayon Shin-chan - Ora to Shiro wa Otomodachi Da yo (Japan)","a5eef9d26684af4ee340f3b49a454283":"Madden 97 (USA) (SGB Enhanced)","a60df6aeb6820683805be1717097fca8":"Ganso!! Yancha Maru (Japan)","a614bbd7851374a870e57f43896ffe0e":"Casper (Europe)","a617ca41254cc6df7b82fa18e411010d":"Tip Off (Europe)","a61b0c0e0f0d9833cba22811caabd3ba":"College Slam (USA)","a630ff4546fd16369ede2a618224e7ca":"Linea, La (World)","a66e4918edcd042ec171a57fe3ce36c3":"Kirby's Dream Land (USA, Europe)","a6b8b5222f1cfc5162ce4fb1e29a8006":"Probotector (World) (Contra Anniversary Collection)","a6e199044dd40de06a7cc7cb1903711c":"Soccer Boy (Japan) (En) (Beta)","a6fd94ff8f5293aee192b89253b7be80":"J.League Big Wave Soccer (Japan) (SGB Enhanced)","a7032c0bbfe917790135acd338ec3d2f":"Nintama Rantarou GB (Japan) (SGB Enhanced)","a74a2a87bb4b2637c5243a37523fa7ae":"Karakuri Kengou Den Musashi Lord (Japan)","a74aa804a3a6439303583e6c0b413b00":"Chikyuu Kaihou Gun ZAS (Japan) (En)","a757dddda7b377c73cd8b7958b2115f6":"Operation C (World) (Contra Anniversary Collection)","a7594d0b4362a7e4325dd8ea913c4bf1":"Kinin Koumaroku Oni (Japan)","a76792fdbcf6a9f9f1ff32bc0915834c":"Snail, The (World) (v1.3)","a770898fbe4e5c155c865abbee4ee654":"Bobby's World (USA) (Proto) (SGB Enhanced)","a774e4d7c2e05d0dbbde260ec807bb59":"Mick & Mack as the Global Gladiators (USA) (Proto)","a77e8144b00215385ebf8490a539e4be":"Zoids Densetsu (Japan)","a78457ae06f670c5ec173f8d2ca605d5":"Doraemon no Study Boy 2 - Shou 1 Sansuu Keisan (Japan)","a7b0e283170b28c4c77016a95210b714":"Pocket Stadium (Japan)","a7df57dcb5f80ac0bbe39c4dc6339a4e":"Selection I & II - Erabareshi Mono & Ankoku no Fuuin (Japan) (SGB Enhanced)","a7e6b3415bd33f306c342f5b71493154":"Jimmy Connors Tennis (USA, Europe) (Beta)","a7f5427d28a60a0f59b850a521919179":"Fly O'Clock (World)","a818623c008517f677c1c1eb17962e8d":"Humans, The (Europe) (En,Fr,De,Es,It)","a83273edb8b89c84145d619d72ee19fe":"Ninja Taro (USA) (Beta 1)","a83d745ae8806a04d4a9e3c241f8c8cb":"Medarot - Parts Collection (Japan) (SGB Enhanced)","a8413347d5df8c9d14f97f0330d67bce":"Super Mario Land 2 - 6 Golden Coins (USA, Europe)","a849bc6810ae27de442ab9aa354ea594":"Medarot - Kabuto Version (Japan) (SGB Enhanced)","a8804c8514619cc918960c2008ed65d1":"Yoshi (USA)","a8b74d14e66f7a3049e79ca147141d52":"F-15 Strike Eagle (USA, Europe)","a8f87a97f8b5b84282c68d0ce989dd65":"Karamuchou no Daijiken (Japan) (SGB Enhanced)","a926508282da0b7889ab4f0947916068":"Desert Strike - Return to the Gulf (USA) (SGB Enhanced)","a94e7294260b4266af7d0283c95f0018":"Snow Brothers (Europe)","a95e6579f8d6048c5e150c41d180c782":"Alfred Chicken (Japan) (En) (SGB Enhanced)","a95ef483162d0ca6824a08a5e68f90b0":"Genesis (World)","a981378da19c08597db03f3ee02cd6d7":"Fortified Zone (USA, Europe)","a98f3b3b87d4b8ae3672f518295a8fde":"Populous Gaiden (Japan) (En)","a9c9d6b6759c28f2b3986717f4df2f98":"Medarot - Kuwagata Version (Japan) (Rev 1) (SGB Enhanced)","a9e795191670fe5994700c9cd8b7fbfd":"Otto's Ottifanten - Baby Bruno's Alptraum (Europe) (En,Fr,De,Es)","aa05bfdc3b5655d4cf6694f54a6262b0":"GameBoy WORDLE (World)","aa13e886a47fd473da63b7d5ddf2828d":"Pocket Monsters - Pikachu (Japan) (SGB Enhanced)","aa6cb8aa7bee968d77aae59acfbde6d8":"Bass Fishing Tatsujin Techou (Japan)","aa9d61a428c592030a88828ae80c8fb2":"King of Fighters '95, The (Europe) (SGB Enhanced)","aaaea54927a98e4531367d0331f06b00":"Matchless 23 in 1 A (Taiwan)","ab1fa0ed0207b1d0d5f401f0cd17bebf":"Exodus - Journey to the Promised Land (USA)","ab5e4c728a5b62f7985c22c61551469c":"Parasol Stars - Rainbow Islands II (Europe)","ab5f50d0e31a07e19739453bb9a2d328":"Dick Tracy (USA)","ab5fac354726b7b0710cfdba22d7142f":"Populous (Europe)","ab640fff5661c467369fa8fb12a389e8":"Tail 'Gator (World) (Limited Run Games)","ab7a5f3d9e818a434cc64915c3dbd31f":"Q Billion (USA)","ab916e1df69e7b3401cb6ebd3f1798a7":"Alien vs Predator (Japan)","aba4c0670730f413d4946d88aab28629":"Rampart (USA, Europe)","abd4baa57f0b90b402c2e56090394f9e":"Hercules (USA, Europe) (SGB Enhanced)","ac04d143de6734e181a223d05178bde8":"Ikari no Yousai (Japan)","ac2cd2a4227b38765f23fb5b72de6229":"Fidgetts, The (USA, Europe) (En,Fr,De,Es,It,Nl,Sv)","ac4db6db9087a5f124d0cdc5a72a77c0":"Touch the Cat (World)","ac818b043dce5ac97e5c36fb924964a6":"Hook (USA) (Sample)","ac91c0c58bc087f15d294092d65ed9f1":"Loesningen (Sweden)","aca9abfbab8345733456394b516f03e1":"Nekojara Monogatari (Japan)","acac255e33082dde52eee7af941d8681":"R-Type II (Japan) (En)","acc04aebb20cb829dca77bb554f60653":"Game Boy Digital Sampling Oscilloscope (Europe)","acc561d478839c1f3e5548355fce9e3b":"Sa-Ga 3 - Jikuu no Hasha (World) (Ja) (Collection of SaGa)","acc809b591ea80aef4922268460d7984":"Lion King, The (USA, Europe) (Beta)","ad167668bc03ad597a6ec4030be64d07":"Pokemon - Yellow Version - Special Pikachu Edition (USA, Europe) (Beta) (CGB+SGB Enhanced)","ad868e84fb6071a3b6a211d16e6cbb66":"Teenage Mutant Ninja Turtles - Fall of the Foot Clan (USA)","adeb901ebd11b788ae0b312e559eab73":"Olympic Skier (World)","adf6023f4bfc67cbbf09a42f0d0ce27a":"Suzuki Aguri no F-1 Super Driving (Japan)","ae073c63ff7d151dc2dd406830fbbdc2":"Batman - The Animated Series (USA, Europe)","ae08c1f73f822116060ef58293b94ed8":"Zelda no Densetsu - Yume o Miru Shima (Japan)","ae3f9a9c9a1ce63578ba68b3511c359c":"Animaniacs (Europe) (SGB Enhanced)","ae49bef112672ffa782d45fe9939be71":"Power Paws (Europe) (Proto 2)","ae4fda03378a0584d45a4735c9d6290e":"Dragon's Lair - The Legend (USA)","aee13a4aa95c9b3a4b4cf607a3e17a91":"Puzzle Boy (Japan)","af400bb2773ccbfcedfd1250cc801328":"Teenage Mutant Ninja Turtles III - Radical Rescue (USA) (Cowabunga Collection, The)","af46f94b7a05caf538b7c07b8bb75238":"Smurfs Nightmare, The (Europe) (En,Fr,De,Es)","af8022daa8b774c666fcc65961c8bd4a":"seaQuest DSV (USA, Europe) (SGB Enhanced)","afa16d0822254cf68df1e29556e6cbcc":"Prophecy - The Viking Child (USA)","b00c32fc442b523cec2f2a26ffe9a1a4":"Kick Boxing, The (Japan) (En)","b0195767bf5d839e4cc4c837a4709b54":"Mickey's Dangerous Chase (Europe)","b04f705f3e4db711560f9834a6431171":"Deadeus (World) (v1.3.8)","b050def2aa2280ee666d23c3a688f438":"Shinri Game 2, The - Oosaka Hen (Japan)","b051d85bf46335e0c00429abb313c213":"Teenage Mutant Ninja Turtles II - Back from the Sewers (USA) (Beta)","b06f7dae7b52ebe3d277ececa2d1976c":"Do I Pass (World) (En) (v1.4)","b08b6047c38db0febcdc29da5fc5b5a3":"Little Tales of Alexandria, The (World) (MBC5) (SGB Enhanced) (Batteryless)","b0935f81f3396b70e052a4b3332f0292":"Finders Keepers (World)","b0afdadb0804b98cd2ba41e2c59e251f":"Tsumeshougi - Kanki Godan (Japan) (Beta) (SGB Enhanced)","b0ef8b9f2ea3e0898b8298a6f076064a":"Caesars Palace (Japan)","b12ff2bc7c37b89272b8d402ff42f634":"F1 Challenge (Europe) (Beta)","b13d36a2d0244cfa90ca73d1b9794f0a":"Roger Clemens' MVP Baseball (USA) (Rev 1)","b150ebb4eef4643b9a392f41a0cd62e5":"Sushi Gun (World)","b172d8b9954d1dcf374ef99fc7cc2716":"Family Jockey 2 - Meiba no Kettou (Japan)","b17c839d444f98a4bd7fec2e49cacf12":"Mortal Kombat - Shinken Kourin Densetsu (Japan) (En)","b1864ab2fa592aa7e8337c308df08047":"Mickey Mouse V (Japan)","b1871e07c180925c0d196cf3a5fea020":"Goukaku Boy Series - Z-Kai Kyuukyoku no Eijukugo 1017 (Japan)","b199980b6e3fde27da5fb8d6d2b49356":"Bomb Jack (Europe) (Beta 1)","b1a4da0fc96be115b3d5303c9ca1447f":"Mega Man IV (Europe)","b2023017774d88ffe82a7d1b0af52c12":"Dirty Racing (Japan)","b236e81e9f5c19148c24c4984d8ef90f":"Heiankyo Alien (USA)","b251d6a81102315a0965281653b1ae36":"Goukaku Boy Series - Z-Kai Kyuukyoku no Eitango 1500 (Japan)","b259feb41811c7e4e1dc200167985c84":"Super Mario Land (World) (Rev 1)","b28fb20c039edc0f07509dd61a2ce7e4":"Art School Pocket (World) (Es)","b2999cfb6dacb439f501a71f30f91762":"Game Boy Camera Gold (USA) (SGB Enhanced)","b2c2367b5a3e6a483c147debec006508":"Goukaku Boy Series - Gakken - Yojijukugo 288 (Japan)","b33d6f65f4a566d715ce480bffd004ad":"Cliffhanger (USA, Europe)","b340bad71c781bd1394d95241ed1adce":"Cosmo Tank (USA)","b3474bab3eda25bdb1508ed53765fb30":"Mortal Kombat (USA, Europe)","b364d2bbe0a3a09adafa9b6b982a9acb":"Darkwing Duck (Germany)","b394b99267da2b55c74fc67c369c1057":"VS Battler (Japan) (En)","b3af8bcd6de27ba829c075affbc9f839":"Tumble Pop (Japan) (En)","b3be58ae099ab2a695cfebe9881c7461":"Boggle Plus (USA)","b3e011cde1fa6b5bebcac15ac970c4a9":"Hook (Europe)","b3f3d35f58a0ea3affc0ec6d4ee1183d":"Alien 3 (USA, Europe)","b439f2ca31e47f7ac4ea4a95cc6c9fa5":"Teenage Mutant Hero Turtles II - Back from the Sewers (Europe)","b48161623f12f86fec88320166a21fce":"Super Mario Land (World)","b4981ddab0cb1574701e7f1dae333861":"Goukaku Boy Series - Koukou Nyuushi Derujun - Chuugaku Eijukugo 350 (Japan) (Imagineer)","b499a3d11d9a18ad78407b1d00bf5e6d":"Safe File (World) (SGB Enhanced)","b4ab37ee420c11285be1c634c34f5726":"Altered Space - A 3-D Alien Adventure (Europe)","b4b0bea76a491e46c3b1e6e2fd7f0402":"Kaseki Sousei Reborn (Japan) (Rev 1) (SGB Enhanced)","b4cee49981c3124df8bbd40a60426f9e":"Snow Brothers (USA)","b4e5876c5acedd12b62e25a12973a4ae":"DuckTales 2 (USA)","b4f880dad5d909125faec725ae95c561":"Super Hard Bouncer (World) (v1.1)","b50c899d9e6c8e46e20e36aec019b0f0":"Snakebird (World)","b5136b95183959944f06e000f10dde07":"Deadeus (World) (v1.1.0)","b53539ee3d15c24bc55d71cfbbbf2946":"FlappyBird GB (World)","b53fe06db30ab689153135990354dd5a":"Mega Man V (Europe) (SGB Enhanced)","b55a747b3674c0c330c143ee715b1a6a":"Goukaku Boy Series - Z-Kai Reibun de Oboeru - Kyuukyoku no Kobun Tango (Japan)","b5a41149d31b00fae3460c5b89c6755b":"Spirit of F-1, The (Europe)","b5a6254b1711edfaf89830bcfff09d38":"Bionic Battler (USA)","b5c541c765fd3a5767b3fa1cfc821587":"After Burst (Japan) (En)","b5e99dcb3296afb933796e552cac1e31":"Purikura Pocket 2 - Kareshi Kaizou Daisakusen (Japan) (SGB Enhanced)","b65938f85944bda47e59c123537abea0":"Race Days (Europe)","b67196db786a67cdfe50d6d2e902aa11":"Jinsei Game (Japan) (SGB Enhanced)","b68c4141b4c4f778bd13100b9a3db82c":"King of Fighters '95, The (USA) (SGB Enhanced)","b68ce95d923f40fe9166ff635031147c":"Nada Asatarou no Powerful Mahjong - Tsugi no Itte 100 Dai (Japan)","b6a08c7e3af4ec8c9559cd268115d97c":"Mystic Quest (Germany)","b6cc27346353a8f02dda978a4e8ae2d3":"Nada Asatarou & Kojima Takeo no Jissen Mahjong Kyoushitsu (Japan) (SGB Enhanced)","b6d07d6830c8517aa96b000d9f3b2bf6":"GB Genjin 2 (Japan) (SGB Enhanced)","b6d1139fb8d57cd47f173faef592c813":"Game Boy Gallery - 5 Games in 1 (Europe) (SGB Enhanced)","b6d37de7ea2b720d1b66cb1db51ee6ba":"Amazing Penguin (World) (Limited Run Games)","b6da78085d38a8be3ef564b9989c45d0":"Dr. Franken (USA)","b73d76599e3d7f979a99bba5f1c92add":"Bonk's Revenge (USA) (SGB Enhanced)","b7477b7050cc569b4c02a5ae60e5f24e":"Pro Action Replay (Europe)","b76df0942c3f4b3569a736c9c8e44179":"Cel Story (World)","b783d5b3d52f43200500d773d36cc000":"Mega Memory Card (World)","b78f7809624994defcf23d2ec5e17d70":"Asterix (USA) (Proto 1)","b7963a68f95d644f8adedb269d29666c":"Hoshi no Kirby (Japan)","b80fc4c1aa83f4f57cd8e0378287ffd4":"Grander Musashi RV (Japan) (SGB Enhanced)","b834825661c10226c42ef6be87224b83":"Litti's Summer Sports (Germany)","b83f33f33ab52e0b7ee80715dbb8d415":"Great Greed (USA)","b83f3c669d22bc74c72743821ae3aaa3":"Alfred Chicken (Europe)","b85a4bdea69168870d5be639b8a1aa4b":"Pop Up (Europe)","b86be9c65c1ba0db48d6eb8e0770926d":"Peke to Poko no Daruman Busters (Japan)","b8ad678f5f1e8a7f498b04a6257b3108":"Goukaku Boy Series - Shikakui Atama o Maruku Suru - Rika Battle Hen (Japan) (Imagineer)","b8ae13edc37731756974a2b520763f20":"Pocket Kanjirou (Japan) (SGB Enhanced)","b8d609b5dbac6a2dae6087fd9feec196":"4-in-1 Fun Pak (USA, Europe)","b8daf4591cd9dd9da702d3544a3d07f5":"Ippatsu Gyakuten! DX Bakenou (Japan)","b8db331900e2ff84a83efa787a11131d":"Chibi Maruko-chan 2 - Deluxe Maruko World (Japan)","b8de7e1ef842f68d1d33538e621a9248":"Sword of Hope, The (Sweden)","b8ea135492ac908dda8bb695ffbbc813":"Super Street Basketball (Japan) (En)","b90369597fe5e986af4c1c31ad655f86":"Genjin Cottsu (Japan) (SGB Enhanced)","b91125b6018a0a879e356a32129f5b73":"Bataille Navale (France) (En,Fr,De,Es)","b94eb524347bb0a8a5c151b59ad63cfa":"Jurassic Park Part 2 - The Chaos Continues (USA, Europe) (En,Fr,De,It)","b990a1214b0c0c4f6eb079d80c8a9cbf":"Teenage Mutant Ninja Turtles (Japan) (Cowabunga Collection, The)","b9c444465748af0c5a7532c91d8c6d64":"J.League Winning Goal (Japan)","b9cfee05797beb8ff7e259ee77eaf2fb":"Mega Man II (Europe)","b9d3d91d8389cc510aa8fe9063228644":"Hatris (Japan, USA) (En)","b9d8e38d12aad3046b0e2e6fd1ce4944":"John Madden Football (USA) (Proto 1) (SGB Enhanced)","b9df0bb1f84333a1e5ab4af563525cdc":"Baby T-Rex (Europe)","ba134274fa4098395d54f619b22c9726":"Blitz Bomber (World)","ba2ac3587b3e1b36de52e740274071b0":"King James Bible (USA)","ba33da96bd133a788492f410170eb27c":"Minolta 2097 Adj. Program (USA)","ba50565630891680c9cf8b1827fca429":"Chalvo 55 - Super Puzzle Action (Japan)","ba544265b8d949cf35984cd23af63da8":"WWF Superstars (USA, Europe)","ba556891321dbbc8dce857ca2cf7d417":"Attack of the Killer Tomatoes (Japan)","ba760b6d4b96baf0fa2e7ad6e4498a95":"Nemesis II - The Return of the Hero (Europe)","ba78ac0638f36a89386b690d619f13b1":"Adventures of Pinocchio, The (Europe) (Proto)","ba8628a70339843c2ee8a294b840e8d6":"Killer Instinct (USA, Europe) (SGB Enhanced)","baf5068c926c2eabea4afe559f2e3cb0":"Lion King, The (Europe)","bb0cca048a51ddbae426221bb3d2e508":"Aretha III (Japan)","bb352209d041ed1b9f09c26e0c7ab749":"Dino Breeder (Japan) (SGB Enhanced)","bb5544584f2988490565198c56d81c06":"Shippo de Bun (Japan)","bb922ce354fc5caec500f99985a07c39":"Taz-Mania (Europe)","bbca91d6bc19cda45c706046b6e854e6":"Real Ghostbusters, The (USA)","bbee4bc313cf03c016129e1e00b50008":"Othello World (Japan) (SGB Enhanced)","bbf5e9e76b28352665aff796a13830e8":"Doraemon 2 - Animal Planet Densetsu (Japan)","bbfbc7f8bf4bc6bc5f4b829b2e52d593":"Pachinko Kaguya Hime (Japan)","bc19f4674a1ce73f1557e75fbd572370":"Minolta 2481 Adj. Program (USA)","bc1a3848092bdc900c157996c29a7783":"Yoshi's Cookie (USA, Europe)","bc35dc3bf102cfa265c5c7348e674ba9":"Dragon Slayer I (Japan) (En)","bc36d55377d7961a49a48a70a2827e5e":"Simpsons, The - Bart vs. the Juggernauts (USA, Europe)","bc40e81c4db84dd46f7b52c8bccf49b8":"Teenage Mutant Ninja Turtles 2 (Japan) (En)","bc4576a905da6160758264e6b070f8d0":"Lawnmower Man, The (USA) (Proto 1) (Not For Resale)","bc673971b4d2fd8914fb37d1b42e4610":"America Oudan Ultra Quiz Part 2 (Japan) (Rev 1)","bc76c0516129c6791e4087f93f5d3c99":"Battletoads in Ragnarok's World (Europe)","bc81e491896f94f1f92d1b830852ef5b":"Pokemon - Yellow Version - Special Pikachu Edition (USA, Europe) (Beta) (CGB+SGB Enhanced)","bcb3d47c291fd0a26b2c7b1082c3ad88":"Crayon Shin-chan 4 - Ora no Itazura Daihenshin (Japan) (SGB Enhanced)","bcdea9c2628c4913ee1036c161d69ce0":"Minolta 2162 Adj. Program (USA)","bd08880684132809013b413cfc1051dc":"Megami Tensei Gaiden - Last Bible II (Japan)","bd2d327c51a3c705227ec6eea474bb7b":"Tip Off (USA) (Proto)","bd456f73ba9cf33058d5a32f9f149e89":"Klax (Japan) (En) (Hudson Soft)","bd816c99ef46497c67aca61d1cb306be":"Nettou Samurai Spirits (Japan) (SGB Enhanced)","bd8873b840455cb6464574c14448f8cb":"Mighty Morphin Power Rangers (USA, Europe) (Beta) (SGB Enhanced)","bdc53a5d0d1448b900d16b9d583b02c4":"Oblique Strategies (World)","bdcf042bc2458768522c3cca43c89ee1":"Days of Thunder (USA, Europe)","bdd6f3f98390202800751a4ea2a48c36":"Same Game (Japan) (SGB Enhanced)","bdf7e5902c89bd3cdfead568d8105758":"GB Pixel Jam 2023 Gallery (World) (Digital)","be99ca18c5b9dbb90b4e08f164855be5":"Pachinko Time (Japan)","bebc8436a32cf92de0197dd47bc52e97":"Christmas Carols (World)","bec4b32510f72af2811045a87261aea9":"Kizuchi da Quiz da Gen-san da! (Japan)","beeb3092aec6da08f5a86630207ae87c":"Looney Tunes - Bugs Bunny to Yukai na Nakama-tachi (Japan)","bf01b798de6b41d301827a4c943a9e45":"Jimmy Connors Tennis (USA, Europe)","bf3d90ff1c8d4827b5657d7b15d84fde":"Mercenary Force (USA, Europe)","bf4e4002ffa88b9be2c8b8a5b4cd9a48":"International Superstar Soccer (USA, Europe) (SGB Enhanced)","bf9334b9c902510cd9fe39af82b4b465":"Hugo 2 (Germany)","bfc83dd55f64f6c472ef45d3592a7b92":"Yu Yu Hakusho Dai-4-dan - Makai Touitsu Hen (Japan) (SGB Enhanced)","c013958fa8447be55f1e037ed4a1a9f9":"True Lies (USA, Europe)","c03abc409b442aa42864cb2ac2ba89b9":"Pinball - 66hiki no Wani Daikoushin! (Japan)","c042681adbbe175b354d0abee3413219":"Shanghai Pocket (Japan) (SGB Enhanced)","c05b47df8bdfe770be228e51bc42da84":"Rockman World 2 (Japan)","c07063729944ffc4459e006e862df061":"Soreyuke!! Kid (Japan)","c07e71f36fe2cd302f043dd37f828718":"Ninja Twins (World) (Digital) (SGB Enhanced)","c0a038c66fb8252108ee888f8a0ba2bf":"Konamic Basket (Japan)","c0c970db6c0572facb8a54b23152f509":"Minolta 2205 Adj. Program (USA)","c0ca6588162206b5982ba77bcf6397ce":"America Oudan Ultra Quiz (Japan)","c0d8ed063b30614c71d15d4d0ff08ffe":"We're Back! - A Dinosaur's Story (USA, Europe)","c0f1cd247136a87c6a2f71b54544a8d3":"Alien Olympics (Europe) (Beta 2)","c10a76a601ea375593f1cb944c3365e7":"Game Boy Wars Turbo (Japan) (SGB Enhanced)","c18465f62acdb31516360c17ccc2ab37":"Nettou World Heroes 2 Jet (Japan) (Rev 1) (SGB Enhanced)","c18510af46a7e2649221fdc2e03599e6":"Nigel Mansell's World Championship Racing (Europe)","c18bd7c4f672efe33dff72a5dacd3284":"Wordtris (USA) (Beta)","c197d6afc51b6bcf616781a5c32708a4":"Pachi-Slot World Cup '94 (Japan)","c19d61e31d6aebc12abf80d628a7bd09":"Mortal Kombat 3 (USA, Europe)","c1ac652d62a6302d6c34814f7f703957":"Dragon's Lair - The Legend (Europe)","c1adf0a77809ac91d905a4828888a2f0":"Pocket Monsters - Ao (Japan) (SGB Enhanced)","c1b3f705a5e0786b223e9c2ece073fe5":"Star Wars (World) (Limited Run Games)","c1c084439399dc1541ee555bcabb7700":"Bases Loaded (USA)","c1cff8487b25700a509ce89cc3c7bcac":"Primal Rage (USA, Europe)","c20ce2d03552b351510767ea68070838":"Opossum a la Mode (World)","c21058af21efc29413797f0a2c532e16":"Incredible Crash Dummies, The (USA, Europe)","c216547ff3fc2794bb6eab9c84032bea":"Super Breakout (USA)","c2212d75077638539d6af4673b4939e6":"Dead Heat Scramble (USA)","c22f3efe9048652ef6f798650fce2d2a":"Rockman World 3 (Japan)","c24fab661012d1cf62e030bc31cd1f69":"Famista 3 (Japan)","c25b8eba16bb9a24dcf6339febc05dbe":"Game Boy Gallery (Japan) (SGB Enhanced)","c267820660ecbbab0d63fded955f1e15":"Mona and the Witch's Hat (World)","c27ebebee5a53fe6eb857747c0556111":"Flappy Special (Japan) (En)","c284b8a9019020336c89b680fb6552e4":"StarHawk (Europe)","c29df42ef1237c4392049196d2205ffe":"Midori no Makibaou (Japan) (SGB Enhanced)","c2a123cce9d1adac8bdb94b8b475d24c":"Addams Family, The - Pugsley's Scavenger Hunt (USA, Europe) (Beta 2)","c2ab034ceb1dc42c96a7a9301c382d20":"Battle Crusher (Japan) (SGB Enhanced)","c2bd6566d434e175c308d99803922e3d":"Cool Hand (Europe) (Fr,De)","c2de4b0c726b579012fef2be578b1920":"Kirby no Pinball (Japan)","c2f5ca0c891c84b3393ab732934f70e3":"Stardiver (World)","c31e99cb81e95c56af7596cdcfe5a48c":"Iron Man X-O Manowar in Heavy Metal (USA, Europe) (SGB Enhanced)","c3f48a71da12919004c88b6f37eebd0d":"Nekketsu! Beach Volley Da yo Kunio-kun (Japan) (SGB Enhanced)","c3fbe689e57e493d9e5eb8340c4efb29":"Doraemon no Study Boy 1 - Shou 1 Kokugo Kanji (Japan)","c4082f582d94e51fc960838e9c5829b8":"Neko Can Dream (World) (En)","c4360f89e2b09a21307fe864258ecab7":"Legend of Zelda, The - Link's Awakening (USA, Europe)","c46e059a69d9b3b4b0b9d8d303c559b3":"Trip World (Europe)","c4801ac17a34635fdce973354e85faef":"Dig Dug (Europe)","c4868bf46a993b4c33a9a8af5341282a":"Blaster Master Boy (USA)","c4b03180037d53cb64b93634439acea0":"Super James Pond (Europe)","c4c65d1c07bbc9626ddab008843bf7d0":"Oni (World) (Digital)","c4dc3987a841a428f837db26bddc586e":"Nemesis II (Japan) (En)","c4e2de3be0bb5608ab903a885afc065d":"Hook (USA)","c4ea13687c331ce83c03d5fb400ea19a":"Blues Brothers (USA, Europe) (Beta)","c515cc92427ea1148c1d6274f803b07a":"RoboCop Versus The Terminator (Europe)","c5256354a6fcd57240c97a399773822e":"Nangoku Shounen Papuwa-kun - Ganmadan no Yabou (Japan)","c5397c3e9740264482995573628e3b9d":"Dr. Franken (Japan) (En)","c551445d0da819e3717e5bb600a81d06":"WWF Superstars 2 (Japan) (En)","c5858497d4e8fcfbb7221e327a0e79b5":"CutThroat Island (USA, Europe)","c58edffdb628ea2fc904d4b8c93b6cbc":"Mickey Mouse (Japan) (En)","c593b63cbd4b151a2fd1861c73634b0a":"Winter Olympic Games (USA)","c5b36de3dd613b23e2aef7fc4427e5f8":"Frank Thomas Big Hurt Baseball (USA, Europe)","c5f51c42357790b7693198fc06f82390":"World Cup Striker (Japan) (En)","c62460c4fb6430cb4d2c6a3902b5442d":"Schiffe Versenken (Germany) (En,Fr,De,Es)","c62581e125bda4a878740548540f8ebb":"Pluto's Corner (World)","c62fcd4c0cbf34f2e7d1c86db1eb0a87":"Machine, The (World)","c6adf7c0b2a3ea59fa6e59bcf7f1dc4a":"Super B-Daman - Fighting Phoenix (Japan) (SGB Enhanced)","c6c1ce5f473fd6a31033878d32c885d4":"Chiki Chiki Tengoku (Japan)","c6effb3a51b36056411760d1ffe048f7":"Operation C (USA)","c7697c8db218bcb35aa37d43e4278376":"Bamse (Sweden)","c789b84538beff12b8b60065974a3b10":"Mission Mars (World)","c7920eb4b478c4d7513f2f43b7dbb9cf":"Tamagotchi (USA, Europe) (SGB Enhanced)","c7bf23774f3fec0bbe79504a558fbbb6":"Jinsei Game Densetsu (Japan)","c7dd61d11b33e88fc09acd045d4ab339":"Nakajima Satoru Kanshuu - F-1 Hero GB '92 - The Graded Driver (Japan)","c7f41e40a9e5a9141ca80be614e0907b":"Judge Dredd (Japan) (En)","c7f8eb0309204c2d83fc2fe4d03c4bde":"David Crane's The Rescue of Princess Blobette (USA) (Beta)","c7fe0019fdc5887641cd6a1bb193ddd6":"Top Rank Tennis (USA)","c80413993cb4a5b79c9cdd04235010dd":"Bubsy II (USA)","c836b4b44edcbe8a811fb10541919fe8":"Final Reverse (Japan) (En)","c83cfed9c0cc9043eed5f761550de64c":"Ninku Dai-2-dan - Ninku Sensou Hen (Japan) (SGB Enhanced)","c856cee0abfc387aaef8c851cc2a67b8":"Chou Mashin Eiyuu Den Wataru - Mazekko Monster (Japan) (SGB Enhanced)","c85e5ba3dad5aa705b96da083cdd1a1c":"Dangan GB (World) (v1.1)","c8611861afe5d9b47043150ee2c94389":"Druaga no Tou (Japan) (En)","c87119b643ff4de3e2614ff10bd0c6ea":"Street Fighter II (Japan) (SGB Enhanced)","c88219c68fd7f29e92511eb80da2a9ef":"Anctrayl (World)","c88d94a984afde869426694a3b992894":"Fist of the North Star (USA)","c8bab3886324f6aec60b65d8584453a1":"Agro Soar (Australia)","c8d156a2d4f38f56ec3aa9e405e540b3":"Winner's Horse (Japan)","c8d302c64c7fa47c8d735d037b5e4e0d":"Alien Games (USA) (Proto)","c9200b1be878f079cee6cbebbeaa27ea":"Nintendo World Cup (USA, Europe)","c94afb46cada0118aa8ff08cc07749a4":"Parodius (Europe)","c9791e6cd453aeef19c722924521d381":"Star Trek - The Next Generation (USA, Europe)","c99e0dff23c030ec8f7be07557b94a66":"radioRealm (World) (Ja)","c9a8d61d6d4707d28fcb267f93fa59ec":"Namco Gallery Vol.1 (Japan) (SGB Enhanced)","c9ce9d01b622efce61cd4f002c628203":"Square Deal - The Game of Two-Dimensional Poker (USA)","c9dc09ea6d93d5114079f58c7bbf7982":"Battle Space (Japan)","c9e8c196d57aab17c4c171816fcd6492":"Spud's Adventure (USA)","c9edc6cb63e3c2a91889653af8929ff7":"Hokuto no Ken - Seizetsu Juuban Shoubu (Japan)","ca051ed29d2e844da897484aa501d86d":"From TV Animation Slam Dunk Limited Edition (Japan) (SGB Enhanced)","ca7a62e5e14aafd813bc806d0cf54117":"DuckTales (Europe)","cac921f8eec70d5ccd8a2db8f473a084":"Alfred Chicken (USA)","cac94925bf098982d31f7c9a2c296d25":"Tail 'Gator (USA, Europe)","cb0a5d103c01d1d82d324602a45dd21b":"Burning Paper (Japan) (En)","cb1d69526cea3a0cbcaae091a10707fe":"Donkey Kong Land III (USA, Europe) (Beta) (SGB Enhanced)","cb1dce08c78c509a876c494d6333f45c":"Star Wars (USA, Europe) (Rev 1)","cb5fe1c733f610ad6151216b6887285a":"Samurai Shodown (USA, Europe) (SGB Enhanced)","cb61afd7708d90d976f585edebcaaa89":"Tom and Jerry - Frantic Antics! (USA, Europe)","cb62a0dd667ff4fc2f4ebe6f0aef955f":"Baseball Kids (Japan)","cb66b804aea0db325d5f2dd795c71a6a":"Lingo (Europe) (En,Fr,De,Nl)","cbab48ca1dffc834b4e334861498610d":"Tip Off (Europe) (Beta 3)","cbb45188c780ce5bbdf502ceb2b9994a":"Tiny Toon Adventures - Babs' Big Break (USA, Europe)","cbbc637e7c1f6473ef5c07d9071b50ae":"WordZap (USA) (Beta)","cbd881ea82beb95ab599a0418b22635a":"Metal Masters (World) (Limited Run Games)","cbe4df9625a9145d00426f0e92e162f9":"Tsuri Sensei (Japan) (SGB Enhanced)","cbf1f4ca2288995c18df0ef3025c9580":"Bakuretsu Senshi Warrior (Japan) (En)","cc0cc9f187765dbf3054585d5b33a6ec":"Torpedo Range (Japan) (En)","cc111bc1ee3e0ad566b8bc058372b6cd":"Lucky Monkey (Japan)","cc5fe746d5e216b4a1048453b2068a5d":"Solomon's Club (Japan)","cc6419598044961237496d3af7f18d58":"Goukaku Boy Series - Eijukugo Target 1000 (Japan)","cc7b28ea40189a4c0a254c3a7f11e934":"Oni IV - Kijin no Ketsuzoku (Japan) (Rev 1) (Beta)","cc9d6b3915a86013599fcb30b75cc237":"Conefuse (World)","cca5288a7a9e0270592bf75c0431bbb5":"Hunt for Red October, The (USA, Europe)","ccaf9331318d4dfe3d1ee681928a74fd":"Mario's Picross (USA, Europe) (SGB Enhanced)","ccb0d2a704c3ec24a0bbd78fcdfad4dd":"GB Genjin (Japan)","ccbd8d97a61883e05eab21a5546188b2":"Heracles no Eikou - Ugokidashita Kamigami (Japan)","ccd0cf7cc240714a9694e1fe296afb7c":"Noobow (Japan)","ccd1192a634c3358352172abfeb7fb9e":"Caesars Palace (USA)","cd1fa506eea7590b0b24b6bdd153ffa9":"Bubsy II (Europe)","cd2caab38139f54145fc5a3ce1e01925":"Best of the Best - Championship Karate (Europe)","cd40bda7a113c2279d5ffd1cfa0cfdc7":"Jet Pack (USA, Europe) (Beta)","cd5b7ab41c9c5b1f0f70f4a736628dc0":"Ranma 1-2 - Netsuretsu Kakutou Hen (Japan)","cd5bd70c93494a58aa919d84eba8e77e":"F-Zero - Project (World)","cd6ca2a01e2310193c46afcbfa382ab5":"Hero Shuugou!! Pinball Party (Japan)","cd84cc505331f6a1d0702bb4a9667cec":"RoboCop 2 (Japan)","cd8eb18dec915d8e2ea73f097d33ba04":"Mouse Trap Hotel (USA)","cd9027e147f4605f26ee261c537441b3":"Pac-Man (Europe)","cdca15cfd1645c02fe1cc327b772264e":"Gauntlet II (USA, Europe)","cdd340a5f4e02c5d84d094fa0a06db1a":"Samurai Shodown (USA, Europe) (Beta) (SGB Enhanced)","cdf34991548f40dfc310d4fc763441f8":"G-Man (World)","ce2927987765182b9c69f26f758656e9":"Mortal Kombat II (USA, Europe)","ce9fbfc61ec6310a524cec0e89a9e487":"Trump Boy (Japan)","cea0e2a46ccbf9b9a77b14379e49228e":"Ninku (Japan) (SGB Enhanced)","ceaedf86193a8708a8a67e0e472b57fb":"Blues Brothers, The (USA, Europe)","ceb17d831b410d91aa41bf2819cbed82":"Mega Man V (USA) (SGB Enhanced)","ced7cc60f00d5bc4bcdc816aafe69be3":"Mystic Quest (World) (Fr) (Collection of Mana)","cee4efe750f6bb6ad685a9d1d912a1ca":"Uchuu Senkan Yamato (Japan)","cee6d41002411e7d8b8344eea2a3ded9":"Monster Truck Wars (USA, Europe)","cf189f7f8a35bd5838c102cd2126de46":"Renju Club - Gomoku Narabe (Japan) (SGB Enhanced)","cf1f58ab72112716d3c615a553b2f481":"Mortal Kombat & Mortal Kombat II (USA, Europe)","cf4e3f4ee5df2d68e978826ae564e1da":"Racing Damashii (Japan)","cf5be6d9c263d02039bfaae93c1bd32c":"Asterix & Obelix (Spain) (En,Es) (SGB Enhanced)","cf6ec3c13cd20240ef0c0c63ec06558f":"King of Fighters, The - Heat of Battle (Europe) (SGB Enhanced)","cf71ca9d27bb91c32cdcad09024b2457":"Koi wa Kakehiki (Japan)","cf975880261a3767a64a28cc4357966e":"Guns&Riders (World)","cfc7edbc95e8df5305d117c6993d5f20":"Fire Fighter (Europe)","cfee195bfd47e8e061ed67b9545242a4":"Power Mission (Japan) (En)","d0444abf63571f46cd080063f82a4452":"Robin Hood - Prince of Thieves (Spain)","d051557317b202cfb9b6667fc64a5426":"Jabberwocky (World)","d08bd44b4dd69e5eb7baf626cf5a7386":"Popeye 2 (Japan) (Rev 1)","d09f2f5306655baf5b910a5c115dd77c":"Legend of Zelda, The - Link's Awakening DX (Germany) (Proto)","d0a4d58a42b46b891d1c92d6af37f934":"Super Street Basketball 2 (Japan) (En) (SGB Enhanced)","d0b1c550250c859f4563165eb29033d6":"Rockman World (Japan) (En)","d112981290430c09b82d7fd7edfce0bb":"Purikura Pocket 3 - Talent Debut Daisakusen (Japan) (SGB Enhanced)","d11777331e12f55ae4bab2f6e0bda918":"Shanghai (USA)","d11d2dc76c6d743c3cc791104a2bdae2":"Jurassic Park (USA)","d120872ad4f5b3e67cc5561550f2d142":"Yu Yu Hakusho (Japan)","d12e226a7e1686e8dac9936361299624":"Mysterium (USA) (v1.00AI) (Beta)","d14502bcdcf71e9e16476b5077c03945":"Nettou Toushinden (Japan) (SGB Enhanced)","d17aa3dd0a52bc3dc03bfe20f27c8b07":"Booby Boys (Japan)","d1d01441dbc0baa83b23010cb60c687b":"Higashio Osamu Kanshuu Pro Yakyuu Stadium '91 (Japan)","d20d4b7e9f7299ac1f59c3130abb6e02":"Daiku no Gen-san - Ghost Building Company (Japan)","d21322204e66c5f40ab3a86cbb63fccf":"Mini Putt (Europe) (Proto)","d29cc1b6fe7709a6d16f00c779499de2":"Rugrats Movie, The (USA) (SGB Enhanced)","d2cfe884e32423402fb7c71e319cf4ed":"Super Black Bass Pocket 2 (Japan) (SGB Enhanced)","d2e1d465d372f9ee4d115a2c9bd1c497":"Jetsons, The - Robot Panic (USA, Europe) (Rev 1)","d2fa9c7a4c634949c42b3271365b6c7a":"Purple Turtles (World)","d300bf9412617a95b00b80fa468a8a04":"Alien Olympics (Europe)","d30c6595259d32038a56597d4ab7a3d2":"Auto Zone (World)","d310864869dca081fd30002548830051":"Q Billion (Japan) (En)","d32022e0c8eeb93bbbfed851d75788f3":"Pokemon - Yellow Version - Special Pikachu Edition (USA, Europe) (Beta) (CGB+SGB Enhanced)","d32b9da8028d357e20c791b07ded4f86":"Space Invaders (USA) (SGB Enhanced)","d335d4d79ed002c7a67863e82ceaa472":"B.C. Kid (Europe)","d345b97e4b43f20a01fa2e4ea4a63a2b":"Lethal Weapon (USA, Europe)","d38d79715b8ec31de8905f5d1312079e":"Namco Classic (Japan)","d39462c174c7ae4e15680301dbae1c35":"Double Yakuman (Japan)","d3b0f2fd8305d44173634ff52a5f7b37":"Kamen Rider SD - Hashire! Mighty Riders (Japan)","d3d63bf466e63af0601016f87ffc3ee2":"Vitamina Oukoku Monogatari (Japan)","d3fce7259e7768c7a6315b32a54cb32d":"Daikaijuu Monogatari - The Miracle of the Zone (Japan) (SGB Enhanced)","d4088d3239a9291e4e7bdb2119ad7708":"Goukaku Boy GOLD - Shikakui Atama o Maruku Suru - Joushiki no Sho (Japan) (Imagineer)","d413f826b00d3f2384555490d0f1271d":"Tasmania Monogatari (Japan)","d42a0f2f9205e81cbbbe132711d69d58":"Urban Strike (USA, Europe) (SGB Enhanced)","d44041e733ffa73dea5613f62f8e064b":"There's Nothing to Do in This Town (World)","d4792ed1687d50cf4c77afcab05a24bc":"Home Alone (Japan)","d4a7bd8598b050262ed6f553b45d5b3e":"Catrap (USA) (Beta)","d4bf4c5ebec2a496bb6ec062058158c6":"Nikkan Berutomo Club (Japan) (SGB Enhanced)","d4ce04db5f2e259967c01a8bbd9792fc":"Captain Tsubasa J - Zenkoku Seiha e no Chousen (Japan) (SGB Enhanced)","d4e7caf41d3a12facc5d7d5185631567":"Toy Story (USA) (SGB Enhanced)","d4ebf9cf10dda19dd2bafd1c1673d762":"3-pun Yosou - Umaban Club (Japan)","d4f7ade01af0818a79bc809cf96118bb":"Battleship (USA, Europe)","d4fddd965bb2192e2635d2202f59f999":"Mick & Mack as the Global Gladiators (USA) (Proto)","d5081250257e0dafcb8fe8720fcb9f28":"Game & Watch Gallery (USA) (SGB Enhanced)","d526aa32fb92d3721a16d79527bcacc1":"Zoop (USA, Europe) (Beta)","d5596fa64e5b0ff193feeac749b8be88":"Ferrari Grand Prix Challenge (USA, Europe)","d56d652d3b306345718ce657629d4a40":"Prince YehRude (Taiwan)","d57eeed4d5dede4b9aefd15c4c703113":"Game de Hakken!! Tamagotchi 2 (Japan) (SGB Enhanced)","d57f73c47aca3e22f4ea2143469ab20e":"Mani 4 in 1 - Bubble Bobble + Elevator Action + Chase H.Q. + Sagaia (China) (En)","d59add67965bacf227a0661797fc6405":"Traumatarium - Penitent (World) (Proto)","d5b242aff7e2008950611082f0b4edb9":"Stargate (Japan) (En) (Possible Proto)","d5c27ff8cb1b69cb56df4ff170e2baf0":"Final Fantasy Legend, The (USA)","d5f71894ebb36d4424de4207d9ecfa91":"Tuff (World)","d5f88d0799c85b6d59f12542da403691":"Choplifter II - Rescue & Survive (USA)","d63c397e5f6c81e4accc9114f75ee574":"Oni II - Oni Densetsu (Japan)","d6665854fdfe6d6d34c03b56d641d193":"Go Go Ackman (Japan) (SGB Enhanced)","d67e58bf5f39d5fb073fed85c3d9bede":"Adventure Island (USA, Europe)","d6cf6d5b5a86292d88116b9c4ebee091":"Medarot - Kuwagata Version (Japan) (SGB Enhanced)","d6d8e759c19c1ba384670f2a06b4d11b":"Battle Bull (USA)","d701029a9030339477ba4cca1ad3e9c9":"Xin Nushen Zhuansheng Waizhuan - Zuihou de Shengjing (Taiwan) (Pirate)","d736b55291d7dae4d9c3f1e74fbff0da":"Hudson Hawk (Europe) (Proto)","d74207329ee4b820f4b84455fc8181b7":"Little Tales of Alexandria, The (World) (MBC5) (SGB Enhanced)","d7569c3faaa4a657385c119e6b4a48c6":"Prophecy - The Viking Child (Europe) (En,Fr,De,Es,It)","d76ca0b687c813464743967c26b03278":"Gegege no Kitarou - Youkai Souzoushu Arawaru! (Japan) (SGB Enhanced)","d7bc88e01b7722082b3a5ae729de170e":"Go! Go! Tank (Japan) (En)","d7da0896f856630a011ac160589912ce":"Bugs Bunny Collection (Japan) (Rev 1) (SGB Enhanced)","d7fa04a91e492855f549dfe1f2c721f7":"Elden Ring GB (World)","d7fb01dec29a52de74e5b335b8619e0a":"Speedball 2 - Brutal Deluxe (USA, Europe)","d82114f0aadfc632cdc9d4c553b3cc7a":"Sanrio Carnival (Japan)","d8326bfee457ccb2c0afb8dd6ac11db2":"Amazing Penguin (USA, Europe)","d87fdb7009dece416655edf24ee19ede":"Mach Go Go Go (Japan) (SGB Enhanced)","d8ad8389c9ec44d4e3bacc88d7b7b1a9":"Jeopardy! - Teen Tournament (USA) (SGB Enhanced)","d8be915967fef85c4c53e205ede65b3c":"Sa-Ga 2 - Hihou Densetsu (World) (Ja) (Rev 1) (Collection of SaGa)","d8e5252704cf0681a7f737d599526591":"Bram Stoker's Dracula (USA, Europe)","d8e5f3f058b75b65ba86ae4e43e2986b":"Dracula Densetsu (Japan) (Castlevania Anniversary Collection)","d8f049e77238c17c5a91aef2bf300180":"Goukaku Boy Series - Kirihara Shoten Hinshutsu Eibunpou Gohou Mondai 1000 (Japan)","d8fafe7e8bf3d169d03b48ea23262fd5":"Mr. Do! (Europe)","d9290db87b1f0a23b89f99ee4469e34b":"Pokemon - Yellow Version - Special Pikachu Edition (USA, Europe) (CGB+SGB Enhanced)","d9293475642991e942ac11262d8e5927":"Mani 4 in 1 - Genki Bakuhatsu Gambaruger + Zettai Muteki Raijin-Oh + Zoids Densetsu + Miracle Adventure of Esparks - Ushinawareta Seiseki Perivron (China) (Ja)","d939e5c1ce9436a548fcdd3938348ba1":"Osawagase! Penguin Boy (Japan)","d9774af8edb8969adfd3693d5d7ab166":"World Circuit Series (USA)","d97f34c22a179fb4094acbc05616f565":"Buster Bros. (USA)","d9bacb4b392a0ce4e8f9d29baa916b0b":"Pipe Dream (Japan) (En)","d9c82bf67ad459f08676a1c7cb9037f3":"Dodge Boy (Japan)","d9cb4470f5320cac32fc2bc17e1e9d7b":"Tetris Plus (Japan) (SGB Enhanced)","d9d957771484ef846d4e8d241f6f2815":"Wario Land - Super Mario Land 3 (World)","d9da15a5481fdc184d75c6d190d45fd3":"Hyper Black Bass '95 (Japan) (En,Ja)","d9e0e5c51f4a60855d701c3c9deec74f":"Mickey Mouse V (Japan) (Rev 1)","da11bf0e3d40d317a0d27a665b739bae":"Indiana Jones - Saigo no Seisen (Japan)","da7f9623e0d544196747cfd2b79b5e78":"Hayaoshi Quiz - Ouza Ketteisen (Japan) (SGB Enhanced)","daee829005d9c4bd5f636004bfffdfe3":"Red Arremer - Makaimura Gaiden (Japan)","db156bc96b528996ce1bf771195171af":"Final Fantasy Legend III (USA)","db24c76ac8d32cd23ce3a00519ba874f":"Lunar Chase (USA) (Proto 2)","db536d452c67b67722711ce45519015f":"Addams Family, The - Pugsley's Scavenger Hunt (USA, Europe) (Beta 1)","db8683de91dd039783618b0873f3960e":"R-Type II (Europe) (Beta)","db93fedeee04d4a18fd4251cdc93620d":"Kattobi Road (Japan)","db9e4e9d4a4b9f4e282448284ddea155":"Mini Putt (USA) (Proto)","dba637d1573394056a89cb97ec78000a":"WWF King of the Ring (Japan) (En)","dbb866351ae487d06c3d79f9ad641d0b":"Zagan Warrior (World)","dbe1e995af2f9c28a06fe5845f04da7b":"Super Momotarou Dentetsu (Japan)","dc2732dba9121aad355fa2e1dfbbb069":"Tecmo Bowl (USA)","dc2f4d927edda442de2148af590bebb5":"Addams Family, The (Japan)","dc3ef8d3fad26cba840327cc428cadbc":"Street Fighter II (USA, Europe) (SGB Enhanced)","dc79b733997e469e961e2d850448db23":"Hyper Lode Runner (World) (Rev 1)","dc8b474c2a31da3a494c80970d2892bf":"Tecmo Bowl GB (Japan) (En)","dca464649ea6a3969ac8ee834d431d44":"Motocross Maniacs (Europe)","dcabc0879c258e54048237d280ffa7da":"Paperboy (USA, Europe)","dcac90d51f56f90e26d41e7731de08ec":"Nanonote (Japan)","dcf52229dfd4c2d90d76577d9abf8e39":"Farm, The (World)","dcf79d785d5ce187f727f7dc2e00dc8c":"McDonaldland (Europe)","dd059180386c5d7b7b5c580d0e557a93":"Bung's Math Test (World)","dd0752e29d7754ae3249f32bf0352811":"Legend of Zelda, The - Link's Awakening (Canada) (Fr)","dd3b8a8023d8eb0c9766d42f78be4fb1":"Pachi-Slot Kids (Japan)","dd519f58f68e27b70c29cf19500a0154":"Ultima - Ushinawareta Runes (Japan)","dd5aa6e85827a3ce6e4b7500e75a3262":"Burai Fighter Deluxe (USA, Europe)","dd5d45d9f8722f8ded9ab85097daa4e5":"Captain America and the Avengers (USA)","dd762c593d517101b6a64407eac2f91a":"Rig Attack (World)","dd807bce8ce4a54a6bf40ff653beeaf8":"Pachinko CR Daiku no Gen-san GB (Japan) (SGB Enhanced)","dd83f27a43bc5d571c86f979aac2e1dd":"Impossible Gameboy (World)","dd846c4e076dd2f02fc3a4e2ecb6c940":"Koro Dice (Japan) (En)","ddb5bfae32b0ca39cf8ab6c46880126c":"Kirby's Dream Land 2 (USA, Europe) (SGB Enhanced)","ddce618f0a986b96960bc5f6f69e3415":"Goukaku Boy Series - Shikakui Atama o Maruku Suru - Kokugo Battle Hen (Japan) (Imagineer)","ddd4c08b975e78d77b00b56b85a7862d":"Goukaku Boy Series - Shikakui Atama o Maruku Suru - Rika Battle Hen (Japan) (IE Institute)","de0ff9f3ad6c9dfd3f83f18e5a931a77":"TV Champion (Japan) (SGB Enhanced)","de12e7c222ca5be9a1b1ea76ddc6c568":"Ishida Yoshio Tsumego Paradise (Japan)","de1572d4d181b265e2cb7d517c0ba04a":"Motocross Maniacs (USA)","de2236723c8d218e04c93849ebcda72d":"Quarth (USA, Europe)","de3860796170ee4ca80d302a5f024474":"Pachio-kun (Japan)","de6058a29141dd5b327070c7c7ba4196":"Kingyo Chuuihou! 2 - Gyopi-chan o Sagase! (Japan)","de64a15fb90fae1c179a0d32a5eb1390":"Goukaku Boy Series - Koukou Nyuushi Derujun - Rika Anki Point 250 (Japan)","de731a5f2f4e7d16bcdc4b5953ddcc12":"Makaimura Gaiden - The Demon Darkness (Japan)","de7c175933eb95ec5fd1bd7bdd7f7bf3":"Teenage Mutant Ninja Turtles - Fall of the Foot Clan (USA) (Cowabunga Collection, The)","de95d425f6a2836960f4ee2a9aa2f6f7":"Little Master - Raikuban no Densetsu (Japan)","deb601b4fadefb13f5e6251c945d10f4":"Kaijuu Ou Gojira (Japan)","ded0b53fcfcb2fc647982727cc8fa072":"Pocket Love (Japan) (SGB Enhanced)","ded286dc9fb5708292f01db0839e0102":"Brain Drain (Japan) (En) (SGB Enhanced)","dee2448aa2314e7b3c12849a053ea079":"Elevator Action (Japan) (En)","dee3e9698d8087aa884d95978d5efaa7":"Nettou World Heroes 2 Jet (Japan) (SGB Enhanced)","defe3559ef5e8d69ca95289edb6f9f6e":"Mario no Picross (Japan) (SGB Enhanced)","df43e0adfdc74b2829c7e95e91c71a28":"Penta Dragon (Japan)","df5835e45b4540087133af202f7d67f6":"Pang (Europe) (Beta)","df7478308fc20466e39ef7bd950048e5":"Pokemon - Red Version (Hong Kong) (SGB Enhanced) (Pirate)","df91ed711fb8553d034d4952c666b3c6":"Shougi Saikyou (Japan) (Rev 1) (SGB Enhanced)","dfca8240e0e90f741e8c32a5173ae9fb":"Tip Off (Europe) (Beta 1)","e00f66bff186e969f603a889dfa7e356":"Suzuki Aguri no F-1 Super Driving (Japan) (Beta)","e01b48974b0dcd4b7de479ac4d3d207c":"Tsumego Series 1 - Fujisawa Hideyuki Meiyo Kisei (Japan) (SGB Enhanced)","e01f6fcb9bacca86642744fa4003b349":"Doraemon - Taiketsu HimitsuDougu!! (Japan)","e04adfd64cd859c338c938a1107fbb31":"Bubblemania (World) (v0.7)","e07a8d8ac2a2770ea1a808ac517384cc":"Track & Field (USA, Europe)","e0a81dcc3aa0db3896c6f46e0ed3fc80":"Trip World (Japan) (En)","e0aadd04cf2c955ff60d9446b2b18931":"Parasol Henbee (Japan)","e0b6ff29d6f0fc5b7509b70cb7c0aca5":"Panel Action Bingo (USA)","e0b9dd8e504ec8e44d15b2bd0d8901a6":"Goukaku Boy GOLD - Shikakui Atama o Maruku Suru - Kanji no Tatsujin (Japan) (Imagineer)","e0e45a92aaf878544de84ef4867b8595":"Uoozu (Japan)","e102078685b4ecc91b4e844a922c33bd":"Nihon Daihyou Team France de Ganbare! - J.League Supporter Soccer (Japan) (SGB Enhanced)","e107e33ec2ce9a3f8e6e107f65abb070":"Konami GB Collection Vol.2 (Japan) (SGB Enhanced)","e10f788da29e18934c3e9161b25b96c7":"Gradius - The Interstellar Assault (USA)","e1254f4af3ba70f0937e92f14f04ac91":"Tenjin Kaisen (Japan)","e12c5c2897ed095f8d26c7578afddfda":"Ninja Gaiden Shadow (USA)","e15a6b601c845e425f62ef2b7aed691f":"Crystal Quest (USA)","e1b89445b1e8992d93319c52d4d7ca3b":"Arcade Classics - Super Breakout & Battlezone (USA, Europe) (SGB Enhanced)","e1b8b8158c54df9188d54c4d5331e53d":"Star Trek - 25th Anniversary (USA, Europe)","e1c096f4953421f7fedb767adb675ec7":"Medarot - Parts Collection 2 (Japan) (SGB Enhanced)","e1d28ce25a61b4f623c3c8013ce55b89":"Lucle (Japan, Europe) (En)","e1ea97584e0cf0d0f4187e1c6322da93":"Probotector 2 (Europe) (SGB Enhanced)","e202ee96a60ce347e39fe3f5d9fd65e7":"Legend of Zelda, The - Link's Awakening (USA, Europe) (Rev 1)","e2133fc6f1d81ce8aa1c955c616dd1fe":"Trump Collection GB (Japan)","e220a0c5845b19bfc8c1f03bcef2f822":"Pokemon - Yellow Version - Special Pikachu Edition (USA, Europe) (Beta) (CGB+SGB Enhanced)","e22a670567858f46060c047defa01818":"Goukaku Boy Series - Nihonshi Target 201 (Japan)","e273c01531adf757ce6b3bc6d17afec2":"Foreman for Real (Japan) (En)","e27f25f72e2c4bea5d8cd51592852b08":"Jordan vs Bird - One on One (Japan) (En)","e2c928a942cd827b52499aa9fb148f9a":"Monster Race Okawari (Japan) (SGB Enhanced)","e2e76c7e50d4463f9e628df2933bb79a":"Pac-Panic (Europe) (SGB Enhanced)","e30ffbab1f239f09b226477d84db1368":"Pocket Monsters - Midori (Japan) (SGB Enhanced)","e31c6235113ed686705bf664219e87d9":"Nichibutsu Mahjong - Yoshimoto Gekijou (Japan)","e32f759ca399650f8a35535d0d815c23":"Pocket Bass Fishing (Japan)","e35d24f2a2b72255e0caadcfd131ce08":"Jimmy Connors no Pro Tennis Tour (Japan) (En)","e386e74a32c38938607dd9034e52ba6b":"Kiteretsu Daihyakka - Bouken Ooedo Juraki (Japan)","e39f8e545dadb5a6d77ca1487ae85c8f":"Tokyo Disneyland - Mickey no Cinderella-jou Mystery Tour (Japan) (SGB Enhanced)","e3b7b3649e52ee6aa6fd98baf88d50de":"Pac-In-Time (Europe) (SGB Enhanced)","e3b96773c7d55b3ee4c2615d1b9daca7":"Sengoku Ninja-kun (Japan)","e41aac285898754055eb3f0c3f280ea3":"Pierre le Chef is... Out to Lunch (Europe)","e44398f7ba16480c7cb9196b2fc6f568":"Learn and Play - Blackjack & Solitaire (USA) (Proto)","e46274f5c7a7e2f7816174e32da48fdb":"Card Game (Japan) (En)","e4ba52d3c6d5cd7aad2d3c398c9b7a0e":"Bubble Ghost (Japan) (En)","e4fcc98cf30ab2db7d3c08f322667be1":"Rodland (Europe)","e5124d0719d5429fe71a88db5fbd3b17":"Rockman 8 (Taiwan)","e5190278da9e7675533b2cfdbf5cffc4":"Spiky Harold (World)","e54042d63d3671719b95d311731c02e4":"Legend of the River King GB (USA) (SGB Enhanced)","e5511e9a5f0c709ba25df570eb5be41c":"Game & Watch Gallery (Europe) (SGB Enhanced)","e55ecbd33d5813fe6e9a4ca1d04e9f15":"Cyraid (USA)","e5876720bf10345fb2150db6d68c1cfb":"Jungle Book, The (USA, Europe)","e5936bbbf946f1959059c058318611fa":"Alley (World)","e5b64d0f6d48d325a3235109fc12fb12":"SD Gundam - SD Sengokuden - Kunitori Monogatari (Japan)","e5b790931cdb6308a1939239c707ab24":"14 Juillet (World) (Fr)","e5c07daa704a35dd105604286546d56e":"Death Planet (World)","e5e8910d436acb9fd218559a216501a3":"Wario Land II (USA, Europe) (SGB Enhanced)","e5eba5278bbc6e5f040649afe98a0af4":"Miner 2049er Starring Bounty Bob (USA)","e60b4e21a7357819b7602954ea517ea3":"Shisenshou - Match-Mania (Japan) (En)","e6104df1feb1318ff1764c791eb4ce0e":"Teenage Mutant Ninja Turtles III - Radical Rescue (USA)","e63bba411ca5d496bbb2a33a7ca22155":"Pineapple Kid (World)","e6410ff2286bc1aef2ce0de6fe04804d":"Pang (Europe)","e64c49a5280da30eceabdc3ed3852a88":"Soldam (Japan)","e6980267d58310af5ad57570045a95fa":"BattleCity (Japan) (En)","e6aecb5959f3435df9b4500dc54404f6":"Heisei Tensai Bakabon (Japan)","e6e0b97c6a3b80ab2e0a323e3d21a137":"Genjin Collection (Japan) (SGB Enhanced)","e6e405968face6a00abf3abf8514e9de":"GB Genjin Land - Viva! Chikkun Oukoku (Japan)","e6edabd28a9d6600f8b8e9707baa930e":"Roadster (Japan) (En)","e7305eeee86bd45eb4c9043b75199f62":"NFL Quarterback Club 96 (Japan) (En) (Proto)","e731fa23d9cd0c3d4dec7d5565beef61":"Bart Simpson's Escape from Camp Deadly (USA, Europe)","e76328b0795af8cd85a70e84c1ef4722":"John Madden Football (USA) (Proto 2) (SGB Enhanced)","e764267d68869ae2e7d6fdb37bb76f45":"Pocket Densha (Japan) (SGB Enhanced)","e76fb477ef0e8163e83f9fac15fff7e9":"Sumo Fighter (USA)","e7bcb3f5534c8363f855ba92d83cb2d9":"Baseball (World)","e7c39c38e03d89b5d0f5603f4592a35c":"Art School Pocket (World) (En)","e7c623c0bf954183b6e7eb2ccaef8348":"Thin Ice Rescue, The (World)","e7e0943cb9b8d6dd29c18e6a41e8d346":"Pocket Sonar (Japan)","e821ec4fe25c679efeb9676a129c2130":"Nobunaga no Yabou - Game Boy Ban (Japan)","e83411adccf5266f2deb263e67b68bc1":"Godzilla (USA, Europe)","e83a80a058fa5cfec4a16c1c2f3e0dd3":"Konami Golf (Europe)","e84971b95d5dbb25efaf4ea89564a1a9":"Football International (Europe)","e870bccbc307fb32228fa8e4545edf35":"Zettai Muteki Raijin-Oh (Japan)","e872272d9da777a9561b6e82f8b1d343":"Lion King, The (USA, Europe) (Beta)","e88eab57ab4614966748280bf3c97f52":"Avenging Spirit (USA, Europe)","e8d2a7833fd082f8cc62277d02e84a30":"World Bowling (USA)","e8db5b611f9bb6da2fffd9fc5a880472":"Fastest Lap (Japan) (En)","e90254b52fbb54f563697134efe57c15":"Ishido - The Way of Stones (Japan)","e904ad95019fad36decd3b8bae8b3f09":"Ishido - The Way of Stones (USA)","e928d1f7dfaff38abc7937a6e092cec4":"Magical Taruruuto-kun 2 - Raibaa Zone Panic!! (Japan)","e93f10168e3c9b9d18e3ad4a1415e1d0":"Pokemon - Gelbe Edition - Special Pikachu Edition (Germany) (CGB+SGB Enhanced)","e96273c4d399f1a9de58702aed110b4a":"From TV Animation Slam Dunk - Gakeppuchi no Kesshou League (Japan) (SGB Enhanced)","e9685452a74e7d13fa6ae9996de7138e":"Kitten's Getaway (World) (Es)","e96f49c4201d851574f0cfba1c619f42":"Commodore 16+4 Pack (World) (Demo 2)","e977b90b7b582de86068a6b0e6c5b16c":"Ninja Taro (USA) (Beta 2)","e98c2c5e838713bc68be569c295a14a0":"Otto's Ottifanten - Baby Bruno's Alptraum (Europe) (En,Fr,De,Es) (Beta)","e9ab23a96409060054a05344b536b33c":"WordZap (USA)","e9cee6ad037e8d96c84fb9d752120d4b":"Turn 'Em Off (World)","ea0be44bb573550d7ea0ee91232ebdc8":"Selection II - Ankoku no Fuuin (Japan)","ea48475ec24fd803715169265abf1dfd":"Mick & Mack as the Global Gladiators (USA) (Proto)","ea82922267095a2268d76e4f21d4ff93":"Top Ranking Tennis (Europe)","ea8d9e89565ff9e931118b9ea4712c29":"Franky, Joe & Dirk - On the Tiles (Europe) (En,Fr,De,Es,It,Nl)","eabbef967167719c2afda1d635550096":"Nanonote (Japan) (Rev 1) (Beta)","eb23450a50f1eeff27b33c988f2d779e":"SD Hiryuu no Ken Gaiden (Japan) (SGB Enhanced)","eb2c8695b903c45611c9faa43ca1b2ab":"Retroid (World)","eb41c29d9526e5f24f590d16f7bd33b8":"High Stakes Gambling (USA)","eb43c1df87041d6b82e789a2b46927be":"Uchiiwai - Kyoudaijingi no Puzzle Game (Japan)","eb4c1f70056aac7a767e6eb790b2fa30":"Looney Tunes Series - Daffy Duck (Japan) (En) (SGB Enhanced)","eb57688da8812dee7c813954dee175ce":"Madden 95 (USA, Europe) (SGB Enhanced)","eb771fb255fa207a830df06338af6d87":"Nekketsu Kouha Kunio-kun - Bangai Rantou Hen (Japan)","eb8a2ee6284c53c81329479feaa28a7f":"Mortal Kombat & Mortal Kombat II (Japan) (En)","ebd1866dc6c13ca48f45538ed33ea46f":"Rolan's Curse (USA)","ebdb99bf19c9066be71485c3c9187b82":"Super Chase H.Q. (USA, Europe)","ebe0742b472b3e80a9c6749f06181073":"Pokemon - Versione Blu (Italy) (SGB Enhanced)","ebff9863f1ca3d748977ab79bf8b775e":"Teenage Mutant Hero Turtles III - Radical Rescue (Europe) (Rev 1)","ec4b05b3483b384691886febffdd7a77":"World Cup 98 (USA, Europe) (SGB Enhanced)","ec68e96f47cff2c1a9beae89cdf1c146":"Pokemon - Yellow Version - Special Pikachu Edition (USA, Europe) (Beta) (CGB+SGB Enhanced)","ec8dfc2600756d4ff306eedcd03defd2":"Battletoads-Double Dragon (Europe)","ec8ec90cb60ec839f485208f141293cb":"Super Connard (World) (Fr)","eca9fe803d60ff7f1b8a740a1accc63b":"Star Trek Generations - Beyond the Nexus (USA) (SGB Enhanced)","ed0a8885341ee6a201873b2038c87582":"Simpsons, The - Itchy & Scratchy - Miniature Golf Madness (USA, Europe)","ed236aafb435db5624611939e9581894":"Caihong Zhanshi - Rainbow Prince (Taiwan)","ed2444afe317452e29c1c2258da6963c":"Adventure Island II - Aliens in Paradise (USA, Europe)","ed5525a71dda6eaf4bbf8d5601b6b3b9":"Aladdin (USA) (SGB Enhanced)","ed5b453f823dda545be8fe4db0954934":"G-ZERO (World) (v2.6)","ed7318b615b0a827f3edcff0c817caea":"Skate or Die - Bad 'N Rad (USA)","ed999967209a4cbcaa844b8a84e09ea9":"Serpent (USA)","edfd07c3e47abffaae2441d75110d4a7":"Shin Nihon Pro Wrestling - Toukon Sanjuushi (Japan) (Sample)","ee81c7d7481bb6db26bef691bf9d5645":"Wheel of Fortune (USA)","eecabc069331ce1512cba30442ad2980":"Mysterium (USA) (v1.00AU) (Beta)","eecf87a2c5dbf9f8d2af9976b0f01f4e":"Tokio Senki - Eiyuu Retsuden (Japan)","eed84ed6a1a34809832ac6de11a9ea89":"Action Replay Pro (World)","eee449a4c33f41681d0c44feeb91ac91":"Toxic Crusaders (USA)","eef71c64f1a51f5e32ab4e6e5e2cc5e8":"Tintin in Tibet (Europe) (En,Fr,De,Nl) (SGB Enhanced)","ef2f6c817d762dab848362c4cf7c1c32":"Fastest Lap (USA)","ef6f92c23b5d2be7db647b7d6152ec13":"Trump Boy II (Japan)","ef84a328b1c87d22448accdb713a2329":"America Oudan Ultra Quiz Part 3 - Champion Taikai (Japan)","efa067c7aaed8dd19777443db9228516":"Asterix (USA) (Proto 2)","efaf761d789e9f6e7cddf81b500576d8":"Final Fantasy XI Adventure (World)","efc276516b3ceea0d291b49271b95bcd":"Shuyaku Sentai Irem Fighter (Japan)","efe060ea92c1815417d7fc12005d6afd":"Sea Battle (Europe) (En,Fr,De,Es)","efe8efadcf735ffa0f0bf85f1b1c5f7e":"Zuigao Jimi (Top Secret) (Taiwan) (Multicart Rip)","efee88a2a4d0a7b9f5b886df04422017":"World Ice Hockey (USA) (Proto)","effbaf8c4b83edfebbe6451df0d44fd1":"Soccer (Europe, Australia) (En,Fr,De) (SGB Enhanced)","effe72b5d666de4ba54d3f4d5f89c87b":"Cuthbert in the Cooler (World)","f04f23d228f03311545b1b3bb9b3b73c":"Chessmaster, The (Japan) (En)","f0551f45075ca99a762c292f13e42422":"Mysterium (Japan)","f05959d91b9cb0ccfd8493351db3eccc":"Knight Quest (Japan)","f062ae2eb1223f784d4c81607c1b4adb":"Lost Knight (World) (Proto)","f064bd662fdcb40a9f6926cc3baee116":"Dennis the Menace (USA)","f07094cb4398c3670d1da2f704895b95":"Shougi Saikyou (Japan) (SGB Enhanced)","f07ed24e96f84ce78787709f248263c8":"Flintstones, The (USA, Europe)","f0c0599f8d8a18b1adcbe6e79d8d936a":"Monster Maker - Barcode Saga (Japan)","f0da8b1cff3aab898ecde9dcbda6d817":"Pokemon - Edicion Amarilla - Edicion Especial Pikachu (Spain) (CGB+SGB Enhanced)","f155c9c04ef01a99b26478c1121c8069":"Mega Man III (Europe)","f1724349b22aa4f3a3e6c30d97117040":"4-in-1 Fun Pak (Japan)","f1dbc21b1b8f8dcbe9a15bc9ef68fb9c":"Daffy Duck (Europe)","f213c0040e067cfae27c3fe90143b7c3":"Power Pro GB (Japan) (SGB Enhanced)","f214ebedb198f539230c4738cc644109":"Konamic Golf (Japan) (En)","f246a7acd295b25519cb5ec45df68fbc":"B.C. Kid 2 (Europe) (Beta) (SGB Enhanced)","f24ccb89c3ff60f54600d7b063d5a6c2":"Battle Pingpong (Japan) (En)","f28ade3926852a8ad2e449c274683956":"Mole Mania (USA, Europe) (SGB Enhanced)","f29d7dc8d22c317bb7c17a7bbdc24ec6":"Dragon Ball Z - Gokuu Gekitouden (Japan) (SGB Enhanced)","f2de4c011304bf6edd31e5911e3141ec":"Little Mermaid, The (Spain) (Proto)","f31c556186b91cf161ecf60644fbecba":"Momotarou Dengeki (Japan)","f3580f0bfcc3b39d94eee79820c9946d":"Cosmo Tank (Japan)","f35a1d453fa4287ffc6fc070fd11dc2e":"NFL Quarterback Club '95 (Japan) (En)","f391c76a46776967729b8607b4a3aacb":"Ultima - Ushinawareta Runes 2 (Japan)","f395f7b8ce24e6da365b843adf7d763e":"New Chessmaster, The (USA, Europe)","f3c6246db6dd47701435e0ede493b975":"Pocket Shougi (Japan) (SGB Enhanced)","f4352b697190fccadd9d07657376da5e":"Cosmo Tank (Japan) (Beta)","f44bd95417b6a3d229282b0f5fb9bd53":"Tsumeshougi - Kanki Godan (Japan) (SGB Enhanced)","f45935911e4d033f611cd50ef61d5d40":"Robby's Day Out (World)","f45caca57f16d21ff0fd7aa431fe4b6a":"Velious - Roland no Majuu (Japan)","f46e92b09399dfbf575aa48b8999a188":"Donkey Kong Land 2 (Japan) (Proto) (SGB Enhanced)","f489b8eb7dc88a39842f20a7f7165e5b":"Marble Madness (USA, Europe)","f49fef0c5cc023462d7f84286dc19976":"Frisky Tom (Japan) (SGB Enhanced)","f4c0bf35939be6786c099e9eb4635919":"Kirby's Star Stacker (USA, Europe) (SGB Enhanced)","f4c4fca9e816c1fee2e0d09026a2ea29":"J.League Live 95 (Japan) (SGB Enhanced)","f4e5b89f72cf88c203d8f66c627acd91":"Palamedes (Europe)","f5155252ff84ea0f708154cfe46a31d7":"Marmalade Boy (Japan) (SGB Enhanced)","f5357ab80e3838c58668d9d394962f48":"Deep Forest (World) (v1.1)","f57101bf26e140991a4e2f50a968ce7c":"Othello (Europe)","f597728869d7ca129f507e723d17bca1":"Vegas Stakes (USA, Europe) (SGB Enhanced)","f59dbce4cf5b51a5241806e1b35301fb":"Gremlins 2 - The New Batch (World)","f5d9206e1a5f8b42485e4dd431a5a2d4":"Nemesis (Japan) (En)","f5e132763e20e45f407258d3c6ec0c61":"Super Hunchback (USA)","f6095c118f8bb0ffd353be0a00a30449":"Final Fantasy Legend III (World) (Collection of SaGa)","f60fd654e4998e42b1aa53845a584220":"Konchuu Hakase (Japan) (Rev 1) (SGB Enhanced)","f629f0b6d156bec6acb9e6b9da4ad4e3":"Addams Family, The (USA)","f67d293f77a27de481c7541d6021a659":"Chou Mashin Eiyuu Den Wataru - Mazekko Monster 2 (Japan) (SGB Enhanced)","f683f5e516c1f267d4d16dc0e697f746":"Pac-Panic (Japan) (En) (SGB Enhanced)","f6901ba2ac671a063299da419058f838":"Shark Attack (World)","f6b898bfaa367ac1b0782a363cd098c7":"Pac-Man (USA)","f6c1715b8b93356b8b8ad27f5574dc96":"Beetlejuice (USA)","f6c52e1dc73cffcbcbd9958008f6db06":"Foreman for Real (USA, Europe)","f6ce41f073f04954cd0f14fce720a03c":"4 in 1 (Taiwan) (En,Zh) (4B-003, Sachen-Commin)","f7094136499601a6e45db03d1edb98b8":"Mickey's Ultimate Challenge (USA, Europe) (Beta)","f70c60ca87714fa9d81be60c9ac93de0":"Balloon Kid (USA, Europe)","f711ed10307d4ea27223fe965595b123":"Kirby's Pinball Land (USA, Europe)","f72ba137f679bde064e2e4e644c69b22":"Riddick Bowe Boxing (USA)","f75fde95c0c8e957c9fe76d546e5180a":"Meitantei Conan - Giwaku no Gouka Ressha (Japan) (SGB Enhanced)","f777a4526089a83ca758efbf01007ec1":"Aerostar (USA, Europe)","f7816c22aa5d1467a95e08046d85d534":"Casper (USA) (Beta)","f78e6574ba56879c9333b3aa60278721":"Adventures of Rocky and Bullwinkle and Friends, The (USA)","f7a896711997ea35d4f79f37ac0890bb":"Monopoly (USA)","f7aa9880db8e7884618ff0dcab6fba85":"Battle of Kingdom (Japan)","f7c384e29738c21ef611d45e5d35b4b9":"DMG Deals Damage (World)","f7caa11fcb8be738e1fd584ac8aad215":"F-1 Spirit (Japan)","f7d266bc81c150796ae373bddd0a9a84":"Mickey's Ultimate Challenge (USA, Europe)","f7eba1c53b02624852daea423a71c4ea":"Wishing Sarah (World) (Pt-BR) (v1.1)","f88a0df4f77f415235bf6c83eb39709c":"Koukiatsu Boy (Japan) (SGB Enhanced)","f898ddf750d2c10675a1c3bb1b306e1b":"Pac-In-Time (Japan) (En) (SGB Enhanced)","f89a33de3fa660a13ec29bb323efffa9":"Bionic Commando (USA)","f89f14b54db224ab47ebe8a0d6077a3e":"Don't Call Me Mama But Yes I Am Your Mama (World) (v2.0)","f8adc92b72483f92a40ebe0df7117907":"Soreyuke! Speedy Gonzales (Japan)","f8b0f3889fc7b9936f7e556a3f73825f":"Ranma 1-2 - Kakugeki Mondou!! (Japan)","f8c225bb04abaf8d22fc5d5ee999e35d":"Star Catcher (World)","f8d92a05c7be07964824830e9ce3ff30":"Skate or Die - Tour de Thrash (USA)","f91bd5edf950b0d70ddff98c1aa49f30":"Chibi Maruko-chan 3 - Mezase! Game Taishou no Maki (Japan)","f9302265fcbc4178c84aaeac3138af97":"Wild Snake (USA) (SGB Enhanced)","f9445b104ebb70d8fb91c8c64452c0a4":"Wizards & Warriors X - The Fortress of Fear (USA, Europe)","f97902058640f3700b5acff422969ba3":"GB Basketball (Japan) (En)","f98a6ce8e8065e351693098e906bd32e":"Goukaku Boy Series - Koukou Nyuushi Derujun - Rekishi Nendai Anki Point 240 (Japan)","f9a6af7c1041424cbcbe79822d7dab0c":"DX Bakenou Z (Japan)","f9b37fd741ee5eed62355f11afb52bcb":"Flipull - An Exciting Cube Game (Japan) (En)","f9e94b9a134d900a3b971e206f4e826c":"DragonHeart (USA, Europe)","f9f226d0534e8152b280388e39573e92":"Loopz (World) (Beta)","fa2a6cfad08c5023543da193ade69a0f":"Hiryuu no Ken Gaiden (Japan)","fa2b11931da462c4d34095987c4a0264":"Genesis 2 (World)","fa4af656b09274e5b8139be0a3a39a2c":"Pinball Deluxe (Europe)","fa54481d628d2fc1f5da2fb3c3368c0b":"Goukaku Boy GOLD - Shikakui Atama o Maruku Suru - Joushiki no Sho (Japan) (IE Institute)","fa91adc7023e03f97ec36f66876a569e":"Bust-A-Move 2 - Arcade Edition (USA, Europe)","faacaf378b59452d81c4ef020f87db6d":"FIFA Soccer 96 (USA, Europe) (En,Fr,De,Es) (SGB Enhanced)","fab412c9028db22f8bcd71b6d7fe1997":"Rhythm Land (World)","faecef1fcbb6252afec06504e3393f4e":"Song of Morus - Ghostly Night (World)","fafbf122bf2fe17bcf883a7705c24049":"Swaplatformer (World)","fb0adff5efe92c9d3a26be9313bcc236":"V-Rally - Championship Edition (Europe) (En,Fr,De)","fb62e511419ff8ea89ee1cf558e7208a":"Chessmaster, The (Europe)","fb8540a7262842083991f4aa2a6330d5":"Kyoro-chan Land (Japan)","fbca46f59bd36388b116df8d1fece132":"Namco Gallery Vol.2 (Japan) (SGB Enhanced)","fbd26b166eb8a61c2617b878a22c204f":"Bokujou Monogatari GB (Japan) (SGB Enhanced) (NP)","fc2b347600edffc8e997a7fc75382873":"Navy SEALs (USA, Europe)","fc2d9eb9479543614b6e3d0d63c359aa":"Bomber Boy (Japan) (En)","fc39750f5dec8ad4789e6516dbe8357b":"Blockade (World)","fc84b2e016917d5b0e7de412d9f8c269":"Taito Variety Pack (Japan)","fc89ae96c911ba84a5539bcc180f8f79":"Rock'n! Monster!! (Japan) (SGB Enhanced)","fc9d18538596c136f4cc9fc64d044a76":"Taikyoku Renju (Japan) (En,Ja)","fcc37bc406eef113b046f564a9d2a449":"Super Battletank (Europe)","fcf00a10c3ee34acfec22445a7221daf":"Power Paws (Europe) (Proto 1)","fcfa7b01f96b5546defb6b3c739f4008":"Sa-Ga 3 - Jikuu no Hasha (Japan)","fd01cb80c21da79311461e8da0e97891":"Super Bombliss (Japan) (SGB Enhanced)","fd269fc744ac60b138f8b238e0bb5c34":"Dino Breeder (Japan) (Rev 1) (SGB Enhanced)","fd280448ae0f60bae1d10016a87fc1ed":"Zerd no Densetsu (Japan)","fd6bd52147792817cbddf37c454e8563":"Skate or Die - Bad 'N Rad (Europe)","fd72131f46eaccd71e987489f834c630":"Waifu Clicker (World)","fdab70df67c8941ed7b39a0405161545":"Lion King, The (USA)","fdcfe686cf4df461e870b6e53b2b5a8b":"Pocket Camera (Japan) (Rev 1) (SGB Enhanced)","fdd228f59ee0eb8b162054a330039b0a":"Game de Hakken!! Tamagotchi (Japan) (SGB Enhanced)","fe0ac40641bc533a4a011898c0c15139":"Sports Collection (Japan)","fe68b048f7f77454f73ddef30c16316f":"Turok - Battle of the Bionosaurs (USA, Europe) (En,Fr,De,Es)","fe739c4bfdf652af8d09ed778c429480":"Tsumeshougi - Hyakuban Shoubu (Japan)","fe78f234327f0293c653a1e5846cc777":"Out of Gas (USA) (Beta)","fe877b7ac3f3093144907f4c971fa940":"Uno - Small World (Japan)","fe9c96c1d212d9cbc7c6f25946a87059":"Sanrio Carnival 2 (Japan)","feaa1bbb7e532872cf1d37d80af6fdb4":"Mystical Ninja Starring Goemon (USA) (SGB Enhanced)","febead9c066474ccf390c92d84d7208f":"Legend - Ashita e no Tsubasa (Japan)","fecc3f5a95ccaec78f83892933d8159f":"Mickey Mouse (Europe)","fee2cfb63e4491e395b6f3438c48aca2":"Reservoir Rat (Europe) (En,Fr,De,Es,It)","fef106aa1596fe49144b02a837d7d9eb":"Shanghai (Japan) (HAL Laboratory)","fef3cb8003acb11ff75a2201bb517877":"Pac-In-Time (Europe) (Rev 1) (SGB Enhanced)","ff0033ceecd7562360c5d5d3cae76575":"Missile Command (USA, Europe)","ff22733a091e9d32596fbff8331153c6":"Pocket Battle (Japan)","ff3b9e42aa323ef0045a6000f6010764":"Maus, Die (Europe) (En,Fr,De,Es)","ff3e6d70d42987dd7f6214067dc83afe":"Double Dribble - 5 on 5 (USA)","ff76e39f9ea003242f0adda707c953f7":"Dead Heat Scramble (Japan) (En)","ff8ac71f09453b667856a8539192101f":"Ghostbusters II (USA, Europe) (Beta)","ff9196caa266ae36d409ce7e53ddc77a":"Another Bible (Japan) (SGB Enhanced)","ffa8642a18781fbe79df436a761a9775":"Ms. Pac-Man (USA)","ffb546c576fdbb14c2c62409ff53943d":"Perfect Blend (World) (v0.9)","ffed7cc94e45730f0acd41da998c6820":"Pachio-kun 2 (Japan)"}
\ No newline at end of file
diff --git a/lib/gemba/data/gba_md5.json b/lib/gemba/data/gba_md5.json
new file mode 100644
index 0000000..0decc64
--- /dev/null
+++ b/lib/gemba/data/gba_md5.json
@@ -0,0 +1 @@
+{"0007d212d9b76a466c7ca003d50c8c74":"MX 2002 Featuring Ricky Carmichael (USA, Europe)","000d041c067efea777a6608fb4ec2b7a":"SpongeBob SquarePants - SuperSponge (USA, Europe) (Beta 7)","002dc5540ec997b98c1e8d29d3abfe24":"Final Fantasy IV Advance (Japan) (Rev 1)","003a6851c61cc1981427248d57ba41fe":"Trollz - Hair Affair! (Europe) (En,Fr,Es)","0041789771fab4154eb638b4bcc68641":"Broken Sword - The Shadow of the Templars (Europe) (En,Fr,De,Es,It)","0051c7b9d4a3908afea19da18813fcbc":"American Tail, An - Fievel's Gold Rush (USA) (En,Es)","0053467f8f43c893299c1c18a2e971d9":"Need for Speed - Underground (USA, Europe) (En,Fr,De,It)","005531fef9efbb642095fb8f64645236":"Fire Emblem - The Sacred Stones (USA, Australia)","0079f558708a0cc61d3d38c7134ee199":"Ochaken no Yume Bouken (Japan)","00843bdde7eb18498d7d112d27ad5fad":"Ace Combat Advance (Europe) (En,Fr,De,Es,It) (Beta)","00866e17ce947975d30efe48ad99628b":"2-in-1 Fun Pack - Shrek 2 + Madagascar - Operation Penguin (USA)","00aacdd2f31f592066ac2d8f214ae757":"Rushed Hack Job, A (World) (GBA Jam 2022)","00b3169c025d8000f8944e2e8b81c2b5":"Super Bust-A-Move (USA) (En,Fr,Es)","00bcc2d5347cf3012dd273b43ac39a6f":"Nakayoshi Pet Advance Series 1 - Kawaii Hamster (Japan)","00e44d439cdef2014c67ffced1cb90d7":"Scooby-Doo! - Unmasked (Europe) (Es,It)","00fc773fff582dc53604a7229f64e82f":"bit Generations - Dotstream (Japan) (En)","01356207595154e92efa8b97b6e48acd":"Dead to Rights (Europe) (En,Fr,De,Es,It)","01457d05d4601ceff3f6d27a31606c18":"ZooCube (USA)","01529e7a20314ab1479ab2b91ccfcf49":"Rugrats - Castle Capers (USA, Europe)","016707a7640c82c4258b6c1d8b98fc83":"Mezase! Koushien (Japan)","016fe71584c04d4b8725aafd3cbdac9c":"Bratz - Forever Diamondz (Europe) (En,Fr,Es,It)","01ad547e076252f97adddfce4a21f395":"Luggage Retrieval Officer (World)","01af1ed83c07af653edd6f6a314f1a3a":"X-Men 2 - La Vengeance de Wolverine (France)","01d53ae496ca36129f7a62ccf3ceed83":"Bible Game, The (USA)","01f08a55412611f51ce89a1b90b3af11":"2 Games in 1 - SpongeBob SquarePants - Battle for Bikini Bottom + Nicktoons - Freeze Frame Frenzy (USA)","01fd699b39a0ca8e84226f18cf8baee7":"No Rules - Get Phat (USA, Europe) (En,Fr,De,Es,It,Nl)","020411d3b08f5639eb8cb878283f84bf":"Yu-Gi-Oh! - Ultimate Masters Edition - World Championship Tournament 2006 (Europe) (En,Ja,Fr,De,Es,It)","02092dd27803fa0251728972f919f5d1":"Cronela's Mansion (World) (Demo 1)","022cc7ccc60272a2b773071ad448bba9":"Danny Phantom - Urban Jungle (USA)","023327fe6c7bf7b35334b347d7f9b4d1":"WWF - Road to WrestleMania (USA, Europe)","02472e367d05eca0ed719b865b5d30f4":"J.League Pro Soccer Club o Tsukurou! Advance (Japan)","0260c5c32bec282426882f5c127ed781":"Eyeshield 21 - DevilBats DevilDays (Japan)","0269f1346cfa7942f43039e12ac5f26c":"Stuart Little 2 (France)","026fbee1949b8508f7ef3f9f92cb1f74":"Yu-Gi-Oh! Duel Monsters International 2 (Japan) (En,Ja)","028807ea1e01c6645d38e228f6915a31":"Donald Duck Advance (Europe) (En,Fr,De,Es,It)","02a1d4f4efd3553d9a890cad60ad62c4":"Spider-Man - Battle for New York (Europe) (En,Fr,De,Es,It)","02a9fddd43013966303a043db1c0a479":"Harvest Moon - Friends of Mineral Town (Europe)","02c8b1b57f3de3f9d96c4c917a5a8f28":"Skyland (World) (Proto 1)","02ca69d4ca90bc8da7ca48d59bb0035d":"Spyro - Season of Ice (Europe) (En,Fr,De,Es,It)","02cae6ad10eb30da0f76cbd8ca994952":"Barnyard (Europe) (En,Fr,De,Es,It,Nl)","02cd66823b6666b956e0baeeab7ba161":"Kiwame Mahjong Deluxe - Mirai Senshi 21 (Japan)","02d54c3ed3daf9976f355c16fe8303fc":"Mini Moni. - Onegai Ohoshi-sama! (Japan)","02f233e3ae37bb9a9517291872720a1f":"Agoria - Ode to Fate (World)","02f23bf2f90126574bc0de0752bed485":"Duel Masters - Kaijudo Showdown (USA)","02fd4433f3dacbfd1c921a54909ac365":"Zoids Saga - Fuzors (Japan)","02fe9812bc5022835d55ce2ddfee95d7":"Agent Hugo - Roborumble (Europe) (En,Fr,De,Es,It,Nl,Pt,Sv,No,Da,Fi)","0309e2dda3ec19ee11c2afb0c22ff3ef":"Totally Spies! (USA)","03108469c51b6370782af9d436a67ca2":"Gyakuten Saiban 3 (Japan) (Virtual Console)","031c29c70dc451c121219816cfbbb527":"Mortal Kombat Advance (USA)","03795f6f703d32d889d97548b2ed70aa":"Made in Wario (Japan) (Virtual Console)","039975d2d1c2828a8b19b0ae0e679e3e":"Hudson Best Collection Vol. 5 - Shooting Collection (Japan)","03a47a034c02e457fb6f8412b81ae56c":"Sips (World) (GBA WinterJam 2023)","03aaa67fcb972ec6bce6f1c6863026da":"Hobbit, The - The Prelude to the Lord of the Rings (USA)","03b199db52c1470618faad2cf93eeea0":"Twin Series 3 - Konchuu Monster - Ouja Ketteisen + Super Chinese Labyrinth (Japan)","03beecd053b2ddf56341a6a981c561fc":"Crash Bandicoot 2 - N-Tranced (Europe) (En,Fr,De,Es,It,Nl)","03c4c5409d77c03a5e35a8adaff70158":"Commandos 2 (Japan) (Proto)","03deb68b670ebd258b9d7ef70288a9a2":"Uranus Zero EV (World) (En,Fr) (v1.1)","03e0114f2ed087104a007594d36f70df":"Monsters, Inc. (Europe) (En,Fr,It)","03e4df3b3506eee9173dffd6e5db4fce":"Findet Nemo (Germany) (Beta)","03eea2d57de9c16b5f10055e8e4e2893":"Summon Night - Swordcraft Story 2 (USA)","04105c845973df1d717b2487227f0fb0":"Fantastic 4 (USA)","041cd0228e12f003f9736fdad77cdbf0":"Catwoman (USA, Europe) (En,Fr,De,Es,It,Nl)","041face918f3fffb1548b336b09d9d47":"Super Mario Advance 3 - Yoshi's Island + Mario Brothers (Japan) (Virtual Console)","04244f72a9b8f17ee33e0b5bff2b8b1f":"Ninja Five-O (USA)","04507c08f149756e262017efd3df4bee":"SpongeBob SquarePants - SuperSponge (USA, Europe) (Beta 13)","04524b68642568798af10a69fc199aad":"Turok - Evolution (USA)","04613e49b4e7a8fd022b1fa51e664ae9":"Flashback Legends (France) (Proto)","04615a5e1b6aca1d2934c290cbd12cfa":"Sennen Kazoku (Japan) (Rev 1)","0476e1f73f413b9f5790663817c0082b":"Super Mario Ball (Japan) (Virtual Console)","04775a93461d24cf1a7e3346d244e516":"Advance Wars (USA) (Rev 1)","04786992d22b58a168d6ef2fb0ffb830":"Revenge of the Smurfs, The (Europe) (Beta)","047dffed50e17e1eaab78d69409b19bd":"Godzilla - Domination! (Europe) (En,Fr,De,Es,It)","0482081869f5b084ea0614ddb942cac7":"Shantae 2 - Risky Revolution (USA) (Proto)","04d7e6cd55b91ff493e8529fbcf82266":"Wakeboarding Unleashed Featuring Shaun Murray (Europe)","04da9867ce85b92598695f664bb96c7c":"Apotris (World) (v4.1.0)","05271b3c67aaa0a36fcdf723364a8c46":"Ultimate Card Games (USA, Europe)","0527c2edb2832e8d59baaa4c4fb7b1e7":"Ultimate Spider-Man (Europe) (Fr,De,Es,It)","052c742acf21757dcc5bbc9b75414c82":"Minicraft (World) (v1.2)","053cf73404dcc39be7cbd77c8e833150":"Rockman EXE 6 - Dennoujuu Gregar (Japan)","054223e916f9a4f543812ae795145cb5":"DK - King of Swing (USA)","054d89a31ca79c50638ee14e8d3185a7":"Wing Commander - Prophecy (USA)","055b47930ba47d234d91bdbf63dd974e":"Shin Kisekae Monogatari (Japan)","0599fd3ea49510898691c1b77b42f838":"Wilden Fussball-Kerle, Die - Gefahr im Wilde Kerle Land (Germany)","05ad07333f42c2e6f727ac6e72a1a5bd":"Play-Yan (Japan)","05b2267bdf77e3d36d0b96c22d3af844":"Tak 2 - The Staff of Dreams (USA)","05b82f996a7ebc44c62697b02833a68f":"Wade Hixton's Counter Punch (USA, Europe)","05bf1a8337fb6b000dc2b875e1da07c9":"Capcom Classics Mini Mix (USA)","05c54425438b4e1fb9944f380df39b4e":"Games Explosion! (USA)","05d2d50f8aac9d4d6e1889432e197167":"Shrek - Reekin' Havoc (USA) (En,Fr,De,Es,It,Nl)","05da8d783575896e54f15104f1e87035":"Kim Possible 2 - Drakken's Demise (Europe) (En,Fr,De,Es)","0632f298b6484b923c5e01d231ae4aa9":"King of Fighters EX, The - NeoBlood (Europe)","0635251b85657f9c1de295546da09aeb":"Densetsu no Stafy 2 (Japan)","0635910eceb7b59722a49c9d7d12bbc2":"Duel Masters 3 (Japan)","063f1a5c5dc09ce899c983db8cc28c01":"Super Bust-A-Move (Europe) (En,Fr,De,Es,It)","0644bdce94af8ec7e33f0aee1830b497":"Battle Network - Rockman EXE 3 (Japan) (Rev 1) (Virtual Console)","064b4a2a29134a638f4d38f3c3fd4b98":"Naruto RPG - Uketsugareshi Hi no Ishi (Japan) (Rev 1)","064db81169e3cb761c5702260039ae28":"Yaobai Senxigang (China) (Proto)","065b12ab5b43e941fa0011a5483a47df":"Secret Agent Barbie - Royal Jewels Mission (Europe) (En,Fr,De,Es,It)","0681007c0e1dafb25c4179b6b90e47df":"Rockman EXE 5 - Team of Blues (Japan) (Virtual Console)","0687fdac8b7fbc2d5147ec9f5f4d2525":"Ecks vs. Sever II - Ballistic (Europe) (En,Fr,De,Es,It)","068b542444b3ad28e75be4087a754b58":"Avatar - The Last Airbender - The Burning Earth (USA)","06a6d7cd07281747cfe0300700a960fd":"Batman - Vengeance (USA) (En,Fr,Es)","06ae9bc5a49c1f5edac5f5dbdd30882d":"ATV - Quad Power Racing (Europe) (En,Fr,De,Es,It) (Rev 1)","06bffd302bb341ef623d4cd53c4418c4":"Army Men - Sarge's Heroes (USA, Europe) (Proto 6)","06d6a0c54470197ffc3d0bde2dda591e":"Medarot Navi - Kabuto (Japan) (Virtual Console)","06de64363cfc09ab7e5bdf4b03bbf6ac":"King Kong - The Official Game of the Movie (Europe) (En,Fr,De,Es,It,Nl)","06ed08799b2f163076fe9fc0cfe65a4c":"Densetsu no Stafy (Japan)","06f7ff2db5abcbd59e4f4816b1890dd9":"Punch King - Arcade Boxing (Europe) (En,Fr,Es)","072f378e3ae2d271f384b886be067031":"Racing Gears Advance (Europe) (En,Fr,De,Es,It)","07397d508982f2c340c296d2c057db8a":"Texas Hold 'em Poker (USA)","0772dfd199bb5039a5d0cc5015d4af1d":"bit Generations - Digidrive (Japan) (En)","07826e89f368fdcfe22590d578b63b4b":"Peter Pan - The Motion Picture Event (Europe) (En,Fr,De,Es,It)","07930e72d4824bd63827a1a823cc8829":"Metroid - Zero Mission (Europe) (En,Fr,De,Es,It)","079f35bf49c4c64aca46ac5b82c358e6":"Family Feud (USA)","07acb26f244e6d36374607071369238d":"COVID Adventure (World) (GBA Jam 2021)","07c67caee98287f303193d837ebdb702":"Hajime no Ippo - The Fighting! (Japan)","07f3b7415eb3779ff11e51a38d0ad3f8":"Nicktoons - Battle for Volcano Island (USA)","080c58f12416fdf0d8b38ec61a976ca6":"Rockman & Forte (Japan) (Virtual Console)","081eb069af9e5cdc0cb7515a7249ba52":"Island Xtreme Stunts (USA, Europe) (En,Fr,De,Es,It,Nl,Sv,Da)","0821eea9bf87804ec1d700ec458a04e5":"Urbz, The - Sims in the City (USA, Europe) (En,Fr,De,Es,It,Nl)","086490833184ca1c3f7db723c0a23995":"Hugo - The Evil Mirror (Europe) (En,Fr,De,Es,It,Nl,Pt,Sv,No,Da,Fi,Pl)","086699e25cfba633d8ffb16644d79e4d":"Matantei Loki Ragnarok - Gensou no Labyrinth (Japan) (Rev 1)","0870d28ecfd2761a2712e9185e094420":"Inky and the Alien Aquarium (World) (Demo 2)","087a7620a5c7b7f69e09fd3b97a68c2f":"Spy Kids 3-D - Game Over (USA)","0886eee57b5f9e97d2981a00134fd641":"Ed, Edd n Eddy - The Mis-Edventures (USA) (En,Fr)","08934127e26fa137f2f03d3cce3953e7":"Konjiki no Gashbell!! - Unare! Yuujou no Zakeru 2 (Japan) (Rev 1)","08a002ca5de6e28726c3d17644137b23":"Medabots AX - Rokusho Ver. (USA)","08a64ac42e0ac926269fd2c469f7c074":"Jonny Moseley Mad Trix (USA) (En,Fr,De,Es,It)","08aecb6882d9a73b2cac1316a5fbf31b":"Tetris Worlds (Europe) (En,Es,It)","08c41541eb69a1d652937ed3f88824be":"Mario Pinball Land (USA, Australia)","08d2fe71572e3537f2e7d7c08dab5707":"Extreme Skate Adventure (USA, Europe)","08d5c8e67cf1cdba2e55452c2e2414c1":"Game Boy Wars Advance 1+2 (Japan)","08eaf353e753e922e8bf05fcc9a87ac0":"Keitai Denjuu Telefang 2 - Speed (Japan)","08f6bb1a700cbf57c10872fa84354562":"Holy Hell (World) (Proto) (NEO Coding Compo 2012)","0915ac62d58a160028eb47141657013f":"F-Zero for Game Boy Advance (Japan)","091ea9b529fcc8e05b87091e21f749c4":"Super Dodge Ball Advance (USA) (Rev 1)","092721060c0261c13de6ade3e8c87854":"Lost Vikings, The (Europe) (En,Fr,De,Es)","092dbb8125cfbc93d55342f25277b08f":"World Tennis Stars (Europe)","09306558743c945883527d6c75faeda8":"GT Championship (Europe)","09467407b4d5e62508405f6ec518e6dd":"Meine Tierarztpraxis (Germany) (En,De)","0950578bcd454402624fa3a78a7ca76e":"Zoids - Legacy (USA) (Beta 11)","0966c86597b2644a5e7c66ec59e9edb8":"Mario Pinball Land (USA) (Virtual Console)","09698b7f688a00a7ac4a67a225c2181f":"Radicorn (World) (Proto)","098752d6f195ab8c34e0eebad3a0a779":"Fantastic 4 - Flame On (USA)","098ae1d09c30569e6059952e577dfbf8":"Mummy, The (Europe) (En,Fr,De,Es,It)","09963ea87f2efed0f73883e68def20f6":"Peter Pan - Return to Neverland (USA) (Rev 1)","09a4004a580a8fe679d227ce3cc70d8e":"Moorhuhn Jagd (Europe) (Proto)","09bc6ab258b83508be5e9a0eb11417d4":"Kim Possible (Europe) (En,Fr,De,Es) (Rev 1)","09bdbc2b8190566335b4c27cd20c8b8e":"Pyuu to Fuku! Jaguar - Byoo to Deru! Megane-kun (Japan)","09c14005c7e4914a54ca9f5cf7514992":"Broken Circle (World) (En,It)","09daae27c8d72f04ac2ea12d8a9cc89d":"Crushed Baseball (USA)","09daf6531ded19b7921367084e439b2f":"Final Fantasy VI Advance (Japan)","09e8523914aff2d72b1b4b840827829c":"Scooby-Doo and the Cyber Chase (Europe) (En,Fr,De)","09f49996195a3fce6141306f9eeb2944":"Dragon Ball Z - Supersonic Warriors (USA)","09fb223b7d964fe31b097574d54c3dd4":"Game Boy Wars Advance 1+2 (Japan) (Virtual Console)","0a05b2762f053783d9e1d20ed10a6b4a":"Cardcaptor Sakura - Sakura Card Hen - Sakura to Card to Otomodachi (Japan)","0a0f0c3f73ca585c19f516c7e45fda74":"Gambler Densetsu Tetsuya - Yomigaeru Densetsu (Japan)","0a17a5e983e3ae92e31d4661318271d6":"Wizardry Summoner (Japan) (Rev 1)","0a2726e1c0ecb255b88ca3085afc7891":"Double Game! - Cartoon Network Block Party & Cartoon Network Speedway (Europe)","0a3523db5fe9a0329d766d9d1ff5e654":"Gensou Suikoden - Card Stories (Japan)","0a4b60e0f15350b991624763526a85d1":"Mutsu - Water Looper Mutsu (Japan)","0a4da0bbdad29f2faa5584b49b0a4f5d":"Road Rash - Jailbreak (USA)","0a4f344622606fb7e6470c169cf934f6":"Rockman EXE 5 - Team of Blues (Japan)","0a6666fe761d4ee8421500c24abb7b20":"Zoids - Legacy (USA) (Beta 10)","0a7c58069d5390165482e88a22158bd2":"Yu-Gi-Oh! - The Sacred Cards (USA)","0a9938a6bb7b657a1fb2588b91900122":"Crazy Chase (Europe) (En,Fr,De)","0a9e96e8273142fc5ed60511a726a14f":"Hugo - Bukkazoom! (Europe) (En,Fr,De,Es,It,Nl,Pt,Sv,No,Da,Fi,Pl)","0ab0992240121f5e8f9a5d75aab79a15":"3 Games in One! - Yars' Revenge + Asteroids + Pong (Europe) (En,Fr,De,Es,It)","0ab2602d06da0ee5d87ac319495a78f2":"Cardcaptor Sakura - Sakura Card de Mini Game (Japan)","0acbc949fc02ec0abd9e1825c03b8973":"Mario Party Advance (Europe) (En,Fr,De,Es,It)","0ae1a89caba4997b5059eaf8f8763727":"2 Games in 1 - Alla Ricerca di Nemo + Gli Incredibili - Una 'Normale' Famiglia di Supereroi (Italy) (Es,It+It)","0af58674e0fef09ca529a0a27aecf17a":"Shrek - Hassle at the Castle (Europe) (En,Fr,De,Es,It,Nl)","0af8fb79e9986400fd05dacf0a4373e8":"2-in-1 Fun Pack - Shrek 2 + Madagascar (Europe)","0b061059fd5e7f7b034f96932c86829c":"Zelda no Densetsu - Fushigi no Boushi (Japan)","0b1290911e143ce7ce4f39472ac8b5ab":"Unfabulous (USA) (Beta 11)","0b2772662e6df22bd3e5dbb84d9d9e55":"All-Star Baseball 2003 (USA)","0b2ec6ac765cd16c2d080d02c7d51d54":"Zoids - Legacy (USA) (Beta 7)","0b4c94edc68ff0f0a18e09e5b11ed0df":"Mucha Lucha! - Mascaritas of the Lost Code (USA) (En,Fr,Es)","0b57d3560459bd31c60667ad64843343":"Battle Network - Rockman EXE 3 - Black (Japan) (Promo)","0b8e817c956bf56035c3a5c73174f81b":"Digimon Racing (USA) (En,Fr,De,Es,It)","0b95fb20b9f487eb64431e9db9f75c7f":"River City Ransom EX (USA)","0bb34790a91d40f7afc437c528102496":"SEGA Arcade Gallery (USA)","0be6c13af62a0f75651bb2acbc397a56":"SpongeBob SquarePants - Revenge of the Flying Dutchman (USA, Europe)","0bf5df84c040f7bd352bb87a352ee6b0":"F-Zero - GP Legend (USA) (Proto 5) (Netcard)","0c112fda9346a9851fa7cb72d80be501":"World Poker Tour (USA)","0c1605d8447bf69a74dbd715d5fbe70f":"Tetris Worlds (Japan)","0c1a0844349b59fca1de85b1992abdf5":"Megaman - Battle Network 6 - Cybeast Falzar (Europe) (Virtual Console)","0c3521dc74150b501aba964d4c2a0fc3":"Aggressive Inline (Europe) (En,Fr,De)","0c3d24b790a8212c779c85de3cde98a5":"Kirby & The Amazing Mirror (Europe) (En,Fr,De,Es,It) (Virtual Console)","0c3fe57084bbae258eac8830c90a0334":"Lea - Passion Veterinaire (France) (En,Fr)","0c4fd4cf211b2b712fd090ef1b95adfd":"Tetris Worlds (USA)","0c508e4785e89f25f5a746cba838ed4b":"Frogger's Adventures 2 - The Lost Wand (USA) (En,Es)","0c53ef6b66b0f6912a524659c3a068c6":"Boukyaku no Senritsu (Japan)","0c5d34497c80ce931a91238c54c7e668":"Super Dropzone - Intergalactic Rescue Mission (Europe)","0c8060d8231b01fb2b6670a5e059122d":"Sonic Pinball Party (Japan) (En,Ja,Fr,De,Es,It)","0cadd0fd31e704d01503d303b5da8341":"Land Before Time, The - Into the Mysterious Beyond (Europe) (En,Fr,De,Es,It,Nl,Pt,Da)","0cb9989beb289f843cdb69bb0bd8c8be":"Shining Soul (Japan)","0cb99d064f970b580a8f0c1b87bd643b":"Spyro Orange - The Cortex Conspiracy (USA) (Rev 1)","0cc444d5fddbd08af0663e9fb8694780":"Kappa no Kai-kata - Kaatan Daibouken! (Japan)","0cc6758258b584e51046b00139c50e60":"Bomberman Max 2 - Red Advance (USA)","0cd601f13be95043eb1bc10e3675f25a":"Need for Speed - Most Wanted (USA, Europe) (En,Fr,De,It)","0cf8afe8006793c1c96ade67e872ce84":"Advance Wars (USA) (Virtual Console)","0d1e88bdb09ff68adf9877a121325f9c":"Megaman Zero 4 (USA)","0d221d3ad421c62da3fe6af1ecd67381":"Megaman Zero 4 (Europe) (Virtual Console)","0d2a4b08c87137212ef39a4c7e9d44cc":"Polly Pocket! - Super Splash Island (USA) (DSI)","0d5f0320a5921f1fa6c74dd86234d305":"Monster Maker 4 - Flash Card (Japan)","0d6241bf502d0cef1ca57870a1024e72":"Lord of the Rings, The - The Fellowship of the Ring (Europe) (En,Fr,De,Es,It)","0d750defe01da931beb8148a71be112e":"2 Games in 1 - Cartoon Network Block Party + Cartoon Network Speedway (USA)","0d8f24fa168197a151eeb95fd29aef65":"World Championship Poker (USA)","0da2f962ed7fbca94e4ce57c643425c1":"uCity Advance (World)","0da9790131eb40950b8cea5e84f38953":"Demon Driver - Time to Burn Rubber! (Europe)","0dbc85a954aba764a3bbae2e078d26f0":"Shin chan - Aventuras en Cineland (Spain)","0dc8a17af87706f54db5b78f02c5ad12":"Miteluode Ronghe (China)","0e24f5e435b0cf651017103de24f4f92":"Astro Boy - Tetsuwan Atom - Atom Heart no Himitsu (Japan)","0e2e6304b6f04d7b878f05c22f6b5ab1":"Animaniacs - Hollywood Hypnotics (Europe) (En,Fr,De,Es,It) (Proto)","0e3ed3a6cc2f201897c58cb31d43a35f":"Rockman EXE 6 - Dennoujuu Falzar (Japan)","0e4ba41493f33cf33f6f29541ed82b9a":"Army Men - Sarge's Heroes (USA, Europe) (Proto 1)","0e66f9dc9c29a3a11f2a821bcc809251":"WWE - Road to WrestleMania X8 (USA, Europe)","0e7e7ed17b4e8e4d09e166d3bd923b40":"Namco Museum (Europe)","0e86c0c284f2ce03ed28359a765a66ce":"LEGO Bionicle (USA) (En,Fr)","0e9df95d854d56a7bed63b79bab40bc1":"Cars (Europe) (Es,Pt)","0ea86808a1e0201968357e8b9bf282e8":"Tweety no Hearty Party (Japan)","0eadc5200158c854c27a5bf463a1d033":"S World 3 (World) (Beta 4)","0eb87d04c5be8ab25e8f2cf211650683":"Samsara Naga 1x2 (Japan) (Rev 2)","0eb8e248dac5b8f9730d818617ed54f4":"3 Games in 1 - Rugrats - I Gotta Go Party + SpongeBob SquarePants - SuperSponge + Tak and the Power of Juju (Europe) (En+En+En,Fr,De)","0ec6477593e4c9273b91676e464488f6":"EZ-Talk - Shokyuu Hen 5 (Japan)","0f0382627e439cf2f308986e3e921a28":"Hoshi no Kirby - Kagami no Daimeikyuu (Japan) (Rev 1) (Virtual Console)","0f424c61285bfee9a940bc9aa47c61bf":"Discrete Orange (World) (Demo 1) (GBA Jam 2024)","0f6fd5c281dc18e32045e79306587170":"Unfabulous (USA) (Beta 3)","0f796b33898e0f7c3b001136e6a1c28b":"Pocky & Rocky with Becky (USA)","0f7f9dc0c967029f8686ece3b9385c71":"Over the Hedge (Europe)","0f82bb24585c9ec64e99394c9d316315":"Rockman EXE 4.5 - Real Operation (Japan)","0f8ed17d661f50fd1c09d07e54f88f31":"Google Dino Advance (World) (v1.0.1)","0fd6897002244985cab200501e1b48c9":"Dragon Ball Z - Taiketsu (Europe) (En,Fr,De,Es,It)","0ffa05e57cfeeca8807b62578fd80fb1":"Open Season (Europe) (En,Fr,Es,Nl)","100579ef01225c620560f88e65ca423a":"Sonic Battle (USA) (En,Ja,Fr,De,Es,It)","101b2628c6eabbb3caa36a5dd9a309e5":"International Superstar Soccer Advance (Europe)","101c1c8ed0ca51da145b101c8a42b0eb":"Galidor - Defenders of the Outer Dimension (USA) (En,Fr,De,Es,It,Nl,Sv,Da)","10242132aa289781c1857954e832c0be":"Anguna - Warriors of Virtue (World) (Demo 1)","102ca19e193b7727645c3ba2302dcf22":"Codename Hacker (World) (En,Fr)","1040f372f0d2ed64f01e582dffa6d89b":"Tiger Woods PGA Tour Golf (USA, Europe)","105c79c9b8c04f2807a0ef1c1aaebf6a":"Wer Wird Millionaer (Germany)","1070a9c7392722b1224f6da39096598e":"Madagascar (Japan)","10860572e5479bbaa1e790d1fa027207":"Darius R (Japan) (En)","10974dab2afea1b3d981568451fe60da":"Super Ghouls'n Ghosts (USA) (Virtual Console)","109b5dab2c9472d26e9b68cabfac0d4f":"Crouching Tiger, Hidden Dragon (USA) (En,Fr,Es)","109bcd4625fe28c0424ed0d1300b7933":"2004Mbit Competition (World)","10aad86c227ca97ae5c66117c6452ca0":"Happy Dawn (World) (Demo 1) (GBA Jam 2024)","10d14cbd9d43d2c4d59da9a7ee64ba95":"Care Bears - The Care Quest (USA) (En,Fr,Es)","10e33fd51bac0b0c3523eddbcd0eaf56":"Sangokushi (Japan)","10e47426da21bd7ba064a388c8498fdb":"Hot Potato! (Europe)","10e701d275bb9b34b4c451bf8a611495":"Crash Bandicoot Bakusou! Nitro Cart (Japan)","10ea584b14960348548e8528202968f1":"Famicom Mini 16 - Dig Dug (Japan)","10eaeb09b2a583574fd0c7f416c68f82":"Nicktoons Racing (Europe) (En,Fr,De,Es,It)","10ebb8e13d6639e9425d172888389fa0":"Sabrina the Teenage Witch - Potion Commotion (Europe) (En,Fr,De,Es,It,Nl)","11100f0c82de617894a90b0fa70b7e63":"Wild Thornberrys, The - Chimp Chase (USA, Europe)","111715b064a0de33d49034937dbc48d8":"Tony Hawk's Pro Skater 2 (Germany)","11289eeb3326a826cda771cee60b6b7f":"Freekstyle (USA)","113022c562fbd4eb723341b4b05cc7ec":"Twin Series 5 - Mahou no Kuni no Cake-ya-san Monogatari + Wanwan Meitantei EX (Japan)","116db73b6b497253e887e4ee46b4fe3c":"Koala Brothers - Outback Adventures (Europe) (En,Fr,De,Es,It,Nl,Pt,Da)","1176113fe66cf20d5d00def9fbda8c20":"Bratz - Rock Angelz (Germany)","1191848184916ade8df270fa27d2555f":"Pokemon - Versione Rubino (Italy) (Rev 1)","11a1c991749ededfce2cef42e1019cc7":"Hagane no Renkinjutsushi - Meisou no Rondo (Japan)","11beb7fd8ce6c8a3d4987274835e0843":"Ultimate Spider-Man (USA)","11bfeb390128b3fa4af1e92399a9bd3f":"Barbie in the 12 Dancing Princesses (Europe) (En,Fr,De,Es,It)","11c77b84b23817cda21c24bc7ddd2605":"Masters of the Universe - He-Man - Power of Grayskull (USA)","11cb293eb98b1d7bab027cda8777c98e":"Ice Age 2 - The Meltdown (USA)","11e59f830fec5702011173cac6c9c7d9":"Madagascar (Europe)","11fd08b9d7b232deef2519e951c65859":"2 Games in 1 - Disney Principesse + Koda, Fratello Orso (Italy) (It+En,Fr,De,Es,It,Nl,Sv,Da)","1205d76449958f1d204f380499c7cfff":"Snood 2 - On Vacation (Europe) (En,Fr,De,Es,It)","1207a415c9acfbd206e5580f34e73ba2":"Foster's Home for Imaginary Friends (USA)","120cf0c4d430cf9de20071a249db62f4":"Zero One (Japan)","120fe8f60008ed371a40843dfad39cf6":"Zoids - Legacy (USA) (Beta 4)","121fd8e5e64ff91db0e14ea991de4625":"David Beckham Soccer (Europe) (En,Fr,De,Es,It)","1227eebff87a8b9d5e713e20cddcb468":"Gradius Advance (Europe)","122ec4309cb7aa7a13f880de1ec3e703":"2 Games in One! - Paperboy + Rampage (USA)","123978146274e2c7711209aba22ee244":"Over the Hedge (USA)","125cdf912a55210d086d73bbd4b40f5b":"Mother 3 (Japan) (Virtual Console)","1266f7f9d73252d70b25ebfe966c9a2b":"King of Fighters EX, The - NeoBlood (USA)","128f71aa30e3435283df66b77a361672":"Power Pro Kun Pocket 6 (Japan)","12b7a60b8faba2b44b1fdf1396578037":"Fairly OddParents!, The - Shadow Showdown (Europe)","12bfe2b37eb53eec924ca2a697fc9924":"Madagascar (Netherlands)","12d9fcae83c5295aac6da015b75a24d6":"3 Game Pack! - Candy Land + Chutes and Ladders + Original Memory Game (USA)","12e67891bd86b4b417b7462d7ee891ef":"From TV Animation One Piece - Nanatsu-jima no Daihihou (Japan)","12ea1887210dfa6164d7cbeae7573a48":"Final Fantasy I & II - Dawn of Souls (Europe) (En,Fr,De,Es,It)","12f06df6ff6d6895dc87665fc4c79144":"Tom and Jerry - The Magic Ring (Europe) (En,Fr,De,Es,It)","1319babf77cdb73c904364bf354f7595":"Choro Q Advance (Japan) (Rev 1)","13282333ff803c7c525e5512019fbb51":"Nakayoshi Pet Advance Series 2 - Kawaii Koinu (Japan)","132ac906d53969643a2a117425a7bcb5":"Donkey Kong Country 3 (USA) (Beta)","13682a498effaef25aaaad9ac02cb4c0":"FIFA Soccer 06 (USA, Europe) (En,Fr,De,Es,It,Nl)","136d8ce4db69b232133585f3bac449be":"Action Replay GBX (Europe)","138a71a5be83f3f3d7af3d31916a5fc7":"Pocket Monsters - LeafGreen (Japan)","138f9df1c5d9c7cb0b28760f92a4698e":"Nakayoshi Pet Advance Series 4 - Kawaii Koinu Mini - Wanko to Asobou!! Kogata-ken (Japan)","139b7e51d2f49dffeede13e464bafeea":"SimCity 2000 (USA)","13fd90ae7070ba25c2ce4223b8f51a1e":"Baldur's Gate - Dark Alliance (USA)","14371b084ed7caa4b8e533d111254310":"MAER Heaven - Knockin' on Heaven's Door (Japan)","1441e4d82330fb286a7e1702b68992cf":"BoulderCrash GBA (World)","1455d99497a4d004aa0edc0e50bd2530":"Screw Breaker - Goushin DoriRureRo (Japan)","146ae198a3d42a66733b9e0ef3ec11eb":"Castlevania - Akatsuki no Minuet (Japan)","147ea6fe88f1e2bb50b51e19f5f54cb9":"Simple 2960 Tomodachi Series Vol. 2 - The Block Kuzushi (Japan)","1489b4d9defff4a8a993fa6017367c8f":"Kunio-kun Nekketsu Collection 1 (Japan)","148c4190c830886bece41eb380ea3533":"Teen Titans (USA) (En,Fr)","14a31a749989b4e99c3a9ed9dac8a85f":"Famicom Mini 21 - Super Mario Bros. 2 (Japan)","14bc45c78e1d2325654c0cdac25873bb":"Zoids Saga II (Japan) (Rev 1) (Proto)","14c864da7a500ffc5ccc7139fb7ef053":"Majokko Cream-chan no Gokko Series 2 - Kisekae Angel (Japan)","14d8dddf41901b02db25a04ab587664b":"Rayman 3 (Europe) (En,Fr,De,Es,It,Nl,Sv,No,Da,Fi)","14dab12e795098988d46b96885170538":"Drill Dozer (USA)","14eb992bd01c4b6b3542ebd30d942726":"Super Mario Advance (USA, Europe) (Virtual Console)","14f0f598534646ee02b48845bfb0b21e":"Tremblay Island (World) (En) (v1.1)","1529f4677cba3e47f4be897f02b71044":"Disney Sports - Snowboarding (USA)","153dfb9b03fd758d737b8671b743ce4a":"Super Street Fighter II Turbo - Revival (USA) (Virtual Console)","155753526498f1a93b7a2850368da3e4":"Robots (Japan)","157cec6ff0d7360e856b8e09508ec2e5":"Rockman EXE 4 - Tournament Blue Moon (Japan) (Rev 1) (Virtual Console)","158c0792eb9b050dc8da7ab58ed2df95":"Jissen Pachi-Slot Hisshouhou! - Juuou Advance (Japan)","1596c3f8af92805541bc92e656b29dd5":"Paws & Claws - Pet Vet (USA)","1597d0bff45a3722beae045d218d6649":"Classic NES Series - Pac-Man (USA, Europe)","15a038b656bce4a0d293ad1b47737f9f":"Sword of Mana (Europe)","15b3055351b71b4ae9f17431d1e8707a":"Tyrian 2000 (USA) (Proto)","15b8647b2a4e1d62f779703a0a50154a":"Battle Network - Rockman EXE 3 (Japan) (Rev 1)","15c95e0d6067d9f60b4baba4c6ffd02c":"Shaun Palmer's Pro Snowboarder (Germany)","15db64521ee01c3f0428fdb9798577c5":"2 Games in 1 - Bionicle + Knights' Kingdom (Europe) (En,Fr,De,Da+En,De)","15dbde22ef467c503e09f75b233da539":"Yu-Gi-Oh! - Worldwide Edition - Stairway to the Destined Duel (Europe) (En,Ja,Fr,De,Es,It)","15de8e3ed041332e0529c0b884d42d42":"Breath of Fire - Ryuu no Senshi (Japan)","15e002514b589a1cfe18805ba504361f":"J.League Pocket (Japan) (Rev 1)","15e37fb594c2dfe85b8b7ba3b7e565bd":"Crash Bandicoot Fusion (Europe) (En,Fr,De,Es,It)","15e493a90d9b8cc7935f01abd57393b2":"Grim Adventures of Billy & Mandy, The (USA)","15fb7bb864e9876537890af774b43dbf":"Legend of Spyro, The - A New Beginning (USA)","160c89d655b1db397e419a9614144a7a":"Mazes of Fate (USA) (En,Fr,De,Es,It)","161acf52bfedb16060dc24183db56d23":"Kawa no Nushi Tsuri 5 - Fushigi no Mori kara (Japan)","1625473f5bc984de7590193576cd3b77":"Trogdor! (World) (v3.1)","164aed5ee87071fd14e908bf65f7a6e3":"Who Wants to Be a Millionaire (Australia)","164b2a21afa59d6dedad07117296c8e7":"TMNT - Teenage Mutant Ninja Turtles (Europe) (En,Fr,De,Es,It)","164e42954fe047552701ff62836642ae":"Silent Scope (USA) (En,Fr,De,Es,It)","1690c80a29f8096d50422e38517674dc":"Minna no Soft Series - Minna no Shougi (Japan) (Rev 1)","16ae239c819d0a772307e3193d593860":"Frogger's Journey - The Forgotten Relic (USA)","16b5f1c6f8567cbe42f7562fccbb6426":"Riviera - The Promised Land (USA)","16bf8504460b72db612adc0e17831221":"Killer 3D Pool (USA)","16d337bbd90230ae5eed4cc1f5d72fd9":"Mario Pinball Land (USA) (Kiosk, GameCube)","16d70ac9d2798623ed1114e3184b5be6":"Shuma Guaishou - Hongbaoshi Ban (Taiwan)","16e66d48b063671e1d6a3db5ff0950bc":"Eragon (USA)","16f99099d8674858400004a0052f31ba":"Shamu's Deep Sea Adventures (Europe)","171e7bdf6b194cc9ae301f5424714a1a":"Desert Strike Advance (USA)","172f722a84bd79496059745e3a148f7d":"Disney Sports - Motocross (Japan)","1739ddafb47c12da4709e9529c103d68":"3 Games in One! - Super Breakout + Millipede + Lunar Lander (USA)","1739ff2b55b034c58aa1618a2e49d4e8":"Disney Sports - Skateboarding (Japan)","175ffe1ee242cac0316a9882a240d794":"Backyard Sports - Basketball 2007 (USA)","176da8ac357508b17baa922352a30568":"Hot Potato! (USA)","177cbecf21922a3d5f19d160816c31c2":"Starsky & Hutch (USA) (Beta)","178627a0a81f7e79f3549c4ef122e7d5":"3 Games in One - Darts + Roll-a-Ball + Shuffle Bowl (Europe)","1793a537f75831900b1131b8bcaba63d":"Zoids Saga (Japan) (Rev 1)","179ebcf3fa5934d89bdad8f970a391c9":"Mario Party Advance (USA) (Virtual Console)","17a32cfa3d0a5c74f914281ef55c75cd":"Breath of Fire (USA)","17a986af456ed994f556f23c330666a8":"Shining Force - Resurrection of the Dark Dragon (Europe) (En,Fr,De,Es,It)","17dd0e3e76207e30614768482078cc3f":"SpongeBob SquarePants Movie, The (USA) (Beta 2)","17ece80a2d8609e513776e67ef0ecb15":"NBA Jam 2002 (USA, Europe)","17fa3b069564dd1dfc01ec579fccf0ad":"2 Games in 1 - Monstruos, S.A. + Buscando a Nemo (Spain) (En,Es,Nl+Es,It)","17fccf4edeed5cfe2c2814b2c6fa1a19":"Tremblay Island (World)","17ff0b3af041f31b6c6924726c2642b8":"Megaman - Battle Network 5 - Team Colonel (Europe)","180a4c25cb809435f85f7fb81bc2495f":"Razor Freestyle Scooter (USA)","181d31b59e0b1c5402c145afedcad316":"Army Men - Sarge's Heroes (USA, Europe) (Proto 7)","182363b0698322e1864ced6e9eed7ead":"Megaman Zero 2 (USA)","18317fa6e27ea0ea7509f1319bc0865c":"Dokapon - Monster Hunter! (Europe) (En,Fr,De)","18441e53efd724563581600a0f253879":"Hello Kitty - Happy Party Pals (USA)","1851c34d41025d541b6ad76b9146cc6b":"Catz (USA, Europe)","185ea59c28f2d64063865ac94744635d":"Hardcore Pool (France)","1879cb045c1de7e5c3405fcc06f59e11":"Tigermoth (World) (Proto)","187a5494f83d9e31e0485dc971a727d4":"Ui-Ire - World Soccer Winning Eleven (Japan)","188e4a01bf62230b7b50eaeb9355bd42":"R-Type III - The Third Lightning (USA)","18929912972f945dffdb21ef5ee7c8b1":"Koukou Juken Advance Series Eitango Hen - 2000 Words Shuuroku (Japan)","18a0f7cfe44de29feff9efb2f18634f9":"Planet of the Apes (Europe) (En,Fr,De,Es,It,Nl)","18bfa442d857e038c8ef578b64df0ba2":"World Poker Tour (Europe) (En,Fr,De)","18d8c779e0b0c50be33b84374d1f57b8":"Rockman Zero 2 (Japan) (Virtual Console)","18ef4ec828a4bf14b6fd241230bb349a":"Alien Hominid (Europe) (En,Fr,De,Es,It)","18f479a8d3e0ac87d5f6495a43f76876":"ESPN Great Outdoor Games - Bass 2002 (USA)","190634951b15d743ab39fb56d105c15b":"Disney Sports - Football (Soccer) (Europe) (En,Fr,De,Es,It)","19129e5f655be691894551b379ac6154":"Mr. Incredible - Kyouteki Underminer Toujou (Japan)","19183a3438256a96b07026bc9c2265bf":"WarioWare, Inc. - Minigame Mania (Europe) (En,Fr,De,Es,It) (Virtual Console)","1923216a92a9d7b4640c39a37b6a612b":"Little League Baseball 2002 (USA) (En,Es)","19237fa5628f80a4239d817eba82faa6":"Tim Burton's The Nightmare Before Christmas - The Pumpkin King (Japan)","1933352fdcc12b8bdb603ee7ed8f9027":"Tales of the World - Narikiri Dungeon 2 (Japan)","1934b7380ba91e4966f12c2968451289":"Bionicle (USA)","19371ad5f797b26c5e841992339ad37d":"Jurassic Park III - Kyouryuu ni Ainiikou! (Japan)","193f6184cdb4b5f6c0f9875e812e4c75":"Monster! Bass Fishing (Europe)","1944e6ac9631eeec604e5fadf749885e":"Charlie and the Chocolate Factory (Europe) (En,Fr,Es,Nl)","1949b8e4a2f30f28be71e97b4d824b22":"Monster House (Europe) (En,Fr,De,Es)","1950bec3827a706bcf603bf27794c270":"Kidou Tenshi Angelic Layer - Misaki to Yume no Tenshi-tachi (Japan)","1953b83685eaeb7bf713091a77569e17":"Lemony Snicket - Raetselhafte Ereignisse (Germany)","1975eda7d93cdb6d0828533dd34a05a7":"Dora the Explorer - Super Spies (USA)","197ae930329b3515fa57c039ad81c415":"Digimon - Battle Spirit (Europe) (En,Fr,De,Es,It) (Beta)","197dc540682b32e2022fec2ec543be1a":"Madden NFL 2004 (USA)","1995bfb86365486c6568aaa86b2330c0":"Deutschland Sucht den Superstar (Germany)","19a4e7b19c46c224f3dea0a412b88309":"Bengt Swinger of Longarm (World)","19bf7f61b8f684b92cd746a8575a6a83":"Twin Series 2 - Oshare Princess 4 + Renai Uranai Daisakusen! + Renai Party Game - Sweet Heart (Japan)","19c9594b78d51c9b24f5fb79e463756f":"Lord of the Rings, The - Futatsu no Tou (Japan)","19dfc661c5a3563e001aaaec36b33b90":"SimCity 2000 (Europe) (En,Fr,De,Es,It) (Rev 1)","1a2c640094216f9d15dc7a2ac3b8c1e0":"Jungle Book 2, The (Europe) (En,Fr,De,Es,It,Nl)","1a42ae26c4068ea87c2e8c476ecd0e26":"Shrek Prezessin (Russia)","1a92e287f154d62c136ebe524e75c7f2":"Rapala Pro Fishing (USA, Europe)","1a97a68ce320fd9eda568a724ea1bfb4":"Magical Quest Starring Mickey & Minnie (Europe) (En,Fr,De,Es,It)","1a9cc177b098fa1762b0e9872590916c":"Marvel - Ultimate Alliance (USA)","1aa6a1651fa5ad8a002ca41e5ea9db30":"Oshare Princess (Japan)","1aa85dfb96e1abbee490420dc628b3b9":"Mario Golf - Advance Tour (Europe) (Virtual Console)","1ac4901f9a831d6b86ca776bb61f8d8b":"Yu-Gi-Oh! - Dungeon Dice Monsters (USA) (En,Es)","1af27a924734e9f9e30569633204269c":"Yu-Gi-Oh! Duel Monsters 8 - Hametsu no Daijashin (Japan)","1af28ea547d4116dc752c93f7f694239":"Pokemon - Rubin-Edition (Germany)","1b19f74bc004de8267993711d304511b":"Final Fantasy VI Advance (Japan) (Virtual Console)","1b1d09ff352571dac46b1790e000876d":"Freekstyle (Europe) (En,Fr,De,Es,It)","1b2e6bec49e5d6fbe8cf76b37b579f24":"Sys Crusher (World) (v1.2)","1b52dbdddd84d20f1faf32234ee31e6b":"Sutakomi - Star Communicator (Japan)","1b6af74f06ac7982e32f4f9803ba5f7c":"Pinball of the Dead, The (Europe) (En,Fr,De,Es,It)","1b7e12284e562915aa7acd260c06771d":"Yaoxi Dao (China)","1b93ef2e096d7eb72e76b8662a3e74ec":"Super Army War (USA)","1b953a635c3b51aecc8d74a5dee826cd":"Justice League - Chronicles (USA)","1bdadffe311ef9fa231c799806ad5ca3":"Brother Bear (USA)","1c04ff63c5d5b1a1eb62c1dca639e87f":"Shin Megami Tensei - Devil Children - Puzzle de Call! (Japan)","1c1d819ef380b1910277eae8f6f754f6":"Galacard Advance (World)","1c1e71c7877fe5bfdb3d612006159bf5":"Pocket Monsters - Sapphire (Japan) (Pokemon Box)","1c2da9f487a4834c8021d7a307a55684":"Legendz - Buhwarhaneun Siryeonyi Seom (Korea)","1c4467efeb8c13831b8ad08d7e8f4908":"Disney Sports - Basketball (USA)","1c694783acdfd013bdd980a4d8f8f546":"Sonic Battle (Japan) (En,Ja)","1c71095f65234ad3649e6c685b1e61f4":"Power Pro Kun Pocket 1, 2 (Japan)","1c759edf84a20174989588664bbbec55":"Kirby & The Amazing Mirror (Europe) (En,Fr,De,Es,It)","1c910a18efff33811d7695899296ff03":"Gren's GBA Game Pack (World)","1c92edbad07a372ee382d16cf624dc4b":"Shaman King - Master of Spirits (USA)","1c937c4f43a60a60066c9a2bce690e31":"Blood Drive (World) (GBA Jam Week)","1c9971ba2ed8174f6a3d099c2ee44d7d":"Oggo Boggo (World) (GBA Jam 2024)","1cb94e81dd0168c33e0eb8b070fddb6e":"Breath of Fire (Europe)","1cd1385407bfb06d4ee222650e633735":"Pferd & Pony - Mein Gestuet (Germany) (En,De)","1cd1d918e2730ac739bf2bcf14373382":"Disney Principesse (Italy)","1cd909a6837e4175244b71b83d2fdd1f":"Three-in-One Pack - Risk + Battleship + Clue (USA)","1cdd7f33c9a27061201e1d1ce029a700":"Golden Sun (USA, Europe)","1ce4441b3142b480e03cffe290b00ce6":"GT Advance - Championship Racing (USA, Europe)","1cf89b423893a12ee0bbc1c4e2868509":"Van Helsing (USA)","1d15cd3454a3566dc51d9321563d8c12":"Snood 2 - On Vacation (USA)","1d1bb23346b8a9592316a63647c70d76":"Sims 2, The - Pets (USA, Europe)","1d3084de02b0bb709ebf0070b4802aee":"SpongeBob SquarePants - Lights, Camera, Pants! (USA) (Beta 1)","1d55a0e331301a7d36ac326f3d8dc007":"Banjo-Pilot (USA)","1d6191fca5bed8a2abcea16be8f2c69c":"Famicom Mini 20 - Ganbare Goemon! - Karakuri Douchuu (Japan)","1d651567d1a5a91c93983c5b9af79421":"Yggdra Union - We'll Never Fight Alone (USA)","1d6c744dedc3741923850e47f9745418":"Tomato Adventure (Japan)","1d82ad717de36b8025770049ef4fb934":"Majokko Cream-chan no Gokko Series 1 - Wannyan Idol Gakuen (Japan)","1d8b145985bb38f9de77405c9f1fa60b":"DK - King of Swing (Europe) (En,Fr,De,Es,It)","1da8c2e3f6594c4287770171d145b7d3":"Board Game Classics - Backgammon & Chess & Draughts (Europe) (En,Fr,De,Es,It)","1dac1484f1d66158b1cfae3da7c79af9":"Racing Gears Advance (USA)","1dbd789e9efc3aaacc48512872677f97":"Action Replay GBX (France)","1dbf1b5255a3fc4b9a412f79f83a77fb":"F-Zero - GP Legend (USA) (Virtual Console)","1de4ebf40c819e8cfb20b84f6dcdf718":"Mech Platoon (Europe) (En,Fr,De,Es,It)","1de6184d96452bed659bc732915ecb0e":"Lizzie McGuire (Europe) (En,Fr,De,Es)","1e04d15e21960028153dd09609103c63":"SpongeBob SquarePants - SuperSponge (USA, Europe) (Beta 4)","1e087998d7f24a69579d107f7671f7db":"Lunar Legend (Japan)","1e0b41fbb6f338dc44932625446df20c":"Onimusha Tactics (Europe)","1e0ff992c079acf2e5310699e1fafe45":"Music Recorder MP3 (Japan)","1e32d754b8a874d279086f98cf523dfd":"Banjo-Kazooie - Grunty's Revenge (Europe) (En,Fr,De)","1e35207a805af5bafde2361df6721c60":"Battle Network - Rockman EXE (Japan)","1e3e1d0307b350dc1af049ea85d18c06":"Chrismas Challenge (World) (Beta)","1e3fd614dc43edbbf9df51262057f2cc":"Scooby-Doo and the Cyber Chase (USA, Europe)","1e52d66f5f8a7c4f207d80ba4fccf55e":"Yu-Gi-Oh! - Worldwide Edition - Stairway to the Destined Duel (USA) (En,Ja,Fr,De,Es,It)","1e52f38082b252e04173efb340a9286e":"Pokemon - Versione Verde Foglia (Italy)","1e5a3679bb64a87ea2e23774a672ca7d":"Super Monkey Ball Jr. (Europe) (En,Fr,De,Es,It)","1e5f91db7b8fa135cc3b118a3f8e686c":"Pinball Advance (Europe) (En,Fr,De,Es,It)","1e68810a62d6db776b3e602e39601b70":"Medarot G - Kuwagata (Japan)","1e7ee1cf52d5a507ab4a54ee1efad630":"2 Games in 1 - Scooby-Doo + Scooby-Doo 2 - Monsters Unleashed (Europe)","1e8c774ba210d1c55113531c7360c737":"Megaman - Battle Network 6 - Cybeast Falzar (USA)","1ea6b683e2cadc313474badeac929154":"Yu-Gi-Oh! Duel Monsters Expert 2006 (Japan) (En,Ja,Fr,De,Es,It)","1ec7fbc18c78d747d1505fe0abacbec0":"Dragon Ball Z - Buu's Fury (USA) (Beta 2)","1ed7f890ce33a463907cec23f83be7c0":"Math Patrol - The Kleptoid Threat (USA)","1edb0b88ee507f5176900c419c52b570":"Ultimate Puzzle Games (USA)","1ef40e56d3eab2501445ba73d26bf827":"Disney Sports - Basketball (Japan)","1efa00a76962e01d5a0aebeb7b0ef8cb":"Action Replay GBX (Europe) (En,Fr,De,It) (Alt)","1f068b49fa0fff9f866abe2d0a965a89":"2 Games in 1 - Sonic Advance + Sonic Battle (Europe) (En,Ja,Fr,De,Es+En,Ja,Fr,De,Es,It)","1f49d24ac42d1697a55a45a145b1dd39":"Curious George (Europe) (En,Fr,De,Es,It,Sv,Da)","1f5a23d069bf42a1f3131e8c5a574efb":"Columns Crown (Japan)","1f739df174644981268f67efbca5dab8":"Duel Masters 2 - Invincible Advance (Japan)","1f7d87cd45e6105577670cab74961993":"SpongeBob SquarePants - SuperSponge (USA, Europe) (Beta 1)","1f86e54c43ba68c9211e76816d88927f":"Scrabble (Europe) (En,Fr,De,Es)","1f90a64fb3b26abee5ff9284fe628758":"Classic NES Series - Castlevania (USA)","1fa9862e396758ee4eb6923e5ce4f9bc":"Dokapon Q - Monster Hunter! (Japan)","1fad228baad51e306b23986ca403d6ec":"Cat's Curse (World)","1fb0b1a3df41397795acf99d8aada8d6":"Super Bubble Pop (Europe) (En,Fr,De,Es,It,Nl,Pt,Sv)","1fb4a4b0891ed489183ba487e2f9046e":"Sword of Mana (Europe) (Fr,De)","1fb97ae3abe61bb55643559084ceb160":"Ganbare! Dodge Fighters (Japan)","1fe0aa775a55230c0cf8236f4376dbe9":"Elf - The Movie (USA) (En,Fr,De,Es,It)","1ff9f0809c7766f72e67378cb14a430a":"Megaman & Bass (Europe)","20121e429ee5ece132b9ac3b0f22efe9":"Fushigi no Kuni no Alice (Japan)","20170a5739aff291fa8adc67b682ab15":"Star Wars - Flight of the Falcon (Europe) (En,Fr,De)","20447ef4715492164d65ebcdf26bd568":"Little Buster Q (Japan)","20449adab693bf966bf0f4a907102fb9":"Pocket Monsters - Ruby (Japan) (Rev 1)","2047548fdb416c3ebe15ca34fc16e773":"Mahou Sensei Negima! - Private Lesson 2 - Ojamashimasuu Parasite de Chuu (Japan)","204f81fba1f395db9e7966039ef48840":"Who Wants to Be a Millionaire (Europe)","20512c2b1d7cfd870a2562c7b82dcdc1":"Pokemon - 10th Anniversary Distribution (Europe) (Kiosk)","2097afe595661f911cffe25050d532ec":"ZooCube (Europe) (En,Fr,De,Es,It)","20bb7717258c3bd2e87b9b7617e95df2":"Mobile Suit Gundam Seed - Battle Assault (USA)","20d7b1bcaf56617df5718f0052a83011":"Black Black - Bura Bura (Japan)","20dad766e239365d6f121dccf79a48f1":"Hudson Best Collection Vol. 1 - Bomberman Collection (Japan)","20e17b68ad10086ddb5f9f899d1ff6d8":"Magical Vacation (Japan) (Virtual Console)","2100cf6f17e12cd34f1513647dfa506b":"Pokemon Mystery Dungeon - Red Rescue Team (USA, Australia)","211af14ac83a170a0e60fe8d0a48e37e":"Pinobee - Wings of Adventure (USA, Europe)","211f243e032b967e01ff97907b29f56a":"Harry Potter - Quidditch World Cup (USA, Europe) (En,Fr,De,Es,It,Nl,Da)","212cd9b15124251d8b08602d607c7865":"WarioWare, Inc. - Mega Microgame$! (USA) (Virtual Console)","2132b06357239d4e6a0716d963f46597":"Breath of Fire II (USA)","214047ac78c08eb59e256f54df9522f2":"Cars (USA, Europe)","214b56eca30b048860579598e935c06a":"Uno - Free Fall (Europe) (En,Fr,De,Es,It)","2151c4d48be4c45f54a2a7365e4293eb":"Domo-kun no Fushigi Television (Japan)","2152c7ff7aea128267279e1a3c5db3ee":"Rockman EXE - Battle Chip GP (Japan) (Virtual Console)","215e630068500f4c4f52bbe9ad5172a1":"Eliminator GBA (World) (Proto)","2164e4c57a166869961fa1b428fd6ded":"Blades of Thunder (USA)","2166bc8d0cf08a6fe0cc44559a52c3a1":"Minna no Soft Series - Tetris Advance (Japan)","2170ce3d59a6f69d6d5b002088beed7c":"Stuart Little 2 (USA, Europe)","21837dbfe88ec42e35cddaf7585d1fe1":"Racing Gears Advance (USA) (Beta)","218700b79a0ae3e9d69abf00fe06eb97":"Hot Wheels - Burnin' Rubber (Europe) (En,Fr)","21a45ac121ef99a99688f3b36f1fd297":"Famicom Mini - Kidou Senshi Z Gundam - Hot Scramble (Japan) (Promo)","21b6d4d9631896145f94b869de43f543":"Power Rangers - Time Force (USA, Europe)","21d299d0f2fcd9ab20041a4e6f3788d9":"Frost Princess (World) (GBA Winter Jam 2021)","21d31c0f9843e08ae60419098b0105f3":"March of the Penguins (Europe) (En,Fr,De,Es,It)","21d8748d4d072f90c6319d6bd6ee1781":"F-Zero - GP Legend (USA) (Proto 13) (Netcard)","21e76aea003b916a2beeddd5b71f8df5":"Chicken Shoot 2 (Europe) (En,Fr,De,Es,It)","21f4383d59bb113b4495be56e30c0c53":"Ace Lightning (Europe)","21f8cc99837efbc1cb59fd75dc47be67":"Monster Truck Madness (USA, Europe)","220a6f1b9d8d63e7638248f24dbfa709":"Zoids - Legacy (USA)","2219cac76173a4069c011968ab9e44df":"Hamster Club 4 - Shigetchi Daidassou (Japan)","2221038e601e260c39b5b5937064d4e4":"Super Dodge Ball Advance (USA) (Beta)","223d4da54d60f28fc13124bf03c75734":"Shaman King Card Game - Chou Senjiryakketsu 3 (Japan)","22695f0e188adebaa5f7b865c9719daa":"Spider-Man 2 (Europe) (En,Fr,De,Es)","2286cf9c0253344a19ccc19a36ea293f":"Drill Dozer (Europe) (En,Fr,De,Es,It) (Virtual Console)","228cbf6936579b32b8cc6d7b092dad9c":"Frogger's Adventures - Temple of the Frog (USA) (En,Fr,De,Es,It)","228fca59cbdcff493f207271411e15a5":"Spider-Man 3 (Europe)","2293e67087ae9c5fb0ab6abb25179c0e":"Operation Armored Liberty (USA)","22a0e9f0e8c1c51272a2e29ef2de56e7":"Dr. Seuss' The Cat in the Hat (USA)","22a4e57b85f7413c1973d4bd5a19d5a3":"Robopon 2 - Cross Version (USA)","22ab0c3096981c511a4698e16d8e067b":"SpongeBob SquarePants and Friends - Battle for Volcano Island (Europe) (En,Fr,De,Es,It,Nl)","22b1ec2ea8e0da29ef2810aa4ab7b5f5":"Natural 2 - Duo (Japan)","22b31aa8f66e7c6528fd4903a09f030f":"Lufia - The Ruins of Lore (USA)","22b69c5c0108766be33ad23340f387e2":"Power Pro Kun Pocket 3 (Japan) (Rev 1)","22d31d959de4e87160ba308c95386799":"High Heat Major League Baseball 2003 (USA)","230bbfa7c06395868dfc17c514112c83":"Yuureiyashiki no Nijuuyojikan (Japan)","2330d9d78363285a7a59a844cfe4e506":"Ms. Pac-Man - Maze Madness (Europe) (En,Fr,De,Es,It)","23564039143b0f8beb2e9f3ca4ab742e":"Dr. Sudoku (USA)","2363306cb2927ee859a39ba2744d7f42":"Neoromance Game - Harukanaru Toki no Naka de (Japan)","2395cca1007ecd7d016860703812c2bc":"xXx (France)","23a1a8685d67405271f297f5a042fa23":"Gachasute! Dino Device - Red (Japan)","23a5cf12dda1bd5ef4d3e03fa6112c19":"Planet of the Apes (USA) (En,Fr,De,Es,It,Nl)","23a85707e6b7bb14d559f207824b2389":"Digimon - Battle Spirit (Europe) (En,Fr,De,Es,It)","23aac6d60e04eef54cec26066fa2d4c3":"Duel Masters - Shadow of the Code (Europe) (En,Fr,De,Es,It)","23f620f0e968f21e79197f1e96803965":"4 Games on One Game Pak (Nickelodeon Movies) (USA)","24110878dd4b1d24cd824002685a5f4a":"Hot Wheels Advance (Japan) (En)","241e85ad00eaf8cf43499eeb437cf009":"Reign of Fire (Europe) (En,Fr,De,Es,It)","243cd8ce513da13eeed632a3a8d3d153":"Trollz - Hair Affair! (USA)","24409e68056b96bd4530d774f163d798":"Advance Wars 2 - Black Hole Rising (Europe) (En,Fr,De,Es,It) (Virtual Console)","2448dbe0ddd454ad9b9217e2f3c64787":"Beyblade G-Revolution (Europe) (En,De,Es,It)","247ec2c581b6c5d9bafbda6c51d7c119":"Okumanchouja Game - Nottori Daisakusen! (Japan)","247f637c17f7c8d996a4ab48f3398f06":"Konami Arcade Game Collection (Japan)","248d9fa9903d27cd9890e6a08dbd97cf":"Top Gun - Firestorm Advance (USA, Europe) (En,Fr,De,Es,It)","249a079e6e7cd8a870e23f4fa390d9ea":"Classic NES Series - Excitebike (USA, Europe)","24a24025a5e3b15512d4b5858b07c662":"SpongeBob SquarePants - Lights, Camera, Pants! (Europe) (En,Fr,De,Es,It,Nl,Sv)","24b6419d695679a176c1d8ef4f21d667":"GameShark GBA (USA)","24b65c43b58646c0b6450090c0dea44f":"Famicom Mini 14 - Wrecking Crew (Japan)","24bc3d8a0ae721d6bdc745c761422b50":"Polly Pocket! - Super Splash Island (Europe) (En,Fr,De,Es,It) (DSI)","24ef180602e0658bbe38fabc5d09894c":"Crash Bandicoot Purple - Ripto's Rampage (USA) (Rev 1)","252037e0c434428271dc322b122612aa":"Monster House (Europe)","253d5403fff7e6a7c4166423f2693f8f":"Konami Krazy Racers (USA) (Beta)","2548856ed56765e0f8267175bc1ac171":"Aero the Acro-Bat (Europe)","2553ec818abcbaf0e925805918635f0f":"SEGA Rally Championship (Europe) (Beta)","2556b3d052b71961c52f618689595429":"Beyblade V-Force - Ultimate Blader Jam (Europe) (En,Fr,De,Es,It) (Beta)","2584c4d9c73888ffc9096a02fafea08c":"X-Men - The Official Game (USA)","2585d9385617b38836884f90997dc985":"Zidane - Football Generation 2002 (Europe) (En,Fr,De,Es,It)","25998f81ba65037dcde78250b7d2c28b":"Cabbage Patch Kids - The Patch Puppy Rescue (Europe)","259cfd0ff14f96159fcf9aa156cec4da":"Dragon Drive - World D Break (Japan)","25a0842e3db8b40eeb39de83285cc13a":"Rock 'N Roll Racing (USA)","25b2d758e9abc435441414aab6d43431":"Shin Megami Tensei (Japan)","25cb3f0bc680ece2d1578a635e831c57":"Pocket Meat (World) (Proto)","25cdcf14f0fce47d9c6c8155774948fa":"Elf Bowling 1 & 2 (USA)","25ead20d8d3cfedb35393740b3a36b74":"Kotoba no Puzzle - Mojipittan Advance (Japan)","26138b868def156d361525dc69c2899e":"Mike Tyson Boxing (USA) (En,Fr,De,Es,It)","261baa7a487c97bcf1df6c2464f7e9e3":"Super Mario Advance 2 - Super Mario World + Mario Brothers (Japan)","263a70b0b601f573940d98dca29a244d":"Dora the Explorer Double Pack (USA) (Beta)","2644a4b5adb2bfe2ca1263b9db9649fc":"2 Games in One! - Spy Hunter + Super Sprint (Europe) (En,Fr,De,Es,It)","266da549741dbc9b9c902c113b13b4b6":"Advance GTA (Japan) (En) (Rev 1)","266e48e50827e202a9e74255bf29a554":"Aero the Acro-Bat (USA)","2670653630214cf574b16ed8a7c9ea9e":"Crazy Chase (Europe) (En,Fr,De) (Beta)","26711d7758259e9637b79fb3625b1a0c":"SpongeBob SquarePants - SuperSponge (USA, Europe) (Beta 12)","267f45f19c0bd4cb4eec1879c2cbd7cf":"Zero One SP (Japan)","269015766de9f577b51f3b5c8623c738":"Shin Sangoku Musou Advance (Japan) (Rev 1)","2694632a5422d0c1553e298458798797":"Disney Sports - Skateboarding (USA)","26b44c6f29e95b1aae1b79f37725d959":"Sound of Thunder, A (USA) (En,Fr,De,Es,It)","26c1b5796bed6222c5b41c94996c380e":"Konjiki no Gashbell!! - Unare! Yuujou no Zakeru 2 (Japan)","26c807fa46179e4820318ef8d7b460dc":"Namco Museum - 50th Anniversary (Europe) (En,Fr,De,Es,It)","26cc5df15901f42782974643505e5159":"SpongeBob SquarePants - SuperSponge (USA, Europe) (Beta 9)","26e70e3bcd7fd311a9ba93f64cbfe30e":"Croket! - Yume no Banker Survival! (Japan)","27035b74f608ffced0e4f78d9b3251cf":"Wagamama Fairy Mirumo de Pon! - Ougon Maracas no Densetsu (Japan)","2705c33d0c7cf9b0aff99c1b64d4465d":"Dr. Mario & Panel de Pon (Japan)","27138132d4c085bbbc442618579558bc":"2 Games in One! - Paperboy + Rampage (Europe) (En,Fr,De,Es,It)","27398cda21dd14b9e0aa28e0e2cb03a2":"Pokemon - Aura Mew Distribution (France) (Kiosk)","273b9e8c6760ba878e9c6310db5dce67":"Bakunetsu Dodge Ball Fighters (Japan)","275ea9783e76af29846cc3ee5675c62a":"SD Gundam G Generation Advance (Japan)","2761b40bd27082bd75b752b47cafacec":"Shin Megami Tensei - Devil Children - Messiah Riser (Japan)","2768c7c1a8478b245cb9b7b6615d50ca":"Tony Hawk's Underground 2 (USA, Europe)","276b4ef1d42518e99859b31d4ee1b843":"Green Memories (World) (v1.4.8)","277a144d9b4392a6c80f23b979c9c8f3":"Oddworld - Munch's Oddysee (USA, Europe)","279297081bab92bdc469f3b9127ab4fc":"2 Games in One! - Dr. Mario + Puzzle League (USA)","279605b6241eca4461003b439df9e87f":"2 Games in 1 - Disney Princesas + Hermano Oso (Spain) (Es+En,Fr,De,Es,It,Nl,Sv,Da)","279af1b9d55efdcea19593a42f8ce23d":"Ms. Pac-Man - Maze Madness (USA)","27ab3ab9d8c3fee6a38e95ba03fde194":"Totally Spies! 2 - Undercover (USA) (En,Fr)","27c9f37193977828f9808f3f76ff8c76":"Pocket Monsters - Ruby (Japan)","27d0a58227e4c5c6e8481faa4d541fc0":"Santa Claus Jr. Advance (Europe) (Beta)","27dfc6912ed8bbd27a5b5b32a62a4916":"Asterix & Obelix - Bash Them All! (Europe) (En,Fr,De,Es,It,Nl)","27e4b87ce096aaea17cc8a63bf9deeef":"Tony Hawk's Pro Skater 3 (France)","27ebadff2f3b46ae0bf7a198b5f29952":"Magi Nation (Japan)","27f322f5cd535297ab21bc4a41cbfc12":"Advance Wars (USA)","27f9f0e73752cc2df3b73bc46048e8a2":"Yu-Gi-Oh! - 7 Trials to Glory - World Championship Tournament 2005 (USA) (En,Ja,Fr,De,Es,It)","27faba97cc9e3c633a443630575f3585":"F-Zero - GP Legend (Europe) (En,Fr,De,Es,It) (Virtual Console)","27fb433473b3402996830e3d37c5f474":"MazezaM (World) (NEO Coding Compo 2013)","2820981c97087b1181fc44e722c64dc3":"Yu-Gi-Oh! Duel Monsters 6 Expert 2 (Japan)","282f4032daee65c2cbf421ece93e4a41":"Disney Princesas (Spain)","2836ad919de58d933ff94ea209ffea86":"Kawaii Pet Shop Monogatari 3 (Japan)","283969c5d1c1e46b94b565c6da5ecd5c":"Hi Hi Puffy AmiYumi (Japan)","2845b893708a6b8705c6f799f45d6eb3":"bit Generations - Boundish (Japan) (En)","28587f7914842e2104c48da646ca0fd8":"Megaman - Battle Network 6 - Cybeast Gregar (Europe) (Virtual Console)","287921d222d6c6caae129ab6418d5c7c":"V-Master Cross (Japan)","288280c929cde064b9363a7ad4548a76":"Banjo-Kazooie - La Vendetta di Grunty (Italy)","2885a1d384a596a6098855bd155a24a6":"bit Generations - Orbital (Japan) (En)","2892a0fcefc0c183bf725b0a2540a83a":"Power Rangers S.P.D. (USA, Europe)","289adca5437135ad982fe29f80278db1":"Uranus 2 - Sun Tear (World) (En,Fr)","289bbb2e151a6ca11f896ca4712c9835":"Tales of the World - Narikiri Dungeon 3 (Japan)","28a2b3e44952944e29a168e5f17b5696":"Powerpuff Girls, The - Mojo Jojo A-Go-Go (USA) (En,Fr,De,Es,It,Nl)","28a50021de4528077a106a4e29e03487":"City Connection (World) (Fr) (v1.7)","28a966d194d788bf9ef4b5751ceee872":"Camp Lazlo - Leaky Lake Games (Europe)","28ac2eef3f2d0470ec88fe6551b38322":"V.I.P. (Europe) (En,Fr,De,Es,It,Nl)","28cebf1c1138771d3c55beebf589fc52":"Renzhe Shen Gui 2 (Taiwan)","290e507685637ea065aa2d973ba7b923":"Time for The Chickens to Go to Sleep (World) (Auto Demo) (GBA Jam 2021)","29151401cf5f8f500ec2e1cd311f6ebc":"Tom Clancy's Rainbow Six - Rogue Spear (USA, Europe) (En,Fr,De,Es,It) (Beta)","291b90df9403047a5064a1a2e71ed430":"Chronicles of Narnia, The - The Lion, the Witch and the Wardrobe (USA, Europe) (En,Fr,De,Es,It,Nl,Sv,Da)","291c1aa5d30affeb56ecd802b9e8d012":"2 Games in 1 - Golden Nugget Casino + Texas Hold 'em Poker (USA)","293102890d234db6139f88da7d785230":"Dancing Sword - Senkou (Japan)","2940087ab5440fe73b01fb67b2c1b708":"Happy Feet (USA) (En,Fr)","2945f32214890f18db4474bc8626eeca":"Shining Force - Kuroki Ryuu no Fukkatsu (Japan) (Virtual Console)","294d2e2e0782a347a04eb438185d805f":"Batman - Rise of Sin Tzu (USA) (En,Fr,Es)","29680a4aa183eb50aa888ab49cb2ff8b":"Rocket Power - Le Cauchemar d'Otto (France)","29ae328b85fedee67e1cd68b86006c5b":"Scrabble Blast! (USA)","29b048b4b36b3fda168850003f2ee844":"Sigma Star Saga (USA, Europe)","2a04b5eab350d2863809b3b516210d41":"Dogz (France)","2a0d1bb21640a97228f334853b0289c3":"Dexter's Laboratory - Chess Challenge (Europe) (En,Fr,De,Es)","2a141847ee3dc1e13ada211a8c2537cc":"Prehistorik Man (USA, Europe) (En,Fr,De,Es,It,Nl) (Beta)","2a2661cbc8e3891864fdc1d34f9d1c9b":"Dynasty Warriors Advance (USA)","2a3c66736cb90dc1dac6cb94944d0430":"Hot Wheels - All Out (USA)","2a43344ed8e9654f0cc95ce788371ba4":"Boxing Fever (USA, Europe)","2a47d9da2a8653f65f2a23d8052efe8c":"Treasure Planet (USA)","2a48cfc3bf07c4f64cd267489d46dca8":"Fantastic 4 - Flame On (Europe) (En,Fr,Es,It)","2a76e96be1fdb58ea4e4bafa62556a5a":"Tweety and the Magic Gems (USA)","2a8d8fb4d2ce5ca01c13d1c9cf65955e":"EX Monopoly (Japan) (Rev 1)","2ab4cafacf54e34053b34527539b7e5b":"Lucky Luke - Wanted! (Europe) (En,Fr,De,Es,It,Nl)","2acd2b101e2f03a3fb95ed41b187d5ec":"Jimmy Neutron - Boy Genius (USA)","2ad022deb3d3575d98bcf639fb177683":"Tomato Adventure (Japan) (Virtual Console)","2adeb64ff470fb08a472f3cb6f5d7d44":"Duel Masters - Sempai Legends (USA)","2ae30f703add1843ab2c0299076f086d":"Horsez (USA)","2ae643e7a49f5044cdc9413d86b8d538":"Denki Blocks! (Europe) (En,Fr,De,Es,It)","2ae7ae75669717e299671d26ea883f98":"King of Fighters EX 2, The - Howling Blood (Japan) (Rev 1)","2ae83e668d4098f60a686962ae8ea71a":"Space Invaders (USA, Europe)","2af323f1b5a498d3060b5b8fb94410ed":"Digimon Racing (Europe) (En,Fr,De,Es,It)","2af652bd8eaae10cac539bf9f2491e45":"Wild Thornberrys Movie, The (USA, Europe) (Beta)","2af78edbe244b5de44471368ae2b6f0b":"Legend of Zelda, The - The Minish Cap (Europe) (En,Fr,De,Es,It)","2b05ef0af7a48729a665a86573ae70b4":"Sims, The (Japan)","2b32199a5cee65f93714a686376e50ca":"Famicom Mini 15 - Dr. Mario (Japan)","2b4d29e64f0ab440877488d91bb67ae9":"2 Games in 1 - Disney Princesas + El Rey Leon (Spain) (Es+En,Fr,De,Es,It,Nl,Sv,Da)","2b560846665f5afd8b55405933ded4c1":"Mortal Kombat Advance (Europe)","2b58ab05006a99c7b075a72141c39346":"2 Games in One! - Spy Hunter + Super Sprint (USA)","2b5e0ffa2eb716e2600282842c915fc0":"2 in 1 Game Pack - Spider-Man - Mysterio's Menace + X2 - Wolverine's Revenge (USA, Europe)","2b679f61361ad3040086d8684d58e8e7":"Paws & Claws - Best Friends - Dogs & Cats (USA)","2b6b408513302519fd0e3fa72a67444b":"Battle B-Daman (USA)","2b75a8546e9faf9b404616a68f029db0":"Wanko de Kururin! Wancle (Japan)","2b9a9998d870afaec5d7b0f1a2a477f4":"BMX Trick Racer (USA)","2bbaeea4fd04e30a1ae53d91a390814a":"Final Fire Pro Wrestling - Yume no Dantai Unei! (Japan) (Rev 1)","2c00e335288a96650e34785b5e2a7588":"Pokemon - Version Emeraude (France)","2c18d1fa4d943439ca17ceef984ea7d4":"Star X (USA) (En,Fr,De,Es,It,Nl)","2c1e1db8121b8eb26a55eabbb960bd67":"Rave Master - Special Attack Force! (USA)","2c278a2282ea14997ef4202d205f91bb":"Wild Thornberrys Movie, The (USA, Europe)","2c2e9b38c21fd511b4f1871b12183416":"Adventures of Jimmy Neutron Boy Genius, The - Attack of the Twonkies (USA, Europe)","2c464384922d5a145559c61ed8664113":"Qwak (Europe) (En,Fr,De,Es,It)","2c473ca8fb6b7a76777029d1eee066fc":"Battle Network - Rockman EXE (Japan) (Virtual Console)","2c5221fbcbd75a985d68451cf7fa6c8e":"Monster Gate - Ooinaru Dungeon - Fuuin no Orb (Japan)","2c60af1c2c17377c27b2d9aac79f0cea":"Bionicle (Europe) (En,Fr,De,Da)","2c6411d76d5438da19f193b630da1c63":"Gauntlet - Dark Legacy (USA)","2c66f51bd6546fb780d52f981a57106e":"Flintstones, The - Big Trouble in Bedrock (Europe) (En,Fr,De,Es,It)","2c8ef9cce9f46b55247468ea449aeade":"Grand Theft Auto (USA)","2cc38305f62b337281663bad8c901cf9":"Castlevania - Circle of the Moon (USA) (Virtual Console)","2cd38e2e2d2bbc3eeee2833b8667e962":"Scurge - Hive (USA) (En,Fr,Es)","2ce9dc7e0e3af0be2b1d0d487555aa6a":"M&M's - Blast! (USA)","2cede728164ea50342d41a554ef36a02":"2 Games in 1 - Finding Nemo + Finding Nemo - The Continuing Adventures (Europe) (Es,It+En,Es,It,Sv,Da)","2d1ceffbc8c34e3101ab91ea49f43a44":"Nobunaga no Yabou (Japan)","2d2a6725da37285d65c34205d08754d7":"Star Wars - Jedi Power Battles (USA)","2d434f2b0392f91f7715841a122621c1":"American Tail, An - Fievel's Gold Rush (Europe) (En,Fr,De,Es,It)","2d457f68782271e833b1469ec7308502":"Sheep (Europe) (En,Fr,De,Es,It)","2d7e907c4e4741f1a2fcf4c4caae030e":"Fairly OddParents!, The - Shadow Showdown (USA)","2d8c8d7f7bb5dcfc9d7b8eb54a9281b3":"Driven (Europe) (En,Fr,De,Es,It)","2d93223a5f86759f02398226a4a8a054":"Medarot Navi - Kuwagata (Japan)","2d9d80520480dbc4872b774a80f02f07":"Bubble Bobble - Old & New (Europe) (En,Fr,De,Es,It)","2da2e4acdc19c3fcc3e66f8f4cfd3606":"Madagascar - Operation Penguin (Europe) (Fr,De)","2dc58ce50644d4029cd2a347f197973f":"Medal of Honor - Underground (Europe) (En,Fr,Es,It) (Zoo Digital)","2dd50cff5266e703e72964fa0755e0c7":"Heidi - The Game (Europe) (En,Fr,De,Es,It)","2dd75f1b7e8095ab41918fccdd64e1ae":"Cars (Japan)","2dd88e9133f723098c6e8107217ec0c4":"RPG Tsukuru Advance (Japan)","2de53bf040953ad79cc8135c37b47aa0":"Tim Burton's The Nightmare Before Christmas - The Pumpkin King (USA, Europe) (En,Fr,De,Es,It)","2dec48a670f8d26b39c538ff725e2bcf":"Monster Jam - Maximum Destruction (Europe)","2e097b1eabed460f60b4e7d10a8b5c78":"Surf's Up (Europe) (En,Fr,De,Es,It)","2e28272879ced1ffffc522c6021bf79f":"Maya the Bee - The Great Adventure (Europe) (En,Fr,De,Es,It)","2e368f0e94916e946554b8f3ade01ca5":"Top Gear Rally (Japan)","2e421c417113247f1527731dd1420e6b":"Pokemon - Sapphire Version - Gotta Catch 'em All! (USA) (Pirate)","2e4a8fc4e1724e22a890b7c41c880058":"Family Tennis Advance (Japan)","2e5497b73aee7fb5fe0a82738d084814":"Unfabulous (USA) (Beta 10)","2e6e9e3b87f99f04a1ac44b01bfa6ecd":"Pokemon - Version Saphir (France)","2e8814e664675572a43b01900bbbb16b":"Mario Golf - Advance Tour (USA)","2e9b5ec5bb6be065d2f52af20bf8aca3":"Shrek 2 (Europe) (Fr,De,Es,It,Sv)","2ea8794792b610dc216324f056000f29":"Puyo Pop (Europe) (En,Ja)","2ed6310dac14f69f72002d9a9b6fab6b":"Koutetsu Teikoku (Japan)","2efc09d371a77db996d82a06e0f71062":"Nyan Nyan Nyanko no NyanCollection (Japan)","2f14e9e9357b04ee867d837a3dd3fcdd":"Downforce (Europe) (En,Fr,De,Es,It)","2f3f8e8d7874528acac3b7b89ccf98dd":"Lara Croft Tomb Raider - Legend (USA) (En,Fr,De,Es,It)","2f660377581b7e48c06131f56c791b72":"Super Mario Advance 2 - Super Mario World (USA, Australia)","2f661853601455283f51e54fb85dea73":"ChuChu Rocket! (Japan) (En,Ja,Fr,De,Es)","2f681730742c52625d237e610ce6de7e":"Ultimate Arcade Games (USA)","2f78a6ee027003fa5472eb90fc1322a7":"ESPN Winter X-Games Snowboarding 2002 (USA)","2fb73b874bbf4119e5cbf17b8ceae9c1":"NASCAR Heat 2002 (USA)","2fcdf9b4f16219242bf5cdd34336f0e6":"2 Games in 1 - Disneys Prinzessinnen + Baerenbrueder (Germany) (De+En,Fr,De,Es,It,Nl,Sv,Da)","2fe7335773e253b83068a017c9383ed6":"Iridion II (World)","2fec47a3e958099027105fc5e77d81c5":"Coin Adventure (World)","2ff590aa635590c2f8140c88cbb19025":"Final Fantasy IV Advance (Europe) (En,Fr,De,Es,It)","3018514472c092f0603c4a77d3918304":"Celeste Classic (World) (v1.1)","3023f8b53d90af1320f5b686f0f7b868":"Hey Arnold! - The Movie (Europe) (En,Fr,De)","30333c382a0818d4293d5247ae428d11":"Yu Yu Hakusho - Ghostfiles - Spirit Detective (USA) (Beta)","3034c7101bceebdea95300ae9ecd7453":"Lilo & Stitch 2 - Haemsterviel Havoc (USA)","303e99bc49c209e554f395b674d49689":"Final Fight One (Europe) (Virtual Console)","305060aa2e1f0a854b772fa23988c2b9":"Metroid Fusion (Europe) (En,Fr,De,Es,It) (Beta 2)","3083072b9f5c85b5a002139d4df5b518":"Hudson Best Collection Vol. 3 - Action Collection (Japan)","308d1f33a1d96df55de6e16523dc9c8c":"Punch King - Arcade Boxing (World) (Evercade)","30a4cd474af1b4b156dbee4cfeb4c0d3":"Dai-mahjong. (Japan)","30af5ef768089d20ff9bc0d13effdaff":"Sabrina the Teenage Witch - Potion Commotion (USA) (En,Fr,Es)","30b77017492ad71ebb6775cca6038610":"Mandarin 2, The - Limoncello's Revenge (World)","30e7a35f23b2259b65844a667191c556":"Pac-Man Pinball Advance (Europe) (En,Fr,De,Es,It)","30f5a0d49aa5672707ac5751ebd1996e":"Incredibles, The (Europe) (Fr,Nl)","30ff41b3a469bad7ce39deb6d50f8154":"Dr. Sudoku (Europe)","30ff69a44658fcf2cc381736403e74ef":"Army Men Advance (USA, Europe) (En,Fr,De,Es,It)","3100fc5a4427a7b0cc20b861134e60f2":"Dragon Ball Z - The Legacy of Goku (USA)","31231965d6a43d935e3629a67e06e0bb":"Boktai 2 - Solar Boy Django (USA)","31628fe35cfe67066a003f045a32daae":"Barbie and the Magic of Pegasus (Europe) (En,Fr,De,Es,It,Nl)","318c35c343670efd4a35fe270092eefe":"Pipe Spin (World) (GBA Jam 2021)","318fd3dec910d491bace987795397bb5":"Land Before Time, The (USA) (En,Es)","319ae22870572aed14a1d7861e1c025f":"Fire Emblem - Fuuin no Tsurugi (Japan) (Virtual Console)","31aaa9b8c76c220356b4bed887c1a318":"2 Games in 1 - Monstres & Cie + Le Monde de Nemo (France) (En,Fr,It+Fr,Nl)","31aac9610e0d8a33469695e2c571be2e":"Pokemon - Liechi Berry Glitch Fix & Shiny Zigzagoon Distribution (Europe) (Kiosk)","31c33a781f3a6bd3af3a4497e6d88c3c":"WarioWare, Inc. - Minigame Mania (Europe) (En,Fr,De,Es,It)","31c90da4e415ff1abd4ba320f3fb4a6f":"Koinu-chan no Hajimete no Osanpo - Koinu no Kokoro Ikusei Game (Japan)","31d227735fbc8220de9f1a93da10e199":"Klonoa - Empire of Dreams (Europe)","31dd0e7efd461e004cfa6bad8e7b0e57":"Yu-Gi-Oh! Duel Monsters 5 Expert 1 (Japan)","31ede9e787e0f60729b2898f4e18116e":"Marie, Elie & Anis no Atelier - Soyokaze kara no Dengon (Japan)","3210f30e13b7bf65d4e5ab42235ad663":"Golden Sun (Italy)","323c4735d5911403cfcb810b294669a0":"Koinu to Issho 2 (Japan)","32490cd20b8e808da9c45aa82fa4800a":"Madden NFL 2005 (USA)","327f1553f9c9bc510069d9eaabb0f6fb":"Serious Sam Advance (USA) (En,Fr,De)","3287ca66e5cc285a9fe3a922051e84c6":"Legend of Zelda, The - A Link to the Past & Four Swords (USA)","32c54e1f584b3304d3dbaefdcde5aadf":"Guranbo (Japan) (Virtual Console)","32c77b409455bc4efbfde71d4ca4d256":"Ice Age (Japan)","32cbd7b3468b5f595876161a47f15895":"Card e-Reader+ (Japan)","32d74527bfe723470c2c5406c325fb59":"Crash Bandicoot - The Huge Adventure (USA)","331ce7f78b6a56fa50b9a329b56da658":"Pinball Challenge Deluxe (Europe)","333c21725d933d2bc0cc2209f70afd48":"Megaman - Battle Network 4 - Blue Moon (USA) (Virtual Console)","33402d100218cc080c24858ec2a0d7ae":"Kong - The 8th Wonder of the World (USA) (En,Fr,Es)","33492e64f810fb02f6dff879b8e0182b":"Bratz - Babyz (USA)","335d6415dad158195ee1290f4f955fa1":"Wagamama Fairy Mirumo de Pon! - Yume no Kakera (Japan)","337b64f47229b4284df404a69e9d17ae":"Spider-Man 3 (Italy)","33d83aec45345690ffe48ad9ed7a4ff8":"Harry Potter and the Goblet of Fire (USA, Europe) (En,Fr,De,Es,It,Nl,Da)","33de6e01f5d9c920fdeff251feb4d61e":"Santa's Chimney Challenge (World)","33de786f427b47750aaed814c761c5b9":"Bratz - The Movie (USA)","3414c77d76eb093abc478f67ef7ec3b9":"Earthworm Jim 2 (Europe) (En,Fr,De,Es,It)","342040b3d6e19f72e6d22d7f54a169c5":"Super Mario Ball (Japan)","34254b26f28ea5cec1463576ff474fe8":"Around the World in 80 Days (Europe) (En,Fr,De,Es,It,Nl)","342e05b38859d830e83722cda6e41409":"Tiny Toon Adventures - Wacky Stackers (Europe) (En,Fr,De,Es,It)","3433a199b6c8360c998de05f54fc25bf":"Oshare Princess 5 (Japan)","343c3ceb2cf89c5334f325edc4c4cae3":"Power Rangers - Dino Thunder (USA, Europe)","34a82a7281e62fdf2051b95dc0df0488":"Azumanga Daiou Advance (Japan)","34abc009c1c6fcc8588340c9bc04bd81":"GetBackers Dakkanya - Jigoku no Scaramouche (Japan)","34b0151cdc78a7a3b7cab3cda70bbc1d":"Kouchuu Ouja Mushiking - Greatest Champion e no Michi (Japan)","34b91944c89770903b4d04d40e3e8512":"Fire Emblem (Europe) (En,Es,It)","34bc4830fdd1cff2e33b8ac7fd3a6cbe":"Bomberman Story (Japan)","34f00ecb5b316478806eeca84cf62e55":"Big Mutha Truckers (Europe) (En,Fr,De,Es,It)","3507139cfb163b6df585bb5ef43388d7":"Mojie Qibing (Taiwan)","35132fb11ea80dba872a8edeb9ba42d6":"Choro Q Advance 2 (Japan)","354f699e95a171cf0725d3509c2579c2":"Green Memories (World) (v1.4.4)","355ad9613487d0ebc64ab75399ac075b":"Tarzan - Return to the Jungle (USA, Europe)","358c87fe02d8ce7207fb101839bbb820":"Chessmaster (Europe)","35ae64b0f27e60107c14ab956f6cdf70":"Kirby - Nightmare in Dream Land (USA)","35ca3b91976497cc24384f9367f16462":"LEGO Racers 2 (USA) (En,Fr)","35db4a2bacdec253672db68e73a41005":"Castlevania - Harmony of Dissonance (USA) (Castlevania Advance Collection)","35eb30c1013b72df8ec4a71a1fc1acff":"Legend of Dynamic - Goushouden - Houkai no Rondo (Japan)","3608b6ca5d044759903c08c8206f8ee4":"Slime Morimori Dragon Quest - Shougeki no Shippo Dan (Japan)","3636872e128f9c64c13bcb551c8566c0":"Nihon Pro Mahjong Renmei Kounin - Tetsuman Advance - Menkyo Kaiden Series (Japan)","3638075a07ad63a813dea97e6ad16d2c":"Crash Superpack - Crash Bandicoot 2 - N-Tranced + Crash Nitro Kart (USA)","36545c66bf7abdbced2b294a7dd8d419":"Zoids Saga (Japan)","365a0a06f8374809ec225ab2cfc255e4":"Scooby-Doo (France)","365bce291e2ed017ae5585489e036cb2":"Razmoket, Les - A Moi la Fiesta (France)","36663f8c81fc13e1f3eb739292af7941":"Jikkyou World Soccer Pocket 2 (Japan)","36697685f9c5d16af44b3d5172aa4187":"Mr. Driller A - Fushigi na Pacteria (Japan) (Virtual Console)","36916861e921121015366b7d5ec45f3e":"Tony Hawk's Pro Skater 3 (USA, Europe)","369aac3167d1f83c70a671b8febc2751":"Over the Hedge - Beesten bij de Buren (Netherlands)","36a7bb733c433afaf9e416e2c8c0ac9d":"Scooby-Doo 2 - Monsters Unleashed (USA, Europe)","36a92215bc1fd68f9db49c1be06fe088":"Chicken Shoot (USA)","36c04fe38ba46cff285b060907db94f6":"Lost Vikings, The (USA)","36c2ff60e03639dcef8e67d9e2aa602b":"James Pond - Codename Robocod (Europe) (En,Fr,De,Es,It,Nl,Pt)","36c8139a261f869d76292e83942e7470":"Metroid - Zero Mission (Europe) (En,Fr,De,Es,It) (Beta)","36e7d6e276c0e4f56984a2f8491b9364":"Spyro Adventure (Europe) (En,Fr,De,Es,It,Nl)","36eaf4fec9e81f3ea44869033996cedd":"Franklin's Great Adventures (USA) (En,Fr,Es)","36ed4c67ac05311bf3fbeda47f3ac608":"Motocross Maniacs Advance (Japan)","36efd004fd521bd4a03727347792ebd0":"Medarot Ni Core - Kuwagata (Japan) (Virtual Console)","3700b0ed17c59b333b19d2fbc7d37ef9":"Contra Advance - The Alien Wars EX (Europe) (Virtual Console)","370cc3b832f905a2b5511c1665e4a8bc":"Golden Sun - La Edad Perdida (Spain)","371e238e0398877bd758cc4cd4499ad0":"EZ-Talk - Shokyuu Hen 2 (Japan)","37205e649905cc4f714ffbb0f3b41307":"V-Rally 3 (Europe) (En,Fr,De,Es,It)","3730141d2551bea28ffeeded3996a62e":"Golden Sun - The Lost Age (USA, Europe) (Virtual Console)","3744dfea6f6e089c1d5128ca2467a705":"CCCP (World)","37477683a1e646431c5396164df388f3":"Metroid Fusion (Europe) (En,Fr,De,Es,It) (Beta 1)","3755c0a785a829114c543393ecf0cb4e":"Pac-Man World 2 (Europe) (En,Fr,De,Es,It)","37583a361558c4ba761f2cf5e56010a1":"Dragon Ball Z - Taiketsu (USA) (Beta)","37811411c46cf9a5ee91b418c6e67930":"Suite Life of Zack & Cody, The - Tipton Caper (USA) (En,Fr)","37a569f4b2ee0818f89117a5cc958e83":"Car Battler Joe (USA)","37a7507f1bee2baeed44adbff1b9c6c0":"Zoids - Legacy (USA) (Beta 6)","37b681295390ef9f55ee3222c761c4c3":"Butt-Ugly Martians - B.K.M. Battles (USA)","37de77b39b429bce433288987f9d278a":"Konami Collector's Series - Arcade Classics (Europe) (En,Fr,De,Es,It)","37f0505935e85c9cf7eebdae533536ef":"Tom and Jerry Tales (USA) (En,Fr,Es)","37f5b0e5b014994f923ac1e9e3300643":"Kaze no Klonoa G2 - Dream Champ Tournament (Japan)","37fe4eeab5274d244e5e6853881307ad":"Madden NFL 06 (USA)","37ff7a1de0322b72a6b41dea0ba53673":"Super Ghouls'n Ghosts (USA, Europe)","3841de81f12bb38566934a3657f09372":"Sky Dancers - They Magically Fly! (Europe) (En,Fr,De,Es,It)","385dc0869879128befc52c0b30ff03ff":"Planet Monsters (USA) (En,Fr,De,Es,It,Nl)","386358b358d4a578d7cdc195529016ee":"Gekitou! Car Battler Go!! (Japan)","387089984f98893405b805068fec89bd":"Spy Kids Challenger (USA)","38856f86a30538cbb3e4164da96002a7":"Sitafei De Chuanshuo (China) (Proto)","38aac4616bb56f14de9c0e7e8f86f0b9":"Robotech - The Macross Saga (USA, Europe) (En,Fr,De,Es,It,Nl)","38ad394329f52e5d58297b7249e732fe":"Fire Emblem - Seima no Kouseki (Japan) (Virtual Console)","38b0fa8bfd882b16813d166075b8f202":"Hunter X Hunter - Minna Tomodachi Daisakusen!! (Japan) (Rev 1)","38b69a345ed3a000e390645aaf6e51fc":"Oshare Princess 2 + Doubutsu Kyaranabi Uranai (Japan)","38be3f2ff554732e3b84003abe79e2bf":"Yu-Gi-Oh! Duel Monsters 7 - Kettou Toshi Densetsu (Japan)","38cfa461202a2b32e2ccc92cb6178af6":"Thunderbirds - International Rescue (Europe)","38d7fc6d3804b6f80557096fa2aeb1fe":"Maniac Racers Advance (Europe) (En,Fr,De,Es,It)","38f369f1ca0872790995943e8cb4a877":"Columns Crown (USA)","38f78ab97bbbb9bd210d8c96497f788a":"Flappy Bird (World)","3908543e922f3185cd0b73cb774e0738":"Incredibles, The - Rise of the Underminer (Europe) (En,Fr,De,Es,It,Nl,Pt)","393eb5846807df1f2e0f5c2fa77cde31":"Final Fantasy Tactics Advance (Europe) (En,Fr,De,Es,It) (Virtual Console)","3947e65e24c82d023b94878fbebf3bcd":"GBA AV Adapter (China)","394d582b5555937299c6b10ac0acc717":"Crash & Spyro Superpack - Spyro - Season of Ice + Crash Bandicoot - The Huge Adventure (USA)","39551d9b694cd4fec703e661ca08bd5f":"Rayman Advance (Europe) (En,Fr,De,Es,It) (Beta)","39564bb823b7286ad977d6428a020e5f":"Space Hexcite - Maetel Legend EX (Japan)","3981044ebb25a3db6b6f5da9725e4f4e":"Dogz (USA)","3992a0d8089401553ce3478bd9863aac":"SpongeBob SquarePants - Battle for Bikini Bottom (USA)","399e38ffba58fccf07950791fae00539":"F-14 Tomcat (USA, Europe)","39a754c5e3f4c7624a26e5fa97a2d178":"LEGO Racers 2 (Europe) (En,Fr,De,Es,It,Nl,Sv,Da)","39a7715143dcb10b6e56427bea2f7333":"Home on the Range (USA) (En,Fr)","39bf2bbb87fb25e3c4df8475ee527199":"Pinobee & Phoebee (Japan)","39d7f5579beafc2d3cfb0485c5be3bdf":"Lord of the Rings, The - The Third Age (USA, Europe) (En,Fr,De,Es,It)","39de567a848af58c088c621c89007c4e":"SD Gundam Force (Japan) (En)","39e615ddc9695deb0dab06dbd98b7841":"Totally Spies! (Europe) (En,Fr,De,Es,It,Nl)","39f8a42133df444eeb7bf0b2194d6286":"Megaman - Battle Network 2 (USA)","3a1325d0afa9ec59246673fb01878a09":"Lilo & Stitch (Europe) (En,Fr,De,Es,It,Nl)","3a2206f7fdcb36034d9fff753964f201":"Midnight Club - Street Racing (USA)","3a32fd98b065283d09eeba1ce0542888":"Pokemon - Sapphire Version (USA, Europe) (Rev 1)","3a502cdb8f2d8e6e0e3b07685b50fa7e":"Bokujou Monogatari - Mineral Town no Nakama-tachi for Girl (Japan)","3a64d744d25a221e3f10099a5d55f155":"Ant Bully, The (USA) (En,Fr)","3a74fce97f1ea2b28c2a50ec3df0acee":"Dragon Ball Z - Buu's Fury (USA)","3a79fe76fefaee55cd4bea89940f5b73":"Futari wa Pretty Cure - Arienaai! Yume no Sono wa Daimeikyuu (Japan)","3a7afb15fc88683bbe93b9486abdeb21":"Superman Returns - Fortress of Solitude (USA, Europe) (Beta)","3a7de010d9d7bb209fe8c8670ed97fec":"Guru Logichamp (Japan)","3a7ebdeab05e826241cf19e3a064c664":"Hudson Best Collection Vol. 2 - Lode Runner Collection (Japan)","3a869b3d813a1ea0bb4c828b106f05b3":"Uranus Zero EV (World) (En,Fr)","3a92a2d56665a8aa1640fc276095659a":"Harry Potter and the Order of the Phoenix (USA, Europe) (En,Fr,De,Es,It,Nl,Da)","3aa4f5bd135064deba3394215d4c560d":"Dungeons & Dragons - Eye of the Beholder (USA)","3ac5633408cb7ac50247cdba396c5536":"Banjo-Pilot (Europe) (En,Fr,De,Es,It)","3b0dae8cd1dd848fe201f7cbaf94ced1":"Pac-Man Collection (Europe)","3b11e4cef56904bbd309690a3ca4f79f":"Crash Bandicoot Advance 2 - Guruguru Saimin Dai-panic! (Japan)","3b3cdb2583a22769fb80bae6b334dc81":"Banjo-Kazooie - Grunty's Revenge (Europe) (Beta 1)","3b3db67a969c970421af875adacb5efa":"Final Fantasy I, II Advance (Japan) (Rev 1)","3b4b6b130e527beffed75f5bfc66552b":"Another World (World) (Fr) (v1.2)","3b4b980b9031056501cfbfb7f8064df8":"Bionicle - Maze of Shadows (Europe) (En,De) (Rev 1)","3b4e5e2e7bea27f7f0089277670b7f2c":"MLB SlugFest 2004 (USA)","3b50b9f9e13e271ead33ee5a234650a9":"Mario & Luigi - Superstar Saga (Europe) (En,Fr,De,Es,It)","3b58275a454884b6fa70fa007544c998":"Egg Mania (USA) (En,Fr,Es)","3b6875ab215097e8210b618a2aef1a60":"Razbitume! - Restez Branches! (Europe) (En,Fr)","3b7a7175d8bdd4a54c41e7d0be54c6db":"Hikaru no Go 2 (Japan)","3b953c03dcc4276324b9bf95624f1c6e":"Incredible Hulk, The (USA)","3b9f6aee661c62a576b3d18058ebd813":"Dora the Explorer Double Pack (USA)","3bae05647bbee8565e3993fade2ca5ba":"Shining Soul II (Japan)","3bb63215dc9dc1ed394c9a4e2cd632dd":"Gyakuten Saiban 3 (Japan)","3bb6b3f488281c23460a717b71faa366":"Megaman - Battle Network 3 - White Version (USA) (Virtual Console)","3bc985416f6229eb8c51457c51a64f6d":"Casper (Europe) (En,Fr,De,Es,It,Nl,Pt)","3c1304ad6651e0e2c2d6741d949e4a31":"One Piece - Ilgop Seomui Debomool (Korea)","3c29c1a26c74b8b1511e17fdd66956a6":"Tetris Worlds (Europe) (En,Fr,De,Nl)","3c4895800d08531f190aaba0f92c6fca":"2 Games in One! - Marble Madness + Klax (Europe) (En,Fr,De,Es,It)","3c629e441d4842ccb9d05e1c91853f80":"Kim Possible 3 - Team Possible (USA) (En,Fr)","3c64ee4d89db9c12bc8f1cf329785cf8":"Hugo 2 in 1 (Europe) (En,Fr,De,Es,It,Nl,Pt,Sv,No,Da,Fi,Pl)","3c68616a3a2a29733bf1aacbebca01a9":"GBA Jukebox (USA)","3c971ea747a4bbdbd305c6f85c1c99ff":"Pokemon - Version Rubis (France)","3ca08a13ed9bcd779bf5da07645f3e38":"Tokimeki Yume Series 1 - Ohanaya-san ni Narou! (Japan)","3cc4c3494a707402f53fc6b6e770994a":"Rayman 3 (USA) (Beta)","3cc5e954f8adc6d313c44da31e3f8a5c":"Boulder Dash EX (Japan)","3cd35ae85906bfea4bb5a46a5e7879bc":"Sakura Momoko no UkiUki Carnival (Japan)","3cebd1599fbc2cbea21bc940445e8f2c":"Pokemon Pinball - Ruby & Sapphire (Japan)","3ceccc2582e3c35c5d729ae508dd465f":"Ford Racing 3 (Europe) (En,Fr,De,Es,It)","3cf63f7903dc07cc6b0aff9efab0886a":"Robot Poncots 2 - Cross Version (Japan)","3d0e221788ad9a43ba96c8b429e2cfc4":"Stepper (World) (v1.9)","3d1f1a4dbe50b9ec4c83c323ee7cca7a":"2 Games in 1 - Columns Crown + ChuChu Rocket! (Europe) (En+En,Ja,Fr,De,Es)","3d72e4064493e22aa7bd61a6e5b9e2dd":"Pro Action Replay (Japan)","3d7ebddc227ba7f37bb6c3cf473afaf9":"Bounty Hunter X (World)","3d803864b58e1f842dd7ac944a52367a":"everGirl (USA)","3d8fcfa27f2a659ab5f3ab0d70b9c99d":"Waliou Xunbao Ji (China)","3dac0a2fb322eebbdad45ecc1ec8a943":"TMNT (USA) (En,Fr,Es)","3db6fe46ecc0f553ee9bcf9ed3eadb10":"Deadly Skies (Europe) (En,Ja,Fr,De)","3dd4126b95d3796201149ecde2eeeb9d":"Premier Manager 2005-2006 (Europe) (En,Fr,De,It)","3dec7104aeceebf699f74845e95dd30f":"Ping-Pong Diplomacy Advance (World)","3dedf95b5692abf4a3487bb2500dd566":"Qui Veut Gagner des Millions (France)","3df76eb314f21144d2d68758c11dea5f":"Doom II (Europe)","3e1b2065b3837c14ffbd03fe205fdfd7":"Pokemon - Ruby Version (USA, Europe) (Rev 2)","3e25ac6ba3d53bc318e020341a271b07":"Super Mario Advance 4 - Super Mario Bros. 3 (USA) (Rev 1) (Switch Online)","3e4a2e644d21654e1e5c68baa9115df9":"Monsters, Inc. (USA, Europe)","3e7d93eab70699a9509d3d08bd71db87":"Drawing a Leviathan (World)","3e96ed2991e696db50a279e2854c0be5":"Hey Arnold! - The Movie (Europe) (En,Fr,De) (Beta)","3eac9cd691229b16662a9e124c8fbf66":"Muppet Pinball Mayhem (Europe)","3ec6b4cd475b62b2351a1b5ea6772311":"Prince of Persia - The Sands of Time & Lara Croft Tomb Raider - The Prophecy (Europe) (En,Fr,De,Es,It,Nl+En,Fr,De,Es,It)","3ecb36c34b0a441bad7a628760575e0c":"Defender (USA)","3eda36856917a9ab80b9bb7a930be834":"Pac-Man World (USA)","3edf62c20e5c70401c3fa78ef6489055":"Street Racing Syndicate (USA)","3edfda206746dbfd0fcce525b8d7684a":"Building Bomber (World)","3ee8e61dfe10bbfc15f51fd52eef8e14":"Puyo Pop (USA) (En,Ja)","3ef47e1b3a85631ffdc60483950a35dc":"Famicom Mini 12 - Clu Clu Land (Japan)","3f1cb5398649ff0c43673e73cad3010e":"Lion King, The (Europe) (En,Fr,De,Es,It,Nl,Sv,Da)","3f2ecf77ac2a4255eef044c4ed4e2146":"Anguna - Warriors of Virtue (World) (v0.93)","3f5048ea5102f72aa65ac307f1cf8b8a":"Zoids - Legacy (USA) (Beta 3)","3f729eba45634801650d0ca02e2ad0bf":"AirForce Delta Storm (USA) (En,Ja,Fr,De)","3f78374401030fbbc41fb8b9b6d3a99f":"Arthur and the Invisibles (USA) (En,Fr,Es)","3f78d5830cd83c8c77406cf1d5b26462":"F-Zero - GP Legend (USA) (Proto 1) (Netcard)","3f8a30aa55bf6eb8ed4e7fd9528f61e3":"Medabots - Rokusho (USA)","3f925ce53e5be7627638b7d3df80947e":"Lilliput Oukoku - Lillimoni to Issho Puni! (Japan)","3f988d8651e3eb45c4f3b6f41d4373b4":"Incredible Hulk, The (Europe) (En,Fr,De,Es,It)","3f9ea1e569fc4405974537224bd522cb":"Revenge of the Smurfs, The (Europe) (En,Fr,De,Es,It,Nl)","3faf3e72406462a47821172f48f3dc0b":"Licca-chan no Oshare Nikki (Japan)","3fb865c5f142a8fc1f82105bfc6b8935":"Sonic Advance 2 (USA) (En,Ja,Fr,De,Es,It)","3fba6cb4144501bb21fd89789d21b23b":"Robot Poncots 2 - Ring Version (Japan)","3fbc7fda7d0bbaa03ec037e710cf1dd8":"Driv3r (USA)","3fda0c02e17c83b4b71487b13780816c":"Smuggler's Run (Europe) (En,Fr,De,Es,It)","3fe499f2a6b141ec2959e2d109e3f321":"Harry Potter and the Prisoner of Azkaban (USA, Europe) (En,Fr,De,Es,It,Nl,Da)","3ff6f06de88f0646e8cf85181ca2e10d":"Soccer Mania (USA, Europe) (En,Fr,De,Es,It,Nl,Sv,Da)","400ead5c0c15be96de3ebacda5eedda7":"Creatures (Europe) (En,Es,It)","40124ea3efa3dbffe94ba752121375e1":"Duel Masters 2 - Kirifuda Shoubu Ver. (Japan)","40264b9c9eab1b8d1cdf834dbc05f16e":"Pferd & Pony - Mein Pferdehof (Germany) (En,De)","40265e0ccea58b86fa17f010a7e4d91f":"Konjiki no Gashbell!! - Makai no Bookmark (Japan)","4075c0553f360e180cf9efc899b1d8bc":"Animaniacs - Lights, Camera, Action! (Europe) (En,Fr,De,Es,It)","407870e802a39ef43d96e1b211bc6936":"Daredevil (Germany)","4081d5667d931445a0a26153100e9fc3":"Castlevania (Europe) (Castlevania Advance Collection)","4088fad3d25305c46072b8865e095eef":"Tony Hawk's Downhill Jam (USA)","408abffa368f995d122792bf1dbbcbc1":"Expedition der Stachelbeeren - Zoff im Zoo (Germany)","409d1eeb0117eba7c767be2fcf7226e8":"Work Life (World) (GBA Jam 2024)","40c8453a2289ff974114ebb0f3db4f1a":"Medarot G - Kabuto (Japan) (Virtual Console)","40f90b4f45a78c1810c59eb066201638":"Minna no Soft Series - Minna no Mahjong (Japan)","411574e9119177482dc07449962a904a":"Advance Guardian Heroes (Europe) (En,Fr)","4133d617f0a38053682fefb3ae752f6b":"Densetsu no Stafy 3 (Japan) (Rev 1) (Virtual Console)","41349a272e07ff38ff3a8009188ba326":"Himawari Doubutsu Byouin - Pet no Oishasan Ikusei Game (Japan) (Rev 1)","415ce33cab064fb6bb2961bb91ba26ea":"Sonic 3 - Fighter Sonic (USA)","41775d2c536152c8142089d692e24149":"Ayu Ayu Panic Advance (World) (v1.02)","41832956ab0723ca79d6883c4492fe84":"Crash Nitro Kart (Europe) (En,Fr,De,Es,It,Nl)","41a75032e074d588cd043cdd73bd9019":"Tiger Woods PGA Tour Golf (Europe) (En,Fr,De,Es,It)","41ae841d5771e442f7fb5393906cb898":"Gyakuten Saiban 2 (Japan)","41c45028c30a5f0241f5b479a954c745":"Earthworm Jim 2 (USA)","41cb1bcbd023024670bdadc4af092261":"2 Games in 1 - Disney Princesas + Lizzie McGuire (Spain)","41fabd164c0e4102c0187329e9f52c5c":"Megaman - Battle Network 3 - Blue Version (USA) (Virtual Console)","4206b6b611755dbc1557586f4077dd6c":"Hello Kitty - Happy Party Pals (Europe) (En,Fr,De,Es)","4209612a3d19c7b4cee87807e8f30d5d":"BeatBeast (World) (GBA Jam 2024)","420a1cf3e052ec30d3612d7d945c525e":"Broken Circle (Europe) (En,It) (Proto)","420ec4a917822cba68286448d2399390":"Green Memories (World) (v1.2.0)","42322e4ffcb66a6acfe340642bdc8705":"Garfield - The Search for Pooky (Europe) (En,Fr,De,Es,It) (Rev 2)","4235dbfac776ac1d3c391c740ce28892":"Ice Age (USA) (En,Fr,Es)","4261ad698a20c73552ba8b75d184a4c9":"Rescue Heroes - Billy Blazes! (USA)","426846f424d7463a86f637fdb1765080":"3 Games in One! - Super Breakout + Millipede + Lunar Lander (Europe) (En,Fr,De,Es,It)","426a1353d8ec1d3f2e11f1f0ee943fdc":"Dogz 2 (USA) (Rev 1)","42c232aaab6f088e339953d94a91e6bb":"Shaman King - Legacy of the Spirits - Soaring Hawk (USA)","42cca53c94c0bb8e5146631945bf0cd9":"Hamtaro - Ham-Ham Heartbreak (USA)","42d90bcebc174ad8ce7553071a881079":"Varooom 3D (World) (GBA Jam 2021)","42f9a789ccc93fb5ccfd63f086f5094d":"Bouken-ou Beet - Busters Road (Japan)","42fbeb32909935b02ce9f8826c86df03":"Misfortune Advance (World)","43265d5f7709133927133a331b55c61b":"Fantastic Children (Japan)","4328abd6ef7ffe7c75323db46b91ebdd":"Tak - The Great Juju Challenge (USA, Europe)","433ce4c6d525c74e3e60cdc197f6abfb":"Breath of Fire II (Europe)","434af1b315a2a337313ac82c3de078ff":"Disney Princess (USA, Europe)","436325c0208b757b2efd50e894d8d1c7":"Angel Collection 2 - Pichimo ni Narou (Japan)","43849ed3425271e56e183d6b6999dfb7":"Zhuanzhuanbang Tiantang (China) (Proto)","438be22c9e03529e2a03779a00d17b62":"Tak and the Power of Juju (USA)","43906c58afaf0760f62ec698ef10eafc":"Pokemon - Saphir-Edition (Germany)","4398aa3e3d1f826a99f5286efda20488":"Mickey no Pocket Resort (Japan)","43add71f5171685444fe591415ffae05":"Hot Wheels - World Race (Europe)","43ba75f70dc113f7f72c2ce2e7b639bb":"Legendz - Sign of Nekuromu (Japan)","43ccab5d3761e9964500a454fdf6776b":"Banjo-Kazooie - Grunty's Revenge (Europe) (Beta 2)","43cf1c2b7601db441295f12c538ae3a3":"Petz Vet (USA)","43d5d773bd64e23615c0b84a40a3d443":"Unglaublichen, Die (Germany)","43dca05b7766662a4fe5a46e81f3592d":"2 Games in 1 - Monsters, Inc. + Finding Nemo (Europe)","440c87000424a33d6c2a77b570d2d643":"No No No Puzzle Chailien (Japan)","4411d6ac05f6e818a16409894d1ec943":"Agassi Tennis Generation (USA)","441b09d96ad9daec72086c99639df063":"Super Street Fighter II X - Revival (Japan) (Virtual Console)","442bab94b7b3ba7e4a8799d18de52731":"Dragon Ball - Advanced Adventure (USA)","4445a111ace93ec2920a1eb1dd5accab":"Legend of Spyro, The - A New Beginning (Europe) (En,Fr,De,Es,It,Nl)","4462ba1869564537610250d522287815":"VeggieTales - LarryBoy and the Bad Apple (USA)","447bd53611ad8cf526895ccb46303f03":"Samurai Deeper Kyo (Japan)","4481174ebb5dc407f2bcb5fcb0c01bee":"Sangokushi - Koumeiden (Japan)","449832ada23c6bc79d1cd3978c5d9420":"Kidou Senshi Gundam Seed - Tomo to Kimi to Koko de. (Japan)","44a36f758c4328aa0ffc91ec118cf28d":"Crazy Chase (USA)","44a73ff6ac352c860ebb08625d1abdb2":"Tottoko Hamutarou 4 - Nijiiro Daikoushin Dechu (Japan)","44c0354067483b5378cb28ebb1e3476e":"Kawa no Nushi Tsuri 3 & 4 (Japan)","44c77bcf2a866a1a76cf46bd979b64a4":"Barbie Software - Groovy Games (Europe) (En,Fr,De,Es,It)","44ca4a4867aa57b442c43798b209f640":"Medal of Honor Advance (Japan)","44faf5ba9c3025ad59f53e82c8243631":"Spyro Fusion (Europe) (En,Fr,De,Es,It)","45101202229f4f91ac1f8ead62fcbd8c":"Groove Adventure Rave - Hikari to Yami no Daikessen (Japan)","451ad2324cce205bab6913abd02e5f1e":"Adventures of Jimmy Neutron Boy Genius vs. Jimmy Negatron, The (Germany) (Beta)","451c80dd3dc1f1455829219e3c550be0":"Double Pack - Sonic Battle & Sonic Advance (Japan) (En,Ja,Fr,De,Es+En,Ja)","45256cfa2c1f404cc91e6d5c34d1d4ce":"Monster Rancher Advance (USA)","4529b2bfb0b9a2303c45bfc7f15f466e":"Super Collapse! II (USA)","4564fc48460af11378ab12d5f181b219":"Frogger - Kodaibunmei no Nazo (Japan)","45743f2f955f66284775cb3c23cc46e8":"Little Patissier - Cake no Oshiro (Japan)","45880f41cfe125320e65b76bb05edaaa":"Ten Pin Alley 2 (USA)","458f1b31b305d4dccdab13be203411e0":"Best Friends - Hunde & Katzen (Germany) (En,De)","45b5c3afa9a3ada4b84eece117ed29b7":"NEONnoir (World)","45e326abf113e3b265c99fa031fdced0":"Tennis no Ouji-sama - Aim at the Victory! (Japan)","45e6e3088c5c9006175aaf045e8795e8":"SpongeBob SquarePants - Creature from the Krusty Krab (USA)","45f0b97050a666ce7ab4e3960929f47b":"Atlantis - The Lost Empire (Europe) (En,Fr,De,Es,It,Nl)","45fb38af8d17edd3bd14171d5fe3ab0e":"Breath of Fire II - Shimei no Ko (Japan)","4605b16d7d9162a77e26c090ab7a28da":"Frank Herbert's Dune - Ornithopter Assault (Europe) (En,Fr,De,Es,It) (Proto)","4638c9c0c1234d70aeb4f75099b46e47":"Anguna - Warriors of Virtue (World) (Patreon)","463ecb0def4606ca8f63071e3b1798ec":"GBA Grand Prix (World) (GBA Jam 2024)","46599031ef71117c587bd3666c326c07":"Advance Wars 2 - Black Hole Rising (USA)","468fba45dbd02710705e3fdbddb3a6df":"Strike Force Hydra (Europe)","469b5b94dd8e223a5fa1cd04e4e4c1dc":"Minna no Soft Series - Tetris Advance (Japan) (Rev 1)","46d2a77e4fd8429e6b7bf79c0679770e":"Klonoa Heroes - Densetsu no Star Medal (Japan)","46d567b74f28661ee1aeed38ff453285":"Winter Sports (Europe) (En,Fr,De,Es,It)","46e6cc0beebb0df7077540866ab98bf3":"Spider-Man (France)","46ed4e547f7b96a029c345870ce42380":"Doubutsu-jima no Chobigurumi (Japan) (Rev 1)","473c1f5bd97f5f96a5b19f3e18121d81":"Samurai Jack - The Amulet of Time (USA, Europe)","47433c75ddd92985b8807002136e8e9d":"Daisenryaku for Game Boy Advance (Japan)","47464b466905280cf769a6945bbac3da":"Flushed Away (Europe) (En,Fr,De,Es,It)","4754aa1e077cea418c77198270895013":"Hello Kitty Collection - Miracle Fashion Maker (Japan)","47596db5a16556c60027e7bf372ec917":"Pocket Monsters - FireRed (Japan)","4773e33b53acafe58f37c7d095c519fa":"Battle Network - Rockman EXE 2 (Japan) (Rev 1) (Virtual Console)","4781a8e513de51ab90292c321ac34374":"Banjo-Kazooie - Grunty's Revenge (USA, Europe)","478debc8b8ac10f23a67196180da8050":"Sitting Ducks (Europe) (En,Fr,De,Es,It,Nl)","479cb924baec02b8cb63a3f4838cdf17":"Premier Manager 2003-04 (Europe) (En,Fr,De,It) (Rev 1)","47cdd40b09021b6a7283e37b94185979":"Starsky & Hutch (Europe) (En,Fr,De,Es,It)","47e02ac1a4cc0d5f7441426469015dd7":"Stadium Games (USA)","47fe0fe1ee054ac37e286fb909e49be0":"Magical Quest 3 Starring Mickey & Donald (USA) (En,Fr,De)","480117b99ff0ce0934d5f4e3b5a952b4":"Pocket Dogs (USA)","482e89458d0154ec7231e98c61378c0a":"Street Jam Basketball (USA, Europe)","484128abb48b33871c909403c90b9b04":"Gadget Racers (USA)","487704c5d9978e88e8468d127561948c":"Proud Family, The (USA)","48822a0b1d0d90b842f6ee1c80ab08c1":"Sanrio Puroland - All Characters (Japan)","48910413ebae82c218f847a78463fbae":"Hudson Best Collection Vol. 6 - Bouken-jima Collection (Japan)","4891433baa0335ddfb0753d453ee65ab":"Dragon Ball Z - The Legacy of Goku II (USA) (Beta 2)","48c61d315e295f3e666a84c8d064f9e7":"S World 3 (World) (Beta 2)","48d7f169a879773bab490c4c1a9dfd5b":"Driv3r (Europe) (En,Fr,De,Es,It)","48d89fe21745e62460d22354111ea6e0":"2 in 1 Game Pack - Shrek 2 + Shark Tale (USA)","48df7cdc6444d804cedf290a6edd048f":"Pippa Funnell 2 (Europe) (En,Fr)","48f3bc6bf59c34f057bd98b29fd7b848":"Kurukuru Kururin (Europe)","48faeeb4917a9a9721d3d8769f4f4fb5":"Tanbi Musou - Meine Liebe (Japan)","49309e80a5acf7a4d452f6ad88238581":"3 Game Pack! - Ker Plunk! + Toss Across + Tip It (USA)","4959e99cbec8fec7e2144a14eae386d0":"Ultimate Spider-Man (Europe)","49682b2d7fb8a0953f7a88a7fd33eb73":"Toadally Awesome (World) (GBA Jam 2021)","496e1d4c049692f0ace43ec3eefc708e":"Disney Sports - Soccer (USA)","4984c5fc1e916516728521d4e5e16036":"Mario Golf - Advance Tour (France)","4990745ba11881cf35a4c860faa7038d":"Pro Tennis WTA Tour (Europe)","49a2135d9680e86ed881bf1458fe4746":"Lemony Snicket's A Series of Unfortunate Events (USA, Europe)","49a391deb9f730720ee93727144b0be6":"Rezal (World) (GBA Jam 2024)","49aa688745111aaa51076a345f8f18c3":"Shining Soul II (Europe) (En,Fr,De,Es,It)","49c6c446c5f7bc6b61e158994f8896b0":"Scooby-Doo 2 - Monsters Unleashed (Europe) (En,Fr,De,Es,It)","49c7089c334873020caf17da6579fadb":"Army Men - Sarge's Heroes (USA, Europe) (Proto 5)","49cbbfd3e38a5a7162e9b2aae5d56695":"Robot Wars - Advanced Destruction (USA) (Beta)","49dac3774e92dc924bd4fcee69f3f7e1":"Star X (Europe) (En,Fr,De,Es,It,Nl)","49e1af3afe0f16cd695def502120b380":"Lara Croft Tomb Raider - The Prophecy (Japan)","49ecc8ef1988e7ae81fbda1b4cf71eed":"Sonic Advance (USA) (En,Ja)","4a0e450c74e3e07f261a9a8f5624b788":"Sound of Thunder, A (Europe) (En,Fr,De,Es,It)","4a15b07b4dc292e9003c377c55372287":"Spyro - Attack of the Rhynocs (USA)","4a28daa8f0c619ad90ca97b3b941353d":"DemiKids - Dark Version (USA)","4a4a77b12b463a758a143642f96b1846":"Hamtaro - Rainbow Rescue (Europe) (En,Fr,De,Es,It)","4a56abd9722a5767b493b7e9bdb45c28":"Fire Emblem (USA) (Virtual Console)","4a5a274a7c2514b21ebb43b2ceade091":"Cubix - Robots for Everyone - Clash 'N Bash (USA)","4a5d8e686d55829d54a03fda8d6887d7":"Castlevania - Aria of Sorrow (Europe) (En,Fr,De)","4a6a7498b3be68b67c323b57fd8ac0d5":"Spyro Advance - Wakuwaku Tomodachi Daisakusen! (Japan)","4a7edee1aafebdcc97ee01909f14a7c7":"Metal Max 2 Kai (Japan)","4acb75f06293b30690e98740cf3e3f81":"Chicken Shoot 2 (USA)","4ae4e0d477327ce2c1e79373e1b1ca70":"JGTO Kounin Golf Master - Japan Golf Tour Game (Japan)","4b1a5897d89d9e74ec7f630eefdfd435":"Mario & Luigi - Superstar Saga (USA)","4b2678e47717c23ca7d27101662beaa6":"Doraemon - Dokodemo Walker (Japan)","4b4d0e642c8b299f3d7d1298acb0bddb":"Bomberman Jetters - Game Collection (Japan)","4b59ceea0351defb6eb4bad1dcfb38bd":"Rockman Zero 2 (Japan)","4b5aee04f0f61c5ef9343524bd2ac1d4":"Alex Rider - Stormbreaker (USA)","4b67d4ede1720fd4827af6e7ebf3c6e6":"Midnight Club - Street Racing (Europe) (En,Fr,De,Es,It)","4ba18d1ebadb424b3b944ae75dd322f0":"2 Games in 1 - Findet Nemo + Findet Nemo - Das Abenteuer Geht Weiter (Germany) (De+Fr,De,Nl)","4ba8bf225317bd0f51d8487b0a428460":"Oddworld - Munch's Oddysee (Germany)","4bb1d95611b7cfdada71f2b6a4bf961c":"Oriental Blue - Ao no Tengai (Japan)","4bda2a3e0249dfd09330dabc3aa20978":"Aladdin (USA) (En,Fr,De,Es)","4bf83da83d572a0b60613767bb23e0ac":"Naruto - Ninjutsu Zenkai! Saikyou Ninja Daikesshuu (Japan)","4bfccb544dc5f02581cc574859a82bcb":"Trick Star (Europe) (En,Fr,De,Es,It)","4c083f328ed63a20cd865f3b942e52e7":"Matantei Loki Ragnarok - Gensou no Labyrinth (Japan)","4c2cdf7e90226f7ead473b1a2c67fbe6":"James Pond - Codename Robocod (USA) (En,Fr,Es,Pt)","4c3f934ea0a5c9683a8c82fa57ff1c00":"Mary-Kate and Ashley - Girls Night Out (USA, Europe)","4c56e0d7fd251ab8ebe562c25e0ddfdf":"Rock 'N Roll Racing (Europe)","4c57eb408a29a61d7c0c3f9e2cfa15eb":"Metal Slug Advance (Japan)","4c5c302d02ecfcd274dae63461a1692b":"FIFA Soccer 2005 (USA, Europe) (En,Fr,De,Es,It,Nl)","4c67c2e4202fcf805e3bb006853ca677":"Quiere Ser Millonario (Spain)","4c84df7f486bf96316e73cd655c0f46b":"Blackthorne (Europe)","4c863f423cd8052bb3d780da001745b0":"Finding Nemo (Europe) (Fr,Nl)","4cba219bcca2320ebf9c33410b6becde":"Freestyle Scooter (Europe)","4cbcecf6c44ae7376dcaa446a95d6e2e":"Kessaku Sen! - Ganbare Goemon 1, 2 - Yuki Hime to Magginesu (Japan)","4ce8a88300a6d1efa22e34271c60fc64":"Pac-Man Collection (Japan) (En)","4d01ff5d60cfd19a61fd062efdbce0e0":"BB Ball (Japan)","4d3e531abcbbe530c0543c91d1d7d63f":"Pokemon - Versione Rubino (Italy)","4d424166fab5fe230b46793f8659e8a5":"Pitfall - The Lost Expedition (Europe)","4d5bd1475fb898e5be99b85aa45f77fa":"BattleBots - Beyond the BattleBox (USA)","4d5f240b6a56582f7743287726e6242b":"Power Pro Kun Pocket 4 (Japan)","4d7b955b9c19b13d1d776e35ce007f78":"Pac-Man Pinball Advance (USA)","4da06e60c419238f114ca2c632a094c5":"Castlevania (Europe) (Virtual Console)","4daf3d378d5f91277f43a5555829fdc7":"2 Game Pack! - Hot Wheels - Stunt Track Challenge + Hot Wheels - World Race (USA, Europe)","4db9e72d1867b8f4f745d54486bb6cf4":"Advance Wars 2 - Black Hole Rising (USA) (Virtual Console)","4dba5a79f79b2ce6189a02ce8a0d4fed":"Atomic Betty (USA, Europe) (Beta)","4dbf397ffdad3cf7e2b23cdadec02539":"Star Wars - Jedi Power Battles (Europe) (En,Fr,De,Es)","4dd5e72f942a921d3fe53d21a39f4cba":"Pokemon - Blattgruene Edition (Germany)","4df2176d0f881b309b9077d18a422f00":"Golden Nugget Casino (USA, Europe)","4e1565aa1f0627c2bf5e51019440cb70":"Dragon Ball Z - The Legacy of Goku II (USA)","4e17057f495446ea4ae146405a957309":"Finding Nemo - Aratanaru Bouken (Japan)","4e1b65a22eddc145fd7efecabff0282e":"Monster Force (Europe) (En,Fr,De,Es,It)","4e46dd3ae5c9c70c49587d093517049a":"Ace Combat Advance (USA, Europe)","4e4a6a088e9506b3535acde4a9f9e17d":"Extreme Skate Adventure (USA) (Rev 1)","4e55749ad0da668f02b325cb259909bb":"Ninja Tower (World) (Proto) (GBA Jam 2024)","4e5fde12dbd0441150a9c177e545f56f":"Super Mario Advance 4 - Super Mario Bros. 3 (USA)","4e641232755d9c8cf08c7d678bf7c570":"Super Robot Taisen - Original Generation (Europe)","4e6e4e85ede139a629320dcf0613f4a6":"Naruto - Ninjutsu Zenkai! Saikyou Ninja Daikesshuu (Japan) (Rev 1)","4e822c3e31350a457da3b640bc05e3ad":"Gremlins - Stripe vs Gizmo (Europe) (En,Fr,De,Es,It,Pt) (Beta)","4e83f7679affc32f23b51deecdbc1138":"Drake & Josh (USA) (En,Fr) (Beta)","4e8b17bb4b77cd5568b678596c55a8bb":"Aggressive Inline (USA)","4e9d8454de262002a97dbedbda524731":"Napoleon (Japan)","4ea4146cbd7ae1995475192de7c2fc42":"Turok Advance (Unknown) (Proto) (Bright Version)","4ea72eaad58ce47c8c914e8a72b78867":"Totally Spies! 2 - Undercover (Europe) (En,Fr,De,Es,It,Nl) (Beta)","4eaac54bc741daae77975b004376174f":"Harry Potter and the Sorcerer's Stone (USA, Europe) (En,Fr,De,Es,It,Nl,Pt,Sv,No,Da)","4eb435c43d7955e680355b94a6d39433":"Invader (Europe)","4ec51df6f2a3f65c0598827d3c757962":"Famicom Mini 17 - Takahashi Meijin no Bouken-jima (Japan)","4ec9300d15c45cf476705af1869c444e":"Onimusha Tactics (Japan)","4ee227a39ec91cb6d67a0828f999bd5e":"Final Fight One (Japan) (Virtual Console)","4ee4b6a61d28573502010df522a6ba91":"Mortal Kombat - Tournament Edition (USA) (En,Fr,De,Es,It)","4efb16f9d71758336db0afeb380859b0":"Bomberman Max 2 - Blue Advance (USA)","4f142c9621c9115d7107e7e6f02d99d3":"Mat Hoffman's Pro BMX (USA, Europe)","4f34ee4d9014cd0b9c6ae52df1f72af2":"Backyard Baseball 2006 (USA)","4f39dd42e67d2ef988336ef6d4bf19f0":"Super Street Fighter II Turbo - Revival (Europe) (Rev 1) (Virtual Console)","4f5f2463f25b4ee75b948c11d6312b91":"Ohanaya-san Monogatari GBA - Iyashikei Ohanaya-san Ikusei Game (Japan)","4f6338b585af7dd74fe5aad98e0ba176":"Antz - Extreme Racing (Europe) (En,Fr,De,Es,It,Nl)","4f69da882dd1b399cc9dda3b4681fec7":"Monster Trucks (USA, Europe)","4f6cff217f4941ee1c7e8d8cd082a477":"LEGO Island 2 - The Brickster's Revenge (USA) (En,Fr)","4f6d310cc67afaa9424269904229ea3b":"Tang Tang (Europe) (En,Fr,De,Es,It,Fi)","4f71a4e021f4b9319c9d4443dd710666":"Yu-Gi-Oh! - Reshef of Destruction (Europe) (En,Fr,De,Es,It)","4f7cbadb74dd6426f91429398eca5374":"SEGA Arcade Gallery (Europe) (En,Fr,De,Es,It)","4f7e62e01838cc6ca736a7b2e3dba495":"Tennis no Ouji-sama 2004 - Stylish Silver (Japan)","4f842f672b681abb0410464c762871c8":"Let's Ride! - Friends Forever (USA)","4f8f9ab44ef8c3503102c22dff34aa7a":"Famicom Mini 26 - Famicom Mukashibanashi - Shin Onigashima - Zen, Kouhen (Japan)","4f903fb4f60f42e8f12cf77475543738":"Slot! Pro 2 Advance - GoGo Juggler & New Tairyou (Japan)","4fb2b65a3388a137a681530ec11494e7":"Pinball Tycoon (Europe)","4fd3b43dc8d884ec63325d91eba0b384":"Minicraft (World) (v1.1)","4fe96ba189bc46167a95753e2f137b03":"Akumajou Dracula - Circle of the Moon (Japan) (Virtual Console)","4fed5f79cebfed5fdd67285074c8df3d":"Hero Core (World) (v0.1.2) (Beta) (GBA Jam 2022)","5036b4887c2a72fa5632dd4d19621cd3":"Medabots - Metabee (Europe) (Virtual Console)","503df54ce026cb71b6f6665d3ec50074":"Pia Carrot e Youkoso!! 3.3 (Japan)","5048d3110f72b4ba40f0b98936413a0b":"Open Season (Europe) (En,Fr,De,Es,It,Sv,No,Da,Fi)","504dc19d9f102f1f202ae76decb12998":"Rockman EXE 5 - Team of Colonel (Japan)","5054b1d5971b01a35e593048f5c43d49":"Angel Collection - Mezase! Gakuen no Fashion Leader (Japan)","50552a80c5d80210c941e4ad8230e814":"Barbie Superpack - Secret Agent + Groovy Games (USA)","5055f42473ed3f2977288181a460b963":"Animal Yokochou - Doki Doki Shinkyuu Shiken! no Maki (Japan)","5087e6801cf5269976968026127a3288":"Rayman - 10th Anniversary (USA) (En,Fr,De,Es,It)","508efc4282582038facdef65a57f70d9":"Tiny Toon Adventures - Scary Dreams (USA)","509139bb43b0fa487056e6068c46ab70":"Guilty Gear X - Advance Edition (USA)","509d45b60c2a974c508c428994338705":"Unfabulous (USA) (Beta 4)","509e3a1fe6284a75c84315a64bd33f43":"Tom Clancy's Rainbow Six - Rogue Spear (USA) (En,Fr,De,Es,It)","50a1089600603a94e15ecf287f8d5a1f":"Castlevania - Circle of the Moon (USA)","50a4ec7cc71ea0620629610e6306f299":"Pro Yakyuu Team o Tsukurou! Advance (Japan)","50c6dcc5065b594199d9fe8b764420a3":"ZooCube (Japan)","50c93eb8f7c477a5d5ef65c6842e5eeb":"F-Zero - GP Legend (USA) (Proto 11) (Netcard)","50d0ca20b90c0b2e46fe5a33d9ea6d8b":"Incredibles, The - Rise of the Underminer (USA, Europe)","50dc6c7ea18f906e0f1edad4dad8b442":"Avatar - The Legend of Aang - The Burning Earth (Europe) (En,De)","50f42c3690d985026252f3a90cc87517":"Pocket Music (Europe) (En,Fr,De,Es,It)","510747757a8d81422637656652be1c29":"SpongeBob SquarePants - SuperSponge (USA, Europe) (Beta 3)","51281c537425585fa0bcdad4cc0f9d35":"Anguna - Warriors of Virtue (World) (Retro-Bit Generations)","512dace284790f3a5ca14838459df5a6":"SSX Tricky (USA, Europe) (En,Fr,De)","5137fdf04021dc7817cb1be34b590adf":"Megaman - Battle Network 4 - Red Sun (Europe) (Virtual Console)","51455002b0daa27de8eaa5d9ad1afd6f":"Sims 2, The (USA, Europe) (En,Fr,De,Es,It,Nl)","51617256ac8453f10b9ed40e22a1aaf6":"Back to Stone (Europe) (En,Fr)","51664a136b5c9383258e58b384a8d9a8":"Tokyo Xtreme Racer Advance (USA)","5174f0efdb27136a8d2df79e8b932219":"Butano Fighter (World)","5179f3ae5ffb874cfbbd91a8940328e2":"GBA Tactics (World) (Proto) (NEO Coding Compo 2006)","517dde3abe8413fd0f7c21ca1bc222e3":"Pokemon - Aura Mew Distribution (Europe) (Kiosk)","5183d2ac230c5dbe614d96ab99c53922":"Bee Game, The (USA)","5186e20734061df457a430bbf963e5d9":"Disney Sports - Motocross (Europe) (En,Fr,De,Es,It)","51901a6e40661b3914aa333c802e24e8":"Pokemon - FireRed Version (USA, Europe) (Rev 1)","51a0ba2f158744619d486952f4ad01b0":"Super Mario Advance 4 - Super Mario 3 + Mario Brothers (Japan) (Rev 2) (Switch Online)","51cfc7008c7c32abd5a43eadf430a6e1":"X-Terminator Advance (Japan)","51f4450bcc65b30347805144b968c229":"Action Replay GBX (Germany)","521894f43a1cedd2b43210048e87c336":"GBA Asteroids (World) (GBA Jam 2024)","521d5e856a5420d69ff3b9752f106f7f":"PukuPuku Tennen Kairanban (Japan)","521f9ba996123f0ab3c4eef83754f48e":"Kawaii Pet Game Gallery (Japan)","52590c39a7c6793010ecfb9e17bb68a9":"Samsara Naga 1x2 (Japan) (Rev 1)","527153ae575aefe5e48ed9ccc191ba66":"Power Poke Dash (Japan)","528d272ae33823d8596f6471ddc411fb":"Van Helsing (Europe) (En,Fr,De,Es,It)","5294d185a38489831f0acb78aba1030b":"2 Games in 1 - Scooby-Doo! - Mystery Mayhem + Scooby-Doo and the Cyber Chase (Europe) (En,Fr,De+En)","52b14fb6f8d3d311bc708813e742f6e8":"Globlins! (World) (Demo 2) (MAGFest 2025)","52c07da7db84b23b687cac98499a95a4":"Total Soccer 2002 (Europe) (En,Fr,De,Es,It,Nl)","52c4b51860b0d33a3a2466c77589a315":"uCity Advance (World) (v1.0.1) (GBA Jam 2021)","52ef9fe877fcf5f5271af1985a275f33":"Polarium Advance (USA) (Virtual Console)","52f25a25ca0debb6aa708a1a2867f271":"Shanghai Advance (Japan)","53148c6e8c9f06ad9b576d5b6014dcc8":"Anguna - Warriors of Virtue (World) (Evercade)","531b1f6688e0c646b23f78d4019dd42e":"Strike Force Hydra (USA)","5323f95f70f5d4f21bed6ec000332bda":"Pocket Monsters - Sapphire (Japan)","533268ac99bc27456dda1fc423c56911":"Gachasute! Dino Device 2 - Phoenix (Japan)","534033fe98697b1cfb9336d718bc7421":"Mario Kart - Super Circuit (USA) (Virtual Console)","534b46bba804c9a81e9c20472c292e87":"Jurassic Park III - The DNA Factor (Europe) (En,Fr,De,Es,It)","53750c05649f7344a5e2fc62c6172c48":"Top Gear Rally (USA)","5383a0d8c214f3fa64e5d8f672f6c4aa":"Megaman - Battle Network 6 - Cybeast Gregar (Europe)","538d0758f7d09a03f6631466b4d5a317":"Robots (Europe) (En,Fr,De,Es,It)","53af7b05f0ec9c4770be9f74b8a232ac":"Mooncat's Trio (World) (Beta)","53b9e7eadc7c00e6d70929e938ec4d4b":"ChuChu Rocket! (Japan) (En,Ja,Fr,De,Es) (Virtual Console)","53bfc207dd7320ad7db94e299adca245":"Love Hina Advance - Shukufuku no Kane wa Naru Kana (Japan)","53cf5670a528ef46d6d240e6c6c0c9e2":"Advance Guardian Heroes (Japan)","53d1a2027ab49df34a689faa1fb14726":"Pokemon - Ruby Version (USA, Europe)","53d97150443e4449dc1959da641d1a8e":"Golden Sun (Spain)","53dcb149b4593fba9955f842889445b4":"Lord of the Rings, The - The Return of the King (USA, Europe) (En,Fr,De,Es,It)","53e67f535c69e7c95b696abfe1ce1a2b":"Danny Phantom - The Ultimate Enemy (Europe) (En,De,Es)","53f5f0797e2882b7f4fc3c5b202fb02e":"Decoder Cart (Japan) (En) (Pirate)","54024eb18ad484126ce84d30843e0b59":"Card Party (Japan)","540379fc48a27baafbd1571dea34c9da":"Tokyo Xtreme Racer Advance (Europe) (En,Fr,De,Es,It)","5405a66d7b053281e4d48afb1e31c270":"Megaman - Battle Network 5 - Team Protoman (Europe) (Virtual Console)","54068c4366ce9072837003184b361a68":"Mission Impossible - Operation Surma (Europe) (En,Fr,De,Es,It)","5423d3057e1806348dd1f959f0be94f9":"Zen-Nihon Shounen Soccer Taikai 2 - Mezase Nihon-ichi! (Japan)","542c75b45890dca1f893a1f400b9824f":"CT Special Forces 3 - Bioterror (Europe) (En,Fr,De,Es,It,Nl)","5479685bbb7459ba67159cf430c4274b":"J.League Pocket 2 (Japan)","54908586f380cc73cb9a9eeb5d07dd89":"Crash & Spyro Super Pack Volume 3 (Europe) (En,Fr,De,Es,It)","54a1ea59c39ff418af3b009cd1ecc6d6":"Maliou Kadingche - Chaoji Saidao (China) (Proto)","54a50dbaea5a9154cc820f3fc13a34bb":"Earthworm Jim (USA, Europe)","54ac1def7820beed364a38edb65e22f0":"Maliou Yu Luyiji RPG (China) (Proto)","54aecbd6193fa4306c371916f00ff6c6":"Garfield - The Search for Pooky (Europe) (En,Fr,De,It) (Rev 1)","54bc72ab1f56930ddb05c66f118d7608":"Duke Nukem Advance (Europe) (En,Fr,De,It)","54c109b8887bce3ebc7ff3455646fa35":"Monster Maker 4 - Killer Dice (Japan)","54d23b56027bf5555fdac1d11f3bb2c3":"Jimmy Neutron un Garcon Genial - L'Attaque des Twonkies (France)","54d7f45ef822d7485b623d46a636f2e7":"Megaman - Battle Network 2 (USA, Europe) (Virtual Console)","54db03f65d646ff884cc1ede2bf9f2e5":"Pac-Man Collection (Europe) (Virtual Console)","54e147b32160ac117fb1fdecefe35302":"Hamster Monogatari Collection (Japan)","54f4ee802df00b77617ed7e2e75c27c6":"Summon Night - Craft Sword Monogatari (Japan)","54f8b4748e5f0233bc28216a0188c968":"Zatchbell! - Electric Arena (USA)","550247e8a3045024392bcabc0ea124d2":"Superman - Countdown to Apokolips (Europe) (En,Fr,De,Es,It)","55198b6049bbc81860889039e93b464e":"Medarot Ni Core - Kuwagata (Japan)","552871de5cb6bbffb69a567c05a7a665":"Shark Tale (Europe) (Fr,De,Es)","55354d9e3bc9c1fa682b5110e5ed1544":"007 - Everything or Nothing (Japan)","5539d5a40407f017fe2999663fe919d5":"Rock'em Sock'em Robots (Europe) (En,Fr,De,Es,It)","553e8c9a80190617ec13fa2a06487f2d":"Iridion II (USA)","553f4cc7ea38a44642874a8501553e26":"ESPN Final Round Golf 2002 (USA)","55440b63727ca5d2ba26e5fe240d97ad":"Action Replay GBX (Europe) (En,Fr,De,It) (v3.1)","5557fb798b7e5b05016d8269ddb9e20b":"Atari Anniversary Advance (USA)","555821a2c6e7e91a712eacbe92922ff5":"Lord of the Rings, The - Ou no Kikan (Japan)","55666fb3c6b7ef0c4a2ec3f77969110c":"Donsol (World)","5578b19468ea4f4281e9d299d67777d8":"Shrek - Super Slam (USA)","55b8193f7a2e96d6af029e2411fe22cb":"Zone of the Enders - The Fist of Mars (Europe) (En,Fr,De)","55c14323547aa4f83e5eede98d0417f3":"F-Zero - Maximum Velocity (USA, Europe)","55dcbe18e02f7d2934c537508de532b6":"Megaman Zero 2 (Europe)","55e2ee8dd7a4a6574a1c8545b7d53fb8":"Megaman - Battle Chip Challenge (USA) (Virtual Console)","55e5315f7c8b8dd97482e90e111a1fba":"Arthur and the Minimoys (Europe) (En,Fr,De,Es,It,Nl)","55eed735151b69ef84e673ef8dc42aab":"Sum of All Fears, The (Europe) (En,Fr,De,Es,It)","55fee8b8f0b9185853f02c9e064436a9":"Crash & Spyro Super Pack Volume 1 (Europe) (En,Fr,De,Es,It,Nl)","56301febe066a6c4402a8af346b0426c":"Shark Tale (USA, Europe)","5635c7e6414aaa49e323436b6313af3a":"Total Soccer Advance (Japan)","563f3b87205c05e7167de68a99a80c4d":"Premier Manager 2003-04 (Europe) (En,Fr,De,It)","56424a475e1171e608fdaaf3883c3cf9":"Ty the Tasmanian Tiger 2 - Bush Rescue (USA, Europe) (En,Fr,De)","565edd5751fa8ca5f78e3ab732dc8f01":"Kid's Cards (USA)","567b56a215ff295aca69ac85c4f08273":"Rock'em Sock'em Robots (USA)","567c4e75646947464920559892e5747f":"Black Matrix Zero (Japan)","567fec94e59f8e546fcf5d1bf4576744":"Dr. Muto (Europe) (En,Fr,De,Es,It)","56915d1408e0cf7842d6c65b1735b90b":"2 Games in One! - Gauntlet + Rampart (Europe) (En,Fr,De,Es,It)","56ac080c6bb6ecbf8f8c052d29ca534c":"K-1 Pocket Grand Prix 2 (Japan)","56adf74cf74d987fd2a66c608026269f":"Zoids - Legacy (USA) (Beta 5)","56ae7f3683083a70fd36eb509e68845f":"Koala Brothers - Outback Adventures (USA) (En,Fr,De,Es,It,Nl,Pt,Da)","56c434600bf895c83a485ab8cbe49500":"Barnyard (USA)","56d29cad9e26f1d7465f803ed1d1426b":"Megaman - Battle Network 6 - Cybeast Falzar (Europe)","570a28cd1d5137e4ee061a9fc7986476":"Wagamama Fairy Mirumo de Pon! - 8 Nin no Toki no Yousei (Japan)","571dbfec3908d625676669ed68a8f530":"Dragon Ball Z - Supersonic Warriors (Europe) (En,Fr,De,Es,It)","5747df74932735205d090aa2ad1cfece":"Winnie the Pooh's Rumbly Tumbly Adventure (USA) (En,Fr,Es)","57709c330edf8fe50cc52ce5fbfeb2f6":"Shrek - Reekin' Havoc (Europe) (En,Fr,De,Es,It,Nl)","577a14ef8e3646a2a8b3f39d9beb199e":"Power Rangers - Wild Force (USA, Europe)","577e264b8b907c407e8d03dac71500c6":"Taxi 3 (France)","57918e55c3470bd8cdb885e7bb769e42":"Koukou Juken Advance Series Eijukugo Hen - 650 Phrases Shuuroku (Japan)","579b17924207e422490e5a1fe4a52aaa":"King of Fighters EX 2, The - Howling Blood (USA) (Beta)","57af4ca36d8036a483ae0d98c27bf544":"Shin Megami Tensei II (Japan)","57d3ac8d32b263592b600dc69939b973":"Simple 2960 Tomodachi Series Vol. 4 - The Trump - Minna de Asoberu 12 Shurui no Trump Game (Japan)","57ee08bdf1400798318d5cfa699d6aed":"SpongeBob SquarePants - SuperSponge (USA, Europe) (Beta 6)","580cc4c0a87dd4c40901ddadd90ca76f":"Rampage - Puzzle Attack (USA, Europe)","581120b8e9bbe9b3409ff219ee3d1b78":"Space Invaders (France)","58180e01eae5278b9a8dc355d80d21cd":"Sims 2, The - Pets (Europe) (En,Fr,De,Es,It,Nl)","581a071396ac05540d7f25109e711480":"Battle Network - Rockman EXE 3 - Black (Japan) (Rev 1) (Virtual Console)","582ad48ed874c3707abbd0967a3cc6aa":"Minority Report - Everybody Runs (USA, Europe)","5835092510d600f89b0a9d17c0543099":"Dragon Ball Z Fusion - The Legacy of Goku III (USA) (Beta 2)","58435342d4e82a203246a8f4717f79d1":"Join 4 Together (World) (Proto)","58495bb95bd130a980821fd1e8ca38b5":"Hamtaro - Ham-Ham Games (Europe) (En,Fr,De,Es,It)","584fa297b632cff5b54c2def93c0de2f":"Metal Slug Advance (Europe)","5856c031f9a9dc4c3e395fe336858d9d":"Razmoket, Les - Voler N'Est Pas Jouer (France)","585a0f57c4db96b18dbf15f9c0c2fa6f":"Drome Racers (Europe) (En,Fr,De,Da)","5871a808af6c07d5c3aa91af5ed113fe":"Cronela's Mansion (World) (Demo 2)","5871ed8e3984e4353f892761b4920ad5":"Power Rangers S.P.D. (Europe) (En,Fr,De)","58730677c902c5d19d155a2b2ea78921":"Space Evangelion (World) (Proto) (GBA Jam 2024)","58aabff30ffd1dcba6e01f7a542acc63":"Pokemon - Aura Mew Distribution (Italy) (Kiosk)","58d312653a7291637fa09d541544de88":"Guilty Gear X - Advance Edition (Japan)","58ef389491ad50b30ac508319440f685":"Rockman EXE 4 - Tournament Red Sun (Japan) (Rev 1) (Virtual Console)","5909daf13d2b2e2ec30723777e7654f4":"Princess Natasha - Student, Secret Agent, Princess (Europe) (En,Fr,De,Es,It)","59118d9b87b1809a1cb50b1d42035c7a":"xXx (USA, Europe)","5914890e4fa2157e4df5388a038730f1":"Castlevania - Aria of Sorrow (Europe) (En,Fr,De) (Castlevania Advance Collection)","59240da663c9537307a05e0a465da198":"Powerpuff Girls, The - Mojo Jojo A-Go-Go (Europe) (En,Fr,De,Es,It,Nl)","59287f4fb8d29bdc306e7f45b362cc4a":"2 Games in 1 - Monsters & Co. + Alla Ricerca di Nemo (Italy) (En,Fr,It+Es,It)","5931b0b58d9da9b9aa1f82d28643e2f2":"Shining Soul (Europe) (En,Fr,De,Es,It)","5952ee810c9d2a1203d6873b8004d24a":"Lemony Snicket's A Series of Unfortunate Events (Europe) (Fr,Es)","5964add1d23b22f8947fc3372bd18306":"Danny Phantom - The Ultimate Enemy (USA)","5969f2b6f8f15afedcdb695fd3554133":"Garfield and His Nine Lives (Europe) (En,Fr,De,Es,It,Nl)","596df9a6f24ed99fe5e064ffd9382726":"2 Disney Games - Lilo & Stitch 2 + Peter Pan - Return to Neverland (Europe) (En,Fr,De,Es+En,Fr,De,Es,It,Nl)","59a449254974f537c73fb10ed5246cfa":"Men in Black - The Series (Europe)","59aba4bba551aa20bf7726eba3af13fe":"Meet the Robinsons (Europe) (En,Fr,De,Es,It,Nl)","59aee0a5bc39a0a026dcde89d6ccd4a4":"Noddy - A Day in Toyland (Europe) (En,Fr,Es,It,Nl,Pt,Da)","59cbd3c4aec998b58fe947682ce16fe5":"Rayman - 10th Anniversary (Europe) (En,Fr,De,Es,It,Nl,Sv,No,Da,Fi)","59d0027f066b620b643eb1cf213be967":"Juezhan Sanguo (Taiwan)","59efe4673056b6385379b83883b30e47":"Animal Snap - Rescue Them 2 by 2 (Europe)","59f5cb9f76bbed3afcfa391943c17633":"Action Replay MAX (Europe)","59facfa52dc4730f506a3fe41466f657":"Space Invaders EX (Japan) (En)","5a0bd0ec784823f2c45fdaa5dd914bea":"Super Mario Advance 3 - Yoshi's Island (Europe) (En,Fr,De,Es,It)","5a20b7af9d051a12d80986a2980fc1c2":"Little Einsteins (USA)","5a20e35f872bcd5c4698b1af8bff7bd7":"Disney Sports - Snowboarding (Europe) (En,Fr,De,Es,It)","5a2e10190ca3f9cb1d3a954185a031ed":"Waliou Zhizao (China)","5a35ad68ad0aed07d7865c94dca2f61a":"Get! - Boku no Mushi Tsukamaete (Japan)","5a3db0c384d089bda397e395df4270f8":"Gunstar Future Heroes (Europe) (En,Ja,Fr,De,Es,It)","5a45ae003854f9aa9c91b8e12fcf3e8b":"Monopoly (Europe) (En,Fr,De,Es)","5a6f98ebca34b1d19870481dbe3e3089":"Spy Hunter (USA) (En,Ja,Fr,De,Es)","5a84a1d3e9db2c0a77b66b71f62d5120":"Jurassic Park III - Advanced Action (Japan)","5ac646626d2d311aeb585bf0dfd9fd91":"Fantastic Maerchen - Cake-ya-san Monogatari + Doubutsu Chara Navi Uranai - Kosei Shinri Gaku (Japan)","5acb3e54e801c0619092593dbf2d3eed":"Zoids - Legacy (USA) (Beta 8)","5acc75848bb1ffd3d6d8705554ee333d":"Megaman - Battle Network 6 - Cybeast Gregar (USA)","5ad0ed7f2bbda3dab28d29b59f01cade":"Knights' Kingdom (USA)","5ae021d162364f781f33a96cd9775e4c":"Dragon Ball Z - Bukuu Tougeki (Japan)","5ae5f07bd435a1bab5ad2d505aaaf035":"Rocky (Europe) (En,Fr,De,Es,It)","5af6a63f85fa386c7889695308dc32a4":"Shaman King - Master of Spirits 2 (USA)","5b1177362243e94a5838a345eb2064bf":"Elite AGB (World) (v1.4.1)","5b2675fb3b642cdbeb563672e96480c7":"Tony Hawk's American Sk8land (Europe) (Fr,De,Es,It)","5b2c0b980e224fef620f02437f3c9ff0":"Egg Mania - Tsukande! Mawashite! Dossun Puzzle!! (Japan)","5b2d4704ce570d89ae956025bd1036db":"Rhythm Tengoku (Japan) (Rev 1)","5b3dc1a03011107cceccd102305d9083":"Dan Doh!! Tobase Shouri no Smile Shot (Japan)","5b3fe36c1893e41b7a0df26765e190cd":"Worms Blast (World) (En,Fr,De,Es,It) (Evercade)","5b565a961547d6d0980c57e2529130e1":"Hamtaro - Ham-Ham Heartbreak (Europe) (En,Fr,De,Es,It)","5b60a8135aa25e5f10578ebff120a9d8":"Yoshi Sample (Japan) (En) (SDK 3.0) (Tech Demo)","5b62667bed44c033a2848fc1bd00271e":"F-Zero - GP Legend (USA) (Proto 4) (Netcard)","5b6370434292ee73812d4f10f51a0d9e":"Aka-chan Doubutsuen (Japan) (Rev 1)","5b7cba28b1295c4c6e74801dba32588d":"Fire Emblem - Seima no Kouseki (Japan) (Beta)","5b8d896f82745a6f246fce996c0fc570":"Famicom Mini 10 - Star Soldier (Japan) (En)","5b8eb6080ae3de50d9734daacd6b92fe":"TG Rally (Europe)","5bdcaa0761daea0708df736a3ac68f9c":"Digimon Sapphire (USA)","5be55d42de4290babd1f2b0e0126e1d7":"F-Zero - GP Legend (USA) (Proto 3) (Netcard)","5bec89f235c7a558f7f79d1760d648da":"Kim Possible 2 - Drakken's Demise (USA) (En,Fr)","5bf98eb8cc6247b4edf7b9b5b08dbab9":"Broken Sword - The Shadow of the Templars (USA) (En,Fr,De,Es,It)","5bfcfc20061ab866890eb72ca78aa7a4":"Driven (USA) (En,Fr,De,Es,It)","5c0cc78c521fb9d43a99f76b920980ab":"2 Games in 1 - SpongeBob SquarePants - Battle for Bikini Bottom + Jimmy Neutron Boy Genius (Europe) (En,Fr,De+En,Fr,De,Es)","5c1230403a28121a7235d3cda810e96a":"Calciobit (Japan)","5c155e99f04ed8eb1f76f1597967064a":"Barbie and the Magic of Pegasus (USA) (Beta 2)","5c332a3e712b41e8cf61240034b8d4c4":"Tron 2.0 - Killer App (USA)","5c4957b6d2a4d6095c1f119c57d806d4":"Hamster Paradise - Pure Heart (Japan)","5c76354506a11fe8883783fa3bd07e62":"Franklin the Turtle (Europe) (En,Fr,De,It,Sv,No,Da,Fi) (Rev 1)","5c9a6664da79a4893895fd0c380fd020":"Battle Network - Rockman EXE 2 (Japan)","5cbca58a164385a5b256fff5c27b7f38":"Ty the Tasmanian Tiger 3 - Night of the Quinkan (USA)","5cc9b8d313d1ee5ea7c994dc18f85b95":"Gachasute! Dino Device - Blue (Japan)","5cd8df1c60618ce05bb26302defb0b7b":"Bratz - Forever Diamondz (Germany)","5ce228ed956c5ad5f0bc95ecfbefc848":"Wannyan Doubutsu Byouin - Doubutsu no Oishasan Ikusei Game (Japan) (Rev 1)","5ce8d92ac33646da7bbba3a058b4be3b":"Inheritors of the Oubliette (World) (GBA Jam 2021)","5d07cc8a45eae858bea6dfc97f63e813":"Metroid Fusion (USA) (Virtual Console)","5d29999685413c4d2bec10d3160f6ee6":"Final Fantasy I & II - Dawn of Souls (USA)","5d31ffa72fdecf556cdff2d760274967":"Bouken Yuuki Pluster World - Pluston GP (Japan)","5d4f385e4e1cfa4a057d0ac828993906":"Tactics Ogre - The Knight of Lodis (USA)","5d515cc0623632f162cb27bb28bb0509":"Jurl (World) (v1.0c)","5d6028dbcf8e0cebb7aac36b520d94dc":"WarioWare, Inc. - Mega Microgame$! (USA) (Beta)","5d71f1153e7de86254234662770fb007":"Kaeru B Back (Japan)","5d73b3d3b4d2843365c0515e4e629f47":"Scan Hunter - Sennen Kaigyo o Oe! (Japan)","5d8477952ac38e7dfea3a56f7544809b":"Cross Town Heroes (USA)","5d8788e5f864d576846c5fbf0a4c827a":"Tekken Advance (USA)","5d9223837dc976e6756616324c5cd2cb":"Megaman - Battle Network 3 - White Version (Europe) (Virtual Console)","5dcec1e7f6e1cbf5283d8b245fd8e1b7":"Kid Paddle (Europe) (Fr,Nl) (Beta 2)","5dd27560673dd339f43584f8301a7364":"Tom Clancy's Splinter Cell - Pandora Tomorrow (Europe) (En,Fr,De,Es,It,Nl)","5dd58cbb9dec966deef37ea4ef14577b":"Dungeon Tactics Advance (World)","5defefbbbb67bd8fbca428d3ad2c5031":"Minicraft (World)","5e2e52c6bc979aa50efb59d9386faf08":"Smashing Drive (USA)","5e35371eaf3ad42844654216b28937a8":"Spyro 2 - Season of Flame (Europe) (En,Fr,De,Es,It) (Beta)","5e3fdbba47b4f3d06e95c1250eff44b3":"Green Memories (World) (v1.4.7)","5e42d25ee9c5c16a7169f1c5a35b9451":"Dexter's Laboratory - Deesaster Strikes! (Europe) (En,Fr,De,Es,It)","5e5295484bb4cff6c487ae06fa4c4c69":"Corvette (USA) (En,Fr,De,Es,It)","5e7f2849199ea37e6629b35948757d02":"Mario Party Advance (Japan) (Virtual Console)","5ea39a20a2afb038555f013142a2a97a":"Charlie and the Chocolate Factory (USA) (En,Fr,Es,Nl)","5ea3eec1d71c05f46321ce090ca791ee":"Hot Wheels - Velocity X (USA)","5eac207f6584cfe026e2094c82afcf8c":"Simple 2960 Tomodachi Series Vol. 1 - The Table Game Collection - Mahjong, Shougi, Hanafuda, Reversi (Japan)","5eb3415a5410a167b8e83de86d0495c0":"Skyland (World) (Proto 2)","5eba0ef1c24f1b003b3063beb808ce6c":"Alienators - Evolution Continues (USA, Europe)","5ebc0f4becb9e921af11a46653ff6d81":"Castlevania - Byakuya no Concerto (Japan) (Castlevania Advance Collection)","5ec5893b655a76a884f3a228e906ffaf":"Anguna - Warriors of Virtue (World) (v0.91)","5ede045a084ef5eeb5d46807bdf16d57":"Twin Series 4 - Hamu Hamu Monster EX - Hamster Monogatari RPG + Fantasy Puzzle - Hamster Monogatari - Mahou no Meikyuu 1.2.3 (Japan)","5ee1ad6dc6974ecfc9dc3cc93b17fbb0":"Overstorm (Europe) (Proto)","5eed126956c06a047b7098e0facd7067":"Boktai - The Sun Is in Your Hand (USA) (Sample)","5ef96047ca7d55f0fc3ab581d0b12d4d":"uCity Advance (World) (v1.0.2)","5f3567dd3487f600dd2962c2fe73844f":"Activision Anthology (USA)","5f412f4e7ed5603152bced92f5b6884a":"Duel Masters - Sempai Legends (Europe) (En,Fr,De,Es,It)","5f745975ca8b358d15d3aeedd432de56":"Morning Adventure, The (Spain) (Promo)","5f98ec175e2c67d3ba28504c1706dc07":"Lizzie McGuire 2 - Lizzie Diaries (USA) (En,Fr)","5fcadb94eeb7dd0b0ba775d9cff2c886":"Fantastici 4, I (Italy)","5fcd171900998007031fa54fdaf55268":"Gakuen Alice - Dokidoki Fushigi Taiken (Japan) (Rev 1)","5fe47355a33e3fabec2a1607af88a404":"Wario Land 4 (USA, Europe)","603470cb171bc53491b0a8643f1302ef":"Crazy Taxi - Catch a Ride (Europe) (En,Fr,De,Es,It)","605286b3aedeffba70bf46b834b120b1":"Super Mario Advance 4 - Super Mario Bros. 3 (USA, Australia) (Rev 1)","6055deb1d8e3cf3df590588a89c24975":"Konami Krazy Racers (USA) (Virtual Console)","605b89b67018abcea91e693a4dd25be3":"Pokemon - Emerald Version (USA, Europe)","60619052b2bfde557f3b873fe29ecf21":"Dogz 2 (USA)","6073270fd16bfbaa50d87dd1204bb607":"Jungle Book, The (USA) (En,Fr,De,Es,It,Nl)","60782a90b8d365bf0dbe723034f8b3da":"Looney Tunes Double Pack (Europe)","607cc417603b39c571e851eb4b498103":"Tokyo Majin Gakuen - Fuju Houroku (Japan)","607e314dbe861a2dbe444052ba32c4b5":"Fire Emblem - Seima no Kouseki (Japan)","608121040215b0f108ad3ca1e3c9cb61":"Mechanic Mechanica (Japan) (Proto)","6090bbe71705b8d3a9be397f51d29e12":"Medabots AX - Metabee Ver. (Europe) (En,Fr,De,Es,It) (Virtual Console)","60ac7a006e8a00581b832ceb8a000305":"Namco Museum (USA)","60b681a9c1b892f12d84278b1f7732e4":"Minna no Shiiku Series 2 - Boku no Kuwagata (Japan)","60beefde1c43e81c95cc30c20d1e85c0":"Defender - For All Mankind (Europe) (En,Fr,De,Es,It)","60c622e488935541ee0d7295bde1ff85":"2 in 1 Game Pack - Shrek 2 & Shark Tale (Europe) (En,Fr,De,Es,It,Sv+En,Fr,De,Es,It)","60eb386e45d38b41fa10cd2535f681d8":"Army Men - Operation Green (USA) (En,Fr,De,Es,It)","60eca5e9057972a76361158cc7ab31b8":"Naruto - Ninja Council 2 (USA)","60f4b5b05656dc3760a3eab6ced61e31":"Rockman EXE 4 - Tournament Red Sun (Japan)","6116d8cca2087fdaacbf6f4390c21ffd":"Silent Scope (Europe) (En,Fr,De,Es,It)","6129c86f94b5c7ed3c725cf2af593e56":"Demon Driver - Time to Burn Rubber! (USA)","612ca9473451fa42b51d1711031ed5f6":"Pokemon - LeafGreen Version (USA, Europe)","612f5672ae601b796db01dce034a5548":"Minna no Soft Series - Minna no Shougi (Japan)","6134d1e8b4794e073413657c98f8c82a":"Boboboubo Boubobo - Maji de!! Shinken Battle (Japan)","61540060f79a51a0c4f56ec9a6a638b2":"Kaze no Klonoa G2 - Dream Champ Tournament (Japan) (Virtual Console)","61623a55ac0ff4cb97db7c9a78a477ad":"Pokemon - Edicion Rubi (Spain) (Rev 1)","61657d0452f6b4f1da6e3583ddd15021":"Pocket Monsters - Ruby (Japan) (Pokemon Box)","616f80f482ade86d88021b41587aa600":"Rayman Advance (USA) (En,Fr,De,Es,It)","61755fb44da912fba53f41dbcd41f81f":"Justice League Heroes - The Flash (USA)","617b2b2590e2925228dbdb162b05d6f6":"Crash Bandicoot 2 - N-Tranced (USA)","61aa3eabb062688c15ce723546dfc0e8":"Star Wars - Episode II - Attack of the Clones (Europe) (En,Fr,De,Es,It)","61c2b1e42c45705bc19cb905ae25bd2d":"2 Games in 1 - The SpongeBob SquarePants Movie + SpongeBob SquarePants and Friends in Freeze Frame Frenzy (Europe) (En,Fr,De,Es,It,Nl+En,Fr,De,Es,Nl)","61d0616b30f8e111ccb68004be97d4eb":"Harvest Moon - Friends of Mineral Town (Germany)","61d4355a0731c3150c36b5a704173c70":"American Bass Challenge (USA)","61eb8c6b8da8e0edc327c5ea7bd3a000":"WWE - Survivor Series (USA, Europe)","6207cb2c18a77cc408c6e42cc7f0cf10":"Shin Megami Tensei - Devil Children - Honoo no Sho (Japan)","621be236403fd8e2fc15bf4c25985837":"GBA Personal Organizer (USA)","6222d8990b98dc3702ea6b1ccad50183":"Butt-Ugly Martians - B.K.M. Battles (Europe) (En,Fr,De,Es,It)","622addba536f937a1c5b66dddb20c8b7":"Super Puzzle Fighter II (Europe)","624a73d3cb69e50c0a1cc9de726083ec":"Super Black Bass Advance (Japan)","625b7485ca6ef9d497b8fa392f627cd0":"Choro Q Advance (Japan)","625d77a12509cd5635e357d89aadfa02":"Shin Megami Tensei - Devil Children - Koori no Sho (Japan)","627b22d7e3c4dbce8191c7765c58e17a":"Pinball of the Dead, The (USA)","627fb1625974c4d04e9e38ced12795ce":"Lara Croft Tomb Raider - The Prophecy (Europe) (En,Fr,De,Es,It)","629729db859ae2f3f744f5dcd6937766":"F-Zero for Game Boy Advance (Japan) (Virtual Console)","62977938536a270190bcb89ecd5c207d":"Mickey to Minnie no Magical Quest (Japan)","62a40ea4f49b7dfd192696732306fba9":"Shrek the Third (Europe) (En,Fr,De,Es,It,Nl)","62b5ee4401a0eec948817a69011e71d7":"High Heat Major League Baseball 2002 (USA, Europe)","62b84a21cff0c51dbeead301010dc5ef":"Franklin the Turtle (Europe) (En,Fr,De,It,Sv,No,Da,Fi)","62e016b66f9880a918b37f6e269f4d00":"notenogram (World) (v1.1)","62e32a9ccf6c31850041555cb8151440":"Megaman - Battle Network (Europe)","62e74f9b0928b578764e8f466dac412d":"Minna de Puyo Puyo (Japan) (En,Ja)","62f96deebe82b3b3fddf29f0d433b006":"Megaman - Battle Network 2 (USA) (Beta) (Debug)","6300ac165dca85a863c5346b8a23ede1":"Donald Duck Advance (Japan)","630a51526ddb738fdc8392aa1c2e6500":"2 Games in 1 - Brother Bear + The Lion King (Europe) (En,Fr,De,Es,It,Nl,Sv,Da)","630ea6281503e9c8f1d7632fa7871099":"Famicom Mini - Dai-2-ji Super Robot Taisen (Japan) (Promo)","63233c0e440c0b351ef902bfdbcf7b2e":"Blue Angelo - Angels from the Shrine (Europe) (Proto 1)","6332567f2823cf606d0259a586b012b4":"Detective Monroe - Murder at Sea (World) (GBA Jam 2024)","6341167e3c3212c632e7956cf0e69119":"Chocobo Land - A Game of Dice (Japan)","634c9f8f862ef0c5d3c7702db2fb252b":"Cinnamon - Fuwafuwa Daisakusen (Japan)","6385b15433d8cd369cadec45e5d5a783":"Camp Lazlo - Leaky Lake Games (USA)","638785b5576628fbd39d47756779130d":"Kong - King of Atlantis (Europe)","638f157064b6f57cc30d212068857b82":"Klonoa 2 - Dream Champ Tournament (USA) (Virtual Console)","63afe31b245c10c69e794e2a1d41366b":"Creatures (Europe) (En,Fr,De)","64082d14d8a4abe32fb8b062d9c0b9ed":"Barbie - The Princess and the Pauper (USA)","6408c0c1af0e89d5408970cfeb744644":"Tony Hawk's American Sk8land (USA)","6427ad3bb3d1617276d2fd0737e2d9e7":"Di Gi Charat - DigiCommunication (Japan)","643dadc449b6b43c78ecad898a0e0c83":"Wild, The (USA, Europe) (En,Fr,De,Es)","644712a277e801997624cece31b661a9":"Lord of the Rings, The - The Fellowship of the Ring (USA)","6449dc62cdf67c4d4d293febd38dcfda":"Zoku Bokura no Taiyou - Taiyou Shounen Django (Japan) (Rev 1)","6468bca90aacf0b1490c9f6d85de96ff":"Kid Paddle (Europe) (Fr,Nl) (Beta 1)","648d2ccd39bd233a841ceb966984fbab":"Monster Trucks Mayhem (Europe) (En,Fr,De,Es,It)","64a2d8dd1cfb869d4ad52c506819576f":"SpongeBob SquarePants - SuperSponge (USA, Europe) (Beta 2)","64b19adca4ba8ebfca983c39c7f21c8c":"Open Season (USA) (En,Fr,Es)","64c55e86bddba5c4671d2e90364f28bf":"Hello! Idol Debut - Kids Idol Ikusei Game (Japan) (Rev 1)","64ee9a205b96f5b2945e1594e8b6defd":"2 in 1 - V-Rally 3 + Stuntman (Europe) (En,Fr,De,Es,It)","64ffa9681130661c0d96f420da588005":"Ring Dash (World)","650140ccae6e1ab7af44c74986002375":"Metroid - Zero Mission (Japan)","65110a08ba48afa16c8693e88d62c10b":"2 Games in 1 - The Lion King + Disney Princess (Europe) (En,Fr,De,Es,It,Nl,Sv,Da+En)","6519cd2a2a4a4b35104502c3243279b2":"EZ-Talk - Shokyuu Hen 1 (Japan)","65295e47fa2bc35407211c331d8f6b7c":"Megaman - Battle Network 6 - Cybeast Gregar (USA) (Virtual Console)","6532702b7ed355f25f4ae6af3dc5ddea":"Paard & Pony - Paard in Galop (Netherlands) (En,Nl)","65389f698fd274e4b9a6b799fb6fbd2b":"Namco Museum - 50th Anniversary (USA)","653d319270776ce3b289c8bd14965c87":"Hobbit no Bouken - Lord of the Rings - Hajimari no Monogatari (Japan)","6540572ab503358a399861c909ee2012":"Golden Sun (France)","6544c0e0b23bb831ddf42895cfc6a528":"Scooby-Doo! - Unmasked (Europe) (En,Fr)","656b49e4db1a3ad6475b29c347a4fefc":"Banjo-Kazooie - La Venganza de Grunty (Spain)","656bec5f7d0e8389d7e6cd9cd95f1deb":"Tremblay Island (World) (Fr) (v1.1) (Solid State Version)","657823b16014bc265ab93757564e0be5":"Paard & Pony - Mijn Manege (Netherlands) (En,Nl)","65810971c9cc22e78f684cf9390a3d54":"Goldrunner (World)","65a9d554b74e8fbf06f3807e9d103bb8":"Mr. Driller 2 (Europe)","65f0e74f89304841252b598a708a65ff":"2 Disney Games - Disney Sports - Football + Disney Sports - Skateboarding (Europe) (En,Fr,De,Es,It)","65fb37341bb23e897deaa49e17ee3bc0":"Advance GTA (Japan) (En)","660b52e20c76807f03bb97bf49e15aa1":"Teenage Mutant Ninja Turtles (USA)","66211735e6762bdaa1213c9275877dab":"Zoids - Legacy (USA) (Beta 12)","662a615941bc1299de3f4cac0a6bec2d":"Lord of the Rings, The - The Return of the King (USA)","6632f33046615d90a891259d0b2678f9":"bit Generations - Soundvoyager (Japan) (En)","663bae5c5eb52177530b339441d48baf":"Ratatouille (Europe) (Es,Pt)","663ca15a48bbbc8303d52fa4664a012a":"Gem Smashers (USA)","6648a0484a56097ca75d6af87ebce225":"Pokemon - Feuerrote Edition (Germany)","665cd847efecf2a893ee74a9c42c26eb":"2-in-1 Fun Pack - Shrek 2 + Madagascar - Operation Penguin (Europe)","665f0fd0df241841961123ecf2ca73ba":"Mario vs. Donkey Kong (Japan)","6664b43c51935ea8f06f5b37ce83feca":"Sonic Advance 2 (Europe) (En,Ja,Fr,De,Es,It)","6667961aeaa0ea3e8211aa83cd1bcd11":"Action Replay GBX (Europe) (En,Fr,De,It)","6674a36645a801ce159766827ca6d8f0":"Ring Dash (World) (v1.0c)","66900cc9e3051638d89b364150b31acd":"F-Zero - GP Legend (Europe) (En,Fr,De,Es,It)","669c6124171c3dd81b5663fecae2376c":"Fancy Pocket (Japan)","669fbbd100f67d864a2028be1217719d":"Disney Princess - Royal Adventure (Europe) (En,Fr,De)","66b9f4c2c0025de207e1dc3a71340d5e":"From TV Animation One Piece - Mezase! King of Berry (Japan) (Beta)","66c0b2e21872f8e9af56292d881c1516":"Boktai 2 - Solar Boy Django (Europe) (En,Fr,De,Es,It)","66c238ea31904c09e2ee06bc465a8342":"Gremlins - Stripe vs Gizmo (Europe) (En,Fr,De,Es,It,Pt)","66e896522a91ecd1e45fde5e93920bf7":"Mighty Beanz - Pocket Puzzles (USA)","66ee915843d7f71dc99419cf589e7ae1":"iQue Video & Audio (China)","66f4a5a101822a779fdfecf366e73c96":"Snood (USA)","66f92eb2e15ba332fc613fbbecb5ffa5":"MazezaM (World) (v1.1) (NEO Coding Compo 2013)","6700959ee0f02eac47a8e273787efaae":"Super Real Mahjong Dousoukai (Japan)","6710e9e70fc995f7f7a7b8d66aa1863b":"Fairly OddParents!, The - Clash with the Anti-World (Europe) (En,De,Es,Nl)","6714ce5d3c2f6988776ec92e36b9ddda":"Sabre Wulf (Europe) (En,Fr,De)","671fc2e004f346eabf8d06c24daedd28":"2048 Pool (World)","67453491be57a22f8ddfb33c83b56ea9":"Medabots - Rokusho (Europe) (Virtual Console)","6745d2318412926b3e1118e83b8b1990":"SpongeBob SquarePants - SuperSponge (USA, Europe) (Beta 16)","677a6cc065d29722f5ce39cfecf863ec":"Robot Wars - Advanced Destruction (USA)","677bf7d4f8788fa5c505d5dd79309d69":"Isseki Hatchou - Kore 1ppon de 8shurui! (Japan)","678cff8d9901d9c7abedb2272968a74e":"Looney Tunes Double Pack (USA)","67a1411ea622631f469733ec01c89a01":"Yuujou no Victory Goal 4v4 Arashi - Get the Goal!! (Japan)","67b770405f7b87589e0342513b25fe9b":"Pokemon - Edicion Esmeralda (Spain)","67b7e6fab2a954aba194be3c60aeacee":"Super Donkey Kong (Japan)","67c69e7391f3a801e3f4f434206dd261":"Mike Tyson Boxing (Europe) (En,Fr,De,Es,It)","68101b735cdaf42c9eb51118b7f0d339":"Dog Trainer (Europe) (DS Cheat Cartridge)","6834ba555490be1dedae5b13f9be238d":"Simple 2960 Tomodachi Series Vol. 2 - The Block Kuzushi (Japan) (Rev 1)","6838eb5df807a0f3299ad76066d59d26":"Metal Slug Advance (USA)","68500bcbb838a9d361272f34fa20ce1a":"Finding Nemo - The Continuing Adventures (USA, Europe)","68616fe40d21d0a0d9d4b27659fc1faf":"Final Fantasy IV Advance (Japan) (Rev 1) (Virtual Console)","68817204a691449e655cba739dbb0165":"Megaman - Battle Network 3 - White Version (USA)","6889044339203f0bec9f20c478772079":"Strawberry Shortcake - Sweet Dreams (USA)","688caad7531ec6956aebbca88f07e857":"Backyard Baseball (USA)","68999d263abcf3274b5c7c7f95814b70":"2 Games in 1 - Disney Principesse + Il Re Leone (Italy) (It+En,Fr,De,Es,It,Nl,Sv,Da)","68a460a4face41897d483d3de367d809":"Backyard Sports - Football 2007 (USA)","68bdd417dd5bf3d1c88fd0b2a800e17c":"Tales of Phantasia (Japan)","68c38c871cb58802077d3ac695113f15":"Tsuukin Hitofude (Japan)","68d45d576023082a099526d5b384dd1c":"Virtual Kasparov (USA) (En,Fr,De,Es,It)","68d79f7c8f41f7c8009f3b85119cb1c6":"Megaman - Battle Network 5 - Team Colonel (USA)","68e4aa0650d2bec28c9ecc5bce7202bf":"Tristam Island (World) (v9) (Digital)","6912a215f310fa708f18e22c640cf221":"Galactic Quest (World) (Proto) (GBA Jam 2024)","69198ba531e06fa1cd9014d6d41ac0d4":"Fruits Mura no Doubutsu-tachi (Japan)","691ea58d7b3c1adb7c6e01792bd2d140":"Over the Hedge - Hammy Goes Nuts! (USA)","693bbcab772317e7e295a2b52dca175d":"Jazz Jackrabbit (USA, Europe)","6946574d398ca3ab0056af834bcb2bb3":"King of Fighters EX, The - NeoBlood (USA) (Rev 1)","6957bac168ff27f70df74629751b3f5c":"ChuChu Rocket! (Europe) (En,Ja,Fr,De,Es)","695db30277493070eb57d61c254cd2a6":"Bakuten Shoot Beyblade - Gekitou! Saikyou Blader (Japan)","69662d33f665b2e00e4f95aa75b16a6a":"X2 - Wolverine's Revenge (USA, Europe)","69a9f59169766cda7ebc29be820a78a3":"Prince of Persia - The Sands of Time (Europe) (En,Fr,De,Es,It,Nl)","69c1871ad475586884f8f438c8fdfa68":"Pitfall - L'Expedition Perdue (France)","69ce1adb9a8be5c49ca2044c97fa24cb":"Super Donkey Kong 3 (Japan)","69e2667db46cc5249bb26b6741b22519":"Get's!! Loto Club (Japan) (Proto)","69fa9eaec8026edb3eaeac72ade14457":"Mario Golf - Advance Tour (USA) (Virtual Console)","69fc21c7cebb4e81d0c9068fddd7b309":"American Dragon - Jake Long - Rise of the Huntsclan (USA, Europe) (Beta 5)","6a06b7c152538ce846fbdf523902a000":"Barbie in the 12 Dancing Princesses (USA)","6a0d1dd9bc181792f61f7c92262392c4":"Cruis'n Velocity (USA, Europe) (Beta)","6a1b056d8a006e069466c08c69de56c0":"Shining Force - Resurrection of the Dark Dragon (USA)","6a496546576101291a97a93846f0d9dd":"Spyro Orange - The Cortex Conspiracy (USA)","6a4f0c3e9d9024ebcaebc29cc3692559":"Rockman Zero 3 (Japan) (Virtual Console)","6a52067a659df5e992f4323965c06c27":"Relaxuma na Mainichi (Japan)","6a987dc5a8f0e87e1e055ee65f7e99c9":"Lion King 1 1-2, The (USA)","6a9f7047118ac9b10de1b570a9b8ea77":"Tennis no Ouji-sama 2004 - Glorious Gold (Japan)","6aa8f04421ad88f8f854fd0525b5a1a0":"Mahjong Keiji (Japan)","6abb6f0cae01053f54f2015bff2f3c0d":"Diddy Kong Pilot (USA) (Beta 1)","6ac288a44178e8061005f00fe2e564bc":"Nos Voisins, les Hommes (France)","6af04804f4fae08202becbbfc1cc9e98":"Harry Potter to Kenja no Ishi (Japan)","6b00a4d7d88bb4b78fc014cc50bce319":"Double Pack - Sonic Pinball Party & Sonic Battle (Japan) (En,Ja+En,Ja,Fr,De,Es,It)","6b0b7e5eea8bf6e981621da45d59163a":"Travis Pastrana's Pro MotoX (USA) (Proto)","6b0da7e87963d644d4ddaabe107f09bf":"Magical Quest Starring Mickey & Minnie (USA)","6b423fd7f0b4cc280a6208f66671a9c1":"Star Wars Trilogy - Apprentice of the Force (USA) (En,Fr,Es)","6b611dc9657c75d06808c198c4b51aac":"Whac-A-Mole (USA)","6b618c3fa5f38736632781b0a1ed2d23":"Backyard Skateboarding (USA)","6b658df91f3ffc3a97db7e2bf9753a16":"Polarium Advance (Europe) (En,Fr,De,Es,It)","6b69abb89c7b213ee1e864c99349f1b5":"Shiruike II - Yu Meiren (Taiwan)","6b77b1be67aecdb8964b4528573bcfc5":"Strawberry Shortcake - Ice Cream Island - Riding Camp (Europe) (En,Fr,De,Es,It,Nl,Pt,Da) (Rev 1)","6b9533f53075390cbb31078ba5d13346":"ESPN X-Games Skateboarding (Europe) (En,Fr,De,Es,It)","6b99728fa21d6c6442bd1ebe919affa7":"WinX Club - Quest for the Codex (USA)","6bcd924eec542998cc12b6c3533efb58":"Robopon 2 - Ring Version (USA)","6be741eea41598baeed52e4dd7ddb9f5":"King of Fighters EX 2, The - Howling Blood (USA)","6c03328f60bebf5b8444558c45a6eec3":"Dog Trainer 2 (Europe) (DS Cheat Cartridge)","6c09cbd11ae826b83fe54e3f99a17477":"Titeuf - Ze Gag Machine (France)","6c1359c2f5c4386c41b93eaf5534119b":"American Dragon - Jake Long - Rise of the Huntsclan (USA, Europe) (Beta 2)","6c1cd0e60faebda42b2804d749e351e2":"2 Games in 1 - Disneys Prinzessinnen + Der Koenig der Loewen (Germany) (De+En,Fr,De,Es,It,Nl,Sv,Da)","6c1de42661ca9ca859620753d8e12083":"Rocket Power - Beach Bandits (USA, Europe)","6c36961dc125f8507c941888640a0272":"Phantasy Star Collection (Europe)","6c3b602d9f8db3d36afb5c0046d01ba9":"Mario & Luigi RPG (Japan) (Virtual Console)","6c44b49d69e6c0576197742f20250c40":"Star Wars - Episode III - Revenge of the Sith (USA) (En,Fr,Es)","6c46a8915417f065ed1e209a02a4b1f5":"Dragon Ball Z Fusion - The Legacy of Goku III (USA) (Beta 1)","6c4adc19a909f934c7c01c4f889a12d9":"Dogz - Fashion (USA)","6c653de4749981579252e59fcae956d5":"Megaman - Battle Network 4 - Blue Moon (Europe)","6c6910864be012d8afe00364d6ddaa05":"Mirakuru! Panzou - 7-tsu no Hoshi no Uchuu Kaizoku (Japan)","6c8460b00a7dcade834b0579116771db":"Hachiemon (Japan)","6c8d2bdd88fd5778e3a84a51ef3f6c10":"Tremblay Island (World) (En) (v1.1) (Solid State Version)","6c923128bbe3baf6b242f58b8b1e4154":"Cinnamon - Yume no Daibouken (Japan)","6cb4dc8b610a4238a159a7037185540d":"Crouching Tiger, Hidden Dragon (USA) (Beta 3)","6cb83eee0a7d64542ce166cd6d50081a":"Digimon - Ruby and Sapphire (USA)","6ce00cd216c0b7c3d3abe895540480a9":"Zettaizetsumei Dangerous Jiisan - Shijou Saikyou no Dogeza (Japan)","6ce6741e0a522351047b79851cd2d651":"Mission Impossible - Operation Surma (USA) (En,Fr,Es)","6ce88b00f7ccf862f6386866dcc91558":"2 Games in 1 - Sonic Pinball Party + Columns Crown (Europe) (En,Ja,Fr,De,Es,It+En)","6ce9bb835428a17300fd191c7b9d8ece":"Prehistorik Man (USA, Europe) (En,Fr,De,Es,It,Nl)","6cf0014cf59609e976d4a82b01db90be":"SpongeBob's Atlantis SquarePantis (USA)","6cf0aca170ffe4141657c904f3924b9b":"Back to Stone (Europe) (En,Fr,De) (Beta)","6cff8b06c18dfafdc44a2c5725f6efe2":"Prince of Persia - The Sands of Time (USA) (En,Fr,Es) (Rev 1)","6d0aef7b4a8ab01db3c27284df771a81":"Colin McRae Rally 2.0 (USA) (En,Fr,De)","6d36b3e2ea32702bbe2c9ff16426a644":"Tron 2.0 - Killer App (Europe)","6d61c02022243c2f815e071f4a209f08":"Harlem Globetrotters - World Tour (USA)","6d676a8cb2d528a647e62110653418a8":"Summon Night - Craft Sword Monogatari - Hajimari no Ishi (Japan)","6d7d6cd0d1bde4855b230ad510e16771":"Iron Kid (Korea)","6d820b583b6ab2cc5c901d56b43e38cb":"Prince of Persia - The Sands of Time (USA) (En,Fr,Es)","6d8f418e5b5ef1929ca9518c34d0bde6":"Bratz - Rock Angelz (Spain)","6d9c1a92c3b43e833676e7a2fbc0c5fe":"Tekken Advance (Europe)","6da3b3fbe2049ecb796fc7486a7e140e":"Tantei Gakuen Q - Kyuukyoku Trick ni Idome! (Japan)","6db14ec7d0443807ecd615e72e12e0cd":"Formation Soccer 2002 (Japan)","6dbd1f78af20f0034a05c396db83b86f":"CT Special Forces (Europe) (En,Fr,De,Es,It,Nl) (Beta)","6dd162a103fb55ddf99b6e688019354f":"Kirby - Nightmare in Dream Land (Europe) (En,Fr,De,Es,It)","6dd36759f4b1229d2d66f1c28511417d":"Charlotte's Web (Europe) (En,Fr,De,Es,It)","6ddc7f2d8949448c198fc1183bcbcb0b":"Dragon Ball - Advance Adventure (Korea)","6decd38b78a1aab5b895c85a1d380bcf":"LEGO Bionicle (Europe) (En,Fr,De,Es,It,Nl,Sv,Da)","6defee926d517f2821dfb5e7e16eb565":"Sweet Cookie Pie (Japan)","6e1d30aec9ab1cc56a3740129d5ad75c":"Tennis Masters Series 2003 (Europe) (En,Fr,De,Es,It,Pt)","6e2fc7fc2915afb2c0f3a833c62f4c20":"Phalanx (USA)","6e39bac68382b18dbfe5c7dd548c9a16":"Biene Maja, Die - Klatschmohnwiese in Gefahr (Germany)","6e634bc67ce8e9afdaec1801e6c08b30":"Pokemon - 10th Anniversary Distribution (Italy) (Kiosk)","6e6a8f38f19cf0f98bc52c324143aa64":"Dragon Ball Z - Supersonic Warriors (Europe) (En,Fr,De,Es,It) (Beta 2)","6e76914fa33b3436079ac16ecf778d15":"Ecks vs Sever (USA) (En,Fr,De,Es,It)","6e7cab07891a9b580c228401120e8dd4":"Rockman EXE 5 - Team of Colonel (Japan) (Virtual Console)","6ea2c5e69ef027c80c54a6b231706fab":"Uno - Free Fall (USA)","6ea428eabf05d2c51ed21b5608c5db21":"Spider-Man (USA, Europe)","6ea5fc0e4b56a232ac3cbdab4b4a6bcd":"Final Fantasy Tactics Advance (Europe) (En,Fr,De,Es,It)","6ea76fbfa326b0b7fd31c5f6050f23ff":"SpongeBob SquarePants - SuperSponge (USA, Europe) (Beta 14)","6eb4a3639f10155ad9a09bbaf46144d5":"Final Fantasy I, II Advance (Japan) (Rev 1) (Virtual Console)","6eca1c34b7a0c04c78341687e5079717":"Famicom Mini 30 - SD Gundam World - Gachapon Senshi Scramble Wars (Japan)","6f152b5eb5292f837b2d75b101ee9d55":"Dual Blades (Japan)","6f16195283a6f16fc73c95c69f131b68":"Gradius Galaxies (USA)","6f1edd8d1a8091636a1685def759e602":"2 Games in 1 - Scooby-Doo + Scooby-Doo 2 - Monsters Unleashed (USA)","6f31f72e340681f2bb742097b7c593e8":"Cocoto - Kart Racer (Europe) (En,Fr,De,Es,It)","6f3245a38bb2eba60fd4af25429f1122":"Keroro Gunsou - Taiketsu! Gekisou Keronprix Daisakusen de Arimasu!! (Japan)","6f4148477f8d456c00c4099e990c2fb0":"Urban Yeti! (USA, Europe)","6f77e7bfa48f13113ed42aaafc791368":"2 Games in 1 - SpongeBob SquarePants - SuperSponge + SpongeBob SquarePants - Battle for Bikini Bottom (Europe) (En+En,Fr,De)","6f95dd3e97e52d41c5ba69adf8e506af":"2 Games in 1 - Disney Princesse + Le Roi Lion (France) (Fr+En,Fr,De,Es,It,Nl,Sv,Da)","6f9802a7094757a4e535f763ff9b7de4":"Medarot G - Kabuto (Japan)","6fd5903fb649cb05007052999f2bdbf3":"Tarzan - Rueckkehr in den Dschungel (Germany)","6fe31df0144759b34ad666badaacc442":"Megaman - Battle Network 3 - Blue Version (USA)","6ff16e52b08129b6bb1a650f9adfd603":"That's So Raven (USA)","7021a7a902f4b18d08839322d8bd9166":"Rick Dangerous (World)","70245e4d52cfb1af2533fedc6191dcb5":"Aladdin (Japan)","702adceec8c8ab1ee27917e75448bbf6":"Tringo (Europe) (En,Fr,De,Es,It)","7031e05fea8257a2658683436b0e3db1":"Cars (Germany)","7032afec42057ec6f0c8850d5d7531a9":"American Dragon - Jake Long - Rise of the Huntsclan (USA, Europe) (En,Fr,De,Es,It) (Beta 7)","70351a87511a012d5985d525cfc7baf2":"Himawari Doubutsu Byouin - Pet no Oishasan Ikusei Game (Japan)","704943bd18075740bc9157a34d8c612f":"Lode Runner (Japan)","70541c3e9c5d18b151a5d41c79134cc9":"Aleck Bordon Adventure - Tower & Shaft Advance (Japan)","706163c6ecdd4e595eb49cce8107d0fc":"Frogger - Mahou no Kuni no Daibouken (Japan)","70799d419a58f1055b3271587c04e204":"Forever RPG (World) (GBA Jam 2024)","70a33b660d40faeb7b43766cea189030":"Fanqiejiang Wangguo Da Maoxian (China) (Proto)","70a5faaf9b9bfe3bebd8ccff75a6155b":"Power Pro Kun Pocket 4 (Japan) (Rev 1)","70ed2328306fa863bf144b7fdcdbfdfd":"Boulder Dash EX (Europe) (En,Fr,De)","70f0e0ba86c9bc154a32e9d583963825":"V-Rally 3 (Japan)","70fa9e5d34134d1b46d9abdb43fea624":"Tales of Phantasia (USA, Australia)","7109869b364d162a673b25b5604ebb57":"AirForce Delta II (Japan) (En,Ja,Fr,De)","710ac1eb3062a922652505e055ecb7b1":"Shimura Ken no Baka Tonosama - Bakushou Tenka Touitsu Game (Japan)","71259fb2bf7adeb9b5d8c84619a2531e":"007 - NightFire (USA, Europe) (En,Fr,De)","7146102bb4d37865198dbe6881d2af9a":"Super Robot Taisen - Original Generation (USA)","7154c6dbd189d69598d1f50b533a3019":"Driv3r (Europe) (Es) (Beta 2)","718285dfbe8b0f7278b024762b5899f7":"Ougon no Taiyou - Ushinawareshi Toki (Japan) (Virtual Console)","71876e289c249135a87d326251bfe85b":"notenogram (World) (GBA Jam 2022)","7194f25da6be4548f7e0c80f73e3f628":"Sonic Battle (Europe) (En,Ja,Fr,De,Es,It)","719a2e779f51cbc92a5a81b1de6a99d4":"Metroid Fusion (Japan) (Virtual Console)","71b00ba406c522d3cec48311bd7bc760":"Megaman - Battle Network 5 - Team Protoman (USA)","71b728433530fd17f4a7f86e15309734":"Mario Golf - GBA Tour (Japan) (Virtual Console)","71c5d8e089d0c1b15b4e376515bd4f18":"Strawberry Shortcake - Summertime Adventure (USA)","71d13db41e98b9798e9aea3ab8867be4":"Brush Rush (World) (Proto) (GBA WinterJam 2023)","71dc8aef347427313f5cfa63986337b4":"Weekend Miljonairs (Netherlands)","71dffd1adcef71adf9d4ca089b08b6b2":"Famicom Mini 08 - Mappy (Japan) (En)","72018660652b494d553d41d5b1767f7e":"Jurassic Park III - Park Builder (USA)","720a562a8174c520ff1571c5e3223b39":"Monster House (USA) (En,Fr)","722051662ec02aa9ce30b934616063c2":"Super Street Fighter II Turbo - Revival (Europe) (Rev 1)","723ee616e311bd9f8584405637d9128c":"Bomberman Max 2 - Blue Advance (Europe) (En,Fr,De)","725464612806a42c2c15e455005a4ef9":"GT Racers (Europe) (En,Fr,De,Es,It)","725e49b6955589696462e8b65f62c2ef":"Winning Post for Game Boy Advance (Japan) (Rev 1)","72602c894450147ced8161ef48f784d8":"Tom and Jerry in Infurnal Escape (Europe) (En,Fr,De,Es,It)","728d2ba4fb710cc696e401f797ff1397":"Metal Max 2 Kai (Japan) (Rev 1)","729069ee00dad63007eb77cb892e4627":"Premier Manager 2004-2005 (Europe) (En,Fr,De,It)","729bf3ff498b73f09885ba38735a2858":"Bionicle Heroes (Europe) (En,Fr,De,Es,It,Da)","72f072d0e26a9e3d12b6107598cbaf69":"Yu-Gi-Oh! - Dungeon Dice Monsters (Japan)","7331deea4c627b772d7b271b3eabb7af":"Hamster Paradise Advanchu (Japan)","7335165118ee0eb99c3a911bd2f73ce3":"Contra Advance (USA) (Beta)","733e976fd06d65e9f5635b836a14a81b":"Super Mario Advance 4 - Super Mario Bros. 3 (Europe) (En,Fr,De,Es,It) (Rev 1) (Virtual Console)","735502d07870f82fd78fe07badeeb33b":"Kikaika Guntai - Mech Platoon (Japan)","7357dacd671dd3af8bd4a528d0f85493":"Battletoads (USA) (Proto)","739dd0f3a4dc829600643fd2c00fc23c":"Titi et les Bijoux Magiques (France)","73a3d8f718dd371836632b8e30df4de0":"Ochaken Kururin - Honwaka Puzzle de Hotto Shiyo (Japan)","73d90562373b2b0882354986aabdd61f":"Bruce Lee - Return of the Legend (USA)","73ddea9abd509f650addd4998e86976f":"Rockman EXE 4 - Tournament Blue Moon (Japan)","73eff6b21373100b28cc2f70f052a7d5":"Chip Advance (World) (En,Fr) (v2.1)","73f3cd746bca7763fa0452ffe04556f5":"F-Zero - GP Legend (USA) (Proto 6) (Netcard)","7406c224589f1a2f57feff5eb3c177c3":"Need for Speed - Porsche Unleashed (USA)","740f84915f53447d3afb111acdfb0677":"Shifting Gears - Road Trip (USA)","74439cfebabb5616fbc00c8f7f9f747e":"Three-in-One Pack - Sorry! + Aggravation + Scrabble Junior (USA)","74443f278fdf9931255035430632da3c":"4x4 Off-Roaders (Europe) (Proto)","7452f7a8e88435a3c4010262a78037e6":"Spider-Man (Germany)","74673493300b2e927c2a4198e7996a7a":"Super Mario Advance 3 - Yoshi's Island (USA) (Virtual Console)","747b6e33299deed3e9fe71c4352f5966":"Sitting Ducks (USA) (En,Fr,De,Es,It,Nl)","74965e4a985f8a27ae12d526c032daea":"Jajamaru Jr. Denshouki - Jalecolle mo Arisourou (Japan)","74d3fd11921e0cd02955a6b59fe75e0f":"Punch King - Arcade Boxing (USA)","74ea076a8976acc454312f8ecd40e566":"Hello Kitty - Happy Party Pals (Europe)","74ea809aea3e45d9638c2997bb5d0a3d":"Unfabulous (USA)","74eb3f183512c83c72473a6a03662e03":"Turok - Evolution (Europe) (En,Fr,De,Es,It)","7506c14af1c1e6b6e64a3ac393c4004d":"Jet Set Radio (Europe)","75119296de2c0024af1ae9c5542ab80a":"Ratatouille (Europe) (Fr,De,Nl)","7512e1d5b00d7d5feb8ec02d2e835ed1":"Dora the Explorer - Super Star Adventures! (Europe) (En,Fr,Nl)","7527b877dbfd93ab0466520ea58d6407":"Mr. Driller 2 (USA) (Virtual Console)","752ca5b3a76784e3261cb60af80a84e7":"Guranbo (Japan)","753971af89a797d2c0bad3198d56963c":"Cross Town Heroes (Europe)","756d21329f1f1f6d64001af203ff42b4":"Unfabulous (USA) (Beta 6)","759281beed4bfa975262fd49028efebb":"Megaman - Battle Network 5 - Team Colonel (USA) (Virtual Console)","75af521c08dea3eed23d31c002a3e47f":"Frogger's Adventures - Temple of the Frog (Europe) (En,Fr,De,Es,It)","75c1c26d74bf1ecd4e8c2d1e84db804f":"Salt Lake 2002 (Europe) (En,Fr,De,Es,It,Nl)","75ec8b0b1bc187f559b3571a0f0dfa4d":"Dogz (Europe)","75fca6eeccf730d5b9883fa333f6b268":"2 Games in One! - Gauntlet + Rampart (USA)","760490d2224d727b149eb47617d02a5e":"Final Fantasy Tactics Advance (Japan)","7612ee1da917451f53e634c09a7fe838":"Mr. Driller 2 (Japan)","761668b5d01ee9b8e52174eadb5fd2cf":"Super Mario Advance 4 - Super Mario Bros. 3 (Europe) (En,Fr,De,Es,It)","7618d824c146a521ecaad69d4b8443ea":"Deal or No Deal (USA)","762e95819d0ea7039df160ae6e8c5635":"2 Jeux en 1 - Titeuf - Ze Gag Machine + Titeuf - Mega Compet (France)","7637dee40a006fdb2fb47192ea203a04":"CHEESYchords (World) (GBA Jam 2024)","763fc686e0e12ddb53e0cf9c0f27854a":"SEGA Smash Pack (USA)","76418e6aafecfdf46400a6582ed1cd9b":"Army Men - Sarge's Heroes (USA, Europe) (Proto 2)","7642f18e0d52aaa52245d20692827de9":"Starsky & Hutch (USA)","76471b9410d123fe28bab047a4e4841e":"Whistle! - Dai-37-kai Tokyo-to Chuugakkou Sougou Taiiku Soccer Taikai (Japan)","765178ed4d402033ef7ed6b82d059f5a":"Pokemon - Edicion Verde Hoja (Spain)","766f6e0b917707f098faf6501207a94c":"All-Star Baseball 2004 (USA) (Beta 2)","76759e14e1a4072397c105419d702735":"Famicom Mini 24 - Hikari Shinwa - Palthena no Kagami (Japan)","76873c9aaaf31d1b6e520145bdd9a8a6":"Pro Mahjong Tsuwamono GBA (Japan)","7692b7d8c05131be5a632b043497b1d3":"Fuzz & Rocket (USA) (Proto)","76a7ea795f7797923016e348972195e7":"Skyland (World) (Proto 4)","76aad0726be3ac24f3c5a7a8e64379d3":"Spyro - Season of Ice (USA)","76bd3ac13808b1d6abea377815b10adb":"ChuChu Rocket! (USA) (En,Ja,Fr,De,Es)","76c21df8ccd134c578dbfdd2bf139479":"Pokemon - Doel Deoxys Distribution (Netherlands) (Ja) (Kiosk)","76cb4acb0c2a8076429e32ef4aa475d5":"Dragon Ball Z - Supersonic Warriors (Europe) (En,Fr,De,Es,It) (Beta 1)","76cccc133899422854687e672f335cbd":"Sangokushi - Eiketsuden (Japan)","76cdc3ec8b886f378ebc6de368399220":"Disney Princess - Royal Adventure (USA)","76cf35708da4293e14ba6bee572597e3":"SpongeBob's Atlantis SquarePantis (USA) (Beta)","76deaaafe8cd89891c8fb2d4e1b5deaf":"Dokodemo Taikyoku - Yakuman Advance (Japan)","76e7dac53db04f2b4fbc792659954c7d":"Tongqin Yi Bi (China) (Proto)","76ee3d4939d436a42c5982de9081b54d":"Castle Master (World)","76ff10072fbe28737918120c9021c741":"Next Generation Tennis (Europe) (En,Fr,De,Es,It,Pt)","76ff83e819c83f27f02fd4d59af155d7":"International Superstar Soccer (Europe)","776ae8434c5a946b19b91264b1f7da86":"Kawaii Pet Game Gallery 2 (Japan)","777aae9f6cb431fa3f2654bd1e3b1ef0":"Scurge - Hive (Europe) (En,Fr,De,Es,It)","778283248de1ae090a006f59e8596ba4":"Famicom Mini 29 - Akumajou Dracula (Japan)","778eb070e354caa92a1ba7e8b5d5df29":"Fairly OddParents!, The - Clash with the Anti-World (USA)","77b95f886779b5c82c726679c498ce09":"Crazy Taxi - Catch a Ride (Europe) (En,Fr,De,Es) (Beta)","77cf6a578131f4ccb2d94532a80e12ae":"Wanko Mix Chiwanko World (Japan)","77d05464a1ac01ef466f784c701828fe":"Winning Post for Game Boy Advance (Japan)","77e321bc21cbe892780d34863354116a":"Yumemi-chan no Naritai Series 3 - Watashi no Makesalon (Japan)","77edf4f506b3343e15efe61d64944eba":"Super Monkey Ball Jr. (USA)","77fdfc944c31ccb0270c73e801cc20b0":"Moto Racer Advance (USA) (En,Fr,De,Es,It)","7812b2e8a0ac8f77e8347d6499ab0160":"Rebelstar - Tactical Command (Europe) (En,Fr,De,Es,It)","78141df5f1af636a7f8225d15b14fc31":"Kong - The Animated Series (USA) (En,Fr,De,Es,It,Nl)","782ecbf2e6b30ea684b34ce3e21310da":"Famicom Mini 28 - Famicom Tantei Club Part II - Ushiro ni Tatsu Shoujo - Zen, Kouhen (Japan)","783fc5f14f1fc83a32a57f8a16a3ca8f":"Metal Warrior 4 - Agents of Metal (World) (v1.1)","7844309a174e721757f6149fc7de3af0":"SpongeBob SquarePants - SuperSponge (USA, Europe) (Beta 11)","784a036ff1aae709e90167186639b75e":"Mario Kart - Super Circuit (USA)","784b6d3c7eeb2c98078f5b7d7d637f75":"Castlevania - Akatsuki no Minuet (Japan) (Castlevania Advance Collection)","784e266e768506888dd0f656fd7cf715":"Foster's Home for Imaginary Friends (Europe)","78672ead9f35f00e467f8c7d308acdfc":"Contra Advance - The Alien Wars EX (USA)","786f7eb410874f57bc800117a172879c":"Famicom Mini 07 - Xevious (Japan) (En)","786fc5aff6a10efd3e3585ba10ebc863":"Manic Miner (Europe) (En,Fr,De,Es,It)","78724b3f7e5de9f1c931d5b196e7f19b":"Worms - World Party (Europe) (En,Fr,De,Es,It)","7875568eabab6210267bea6215306b22":"Lau Gurpil (World) (Demo 2)","78c34b8026991ab7b0a4990e1af5d9b5":"Beyblade G-Revolution (USA)","78db66a92f5f4405266e154de49eea8d":"Medal of Honor - Infiltrator (USA, Europe) (En,Fr,De)","78decb6a1cbed75cd7939884d2c52101":"Black Sigil - Blade of the Exiled (USA) (Proto)","78e7ff46ee220f8b6cff4a73c0439eb4":"Mortal Kombat - Deadly Alliance (USA) (En,Fr,De,Es,It)","78fda8ce4a49d92f1a7ef3cfd6ae7dfb":"Archer Maclean's 3D Pool (USA)","790e80ab14b2bfba6e4b18954f5ac5d6":"Dokodemo Taikyoku - Yakuman Advance (Japan) (Rev 1)","7914ea9bed5d6936cec9b1c240247bda":"Spider-Man 2 (USA, Europe)","79250ef146cefc22695aea4c80244649":"Famicom Mini Collection (China) (En) (Proto)","794c177c712c030bce32a85dda73cb36":"Bratz - The Movie (Germany)","799a13e6df8c577e5e49fb1f0b217a0b":"One Piece - Going Baseball - Haejeok Yaku (Korea)","79a3a7d6a5546e381de2ab17db6adb13":"Woody Woodpecker in Crazy Castle 5 (Europe) (En,Fr,De)","79aef9bbe1378adfbd688cd66e11a7be":"Bomberman Tournament (USA, Europe)","7a0a429dc61a06bbaf62d867910e50cb":"ATV - Thunder Ridge Riders (Europe) (En,Fr,De,Es,It)","7a36a7486ef2c534111ee417b8acf9b7":"Super Street Fighter II Turbo - Revival (USA)","7a5b0f8f5ccc714dc754cef30190159e":"Salt Lake 2002 (USA) (En,Fr,De,Es,It,Nl)","7a69b9897a61950f9acab26329a788e6":"Ab durch die Hecke (Germany)","7a710c9d170d28397cf36002cce4734d":"Nicktoons - Freeze Frame Frenzy (USA)","7a7d4faca339a80bf99e96df67c9ff24":"Men in Black - The Series (USA)","7a91b281a98eabf2150c0cee965a3066":"Perplexus Diodomin (World) (Proto)","7aa1b08460265c63d7807ebd3493082c":"Legends of Aereven Advance - Sleeping Azure (World) (GBA Jam 2024)","7aa3d0f0c73456c7500f1628767eceb7":"Classic NES Series - Metroid (USA, Europe)","7aa675f783554e6734239df89e2b7cbe":"Piglet's Big Game (USA)","7aa882a970083c9998f52bba98108d9a":"Ultimate Card Games (USA) (Rev 1)","7ab12db7382122998aaf2756dcbac498":"Shingata Medarot - Kabuto Version (Japan)","7ab3a2b98ce6a85bfa23bc8bb6ecadef":"Metal Slug - Super Vehicle-001 (Japan) (En) (Proto)","7ab8dcd02c665b442b6ddf6b3556e4e4":"Rockman Zero (Japan) (Virtual Console)","7ab9b3d99be1723ecedde1ed8d0f359b":"Bubble Bobble - Old & New (Japan)","7afcf95672d0652c09f77ccc1afcaf02":"Dragon Ball Z - Moogongtoogeuk (Korea)","7b002b8b76e19bfa13e4fd999f9cf9e4":"Chinmoku no Iseki - Estpolis Gaiden (Japan) (Virtual Console)","7b06540616a35ca1cf4465f1fabe50b6":"Rayman - Hoodlums' Revenge (Europe) (En,Fr,De,Es,It,Nl)","7b11c22d6e264000b10c49c6b8c3e15f":"Magic & Legend - Time Knights (World) (Beta)","7b17e51d5a61780f9823203c6254ed8f":"e-Reader (USA)","7b1b404ab1baa7ec549a29629c328153":"Yu-Gi-Oh! Double Pack 2 (USA) (En,Fr,De,Es,It)","7b279ff2f8f00274542386674384b1fc":"Contra Advance - The Alien Wars EX (Europe)","7b32379f139798165e161623745b7451":"Ultimate Card Games (USA) (Rev 2)","7b434547ef9ea4f55ad3885181d3cdd4":"Pferd & Pony - Best Friends - Mein Pferd (Germany) (En,De)","7b4572515ba81a85366a95383b785cad":"F-Zero - Climax (Japan) (Virtual Console)","7b7560f2c5d48e3a922d9637ae9e50a9":"Maya the Bee - Sweet Gold (Europe) (En,Fr,De,Es,It)","7b7889cf526b800182964798c7e3345e":"Bibi und Tina - Ferien auf dem Martinshof (Germany) (Rev 1)","7b79ad84814d56986566f49ab9de6423":"Max Payne (USA)","7b7a43f3ac4a3facc65aa6b616c0b887":"Fire Emblem (Europe) (En,Fr,De)","7ba10bec1582dc62d0a1ac742af9ab7b":"Defender of the Crown (USA)","7bb1cf407570534b2fb976792a2bbdda":"Dungeons & Dragons - Eye of the Beholder (Europe) (En,Fr,De,Es,It) (Beta)","7bb739ba35535f79bdb44e7161349ec1":"Elevator Action - Old & New (Japan)","7bbd6798acfbe798d1e458938afc7a1a":"Tales of the World - Summoner's Lineage (Japan)","7bce16d42e091bf43cdaa01054db6757":"Toukon Heat (Japan)","7bd5ae371d67113ad2c01109607b418b":"2 Games in 1 - Scooby-Doo! - Mystery Mayhem + Scooby-Doo and the Cyber Chase (USA) (En,Fr,De+En)","7bf03505899917879800ed8a4a6768b9":"Unfabulous (USA) (Beta 12)","7c1ac3a3b9f0948bbcc6d5b2afac860c":"Miteluode - Lingdian Renwu (China)","7c3dda9b4e34c5551e6413458792b9b3":"Dragon Ball Z - The Legacy of Goku II (USA) (Beta 1)","7c8e479f4c4e46f406b1da5e786358c0":"Onimusha Tactics (USA)","7c90ce3ef159fd17feca4c0f25de13f2":"Animal Yokochou - Doki Doki Kyuushutsu Daisakusen! no Maki (Japan)","7c970129793c2987574cbba45e12871b":"Spider-Man 3 (France)","7c9e0824a12cb0263330c43381791d64":"NFL Blitz 2002 (USA)","7cb3748cbf790d4e8b50926b28299153":"Madden NFL 07 (USA)","7cbfedc28a27fe3aee703b2444946946":"2 in 1 Game Pack - Tony Hawk's Underground + Kelly Slater's Pro Surfer (USA, Europe)","7cc95cffcb5835b1cde52c805be8461a":"Power Pro Kun Pocket 5 (Japan)","7d098e6eab2ee1cfebdb12e60ac609be":"Juka and the Monophonic Menace (Europe) (En,Fr,De,Es,It)","7d2c4f995b82825aa63fe224733d769b":"Spider-Man 3 (USA)","7d2e6bb7047468ed61f9c31c48c27eea":"Pferd & Pony - Lass Uns Reiten 2 (Germany) (En,De)","7d43ba3c4d15ebb5f45e6100c096fdf8":"Gekitou Densetsu Noah - Dream Management (Japan)","7d630c14f3b2c59e3a956be2ed1bc05a":"Elite - The New Kind (World) (v1.7.1)","7d7032d0e64b277f99c11f6c2d3a2289":"Lord of the Rings, The - Nakatsukuni Daisanki (Japan)","7d8682e1193f8c6d1b0eb9e182d3165e":"Ultimate Winter Games (USA)","7ddcf8a78366ad89e82fa8aa62b18777":"ESPN Winter X-Games Snowboarding 2 (Europe)","7dde4a9d879bad9a898a3e32903d406c":"Cars - Motori Ruggenti (Italy)","7df46d6dc76d9d84dbed120655d5f69e":"Crouching Tiger, Hidden Dragon (Europe) (En,Fr,De,Es,It)","7df5064abf8a26ee1733f98cbe146e7e":"Nebulus (World) (v1.2)","7e43ee7b00269d5f0fddb55e8bb747cc":"Payback (Europe) (En,Fr,De,Es,It)","7e4b22c8a115d33a30a3e130884cde5d":"Duel Masters - Shadow of the Code (USA)","7e7015a37c1a5aa3d1b626b2255d0b01":"Lilo & Stitch (Japan)","7ec49ec0fc1b5b53226d36cd9c0a646a":"Bakuten Shoot Beyblade 2002 - Ikuze! Bakutou! Chou Jiryoku Battle!! (Japan)","7ed736155cc3cc6b0efb314ffe7d2aae":"Minna no Shiiku Series 1 - Boku no Kabutomushi (Japan)","7f22c443ec71a696d84ae46a9fe61980":"SpongeBob SquarePants - Creature from the Krusty Krab (Europe) (En,Fr,De,Es,It,Nl,Sv,Da)","7f45b79856db3c928f25b30040b200de":"Crayon Shin-chan - Densetsu o Yobu Omake no Miyako Shockgaan! (Japan)","7f6bf3b4d84f113aa454136e5b53fd77":"Final Fantasy VI Advance (Europe) (En,Fr,De,Es,It)","7f92ca61a904f2902fa44b622ce2601a":"Babar to the Rescue (Europe) (En,Fr,De,Da)","7f9a6636189a1c57276ca6e0a352565b":"Tony Hawk's Pro Skater 2 (France)","7fa04c2a15d3561c9d2641aab6946d6a":"GameShark GBA (USA) (Alt)","7fc2aff8e9663f1613336ca662f5a112":"Sugar Sugar Rune - Heart Ga Ippai! Moegi Gakuen (Japan)","7fc96f1c2565f244c7dd561b6cbe43bf":"Crazy Chase (USA) (Beta)","7fca5f2c94769db36cacf8bc599f659e":"Scooby-Doo (Europe)","7fd1ec249c6145adb5c2e284513b8078":"Mahou Sensei Negima! - Private Lesson - Damedesuu Toshokan-jima (Japan)","7fee20a09c485433f51a97bfb468446c":"Fire Emblem - Rekka no Ken (Japan) (Beta 2)","8002d7d8251f8a200a9d50f107d48ffd":"Jimmy Neutron - Boy Genius (Europe) (En,Fr,De,Es)","80112ba773c8b8072502f46c1781561f":"Brother Bear (Europe)","80177651fac95135f205c00a5f8ae922":"Momotarou Dentetsu G - Gold Deck o Tsukure! (Japan)","803352465687ba57b7cce41ff7facb20":"X Zhan Jing (Taiwan)","80355c831a7a25b0f70dc021ebd344f1":"Harvest Moon - Friends of Mineral Town (USA)","803ff345f4df60a7f00db44fd25730bc":"Scooby-Doo! - Unmasked (USA) (En,Fr)","80648fa0cb4fbf49a68c810fc64edaaa":"Hi Hi Puffy AmiYumi - Kaznapped! (USA)","80826c4afcbad51231c8721118f13223":"King of Fighters EX 2, The - Howling Blood (Europe)","80acbed66f2f7a2fc88357f9a2028458":"WinX Club (USA)","80afdbf1fb3a1287b7745f1a7aa473b9":"Neoromance Game - Harukanaru Toki no Naka de (Japan) (Rev 1)","80e03339cd076a4f89c8b89653b45d8c":"Hunter X Hunter - Minna Tomodachi Daisakusen!! (Japan)","80e5dcfab9437202bb6e745095e78c95":"Cardcaptor Sakura - Sakura Card Hen - Sakura to Card to Otomodachi (Japan) (Rev 1)","8105a6012737aac2907b27e4a05ad794":"Sonic The Hedgehog - Genesis (USA)","81421240b15b1299416fe431074b571e":"Glacia Dungeon (World) (En,Es,Ru,Ro) (v1.5.2)","814cd6fb465041da0c39c40d89993339":"Magical Vacation (Japan)","81528aa0f4ababa9d4a6e1c71f6be3f5":"Gumby vs. the Astrobots (USA)","8158ab44dd56ea9fe8f1f1a582467e74":"Duel Masters (Japan)","816db888cae935e71a74a4ae6c461bee":"Super Dodge Ball Advance (USA)","8174d9620184763725f25e149b228e79":"Futari wa Pretty Cure Max Heart - Maji Maji! Fight de IN Janai (Japan)","819bb55012849a897b86237fa5114799":"World of Zoink (World) (GBA Jam 2024)","819c5498a8d6acfb847764e296ed9cdd":"Manga-ka Debut Monogatari - Akogare! Manga Ka Ikusei Game! (Japan) (Rev 1)","81a78ebff4713c80857482ac6956f52f":"CT Special Forces (Europe) (En,Fr,De,Es,It,Nl)","81cc6d957b21d039716751268f402fa8":"2 Games in 1 - Monsters en Co. + Finding Nemo (Netherlands) (En,Es,Nl+Fr,Nl)","81d2da1095b485ce783fe1acc144cefe":"American Dragon - Jake Long - Rise of the Huntsclan (USA, Europe) (Beta 3)","81df4456e398f87e893c522810cc8cda":"Dora the Explorer - Dora's World Adventure! (USA)","820a03dcd47b4d8aec4b09b6d0f95d56":"Virtua Tennis (Europe) (En,Fr,De,Es,It)","8220c6b2243aa64a2bd30e09c1d0436d":"With the Last Moonbeam (World) (v1.0.1)","822168fb70fd023a6e6008a59d54f99f":"Minna no Soft Series - Numpla Advance (Japan)","822cd888edfe00dea8cf75a848c64988":"Scrabble Scramble! (Europe) (En,Fr,De,Es,It,Nl)","822d86df5f0e5a04b051142a53f16820":"Twin Series 1 - Mezase Debut! - Fashion Designer Monogatari + Kawaii Pet Game Gallery 2 (Japan)","8246b72cb4b6872724836776c123cb55":"Dragon Ball Z - The Legacy of Goku (Europe) (En,Fr,De,Es,It)","82507fd4f17734ae8f48072cbd5ef4e2":"2 Games in 1 - Findet Nemo + Die Unglaublichen (Germany)","825bdd7778a8740bf04421164e233c39":"Famicom Mini 25 - The Legend of Zelda 2 - Link no Bouken (Japan)","82794e16ef8da4fe070d06b6aca248f8":"Unfabulous (USA) (Beta 1)","82f6103c5fc2315e7f11128b9940602f":"Super Dropzone - Intergalactic Rescue Mission (USA)","830d34040be2289d156228addc5972dd":"Doubutsu-jima no Chobigurumi (Japan)","83319d4f9e32e0ef5a5c1fc423f174d5":"Castlevania - Aria of Sorrow (USA) (Virtual Console)","833c3fac4ba420d0a3e4ade9184e2bf0":"Spider-Man - Battle for New York (USA)","833e55b181ac9b4da56b6341c1f4e09a":"Megaman - Battle Network 2 (Europe)","834c59c74efdd616ceb429832c06de31":"Captain Tsubasa - Eikou no Kiseki (Japan)","83511ed734d5bf842b9062ebc574a434":"Pac-Man World (Europe) (En,Fr,De,Es,It)","8364f53c818449f93687ec490cd90120":"Bionicle - Maze of Shadows (Europe) (En,De)","836c290e70dd96db342b73d92b758b57":"Revenge of Shinobi, The (Europe) (En,Fr,De,Es,It) (Beta)","836d614be32cd350de5e05a175db6da7":"Global Star - Sudoku Fever (USA)","8384aa8735b5a036fdddb5da430cb25b":"Donald Duck Advance (USA)","838911e3c706d4f4377e0ad318676d2d":"Shaman King Card Game - Chou Senjiryakketsu 2 (Japan)","839f44aec4456b2be03a1bdec90ae7f7":"Dogz 2 (Europe) (En,Fr,De,It)","83b01697dd2e80ec4f662a1486122b70":"Feline (World) (GBA Jam 2021)","83c4994b6edb5ace03864f96ddeb54af":"Greatest Nine (Japan)","83d2a27e2eedf08ec8e8174417021594":"Famicom Mini 18 - Makaimura (Japan)","83db8a484f48d8fab9638fde47853800":"Scooby-Doo (Germany)","83f6af032b753b0bc5fc287fca6b3b3b":"Unfabulous (USA) (Beta 8)","842f50e8321d16d33566839d76635448":"Goemon - New Age Shutsudou! (Japan)","84426f2886283b640fb7974ef68396d4":"Uranus (World)","8451b02ab3fcb7cda5c2da3170bb6002":"Frogger Advance - The Great Quest (USA)","845dc86c7d1869bbe0b984d19d9ba01f":"Power Pro Kun Pocket 7 (Japan)","847b141aada46a0ac4818fe05210177a":"American Dragon - Jake Long - Rise of the Huntsclan (USA, Europe) (Beta 1)","84a1007a744a784bb16c98f1ce04f94e":"Hardcore Pinball (USA, Europe)","84b222956de83bd53d37d9c3e0ee3af1":"ESPN Great Outdoor Games - Bass Tournament (Europe)","84c0b60d9fb6c9d94e057a0f67c31cf6":"Fire Emblem - The Sacred Stones (USA) (Virtual Console)","84e3389b9a4a120959b37c15b5bcc460":"Adventure of Tokyo Disney Sea (Japan)","84fc5415c6a687b656ba79df90cfc6a7":"Blue Angelo - Angels from the Shrine (Europe) (Proto 2)","8517049ce498d84530c953d6a8b3112e":"Yu-Gi-Oh! - World Championship Tournament 2004 (USA) (En,Ja,Fr,De,Es,It)","852976ef728c7e33e4e9ec089380ecff":"Super Mario Advance 4 - Super Mario Bros. 3 (Europe) (En,Fr,De,Es,It) (Rev 1) (Switch Online)","85299edc639a2d1a158455e92af573ca":"Barbarian (USA, Europe) (En,Fr) (Proto 1)","8537579863758cead65406c13ab40ec0":"Battle X Battle - Kyodai Gyo Densetsu (Japan)","8547cfd31103f0e855e2d6267e230c06":"Dragon Ball Z - The Legacy of Goku III (USA) (Beta)","8557791a1f72183a1ab451df4ad032b9":"Spider-Man 3 (Spain)","855cdf29fc72a4c55026aeaca8480bb9":"Texas Hold 'em Poker (Europe) (Rev 1)","85853646ee8ed8269a442a13bffc6e0d":"Yggdra Union - We'll Never Fight Alone (Europe)","859a2612f2229bd78c74fadfeddcc852":"Petz - Hamsterz Life 2 (USA)","859cb3dd653228060cc3aae3d1a39333":"Jinsei Game Advance (Japan)","85b02ee02e0ffda069ccdc9531248cb6":"Tom and Jerry Tales (Europe) (En,Fr,De,Es,It)","85b9ee894ac4a5d21f3f9dd473edebdc":"Madagascar - Operacion Pinguino (Spain)","85bbf8a6f95b9d2d463d0a55f2b69d35":"Barbie Diaries, The - High School Mystery (USA)","85c6ef88ad57e0af9778c68880295351":"Zipline Zapper (World) (GBA Jam 2024)","85cc314417d8f96798248507629eaa8b":"Garfield - The Search for Pooky (Europe) (En,Fr,De,It)","85eb280639d3c2bab9fa8444e861e461":"Oshare Wanko (Japan)","85f8893a2c07ead2a164f823d665f415":"E.T. - The Extra-Terrestrial (Europe) (En,Fr,De,Es,It,Nl)","85fa9b30552bcf2b5cffa86f669da0a1":"Mobile Pro Yakyuu - Kantoku no Saihai (Japan)","860cf4411b691593d06bc2bfbe29187c":"Digimon Rury (USA)","860ed03009d656568ea20d98436574c8":"Naruto - Saikyou Ninja Daikesshuu 2 (Japan)","8620aeb89f00dd3e3c2a500ba75ce2de":"Scorpion King, The - Sword of Osiris (USA)","863bb2f057959ec7b21aa0174c817fa9":"Jackie Chan Adventures - Legend of the Dark Hand (USA, Europe)","863eb1e5b1c35555a892883d0748b1f6":"Toll Runner (World) (Demo 1) (GBA Jam 2024)","8643fe7632d4895dcaaca230475e70fb":"Fire Emblem - Fuuin no Tsurugi (Japan)","864d9a4e885f1f32a9072a606c739006":"Alex Rider - Stormbreaker (Europe) (En,Fr,De,Es)","8653d5731f4effd21e435b9a274023a4":"Boulder Dash EX (USA)","865b424538c65f2e5a96255408752eef":"Riviera - Yakusoku no Chi Riviera (Japan)","866719fa99283d111b0ff914a7685999":"Rockman EXE 6 - Dennoujuu Falzar (Japan) (Virtual Console)","868cafba6f72113d4473a171e9ee4d24":"World Advance Soccer - Shouri e no Michi (Japan)","86a1c5aae8afe04acaf1ae475249e9ba":"Donkey Kong Country 2 (Europe) (En,Fr,De,Es,It)","86ae492f7c964724de06f7cbebe6437a":"2 Games in 1 - SpongeBob SquarePants - Battle for Bikini Bottom + The Fairly OddParents! - Breakin' da Rules (USA)","86dca228afc2d455e958c4e52787d91e":"Greg Hastings' Tournament Paintball Max'd (USA)","86e18db544ff6281728b472e4f5de317":"Hime Kishi Monogatari - Princess Blue (Japan)","86e6497272f39b19af6750d699569531":"Pac-Man World 2 (USA)","86f3a374af80e633531c538d9aeaf396":"It's Mr. Pants (USA, Europe)","86f5da57ec34ecf1c2710befa3d2c5de":"Juka and the Monophonic Menace (USA) (En,Fr,Es)","86f872eafa573d4535e5f536ab7f5d2b":"Disney Sports - Football (USA)","87097e92087ede6f94cad64c847542a3":"Famicom Mini 27 - Famicom Tantei Club - Kieta Koukeisha - Zen, Kouhen (Japan)","870aaedb84a214fa52b167a37c94b591":"Stuntman (USA) (En,Fr,Es)","870cfbf9950eea5db33c118564233db3":"Rayman 3 (Europe) (En,Fr,De,Es,It,Nl,Sv,No,Da,Fi) (Beta)","871133b4e4e8b172f7538b0250c9bb45":"Board Game Classics (USA)","8734c1f1bb86042c40696786825181eb":"Doraemon - Midori no Wakusei Dokidoki Daikyuushutsu! (Japan)","8735e3aaab28d157cd5cb0b0c6666b0d":"Titeuf - Mega Compet (France)","873b5e4111c0cbbc5224b590e845ba21":"2K Sports - Major League Baseball 2K7 (USA)","874aa5c4c6217febec6405a22d7bc9ef":"Bratz - Rock Angelz (USA, Europe)","875112adceb14c80ef4e67fdb4d37826":"LEGO Star Wars - The Video Game (Japan)","875524c19ada69a0c9f3e585e6bedaa2":"Yu-Gi-Oh! - Destiny Board Traveler (USA)","875c78f20ab82d8b8e72b18d4b1fe4cc":"Jurassic Park III - Dino Attack (Europe) (En,Fr,De,Es,It)","877d6658ae7e469b946f44a1f7c0980f":"Ratatouille (Australia, Greece) (En)","878dc37944b93347e220ca68936402e0":"Shikakui Atama o Maruku Suru. Advance - Kokugo, Sansuu, Shakai, Rika (Japan)","87913c168eae9f2187119becb03ad598":"Croket! 4 - Bank no Mori no Mamorigami (Japan)","8797dad370b36d51899f2652946431a6":"Hikaru no Go 3 - Senyou Joy Carry Cartridge (Japan) (Rewritable Cartridge)","87a1bd6577b6702f97a60fc55772ad74":"Castlevania - Circle of the Moon (USA) (Castlevania Advance Collection)","87d4626c1736b29a0e1f81cb6f3306a6":"Bionicle Heroes (USA) (En,Fr,De,Es,It,Da)","87da43aaad7b9fd2b8af57e8e3c71283":"Madagascar - Operation Penguin (USA)","87dd60f33b342bc878a05bdb4ca8e753":"Battle Network - Rockman EXE 2 (World) (Ja) (Mega Man Battle Network Legacy Collection)","87faeacbfe02c12d1fa89b41ef1d676e":"Dave Mirra Freestyle BMX 2 (USA)","881dd5c2d845a8fef7fc7badcf47d617":"Inspector Gadget - Advance Mission (USA)","882e200550d6addafdc0f9aa2b03deb1":"Eggo Mania (Europe) (En,Fr,De,Es,It,Nl)","885cfe05f516278be9678a6345c8f485":"Super Robot Taisen D (Japan)","88792ae1fbc74f4a5425d0c6f0482023":"Megaman & Bass (USA)","8893dcd52c5e4c3a7b8991a4ca7fb73e":"Slot! Pro Advance - Takarabune & Ooedo Sakurafubuki 2 (Japan)","889fbc49115ce1f21e89490e0a2fe457":"Hikaru no Go (Japan)","88a5225f93074c0445ec912523da4538":"Silk to Cotton (Japan)","88bbe65da38eda5082175fa13f092311":"Derby Stallion Advance (Japan)","88c5a2ccaa61459b21715255220b87dd":"Unfabulous (USA) (Beta 5)","88d46cdf27d866f82a26bb2a1a98588c":"Globlins! (World) (Demo 1) (GBA Jam 2024)","88d6eff7ccac003b7ccb50878aa8e209":"Kami no Kijutsu - Illusion of the Evil Eyes (Japan)","88de1a21af5663ef1f85f5445e559562":"Shark Tale (Italy)","8905016d29e691975ebb176dec1dce4e":"Genseishin Justirisers - Souchaku! Hoshi no Senshi-tachi (Japan)","89073fce9c0d5b25acdfdf8a1d7b9d9d":"Pokemon - Aurora Ticket Distribution (USA) (Kiosk)","8942d8c65e680853e1407108857bb732":"Star Wars - Episode III - Revenge of the Sith (Europe) (En,Fr,De,Es,It,Nl)","8957506ac2d72a332e04d6f94ef5ae39":"RoboCop (USA) (Proto)","89579f4dfe1ed24a7cd16a6a61a72a17":"WarioWare - Twisted! (USA, Australia)","897fbe03b12147f9daf55519d90402cd":"Dragon Ball Z - Buu's Fury (USA) (Beta 1)","898100fd892e820942867d94939f8505":"Medabots AX - Rokusho Ver. (Europe) (En,Fr,De,Es,It) (Virtual Console)","898914fe623432c8cf062764cab39b9e":"Digimon - Battle Spirit 2 (Europe) (En,Fr,De,Es,It)","8989a8830651ca9705c676676aaf4894":"Amazing Virtual Sea-Monkeys, The (USA)","8996cf047c0c920127c7dd4d840b4cd7":"Crash & Spyro Superpack - Spyro Orange - The Cortex Conspiracy + Crash Bandicoot Purple - Ripto's Rampage (USA)","899b136ff8391f574b52be34ddb683fc":"Castlevania - Aria of Sorrow (USA) (Castlevania Advance Collection)","89a8ea77fc2169dd5aa0209e4c485b7c":"Medabots - Metabee (Spain)","89b14322fdd974ac1fe06c7b77c9dbff":"Onmyou Taisenki - Zeroshiki (Japan)","89b9f7d5d4ecdf933981aa6f9f05c53e":"Pocket Monsters - LeafGreen (Japan) (Rev 1)","89bbc0e48966feca4f22e2b31caad638":"2 Games in 1! - Dragon Ball Z - Buu's Fury + Dragon Ball GT - Transformation (USA)","89bd27cd7228736d9c00461abd20c208":"Game & Watch Gallery 4 (USA)","89bea97ec8d4f11274784afc125de6c8":"Zettaizetsumei Dangerous Jiisan Tsuu - Ikari no Oshioki Blues (Japan)","89c23bad78a30d9d1065262da512594f":"Megaman & Bass (USA) (Virtual Console)","89c2af08fb993266d8cd79af28aabce2":"Finding Nemo - The Continuing Adventures (Europe) (En,Es,It,Sv,Da)","89c947c27346212a2ff412b5d46a51af":"Super Bubble Pop (USA)","89edab9880ff7a18657398e75c6d7462":"Wagamama Fairy Mirumo de Pon! - Nazo no Kagi to Shinjitsu no Tobira (Japan)","8a0577dfea5fdb41b8b8c0554ac877c8":"Pocket Professor - Kwik Notes - Volume One (USA)","8a0e456a01130c8f4b800a0376681782":"Super Chinese 1, 2 Advance (Japan)","8a12b6c9298e5f9874df68f62cc23b48":"Barbie - The Princess and the Pauper (Europe) (En,Fr,De,Es,It,Nl)","8a23378fdcecaca9a648d378c1d9609d":"Ripping Friends, The - The World's Most Manly Men! (USA, Europe)","8a46b929f0dc1522fc0cc378685d8337":"American Dragon - Jake Long - Rise of the Huntsclan (USA, Europe) (En,Fr,De,Es,It)","8a65cc927274981d1b431bc005fe185d":"Animal Snap - Rescue Them 2 by 2 (USA)","8a6795c788c97627e06a987cf25b4d2b":"Gachasute! Dino Device 2 - Dragon (Japan)","8a8d50c9710ad287d2691546cf40348f":"Jikkyou World Soccer Pocket (Japan)","8a8dc5dc9bc9a49d35ba263e1ba9f4a7":"Shin Megami Tensei Devil Children - Yami no Sho (Japan)","8aa4f88927f3c5bf1aaed1562742a64d":"Blender Bros. (USA)","8aa503fd9f7ba80dc0b0a7f46716f5ad":"ZenF (World) (GBA Jam 2024)","8aa75eb2e94320c942e8c71cedcec97c":"Dexter's Laboratory - Deesaster Strikes! (USA) (En,Fr,De,Es,It)","8aabd68732a738c01a07ae606e0eb3b6":"Field of Nine - Digital Edition 2001 (Japan)","8abea930d7eec394f3a7f65c6206a865":"S World 3 (World) (Beta 1)","8ad8a16c66c9a755137635d84b08d5e9":"Tweety and the Magic Gems (Germany)","8b0fe9b5156781d1686b0add2a31b9b3":"Golden Sun - Die Vergessene Epoche (Germany)","8b525f6d0d80a287df61ec99a97c6c08":"Backyard Basketball (USA)","8b6236aad7ba63e05547146528cea8a9":"F-Zero - GP Legend (USA) (Proto 12) (Netcard)","8b68e98da32fcee8c235c3c283c20a4c":"Aero the Acro-Bat (USA) (Beta 1)","8b7a6c21e2619dbfb5064c76d074f582":"Denki Blocks! (USA) (En,Es)","8b7a8c1e315ccf6132afb5bcd7aa4136":"Metalgun Slinger (Japan)","8b809080a689886e7877ec89eb82ae99":"Bratz (USA) (En,Fr,Es)","8b898cdf54095d09d9be2cfcb43ea040":"Motocross Challenge (USA) (Proto)","8ba0f025aa7acbfa1376ab140685b234":"Lau Gurpil (World) (Demo 1)","8bac13cf55656a7d66ab32482fd7a323":"Premier Action Soccer (Europe) (En,Fr,De,Es,It)","8bb88f20d166d7f6c3806c0c761fb54d":"Rockman & Crystal (USA)","8bccfacf3366c63b84770f68dfeb89ff":"Lord of the Rings IV, The - The Fellowship of the Ring (USA)","8bcf4e0da6be539f2099c683ff897b43":"Crazy Taxi - Catch a Ride (USA)","8bd140d7a98757926e62b6f6b6cdb02a":"Wakeboarding Unleashed Featuring Shaun Murray (USA)","8c130964502931ba6c3d14e1f719a986":"Tom Clancy's Splinter Cell (Europe) (En,Fr,De,Es,It,Nl) (Beta)","8c2a7e2605a29f88349e9a91fb773557":"Spy Kids 3-D - Game Over (Europe)","8c40604a9a39f081408cbe3991ac0626":"SEGA Rally Championship (Europe)","8c48059bf2c40a78b9739edf5ea411cb":"Batman Begins (USA, Europe) (En,Fr,De,Es,It,Nl)","8c5c04d6559a700903c7186e0baee2fe":"M&M's - Break' Em (USA) (Rev 1)","8ca5aeb726f65ae584bc74b546c294bf":"CHEESYchords (World) (v1.1)","8cacc135e731b3b3e268676a8d2fc2fc":"Madagascar (Italy)","8cad01d7436766cda2734af52189c056":"Majesco's Sports Pack (Europe)","8cbbfc4bac6a08f33e91d7cd6408a660":"Extreme Ghostbusters - Code Ecto-1 (Europe) (En,Fr,De,Es,It,Pt)","8cc1dd1718b63c9675a5e5d28c14936b":"Muppets, The - On with the Show! (USA, Europe) (En,Fr,De,Es,It,Nl)","8ce34b50e1b658b4c69e6ba4a100f71e":"Jurassic Park Institute Tour - Dinosaur Rescue (Japan)","8d1ba7381342eb5d4786cabe67eb8632":"Prehistorik Kart (USA, Europe) (Proto)","8d27b349bca44d938b67f9a28712f6c9":"F-Zero - Climax (Japan)","8d2f6a78e9cf3210ae22c5f111624e55":"Justice League - Injustice for All (Europe) (En,Fr,De,Es,It)","8d3004602c8c0cbb734c8aa781c425cd":"Aventures de Jackie Chan, Les - La Legende de la Main Noire (France)","8d37b40ccbfed23e7a2b677ced5bde2f":"Pippa Funnell - Stable Adventure (Europe) (En,Fr)","8d4b0e1203548601a7c34c20680c0b75":"FightBox (Europe)","8d51b71a3ae3d1646c368725abd0b1ed":"Duel Masters - Kaijudo Showdown (Europe) (En,Fr,De,Es,It)","8d5b5381539fcad4df2bc7902a432dee":"Astro Boy - Omega Factor (Europe) (En,Ja,Fr,De,Es,It)","8d76ff1a5411fbd8ba0010dbcd0e5aa2":"SpongeBob SquarePants Movie, The (USA)","8d7c792d3c715f48833d0390b4eebc45":"Puyo Pop Fever (Europe) (En,Fr,De,Es,It)","8d8d61533ee0ebf56ab63ed4bebf1ccd":"Top Gear Rally (Europe) (En,Fr,De,Es,It)","8d9bf4766bcc96c79dbab427fc75a2a6":"Ghost Trap (Japan)","8d9fbf8bde7941ca97dcba7757d60e81":"Spyro 2 - Season of Flame (USA)","8daee9fe02459c2084d461d4f2e8e481":"Mahou no Pumpkin - Ann to Greg no Daibouken (Japan)","8dbd6bfdff54f2fc0f1bbde11706a803":"Disney's Party (USA, Europe) (En,Fr,De,Es,It)","8dc907977f47486569f863f99b81f567":"Strawberry Shortcake - Summertime Adventure - Special Edition (USA)","8dc9eb3c6a76fe563bdd7b7d10f2b72c":"Sitafei De Chuanshuo 2 (China) (Proto)","8dd015022218c0df89bdd4a1a1fc4e7b":"Phil of the Future (USA)","8dd342a81937540bb7aea1521cb11d1c":"Fear Factor - Unleashed (USA)","8dd93526e6568b174355153fe946bd0c":"Shaman King - Legacy of the Spirits - Sprinting Wolf (USA)","8ddb166cf79606f116f6bdf3e4bdbbe2":"Akumajou Dracula - Circle of the Moon (Japan)","8e066c35a484308421c3eebcc45ec329":"Mortal Kombat - Deadly Alliance (Europe) (En,Fr,De,Es,It)","8e11c9e996e0fcae6d95483b4a2adfdc":"Frontier Stories (Japan)","8e1c2672225640d441932424b5e11243":"Barbie Diaries, The - High School Mystery (Europe)","8e2766a5595c4916decf99b300583d16":"Who Wants to Be a Millionaire - 2nd Edition (Europe)","8e4687980914d70581c376f084ed8e06":"Tweety and the Magic Gems (Europe)","8e5b4bb736b5030cf13052634d01ef69":"Toy Robo Force (Japan)","8e825b6048a72649a9b672858bfc388c":"Tower SP, The (USA)","8ea169d37c038ea5f0cf9a1fb39554b7":"SpongeBob SquarePants Movie, The (Europe) (En,Fr,De,Es,It,Nl)","8eabc44961b0e153f9e3da94ca011847":"Knights' Kingdom (Europe) (En,De)","8ebf0a1c78ab2a874057d32d238303ff":"Monster Jam - Maximum Destruction (USA)","8ec1a2fee7a9cc9508bf13dc423d424d":"Banjo-Pilot (Europe) (Beta 1)","8ecb24e6711df71241e4d52c7d1d07e0":"Minna no Soft Series - Shanghai (Japan)","8ed216f4ec3342e7d27b420bfe3b4e53":"World Reborn (USA) (Proto)","8ed4304e943b553f8ff3abc1e66ea91e":"Aladdin (Europe) (En,Fr,De,Es)","8ee261b598c4c1189dfaaa3361697c5f":"Dragon Ball Z - Collectible Card Game (USA)","8ee6c58527204e7ba8eb54f397dd15b0":"Super Puzzle Fighter II (USA) (Rev 1)","8ef10e6b20930b83f2ef3c11a1752793":"Hot Wheels - Burnin' Rubber (USA)","8ef186d8565c1408e653bfe5341a5ffb":"GT Racers (Europe) (Beta 1)","8efd494b80bca668b4f19c5f3c0b9f13":"Super Mario Ball (Europe) (Virtual Console)","8efe8b2aaed97149e897570cd123ff6e":"Golden Sun - The Lost Age (USA, Europe)","8f0dad780f01ce002331693f4733f27e":"Fire Emblem - The Sacred Stones (Europe) (En,Fr,De,Es,It)","8f0fdaeda361783ee74abd980b418388":"Simpsons, The - Road Rage (USA, Europe)","8f254384c3b1aa8ff118b4782d089267":"Planet Monsters (Europe) (En,Fr,De,Es,It,Nl)","8f289129beefd40717718c7ab8baa447":"Zelda no Densetsu - Kamigami no Triforce & 4tsu no Tsurugi (Japan)","8f380c11bd958656afbeca39b80c83c9":"Minna no Ouji-sama (Japan)","8f3d9095c1d0b281ba12a4bac17c29d1":"Shin chan contra los Munecos de Shock Gahn (Spain)","8f71cc21f97599f376b71a0953db1847":"Ninja Cop (Europe)","8fa0ca30575846480a1bba06dcfd6508":"Danny Phantom - The Ultimate Enemy (Europe) (En,Fr,Nl)","8fa81eb18f711ce98792b8aea919e2f4":"Mijn Dierenpension (Netherlands) (En,Nl)","8fb4f7b39bd8f82661ede4a32773de65":"Tsuukin Hitofude (Japan) (Beta)","8fc1dfad1ccd02c8563bc2767e73276e":"American Dragon - Jake Long - Rise of the Huntsclan (USA, Europe) (Beta 6)","8feee07008288e4df451d639168bf1d0":"Muppet Pinball Mayhem (USA)","8fef2a90bef400616bfe5788d1c68f09":"Medabots AX - Rokusho Ver. (USA) (Virtual Console)","9003c10fd78cc0bb83c83cbbdbe03911":"Wings (USA)","901d68257b8beda85240d55725529fe2":"Street Fighter Alpha 3 (Europe)","903cfc3391a05624c48b8ded7d6b2efd":"2 Games in 1 - Power Rangers - Ninja Storm + Power Rangers - Time Force (Europe) (En,Fr,De+En)","904299e3d5ec737c17efdac25126016d":"Double Game! - Golden Nugget Casino & Texas Hold 'em Poker (Europe)","904f77bb71669ae4e525857af2c0d23c":"Tootuff - The Gag Machine (Europe) (En,Fr,De,Es,It) (Proto)","905067b56274608b4be2e805491b624d":"Spy Muppets - License to Croak (USA) (En,Fr,De,Es,It,Nl)","9085dd5a5ef4b2820a838c375301fec2":"Backyard Football (USA)","90cb614e8695745f288bf2a7de4b5922":"Kingdom Hearts - Chain of Memories (Japan)","90d5887eaefd16478525478410155dec":"Castlevania Double Pack (USA)","90f1dfb87a2c47224d43c8f09eda0841":"Boku wa Koukuu Kanseikan (Japan) (Rev 1)","90f6a072681959f117b4901feb5b2cb7":"Disney's Game + TV Episode - Lizzie McGuire 2 - Lizzie Diaries (USA) (En,Fr)","9106c7adba0ab281a29f5af7caa9cdad":"Mummy, The (USA) (En,Fr,De,Es,It)","913a49ea66a349fec2ac793a4eeb93b9":"Kunio-kun Nekketsu Collection 2 (Japan)","91410132c661fce4074eba939915d543":"Animal Mania - Dokidoki Aishou Check (Japan)","9145ded7c7fb57275b6bd23ac1e93fd5":"Guilty Gear X - Advance Edition (Europe)","914bd4b83ad1a0b426cb183132526431":"Sennen Kazoku (Japan)","9175a1771a550ed2237de4231aebc1f1":"F-Zero - Falcon Densetsu (Japan)","9178687e7327cbb77458e1093d95cf1f":"2 Games in 1 - Rugrats - Go Wild + SpongeBob SquarePants - SuperSponge (Europe)","917fdbc9cb798c6ee3831a27e6a2af6a":"J.League Winning Eleven Advance 2002 (Japan)","91874d50834cc7b752922f917f9cd8f7":"Galaxy Angel Game Boy Advance - Moridakusan Tenshi no Full-Course - Okawari Jiyuu (Japan)","919041d04ce811a6060044d579180c66":"Puzzle & Tantei Collection (Japan)","91926690793d2a63cd382797eb1b35c2":"Tony Hawk's Pro Skater 3 (Germany)","91ba6a4571e20dd9c7604d685d134607":"Babar to the Rescue (USA) (En,Fr,Es)","91c56cd17442041af081d5a74d71e941":"Monster Farm Advance (Japan)","91cc97b4023b7876f4ac783c2c4de2bd":"Hot Wheels - World Race (USA)","91d5986bcb918e636f17e99eb73b923b":"Street Fighter Alpha 3 (USA)","91e86d6adb495236293e75d5f0fa82b8":"Yoshi no Banyuuinryoku (Japan)","920882439cd994c2f0ab63d32a64eb80":"Asterix & Obelix XXL (Europe) (En,Fr,De,Es,It,Nl)","923410c2a52decb781a381f399f2dd2b":"Game & Watch Gallery Advance (Europe) (Virtual Console)","923a3437fcf84a5ca26158f7faada412":"Karnaaj Rally (USA, Europe)","926bebf30f7fecd6b9fa30cfd353dfee":"Global Star - Sudoku Fever (Europe) (En,Fr,De,Es,It)","92751433cb0290a86d0bd57a1a150423":"Ochaken no Bouken-jima - Honwaka Yume no Island (Japan)","928c0bd4cf82b3fd6f34b53d4fd02e69":"Mario Tennis - Power Tour (USA, Australia) (En,Fr,De,Es,It)","929f06f714454b66cec42585462db598":"Street Fighter Zero 3 Upper (Japan)","92ae5e0ee6ee2056f65f5c52672c2ff6":"Lindsi Luna Blast (World) (v1.01)","92bc0ac04f898054f18d061fd806ae47":"Famicom Mini 04 - Excitebike (Japan) (En)","92eacc3f576688e87403cc1b1d582a3c":"Cat-Venture (World) (Demo 1) (GBA Jam 2024)","92eecf93f1ab828bdf2a83daddacf3e5":"Pocket Monsters - Emerald (Japan)","9307c9034ab5e6effa2323297e493363":"Battle Picross (World)","93539207be7d05e2ef8e3e9b44a82c2e":"Zhuanzhuanbang (China) (Proto)","936a8172335ffc3391d182e909942d76":"Dokapon - Monster Hunter (USA)","9372681ce36402acc4d131245e13e3d5":"F-Zero - GP Legend (USA) (Proto 2) (Netcard)","937fa6b7ddd554370405f13b93632715":"GetBackers Dakkanya - Jagan Fuuin! (Japan)","938429cc09e41c9c1a4de39f9dcf17c1":"Hexa Virus (World)","9397ee8e46cd0357d49af1cff6fd97b3":"Magical Quest 2 Starring Mickey & Minnie (USA) (En,Fr,De)","93a2f28339858e955e4f17060e038bcd":"Sonic Advance (Europe) (En,Ja,Fr,De,Es)","93b32287d60cf7d220b479bf976c2746":"Cornucopia (World) (Proto)","93c6a92b841b2f3cad5cdc4e62112e61":"GT Advance 2 - Rally Racing (Europe)","93cf91ff53f2b52f1da030902f74d208":"Jixie Ren Dazhan - Zhongjie Ban (Taiwan)","93d1ba78096704c5dcfa993337469542":"Rockman & Forte (Japan)","93f18a489a5bd7129152a9e6dd42ac19":"Mario & Luigi - Superstar Saga (Europe) (En,Fr,De,Es,It) (Virtual Console)","941590a0d3e5de3e46cd2e9242349f56":"Kirby & The Amazing Mirror (USA) (Virtual Console)","94194788e55c1d3c256d816601ee7530":"Who Wants to Be a Millionaire Junior (Europe)","941e3164cd26480ed03eeb997c7d95c3":"Magical Quest 3 Starring Mickey & Donald (Europe) (En,Fr,De)","942f5468a3d6ea6613674a1de3040a3e":"Flood (World) (Proto)","9455cef784b0e4d3b3e706037c552892":"Zen-Nihon GT Senshuken (Japan)","9457a51730ada0ea9ccdbaab51d93613":"X-Men - Reign of Apocalypse (USA, Europe)","9476b0a926165be6a5cb30378beece99":"Oshaberi Inko Club (Japan) (Beta)","9485f273f4e97e9e8f21966407f2e782":"Fire Emblem - Rekka no Ken (Japan)","94b847814fee8e4e5d9fdbf1d3d25107":"Lady Sia (USA) (En,Fr,De,Es,It,Nl)","94bdc794be9af6ec327e2df9394891fd":"King Kong - The Official Game of the Movie (Europe) (En,Sv,No,Da,Fi)","94c6ec2dad53ef7d7ec44b7e438833b8":"Top Spin 2 (USA) (En,Fr,De,Es,It)","94cda1aa3381f457186908ac3fe82f24":"Cars (Europe) (Fr,Nl)","94ce0a59f8a6a0ec40b51ef13cfe0aa0":"Medabots - Metabee (Europe)","9530a3e226b2fdfbfb8fd72242793635":"SD Gundam Force (USA)","9589f5c6bd150e73a4b4427643b9f46d":"Pocket Monsters Diamond - Pocket Monsters Pearl - Manaphy Present Campaign Senyou Cartridge (Japan) (En)","959f4e677160366f356742016427595d":"Shaman King - Master of Spirits (Europe) (En,Fr,De)","95a6ed2862986666933b0ad73291c5da":"Spy Hunter (Europe) (En,Ja,Fr,De,Es)","95abf2bd63a3758b6d86e278ee1fca6e":"Ballistic - Ecks vs. Sever (USA)","95b8cb63649f7bb62a2f9a6a39bf7388":"Revenge of Shinobi, The (USA)","95c545bf05c4348881b0bfa85c951fb9":"Titei Senki Advance (World) (v1.02)","95ce5443198044f4546a42d9d67be0e2":"Sonic Pinball Party (Europe) (En,Ja,Fr,De,Es,It)","95ecb39a21e97ba21b1a992ead24767e":"Rugrats - Go Wild (USA, Europe)","95ef9bda30e0392f319ee8617bd2dca0":"Star Wars Trilogy - Apprentice of the Force (USA) (Beta)","9630eae3565e47174448d3380850c7a9":"Rayman - Raving Rabbids (Europe) (En,Fr,De,Es,It,Nl)","9636918db9f7489630bb8bff049f8ae3":"Daisuki Teddy (Japan)","963c095c626a5dac37251853d406597f":"Gadget Racers (Europe) (En,Fr,De)","968c5daa71e6b41c71143852b27ae0b5":"Shrek the Third (USA)","96b1fe74b2d1ae2b36973acce0ac0bc2":"Wannyan Doubutsu Byouin - Doubutsu no Oishasan Ikusei Game (Japan)","96dbd1bef3587b60b612f0d30fc94415":"Chaoji Maliou Shijie (China)","96dd9b5b227a30c25db3265a2c755d6a":"ESPN X-Games Skateboarding (USA)","96e56b4cf97be08b81750164890df648":"Naruto - Konoha Senki (Japan)","96ec0f9e34ce0a2c2d0a50f793b30c26":"Ignition Collection - Volume 1 (Europe)","971a2979e6e04942e61271ddd563f480":"Final Fantasy IV Advance (Japan)","971e4440cb014dc10c4c834efaef5114":"Shaman King - Master of Spirits 2 (Europe) (En,Fr,De)","972ef647fbbbbb4d53a38dc9f56079b6":"Lemony Snicket - Una Serie di Sfortunati Eventi (Italy)","973128ad4bba6fca4a1764ca9f6d1226":"Sleep Paradox (World) (GBA Jam 2024)","976a59eb7378eb92ed184969ca428db2":"Spyro Advance (Japan)","976bb334f76277357ceb33548d5e03df":"Mermaid Melody - Pichi Pichi Pitch - Pichi Pichi Party (Japan)","9771bfaa4a2182872b3050808d14afba":"GBA Movie Player - 2nd Version (World) (V2.00)","978953379422ea0eef46ed02253fe77a":"Cinnamoroll - Koko ni Iru yo (Japan)","978e59b7362c79193131a35c277e07c0":"WinX Club - Quest for the Codex (Europe) (En,Fr,De,Es,It)","978f10569b0a00b023016fb5f287c0b6":"Angelique (Japan)","97af9c00a5718832b7e5e46f9e434820":"Madagascar (USA)","97c3b138b9797675dfb2135118347992":"Rockman EXE 4.5 - Real Operation (Japan) (Virtual Console)","97cc2aeb06142aedc38b672e90e04a11":"Incredibles, The (USA, Europe)","97e46f72ce3ccdaa76bee1eb60342bc7":"Reign of Fire (USA) (En,Fr,De,Es,It)","97e977d6bb8b2e45a5ad6952dd9a5481":"Classic NES Series - Super Mario Bros. (USA, Europe)","97fa8d3dec6cad0b75ea8063992be6a6":"Gradius Generation (Japan)","980f809ccc92dd1868ab151acd8a9a82":"Fruits Mura no Doubutsu-tachi (Japan) (Rev 1)","9824d54e798f7985d620b41abd722993":"Herbie - Fully Loaded (USA)","9837da1fdfe900c52f2109d9718d4e85":"Pokemon Mystery Dungeon - Red Rescue Team (Europe) (En,Fr,De,Es,It)","9861ab21a881684a50ec5ceaef04558c":"Tetris Worlds (Japan) (Rev 1)","986ff7d285a6c161ccfd2eaef4f8cb18":"XS Moto (USA)","98711bc267ca910024398a1f8c078160":"MotoGP (Europe) (Beta)","987308f23cea98609a77629cc1bfb23a":"Cruis'n Velocity (USA, Europe)","989135c9dd288d2c5731c2563c7863ea":"Peter Pan - Return to Neverland (Europe) (En,Fr,De,Es,It,Nl)","98b3619a09eb08c2c6816c6cd2747527":"Double Dragon Advance (Japan)","98b421421f79e774231b65df7b1b3c47":"Pokemon Pinball - Ruby & Sapphire (Europe) (En,Fr,De,Es,It)","98e8fb1e888bcfc82f5a876f52bd83a3":"Life and Adventures of Buscon de Tormes (World) (En,Es) (Proto) (GBA Jam 2024)","98f96e81826945fad686b08fe7d10e0c":"Spider-Man 3 (Germany)","9937b1fd45c37eec09188c1516da4cea":"Hoshi no Kirby - Kagami no Daimeikyuu (Japan) (Rev 1)","99581023cbb348a577d461e328646218":"Cars (Europe) (Sv,No,Da,Fi)","9964136d79b1d6560e1e87957a845f3a":"Mario Golf - Advance Tour (Spain)","998875b640543e2e9207101b18a5f517":"Shin Nihon Pro Wrestling - Toukon Retsuden Advance (Japan)","99c318243f594c4d84a793519a50a679":"Inuyasha - Naraku no Wana! Mayoi no Mori no Shoutaijou (Japan)","99c8ad779a16be513a9fdff502b6f5c2":"Wario Land Advance - Youki no Otakara (Japan)","9a2cb830688554be22077f7337a0b614":"Spirit - Der Wilde Mustang - Auf der Suche nach Homeland (Germany)","9a3589d2dd7fe1641201098ebd4bba28":"Wing Commander - Prophecy (Europe) (En,Fr,De,Es,It)","9a3db7e1fe781945df44eb6be8713567":"Final Fight One (Japan)","9a56bc96339193e7c198c20d2ca11afe":"Magical Quest 2 Starring Mickey & Minnie (Europe) (En,Fr,De)","9a5a3fb9c4b8e1b82f6584baa7962a2b":"Famicom Mini 05 - Zelda no Densetsu 1 - The Hyrule Fantasy (Japan)","9a5a6c940bbf141d8c2838cf7c818080":"SpongeBob SquarePants - Lights, Camera, Pants! (USA)","9a5d5ac7a142a38c31de819f8e059cca":"Power Pro Kun Pocket 5 (Japan) (Rev 1)","9a5ee5bda6c5d01032ce459a8dbd2b57":"2 Games in 1 - Sonic Advance + Sonic Pinball Party (Europe) (En,Ja,Fr,De,Es+En,Ja,Fr,De,Es,It)","9a7d740691276d4f33cf090bc62ba379":"All-Star Baseball 2004 Featuring Derek Jeter (USA)","9a819e0ce5e550bff890f8329b6986da":"Ed, Edd n Eddy - Jawbreakers! (Europe) (En,Fr,De,Es,It)","9a83e6571c9543a1a4d658564f02be4c":"Zapper - One Wicked Cricket! (USA)","9a8a6131e217cb00b270648ee1697a55":"Stadium Games (Europe)","9a8abbb9e95ad1ead235e3ade9b7b429":"Yu-Gi-Oh! Duel Monsters International - Worldwide Edition (Japan) (En,Ja,Fr,De,Es,It)","9a8ffd8345f88ca90683691aa1456c87":"Zoids - Legacy (USA) (Beta 1)","9aa6ac6fd369a686373a2e1bf8bb6aa3":"Pokemon - Rubin-Edition (Germany) (Rev 1)","9ac5ddef9be27d933d366e224fba4163":"Ed, Edd n Eddy - The Mis-Edventures (Europe) (En,Fr)","9af9f7652dfbd45d06b50a6925ee18f6":"David Beckham Soccer (USA) (En,Es)","9afd02f295a96e5e918c2a67621ad79c":"Hamster Monogatari 3 GBA (Japan)","9b067d0ee54caad2171a00c50e3c35cd":"Golden Sun - L'Age Perdu (France)","9b4f26154fa4cd9501dfe75fb155207e":"Titeuf - Mega Compet (France) (Beta)","9b4f449213d1cbc9a5bfe572b5e7f135":"Mythri (USA) (Proto)","9b59d6954b81dbc01838673c7053c5c5":"Pokemon - 10th Anniversary Distribution (Germany) (Kiosk)","9b5b46ff73e5746f753747b79d2afd66":"Spirit - Stallion of the Cimarron - Search for Homeland (USA)","9b699ec2ec65f4153adda3ea55522bb2":"Zoids - Legacy (USA) (Beta 9)","9b6a43ca9da8b177895f66420b208eca":"2 in 1 Game Pack - Spider-Man & Spider-Man 2 (Europe) (En,Fr,De+En,Fr,De,Es,It)","9b71cc4b1e11fe39ced0c3e41061a117":"Gang del Bosco, La (Italy)","9b72e0259be5e4adddd2fed212c9fde7":"Turbo Turtle Adventure (USA)","9b7b3e2567fe71b6f488ee254209e25e":"Super Mario Advance 4 - Super Mario 3 + Mario Brothers (Japan) (Rev 2)","9b8016741dad6774241ccc78571df4da":"Street Racing Syndicate (Europe) (En,Fr,De,Es,It)","9b809f779a41a24258aa9dbb34263d85":"Minna no Soft Series - Hyokkori Hyoutan-jima - Don Gabacho Daikatsuyaku no Maki (Japan)","9b9b31e30d7ebcc22bcbd7132e142292":"Puyo Puyo Fever (Japan) (En,Ja,Fr,De,Es,It)","9ba9ba05be9bff52143e07cdf962d0ad":"Tiny Toon Adventures - Buster's Bad Dream (Europe) (En,Fr,De,Es,It)","9bb3381caedebff8da5304112fc9039d":"Three-in-One Pack - Connect Four + Perfection + Trouble (USA)","9bb9e68ca6d9a2f0c4bc9052321fbee8":"One Piece - Going Baseball - Kaizoku Yakyuu (Japan)","9bc1ee3d43963364ad25e687ec867d26":"Yu-Gi-Oh! Duel Monsters International - Worldwide Edition (Japan) (En,Ja,Fr,De,Es,It) (Rev 1)","9bc2b765ca6997175fac51e6cdc29089":"Pokemon - Sapphire Version (USA, Europe) (Rev 2)","9bcd687293600451abdd0f181b2427e8":"Celeste Classic (World) (v1.2)","9bf9cd93bf32f6f6661b266e8adf9f2e":"Pink Panther - Pinkadelic Pursuit (Europe) (En,Fr,De,Es,It)","9c0aaa7779635954923940d47165af14":"Shadow - A Parable (World) (Audio)","9c2ddd136b3b893db31b806142d20b8c":"Metroid - Zero Mission (USA) (Beta)","9c62897f2997c1fb8919533e7af3f1c5":"Manga-ka Debut Monogatari - Akogare! Manga Ka Ikusei Game! (Japan)","9c6a3c4c14ff9d8ca6df08f3f251c63f":"Britney's Dance Beat (Europe) (En,De)","9c7546d2fd1399614b035ead1d66aa8d":"Legendz - Yomigaeru Shiren no Shima (Japan)","9cc426f1ccbb18f1e156f6f9ee28d2fc":"Crash Bandicoot Advance - Wakuwaku Tomodachi Daisakusen! (Japan)","9cc7dcf1d0f07687abeec84995c226b2":"Madagascar - Operation Penguin (Europe)","9cdc062badfcb4d0993c4455a4cf3c52":"Sonic Advance 2 (Japan) (En,Ja,Fr,De,Es,It) (Virtual Console)","9ce73ff9aa1473f250d103c1bdbbd738":"Megaman Zero 3 (Europe)","9cef2ca9fba8a4532629f8c7e7c9ddf8":"Another World (World) (En,Fr) (v2.1)","9cf2886c15142660da7f70954b182f1f":"Fantastic 4 (Europe)","9cff0577973c0219738da5995edcf3ae":"Scooby-Doo! - Mystery Mayhem (Europe) (En,Fr,De)","9d01c59abe3149ca2a9c0900571e6914":"Samurai Deeper Kyo (USA)","9d0d27345bf88de8b025aa24d54d6bad":"Mario Party Advance (USA)","9d33a02159e018d09073e700e1fd10fd":"Pokemon - LeafGreen Version (USA, Europe) (Rev 1)","9d3a663de5228414d7e6cda7244c5d91":"Anguna - Warriors of Virtue (World) (v0.95)","9d419bfa53e1c4241e076686bf9646cc":"Meitantei Conan - Nerawareta Tantei (Japan)","9d4af1ce1b242538b52bdfdf30b5b257":"Sister Princess - RePure (Japan)","9d7dba1bb70888a163318cb7015cde66":"Wario Land 4 (USA, Europe) (Virtual Console)","9d816b369343d39b94af9a8b0ce7f63b":"Pokemon - Saphir-Edition (Germany) (Rev 1)","9d84ad590d1dffa33b1b1e2e1d64fb4d":"Ougon no Taiyou - Ushinawareshi Toki (Japan)","9dc72587c935d493a4363f598faea56e":"Castlevania - Harmony of Dissonance (Europe) (Castlevania Advance Collection)","9e02f1c9f26f40905d43188b2bd2d98e":"Sonic Advance (Japan) (En,Ja) (Rev 1)","9e3c1af23ea83cc4852c632525bea1c5":"Ed, Edd n Eddy - Jawbreakers! (USA)","9e6ff628db81caa74dca356eaadadac9":"Crash Nitro Kart (USA)","9e7798abbd16a87548c380891accae28":"Rugrats - I Gotta Go Party (USA, Europe)","9e86774cc5246458cf3f32d64501f56c":"Dokidoki Cooking Series 2 - Gourmet Kitchen - Suteki na Obentou (Japan)","9e95f7804e3b8011b89048f68e541db8":"2 Games in 1 - Hot Wheels - Velocity X + Hot Wheels - World Race (USA)","9ed82843cc54876362be56faccb15d75":"Final Fantasy V Advance (USA)","9edaad5e2b87cf196443a996a0bdf0e2":"Rockman Zero 4 (Japan) (Virtual Console)","9edc43748f363213ceef64b3f3aa4cda":"Peter Pan - Return to Neverland (Europe) (En,Fr,De,Es,It,Nl) (Rev 1)","9edf4f6e19d901d470aa1117cb0372b3":"Legend of Zelda, The - A Link to the Past & Four Swords (Europe) (En,Fr,De,Es,It)","9eecb3d524fe8bc2362b3f0b1045f4ab":"Hamtaro - Ham-Ham Games (Japan, USA) (En,Ja)","9ef8e30824db751f3d42e048514a3624":"Shrek 2 (USA, Europe)","9ef9715f14ae656bbc4a11f5d2cb7480":"Boboboubo Boubobo - 9 Kyoku Senshi Gag Yuugou (Japan)","9f06bd310c8d20249b745e38104067d9":"Duel Masters 3 (Japan) (Rev 1)","9f0877f89cb43331c36f7edbe8c9ba46":"Super Mario Advance 3 - Yoshi's Island + Mario Brothers (Japan)","9f1c1202ed1d856c5836cee6818a171e":"Bokura no Taiyou - Taiyou Action RPG (Japan)","9f22c000f0134489e952348213557f0d":"Mario Golf - Advance Tour (Germany)","9f39a0635363f9e534a4b48c64d52322":"Drome Racers (USA)","9f511c25d8d14ffea0f381e157dab483":"Asterix & Obelix XXL (Europe) (Fr) (Beta 1)","9f6e382bc3600b9a27ba31fabcd78ac3":"Blender Bros. (World)","9f738e440d5a6ebbe5e5dcf8b727bbb3":"Double Dragon Advance (USA)","9f966d8f9f2865e96a42eed33a201cde":"Zook Man ZX4 (Taiwan)","9f9e47a8b37fb27c2f387654797c95a3":"Kill Switch (USA)","9facd164f8558a699b6676868216af91":"Combat Choro Q - Advance Daisakusen (Japan)","9fb5863a15e8504667328d24365b31e2":"Gegege no Kitarou - Kikiippatsu! Youkai Rettou (Japan)","9fd0815a6c2ca0d787952ffbc0a42de1":"Gensou Maden Saiyuuki - Hangyaku no Toushin-taishi (Japan)","9fee0cf88cb21f2009636b0581a3a502":"Kotoba no Puzzle - Mojipittan Advance (Japan) (Virtual Console)","9ff40cf640575211202b7bda5487abbb":"Megaman - Battle Network (USA)","a005c0d182f08177f732f4e03f3eeb68":"Minna no Soft Series - Shanghai (Japan) (Rev 1)","a0451dbc9fabbd40a86b76c30e60794a":"Hikaru no Go (Japan) (Rev 1)","a05c86d8c5291049ebd22304ad9c2029":"Little Mermaid, The - Magic in Two Kingdoms (USA, Europe) (En,Fr,De,Es,It)","a06268ee41dfe596990c1916a6ea0eca":"Chicken Little (Japan)","a06ad4812edb8d042602fcde222f7ab7":"Groove Adventure Rave - Hikari to Yami no Daikessen 2 (Japan)","a08c51144b35f3a09ba1c65b583feddd":"Game & Watch Gallery Advance (Europe)","a0a932c70a245ed923125d7e62b10f01":"Smashing Drive (Europe) (En,Fr,De,Es,It)","a0b6c2fd85ba0fcde92a15daf7aaceab":"European Super League (Europe) (En,Fr,De,Es,It)","a0c9f4034bb720aab33b356b002e8a55":"Doubutsu-jima no Chobigurumi 2 - Tama-chan Monogatari (Japan)","a0ef6d6f6346d5fa888348012eb4f6c2":"J.League Pocket (Japan)","a0f246a1b1516cbc0ce8e8158e221fd4":"Turok Advance (Unknown) (Proto) (Earlier)","a0f41d368e75924c642553e61311416d":"Iridion II (USA) (Beta)","a104896da0047abe8bee2a6e3f4c7290":"Legend of Zelda, The - The Minish Cap (USA)","a160e317dcbd117035214cb47f35c466":"2-in-1 Fun Pack - Shrek 2 + Madagascar (USA)","a1662b3b7ea35cf59070d98b0e7f7ffc":"Kawaii Koinu Wonderful (Japan)","a177481ebdc538ad11692b49367ce18d":"Medabots AX - Metabee Ver. (USA) (Virtual Console)","a18eb28fa9f1ed0afe5248ff2afab896":"WWF - Road to WrestleMania (USA, Europe) (Beta)","a1ac9ff0ab98c1a85204a73fcc750f79":"Ninja Five-O (USA) (Limited Run Games)","a1ae1feaf8199f7c6e2dc368382890ba":"Best Play Pro Yakyuu (Japan)","a1b0a5ba65f8287f7474e984bbfe8561":"Justice League - Injustice for All (USA) (Beta)","a1b8d71fa43915d37b955a2b1a0ed80a":"Megaman - Battle Network 5 - Team Protoman (Europe)","a1be57cb0f1acc812f46657bbfe5904b":"Golden Sun - L'Era Perduta (Italy)","a1d050c200887e57004413a62dcc5d89":"Pazuninn - Umininn no Puzzle de Nimu (Japan)","a1d5334b1b3dd31431eb232716ec8519":"2 Games in 1 - Monsters, Inc. + Finding Nemo (USA)","a1ece5ce4fe328f0c0240fc281de4f4b":"Z.O.E. 2173 - Testament (Japan)","a1f160ee30ed36edea341a6f1c6a4efc":"Donkey Kong Country 2 (USA)","a202eea1b2801421714260d5e02a7492":"Micro Machines (Europe) (En,Fr,De,Es,It)","a217dda835c51021e8b2e68b773e1170":"2 Games in 1 - Finding Nemo + Finding Nemo - The Continuing Adventures (Europe) (Fr,Nl+Fr,De,Nl)","a219b3042eb65899baafa5143c53560c":"Sonic Advance 2 (Japan) (En,Ja,Fr,De,Es,It)","a21ec24a3a55bb2fd02dc419ebb3cb36":"Master System 106-in-1 (World) (Pirate)","a234f8b94fafc111ab29f235361baf50":"Hey Arnold! - The Movie (USA)","a245175357335daa1f2cdf4b9e50ed64":"Apotris (World) (v3.4.5)","a2492ca979c2c616ad38e81e5dc3e655":"Rockman EXE 4 - Tournament Red Sun (Japan) (Rev 1)","a2589a40c3f92a539969124cecc9b828":"Chaoji Maliou 2 (China)","a267752542eea07127e53d6179db760d":"Cyberdrive Zoids - Kijuu no Senshi Hyuu (Japan)","a26c440065d89f56275644ffa34140ef":"Advance Guardian Heroes (USA)","a27db836275aa6f0ba559c6fcfbcde0b":"SpongeBob SquarePants and Friends in Freeze Frame Frenzy (Europe) (En,Fr,De,Es,Nl)","a2bd14f0b57836fe7288e03a6fc154fa":"Sonic Advance 3 (Japan) (En,Ja,Fr,De,Es,It)","a2d26dc774cec9a0b47388a5dd727b03":"WarioWare, Inc. - Mega Microgame$! (USA)","a2d535d55174ec253309d922ca9e594f":"Bakuten Shoot Beyblade 2002 - Gekisen! Team Battle!! Kouryuu no Shou - Daichi Hen (Japan)","a2f0659905664d9a6aafcf9e7a80fcac":"Let's Ride! - Dreamer (USA)","a2f94ded0e81af7cdb36e675e09a60ec":"2 Games in One! - Marble Madness + Klax (USA)","a31d19d40a70646eaeaa233ac46fe8d7":"Rayman - Hoodlum's Revenge (USA) (En,Fr,Es)","a3201407f7988a563f4dfb243db02bcb":"I Spy Challenger! (USA)","a32b069277e1752cda224153fde5a24a":"Medarot G - Kuwagata (Japan) (Virtual Console)","a32d78cb1d76eb097760417f232b4b76":"Megaman - Battle Network 5 - Team Colonel (Europe) (Virtual Console)","a340d5d4d96a0f49d66112ad25820118":"Dragon Ball - Advanced Adventure (Europe) (En,Fr,De,Es,It) (Beta)","a3658157b02a6f5618866af93c9b771d":"Mario Tennis Advance (Japan)","a378742dd5e02c8511198bcf1cb551cb":"Barnyard (USA) (En,Fr,De,Es,It,Nl) (Beta)","a37aace8fef3098138b045eb26493730":"Twin Series 6 - Wannyan Idol Gakuen + Koinu to Issho Special (Japan)","a3827342698bd0ff407e2d805bfc27ad":"Bleach Advance - Kurenai ni Somaru Soul Society (Japan)","a3add916e37dc978a45853703d67d48d":"Bakuten Shoot Beyblade 2002 - Gekisen! Team Battle!! Seiryuu no Shou - Takao Hen (Japan)","a3b2dd184e80764a1a3c0d7799089327":"Ford Racing 3 (USA)","a3dca1a3167cb855aacdca650c4ce39f":"Mario vs. Donkey Kong (Europe) (En,Fr,De,Es,It)","a3dd3b98ad5049503af18f80c84731fc":"Atomic Betty (USA, Europe)","a3e8563f64ae52332c7a7eceec73f5ff":"Polarium Advance (USA)","a3ee8987d717a94353c05462639b1946":"Tottoko Hamutarou 3 - Love Love Daibouken Dechu (Japan) (Beta)","a3f7ef5c049c16a450037d5aa51f25e7":"Tantei Gakuen Q - Meitantei wa Kimi da! (Japan)","a4078f38dbb47ab22a9c74b725f3e481":"Doom (USA, Europe)","a40e7bbd268202da470950335a6793f5":"3 Game Pack! - The Game of Life + Payday + Yahtzee (USA)","a40e90f68309ad1fd0b9efe33dcc6ba8":"Pokemon - Edicion Zafiro (Spain) (Rev 1)","a413cf9036c03eac937539a255ac6949":"Breath of Fire (Europe) (En,Fr,De)","a44251198e1c9087c40262c34531a5a3":"Yu-Gi-Oh! Duel Monsters GX - Mezase Duel King! (Japan)","a455d815cdb8cbc740961bb72bec4475":"Ecks V Sever (Europe) (En,Fr,De,Es,It)","a458d8cf99ee5dbf244b0900e7df0588":"Nakayoshi Pet Advance Series 3 - Kawaii Koneko (Japan) (Rev 1)","a45e4c70fa05008d3e90f2bfc1f6dc93":"Croket! 2 - Yami no Bank to Banqueen (Japan)","a46846238a4e41ab301f44a3e34d1779":"2 Games in 1 - Scooby-Doo + Scooby-Doo 2 - Les Monstres Se Dechainent (France) (Fr+En,Fr,De,Es,It)","a476526adc63d7e287d905eb7251d120":"Gyakuten Saiban (Japan)","a479748cb20e4ed3d72a829dc5a870fd":"B-Densetsu! Battle B-Daman - Moero! B-Damashii!! (Japan)","a4837934ffe072aa692d7bdb1100e34d":"Action Replay (Europe) (En,Fr,De,It) (v3.3)","a48cfab18f650815c7152f55d9727946":"GB-A TV Tuner PAL (China) (v1.3)","a491402dd313a7c2cdd06f9ef072c0f3":"Skyland (World) (Proto 5)","a4a45873932ec855d0a96fca52fe81ea":"Ninja Cop (Europe) (Limited Run Games)","a4bf3aa27a7c5c3ffd0dcaf27da99486":"Hardcore Pool (Europe) (En,De,Es,It)","a4da40efe56a8ca4190b4f8f6b7b4f60":"Robot Wars - Extreme Destruction (Europe) (En,Fr,De,Es,It,Nl)","a4de2d3cbdc2bd88946ff2ead5d80d5d":"2048 (World) (GBA Jam 2024)","a4e3e4754c7bd16e5e2a52ee83ab2be1":"Digimon - Battle Spirit (USA)","a4e4230baf0e3b819c84eae58097cdb0":"Ultimate Muscle - The Kinnikuman Legacy - The Path of the Superhero (USA)","a4f50dc3b3cdd6b3d688e1b89b34703d":"Mickey to Donald no Magical Quest 3 (Japan)","a4fe285e6e4c0248d9d2fd9ae22590cd":"bit Generations - Dialhex (Japan) (En)","a505bbbc5a97c174d861fe450f0865a4":"I-Ninja (USA) (Proto)","a509c1b5fa74f70550ee81386c7fe4b9":"Kien (World) (Incub8 Games)","a515e58baf034344f78076025c3c99c9":"Youkaidou (Japan)","a52ce4e5e4dd8761a15521712c7dddd1":"Metroid - Zero Mission (Europe) (En,Fr,De,Es,It) (Virtual Console)","a5618debdd650074cdebee32a2d58704":"Tremblay Island (World) (En) (v1.1) (Kickstarter Edition)","a573f9a77a0a118f111e63880569bf1d":"Trollz - Hair Affair! (Europe)","a5775a65801ccdd6c88778262d9a4d0a":"Totally Spies! 2 - Undercover (Europe) (En,Fr,De,Es,It,Nl)","a57dd211881c6fbb7b92487ab6e3b9af":"Justice League Heroes - The Flash (Europe) (En,Fr,De,Es,It)","a581264601cbd608bd19922de4dc871e":"EZ-Talk - Shokyuu Hen 3 (Japan)","a5968bc058ea60a1e389bcd9306d9c7d":"Tekken Advance (Japan)","a5a84ac11de577f929c19996fa15a25e":"Super Robot Taisen A (Japan)","a5ae01eda1b2ff6c16c9f69dbbdae488":"GBADoom (World) (v2.7)","a5b5b2b18363d37560f48a2fff83f471":"Tower SP, The (Japan)","a5b75829debc9262b08076a94c8473eb":"Gunstar Super Heroes (USA)","a5baa0d069192da6eff1944876b50b03":"Powder (World) (v1.18)","a5bf85cd40533d76a1fb2b0b2f8d5b19":"Popeye - Rush for Spinach (USA, Europe) (En,Fr,De,Es,It)","a5c6b967e5d7c35d2aba50bbf4c5657c":"Aka-chan Doubutsuen (Japan)","a5c7e848777e487bb762131146c5e0ec":"Turok Advance (Unknown) (Proto) (Dark Version)","a5f4c03f31988a0bd97569372e1f826d":"Bouken Yuuki Pluster World - Densetsu no Plust Gate (Japan)","a601f5dcf364cced8eba00f68b8d3938":"Barbarian (USA, Europe) (En,Fr) (Proto 2)","a62155a1c3dd4bad9e260a2bf527b69f":"Monster Guardians (Japan)","a64cd7fa9c84da61a4a358c321f248df":"Chicken Little (USA, Europe) (En,Fr,De,Es,It,Nl)","a6523df3d20921b3fb37bd53bb1a026e":"Super Panda (USA)","a668a8f0847a99d34463661563b4fc0f":"Powerpuff Girls, The - Him and Seek (Europe) (En,Fr,De,Es)","a6c6879b9dcf9a67991f4cf81462498c":"Tony Hawk's Downhill Jam (Europe) (En,Fr,De,Es,It)","a6c803e0887f46db78bdf095628ed7de":"Casper (USA) (En,Fr,Es)","a6cc5b4377dc7396fa275113e1b958b4":"Star Wars - Flight of the Falcon (USA)","a6e3e17f96065a33c8ad3b540583fb64":"Medabots AX - Rokusho Ver. (Europe) (En,Fr,De,Es,It)","a6e8aa4c79ad8c68922c749ab7de7829":"Chaoji Maliou DX (Taiwan)","a6fe988a31724789a21bae6b65cd79b2":"Defender of the Crown (Europe)","a7050cb081978c01421677d386933512":"Davis Cup (Europe) (En,Fr,De,Es,It)","a7265630754bd040cb54f7fb27fdb9f9":"Driv3r (Europe) (Beta 3)","a72a1d999e9c607144fa7f3c2145eb75":"Wizardry Summoner (Japan)","a73253d79628d92c2fee1e9d2bbd6ff5":"Flintstones, The - Big Trouble in Bedrock (USA)","a7511d8a3982f175adf8ef683b96b24b":"SpongeBob and Friends - Attack of the Toybots (Europe) (En,De)","a7589564716d173192e290e9c97e040a":"Made in Wario (Japan)","a7763d58c7fd18307cefd9bcb6391d89":"Aero the Acro-Bat - Rascal Rival Revenge (USA) (Beta 2)","a7ad5647f3788ae37870e6dffe2122e7":"Konchuu Monster - Battle Master (Japan)","a7b49de9ab6230d8077bbef4d906497b":"Bratz - Babyz (Europe) (En,Es,It)","a7f1cc981555e953032a5444f2b2e0e6":"Akumajou Dracula - Circle of the Moon (Japan) (Castlevania Advance Collection)","a7f1f118df6437e4dc1d2906dbb2109b":"Castlevania - Akatsuki no Minuet (Japan) (Virtual Console)","a80377600d682074b81b97c9f616dcd5":"Metroid Fusion (Europe) (En,Fr,De,Es,It) (Virtual Console)","a80a447ebde7c4bac73caf9d6910f9ee":"Fruits Mura no Doubutsu-tachi (Japan) (Rev 2)","a8110c3928caffb9a73b48a009f9044f":"Rockman Zero (Japan)","a822bdf8301f00b392627f7e3476510c":"Double Game! - Quad Desert Fury & Monster Trucks (Europe)","a822dd94ad89ea5fe660a2564d6558a5":"Advance Rally (Japan) (En)","a827b6305c196589c0fa6ed2f9ec0e3b":"CT Special Forces 2 - Back in the Trenches (USA) (En,Fr,De,Es,It,Nl)","a8285fd50dde50dc2c37fc0375dc03cf":"Banjo-Pilot (Europe) (En,Fr,De,Es,It) (Beta 2)","a82bd152baf314b0d69a12a47c38e60f":"Shantae Advance - Risky Revolution (World) (Limited Run Games)","a82de7e0ffe0dc709205706b5293dc1a":"Toadally Awesome (World) (GBA Jam 2021) (Unlocked)","a85abd253b9716a6266442b6f26362c4":"Power Rangers - La Force du Temps (France)","a85ba35d880113d4f92163e899948c04":"Double Pack - Sonic Advance & ChuChu Rocket! (Japan) (En,Ja,Fr,De,Es)","a88efbbba70ec2bb2a9a82ea127a17d1":"Super Mario Advance - Super Mario USA + Mario Brothers (Japan) (Virtual Console)","a894d51e4c9ae34b398b7dfcddffc074":"CIMA - The Enemy (USA)","a8adfb32c1d57a1071acc7b9a47733ce":"Tennis no Ouji-sama 2003 - Passion Red (Japan)","a8af304d0a9a60911018847cdea41eb8":"Pac-Man Collection (USA) (Virtual Console)","a8c8ff92a6b366fc0e363eb80201c367":"Rayman 3 (USA) (En,Fr,Es)","a8d1fd87ad24b27327f3974881bfc193":"Tir et But - Edition Champions du Monde (France)","a8e39c39ef1e7d2005adb624c6b0fa2f":"Shimura Ken no Baka Tonosama - Bakushou Tenka Touitsu Game (Japan) (Rev 1)","a8efef99521a3267779262aa1249d3c8":"Stepper (World) (v1.7)","a93c24b102f9ffbd5676e18f2e4cb33c":"Pokemon - Rubin-Edition (Germany) (Debug Version)","a9572991316ac2e105abfec80aaeb02e":"Snood (Europe) (En,Fr,De,Es,It)","a980189cfb6200a8a092eca53c85af80":"Tom Clancy's Splinter Cell (USA) (En,Fr,Es)","a9a2f5d60ea44e08901abdfe69f2438a":"Densetsu no Stafy 3 (Japan)","a9bcc7b2c3dd026b28d442d7c73891e4":"Alice Sisters (World) (En,Ja,Fr)","a9c50293ac1c9c2fc59308f0ec1ba892":"Snap Kid's (Japan)","a9c93a07964aa816a8e226ae0c735a41":"Crash Bandicoot Purple - Ripto's Rampage (USA)","a9cb22cd3729b8116c00de9881bb9cae":"Rocket Power - Beach Bandits (USA, Europe) (Beta)","a9ed5e9ce8b27136133af666474fd42d":"Cars - Mater-National Championship (USA) (En,Fr)","aa12b4cf5078876a16bbfacde46d4bc0":"Shoot for the Moon (World)","aa1d5eeffcd5e4577db9ee6d9b1100f9":"Megaman Zero 3 (USA)","aa4acde4d4147725f74efbd03a1c65e4":"Max Payne Advance (Europe) (En,Fr,De)","aa571c3f25128f4b1cbfac89a7ae5d99":"Tiger Woods PGA Tour 2004 (USA, Europe)","aa78b66d1c1fd334587c0ebe7932d006":"Wings (Europe)","aa99d027561a92eb5a5af4e48f6e560c":"Madagascar (Spain)","aa9aeea52de34b25351e76d70bfbe2b8":"Rockman Zero 3 (Japan)","aaa5acb5b94fccc8f3de8fef3f1a22cb":"Cars - Mater-National Championship (Europe) (En,Fr,De,Es,It,Nl)","aacbdc2916c5941607b0b2d6d68512ed":"Fire Pro Wrestling (USA, Europe)","aaf042d4aa5852a653ea4416cc798101":"2 Games in 1 - Scooby-Doo + Scooby-Doo 2 - Desatado (Spain) (Es+En,Fr,De,Es,It)","ab0999e2d7c13ada9cf374cd0aa47f97":"Mech Platoon (USA)","ab1bb302ca8dbbb2066491e686f32d3e":"Ultimate Brain Games (USA, Europe)","ab1c6c1e37df4c3dacf88a1ecbe59afd":"F1 2002 (Europe) (En,Fr,De,Es,It)","ab1caa14f56ce349b95216816a2dbb62":"X-Man - Armour of Might (Russia)","ab2a7f46b0c806429ce56ff53df10620":"Crash & Spyro Super Pack Volume 2 (Europe) (En,Fr,De,Es,It,Nl)","ab6251b0f54cf6787fd4a6b5d5d4c5b6":"Nakayoshi Pet Advance Series 3 - Kawaii Koneko (Japan)","ab74d01622e145a4687ffc3e8af5f86b":"Tak and the Power of Juju (Europe) (En,Fr,De)","ab7b66435bcecb60a786fd62a532e4ab":"Tom Clancy's Splinter Cell (Europe) (En,Fr,De,Es,It,Nl)","ab9f346110d5b97afa4e3e10347d1000":"Daredevil (USA, Europe)","abf042be32e2aeab1b926efe6d4b8b8b":"Pocket Monsters - Sapphire (Japan) (Rev 1)","abf8a36e5cb2ef2c989ac44b5ebe68ea":"Chou Makaimura R (Japan)","abfa372f860d0f10037bf28cc78de409":"Summon Night - Swordcraft Story (USA)","ac0311b3923d45b89a2db746280c7915":"Yu-Gi-Oh! Duel Monsters Expert 3 (Japan) (En,Ja,Fr,De,Es,It)","ac2b848b30e70d73fa2695f9aed54624":"Unfabulous (USA) (Beta 2)","ac4f3b73a920ddaabc9f9e003c92e02b":"Vattroller X (Japan)","ac593798dfb4a39c4502ba3ea9092680":"Recca no Honoo - The Game (Japan)","ac693d395395405b5cc902877025e675":"Classic NES Series - Xevious (USA, Europe)","ac7714ceeab8964ea40cfac5c52afd5f":"Spirit - Der Wilde Mustang - Auf der Suche nach Homeland (Germany) (Beta)","ac79eaa4c54cec46f8d6d9878c11a390":"Magical Houshin (Japan)","ac807e619878b8219240d908bd7d5ed6":"Sea Trader - Rise of Taipan (USA)","ac9b62069b180da5ddf1646d4e142d59":"Megaman - Battle Network 4 - Red Sun (Europe)","acac2e3c7752f2407d787f084c0bf6f8":"Rocket Power - Zero Gravity Zone (USA)","accb22e06c37f68b55d8fa34853f885b":"Bratz (Europe) (En,Fr,De,Es,It)","acce7ee3388d135aaa8c5ec88e568182":"Super Hornet FA 18F (USA, Europe)","ace5dff7d63fb765515b43e6950a455c":"Nicktoons - Attack of the Toybots (USA)","aceaffd0c62017a1bb4df5817b61a0a7":"2 Games in 1 - Buscando a Nemo + Los Increibles (Spain) (Es,It+Es)","acefebbe5fdf25ae83a386a6d1c09bca":"Yu Yu Hakusho - Ghostfiles - Tournament Tactics (USA, Europe)","acfd5c0223a5719665d464d72b6d1b33":"Game & Watch Gallery 4 (USA) (Virtual Console)","ad0952bfb34dfedb56b1a009ea1656de":"Top Gear GT Championship (USA)","ad4cf738f97416827baf17d6c43576d7":"Advance Wars 2 - Black Hole Rising (Europe) (En,Fr,De,Es,It)","ad56e4df06d70f83548f2ec92dcc15ed":"Chi Vuol Essere Milionario (Italy)","ad5bc8554ad143698f62be566789c519":"SpongeBob SquarePants - SuperSponge (USA, Europe) (Beta 8)","adc583b26cef3920fb9ffd152aeb98dd":"Back to Stone (USA) (En,Fr)","ade79cc8fac2f433648fb95ca8c51164":"Yu Yu Hakusho - Ghostfiles - Spirit Detective (Europe) (En,Fr,De,Es,It)","adf1ac69caf510176ee1028ecf6f7adf":"Cat in the Hat, The (USA)","adf9efca75fad810c13a5fb3326dddd2":"2 Game Pack! - Matchbox Missions - Emergency Response + Air, Land and Sea Rescue (USA)","ae17a09073dc708469e6a77c537d3f21":"Tennis no Ouji-sama 2003 - Cool Blue (Japan)","ae1ab2aeeda397fb25536a6851f43fe1":"Kiss x Kiss - Seirei Gakuen (Japan)","ae34e324b26f0d693ee73f6a4b8b995e":"Fire Pro Wrestling 2 (USA)","ae35fb67a74c92a3f063408fd0bc4a29":"Custom Robo GX (Japan)","ae5ee35f0aadf386cb6918a2d83f5a3b":"Lunar Legend (USA)","ae77f77fe5879abfa3a15d4422dac2db":"Battle Network - Rockman EXE 2 (Japan) (Rev 1)","ae89bfb0fe9892c92c061013be4619a2":"Minna no Soft Series - Zooo (Japan)","ae8af6b539d509019bdd06565c10804a":"Super Mario Advance 4 - Super Mario Bros. 3 (Europe) (En,Fr,De,Es,It) (Rev 1)","aea3115b6ce9a25aa574c9754f4fedfb":"Guilty Gear X - Advance Edition (Japan) (Beta)","aee29c76808d8debcfb3b7945270861b":"Dora the Explorer - Super Star Adventures! (USA)","aee485056bb727880ab4f4056b7da477":"ESPN International Winter Sports 2002 (USA)","aef559ca2b6f1ee37c423b46bb4ff909":"Lizzie McGuire 3 - Homecoming Havoc (USA)","af4d91a53dd51e98e6c5249502897904":"Mario Party Advance (Europe) (En,Fr,De,Es,It) (Virtual Console)","af5040fc0f579800151ee2a683e2e5b5":"Metroid Fusion (USA)","af76bcb446cfc602c856a1e03c6bcf38":"Famicom Mini 01 - Super Mario Bros. (Japan) (En) (Rev 1)","af7e218eb4a7f28f1887b3504647854e":"Phantasy Star Collection (USA)","af8b0b175f7ec8914cb87b3161ba1aaa":"Mother 3 (Japan)","afa41ce5b29fae6464ca878691edb46b":"Contra Advance - The Alien Wars EX (USA) (Virtual Console)","afa8a9e3d7a2cd86c6ce8331532825b0":"Terminator 3 - Rise of the Machines (USA)","afbd8a5d314391d9731692cc1131dc6c":"Bratz - Forever Diamondz (USA)","afcd7bcfdc31ae934333da25db6107c0":"Thunder Alley (USA)","b0118c3619b732c172ce9770393d8a06":"Paws & Claws - Pet Resort (USA)","b01251955731bf7509cb09af8f49ad1d":"Sushi the Cat (World)","b038a9370b9a3924d38faa4eae6254d3":"Madagascar - Operation Penguin (Europe) (It,Nl)","b03e618d511a7ed9ec3adc43bd58aa96":"Megaman - Battle Network 5 - Team Protoman (USA) (Virtual Console)","b05e5030da8f059ce836a594e16309b5":"FIFA Soccer 2003 (USA, Europe) (En,Fr,De,Es,It)","b06f2e981aa7702e7a13602f8e5013d1":"Madagascar (Europe) (Fr,De,Pt)","b075dcf2b63a992e10204b553800ff40":"Pokemon - Versione Zaffiro (Italy) (Rev 1)","b09c14c35eeef27b30398ac7ac81e6fc":"Hero Core (World)","b0a0c0fd729544c7fd786a6a4d4b419f":"Cabela's Big Game Hunter (USA)","b0c2d1eea6b076c167fd74ce79538d91":"Phantom, The (Italy) (Proto)","b0c8edeae511c647f9617b32ddc37594":"Barbie Horse Adventures - Blue Ribbon Race (USA)","b0cb6dc69206ed9b20496e49ae2840cc":"Downtown - Nekketsu Monogatari EX (Japan)","b0d1a5d5633e521dc9116f866b3e3cd4":"Scrabble Scramble! (Europe)","b0f1054d5177dd8ec5f90b63fb1c6e09":"Motocross Maniacs Advance (USA) (En,Es)","b106f85e2f6c3a460e8ca5cc2261c90b":"Kill Switch (Europe) (En,Fr,De,Es,It)","b107d6671edc1721663b451836df0753":"Medabots - Metabee (USA) (Virtual Console)","b10afb07357cb31ac7c77d431894ea61":"Quake (USA) (Proto)","b10d956c9e9dd247b9602d4960db9557":"Rushed Adventure (World) (Proto) (GBA Jam 2024)","b1318e5c93aaef441fc5e596996df870":"Hyper Sports 2002 Winter (Japan)","b13292b1d67976f9abf8a318743e88d5":"Shrek - Smash n' Crash Racing (USA)","b14194832a55a7197916edb0bb92bea3":"Rocket Power - Dream Scheme (USA, Europe)","b14872072d464be5df4f1a1d09c158f6":"Acrobat Kid (Japan)","b152f47bf277560ecc1054ae8981a775":"Denki Blocks! (Japan)","b15b6cb642868b1b92031a10e5a68dd7":"Ice Nine (USA, Europe) (En,Fr,De,Es,It)","b169016486294d9d9eb61bbf96d30400":"Mat Hoffman's Pro BMX (Europe) (Fr,De)","b186a9ba291a156c45640cb3c6b8a710":"Medabots - Metabee (USA)","b19314e2b31266364a7a12d9d4b00b85":"Hot Wheels - Velocity X (Europe)","b1c3362836665e8cbc70afbc258078ed":"Kirby - Nightmare in Dream Land (Europe) (En,Fr,De,Es,It) (Virtual Console)","b1ca40e6e5815da256890ecaab1b5d73":"Advance GT2 (Japan) (En)","b1ca9871a584ee4da0176e3f43cb9846":"Goodboy Galaxy (World) (En,Ja,Fr,De,Es,Pt-BR,Zh,Ar) (Evercade)","b1e538380c4c0595ac47ee8059f5a614":"Go! Go! Beckham! - Adventure on Soccer Island (Europe) (En,Fr,De,Es,It)","b21129cb55d887d0ef4481c699feed99":"Yu-Gi-Oh! - World Championship Tournament 2004 (Europe) (En,Ja,Fr,De,Es,It)","b21148257d0aeadaf9c6cb35b857473e":"Samurai Evolution - Oukoku Geist (Japan)","b2436c0b6e02d17771b48cdcf24bee66":"Diadroids World - Evil Teikoku no Yabou (Japan)","b24a17d080a01a404cbf018ba42b9803":"Megaman Zero (USA, Europe)","b282e479e10aea057e762de7b9d4ca4b":"Crash Bandicoot XS (Europe) (En,Fr,De,Es,It,Nl)","b288c64ec50625b6b80bc6730efbf190":"Yu-Gi-Oh! Double Pack (USA)","b295f02a07f00f80669352767242268f":"ATV - Quad Power Racing (USA, Europe)","b2b2642e49ce5518aafc19f27aa2d8ec":"Mandrake the Magician (Italy) (Proto)","b2c954ccf09e408c55886b6686d39c6f":"Justice League - Injustice for All (USA)","b2e1c0de1d83068b2daa90efc543bd29":"CT Special Forces - Back to Hell (Europe) (En,Fr,De,Es,It,Nl)","b32cb8feed35b03fd6a49d50dc9223c7":"Mario DX (USA)","b33f6d3a7151f15cd10f71a7e2b3dfdd":"Croket! 3 - Granu Oukoku no Nazo (Japan)","b354078c54b943bdc6d2227e4686ea0f":"Mario Kart Advance (Japan) (3DS Virtual Console)","b35d9966fe8138e00473690bc522e99e":"Famicom Mini 02 - Donkey Kong (Japan) (En)","b3806462180cda73d1f8f48d72236394":"Donkey Kong Country (USA)","b3a719f647a84f5496c0ad97d5de6370":"Santa Clause 3, The - The Escape Clause (USA)","b3c187c391a4a75c257ecc83abab30a8":"Meitantei Conan - Akatsuki no Monument (Japan)","b3f65540eea88983c63e454b34d3028e":"Cartoon Network Speedway (USA)","b3f6ea2a0876d9b706ef7f79a0479a32":"Hoshi no Kirby - Yume no Izumi Deluxe (Japan)","b41973fcaf82c8ea2bb216027d89cba6":"With the Last Moonbeam (World)","b41a755562a4128829c6dc12c8aba3e3":"Shikakui Atama o Maruku Suru. Advance - Kanji, Keisan (Japan)","b433dca158d3bc3d73cb0ba6e831b258":"High Heat Major League Baseball 2003 (Japan) (En)","b4430351ceee3856e9b0f4da194f24a2":"Grim Adventures of Billy & Mandy, The (USA) (Beta)","b44aacbfe0a64d73b466f8f7bcca4577":"Card e-Reader (Japan)","b468236a140da4ee89286878a0964e9f":"Poke Inu (Japan)","b46ab3d1332497978488243d762ef5b8":"Monster! Bass Fishing (USA)","b47db8937426d5a23fba3c51acd5fe69":"Mijn Dierenpraktijk (Netherlands) (En,Nl)","b4863030186e7e1da0a6009dada06cd5":"Super Dodge Ball Advance (Europe)","b488acd6e738bce4ce01bfb3e41f94e1":"Danny Phantom - Dschungelstadt (Germany)","b48c238ac77b2b56dd3f32a470f2a2fb":"Final Fantasy Tactics Advance (Japan) (Virtual Console)","b48cfda5bd9b7efe4f0c23f5e65d2c95":"2 Games in 1 - Disney Princess + Brother Bear (Europe) (En+En,Fr,De,Es,It,Nl,Sv,Da)","b48f441dc1d55a69a325ad812aef764f":"Penny Racers (Europe)","b4b64ffa04795ef56f3925702a2be291":"From TV Animation One Piece - Mezase! King of Berry (Japan)","b4b8e9fbb47a947850f127465c8bee40":"Sabre Wulf (USA)","b4d933095f1be113f2b64f61e21b4055":"Grand Theft Auto (Europe) (En,Fr,De,Es,It)","b4da8d96a5701f91ef8934ee84b8358f":"Shin Sangoku Musou Advance (Japan)","b501e065253565e69f7bee03fc67b2e8":"Notebook Adventure (World) (v1.3)","b504e9661ab08f4afd15ead4c1bedb67":"Rayman IV (USA)","b50707ad72a97b131f4d620483287f95":"Space Channel 5 - Ulala's Cosmic Attack (USA)","b51533d78e10faa7d17774adbbb03f44":"EZ-Talk - Shokyuu Hen 6 (Japan)","b5170bf7f64f0a75c33a17dc63d69a52":"Xploder Advance (Europe)","b517b393437faa7b1dfb65ba5dca7baf":"Spyro Superpack - Spyro - Season of Ice + Spyro 2 - Season of Flame (USA)","b5296cda1c554337e684d880d7573b99":"LEGO Star Wars II - The Original Trilogy (Europe) (En,Fr,De,Es,It,Da)","b529df3eeff903b24a6d6f4f5541ec99":"Konami Krazy Racers (Europe) (Virtual Console)","b52a72e07155057e21e6519472f5a2aa":"Disney Sports - Basketball (Europe) (En,Fr,De,Es,It)","b5509a24acd58ddcb3d2e251a074f494":"Need for Speed - Underground 2 (USA, Europe) (En,Fr,De,It)","b5518f9500708791a1fe10de6b8c3522":"All-Star Baseball 2004 (USA) (Beta 1)","b56902772665713f80ac9fcf28975913":"Chou Makaimura R (Japan) (Virtual Console)","b56f85ff2f37c51acd2e2561abbccb64":"Atlantis - The Lost Empire (USA, Europe)","b57e44b1f52647510caa08f09cfb8e1b":"Serious Sam Advance (Europe) (En,Fr,De)","b5826ea94a5b01ab8362eb5b50aaec2c":"SpongeBob SquarePants - SuperSponge (USA, Europe) (Beta 10)","b5862d95089400c28594a1f5fd09aaa9":"Stuart Little 2 (Europe) (Rev 1)","b5aaa0329d150452520aa0dec5599aad":"Dave Mirra Freestyle BMX 2 (Europe) (En,Fr,De,Es,It) (Rev 1)","b5be468e85618343bc7ab78588cb5163":"Cosmo & Wanda - Wenn Elfen Helfen! - Das Schattenduell (Germany)","b5da52577265dbb1d98977da249c4e20":"Secret Agent Barbie - Royal Jewels Mission (USA)","b60abac7fdbf012de5a3c9403ece89e8":"Dragon Ball GT - Transformation (USA)","b618fdd6303b5fa0f38c472e7ba6cc26":"Famille Delajungle, La - A la Poursuite de Darwin (France)","b62f11b1d014d5c5c2dd703676cb443d":"Sonic Advance (Japan) (En,Ja)","b63010010c4ad6877209b5cc41d368f2":"Classic NES Series - Dr. Mario (USA, Europe)","b63b2244edc2385ae1eab9c8ee448c6f":"007 - Everything or Nothing (USA, Europe) (En,Fr,De)","b658a9b8641db5c1a94d61b6fcc05da5":"Tony Hawk's Pro Skater 2 (USA, Europe)","b697e95bb90b9dc670ca4872c72bd36c":"Shinyaku Seiken Densetsu (Japan)","b6984ca369145367ab79eb33f2f3480e":"F-Zero - GP Legend (USA)","b6af8c28bcb17fb7564aa638eda471ef":"Kim Possible (Europe) (En,Fr,De,Es)","b6d0bdfb98d0ab084087e7284cb53bb6":"3 Games in One! - Breakout + Centipede + Warlords (Europe) (En,Fr,De,Es,It)","b6e949610feec32108b4bdc62d1be4dc":"Ice Age (Europe) (En,Fr,De,Es,It)","b6ef26112e4fbb50aabae5bf84250260":"Pokemon - Aura Mew Distribution (Spain) (Kiosk)","b6f2c552e3282344a81d8da3cdcb7041":"Dragon Quest Characters - Torneko no Daibouken 2 Advance - Fushigi no Dungeon (Japan)","b705e04f4571cc9e8801900b4e0243fd":"World Tennis Stars (USA)","b70a1cfd17b2194ad99b2abf558aadf2":"Curious George (USA)","b7112785daa196847e610783cc2e9d8a":"Star Wars - The New Droid Army (Europe) (En,Fr,De,Es)","b714f4fa916ca53e24434eb7dbfed73b":"2 Games in 1 - Hot Wheels - Velocity X + Hot Wheels - World Race (Europe)","b71bd7d6765ead8c9c657006735cf70d":"Super Mario Bros. (Japan) (Hot Mario Campaign)","b7236bf34d66ead26ba5b6c1cb16c5f0":"Spyro 2 - Season of Flame (Europe) (En,Fr,De,Es,It)","b7315dd0a12a56b0147b3fb8169d33f0":"Shark Tale (Japan)","b7685a523a772e659d992e071aa2cd1e":"Finding Nemo - The Continuing Adventures (Europe) (Fr,De,Nl)","b77bac65ffe2931764adbaec3a8cd995":"Spirit - Stallion of the Cimarron - Search for Homeland (Europe)","b77c57c60fc0dcba3b2ddd3e2f1c5f86":"Kururin Paradise (Japan)","b78374783ce0c8a6cb003c16a42da9af":"Harry Potter IV (USA)","b786fd9c2d48188c7bdb32f29b742187":"Mario Golf - Advance Tour (Italy)","b79c5c98e01fcf89cba5431278c9076f":"Mario Golf - Advance Tour (Europe)","b7a094f8568555602158dcee3750179f":"Finding Nemo (Europe) (Es,It)","b7a8d621700b9397d440d0c1fc828154":"Shining Soul II (Japan) (Virtual Console)","b7b0e7a5f8e8bd22ac9f5766d1acef56":"Castlevania (Europe)","b7b1550606411b985b54f75f0750feb1":"Dragon Ball Z - Taiketsu (USA)","b7bd2a56bc92f5e04ea7bcbc2841c57e":"2 Games in 1 - Sonic Battle + ChuChu Rocket! (Europe) (En,Ja,Fr,De,Es,It+En,Ja,Fr,De,Es)","b7bd37b2b39b8aaad6f297423db2d2a2":"Shrek - Smash n' Crash Racing (Europe) (En,Fr,De,Es,It)","b7f7cbc994934461db0a94cb8b752873":"Crash Bandicoot Advance (Japan)","b8151c67817f126b56eca07c0b6aec11":"Baldur's Gate - Dark Alliance (Europe) (En,Fr,De,Es,It)","b817219c91faedd9fe53f7c226ff0364":"Super Robot Taisen - Original Generation 2 (Japan)","b81b9913a787699cf76b0b4807518956":"Shrek 2 - Beg for Mercy (Europe) (Fr,De,Es,It)","b85b495da78f807409dd55907d25d220":"SpongeBob SquarePants - SuperSponge (USA, Europe) (Beta 5)","b8663b80eef5a1e9b41b683aa1234902":"Pokemon - Version Rouge Feu (France)","b86876fdb1125cc3132dab1cc0d6eb74":"Pop Idol (Europe)","b873e7eb99e10a34958cfddcb1a66e9e":"Rayman IV (Russia)","b89053aa50d8eb4b869e7dfec83a3043":"F-Zero - Falcon Densetsu (Japan) (Virtual Console)","b8a651f0fc9080bf42044c93a746b5e7":"SpongeBob SquarePants and Friends Unite! (Europe) (En,Fr,De,Es,Nl)","b8a7c976b28172995fe9e465d654297a":"Yu-Gi-Oh! - Ultimate Masters - World Championship Tournament 2006 (USA) (En,Ja,Fr,De,Es,It)","b8b1bffea715392586d6a549ced8f0e2":"Ochaken no Heya (Japan)","b8b752c5659e94c0474fe6050df498f2":"Brother Bear (Europe) (Fr,De,Es,It,Nl,Sv,Da)","b8caeb3b81d7d5eb7b6924d5c37df19e":"Space Channel 5 - Ulala's Cosmic Attack (Europe)","b8dbbb2938a8dbf2b434ba4963e2b35e":"Crash Advance IV (USA)","b8f6082b8f1a88b9dab0565ca19a2e64":"Tang Tang (USA)","b8fb00c59242afc33b1a40d0d2b94ee7":"Final Fantasy V Advance (Japan)","b8fd606bc897f26ac47169ad3522ca0f":"Hudson Best Collection Vol. 4 - Nazotoki Collection (Japan)","b940eae646950fc687e9ad29f8d43e0d":"High School Musical - Livin' the Dream (USA)","b9434c3f72e6e0d1b79eb7ab65634840":"Britney's Dance Beat (Europe) (En,Fr)","b9634f900966068cd331074f78da553e":"F-Zero - Maximum Velocity (USA, Europe) (Virtual Console)","b9731d99116248946e32d4f6d4448160":"Final Fantasy Tactics Advance (USA) (Virtual Console)","b97c2e5c0d2668ebb244d6afa0b1ad95":"B-Densetsu! Battle B-Daman - Fire Spirits! (Japan)","b98c04116cb1bd98415b9b7b9c1281d3":"Metal Slug Advance (Japan) (Beta)","b9b3be20dacbdf7d06b7ee86e73b677a":"Woody Woodpecker in Crazy Castle 5 (USA)","b9b42f3e2d54921ee657bc027fa364b9":"Harry Potter and the Chamber of Secrets (USA, Europe) (En,Fr,De,Es,It,Nl,Pt,Sv,No,Da)","b9c0646696297fb21cfad315c434cc2a":"Zone of the Enders - The Fist of Mars (USA)","b9c2fad1c168bfd5d0b5a6930e4e1ad2":"Power Rangers - Ninja Storm (USA)","b9d1da4a076ac3ff5f08fc3a2ab76fc9":"Ant Bully, The (Europe) (En,Fr,De,Es,It)","b9e0b9a3d0b7afbde1aaf9a26a827723":"Super Street Fighter II Turbo - Revival (Europe)","b9f78309dbce23a4262dc32c1def62a2":"WTA Tour Tennis (USA)","b9fb4f6d037649f4f87cc47f36d60869":"Hello! Idol Debut - Kids Idol Ikusei Game (Japan)","ba04ccbbd2a60d3f19fa9c938ebea9b6":"Medarot Ni Core - Kabuto (Japan) (Rev 1) (Virtual Console)","ba11d0bfd27985088ac44866d7ece116":"Zettaizetsumei Dangerous Jiisan - Naki no 1-kai - Zettaifukujuu Violence Kouchou - Wagahai ga 1-ban Erainjai!! (Japan)","ba1f2cd7d4eb41792103bf0a95fc0c09":"Monster Gate (Japan)","ba2dc8d20da3971c342003c3c9468b17":"Mr. Driller 2 (Japan) (Virtual Console)","ba38712ad91c6c0287298d4c53ad48b1":"Lara Croft Tomb Raider - The Prophecy (USA) (En,Fr,De,Es,It)","ba428f9d19ecad3a4297b8e23481e6b0":"Ready 2 Rumble Boxing - Round 2 (USA)","ba4f3efc9d451376211f46119e28de9c":"Terminator 3 - Rise of the Machines (Europe) (En,Fr,De,Es,It)","ba5048bbfb02ebe3874b8ce1b6318ce4":"Iridion II (Europe) (En,Fr,De)","ba5a3b9eb146dbd9d17b1279957dfd5a":"Bass Tsuri Shiyouze! - Tournament wa Senryaku da! (Japan)","ba6d0fbff297b8937d3c8e7f2c25fa0f":"Pokemon Pinball - Ruby & Sapphire (USA)","ba7746952e87a2c85927fa691e7230dd":"Pink Panther - Pinkadelic Pursuit (USA)","ba7dda66edd51fb758aa1f61af584c1f":"Powerpig (World) (NEO Coding Compo 2013)","ba7f3c1078471eeed0d3ee39c092578a":"Pferd & Pony - Mein Pferdehof & Pferd and Pony - Lass Uns Reiten 2 (Germany)","bab43e61606514080129a179e931b2b6":"Dinotopia - The Timestone Pirates (USA, Europe) (En,Fr,De,Es,It,Nl)","bb00226987e213bea5217d2ab387048b":"Hanabi Hyakkei Advance (Japan)","bb03faf625c3fcfd8278513ce46448b4":"GP-1 Racing (USA) (Proto)","bb040b4d930c1fc4be1067b9756a7c44":"Medabots - Rokusho (Europe)","bb09508c782f37934c9519c5f8a7350c":"Super Mario Advance 3 - Yoshi's Island (USA)","bb1a8e9129d4d2dcb4bbb3e4879ee97b":"Britney's Dance Beat (USA)","bb4423037d0dc62b5282e1d3ece2b592":"Summon Night - Craft Sword Monogatari 2 (Japan)","bb5dee8fc2975c9ef1edfee65cbbc566":"Uchuu Daisakusen Choco Vader - Uchuu kara no Shinryakusha (Japan)","bb6ef6cc7f6b162a1ace4428148d8f5d":"Teenage Mutant Ninja Turtles 2 (USA)","bb8477087e3d927af99cd3263c66f7cf":"CT Special Forces (USA) (En,Fr,De,Es,It,Nl)","bb87013ec30bebf3dd7cb07ab6786262":"2006 FIFA World Cup - Germany 2006 (USA, Europe) (En,Fr,De,Es,It)","bba162a20a588326794b35ee8df2993f":"Pokemon - 10th Anniversary Distribution (France) (Kiosk)","bbb91114b96a3b57bf40b15edfc12187":"Disney Princesse (France)","bbb939c3839fc2d4864fc7be89b60cc4":"Hugo - The Evil Mirror (USA) (En,Fr,Es)","bbcd12ea6a44f220b40a196edfd2580b":"Medarot Navi - Kabuto (Japan)","bbe5c39533aaf3c912cf1b3ee9fee2ea":"Samsara Naga 1x2 (Japan)","bbeaf2fca8691cf29cae2e7bcf6ff69f":"Arctic Tale (USA)","bbec581c212be984bcf2d4baf2b71207":"Gyakuten Saiban (Japan) (Rev 1) (Virtual Console)","bc03898ada9ffdafca44c74c3dfeed8d":"Home on the Range (Europe) (En,Fr,De,Es)","bc15f4e82a86854175442d32218e2b14":"Phalanx (Europe) (En,Fr,De,Es,It,Nl)","bc1769f39636fca6e05efdf0b2431b35":"Digimon Racing (Japan)","bc292668096ee4918ae6aadcac74ab47":"Harobots - Robo Hero Battling!! (Japan)","bc2f9688aa915ee1eaa6cd06f8e1bb11":"FILA Decathlon (Europe) (En,Fr,De,Es,It,Sv)","bc62fa1f6a3f1421c802aba76f1f4732":"Classic NES Series - Ice Climber (USA, Europe)","bc69fb3645301ff9622f3289512614e6":"Medarot Ni Core - Kabuto (Japan) (Rev 1)","bc76f616bd8a9dfb36538d5da1891ea5":"Densetsu no Stafy 2 (Japan) (Virtual Console)","bc80dc29fbdbb9c8ee9af46f11c59665":"Incredibili, Gli - Una 'Normale' Famiglia di Supereroi (Italy)","bc8cc593779c21c7a8cfb71bb8784d26":"Tak - The Great Juju Challenge (Europe) (En,Fr,De,Nl)","bcb8f65db7a474622496573d752110f0":"W.i.t.c.h. (Europe) (En,Fr,De,Es,It)","bcd9c88dff944b4a2174bc238a628e76":"Harry Potter - Quidditch World Cup (Japan)","bce3926504e6fbc983463aa238ee5faf":"Dave Mirra Freestyle BMX 3 (USA, Europe)","bcf9dcaca7c0bab4d75184d900d27d50":"TOCA World Touring Cars (Europe)","bcfe5f30615a0d1c71f76b27e8ac6ad2":"Rebelstar - Tactical Command (Europe) (En,Fr,De,Es,It) (Beta)","bd02742b2822021ffb3c2d87929f1571":"Uchuu no Stellvia (Japan)","bd1177f8f30bef242aba4714449092a3":"Monster AG, Die (Germany)","bd2163ec09c9986fffdcfedb94c46c34":"Trollz - Hair Affair! (Europe) (En,De,It)","bd33e5115436f516e33dc1890207ab2d":"Nebulus (World) (GBAX 2004)","bd34635cf119a77c121bbf005b3ddfbe":"Bruce Lee - Return of the Legend (Europe) (En,Fr,De,Es,It)","bd3938f9273373f99967ff831f9c86d6":"Catz (Europe) (En,Fr,De,It)","bd4488cdef5226abebdd0fa28cd1c5d7":"SimCity 2000 (USA) (Rev 1)","bd5fd53f6315d6668fdbf4e7bf4e81eb":"Backyard Sports - Baseball 2007 (USA)","bd64515fa58ec5052ce4d231e6241f23":"LEGO Star Wars II - The Original Trilogy (USA)","bd846a0248e2f18bf7521fd2f5479881":"3 Game Pack! - Mouse Trap + Simon + Operation (USA)","bdc2a5d8d58449ccfd2557443b1cd026":"Ashita no Joe - Makka ni Moeagare! (Japan)","be0ec0dc899635edd6ad0c74574aa826":"2 Games in 1 - Dragon Ball Z - The Legacy of Goku I & II (USA)","be0ec34001b26921491d630df83401f2":"Tarzan - L'Appel de la Jungle (France)","be100ee4f7309ffa4b59cfde7e4d8a2f":"Toll Runner (World) (Demo 2)","be11a39637b93b01eb7470a29df09992":"ZenF (World) (v1.1)","be2ca0c6f898c5c453924d69732aabbb":"Pokemon Pinball - Ruby & Sapphire (Japan) (Rev 1)","be2cc5f427f01cbe18f630c5b4e4d7c7":"Pixeline i Pixieland (Denmark)","be2ed0ae2d2da48bfe6f9e49ee2daf7b":"Super Robot Taisen - Original Generation (Japan)","be5b6787b02bda5b6283185e643a9fcf":"Wanwan Meitantei (Japan)","be7b93fdeca8e23caf4b59b4490999ca":"Adventures of Jimmy Neutron Boy Genius, The - Jet Fusion (USA, Europe)","be807a4d9dfe2f283760cee1ecd28a5b":"Shrek - Swamp Kart Speedway (USA, Europe) (En,Fr,De,Es,It,Nl)","be824a74553013bcb38ba79c460b001c":"Sentouin Yamada Hajime (Japan)","be8e21f13e5b27d49ed097605c42f49b":"MotoGP (USA) (En,Fr,De,Es,It)","bea7ecc46f1afc41fdeb342e7bc03407":"Harry Potter to Azkaban no Shuujin (Japan)","beaa0de66f48e52efcc97b50b7777dec":"2 Games in 1 - Power Rangers - Ninja Storm + Power Rangers - Time Force (USA) (En,Fr,De+En)","beab4156e466e97dc7f0b16948d371b7":"Driver 2 Advance (USA)","beb83cb1e4ecae51a34ec3e99da384b4":"Elf - The Movie (Europe) (En,Fr,De,Es,It)","bee56ca47b1f319e27592baf2f053ec9":"Bomberman Max 2 - Red Advance (Europe) (En,Fr,De)","bee8f511abc2235061d9fdb2171c620c":"PukuPuku Tennen Kairanban - Youkoso! Illusion Land he (Japan)","bef73fc45c449c4940c14767b0926264":"Exciting Bass (Japan)","bf1d31e4558e574c751e9886daa5c23d":"SEGA Rally Championship (Japan) (En)","bf478efac1a6ffccf083eea8cff01c55":"Necropolis (World) (GBA Jam 2021)","bf4a0f61e2e78a120ba1edd4cfa6a101":"FIFA Soccer 07 (USA, Europe) (En,Fr,De,Es)","bf585f54686e2b5f55d97d624a8a3e28":"Bratz - The Movie (Europe) (Es,It)","bf770cb831b9fb693e2eed05a4bffc38":"Hanafuda Trump Mahjong - Depachika Wayouchuu (Japan)","bf8fac941521947c92ba860d570927c4":"Scorpion King, The - Sword of Osiris (Europe) (En,Fr,De,Es,It)","bf9caf68637c74cea9bea4f16dac393c":"Sennen Kazoku (Japan) (Rev 1) (Virtual Console)","bfb5a63fde75becb342f5d0e9a8e0da2":"Virtua Tennis (USA)","bff321ba7052247f9a6936e3ed0c75da":"Thunderbirds (USA, Europe)","bffd02ca80738dc0201fece3dcb8b4ce":"Duke Nukem Advance (World) (En,Fr,De,It) (Evercade)","c00051b2ff50552c66b31ebe3296031c":"Sportsmans Pack 2 in 1 - Cabela's Big Game Hunter + Rapala Pro Fishing (USA)","c014449536d7d32e5b6a3b91d10c0fe9":"Pokemon - Version Rubis (France) (Rev 1)","c0200aafcc6b7a822d05d256840de4ab":"Crouching Tiger, Hidden Dragon (USA) (Beta 2)","c029793387b430bcfd6601161da51fed":"Freekstyle (Europe) (En,Fr,De,Es,It) (Beta)","c055ae4f347bf3dfe626979c06133057":"Megaman - Battle Network 4 - Red Sun (USA) (Virtual Console)","c05cce26a2e6d11e9185b91515a19228":"Rugrats - Travesuras en el Castillo (Spain)","c06c0fc7fa844f14930c59453fa998d4":"Shamu's Deep Sea Adventures (USA)","c06decdf51468503434dcb5e7bbdcca5":"Yu-Gi-Oh! - Reshef of Destruction (USA)","c08873913df3c4e4739b648fa96128a4":"Hot Potato! (Europe) (En,Fr,De)","c088fb6231309f2b0bcd70b251052038":"Enchanted - Once Upon Andalasia (USA) (En,Fr)","c0a26ae6d6bc38e07f87c9a860de8586":"Classic NES Series - Zelda II - The Adventure of Link (USA, Europe)","c0b296efea186b82f921cf0e9a6a6ef4":"GT Advance 2 - Rally Racing (USA)","c0c2fec6b1ca631c49896290c7410d49":"Three Stooges, The (USA)","c0d02d8dd1f27fb8ecab1e41abec3c97":"Cinderella - Magical Dreams (Europe) (En,Fr,De,Es,It)","c0d76fd7a2b656fdec1802d62309c4a7":"Megaman Zero 2 (USA) (Virtual Console)","c0dc262c0199f86e97eb6b1f4540eccc":"Teenage Mutant Ninja Turtles Double Pack (Europe) (En,Fr,De,Es,It)","c0dfc8c07f3aba36be5f40edb996f679":"Santa Claus Jr. Advance (Europe)","c0e08bc7580772bf033830ce66a66e77":"Famicom Mini 11 - Mario Bros. (Japan)","c0e4157a27292cac28987d0fbd8bc8e0":"Pokemon - Slot 2 Distribution (Japan) (Proto)","c0e8e0770977846c7a6124fb94285f4d":"Kunio-kun Nekketsu Collection 3 (Japan)","c0e95ca2df9d1a27c91ca6956095891c":"Mr Nutz (Europe) (En,Fr,De,Es,It)","c0f3e785f1d4a48fcb2b945291a033ef":"Barbie and the Magic of Pegasus (USA)","c100637cff317b9afeaab8a1e2e73d7f":"Gematrix (World) (GBA Jam 2024)","c1278ffbcfaeda9e01e076f4eb88e52e":"F-Zero - GP Legend (USA) (Proto 8) (Netcard)","c13785f8c7f0342d4c96c294e600e338":"Pirates of the Caribbean - Dead Man's Chest (USA, Europe) (En,Fr,De,Es,It)","c16680e895cc3c11907361bfd158f6bb":"Cartoon Network Block Party (USA) (Beta)","c19779d04914fae7268bfb8b47b8b048":"Avatar - The Last Airbender (USA)","c19873cebb5f78d77d2af67142c1c09e":"Get Ride! Amdriver - Shutsugeki! Battle Party (Japan)","c1ac1f6979a4cc6b66c1c5515c191bc1":"Kong - The Animated Series (Europe) (En,Fr,De,Es,It,Nl)","c1b472a4ad0d7cd85ae92c7495198573":"Metroid - Zero Mission (Japan) (Virtual Console)","c1b8fbfc0f67a1f8e0c60543167b7dba":"Barbie Software - Groovy Games (USA)","c1d1bb9da3a5566a34a92dac25e6bc04":"Konami Krazy Racers (USA)","c1f7ade0ebce39a97c6efcad33661e20":"Megaman - Battle Network 3 - Blue Version (Europe)","c1fb9badf816b6d7836f4990f8119815":"Donkey Kong Country (Europe) (En,Fr,De,Es,It)","c1fcbde1f1a0462bc5794a241c20b387":"Titei Senki Advance (World) (v1.01)","c283484d8f35b059bbff9e4d852c5420":"GT Advance 3 - Pro Concept Racing (USA)","c2bfa5c822f33eaed02ad2f94a0414b4":"SpongeBob SquarePants - SuperSponge (USA, Europe)","c31cc0664c7152dbe4ce3e41c764850d":"Justice League - Chronicles (USA) (Beta)","c328c11773ab3075916f6d2c0735652a":"Hot Wheels - Stunt Track Challenge (USA, Europe)","c33cd0b752e2305becd03604dbd90293":"Antz - Extreme Racing (USA)","c3439dfd940adeab78b4f9d13599fd49":"Tales of Phantasia (Europe) (En,Fr,De,Es,It)","c369cdee8afa8a6a7163bdadddf74c69":"Anguna - Warriors of Virtue (World) (v0.95) (Itch.io)","c37e6a339dcf314bb0c014b737c972d6":"SimCity 2000 (Europe) (En,Fr,De,Es,It)","c3ad9a91e86b6195451fa0fcf695fb79":"Dogz - Fashion (Europe)","c3c7e4250ebfe4ce6020cabd42f08afe":"Tom and Jerry - The Magic Ring (USA) (En,Fr,De,Es,It)","c3c8470c8b0e460def74307fa985666b":"Bibi Blocksberg - Der Magische Hexenkreis (Germany)","c3caeece33e072b537cb07670b4610eb":"Invincible Iron Man, The (USA, Europe)","c3d670914b052c6e7fafc5649b725afd":"Mooncat's Trio (World)","c3de9a0198c010d29a88b1cf6a3b556e":"Medarot Navi - Kuwagata (Japan) (Virtual Console)","c3e17a3c48d7396c08d7ec7738bfd126":"Dragon Ball GT - Transformation (USA) (Beta)","c3e85be7372bbd5e43f6334a565968c1":"Pokemon - Versione Smeraldo (Italy)","c3ef5da0b49da2e7a124d5d94f19daf7":"Hobbit, The - The Prelude to the Lord of the Rings (Europe) (En,Fr,De,Es,It)","c3f126df8ac8a3cb0d73efaad7896800":"F-Zero - GP Legend (USA) (Proto 7) (Netcard)","c3f79dd7eb12b961f5bdd00c05eb37a7":"Advance Wars (Europe) (En,Fr,De,Es) (Virtual Console)","c414d73f6e76645aa202b5f5e516e494":"Mario Power Tennis (Europe) (En,Fr,De,Es,It) (Virtual Console)","c41958bbf3d218b83cc663f28db866f3":"Unfabulous (USA) (Beta 9)","c42d862eda2d7b0d49c0cbe33525a93c":"Wagamama Fairy Mirumo de Pon! - Dokidoki Memorial Panic (Japan)","c43587fca1f7e02f611baab02d26716d":"Yu-Gi-Oh! - The Sacred Cards (Europe) (En,Fr,De,Es,It)","c436d71315c3ccc51c9289c74129fe2d":"MotoGP (Japan) (En)","c43cbd5e71bcda81010fb408819c3ce6":"Werewolf Tale, A (World) (Proto) (NEO Coding Compo 2012)","c4430ced04082f7cb25750b9dcc610ea":"Winnie the Pooh's Rumbly Tumbly Adventure & Rayman 3 (Europe) (En,Fr,De,Es,It,Nl+En,Fr,De,Es,It,Nl,Sv,No,Da,Fi)","c44fc33a49d116db3ba5248d877a52f5":"Boboboubo Boubobo - Bakutou Hajike Taisen (Japan)","c45cde25dc1427df5896ae5ed8959fa0":"Hamepane - Tokyo Mew Mew (Japan)","c462c94704a3fa26d104282105ddd6ed":"Inspector Gadget Racing (Europe) (En,Fr,De,Es,It,Nl)","c4777d142e1a0427fb78b5167497d471":"Final Fire Pro Wrestling - Yume no Dantai Unei! (Japan)","c4874d3f181e4293f27f25ad52763e50":"Rebelstar - Tactical Command (USA)","c49c26566f147a3546f7a299d55010ba":"Bomberman Max 2 - Bomberman Version (Japan)","c4e93a88ca2a79a051d8a93f2b879a46":"Dexter's Laboratory - Deesaster Strikes! (USA) (En,Fr,De,Es,It) (Rev 1)","c518725055083f6096f3268cf608acda":"Astro Boy - Omega Factor (USA) (En,Ja,Fr,De,Es,It)","c52001c1bdfe486f73c4a6d79800387c":"Stepper (World) (v1.8) (3DS)","c5240b871426f8bef985a540b9fcadfe":"Super Mario Advance - Super Mario USA + Mario Brothers (Japan)","c5401124a48f173f05fb10fb9e716011":"Yu-Gi-Oh! - Sugoroku no Sugoroku (Japan)","c5780d2cd4873e19434e54595722ed5d":"Gyakuten Saiban (Japan) (Rev 1)","c59c79d8bfacd27a1c3fafda2bd801d0":"Pokemon - Version Saphir (France) (Rev 1)","c5bc831107f459816508b45d9392afc9":"Pokemon - Version Vert Feuille (France)","c5be1188d3ed703a50426c4d552b469f":"Lu-Hai-Kong Dazhan (China) (Proto)","c5e3a3d61b6c46d78bd66bd842fba8b8":"F1 2002 (USA, Europe)","c5ec72000373809a4d43bfee2911745f":"Finding Nemo (Japan)","c627e05cd3e6613ef772b92cc86ada1c":"DigiCommunication Nyo - Datou! Black Gemagema Dan (Japan)","c629272c5e0111930a240623b6c239f0":"Pokemon - Edicion Rojo Fuego (Spain)","c6394e32b564c770fe1971fdf2b1e8f2":"World Championship Poker (Europe) (En,Fr,De,Es,It)","c63ea91402e560b3ede1242884d72f73":"Tom and Jerry in Infurnal Escape (USA)","c6420001b019120cf0606dcbed749137":"Sengoku Kakumei Gaiden (Japan)","c64b677831500e85222d85c70e2d23b6":"Bookworm (USA)","c66c7460875f2d6a42bd441dd8ed1f56":"Davis Cup (USA) (En,Fr,De,Es,It)","c6816efab9f789038d7399a7eba5b37c":"Keitai Denjuu Telefang 2 - Power (Japan)","c68975d3d2cf8aafb150a3b97d020a80":"Iridion 3D (World)","c6926d0bbbdbed3372e6fc01c81cd52b":"KAO the Kangaroo (USA) (En,Fr,De,Es,It,Nl)","c69cdec6c30685b9ed3a91fe7aa84d8e":"Fire Emblem (Europe) (En,Es,It) (Virtual Console)","c6a3788a3a7a450536bc51ab90ed266a":"Uranus Zero - Sun Tear (World) (En,Fr)","c6a927c20fbb7b5b1570f9e6c804b54b":"Need for Speed - Porsche Unleashed (Europe) (En,Fr,De,Es,It)","c6af74aeeabfd6d7ee2875e355f49af2":"Final Fight One (USA)","c6badb88a556c59dd89b16809a2529b3":"SpongeBob SquarePants - SuperSponge (USA, Europe) (Beta 15)","c6cb9b88ad6c256eb1c1c4df8f6be63e":"Hex Advance (World) (Proto)","c702f8da946f5a50df244151dd7f9e6a":"Kirby - Nightmare in Dream Land (USA) (Virtual Console)","c708ddec270eca031ad03dba93f358b6":"Stepper (World) (v1.8)","c7174179fdb9d5dca2a150351adc3a58":"Tak 2 - The Staff of Dreams (Europe) (En,Fr,De,Es,It)","c7262e8c52597d29c8858c1ea1eb0161":"Findet Nemo (Germany)","c7407014742f1f2ee538f9ec8458265f":"Looney Tunes - Back in Action (USA, Europe) (En,Fr,De,Es,It)","c741f6e950240d0d66aeb60e81fae12d":"ATV - Thunder Ridge Riders (USA)","c74dd5cc3ab6e5d4ac53b1677e1abd69":"Final Fantasy IV Advance (USA)","c75988e7042168414e341c102dc7776c":"Megaman Zero (USA) (Virtual Console)","c765079b0c8ebc53454c711cba2cc949":"Skyland (World) (Proto 3)","c76cdeb30713ca9199788cb9ac95eeac":"Jisu F-Zero Weilai Saiche (China)","c786f824ed894f22166d4eb801f5f7d4":"Mat Hoffman's Pro BMX 2 (USA, Europe)","c79aa5315644d3463c91f2dd7fa08202":"Phalanx (Japan)","c7a9cdaa399c20a2a37abe1a2a71b387":"Koinu to Issho - Aijou Monogatari (Japan)","c7be3cfd5827ec4621b0175c01775e4c":"Hali Bote IV (Taiwan)","c7c56aaed390488e4112ef64b51bb2ad":"Altered Beast - Guardian of the Realms (Europe) (En,Fr,De,Es,It)","c7e5d28e7c430454aeff766961095561":"Sword of Mana (USA, Australia)","c824e72aa57e94eea86343e107b0dca2":"Finding Nemo (USA, Europe)","c83c580d9ab765af26ca3a3ead0cd518":"Medabots AX - Metabee Ver. (USA)","c86f84d68f584b666e5490f764fda27e":"Bomberman Jetters - Densetsu no Bomberman (Japan)","c8896f5ae10cbdf9a1d4b98166ff13c0":"Meine Tierpension (Germany) (En,De)","c89bbbb8a6ce5c51b6361f9739827e44":"Play-Yan Micro (Japan)","c8a0ce6010243c1b4a05458344c9fc31":"Shrek 2 - Beg for Mercy (USA, Europe)","c8b49c53003b8d9a15d91a5a5d5cc91b":"Boktai - The Sun Is in Your Hand (Europe) (En,Fr,De,Es,It)","c8b81c5fe67f8235c03e350b8de53730":"2 Games in 1 - Power Rangers - Ninja Storm + Power Rangers - Time Force (Germany) (En,Fr,De+De)","c8bcd516d865325e976d7905b3694dbc":"Konchuu Monster - Battle Stadium (Japan)","c8c20827e23977fa69ab7f0abbc08931":"2 Games in 1 - Sonic Battle + Sonic Pinball Party (Europe) (En,Ja,Fr,De,Es,It)","c8d54c545b0cfb90da6ab6e96dcee96e":"Titei Senki Advance (World)","c8e45043d61075471f8ee3d05862d960":"Scooby-Doo! - Mystery Mayhem (USA) (En,Fr)","c9091f3e04bb2b0f0989efb546c3ffc8":"Buffy - Im Bann der Daemonen - Koenig Darkhuls Zorn (Germany)","c92823ec801e976852b67ac3f10723a7":"Monster Rancher Advance 2 (USA)","c93537014d674bf5843cb1ab5eb942c5":"BattleBots - Design & Destroy (USA)","c939d218192e534472423557d6fb1571":"One Piece - Dragon Dream (Japan)","c95509097d14323904489a65d51014ac":"Tony Hawk's American Sk8land (Europe)","c98531def6532b3ed048a5ebc0ab4c3c":"Medarot Ni Core - Kabuto (Japan)","c9afff5c7245894071c7191df4b1749f":"Ottifanten Pinball (Germany)","c9ce90b98c6cc2f60847d6f39ecf11c5":"Teen Titans 2 (USA) (En,Fr)","c9f99ccdf29fe8f9b5dc52c3a84e95a3":"Castlevania Double Pack (Europe) (En,Fr,De)","ca03360842a7c269f9a46de25d5e779f":"Extreme Ghostbusters - Code Ecto-1 (USA)","ca1e7ca13fc27ec962b8163d8e94dce0":"Drake & Josh (USA) (En,Fr)","ca3500bedd93475c210d4dd16a968d08":"Simple 2960 Tomodachi Series Vol. 4 - The Trump - Minna de Asoberu 12 Shurui no Trump Game (Japan) (Rev 1)","ca4a01416f5528fe6f165981658a4b03":"Tottoko Hamutarou 3 - Love Love Daibouken Dechu (Japan)","ca525800d38ac7f1096d69032c689015":"2 Games in 1 - Disney Princesse + Frere des Ours (France) (Fr+En,Fr,De,Es,It,Nl,Sv,Da)","ca6fab20ba47ef78f9383bd9fb7e0738":"Yggdra Union (Japan)","ca701c70d4e637f127421123a74615ed":"Mario Tennis Advance (Japan) (Virtual Console)","ca775010545c69bb28ec6635fa48cefd":"Buffy contre les Vampires - La Colere de Darkhul (France)","ca8bc391def42c66b2e6c7a179b945e9":"Chicken Shoot (Europe) (En,Fr,De,Es,It)","caa2d80d5c14a76d1f482f7589281c22":"LEGO Star Wars - The Video Game (USA, Europe) (En,Fr,De,Es,It,Nl,Da)","caa90efa07194408be977cfff5f985bf":"Road Rash - Jailbreak (Europe) (En,Fr,De,Es,It)","cab2a6bb0d3c754ccf75ac3b3dc94cb0":"3 Games in One! - Breakout + Centipede + Warlords (USA)","cab9244d30ba8144b17e056c8ced76de":"Legend of Spyro, The - The Eternal Night (USA) (En,Fr)","cad17987af79a57e44ff18a892d1aa70":"Megaman Zero 3 (Europe) (Virtual Console)","cade47def03ad1cc02a1bd97b5ea4e9f":"Castlevania - Byakuya no Concerto (Japan)","caf46477c33a49dacf2d08aed205909b":"Worms Blast (Europe) (En,Fr,De,Es,It)","cb04b88ecd0adfe5690fa75a551dcd74":"Pikapika Nurse Monogatari - Nurse Ikusei Game (Japan)","cb14df09ea41694532a9327510bb28c1":"Dragon Ball - Advanced Adventure (Europe) (En,Fr,De,Es,It)","cb1603c3cc3ed8a37f87b3971b0270d5":"Klonoa 2 - Dream Champ Tournament (USA)","cb24766d8e3e10b9a087dc52740daeb0":"Sword of Mana (Europe) (Es,It)","cb4000f4cd159f3f3cc3cabfac2ac979":"Crouching Tiger, Hidden Dragon (USA) (Beta 1)","cb6451eb458a51ac7d1757d2f419dd3c":"Bura Bura Donkey (Japan)","cb9ee964b373d6c44272a292571bf9c1":"Gakuen Alice - Dokidoki Fushigi Taiken (Japan)","cbb808bccf5aab4d46c3c2da2129429b":"CodeBreaker (USA)","cbbb81a27188b76d68374ec7ef888329":"Apotris (World) (v4.0.2)","cbdd36d1fb5b8898bc44f1cb1467787f":"Super Bubble Pop (World) (Evercade)","cc25621658169b41ada436ef99c078e8":"Nicktoons Racing (USA)","cc2a04c4addcb14c30b0ced2a83c2d91":"Kim Possible - Revenge of Monkey Fist (USA)","cc47da225c68373cea90c2caa2963a8e":"Gakkou no Kaidan - Hyakuyoubako no Fuuin (Japan)","cc6b4d0d6c91c28b762784a171a3c5d8":"Final Fight One (USA) (Virtual Console)","cc73a1bba4cda50f818581db3dd7b661":"Pinky Monkey Town (Japan)","cc83423c84419fe4011caf03e84b2e64":"2 Game Pack! - Uno & Skip-Bo (Europe) (En,Fr,De,Es,It)","cc87721bb3dfa680f15e875edcf0b4dd":"Pokemon - Edicion Zafiro (Spain)","cc966f781b2c7d2b61c5111063aa3e47":"Land Before Time, The - Into the Mysterious Beyond (USA) (En,Fr,Es)","cc979f837abd1318bfa42b84b075a7be":"Dragon's Rock (Europe) (En,Fr,De,Es,It)","ccaa6814bcb83ec7fff309616a2f6d40":"GT Racers (Europe) (Beta 2)","ccae308baca9baecaba1ab670dcc27c8":"Jurassic Park III - Island Attack (USA)","ccb5a95c335a6b3bb6113970b004a742":"Koukou Juken Advance Series Eigo Koubun Hen - 26 Units Shuuroku (Japan)","ccc940468bd911cb13e06f761d798126":"Higanbana (Japan) (Rev 1)","ccdd724bacf3f395e7b52b008d57b915":"Blind Jump (World) (En,Ja,Fr,It,Ru) (Proto)","cce22f4507ceab482392247b74a8b55a":"IK+ (USA)","cd002d8e070ce14cae9866f987fc4f69":"Barbie and the Magic of Pegasus (USA) (Beta 1)","cd06fca8f11c9fbf1c89d067719cc7f6":"Megaman - Battle Network 4 - Blue Moon (Europe) (Virtual Console)","cd20a4c59eca007754b660b49f26c233":"My Animal Centre in Africa (Europe) (En,Fr,De,Es,It)","cd26ad539926810e5812ccc1105732cc":"Oshare Princess 3 (Japan)","cd27477e70b529b736746185b882100e":"Garfield - The Search for Pooky (USA) (En,Fr,De,Es,It)","cd5c952ccf9a78915cbefec0fecf241d":"Huo-Wen Zhanji - Fengyin Zhi Jian (China) (Proto)","cd99cdde3d45554c1b36fbeb8863b7bd":"Final Fantasy Tactics Advance (USA)","cdd0d1bc1b95577662dbf561c8e77f34":"Super Mario Ball (Europe)","cdde24e4b71ac0cb1cf32bab1374f64a":"Gekido Advance - Kintaro's Revenge (Europe) (En,Fr,De,Es,It)","ce085f9eb00a26cf9535172acc99921c":"Boboboubo Boubobo - Ougi 87.5 Bakuretsu Hanage Shinken (Japan)","ce153a5ce176b608edd035e3b9a27dad":"One Piece (USA)","ce194375c105dc51582f47e7435103d0":"Pinobee no Daibouken (Japan)","ce1b62b6673b0e4338fda5bcdd1e2366":"Caesars Palace Advance - Millennium Gold Edition (USA, Europe)","ce3627afe4eda2a1c5e4674939e5f041":"Droopy's Tennis Open (Europe) (En,Fr,De,Es,It,Nl)","ce4ef88567b8d7aa8a0675a0bac996b8":"Erementar Gerad - Tozasareshi Uta (Japan)","ce55f087d1ed4ab12a5bad411dae1113":"Monopoly (USA)","ce57edc0645572af5244e3e24b586133":"Backyard Hockey (USA)","ce7a3a9fb7e863d58bb2c71ea2a7a0d5":"2 Games in 1 - Finding Nemo - The Continuing Adventures + The Incredibles (USA)","ce7bb230439440ab28ea9d5d6b19cc01":"Konami Krazy Racers (Europe)","ce9396dd3407f86a9fb303e06882aeab":"Get Ride! Amdriver - Senkou no Hero Tanjou! (Japan)","ce943b2fc1539a9d069b6a6746616d66":"Megaman - Battle Network 6 - Cybeast Falzar (USA) (Virtual Console)","ce9f58d790acd6260bd45ca4346fac74":"Battle Network - Rockman EXE 3 - Black (Japan) (Rev 1)","ceb711af3dd5861e9bf95c53d7443f42":"Kinniku Banzuke - Kimero! Kiseki no Kanzen Seiha (Japan)","cec078b8f24ae79589e34454784f2386":"Beast Shooter - Mezase Beast King! (Japan)","cec79164d58deace2122ba2e4a9cdd65":"Vecinos Invasores (Spain)","ceda12928a686878795def3b413ccfc2":"Mario vs. Donkey Kong (USA, Australia)","cf1673c920ef1d24c4f4b21effcc03f0":"V-Rally 3 (USA) (En,Fr,Es)","cf20a09761ad3a42195694a0a34da7c3":"Moero!! Jaleco Collection (Japan)","cf33e45e59b0ee3801b5cf18a9e58524":"Ougon no Taiyou - Hirakareshi Fuuin (Japan)","cf489b93e646c5f102ef2c8cc8fa64cf":"Tony Hawk's Underground (USA, Europe)","cf66c71bcc65c5e0ee20c666df8d6540":"2 Game Pack! - Uno + Skip-Bo (USA)","cf7e4985bcf3ac80238b6089ab26ab7d":"Healz (World) (GBA Jam 2024)","cf8411a62dc864f79cf39467080a81ce":"Akumajou Dracula - Circle of the Moon (China)","cfa185aa9c5c11136e16ce519f96e3e9":"NFL Blitz 2003 (USA)","cfbf47949426a8f44ecdc832d06d09a9":"Meet the Robinsons (USA)","cfd85c7cc23e577cd6a338e83e95d618":"Midway's Greatest Arcade Hits (USA, Europe)","cfe052a6e6529e0356516010b68cfd0c":"Tiger Rescue (World)","d00363a1b7cd2a61a11732117df24166":"Don-chan Puzzle - Hanabi de Doon! Advance (Japan)","d015092963d9e05afe3a552c34a81cf2":"Harlem Globetrotters - World Tour (Europe) (En,Fr,De,Es,It)","d0150fce0e6c45783cc952b139b77a1b":"Famicom Mini 19 - Twin Bee (Japan)","d02b4e547e916a20bc7cebcb41cba8ab":"Star Wars Trilogy - Apprentice of the Force (Europe) (En,Fr,De,Es,It,Nl)","d02eabdee77f547001c268a254352b79":"Airball (World) (v1.3)","d0452572fdff4d290a3ff76fe0a07739":"Ice Age 2 - The Meltdown (Europe) (En,Fr,De,Es,It,Nl)","d0847e7d22dd605cc9d3346a0b6fcf56":"S World 3 (World) (Beta 3)","d0aac762bc42a0133529ab72c8cc125c":"2 Games in 1 - Power Rangers - Ninja Storm + Power Rangers - La Force du Temps (France) (En,Fr,De+Fr)","d0afddbd4f9a06aeaf9a8d7db3a2ef82":"Wagamama Fairy Mirumo de Pon! - Taisen Mahoudama (Japan)","d0bb79fb5a05702ce8b7d03320fcdf52":"Blackthorne (USA)","d0c000353f6bd4d93a1fbf5be04b7585":"Eragon (Europe) (En,Fr,De,Es,It)","d0c1c2ae421a5acb198fb1466122b7cc":"Dungeon Tactics Advance (World) (GBA Jam 2024)","d0c7958ff085664e0b78e1378a85e39f":"Monster Gate (Japan) (Rev 1)","d0d33104d62f81108214f9a328ce0a9e":"SSX 3 (USA, Europe)","d0dee5c06972cb072391cd968a248d52":"Megaman - Battle Network 4 - Red Sun (USA)","d116b2b5a64bc7dff2678b1790ca723a":"Rick Dangerous (World) (NEO Coding Compo 2013)","d1415b84b039a978bdb920f917959779":"Shingata Medarot - Kuwagata Version (Japan)","d147f80b54cfb16b1df295aabaf4c90c":"Lara Croft Tomb Raider - Legend (Europe) (En,Fr,De,Es,It)","d14cf631928fc1523b49c9ae0a2cdd2f":"Ultimate Beach Soccer (USA)","d15113e7b1843edfd258ad5f5051b418":"Medal of Honor - Underground (USA)","d171531f05dacad10447971e6e14fb94":"Ultraman - Confrontation Between Justice and Evil (Russia)","d1a6c9f1c78f0df5b1395e7e679a383a":"International Karate Advanced (Europe)","d1b92af267a24b56ccd00869fbc7303f":"Zettaizetsumei Dangerous Jiisan 3 - Hateshinaki Mamonogatari (Japan)","d1c3d1798a3f347fbab41f151c99dece":"Final Fantasy VI Advance (USA)","d1d4df6cf579a743171f39f06fb884fb":"2 Games in 1 - SpongeBob SquarePants - SuperSponge + SpongeBob SquarePants - Battle for Bikini Bottom (Europe)","d20405dfb7b446fbeb365a5cc11233c3":"Madden NFL 2002 (USA)","d20a8685f12452c1699012e2cf1d9b79":"X-Men - The Official Game (Europe) (En,Fr,Es,It)","d20cf72f03b73d3be7a3fd89c085f5fe":"Dan Doh!! Xi (Japan)","d275e7110627f4456dc8d544166b55e9":"Rocky (USA) (En,Fr,De,Es,It)","d28dcccc93405ce5c1f29814dbd3f77f":"Mugenborg (Japan)","d2937931c759f1d3f9a4c7f49dca7261":"Top Gear GT Championship (Europe)","d2a5a5ccd519b50603ecba358d085ef4":"Super Puzzle Bobble Advance (Japan) (En)","d2b0cab71d1c40aa38e94eeb2d1c8718":"Megaman - Battle Chip Challenge (Europe) (Virtual Console)","d2bc5687ac40a62f74daf3fb219644e5":"Sonic Advance (Japan) (En,Ja) (Rev 1) (Virtual Console)","d2d38d0ca1c3594c71213e3b5f6bd6ec":"Lilo & Stitch (USA)","d2d7d7feaa2eee5a6ebeb65e7f6b9476":"Sekhmet's Playground (World) (GBA Jam 2024)","d2f0d0b2ccb4a138636746c46b091cd0":"Dungeons & Dragons - Eye of the Beholder (Europe) (En,Fr,De,Es,It)","d3057e966f2383ba5664d4523d8f6df1":"Beyblade V-Force - Ultimate Blader Jam (Europe) (En,Fr,De,Es,It)","d307133ff4a778517ab0c00b8ca9379a":"Pitfall - The Mayan Adventure (USA, Europe)","d30a036c3bd3cb62f6029be745910075":"Hatena Satena (Japan)","d3100683634506761d3412b728617307":"Kong - King of Atlantis (USA)","d31b3a260356f4e5a3c9566d022e83a2":"Sylvanian Families 4 - Meguru Kisetsu no Tapestry (Japan)","d31db14855a0de7ea8789f853c2af3c6":"Harry Potter to Himitsu no Heya (Japan)","d325f3b46025ec8df4a3761cb529e7b8":"Polar Express, The (USA, Europe) (En,Fr,De,Es,It)","d34a68ec334336fa5c1e7c6acda6ff6c":"Legend of Spyro, The - The Eternal Night (Europe) (En,Fr,De,Es,It,Nl)","d366d5b909b3afbdd3ba87c6d2b2f1f9":"4 Games on One Game Pak (Racing) (USA) (En,Fr,De,Es,It)","d369f791d86a969778d2c3a5278d544c":"Kingdom Hearts - Chain of Memories (Europe) (En,Fr,De,Es,It)","d37986c7067ec557b771cfb661c923ee":"Famicom Mini 09 - Bomberman (Japan) (En)","d379b595d04446abf5335aaccd336fcf":"Super Robot Taisen R (Japan)","d3a5a53a283de179f8b65b0b5b90d413":"Simpsons, The - Road Rage (Europe) (En,Fr,De,Es,It)","d3a76f1c92e3044b1a21f1aae84d21ab":"Megaman Zero 4 (Europe)","d3b2ab65c92e18df21788c4b30128041":"Moto Racer Advance (Europe) (En,Fr,De,Es,It)","d3b699df6c6ca9bf3c3abb120fb3edd8":"2 Games in 1 - Moto GP + GT Advance 3 - Pro Concept Racing (Europe) (En,Fr,De,Es,It+En)","d3bc617082a50dcfa360c10f6ec5f845":"Monsters, Inc. (Europe) (En,Es,Nl)","d3e4164a9c709dbed2bf24e09170fc77":"Army Men - Turf Wars (USA)","d3f866c892022ec6fa89b4dbdbcb0efa":"Contra Hard Spirits (Japan) (En)","d3fd1646a46e5077a59b44e00fdfee90":"Matantei Loki Ragnarok - Gensou no Labyrinth (Japan) (Beta) (Debug)","d41363a54aa5ac45ecaff2dafcb9372b":"Robots (USA)","d41cff4cf06a89d9a79df9e47f192d20":"Droopy's Tennis Open (Europe) (En,Fr,De,Es,It,Nl) (Beta)","d428b84dce8f74a485a3f6c8a20dc4b3":"Ueki no Housoku - Jingi Sakuretsu! Nouryokusha Battle (Japan)","d429899cfd9a4858592f34ce9527a159":"All Grown Up! - Express Yourself (USA, Europe)","d452b649e6c8f3455469030548478e81":"Morita Shougi Advance (Japan)","d4633c1ba39d6ab290ce9c8044574906":"LEGO Racers 2 (Europe) (Beta)","d48340e964aa3cbe1b69019cb215c8a0":"Monster Trucks Mayhem (USA)","d491342c918651dfe04090ca82ca3439":"Super Monkey Ball Jr. (USA) (Beta)","d4a4550a42646e58df0445756e004d8e":"Yoshi Sample (Japan) (En) (Tech Demo)","d4aa56b92749b7f395ca85a75616199f":"Virtual Kasparov (Europe) (En,Fr,De,Es,It)","d4c87ffeb5548c6cf7f6b392a24161fc":"Disney Sports - Motocross (USA)","d4cc34b19ab7fba248558d6f6584fdf2":"Hi Hi Puffy AmiYumi - Puffy Ami Yumi and the Manga Madman! (USA) (Proto)","d4d2fac142d31903295cdab4eab4ab3b":"xniq (World) (Proto) (GBA Jam 2021)","d4d5b7d5370be6cd8c695ec5483f676e":"Ultra Keibitai - Monster Attack (Japan)","d4e09dc235ec13e6926c5338147e350c":"JGTO Kounin Golf Master Mobile - Japan Golf Tour Game (Japan)","d4e3855b1e6630921de0e188ac974ebf":"Rockman Zero 4 (Japan)","d4fecd09b810dba8a76c5766e713e49f":"Action Man - Robot Atak (Europe) (En,Fr,De,Es,It)","d52806f7bf178947921aa0413f3cc633":"Chessmaster (Germany)","d53ca7a7f09e222722e110445e1a4e6c":"Polly Pocket! - Super Splash Island (USA) (Vivendi)","d552538adba7bf2bc443822265bcfe20":"Kisekko Gurumii - Chesty to Nuigurumi-tachi no Mahou no Bouken (Japan)","d5559318143f276f13b13f86bb1fc60e":"Cat-Venture (World) (Demo 2)","d569ea9204f4683592ed49e47f6f9568":"Cabela's Big Game Hunter - 2005 Adventures (USA, Europe)","d571970f19fafdbcdddb71a02563317e":"Mario & Luigi RPG (Japan)","d596b05b4f52d2880f36db3e7ec9a8e5":"Jurassic Park III - The DNA Factor (USA)","d59d88a73622b4df76cf98d1554644e4":"Minami no Umi no Odyssey (Japan)","d5a837ce039d6f860dcdfa75d6f80a97":"Kurohige no Kurutto Jintori (Japan)","d5a8437be47f77ea14409b0b40a026fa":"Cat in the Hat, The (Europe) (En,Fr,De,Es,It)","d5a97a8360ee0ee2651dc2c5ae1f8f30":"Nicktoons Unite! (USA)","d5b7c99707098401f12f6e4dfac87c9f":"Celeste Classic (World)","d5c9b6657e5d9fed85e5d25b79acb3de":"Fantastic 4 (Europe) (Fr,De,Es,Nl)","d5cd7fb3f7bdecccddb431ddddbcc9f4":"2K Sports - Major League Baseball 2K7 (USA) (Beta)","d60c5ace24093283f3dc9c74f3ac2489":"Bouken Yuuki Pluster World - Densetsu no Plust Gate EX (Japan)","d61efb2839076e80b05e55d5cf7a60e9":"ESPN International Winter Sports (Europe)","d62d4e34e5db75a4b44db96752cc2f69":"Carrera Power Slide (Europe) (En,Fr,De,Es,It,Nl)","d6482e271791cd7b324c36b55ca3b693":"Bratz - Rock Angelz (France)","d64a34e34debb206aeb66d4ed832ac85":"Word Safari - The Friendship Totems (USA)","d64c95901c720f6dbf7b6dab929e617f":"Marvel - Ultimate Alliance (Europe) (En,It)","d65302dfe91452a9dc01be44a8e55f98":"Duel Masters - Kaijudo Showdown (Europe) (En,Fr,De,Es,It) (Beta)","d67692814d313e0f70637fb2157ab6cc":"Megaman Zero 3 (USA) (Virtual Console)","d6a12374a2414be686480a4936a2ff48":"Dragon Ball Z - The Legacy of Goku II (Europe) (En,Fr,De,Es,It)","d6b12981296a8e3c67796f94e2d7aff3":"Lizzie McGuire - On the Go! (USA)","d6c5534615de1c9478768506f5282ff0":"EX Monopoly (Japan)","d6d1aebc7605124b44f024f54d3be293":"Nakayoshi Youchien - Sukoyaka Enji Ikusei Game (Japan)","d6d8a53c94a7aa27583312c66974edf9":"Discrete Orange (World) (Demo 2)","d6e41a11cfd0fa428bc43a68b5af7bca":"Ghost Rider (USA, Europe) (En,Fr,De,Es,It,Nl)","d6e4327dce0eedf33bb5a465cef4bb48":"Luma (World)","d7010827ec2382c727b9aa565e842abe":"Konami Wai Wai Racing Advance (Japan)","d7118be078b9a61284a99d3f1f7e972f":"Mr. Driller 2 (USA)","d714d2a904bd0f085a0d9179797d185d":"Smickeonn the Game - 2024's Greatest Hits! (World) (v1.1)","d74a23c7df011771c5bfa6f36b2dd920":"Gakuen Senki Muryou (Japan)","d76d992d936c308b7d1bb70ac71a1c37":"Mawaru - Made in Wario (Japan)","d76d995cef14fce9129d8b7c9f049568":"SEGA Smash Pack (Europe)","d7897c2530deaa9d6abc224fe9026f50":"BattleBots - Beyond the BattleBox (Europe) (En,Fr,De)","d794f41257ac22c50b117f49484feefa":"Sonic Advance 3 (Japan) (En,Ja,Fr,De,Es,It) (Virtual Console)","d7c540384eff184dbd81292f3f7f8c29":"Peter Pan - Return to Neverland (USA)","d7d3e3edd9c161bd0094a17124142ead":"Wilden Fussball-Kerle, Die - Entscheidung im Teufelstopf (Germany)","d7dd9a6376e9c85ae177cd61ee9e3312":"Game Boy Gallery 4 (Japan) (Virtual Console)","d7f41d490bcb72f0711b070de85a8c8b":"Donkey Kong Country 3 (Europe) (En,Fr,De,Es,It)","d7f4cb6aea9409acf23e2eae5a697c5e":"Mr. Driller A - Fushigi na Pacteria (Japan)","d801ce9f6fa2917d7ecbc7985a34b9ef":"Kurohige no Golf Shiyouyo (Japan)","d81d39a2400a2651099a6d1aa2a461d5":"Worms - World Party (USA) (En,Fr,De,Es,It)","d838c57b19062d67a408244b33e1cfa9":"Mario Kart - Super Circuit (USA) (Proto) (Netcard)","d84016c53084fd5539d53f48f89a84e5":"Mario & Luigi - Superstar Saga (USA) (Virtual Console)","d8453317272826159fefcf254f25ada4":"Final Fight One (Europe)","d853b5ffa5ef88605a0823d3b4b2df08":"Wolfenstein 3D (USA, Europe)","d8635a000fffb777f91137993d439ee3":"Power Pro Kun Pocket 3 (Japan)","d867844ad81a900aba625a5075275247":"Power Rangers - Dino Thunder (Europe) (Fr,De)","d8b6d1af6d00558c3bb33d81ad18c483":"E.T. - The Extra-Terrestrial (USA)","d8c148895dc874b51f5075aebfcef88a":"Madden NFL 2003 (USA)","d8d8a330e5471faef5b527b18aa24ad2":"Garfield and His Nine Lives (USA) (En,Fr,Es)","d8de1bc487149bdfd96f03031a8b0ebb":"Frogger Advance - The Great Quest (Europe) (En,Fr,De,Es,It)","d8ed69627a467814fb3f053fba5d567c":"Surf's Up (Europe) (En,Fr,Es)","d90c08ee30985bf120d394bdd98e2693":"Treasure Planet (Europe) (En,Fr,De,Es,It,Nl)","d92308bc903f4e92587df2cedc89b477":"Bokujou Monogatari - Mineral Town no Nakama-tachi (Japan)","d9371f098dfaaf7d52bca4cbc333223d":"Trials of Chaos (World) (GBA Jam 2024)","d9449bc62cc7cfffe5ca75de8beb27f4":"Fire Emblem - Rekka no Ken (Japan) (Beta 1)","d94b4031b5f5b39281075ae4e0ea76d6":"Monsters, Inc. (Japan)","d94d214f30cfcc4479ba3a41f1acc7cf":"Cocoto - Platform Jumper (Europe) (En,Fr,De,Es,It)","d969b50d20655bffb3042bafbeffe654":"Kamaitachi no Yoru Advance (Japan)","d96e8659db64595a5ee7234145ebdc66":"Columns Crown (Europe)","d97206a549d0b7b3cb49d32b249edc25":"Deflektor (World) (v1.1)","d97380d2fc4230738bf6f6080c577b94":"Dogz (Europe) (En,Fr,De,It)","d996f6cbb36eb15063b290d8f00ad654":"Megaman - Battle Chip Challenge (USA)","d9a3d6ae2ec335fe8cf8008539ac14e7":"Simple 2960 Tomodachi Series Vol. 3 - The Itsudemo Puzzle - Massugu Soroete Straws (Japan)","d9adc18e11c3fea39b49a99abcdc41fc":"Mario Tennis - Power Tour (USA) (En,Fr,De,Es,It) (Virtual Console)","d9b338efe2c15f9493ca0b28714a679b":"Shining Soul (USA)","d9b4f299622e896b85c84946e92c1e69":"Polarium Advance (Europe) (En,Fr,De,Es,It) (Virtual Console)","d9ea8c0a5cb934ddc7801389faba43e2":"Agassi Tennis Generation (Europe) (En,Fr,De,Es,It)","da1471e76473766f201ead7c9c9e3595":"Dexter's Laboratory - Chess Challenge (USA)","da15f288fe413a9d58432fb516f23cb0":"Woody Woodpecker - Crazy Castle 5 (Japan)","da5b6a9f2528749bdfcd601980a5059b":"Kiki Kaikai Advance (Japan)","da69e10feb7472cdfa7ed76f8183b6bd":"Golden Sun (Germany)","da720531328fc7f37eef8c9b07d30a91":"Revenge of Shinobi, The (Europe) (En,Fr,De,Es,It)","da7d71352fd92c7e44de1d7341042f27":"Chessmaster (USA)","da7fa09ca99fa6c7e6462a29494d991e":"That's So Raven 2 - Supernatural Style (USA) (En,Fr)","da96ce67d0ddad72e032632c8fd9994a":"Teenage Mutant Ninja Turtles 2 - Battle Nexus (USA)","da9f0a0d884da90e912752cabea8a741":"Super Mario Advance 3 - Yoshi's Island (Europe) (En,Fr,De,Es,It) (Virtual Console)","daab9c49f67d0064317799027d537ca9":"Google Dino Advance (World) (v1.1)","dad3fd70cc43107e381285dcb5313d1b":"Mario Kart - Super Circuit (Europe) (Virtual Console)","dadf42e7e222fe564e4277da8b3c90de":"Chopper 2 - The Return (World)","db39085a6f31b5f506420a83973ad0fa":"Chessmaster (France)","db41a36ee67abb52cdc7623f1763ef05":"Three-in-One Pack - Risk + Battleship + Clue (USA) (Rev 1)","db41f49affdac264849a0f4245fe533c":"Dokidoki Cooking Series 1 - Komugi-chan no Happy Cake (Japan)","db472400ad072dfb2be28c08468a7984":"Top Spin 2 (Europe) (En,Fr,De,Es,It)","db4a8ed843dfb471622f37a8efb35111":"Digimon - Battle Spirit 2 (USA) (En,Fr,De,Es,It)","db526b444655e12ba12030ebd9959f3b":"Hamster Club 3 (Japan)","db56858947876ac2d0b61f8acced190c":"Mr. Driller 2 (Europe) (Virtual Console)","db607f2427469e017560fd23fdc7ea70":"Flushed Away (USA)","db64d910feec15dc3f3bc90c151e731b":"Fortress (USA, Europe)","db7362f49c853c61b8de8e4ca8750c18":"Mail de Cute (Japan)","db787ca57607768ee3320e2610a82cc2":"Sys Crusher (World) (GBA Jam 2024)","db7d06d0be0b06c4a73bcf614e81c588":"Kurukuru Kururin (Japan)","db80a326a5825c196e2de77f319abd69":"Manic Miner (Europe) (Beta)","db8327ce52ef65ebd4d0629b5febe178":"Pac-Man World & Ms. Pac-Man - Maze Madness (Europe) (En,Fr,De,Es,It)","dba68e8ac74148aa0a4a9b6f9a986f67":"Anguna - Warriors of Virtue (World) (v0.92)","dbe975f9dd8b09d76c73a6d18bdaa6fc":"Megaman - Battle Network (USA) (Virtual Console)","dc10ed7d9f86453ceb1303c9585bf8ff":"Kim Possible (Japan)","dc3829497236a88a3595561440230354":"Fire Emblem - Rekka no Ken (Japan) (Virtual Console)","dc4ea1eb92d51b8c18b58611ad652ccc":"Teenage Mutant Ninja Turtles (Europe) (En,Fr,De,Es,It)","dc5f5d4a85fee39dc0a6ebd59cd566e7":"Dave Mirra Freestyle BMX 2 (Europe) (En,Fr,De,Es,It)","dc8786aa2aa0b73b73cb1ad110ccf2e7":"2 Games in 1 - Les Razmoket Rencontrent les Delajungle + SpongeBob SquarePants - SuperSponge (France) (Fr+En)","dc96748e298935c8e3d49e362cafa0b8":"Altered Beast - Guardian of the Realms (USA)","dc99bcca77ec59c109576b867ab2b3ea":"Driver 2 Advance (Europe) (En,Fr,De,Es,It)","dc9be85f5ada0abeb2ab597d5178f03e":"Spout GBA (World)","dcaf52240df58d7f9d6be95e918c7bb3":"Britney's Dance Beat (Europe)","dcc2db8fafaf3bb28b8896b89b707175":"3 Games in One - Darts + Roll-a-Ball + Shuffle Bowl (USA)","dccdc879eca4dc6c16fb93bdb072226d":"Kinnikuman II-Sei - Seigi Choujin e no Michi (Japan)","dce3c14f8f704b539094734700c5a145":"Konchuu no Mori no Daibouken - Fushigi na Sekai no Juunin-tachi (Japan)","dce828e687f05511c1ad70e936b5ef25":"Spirits & Spells (USA)","dce9d2624293ec80bd9e2937d9d3d0f1":"Tak and the Power of Juju (Europe) (Es,It)","dcfb3d652c77ba9574cf42ff18ee2f30":"Mermaid Melody - Pichi Pichi Pitch (Japan)","dd311f91e8792544af395c9e3690a478":"Kaze no Klonoa - Yumemiru Teikoku (Japan)","dd383a093793bfdd76b03d41ba4134f7":"Pokemon - Aura Mew Distribution (Germany) (Kiosk)","dd849fc5fe36531624d152c0d17e4799":"Waimanu - Grinding Blocks Adventure (World) (NEO Coding Compo 2013)","dd9d7f37441572d859092e715af804bd":"X-Bladez - Inline Skater (USA)","dda55ee90530b82555f0f37cbaa90b9f":"Dragon Ball - Advance Adventure (Japan)","ddac943bebcf4160fa6afe082e16513c":"NHL 2002 (USA)","ddafcdb5a0d7f0d44b861a7700e187bc":"Yu-Gi-Oh! - Day of the Duelist - World Championship Tournament 2005 (Europe) (En,Ja,Fr,De,Es,It)","ddb830fcfac817a2d2dbd83af2b0950e":"Barbie and the Magic of Pegasus (USA) (Beta 3)","ddca8cbb4f44395795dbd1b175fecebb":"2 in 1 Game Pack - Spider-Man + Spider-Man 2 (USA) (En,Fr,De+En,Fr,De,Es)","ddce88b0ee51535fb422babffb1b3c6c":"Konami Wai Wai Racing Advance (Japan) (Virtual Console)","ddd0670792619198933dcef3571428b3":"My Little Pony - Crystal Princess - The Runaway Rainbow (USA)","ddd7e9448cd3d991eae4f057905de534":"Glucoboy (Australia)","ddd7ea535fbd95d05686186a4b15aef6":"Spider-Man 2 (Italy)","dde1bc02ea274a721313a432333e832e":"Tweety and the Magic Gems (Netherlands)","ddebbf0f61891b4e26448ae672ccc8e4":"Ratatouille (Europe) (En,It,Sv,No,Da)","de0fd2e4e4c888eed0719511095efd22":"Mario Golf - GBA Tour (Japan)","de2924a164d2b89f5080e0003d16894c":"March of the Penguins (USA)","de2f2ca8f0d03a8a2e14258dac2581fd":"Rockman EXE 6 - Dennoujuu Gregar (Japan) (Virtual Console)","de37c8d6f9b8cd56dfd81ca0f754e54b":"Beyblade V-Force - Ultimate Blader Jam (USA)","de40b1738a7c670ca28ddf44bb908df6":"Sonic Pinball Party (USA) (En,Ja,Fr,De,Es,It)","de44e3ae64659aba9824d0047c381981":"Uno 52 (USA)","de5c59a357e791d5b7e2775c538ea172":"Army Men - Sarge's Heroes (USA, Europe) (Proto 4)","de5d47cd1d1632127c6d1fa8cf90c849":"Spirit - L'Etalon des Plaines - A la Recherche de la Terre Natale (France)","de6b60ee6f0de4f2f7a7fc7c8f4a1d9e":"Back Track (USA, Europe)","de794ca5b1d1892fbc8bfae8c6f2441b":"Chinmoku no Iseki - Estpolis Gaiden (Japan)","de7acda94a1f36a2b9218a10ade91e68":"Gachinko Pro Yakyuu (Japan)","dea8cb17074798c5123422836024d4c8":"Megaman - Battle Network 3 - White Version (Europe)","deb7a16b2ea673b2ca137d7a7bc76e70":"Kid Paddle (Europe) (Fr,Nl) (Beta 3)","dec3b16b1a70bca1b467654c01b486d3":"Aigle de Guerre, L' (France)","dedc14eac17a4bb6e043f09d5b793f99":"Soccer Kid (USA, Europe)","dee39c7bcc84c236108ad7f36cf6dcc0":"Disney Sports - Skateboarding (Europe) (En,Fr,De,Es,It)","def28c154a93987df372f1000a1584f2":"Pirates of the Caribbean - The Curse of the Black Pearl (Europe) (En,Fr,De,Es,It)","defab6ec6f979511247ab211d1404bc0":"Cheetah Girls, The (USA)","df13967bf6d021a133d8f6b6e6d3ef3d":"Rockman EXE 4 - Tournament Blue Moon (Japan) (Rev 1)","df5efe075b35859529ebf82a4d824458":"Kirby & The Amazing Mirror (USA)","df60ea476f585692bfb05d77ea833342":"Uno 52 (Europe) (En,Fr,De,Es,It)","df78967cea5f519d6477fe68edbfbb77":"Classic NES Series - The Legend of Zelda (USA, Europe)","df7b1d5fb2f71445497feabf7babb8ef":"GT Advance 3 - Pro Concept Racing (Europe)","df83b7498860fbf0678d8fc6a2664e18":"Gakkou o Tsukurou!! Advance (Japan)","df9bd674970714489629e97a8bcd32f7":"Play Novel - Silent Hill (Japan)","dfae85cbb4e9825bee214ff73ca9bbaa":"Ozzy & Drix (USA)","dfb46ddc7be8f75d7ad429b60b646aaa":"Yu-Gi-Oh! - Destiny Board Traveler (Europe) (En,Fr,De,Es,It)","dfca43fb18b5ee86b3ecab2631862d6f":"Duke Nukem Advance (USA)","dfd7387e205c01a4f044e3a1d4aaea68":"Stuntman (Europe) (En,Fr,De,Es,It)","dffc7306234751e18b163fbf3e925f1b":"Naruto - Ninja Council (USA)","e003f4c06ad7f01d50dcdada5075a234":"Quad Desert Fury (USA, Europe)","e03754f31d720daeb5c6968c23647882":"EZ-Talk - Shokyuu Hen 4 (Japan)","e041a99eccf2d2b7360b6703ce73e169":"High School Musical - Livin' the Dream (USA) (Beta)","e0503182a2e699678bcf25a6897a24d6":"Pokemon - Ruby Version (USA, Europe) (Rev 1)","e0533faf6aa36e3111669574f1c5df92":"Sonic Advance 3 (USA) (En,Ja,Fr,De,Es,It)","e07ab5a02cd7c2f503cef587890afb54":"Driver 2 Advance (Europe) (En,Fr,De,Es,It) (Beta 2)","e08250206b5cf301c15417112f306a16":"Shaun Palmer's Pro Snowboarder (USA, Europe)","e0adff6ebe33cd13b57a7041f14599d8":"Pinball Tycoon (USA)","e0d9909f402dac923114675ce44d6b48":"3 Games in One! - Yars' Revenge + Asteroids + Pong (USA)","e0dceb3ee3be70e72b425fdf455c7237":"Cinderella - Magical Dreams (USA) (En,Fr,De,Es,It)","e0e75f6c714550e652dbaaaba49a1d53":"Classic NES Series - Donkey Kong (USA, Europe)","e0ec4f5cd24d2f7b93eac7f7d7b89398":"Zooo - Action Puzzle Game (Europe) (En,Fr,De,Es,It)","e0f566030c5ad91a20210476cd521d4e":"Combo Pack - Sonic Advance + Sonic Pinball Party (USA) (En,Ja,Fr,De,Es+En,Ja,Fr,De,Es,It)","e10c33761a85410bb894696ae03f22d0":"Haunted Mansion, The (USA) (Proto)","e124a5cc941c7aba6a626f687c50fbf6":"Namco Museum (Japan) (En)","e1303fccc44bdb8524e904f6b15b9856":"Gremlins - Stripe vs Gizmo (USA)","e131f08b70001f4c979cf4d64f806192":"Riviera - Yakusoku no Chi Riviera (Japan) (Rev 1)","e140b67a8a610be8de419e4146940359":"American Idol (USA)","e147d1cd9ac05b4b8588115382103a68":"Titei Senki Advance (World) (v1.03)","e15eff9df4cdb078896e7ee894dc98f6":"Pokemon - Edicion Rubi (Spain)","e187189ca821fd17afd4d9de7a376f9c":"FILA Decathlon (Europe) (Beta)","e192f69d5fe9098cc0ee4f85aeedb4eb":"Bratz - The Movie (Europe)","e196292ab09ed4c6f0b1e394d38cdaeb":"Fire Emblem (Europe) (En,Fr,De) (Virtual Console)","e1b65755d37a64d3ab7605d5dac86b56":"Pitfall - The Lost Expedition (USA)","e1b689a5776e8e35840e3a676fa11853":"Battle B-Daman - Fire Spirits! (USA)","e1c7214348810c9a7b430c64a06e68b7":"Minna no Soft Series - Happy Trump 20 (Japan)","e1cc21ebf4c3be179738ebbf44f25308":"Yu-Gi-Oh! GX - Duel Academy (Europe)","e2026eacc69f10684dd4d370c4abedec":"Spider-Man - Mysterio no Kyoui (Japan)","e21509b91a56514bc1d0cdd0f303a670":"NES Classics - Castlevania (Europe)","e21564dea14e62d831cc1ffe2fefad0b":"Castlevania - Aria of Sorrow (Europe) (En,Fr,De) (Virtual Console)","e21a85388112f840d560c8cf90f61bcc":"2 Games in 1 - Disney Princess + Lizzie McGuire (Europe)","e23047fcf278ca962b8e95690490cc1c":"Dora the Explorer - The Search for the Pirate Pig's Treasure (USA)","e230b4551a3708b97fefbac56ac31421":"Famicom Mini 06 - Pac-Man (Japan) (En)","e23c14997c2ea4f11e5996908e577125":"Metroid - Zero Mission (USA) (Virtual Console)","e23c4d809417568bcbfb93172609c77e":"Megaman - Battle Network 3 - Blue Version (Europe) (Virtual Console)","e2403303923bf63cd48c4b32e918b246":"Crash of the Titans (Europe) (En,Fr,De,Es,It,Nl)","e26711c4aae6f6271e73f663b476c66a":"Codename - Kids Next Door - Operation S.O.D.A. (USA)","e26ee0d44e809351c8ce2d73c7400cdd":"Pokemon - FireRed Version (USA, Europe)","e284d5c93a8e6a3dd4f3587f0836aa4c":"Power Rangers S.P.D. (Europe) (En,Es,It)","e2970509f5671dd267f1c5c5902710e3":"Sum of All Fears, The (USA) (En,Fr,De,Es,It)","e2e9ffe86da23d3cd278d78689bb1fe6":"Total Soccer Manager (Europe) (En,Fr,De,Es,It,Nl)","e309212adc8da5280235f8765649858e":"Lilo & Stitch 2 (Europe) (En,Fr,De,Es)","e32fa9f5d6dedf8e29d65126f780d58a":"Nobunaga Ibun (Japan)","e345a10a452e8574fa4686539e852f31":"Baseball Advance (USA)","e34a4e7ce625a115d985364f448db795":"Happy Dawn (World) (Demo 2)","e352bcea86303c8cd501beca590d2087":"Tringo (USA)","e366059f44f224bf4639a16dc0a9c6c4":"Colin McRae Rally 2.0 (Europe) (En,Fr,De)","e36e394b1d44b3c50cd8630d54da9e4d":"Dynasty Warriors Advance (Europe) (En,Fr,De,Es,It)","e38706415aeef12402ea38b8f1f8e0e0":"Tsuukin Hitofude (Japan) (Virtual Console)","e391eed848ae680be93bba1d691bd55b":"Getting Around It with Pheasant Birdy (World) (Proto) (GBA Jam 2024)","e3b402ef6b72847594bce110fefa4139":"Crayon Shin-chan - Arashi o Yobu Cinemaland no Daibouken! (Japan)","e3bbd6705ed20f911a03a2dd184139f5":"4 Games on One Game Pak (Nicktoons) (USA)","e3bebb876bf45ca598800e3a90d6b2f0":"Lord of the Rings, The - The Two Towers (USA, Europe) (En,Fr,De,Es,It,Nl)","e3c1e29f3560ed88f4a04e1c6ce87b3e":"ESPN Final Round Golf (Europe)","e3d1f21b756890e2a68424173aa8cee5":"Star Wars - The New Droid Army (USA)","e42148c3e79f7d5f7a9f3b63939b68c2":"Megaman - Battle Chip Challenge (Europe)","e429ce307fe06dbcd7724552ff0339d7":"Sims, The - Bustin' Out (USA, Europe) (En,Fr,De,Es,It,Nl)","e42d386ba4691e3608d45fb6dc47996e":"2 Great Games! - Pac-Man World + Ms. Pac-Man - Maze Madness (USA)","e43c13764af931ec97e828eb15e2bc04":"SK8 - Tony Hawk's Pro Skater 2 (Japan)","e43c1c1ccc83f1606ed3ee3996cc8322":"WinX Club (Europe) (En,Fr,De,Es,It)","e44a2af9631df8d957a0f3925b4de3ba":"Monster Farm Advance 2 (Japan)","e44c57a05f836d7ec7fa1c18153b151a":"Hot Wheels - All Out (Europe) (En,Fr,De,Es,It)","e46d84fc7d150d0e9a378b788a6b5c92":"2 Games in 1 - Finding Nemo + The Incredibles (Europe)","e473c37f4e450ceb42cf7d48556b55e7":"Disney Sports - Snowboarding (Japan)","e49b33123bea5e4ff7d74fd06409fd85":"Harry Potter Collection (Europe) (En,Fr,De,Es,It,Nl,Pt,Sv,No,Da)","e4ac9d76d7153c94919ce5a73dc984a4":"Fairly OddParents!, The - Enter the Cleft (USA)","e4ae25fc06561245f7726f9a815d5eea":"Nicktoons Racing (USA) (Beta)","e4bd4736749862ad16cc1c2efed3f8d6":"Quokka Wokka (World) (GBA Jam 2024)","e4de91df422ca4c1b881b9b6288172bd":"K-1 Pocket Grand Prix (Japan)","e4e07fce7c412ecbb7117a58fa235409":"Mario Party Advance (Japan)","e506cc1b94ab876b7cae86d4ad42a600":"Robot Wars - Advanced Destruction (Europe) (En,Fr,De,Es,It)","e51af95bf10261e95814527f05aaddd0":"Rayman - Raving Rabbids (USA) (En,Fr,Es)","e5240ec76c88cd1fe44c73996e957391":"Gap-Man (World)","e524b9c64a98cdc79cf88cbdea5ee39a":"Piglet's Big Game (Europe) (En,Fr,De,Es,It,Nl)","e52615a42936f73a8e8d0853e582a2f7":"Donkey Kong 2 (USA)","e535a6ec2eb86d183453037289527a63":"Metroid Fusion (Japan)","e53b022ae20adabc1c5edbabd3879d17":"ESPN X-Games Skateboarding (Japan) (En)","e5445bbb91fa514a63fd54bf1ce39cf8":"Mermaid Melody - Pichi Pichi Pitch - Pichi Pichitto Live Start! (Japan)","e559a4743a79fb5374872d758c3c67b2":"Famicom Mini 22 - Nazo no Murasame Jou (Japan)","e559e292aa9d44287b052342d6469967":"Super Mario Advance 4 - Super Mario 3 + Mario Brothers (Japan)","e56da89876f44184900ee955d5864742":"Diddy Kong Pilot (USA) (Beta 2)","e582614d06f941ff491543a721a9acb0":"Franklin the Turtle (USA) (En,Fr,De,Es,It,Sv,No,Da,Fi)","e58339b1d1426d9b51ad0b8bad3e87c3":"Tom Clancy's Rainbow Six - Rogue Spear (Europe) (En,Fr,De,Es,It)","e5911e8365d3fe871c7d58560a302938":"Powerpuff Girls, The - Him and Seek (USA)","e5a317d1c71261baac40bbfb29453082":"Mr. Incredible (Japan)","e5d07d693be6f16ed097b2d0ef96f620":"Spider-Man 3 (USA)","e6028a0c5ee9cfc32037cdac136fdad5":"Metal Warrior 4 - Agents of Metal (World) (v1.3)","e61314983c8438a7431b40564f8d6acb":"Konjiki no Gashbell!! Yuujou no Zakeru - Dream Tag Tournament (Japan)","e619f9dcd7ef3d4c6851834018b139bd":"Castlevania - Harmony of Dissonance (Europe)","e6340417acffd03920f9c8211abd72c5":"Twin Series 7 - Twin Puzzle - Kisekae Wanko EX + Nyaa to Chuu no Rainbow Magic 2 (Japan)","e639ef65c3638c0b5927a4d3fc947e3d":"Smuggler's Run (USA)","e646a696bc968b5dc7ffab48cf9b3c94":"Space Twins (World) (Proto)","e64966be355fe570221cef39344973ea":"Famicom Mini 03 - Ice Climber (Japan) (En)","e664054a365f69f673e88fbb84985db7":"American Dragon - Jake Long - Rise of the Huntsclan (USA, Europe) (Beta 4)","e669167a9a053a9d19bf92aa2a2cb2f3":"Ratatouille (USA)","e66d2e98947a5bd1068228e4084b06da":"Yoshi Topsy-Turvy (USA)","e674bef244d677e175f5694a7006bfde":"Classic NES Series - Bomberman (USA, Europe)","e682f89b0a9c991b5e16ceb188fa7e87":"Postman Pat and the Greendale Rocket (Europe) (En,No,Da)","e6836a809ffe6aea707231ccf830c122":"Kelly Slater's Pro Surfer (USA, Europe)","e6985222b701bd435ddb0a30e7fc4fb9":"Disney Sports - American Football (Japan)","e698ff3702ff76c42fc8d0bb80154d22":"Killer 3D Pool (Europe) (En,Fr,De,Es,It)","e6b4bd3c5f5b3d57c2e29c4a9b377b26":"NHL Hitz 2003 (USA)","e6b78109c11d82f621db846da70bc30a":"Sonic Advance 3 (Europe) (En,Ja,Fr,De,Es,It)","e6c6fa9ed05399d05b41806cfe76d4f1":"Final Fantasy V Advance (Japan) (Virtual Console)","e6d2b51ebe0420817d16acad4f89bf7a":"Megaman & Bass (Europe) (Virtual Console)","e6ddd053f1c7c9f3dec98f3b8f8d46f4":"F24 Stealth Fighter (USA)","e711f571ae5bdbacb4ed497c759d074d":"Touhai Densetsu Akagi - Yami ni Mai Orita Tensai (Japan)","e712dc279aa30550031982b9fdc76d87":"Ao-Zora to Nakama-tachi - Yume no Bouken (Japan)","e715d170842826522a7827a89e61998c":"2 Games in 1 - Die Monster AG + Findet Nemo (Germany)","e7470df4d241f73060d14437011b90ce":"Castlevania - Aria of Sorrow (USA)","e78e1f6c6fbe9a614e0406802fc6a7fd":"Tony Hawk's Pro Skater 4 (USA, Europe)","e7939307d25e65cbecc764f55ad49e34":"Kinniku Banzuke - Kongou-kun no Daibouken! (Japan)","e7970a74b423e6b4e842ec640eba3630":"Rockman EXE - Battle Chip GP (Japan)","e799d636498defe6ec44ed038193f366":"Croket! Great - Toki no Boukensha (Japan)","e7a2792c5913a8420a419f2d01358487":"Super Mario Advance 4 - Super Mario Bros. 3 (USA) (Rev 1) (Virtual Console)","e7af002a857d9960e3b5ce7a7f524813":"Fairly OddParents!, The - Breakin' da Rules (USA)","e7c65f9930b6e7580565ad3713c303b1":"Pinky and the Brain - The Master Plan (Europe) (En,Fr,De,Es,It)","e7e9e8948ff3a0de232bf0d8465da8fb":"WTA Tour Tennis Pocket (Japan)","e7ea7a7570b301ae1cfab5531c7a3941":"Mary-Kate and Ashley - Sweet 16 - Licensed to Drive (USA, Europe)","e7ead9536e55c3c6ff2448712cd77efb":"Lilo & Stitch (Europe) (En,Fr,De,Es,It,Nl) (Rev 1)","e80a4cbcfdf598b7efcf80be26c55f56":"Fire Emblem - The Sacred Stones (Europe) (En,Fr,De,Es,It) (Virtual Console)","e81a7f17531fee0906cdca576efe41b4":"ESPN Winter X-Games Snowboarding 2002 (Japan) (En)","e831d36a270f0ddc942fa2909607f2bb":"F-Zero - GP Legend (USA) (Proto 9) (Netcard)","e83c6421a55f4af4394fc8b5fb47efdd":"Oshaberi Inko Club (Japan)","e84d4d9b8c1a68292e76a4c566e5040f":"Medal of Honor - Underground (Europe) (En,Fr,Es,It) (Ubi Soft)","e84de432672187d3d0b8f4d4d654013b":"SpongeBob SquarePants - Battle for Bikini Bottom (Europe) (En,Fr,De)","e85e9de827ed5f685b66c226c96d8981":"Hexes (World)","e86c23f445b069b1a0bc27dda5f638b8":"Dark Arena (USA, Europe)","e876ddf9aecf8f52caecee2358acd9cc":"Momotarou Matsuri (Japan) (Rev 1)","e879e454a201eeeb31a942406048501a":"Konami Collector's Series - Arcade Advanced (USA)","e8c8a0aa40fa0c32d42eebaca6d5412f":"Mickey to Minnie no Magical Quest 2 (Japan)","e8fb25970f5634b9b159edef8c719090":"Eggo Mania (Europe) (En,Fr,De,Es,It,Nl) (Beta)","e8fe8458edbf341e9d7eba0cbec95d46":"Buffy the Vampire Slayer - Wrath of the Darkhul King (USA, Europe)","e91540a58d8c28d15137c7fc6504f78a":"Atari Anniversary Advance (Europe)","e9385f1a0876c563dc42a0ee9c8700ce":"Resident Evil 2 (Unknown) (Proto)","e94540fb5d5e27d7a33c50076bd7628a":"Ed, Edd n Eddy - Jawbreakers! (USA) (Rev 1)","e953331481a9d72101db59ed98dcf57a":"Silent Scope (Japan)","e958226d3b1dfc69e2523ddb19313eee":"World Reborn (USA)","e9626c897aab5bf3e9c42e0611fb4062":"King of Fighters EX, The - NeoBlood (Japan) (Beta)","e963e1b70ddee0657a91f6d857c4e176":"Pac-Man Collection (Japan) (En) (Virtual Console)","e99d7bfa10920b0e5bca2bd235e2fa92":"Winning Post for Game Boy Advance (Japan) (Rev 2)","e9dfe02b283e29d67c224ab6f86c3b9c":"Megaman - Battle Network 4 - Blue Moon (USA)","ea29cc92d44b5217b9810a77eccada2d":"Kidou Gekidan Haro Ichiza - Haro no Puyo Puyo (Japan)","ea3f88e07ff1c9d6bbbad20e0c7efa8e":"Hoshi no Kirby - Yume no Izumi Deluxe (Japan) (Virtual Console)","ea589465486d15e91ba94165c8024b55":"Castlevania - Harmony of Dissonance (USA)","ea6434c2b4b22873efa5166d3ee086fb":"Kaiketsu Zorori to Mahou no Yuuenchi - Ohimesama o Sukue! (Japan)","ea7d981e25ac274adaf5ed08f505c60b":"Backyard Football 2006 (USA)","eab287293bf4b62301119cfc3a9a9ccc":"2 in 1 - Asterix & Obelix - Bash Them All! + Asterix & Obelix XXL (Europe) (En,Fr,De,Es,It,Nl)","ead0c0d58712a968db6ff1c2c08f6946":"Initial D - Another Stage (Japan)","eaec6e4f1192ad24c484b05056e3aa76":"Dragon Ball Z - The Legacy of Goku II International (Japan)","eb0e2a6afcb5e50b2d90db9deba9af6e":"Shining Soul (Japan) (Virtual Console)","eb0f9589f3040f59a944b0831469ae1c":"Jurassic Park III - Ushinawareta Idenshi (Japan)","eb345977c4b1c846c9dec4141ec18343":"Dragon Tales - Dragon Adventures (USA)","eb3ad3925a39e6e36ec9cb0fc3f0d535":"Minna no Shiiku Series - Boku no Kabuto, Kuwagata (Japan)","eb462f708c715309d08fd7968825ae9e":"Metroid Fusion (Europe) (En,Fr,De,Es,It)","eb73bdf597637bed97885296a68250df":"Sims, The - Bustin' Out (USA) (En,Fr,De,Es,It,Nl) (Rev 1)","eb75712d8c0cf949f328e59993797a3f":"Gyakuten Saiban 2 (Japan) (Virtual Console)","eb7ba1c777b946bd9842b6238676f799":"Zapper (Europe) (En,Fr,De,Es,It)","eb80b79637b5fb3c71dd55a47ac20a2e":"Anguna - Warriors of Virtue (World) (Demo 2)","ebb31e3fe75ca8fcae960d3588ef767d":"Razmoket Rencontrent les Delajungle, Les (France)","ebbce58109988b6da61ebb06c7a432d5":"Metroid - Zero Mission (USA)","ebc7077768e9fc856480a80cb6be5b2c":"Green Eggs and Ham by Dr. Seuss (USA)","ebc874a9ffabaacd7ea1a3e128dd97d3":"Final Fantasy V Advance (Europe) (En,Fr,De,Es,It)","ebe1fc2780d93c4cf42f1fe5815a84bf":"Bubble Bobble - Old & New (USA)","ec06f494be2a51170d7fd439bee5a057":"2 Games in 1 - Dr. Mario + Puzzle League (Europe) (En,Fr,De,Es,It)","ec2e23cc5fd7a3ea4e32ac7b8d488103":"Yu-Gi-Oh! - Dungeon Dice Monsters (Europe) (En,Fr,De,Es,It)","ec3f000ffde5754cb164a05d2d6f9053":"Yu-Gi-Oh! - The Eternal Duelist Soul (USA)","ec43565bffb4d418164b85e007de7e17":"Shrek - Super Slam (Europe) (En,Fr,De,Es,It,Nl)","ec77810214f9b39fdc7fe1f2f1cf5cc3":"Over the Hedge - Hammy Goes Nuts! (Europe) (En,Fr,De,Es,It,Nl)","ec863e849b429999ff389df40d29f921":"Elite AGB (World) (Beta)","ec8fde05b426bc7fb37fc6589018c7d9":"Zero-Tours (Japan)","ec9fdbf2ec32b7d5af4fbebe9aa60a56":"Super Donkey Kong 2 (Japan)","ecad3a5f95c034f51641231a33b76c8c":"Tennis no Ouji-sama - Genius Boys Academy (Japan)","eccb480acab19463fa92940c3f573caf":"Racing Fever (World) (En,De,Es,It) (Evercade)","ece7885bad93e64312a90f15763da7ce":"Nintendo MP3 Player (Europe) (En,Fr,De,Es,It)","ed09ecf8c9d1ae485cf3c12cf2184756":"Gunstar Super Heroes (Japan)","ed307f6ea37b57eae6e7d32b76fddf7d":"Care Bears - The Care Quest (Europe) (En,Fr,De,Es,It,Nl,Pt,Da)","ed37a03ef4b1df0bee663751cc021aa2":"Tiny Toon Adventures - Wacky Stackers (USA)","ed4304cc4f5bac34adfaa750316784a8":"Pac-Man Collection (USA)","ed509e5168598ad8e4784a56d79bd6a1":"Napoleon (Japan) (Virtual Console)","ed52707b19848c480866a86f28268273":"Super Mario Advance 4 - Super Mario 3 + Mario Brothers (Japan) (Rev 2) (Virtual Console)","ed573adeab96072232623aa7cff4f077":"Bionicle - Matoran Adventures (USA, Europe) (En,Fr,De,Es,It,Nl,Sv,Da)","ed6f287dfe987b596952671e75b7f688":"Essence of War, The - Glory Days (Europe) (En,Fr,De,Es,It)","ed71f0dc43682b3df88161eadaa4ee44":"GetBackers Dakkanya - Metropolis Dakkan Sakusen! (Japan)","ed8221d6853e1c7b070866d3ca3267ea":"Ready 2 Rumble Boxing - Round 2 (Europe) (En,Fr,De)","ed9b2fe7068678fee67725ec96e98d1f":"Moorhen 3 - The Chicken Chase! (Europe) (En,Fr,De,Es,It)","edb9cfe1efcdd9b8abcf16dfbd0421b8":"Bomberman Max 2 - Max Version (Japan)","edd737aa42cbc7fa7d8b86c249f06ca1":"Sonic Advance 3 (Europe) (En,Ja,Fr,De,Es,It) (Beta)","edd82d2798c8537cfbf044fd1afd6a49":"Black Belt Challenge (Europe)","eddb8663171073186d122638d4b27f82":"Increibles, Los (Spain)","edde54bfd66466d22f113527a7f96e76":"Minicraft (World) (v1.3)","ede4813eb3bbb2860ccf91341dd843c4":"Pokemon - 10th Anniversary Distribution (Spain) (Kiosk)","edebadbee7e89aede8bdf6d245580085":"Naruto RPG - Uketsugareshi Hi no Ishi (Japan)","edfdf49642c0cc0458e0584792f869c5":"Racing Fever (France)","ee0b14aab3ce1039857ad005636e07a4":"Battle Network - Rockman EXE 3 (Japan)","ee2d0ffd5ed6588537e7590540d5cf21":"2 Games in 1 - Finding Nemo + Finding Nemo - The Continuing Adventures (Europe) (En+En,Es,It,Sv,Da)","ee34036bfcc29de83fdffa8adfa697c9":"Shrek - Swamp Kart Speedway (USA) (En,Fr,De,Es,It,Nl) (Rev 1)","ee36c7a4cc06bf050db0b872bebb03d9":"Dragon Quest Characters - Torneko no Daibouken 3 Advance - Fushigi no Dungeon (Japan)","ee4fbcec249a68b796be491f56ffe03d":"Densetsu no Stafy 3 (Japan) (Rev 1)","ee7a39890e4c30bb46d5067abc4ade9e":"Action Replay GBX (Italy)","ee7a6ac20bb48e1da9b39850ba181397":"Nakayoshi Youchien - Sukoyaka Enji Ikusei Game (Japan) (Rev 1)","ee91c4582d9b0cc494fcb71173b43e17":"Tonka - On the Job (USA)","ee9880f52c3626749b943c91921f12ab":"Winnie the Pooh's Rumbly Tumbly Adventure (Europe) (En,Fr,De,Es,It,Nl)","eeacae04f56e9851ef2feeb8a5e7c447":"Inky and the Alien Aquarium (World) (Demo 1)","eed661599b926eddf6890c862c252112":"Monster Force (USA)","eedd67a815e798e19159237a4d151d1a":"Majesco's Sports Pack (USA)","eef855d3f529ad51a0ef8bb6f028f31d":"Teenage Mutant Ninja Turtles 2 - Battle Nexus (Europe) (En,Fr,De,Es,It)","ef13adffd0dc94ed7e417c253e78244d":"LEGO Island 2 - The Brickster's Revenge (Europe) (En,Fr,De,Es,It,Nl,Sv,Da)","ef32f93816b6dbcf788f08faf1e71450":"Super Robot Taisen J (Japan)","ef51d33fd8473d11c3b8083937e6cdf5":"Speedball 2 (Europe) (En,Fr,De,Es,It)","ef9198e16c58c4824efae668da1e7040":"Avatar - The Legend of Aang (Europe) (En,Fr,De,Nl)","ef9c063ab316ca610dd5a6c5c35fca7f":"Hagane no Renkinjutsushi - Omoide no Sonata (Japan)","efa8473a8125181965f08156c95cc6bb":"Dual Blades (USA)","efb231cca7699e588d9e9c3977a04b17":"Megaman Zero 2 (Europe) (Virtual Console)","efcd9b5848f494aaf49051c5d9e83054":"2 Games in 1 - Sonic Advance + ChuChu Rocket! (Europe) (En,Ja,Fr,De,Es)","efefee9082a83fc6e49f87510746eac0":"Doom II (USA)","eff13bb745908c0d38ee5f4518da52aa":"X-Bladez - Inline Skater (Europe)","effa1b8ae6a342dc47f1ad1228c78965":"SpongeBob SquarePants Movie, The (USA) (Beta 1)","f005987feac9ba8aa100658fadc72039":"Surf's Up (USA) (En,Fr,Es)","f008f97617b59e221f8135838f7ddcee":"2 Game Pack! - Matchbox Missions - Emergency Response & Air, Land and Sea Rescue (Europe) (En,Fr,De,Es,It)","f044b2cb1f529c0dffb10ee849e1a1c6":"Inheritors of the Oubliette (World) (v1.2)","f04e0dbf730276bb548498efb2cc6dc5":"Medabots - Rokusho (Spain)","f0507e4e45d9643b4749ec3854557872":"Pro Beach Soccer (Europe) (En,Fr,De,Es,It,Pt)","f053f23d0fb4ae82952c6a0e84048fc3":"Shining Force - Kuroki Ryuu no Fukkatsu (Japan)","f05560ae14f622de028308b372ab2fe3":"Cabbage Patch Kids - The Patch Puppy Rescue (USA)","f05f356facb38a1c330fa3d80ff3bd28":"Gojira - Kaijuu Dairantou Advance (Japan)","f06ab1aa70bde5cddd63b0ae6ba02712":"GB-A TV Tuner PAL (China) (v2.0)","f090251d431126090195e54b6d963e2d":"Charlotte's Web (USA) (En,Fr,De,Es,It)","f0d1a7bb650ea304b9af7bfc1567a19b":"Power Rangers - Ninja Storm (Europe) (En,Fr,De)","f0d3e68e554e44d1df20a16359f13f5f":"Star Wars - Episode II - Attack of the Clones (USA)","f0de694021e61fbe5224d4a2e805e587":"Super Puzzle Fighter II (USA)","f102be90875140f712a259a5bc533dd5":"Korokoro Puzzle - Happy Panecchu! (Japan)","f1032ab0ecb48697ffd4d50b28cccf5f":"Asterix & Obelix XXL (Europe) (En,Fr,De,Es,It,Nl) (Beta 2)","f1040f25e06dd1f4b5fa2967a2996ffc":"Racing Fever (Europe) (En,De,Es,It)","f12ac2c645c7984621e573a37d76c446":"Pokemon - Leaf Green (USA) (Pirate)","f1321648a333354c64cc402fb79487ad":"Zoids - Legacy (USA) (Beta 2)","f146baf10cf767d2313c4da94a5845eb":"Castleween (Europe) (En,Fr,De,Es,It)","f14d377341c6afba46d3db0fabf12062":"Medabots AX - Metabee Ver. (Europe) (En,Fr,De,Es,It)","f15c91bc7484532fb4a762250bf6d48a":"Scooby-Doo (Spain)","f18631a6e0af3301981848e521f1de9a":"King of Fighters EX, The - NeoBlood (Japan)","f197a596c8626f8f0cf996bd5f68dc40":"Barbie and the Magic of Pegasus (USA) (Beta 4)","f1a1b9742fcd467a531dd4314c4e7d19":"Fire Emblem (USA, Australia)","f1be09ac4b8d6a9e2c955cab741669ef":"Big Mutha Truckers (USA)","f1d525b5a2f0d14e90c494317be072c7":"Contra Hard Spirits (Japan) (En) (Virtual Console)","f22148e0a4298808ba05cd386d64d320":"Konjiki no Gashbell!! - Unare! Yuujou no Zakeru (Japan)","f22ca50c999fddb4feef6bcb32b9d94a":"Dead to Rights (USA)","f238cf012fec263050f77bb01460404e":"Shiren Monsters - Netsal (Japan)","f2391ba88f816726e5a2ce4d321c5abf":"Rayman Advance (Europe) (En,Fr,De,Es,It)","f24e3e9760003f0629b31ff96e9427b6":"Famicom Mini 23 - Metroid (Japan)","f26abd577f7854c5f967ef5f0d1396ad":"Barbie Superpack - Secret Agent + Groovy Games (Europe) (En,Fr,De,Es,It)","f27ec053bccc03c8219a6d04169d402a":"2 Games in 1 - SpongeBob SquarePants - Revenge of the Flying Dutchman + SpongeBob SquarePants - SuperSponge (Europe)","f291756b7731354c0d912e8d6337b7fe":"Inspector Gadget - Advance Mission (Europe) (En,Fr,De,Es,It,Nl)","f29fe8cae0acb618d7c48fb5e292b367":"Power Rangers - Time Force (Germany)","f2b1c6f30bd79859dc75ac2c8abee538":"Extreme Skate Adventure (Europe) (Fr,De)","f302325be9c434ea4ada4ee80cb1caeb":"Rick Dangerous 2 (World)","f30650403dc5bbf73037c1364d747df5":"Mario Golf - Advance Tour (Australia)","f310c0a374d8c59320c2f8b9fc6aaba3":"Driver 2 Advance (Europe) (En,Fr,De,Es,It) (Beta 1)","f323312b0676c7bf845f2f7b8e90459c":"Let's Ride! - Sunshine Stables (USA)","f333b1026273dd9b49dad0f912510496":"Puppy Luv - Spa and Resort (USA)","f341bab11f2bfd79b995554d40a61cba":"Crazy Frog Racer (Europe) (En,Fr,De,Nl)","f3485ed77afc6fc2acb2da935ca4d6b4":"Sports Illustrated for Kids - Football (USA)","f34e91399c719812e66e2c828a2e93d7":"Pokemon - Sapphire Version (USA, Europe)","f35d2f567edd9c04e7f9647edb206995":"Mario Kart Advance (Japan)","f3647154d85d20f9c8ba66ed8f0a609e":"Pokemon Fushigi no Dungeon - Aka no Kyuujotai (Japan)","f38a2757e2be77413bdbeddf8ff07e2a":"Army Men - Sarge's Heroes (USA, Europe) (Proto 3)","f39b607dc13c4d8c4353b7981f5f6cb6":"Steel Empire (Europe)","f39ee250baea64eb691fe65bf4da40b9":"Green Memories (World) (v1.4.2)","f39efd645c3828875c7f5f5971a06497":"Monster Summoner (Japan)","f3b1c7fc2ae57728f8d9f6967d2285be":"Tork (USA) (Proto)","f3bea8b094971b2bade114ad11f693af":"Unfabulous (USA) (Beta 7)","f3d168d87d3e2ae25dbec012471cd9b5":"Super Robot Taisen - Original Generation 2 (USA)","f3e58d5622af0d38c7dad8ffd33635e3":"Nakayoshi Mahjong - KabuReach (Japan)","f3f2885cbf6d0476a8d2a786d4aa22e8":"SpongeBob SquarePants - Lights, Camera, Pants! (USA) (Beta 2)","f3f8de4d9497fde3be0a950a10bb2f5b":"SpongeBob SquarePants - Revenge of the Flying Dutchman (USA) (Beta)","f40df16771cfe278d3ea43b2a91242fc":"Sys Crusher (World) (v1.1)","f41b1b8bc38289dc25082d0fd7d376d1":"Scooby-Doo (USA)","f41e36204356974c94fabf7d144dd32a":"Mother 1+2 (Japan)","f4217235b05b24f48b10504ec45a8a9c":"Anguna - Warriors of Virtue (World) (v0.93) (Alt)","f4260e5de1b9d68bc8b4ab42de2f2109":"Legends of Wrestling II (USA, Europe)","f42847fa81d5d1cf30d1dd5b64924561":"Pokemon - Versione Zaffiro (Italy)","f4326bde4b5e9f53f5fc58ce24d7b137":"SEGA Rally Championship (USA)","f43c3cc85f221533fda3c279a45ce8ea":"Tantei Jinguuji Saburou - Shiroi Kage no Shoujo (Japan)","f45348cc19783709d04ac0c12175b222":"Super Mario Advance 4 - Super Mario 3 + Mario Brothers (Japan) (Rev 1)","f453b825391590c47f4db6504d8f99e5":"Duel Masters - Sempai Legends (Europe) (En,Fr,De,Es,It) (Beta)","f45c8e599577038b306b831a46774546":"Daigassou! Band-Brothers - Request Selection (Japan) (DS Expansion Cartridge)","f46708740d18d280466d6311dafd0906":"Sylvanian Families - Fashion Designer ni Naritai! - Kurumi-risu no Onnanoko (Japan)","f477bd518e5cbf64bf22fe4545909033":"Christmas Game, The (World)","f493e3fe4dbe2b9ecde12ce9590a10e7":"2 Games in 1 - Quad Desert Fury + Monster Trucks (USA)","f4a655e23638e79eacf44a456faee6a4":"Shining Soul II (USA)","f4a74f7683e525fe7d7f125f0bf7834a":"Hamster Monogatari 3EX 4 Special (Japan)","f4ac2d26605ebbb0d390e07810f12484":"Lady Sia (Europe) (En,Fr,De,Es,It,Nl)","f4c2b2fda444dcec1274844b9a764d64":"Advance Wars (Europe) (En,Fr,De,Es)","f4d468093cf7800c97f5aa8b38d03962":"Saibara Rieko no Dendou Mahjong (Japan)","f4dd91f51e8b310542d333ea0d2c9f0c":"Fushigi no Kuni no Angelique (Japan)","f4e3dead5af182598623cf89f9a428f4":"Zoku Bokura no Taiyou - Taiyou Shounen Django (Japan)","f4f23f40e29451150b46d4bbdef63f13":"Klonoa - Empire of Dreams (USA)","f4f51f42af0fcf96a1c33705f7f5ce08":"Bionicle - Maze of Shadows (USA)","f50a0c3fbf3e206528a3e6f99c80820c":"Bibi und Tina - Ferien auf dem Martinshof (Germany)","f575c8c844ae2ffad9adc7f91c886d54":"Disneys Prinzessinnen (Germany)","f577a97d679e669f8063910eb060e864":"Donkey Kong Country 3 (USA)","f586b690746adce9fcaaef9d3d081117":"Comix Zone (Europe) (En,Fr,De,Es,It)","f58a7e485676f66c1c88126675d57eff":"Gekido Advance - Kintaro's Revenge (USA)","f59054ea92eca5911aa6e3fc002fe545":"Konjiki no Gashbell!! The Card Battle for GBA (Japan)","f5a10aeab11d8f77be5cd4d9be1c2766":"Franklin's Great Adventures (Europe) (En,Fr,De,Es,It,Nl,Pt,Da)","f5bdbf35d4ad87fae71ec94bb77c7a49":"Famista Advance (Japan)","f5c79c9813f8d30878234e6397b156ab":"Wreckage (World) (GBA Jam 2024)","f5c877c05db6ac999a86f34a1813fc95":"Berenstain Bears and the Spooky Old Tree, The (USA)","f5d654479e0298694b9479cef798494c":"Holy Bible, The - World English Bible (USA) (Proto)","f5df46466b504e0eaca6065f4780a2b6":"F-Zero - GP Legend (USA) (Proto 10) (Netcard)","f62c47cbe08e1e3bcfcf9f1b84841a76":"Yu-Gi-Oh! GX - Duel Academy (USA)","f65e87d6867d2ae8561ffcd1ab9ed57b":"Elemix! (Japan)","f6670d280e7b6dc85e6c20b89ef51691":"Need for Speed - Carbon - Own the City (USA, Europe) (En,Fr,De,Es,It)","f69ced586dc3dfb4705b69f42ade2b06":"Shin Megami Tensei Devil Children - Hikari no Sho (Japan)","f6c0a645317d6ed90abc4e04f7b33b46":"Mario Power Tennis (Europe) (En,Fr,De,Es,It)","f6c0c5a3ca383ec7769979aa69f551e1":"Pac-Man World 2 (USA) (Beta)","f6d3840d1e185cb4829e8e9a9818d00d":"Land Before Time, The (Europe) (En,Fr,De,Es,It)","f6deba3b5d10f9d85306d4946ee342b4":"Hitsuji no Kimochi. (Japan)","f71bb7305c4aa4ff83d83d949add1126":"Disney Sports - Soccer (Japan)","f74b2b6665c687f5ec1ef2ed21120ee2":"Superman - Countdown to Apokolips (USA)","f74baab7b2516b43119d23292033c735":"Herbie - Fully Loaded (Europe) (En,Fr,De)","f78dff6fa36f9bcf38cd9e4740ecc9c3":"Super Duper Sumos (USA)","f793a854654b467211fc32c4062cb183":"Pokemon - Smaragd-Edition (Germany)","f7960bb4694205288a59556ab82c34e5":"Barbie Horse Adventures (Europe) (En,Fr,De,Es,It,Nl)","f7b81e3f3bb3b02d973fc6f145ad4416":"Kingdom Hearts - Chain of Memories (USA)","f7b81f0a57db7206a0f2486491f8a99d":"Tom Clancy's Splinter Cell - Pandora Tomorrow (USA) (En,Fr,Es)","f7bdd0eb9cd94d4c3bf924654998c514":"Zoids Saga II (Japan)","f7c0a6bf412b6f78a0f0e096aa0fd07e":"Zoey 101 (USA)","f7d2a8559099d30d1cbf74d0d3a6415c":"Medabots - Rokusho (USA) (Virtual Console)","f8076c80baeb8abd1fb636ab3b86630c":"Atomix (World)","f8098c5ca6ddd80e0f2e9f7d36808d4d":"Famicom Mini 13 - Balloon Fight (Japan)","f80cad97ed415aba1ec81d983fb4ae56":"Teenage Mutant Ninja Turtles Double Pack (USA) (En,Fr,De,Es,It)","f81f60fdb2fd774c72a170a1805db52e":"Rhythm Tengoku (Japan)","f8435f531c69c258841a985ff1e8072f":"Princess Natasha - Student, Secret Agent, Princess (USA)","f877b87f140945ad93cfce50411507c0":"Super Mario Advance 2 - Super Mario World (Europe) (En,Fr,De,Es)","f87a7dc67415d1f4c16cc430fcf98d9d":"DemiKids - Light Version (USA)","f87c40e2be0e80ddb2c044df9fb97069":"IK+ (Europe)","f88df40fedb9d31a6e59dba4a9be1b2a":"Iridion 3D (USA, Europe)","f8a7b028f2edcfbb565ef88bb321c665":"Jurassic Park III - Park Builder (Europe) (En,Fr,De,Es,It)","f8d9503c529e3608ed4d91fc7315deb3":"Daredevil (Europe) (En,Fr,Es,It)","f957455dad9133d9ef41af092a353973":"Sonic Advance 2 (USA) (Beta)","f977a030aa9f5fa4c6013ae472f68b91":"Nancy Drew - Message in a Haunted Mansion (USA)","f986d79271e685679f0b5ecb673e9dea":"Shrek - Hassle at the Castle (USA) (En,Fr,De,Es,It,Nl)","f99fb545ac65126e9956a7718c30d6a3":"Mario Kart - Super Circuit (Europe)","f9a91a30f730e8482a73ea0c0a71a4fb":"Superman Returns - Fortress of Solitude (USA, Europe) (En,Fr,De,Es,It)","f9ab5e9200dfae863f30e9332d7fcd95":"Mini Moni. - Mika no Happy Morning Chatty (Japan)","f9acb6c92faeda7287646dcb354ca183":"Naruto - Konoha Senki (Japan) (Rev 1)","f9bb8a52a046efc37077cc1a0c855dcf":"Hamster Monogatari 2 GBA (Japan)","f9d25044142e0492f09c5e60a8da0509":"KAO the Kangaroo (Europe) (En,Fr,De,Es,It,Nl)","f9d40d7c6c31991f44527a236107acda":"Top Gun - Combat Zones (USA) (En,Fr,De,Es,It)","f9de621b65084bcdaff6e6b0cdc7c413":"Yoshi's Universal Gravitation (Europe) (En,Fr,De,Es,It)","f9e6bfc9404be783b149259ffd9c5da0":"FIFA Soccer 2004 (USA, Europe) (En,Fr,De,Es,It)","fa11be8d9b3e6a4851d8f4538922082a":"2 Games in 1 - SpongeBob SquarePants - Revenge of the Flying Dutchman + SpongeBob SquarePants - SuperSponge (USA)","fa19435d7060761379f5583fd95e1d24":"Treasure Planet (Europe) (En,Fr,De,Es,It,Nl) (Rev 1)","fa34fc711555c60249603a4ebb718c8e":"Megaman Zero 4 (USA) (Virtual Console)","fa6a6fd3e3898a58977f468db9a1f6f9":"Chobits for Game Boy Advance - Atashi Dake no Hito (Japan)","fa70bac809f1801f26472a023330e1dc":"Hi Hi Puffy AmiYumi - Kaznapped! (Europe) (En,De)","fa72eb309a2c87d0cc50a00d0775950c":"Kidou Senshi Gundam - Seed Destiny (Japan)","fa8d5832ed9ccad0fbcae7a147755ae9":"PukuPuku Tennen Kairanban - Koi no Cupid Daisakusen (Japan)","fa99e7be703b7f204c33ab8ea7a69e67":"Dogz 2 (Europe)","fab0e663d83fa071089cc626b84c92eb":"Shin Megami Tensei Devil Children - Yami no Sho (Japan) (Beta)","fab7a0ca0e546fc80d886f11390dd9ac":"Taiketsu! Ultra Hero (Japan)","fac044fe59b25ae95471a85c072f716a":"Super Street Fighter II X - Revival (Japan)","facea584a4c4465bcb9e028c7b36a481":"bit Generations - Coloris (Japan) (En)","fb0b9d0db44ec7de4a534c2849f8b756":"Godzilla - Domination! (USA)","fb1e889cf258cd014fbb08e5f8554a35":"Strawberry Shortcake - Ice Cream Island - Riding Camp (Europe) (En,Fr,De,Es,It,Nl,Pt,Da)","fb29d59010a0ea0fec56cec94241617b":"Yu-Gi-Oh! Double Pack (Europe) (En,Fr,De,Es,It)","fb55cc8ae270aa9a18871602d3ae36cc":"Polly Pocket! - Super Splash Island (Europe) (En,Fr,De,Es,It) (Vivendi)","fb6512463e361b4a79bb4f62bfca86fd":"Caesars Palace Advance - Millennium Gold Edition (USA, Europe) (Beta)","fb659da8c345e1c26227d345efc76c79":"iQue Reader (China)","fb85f8209fe4ea11e6578b11e8194546":"R-Type III - The Third Lightning (Europe) (En,Fr,De,Es,It)","fb95bb41631ce0ab21b44575ff6c55b6":"Narikiri Jockey Game - Yuushun Rhapsody (Japan)","fbad88c14dcedefe6c70b06adcd0a0db":"Shin Bokura no Taiyou - Gyakushuu no Sabata (Japan)","fbd187500572b8af52c505f4f8a4bd9b":"Santa Claus Saves the Earth (Europe)","fbda16cbc7e3f81aa5b90da955d3e114":"Spider-Man - Mysterio's Menace (USA, Europe)","fbfe7e3ff612728e1464dfa8cba770df":"Anguna - Warriors of Virtue (World) (v0.94)","fc13f41345df4aba40ffc69402e64704":"Franklin the Turtle (Europe) (En,Fr,De,Es,It,Sv,No,Da,Fi) (Rev 2)","fc221b4371061c27cbf6a8b08db82543":"MotoGP (Europe) (En,Fr,De,Es,It)","fc244be5e2a8b811ea2b2e0101d64a6e":"Cartoon Network Block Party (USA)","fc3294492745f9a205d43c0c983fe6c3":"Survivors (World) (Proto) (GBA Jam 2024)","fc393954c63fa0e82ccfd7334491c2a7":"Pirates of the Caribbean - The Curse of the Black Pearl (USA) (En,Fr,De,Es,It)","fc40baff09563b7e1187bcb987bb541a":"Sports Illustrated for Kids - Baseball (USA)","fc6a66c32b91fa0e526ae7782f29e86a":"Dragon Quest Monsters - Caravan Heart (Japan)","fc7542ef483c03eb22000837c38bfc1d":"Peter Pan - The Motion Picture Event (USA)","fca4c485f41412a4ddc05fbe105c3219":"Sonic Advance (USA) (En,Ja) (Beta)","fca55f7e8017eeb52f7075e29e2353cc":"Leiman IV - Guangming Zhi Lv (Taiwan)","fcab58352e45a97a7becbecc948ea076":"Barbie as The Island Princess (USA)","fcba36d00eb7347a5836f1cfb8b31cc1":"Adventures of Jimmy Neutron Boy Genius vs. Jimmy Negatron, The (Germany)","fcbf93f8859d8500319e0d80a8c02150":"Harvest Moon - More Friends of Mineral Town (USA)","fce3c39e7ba452eddb2279b454b66416":"Pokemon - Versione Rosso Fuoco (Italy)","fce7adb1c33f9a75a03e1c425cb9930d":"Adventures of Jimmy Neutron Boy Genius vs. Jimmy Negatron, The (USA, Europe)","fd1d6711a0cca4c15a627183aec0a854":"Ojarumaru - Gekkouchou Sanpo de Ojaru (Japan)","fd3690a50be799b40f00bc8989229c07":"Frogger's Adventures 2 - The Lost Wand (Europe) (En,Fr,De,Es,It)","fd80c3ad287ca570ce26c425237d1902":"Megaman - Battle Network (Europe) (Virtual Console)","fd844c83c46c99046204678f60646302":"Pinball of the Dead, The (Japan)","fda461b129b3630e13a9173a4ed5fd88":"Famille Delajungle, La - Le Film (France)","fdbd4e62e01ba4a570188b201427d3a4":"Xploder Advance (Europe) (Alt)","fdef312709444d6d901b8b7c619f5913":"Crash of the Titans (USA) (En,Fr)","fe1693b0d503ff222ebc090ac3dab920":"Inukko Club (Japan)","fe1bd7d414d0a710ef17d38cec1a76cc":"Super Black Bass Advance (Europe)","fe2003b76cded94a19bc69fc44bfd525":"Lord of the Rings, The - The Fellowship of the Ring (USA) (Rev 1)","fe2f3e4d3b15c8776c45fd7ef060df89":"2 Games in 1 - Finding Nemo + The Incredibles (Europe) (Fr,Nl)","fe30fdc4357f7d459e9902bf15241f84":"Kawa no Nushi Tsuri 3 & 4 (Japan) (Virtual Console)","fe3d96f30e5d72c969606cc957b581c0":"Sylvanian Families - Yousei no Stick to Fushigi no Ki - Marron-inu no Onnanoko (Japan)","fe475f28da72f4141803847df8ec786f":"Skyland (World) (Proto 6)","fe6048dabf155f1001a198309e34798d":"Dark Empire (Japan) (Proto)","fe73df04a447bcb43c10a03b275a8426":"Happy Feet (Europe) (En,Fr,De,Es,It)","fe8aac1a517af3ea89fd680536962ddf":"Noddy - A Day in Toyland (USA) (En,Fr,Es)","fe8f2d7b6b58cb78ca51f8bceaa0f254":"Kien (USA) (Proto)","fedf94e93a79d35f70ea85a78fdee5aa":"Sky Dancers - They Magically Fly! (USA)","feec220b3324ec3bf48a6902a83b7206":"Fire Pro Wrestling A (Japan)","feec4136348094034b648677ea0b82ab":"Tactics Ogre Gaiden - The Knight of Lodis (Japan)","ff25067b591ba324cd44689a9ba8aa48":"Pocket Monsters - FireRed (Japan) (Rev 1)","ff36188d91f68626d9d8b9dd9b3571e7":"Urbz, The - Sims in the City (Japan)","ff50e8973adf12604ca70e15acb108db":"Jet Grind Radio (USA)","ff65d0c1dfba11ee40adec6aaba89e06":"Hamtaro - Rainbow Rescue (USA) (Proto)","ff6b0c48065389b888c7a78731d4b58d":"Super Mario Advance (USA, Europe)","ff75c62ab690410cc8fca24204d783e9":"Boktai - The Sun Is in Your Hand (USA)","ff81ee924f0b66ca6e1743c056ea0782":"Around the World in 80 Days (USA)","ff99de23c20d8b8136e3afca53734e87":"Kid Paddle (Europe) (Fr,Nl)","ffa7898ee8b3bc98e4156f3b5e7cdf63":"Yu Yu Hakusho - Ghostfiles - Spirit Detective (USA)","ffa917f29cb9b3c0b9d2594b7608beac":"Wario Land Advance - Youki no Otakara (Japan) (Virtual Console)","ffb9c2fe3dc23fd7796f71f7d54fe447":"Mario Kart Advance (Japan) (Virtual Console)","ffc475b949a5938eef2890751c0fc6f8":"Gu Huo Lang 4 (Taiwan)","fffe680eff483b4d4366964eb7a150d8":"Batman - Vengeance (Europe) (En,Fr,De,Es,It,Nl)"}
\ No newline at end of file
diff --git a/lib/gemba/data/gbc_md5.json b/lib/gemba/data/gbc_md5.json
new file mode 100644
index 0000000..7eca633
--- /dev/null
+++ b/lib/gemba/data/gbc_md5.json
@@ -0,0 +1 @@
+{"001fc1b6cfae773f2d24219409bdcb19":"23 in 1 (Taiwan)","002d0d5fd2f668798da1991b5fd5b4d8":"Earthworm Jim - Menace 2 the Galaxy (USA, Europe) (GB Compatible)","0044c80fb6c6c7c49466dafe6637d61a":"Zidane - Football Generation (Europe) (En,Fr,De,Es,It)","008ede5b89c08375fe58d6597a15a21a":"Hang Time Basketball (Europe)","008f5a6eb8cbbe7a76ea9403ad063d67":"RPG Tsukuru GB (Japan) (Rev 1) (Possible Proto) (NP)","00ca1749b004d4c38cdfc884bd547f72":"Barcode Taisen Bardigun (Japan) (SGB Enhanced) (GB Compatible)","00cdb5c6a13d6992737b03332567dca5":"Featherless Cake Delivery (World) (v1.0) (GB Compatible)","0107666c622e3bf3e225ecc6fe4fee42":"Kelly Club (USA)","010ae3b36a642d13ee85fcc5494a132b":"Retro Quiz Tower (World) (GB Compatible)","0121aa4c2909ff7dff2190b7889956fd":"Hello Kitty no Happy House (Japan)","0132a38451021c3c9e8f5532fc888343":"Donkey Kong 5 - The Journey of Over Time and Space (Taiwan) (En)","0143dbb62b1a88e7cce65f9779ce9d4b":"Jeremy McGrath Supercross 2000 (USA, Europe)","0146768d48b8317e0c8a2c7dd8d31860":"Sanrio Timenet - Kako Hen (Japan) (SGB Enhanced) (GB Compatible)","0155bb1d60a477eeeb148033210eecf3":"Freestyle Scooter (Europe)","01586c8122da5014abed765147e5a7bb":"Worms Armageddon (Europe) (Beta)","0162a11fac3e65f15b9dd47be81c62f7":"Grimace's Birthday (World) (v1.1)","017cde0db5d27525af84123f1ce81edf":"Metamode (Japan)","0185d5e6048a74e9b77a26e02cb56307":"Spy vs Spy (Europe) (En,Fr,De,Es,It,Nl,Sv) (Rev 1) (Proto)","01a67ed2dc935044ba69eda42bddebf3":"Toy Story Racer (USA, Europe)","01d41f5d875089155e4dc489ae12f095":"Rockman DX6 (Taiwan)","01e5a7a8a115c7e88b39de91b0ed9928":"Quartet (World) (GB Compatible)","01fb7107b8432d3eed3e131605d682a3":"Doug - La Grande Aventure (France)","023b5dbe9c3dcb3bc11ab388e8a40fe3":"Sesame Street - Elmo's 123s (Europe) (GB Compatible)","0256340ec50afb921f07763ea4628966":"Dragon Ball Z - Legendaere Superkaempfer (Germany) (Beta 2)","028c4262dbb49f4fc462a6eb3e514d72":"Shantae (USA)","02ace5228e56b419ee31b8202179e868":"Shantae (World) (Switch)","02f25d1192d129ee73104c5bfc127a94":"Carmageddon TDR 2000 (Europe) (En,Fr,De,Es,It) (Proto)","03286ff23be2127e0b5e111001a369c2":"GB-Wordyl (World) (Es) (GB Compatible)","033dade2cc761d6f360daeecff9d6f90":"Prince Naseem Boxing (Europe) (En,Fr,De)","0348787d4432c969b4af0129682468ba":"Shenghuo Jiangmo Lu Waizhuan - Guang Yu An De Lunhui (Taiwan)","036b4944895082f5895a475f4ced3bfb":"Yu-Gi-Oh! - Dark Duel Stories (Europe)","037034765c049438b82b30bc1a551165":"John Romero's Daikatana (Europe) (Fr,De,Es)","03a8bcab4b2975fa2d850d18c728ea9c":"Croc 2 (USA, Europe)","03da498c5503d8747dc1eccf1101fce3":"Pocket Soccer (Europe) (En,Fr,De,Es,It,Pt)","03e6a11b8040b4d56b3c1402c92bbf6d":"Othello Millennium (Japan) (GB Compatible)","04122c3d11609d98db1db1fd386da7c8":"Digital Monster 2001 (Taiwan) (En)","041b8a455b63beb718d70c8f89fac9d3":"Gold and Glory - The Road to El Dorado (Europe) (En,Fr,De,Es,It,Nl)","0452cb3853113dca202e5dca225b80ee":"Tower of Evil (World)","0454b25266d645990b63b5b406672dc2":"Tony Hawk's Pro Skater 2 (USA, Europe)","046af13647ed4777510aa86fcb753bf9":"Caterpillar Construction Zone (USA, Europe) (GB Compatible)","0476c7220327d99e3d039faaa4cdde8f":"Lemmings & Oh No! More Lemmings (USA)","049da443c6bd96a0365cbc68b7d0e2eb":"Cardcaptor Sakura - Itsumo Sakura-chan to Issho (Japan) (GB Compatible)","04f7ea139fef2bc2e3f70b2c23933d2e":"Keitai Denjuu Telefang - Power Version (Japan) (GB Compatible)","05093e5f050b812939972afce4e2e3fb":"Paku Paku GB (World) (GB Compatible)","052cd45a69af16f025a545b29bc8f450":"Legend of the River King 2 (Europe) (SGB Enhanced) (GB Compatible)","053d55b23c41c5e0e3227239f4844fea":"Soul Getter - Houkago Bouken RPG (Japan) (GB Compatible)","0548e7732bf23a56f8a2e942dd0c14d2":"Fellowship of the Rings (China) (En)","054921b29a0a336eb1b28272c8125186":"Downer (World) (GB Compatible)","0552078f981c2ef3977f2dfeee19510a":"Croc (USA, Europe)","0591d5637b4c9f304340d941b2ae9e7a":"Fairy Kitty no Kaiun Jiten - Yousei no Kuni no Uranai Shugyou (Japan) (SGB Enhanced) (GB Compatible)","05a9c516d6e744135a6303aa5b4a8887":"Grand Theft Auto 2 (USA)","05aba5a3251588398c1ced7f87a61270":"Shuma Baolong 02 4 (Taiwan)","05e5ecc94ef05260ebba60576ca45ba0":"Dragon Ball Z Gedou 2005 (Taiwan)","0612746dccbd1d01c0e095767a9c5a89":"Harry Potter 2 - The Black Art Wrestle Edition (USA)","06157785417d6fe5c73388eb573981dc":"Hamtaro - Ham-Hams Unite! (Europe) (En,Fr,De,Es,It)","062bfa5e5b52b5a4ace5b59c364fe2ff":"Space-Net - Cosmo Blue (Japan)","06445da47ed612c8f7fc8911c673f7fe":"Jurassic Boy 2 (Taiwan) (En) (Rev 1) (Sachen)","064f9dc3a19e5b6e41f646943254674e":"J.League Excite Stage GB (Japan)","0650cbe5e04f8968d5c09740af7aa152":"M&M's Minis Madness (Germany)","06545852ed3f3cd018c95f6d3c5fbbee":"Biohazard Gaiden (Japan)","069b01643e876ec91a5555450068f4ac":"Rugrats - Time Travelers (USA, Europe) (GB Compatible)","06b0d6b88e54337f3f5c7bbea373f237":"Frogger 2 (USA)","071ad15a9890f73890c4e0dedd07793e":"Madden NFL 2000 (USA, Europe) (SGB Enhanced) (GB Compatible)","0762fc989c52652b2660f26be0830f20":"Hugo - Black Diamond Fever (Europe) (En,Fr,De,Es,It,Nl,Pt,Sv,No,Da,Fi)","077fb84e685b20d693a637593a77b8c8":"Octopus Stressus (World) (v1.1) (GB Compatible)","07876bd62abbe5fd8878a0363e23a42f":"Deja Vu I & II (Japan)","078c1192e19c1332171d088dcb891293":"Loppi Puzzle Magazine - Kangaeru Puzzle Dai-2-gou (Japan) (Rev 1) (SGB Enhanced, GB Compatible) (NP)","079f899abd4d5183d494629b7b98b0cb":"Suicide Run (World) (GB Compatible)","07b3756a52db31f1accc85f71d5f34c7":"Disco Elysium - Game Boy Edition (World) (No Music) (GB Compatible)","07c211479386825042efb4ad31bb525f":"Legend of Zelda, The - Link's Awakening DX (USA, Europe) (SGB Enhanced) (GB Compatible)","07d4df7a1c93f5bef617e5a90b9edee2":"Survival Kids (USA) (SGB Enhanced) (GB Compatible)","07de70bd0e839dd1d4be2670b2e1d33f":"GB Harobots (Japan)","0806cf988e52811c08af25adca520bb5":"Unearthed Zero (World) (2021 Jam Version) (GB Compatible)","080f8f6632c57101bf511360fc68eb15":"Shuma Baolong - Shuijing Ban II (Taiwan)","08130cb33fe270321d04d056b85d2037":"Sylvanian Melodies - Mori no Nakama to Odori Masho! (Japan) (SGB Enhanced) (GB Compatible)","08261d984f5e0d103191d7bbae8fba50":"Hamster Club (Japan) (GB Compatible)","08333f9e3d797fa8c9cee8a1526e8690":"WDL - World Destruction League - Thunder Tanks (USA) (Beta)","0834c2990995cbd2c76db538ff93c5ba":"Jurassic Boy 2 + Thunder Blast Man (Taiwan) (En) (1B-002, 1B-003, Sachen)","08405276b33bc1b679b05296a2f7c44d":"Tiny Grasshopper Goes Away (World) (En,Hu) (v1.4) (GB Compatible)","08680aedc945591f81461c1bf459124e":"Shanghai Pocket (Europe) (SGB Enhanced) (GB Compatible)","086dd0976154b38cf76c8f596ce00f0c":"Lunar Docking (World)","0877a4b1765287c5b50ea53a47a1d7ad":"Bugs Bunny in - Crazy Castle 4 (USA)","08855304ddb6b3ba9ac65401ef829746":"Pocket Smash Out (Europe)","08b3d438bb90b4f3bc16a93d30c1351c":"Emo Cheng DX (Taiwan)","08bca718c62e3c2870a2df107fc0a562":"Dragon Quest Monsters (Germany) (SGB Enhanced) (GB Compatible)","09232e1c83dde06aa5b67d14618f4e08":"Kawa no Nushi Tsuri 4 (Japan) (Rev 1) (Possible Proto) (Rumble Version) (SGB Enhanced, GB Compatible) (NP)","093e3b0eb0723fd652cfe08a0a61a1c4":"Digimon Pocket (Taiwan) (Zh)","09419d9aba3b31d36c09d08d2c1555f8":"Nations, The - Land of Legends (Europe) (En,De)","0979556c11f2ee65a8d9a03b4a1c04d7":"Elevator Action EX (Japan)","09a76ffd0b430767ffe97e1ebd3a55aa":"Haizhan Qibing (Taiwan)","09aac34623fe99c7068192c9e24858aa":"Shantae (World) (GBA Enhanced) (Switch)","09bc56a467f95a19a357174c5710db74":"Unearthed (World) (v1.3) (GB Compatible)","09c21d37f66cca587663a461c81606be":"F-1 World Grand Prix (Europe) (Beta)","09cefdbbb38503e91dd666aeca68871a":"Zelda no Densetsu - Yume o Miru Shima DX (Japan) (Rev 2) (Beta) (SGB Enhanced)","09f75cc7dc00a7ae8ae4b586092fe045":"Gensou Maden Saiyuuki - Sabaku no Shijin (Japan)","09fbebc41df99d534290d3033b09814e":"V-Rally - Championship Edition (Japan)","0a1cf1904c87b60308c404d93bab2702":"Top Gear Rally 2 (Europe)","0a281a2c97b4fe140766fd06d1a2b79d":"Grimace's Birthday (World)","0a3da06446d9a2c7e1ea8149c9026434":"Pong - The Next Level (USA, Europe)","0a60eb6a91c63d2991822d4ecc330b77":"Ghost of the Arcade (World) (v1.3) (GB Compatible)","0a67db463824f26a29e6fa130cd62ccc":"Survival Kids 2 - Dasshutsu!! Futago-jima! (Japan) (Rev 1) (Possible Proto) (SGB Enhanced, GB Compatible) (NP)","0a74ef0fa7d01b8bc4e2042aa442be37":"Mingzhu Koudai Guaishou 2 (Taiwan)","0aa1877a6a6dd4c8230fabada9ea9249":"Pachipachi Pachisurou - New Pulsar Hen (Japan) (SGB Enhanced) (GB Compatible)","0af54be680b772a9ffc3afea54a1540c":"Laofuzi Chuanqi (Taiwan)","0b23d35e7bf1f136df8a7c8f24103dfc":"All-Star Baseball 2000 (USA, Europe)","0b2ab6c8ee77d7dc6856ebffcfeb9c43":"Armorines - Project S.W.A.R.M. (USA, Europe) (En,De)","0b943efdf2ca967827a4c7bf951f6448":"Dracula - Crazy Vampire (USA)","0bb519a09c675a797f422305115b49cc":"What's Updog (World) (GB Compatible)","0bca44a4fd79e417b14043985ed35223":"Koudai Guaishou - Dongzuo Pian (Taiwan) (En)","0bfac235a5bd9cd57d7b3e7e83993458":"M&M's Minis Madness (Europe)","0c0cd721044c7c91d32ed704564e6fe4":"Legend of Zelda, The - Link's Awakening DX (USA, Europe) (Rev 2) (Beta) (SGB Enhanced) (GB Compatible)","0c1c350ce431ace4328c0e935fa2f41b":"Snow White and the Seven Dwarfs (USA)","0c20aaf67ec47d173d7442370cc24237":"Love is Dead (World) (Proto) (GB Compatible)","0c648f3fa64646119cc811916f7e89cf":"Stars of Zureon (World) (Proto 2) (GB Compatible)","0c661268d0b50d287658ed4d3693185b":"2002 Digimon Adventure 6 (Taiwan) (En)","0c6a0f2add131ca4afd24763fe3c3a04":"Dragon Dance (USA) (SGB Enhanced) (GB Compatible)","0c80cbbae8650152fba0278350bd0bd4":"European Super League (Europe) (En,Fr,De,Es,It)","0ccc5cd15a646417efb5fa9ea920fce3":"Harley-Davidson Motor Cycles - Race Across America (USA)","0cd10acb3c569faecd01b9ced51021b2":"Maus, Die - Verrueckte Olympiade (Germany)","0d235e7826dbe74294a02ba07af1d6b1":"Infall (World)","0d3ff80b66de9c5d6ba7178c1175f3eb":"Grimace's Birthday (World) (v1.2)","0d4f6b00b4a1b047ef13a91537f7314a":"Barbie - Ocean Discovery (United Kingdom) (GB Compatible)","0d7bca4e08d522493491484896f7f3cc":"Towers - Lord Baniff's Deceit (USA, Europe)","0d8cd9b749af9f5e8463cf3f48b36090":"Hype - The Time Quest (Brazil) (En)","0d9dbb213db66cc0121a7f916181f612":"Madden NFL 2001 (USA)","0db5276e6a52112bcb71dd20f4f39782":"Konchuu Hakase 2 (Japan) (SGB Enhanced) (GB Compatible)","0dbdfc5a0537761525295054816b8e49":"Zork + Harris (World) (v0.0.1.0) (Proto)","0ddb1e2111a510557484f942ac78b915":"102 Dalmatiens a la Rescousse, Les (France)","0dea429ba947a0264b481eafc180d3d2":"Shuma Baolong Zhuanji 10 in 1 (Taiwan)","0df21ba45a2c6edfab393ef5f22c95fe":"Flooder (World)","0e11915bab69cc3b5aaa3473784f03ee":"VIP (Europe) (En,Fr,De,Es,It)","0e13c1506562050ab39bc7d0fcd41ecf":"LEGO Racers (Europe) (En,Fr,De,Es,It,Nl,Pt,Sv,No,Da)","0e31b2dcde31c590a0835b22f653fd2d":"Scrabble (Europe)","0e63965664df3bf3217254a22422cc86":"Densha de Go! (Japan)","0e68060f26f64257bcae0b1e820e5e4e":"Zelda no Densetsu - Yume o Miru Shima DX (Japan) (Rev 2) (Beta) (SGB Enhanced) (GB Compatible)","0e96876b9e69f491b4e9c2e17c56b64f":"Water Grandprix (World)","0eb0f4252ff90cb26eda0be680c998bc":"Ronaldo V-Football (Europe) (En,Fr,De,Es,It,Nl,Pt) (GB Compatible)","0ed5b9ffe7ad90d819cac810d05b669c":"Alice in Wonderland (USA, Australia)","0ed716a57524307533df8568aeae8f7f":"Agency (World)","0ee28078d6270df663647e8a3e3feaf6":"Pocket GT (Japan)","0f3161b9427b5540ff20f0d793a5d047":"Gift (Europe) (Rev 1) (Proto)","0fc64c4aee8aa7a11ed80c4e93f63f47":"Shelly Club (Europe) (En,Fr,De,Es,It)","0fe226f5b7a3da7d3f16b0ba42030b52":"Tank Attack (World)","0ff2e1d40bb0405e6a2506f75c90ea83":"Shin Megami Tensei Devil Children - Kuro no Sho (Japan) (Rev 1) (SGB Enhanced) (GB Compatible)","0ff9df46aca45161d1dfa7eee8509c1f":"Harvest Moon 3 GBC (USA)","1020159b01e4ca5bdc8f24d936b50c93":"Spiky Harold (World)","102a290e0711214484555de2176e565c":"Street Hero (Taiwan) (En) (1B-004, EB-004, Sachen)","1043fd167d0ed9c4094e3c9d8e757f1e":"Legend of Zelda, The - Link's Awakening DX (France) (SGB Enhanced) (GB Compatible)","10d0c091687c830645aad567d152b1d6":"Wacky Painter (World)","10e6dcd0a350076e28b9c598c278b6a2":"Pop'n Music GB (Japan)","10f2d0b87916ac5730065cfb52f3ffce":"PaZeek (USA) (Proto)","10f986c4dfa323b42125ccbb8ec9c8ba":"Nyghtmare - The Ninth King (World) (Rev 1) (Free Version)","1134862e84110443190df460351d4575":"Pokemon Card GB 2 - GR Dan Sanjou! (Japan)","11454ce5a4ad703c29b3a8bdc8b5c3ab":"Mission - Impossible (USA) (En,Fr,Es)","1163e25d9985d8e5c3544449150f4f46":"Zelda no Densetsu - Yume o Miru Shima DX (Japan) (Beta) (GB Compatible) (Alt)","117a9babae15960dc4de04ac44066ed2":"Scooby-Doo! - Classic Creep Capers (USA, Europe)","11893f422bcfe26e22889a0fcdf61547":"Medarot 5 - Susutake Mura no Tenkousei - Kuwagata (Japan)","11d3ca80ad24431babbec7a675d83bed":"Deer Hunter (USA)","1215ac977a4cea023bd98cbb7bd36591":"Mr. Angry (World)","121cec82c0c9e7c476060ad2521739d4":"Harvest Moon 2 GBC (Germany) (SGB Enhanced) (GB Compatible)","128dc75244ecc2f74d1e50551d888127":"FIFA 2000 (USA, Europe) (SGB Enhanced) (GB Compatible)","12d8b6827053a17b8301efeb1586c83f":"Jimmy White's Cueball (USA) (Proto)","12da69d04e8121535565f725adcb6848":"Digimon Amethyst (USA)","12e82cb028ed40cdc0c80b2d2e3cf0cb":"Animorphs (USA)","12f80e19c03b5530545929d50fca8d8f":"Qilongzhu Z3 (Taiwan)","12fe2ee088f622e090cb9c528fe0ec49":"Shuma Baolong 02 5 (Taiwan)","132ab194cd0332a61f3db66084f6dc4e":"Zelda no Densetsu - Yume o Miru Shima DX (Japan) (Rev 2) (Beta) (SGB Enhanced) (Alt)","137590affd2da2f275b87b412d6f0c7d":"Cave Fighter (World)","1383da42b08bf94b6fad381cada66fad":"Rugrats Movie, The (USA) (SGB Enhanced) (GB Compatible)","138add8906346eaf244e8e7ed79ec42a":"LNF Stars 2001 (France)","138ee068183a17684ca3aacfc1e3e38e":"Honkaku Shougi - Shougi Ou (Japan) (SGB Enhanced) (GB Compatible)","139334587db40e73f0cadcb06ca0ce61":"Goraku Ou Tango! (Japan) (GB Compatible)","13a64aee80ad9a5b65eb5774e6aeabed":"Deisanebe (World) (GB Compatible)","13b960d82856078a62f012fa3183697e":"Zone Control (World)","1405c2c436255d0d5c901bf6d64f68a1":"Yars' Revenge (USA, Europe) (GB Compatible)","14158554a3d0743a668cd56070bc1ef9":"Berks (World)","14198133e23ad092960197223f199b43":"Shuma Baolong 3 (China)","144ab8295663f4dc4bcd810c5cdafe60":"NASCAR Racers (USA)","144f958f655909c047331473275fd525":"Robo Knight (World)","144fc4636fcefbd56d906505f5308da1":"Spirou - The Robot Invasion (Europe) (En,Fr,De,Es,It,Nl,Da)","1453eaee1c4c0197b2feed653e5ff342":"Casper (USA) (Rev 1) (Proto)","145a22d327cc23d0c7f85c62fc46de77":"Jissen ni Yakudatsu Tsumego (Japan) (Possible Proto)","146bc8912c207c200535b84c5acfb06a":"Babe and Friends (Europe) (En,Fr,De,Es,It) (GB Compatible)","1473fa5d4a50760dbdb45cc1232c8b4b":"Tarzan (Japan)","1487948f044a16e9ac9d8aa740f87827":"Purple Turtles (World)","14889eccdacd80ce70fc88a74a216fa6":"Heroes of Might and Magic (USA) (En,Fr,De) (Rev 1) (Proto)","149073afd1cf8ae83783143a166592f7":"Godzilla - The Series (Europe) (En,Fr,De) (GB Compatible)","14bb0a822dfea564358a99378186141f":"Sewing Machine Operation Software (Europe) (En,Fr,De,It) (GB Compatible)","14bfce85af0ae19affbdcef23a9d6baf":"NBA Jam 2001 (USA, Europe)","158691457cb7365cafbd0b7bb230fadf":"Shin Megami Tensei Devil Children - Kuro no Sho (Japan) (SGB Enhanced) (GB Compatible)","158d9834bdb7be79dbfcafcdc3d347aa":"Lord of the Rings, The - The Fellowship of the Ring (Taiwan) (En)","15b3cbe9a6ffd5b7c5047764798ea911":"Reservoir Rat (Europe) (En,Fr,De,Es,It) (GB Compatible)","15bedc4919965732cbfb301f11e5b36a":"Doraemon no Quiz Boy 2 (Japan)","15f4df0efe9f42cbaaac09c866cbfd21":"Hello Kitty to Dear Daniel no Dream Adventure (Japan)","161d839487a5b618c50eeb95b839ac8c":"Postman Pat's Trail Game (World)","1624f857098ca278b15629914f48352b":"Magi Nation (USA)","1625b54bab62ff4d7f6878e76c5d09c7":"Capybara Quest (World) (v1.2) (GB Compatible)","1633bec4cabec857c0ec67c99d2f982b":"Pokemon Card GB (Japan) (SGB Enhanced) (GB Compatible)","16345f768a34b18b8c072c71bc32e2fa":"Pocket no Naka no Oukoku (Japan) (Proto)","163859b2468b5ad697236ffb5a6765be":"Denki Blocks! (USA) (En,Es) (Proto)","1639e77b02227d996f17ff5bec16c1b8":"Honkaku Yonin Uchi Mahjong - Mahjong Ou (Japan) (SGB Enhanced) (GB Compatible)","163f99c456c8fd8936e91586356af1c4":"From Below Pocket (World)","164c4fcfe733d89fff3ddc42b017c5ca":"Looney Tunes Collector - Alert! (USA) (En,Fr,Es)","165550e557314f88decd95a7409a24ce":"Le Mans 24 Hours (Europe) (En,Fr,De,Es,It)","167e663a1ce00e6a510dd8257fa36a48":"Hyper Olympic - Winter 2000 (Japan)","168ae412b379786f7df07bd8231baf44":"Mortal Kombat 4 (USA, Europe) (SGB Enhanced) (GB Compatible)","16bb3fb83e8cbbf2c4c510b9f50cf4ee":"Wario Land 3 (World) (En,Ja)","17138240c26791c06d557094d0a4d1f5":"Pro Mahjong Tsuwamono GB (Japan) (SGB Enhanced) (GB Compatible)","171ccc606b9753de51e50c93f7c3a986":"Tir Na Nog (World)","17233eaf718e241f290d6590ef1b42a9":"Lil' Monster (USA) (SGB Enhanced) (GB Compatible)","173a37c4d4aae04766aa0abbf385233d":"Jungle Book, The - Mowgli's Wild Adventure (Europe) (En,Fr,De,Es,It)","1757723cf346be2cea58d0fc4ed4cfa9":"Bomberman Max - Red Challenger (USA)","1767860f9fc19eb7da610616c1a35b89":"Guruguru Garakutas (Japan) (SGB Enhanced) (GB Compatible)","178ea5a9eba6e7f35e894bad1ec34f77":"Return of the Ninja (USA)","17b6ec4af44d74be1a29b2ff2c0516dc":"Mojie Zhanshi Chuanshuo (Taiwan)","17dae7ec46263600c54687d78b582e5e":"Galaga - Destination Earth (USA)","17efe835f748353dfeb4b76737b1aaeb":"Inscryption (World) (v0.5)","184f5d0fbb190ae2d7242e0a7ec4a407":"Maya the Bee & Her Friends (Europe) (En,Fr,De) (GB Compatible)","18584e6b6f2e8a2cedf9ead60f51ad27":"Xin Guangming Yu Hei'an 2 - Zhushen de Yichan (Taiwan)","187e24e1a76eede2853755760dee5108":"GB-Memory Multi Menu (Japan) (SGB Enhanced, GB Compatible) (NP)","18b2c4989209373c0cba9bc58075b2fd":"Ganbare Goemon - Tengutou no Gyakushuu (Japan) (GB Compatible)","18c5ddde4bcffd1ddcba490eb529f0d7":"Hugo - The Evil Mirror (Europe) (En,Fr,De,Es,It,Nl,Pt,Sv,No,Da,Fi)","18d309e72aba521f792249f8ca0df5da":"F1 Championship Season 2000 (Brazil) (En,Fr,De,Es,It)","18e83737127010b90aa8ea4d3982b461":"Prince of Persia (Japan) (En,Ja) (Proto) (GB Compatible)","18eca52a51880410614cfc4ad65ee34c":"Hamster Paradise 3 (Japan)","1913a2173775a0c799683c74a80cdebb":"Where's My Cake (World) (GB Compatible)","192aec8dca7656463be56991f497cff3":"Dracula - Crazy Vampire (Europe) (En,Fr,De,Es,It)","193f103b57f5861b55524644badb4ecd":"Dukes of Hazzard, The - Racing for Home (USA)","195b6daf6b2a3e28ab7a61170a7d7833":"Zelda no Densetsu - Yume o Miru Shima DX (Japan) (Rev 2) (Beta) (SGB Enhanced)","19601e4fc1f7084076128dca0182f5a7":"San Francisco Rush 2049 (USA, Europe)","196ce465a2e60ebfa68f377577e6b4aa":"Disco Elysium - Game Boy Edition (World) (Music) (GB Compatible)","197ab41791e0e0112ade85ed9fdbdef3":"Postie (World) (GB Compatible)","19b1085c7c17a8123a7ec59f4033e92c":"Yu-Gi-Oh! Duel Monsters 4 - Battle of Great Duelist - Kaiba Deck (Japan)","19b640026da40602272559d1ed35bbba":"Bob the Builder - Fix it Fun! (Europe) (En,Fr,De,Es,Nl)","19cd9d45c6bb221613101b22c72593b2":"Batman of the Future - Return of the Joker (Europe) (En,Fr,De)","19de85b3b8aabc3cbde67e20c7ae2925":"Princess Poffin and the Spider Invasion! (World) (GB Compatible)","19dfb14a0d31742f02bfa101d5054169":"Gekisou Dangun Racer - Onsoku Buster Dangun Dan (Japan)","19e0d71a2a6090e0f59607ca4da9b156":"Doug's Big Game (USA)","19fb34b63e864a72e26073f8e7e7ed01":"Mr. Driller (Japan) (NP)","1a0aac7a746e247879d6b970bf9a9f32":"Kikansha Thomas - Sodor-tou no Nakama-tachi (Japan)","1a787c328c66eea5a2b920b7c205b231":"Laura (Europe) (En,Fr,De,Es,It,Nl,Sv,Da)","1a9cb5a60485e19b809c2f476eff190b":"Octopus Stressus (World) (GB Compatible)","1abb25d01dbeb20f104e44364f56fe03":"Pocket Monsters Gin (Japan) (SGB Enhanced) (GB Compatible)","1af296894ba86bfe2f51e2ff7cac9fc7":"Yu-Gi-Oh! - Dark Duel Stories (Europe) (Beta)","1b2190911db606dce58d694e8b591e69":"Austin Powers - Welcome to My Underground Lair! (USA)","1b3092e1bbc29223eaaa4ea09066bdbd":"Runelords (USA) (Proto)","1b543c5d0263730a3b862a02bb46f9a1":"NBA Jam 99 (USA, Europe) (GB Compatible)","1b5e155ac68d2c7b89e49c5e1024b45c":"Trouballs (USA)","1b761f9ef23eb90d34085dd5eca02386":"Flashin' (World) (v3.0) (GB Compatible)","1b8671a31a0c30a62eef62ddb4bf915f":"Snail DX, The (World) (GB Compatible)","1b9515262a8a57ef1366bed635c604e4":"Gorf the Ghost Saves Halloween (World) (GB Compatible)","1ba7a470a32664d5f68f4310680d8426":"Tweenies - Doodles' Bones (Europe) (En,De,Es,It)","1bf7c941e9d9fb2d34b51e142f3db5e4":"Gifty (Germany) (En) (Rev 1) (Proto)","1c146ce4743c94923843f6aa07a15a47":"Turok 2 - Seeds of Evil (USA, Europe) (En,Fr,De,Es) (Beta) (GB Compatible)","1c1f455209d6400eb3c7c091f6608723":"Hamster Paradise 4 (Japan)","1c2cb80c83747edf5988b1b0c782ecf0":"Snail DX, The (World) (v1.2) (GB Compatible)","1c3d719f529c1bf57b5b798fc1f3bfe5":"Qix Adventure (Japan)","1c7355ed58daf1ebcceea71ba5cbb694":"Game Boy Gallery 3 (Japan) (SGB Enhanced) (GB Compatible)","1c9f1847ae4832bdd53f39968750d505":"Harvest Moon GB (Germany) (SGB Enhanced) (GB Compatible)","1ca6579359f21d8e27b446f865bf6b83":"Dragon Warrior Monsters (USA, Europe) (SGB Enhanced) (GB Compatible)","1ccfd8413570d63a3ed3fa9910a394b4":"Fushigi no Dungeon - Fuurai no Shiren GB 2 - Sabaku no Majou (Japan) (BFWJ)","1cdc49e8f8340c2ce27fd3f5cdd3d618":"Austin Powers - Oh, Behave! (Europe) (En,Fr,De,Es,It)","1cfa8223f124f56cca9c8bc2c661a21d":"Bundesliga Stars 2001 (Germany)","1d0044523075ab0308c598286f804402":"Nicktoons Racing (USA)","1d09181e1608bb4cbb77c127d27feb19":"GB-Wordyl (World) (En) (GB Compatible)","1d0dc8faa066d6f4948ce6ffdee22f41":"Dragon Ball Z - Legendary Super Warriors (Europe) (Beta) (All Unlocked)","1d0ea47375fca723c0f86a5178e545f3":"LEGO Island 2 - The Brickster's Revenge (USA) (En,Fr,Es)","1d2166a2a98aee87882cc8d670f23a23":"AMF Bowling (USA) (Proto)","1d3031ff4a17adc04f05672a37fc0030":"Magical Drop (Europe) (En,Fr,De) (Beta)","1d31fa1e431ec840e5f769fdd019405f":"Looney Tunes - Twouble! (USA) (En,Fr,Es) (GB Compatible)","1d535aac30b714e3ad5eccf17025ece2":"Doki x Doki Sasete!! (Japan)","1d719dffbdeff72d4b8f8744ddcbf9d5":"Little Mermaid II, The - Pinball Frenzy (Japan) (Proto)","1da7187971155f0aed9ffea798f6e2a6":"Flipper & Lopaka (Europe) (En,Fr,De,Es,It,Nl,Pt,Sv,No,Da)","1dddf21bcc96c84a9294bdb411a49728":"Doraemon - Aruke Aruke Labyrinth (Japan) (GB Compatible)","1de0f866b907c8daff2999790ead45a8":"Spider-Man 3 - Movie Version (USA)","1de3aa6275844a8957c88d75dcc5ad09":"Watashi no Restaurant (Japan) (Beta 1)","1e062837d15d5e4e43bb2253207115ae":"Dave Mirra Freestyle BMX (USA, Europe)","1e29b4f3a9899a88fdcaefa73fcb565e":"GB-Wordyl (World) (Es-XL) (GB Compatible)","1e67314232e073b75f092f058078074d":"Hyper Olympic Series - Track & Field GB (Japan) (SGB Enhanced) (GB Compatible)","1e842a5c2f90bf6e476b08da5333963d":"Keibajou e Ikou! Wide (Japan) (GB Compatible)","1e90fa6dab5d51a09f0f6134c96efa08":"Super Doll Licca-chan - Kisekae Daisakusen (Japan)","1ebdce25ed0e2607059d7d09530d4a7e":"Real Pro Yakyuu! - Central League Hen (Japan) (SGB Enhanced) (GB Compatible)","1ee701313c509947d7e9ce0e54a85cb3":"Dragon Quest Monsters - Terry no Wonderland (Japan) (Rev 1) (Possible Proto) (SGB Enhanced) (GB Compatible) (Alt)","1f0e9da07447de982bc0fbc0eb3a5d24":"Doraemon Memories - Nobita no Omoide Daibouken (Japan) (GB Compatible)","1f1fb3cf8783f880bc796d667be60231":"007 - The World Is Not Enough (USA, Europe)","1f3c312776b7010204ca1cf723f084ba":"Capybara Quest (World) (v1.1) (GB Compatible)","1f64989765f605d05cbd013e7ffcc352":"Mega Man Xtreme 2 (USA, Europe)","1f669fbc8f7dd8fee1afee6052a807d4":"Data-Navi Pro Yakyuu 2 (Japan)","1faa6e2a7ec92b95ce32fa2682038b9b":"Asterix - Sur la Trace D'Idefix (Europe) (En,Fr,De,Es,It,Nl)","1fc58f4e3a2437f4c20c9812162797d8":"Missile Command (USA) (Rumble Version)","1fd75c2b798c04acd4b99ad2f1006280":"Super Mario Bros. Deluxe (USA, Europe) (Rev 1)","1fe2a6ec9deeb9b4db56f003fa3c4edb":"Yuenan Zhanyi 3 (Taiwan)","1ff9b71a347a7deed87bcedeb7c5ea70":"Lufia - The Legend Returns (Europe) (En,De)","20052c527795a4f332be14aff49d4d4b":"Smurfs Nightmare, The (USA)","20102abb2a331ff4cc101d3513c891cd":"Kinniku Banzuke GB 2 - Mezase! Muscle Champion (Japan) (SGB Enhanced) (GB Compatible)","2011b57a6d279eed5c9412ef309fb6e2":"Luke Yingxiong Chuan 3 (Taiwan)","2022ae2cb1bbd83edefa3a5bdf2a2b72":"NFL Blitz (USA, Europe) (GB Compatible)","20291bd45093d28b32358527eb9611c5":"Pachinko CR Mouretsu Genshijin T (Japan) (GB Compatible)","207fe7e94f56f9ee85f12bbba56774d2":"Snoopy Tennis (Europe) (En,Fr,De,Es,It,Nl) (Beta)","2082a3c919f07c076aa7de6363544536":"Cyborg Kuro-chan - Devil Fukkatsu (Japan)","20a1cba7bc19e9dd5165324de608478d":"Legend of Zelda, The - Link's Awakening DX (USA, Europe) (Rev 2) (Beta) (SGB Enhanced) (GB Compatible)","20b1ed1ae966b173c3a0f7f7f267e408":"Tokimeki Memorial Pocket - Sport Hen - Koutei no Photograph (Japan) (SGB Enhanced) (GB Compatible)","20bcf9a299d0f8de3c36f01c16813162":"Card Sharks (USA) (Proto)","211031be4f99f69bfd8dfacc2b148d7c":"Shinseiki Evangelion - Mahjong Hokan Keikaku (Japan)","215988e7a70cfbd0f45fe5c247ee0c55":"Bob the Builder - Fix it Fun! (USA)","216cb5875de8fc71d04f7378592bf782":"Kaseki Sousei Reborn II - Monster Digger (Japan) (SGB Enhanced) (GB Compatible)","219538abd16cecadee98ab57c7069376":"Ready 2 Rumble Boxing (Europe)","219b2cc64e5a052003015d4bd4c622cd":"Pokemon Trading Card Game (USA, Australia) (SGB Enhanced) (GB Compatible)","21ae960e6c5a42b498b00fa6f635b1e1":"Fort Boyard (Europe) (En,Fr,De,Es,It,Nl,Pt)","21bbb6dceb4a367431779873f6162ced":"Zelda no Densetsu - Yume o Miru Shima DX (Japan) (Beta) (1998-07-05T180056) (GB Compatible)","21c2dd91ae2d46c006c00caca96d2b6b":"Bad Badtz-Maru Robo Battle (Japan)","21d38c37d8e01a27f8635bb9f5f315cd":"Woody Woodpecker Racing (USA)","21d99fb62922e3538c0b11749a7db8e4":"Barbie - Chasse au Tresor Sous-Marine (France) (GB Compatible)","2206b879b38982ed995cdcbc927b7ba2":"Magi-Nation - Keeper's Quest (USA) (Proto)","221a0e464f5f0c3d38494939b1765a24":"720 Degrees (USA, Europe) (GB Compatible)","221d3b96df7d86291b553a7cb4702dec":"Mickey's Racing Adventure (USA, Europe) (En,Fr,De,Es,It)","222aa591b387a4b897b61961ebeb9fdb":"Estpolis Denki - Yomigaeru Densetsu (Japan)","227444a8cc81dc579ba4fb76c9cb8b46":"Dogz (Europe)","2295f4ef94f9b9a21dfc04259ab6d7bf":"Warp Coin Catastrophe, The (World) (v1.1) (GB Compatible)","22afe691095c65f34aeaba3c283b2a9c":"Donkey Kong GB - Dinky Kong & Dixie Kong (Japan)","22d11b8d9670fb9b4ca84368f0f50cee":"Animal Breeder 4 (Japan)","22e12363382896071703644153c720ca":"Android Nim (World)","2348ea9e0c1041610115443165cf8f4f":"TOCA Touring Car Championship (USA, Europe)","23627de756d221f4093812a5e5f42623":"3D Quasars (World)","237662ab7a441de5042f347342c6080b":"Bibi Blocksberg - Im Bann der Hexenkugel (Germany)","2376c643827d665e9883ffd1b5ac5b37":"Battle Fishers (Japan)","2382edc04a323a227ea793e33c749c79":"Original Moorhuhn Jagd, Die (Germany)","2384dde5403894419de9c14648491da8":"Super Bunny Mission (World) (GB Compatible)","23eaa037089df79a1f54aa0604e34146":"Xin Shiqi Shidai (Taiwan)","2400e6b73383221778c0d83eb0a1ebd4":"Trick Boarder (Europe)","2425abdecfa70713b2671299d6a45751":"Razmoket, Les - Voyage dans le Temps (France)","243b2b6151d41d8e111e98ac49ba9ab4":"Sutte Hakkun GB (Japan) (Proto) (SGB Enhanced) (GB Compatible)","244d1a147f0922f2842206a496163a8f":"Don't Forget About Me (World) (v1.2) (GB Compatible)","24590d82da1c0d40b5d4f8e03e4cca94":"Nakayoshi Pet Series 4 - Kawaii Koneko (Japan)","245c759effda3cf83e2caf274c93c8aa":"Bokujou Monogatari 2 GB (Japan) (GB Compatible)","246526c5a9dd42e6bf8d35708ca24ee9":"Little Nicky (USA)","24676139e29d846bfa48df4885382b79":"Adventures in Carnal Hell, The (World) (Ja) (v1.01) (GB Compatible)","248d3000422e0de6c76b46a6314a762a":"Space War (World) (Proto) (GB Compatible)","24cf64cd73a98125fe476b8488054361":"Raku x Raku - Mishin (Japan) (GB Compatible)","2547fcbdd97aa7acc4ad9eff8aa028f0":"Tezhong Budui 2 - Jidi (Taiwan)","2565fdadfb12b92b60b535cec6492041":"NHL 2000 (USA, Europe) (SGB Enhanced) (GB Compatible)","256a0d39a400543b667991e45327d0dd":"Lee Carvallo's Putting Challenge II (World) (v1.0) (GB Compatible)","2582e7e452e897c0017db4f520afc89f":"Mega Memory Card (USA) (GB Compatible)","258b7b8e4692d4204df470487ef2fc3d":"Powerpuff Girls, The - Bad Mojo Jojo (USA)","25ad12b8d2436d520057f12253f2d37d":"Tokimeki Memorial Pocket - Culture Hen - Komorebi no Melody (Japan) (SGB Enhanced) (GB Compatible)","25b8e4d2aa1e09bbd5e68adcad582b84":"GB-Wordyl (World) (It) (GB Compatible)","25bd0ec7f8959a9a29c4af3c7d6fddde":"Kawaii Pet Shop Monogatari 2 (Japan) (GB Compatible)","25f20cdc0f6f70d0bc5430a9b0d48742":"Beatmania GB 2 - Gotcha Mix (Japan) (SGB Enhanced) (GB Compatible)","264d3c43bf615252c32370b5b0613c78":"Grimace's Birthday (World) (v1.7)","26508069768cb23f6fc03a33f8d4cf43":"Uchuujin Tanaka Tarou de - RPG Tsukuru GB 2 (Japan)","2650d134dd6de865c8c8dbf5a5a385a4":"F.A. Premier League Stars 2001, The (Europe)","265de745b9b6c8e84e02acbf80d0428e":"Alice in Wonderland (Europe) (En,Fr,De,Es)","26694d3e30613facaaede614ab278224":"Shuihu Zhuan - Jingdian Ban (Taiwan)","2692494cef091b908b02c9046bdd876c":"Catwoman (USA)","26b03c986238c85bda3ed8954115aa39":"Monster AG, Die (Germany)","26c14f848115af6246b8f514fbeb6dab":"Animastar GB (Japan)","2759a17974aa716d3db2cc015cda3ab4":"Looney Tunes Collector - Martian Alert! (Europe) (En,Fr,De,Es,It,Nl) (Beta 2)","275f5e929448bb3ad89bf8981cc64620":"San Guo Wushang 5 (Taiwan)","27791ff8bb7993ebba8c8f2cf353a6b3":"Dragon Tales - Dragon Adventures (USA)","27881df91cfc52d1671e469f46475d8c":"Puzzle Bobble 4 (Japan) (GB Compatible)","27a104cc72d91dfcf0adfdfb172e6c21":"Koudai Guaishou - Feicui Ban (Taiwan)","27a66754bf8efafdfe3a79cad234ff17":"FGB (USA) (Proto)","27aaeb747ed1e125582729ba82fe8c28":"Pro Pool (USA) (En,Fr,De) (Beta)","27ce588e0569efa0eb0b8e80049e7edb":"Worms Armageddon (World) (Limited Run Games)","282b0d8ada4a2e44846adc732876f7d3":"Astral Possession (World) (GB Compatible)","283f309103b578c04b1fd5fdb903eb50":"King of Fighters R2 (Taiwan)","2864c52d74320121bc8603e61f7dce64":"Jet de Go! - Let's Go by Airliner (Japan)","286b53aa6f97e97a8d2c26801c8b2e91":"Gem Gem Monster (Japan) (SGB Enhanced) (GB Compatible)","28b5114313b8abc43a31ea40aa91cf52":"Soreike! Anpanman - Fushigi na Nikoniko Album (Japan) (SGB Enhanced) (GB Compatible)","28b7a4941e28a3cbf7d4d72c907727a8":"2003 Gu Huo Lang II (Taiwan)","28d6c613fdf608fe241fb3ce183aaae5":"Turok 2 - Seeds of Evil (USA, Europe) (En,Fr,De,Es) (GB Compatible)","28dd8318bd521b42243af4546062ecab":"Barbie - Aventura Submarina (Spain) (GB Compatible)","28ee7dec336a5742a99fd4d7dda0d001":"Chromanoids (World) (v1.0)","2907913cff34c68b9078e12e7d4fcf78":"Cave Hunter (World) (GB Compatible)","296a232c36d6457301fd8ab9d9e35290":"Golf Ou - The King of Golf (Japan) (SGB Enhanced) (GB Compatible)","29888963f3a224d0da5f65d4f32d1bcf":"Digimon 2 (Taiwan) (En)","29c545699436ab55ef3f801d9c4498b0":"Boku no Camp-jou (Japan)","29deff80e9e8d734f77d8590ac5cdce9":"Adventures of the Smurfs, The (Europe) (En,Fr,De,Es,It,Nl)","29f236dd1a64c15a7c1f66110579ccc3":"Hello Kitty's Cube Frenzy (USA) (GB Compatible)","29f2b4c6d1f163f728e79f9c7400e016":"Jay und die Spielzeugdiebe (Germany)","2a147b2d7731ac26a999390c3f5ff2ac":"Dexter's Laboratory - Robot Rampage (USA, Europe)","2a1efef6d25431529b0d2f5063f63a17":"LEGO Island 2 - The Brickster's Revenge (Europe) (En,Fr,De,Es,It,Nl,Pt,Sv,No,Da)","2a26b9d248bf62788e23aa897e8e355c":"Woody Woodpecker (USA)","2a2c1bd906639a49750541fe06489b9e":"Xin Fengkuang A Gei Pao Pao Tang (Taiwan)","2a3a4d83902ee2af1890433c50d2809c":"Carl Lewis Athletics 2000 (Europe) (En,Fr,De,Es,It,Nl) (Beta)","2a447279016f60776b5c0f515b5b97f5":"Force 21 (USA) (En,Fr,De)","2a4f3309fe05b47a98d8c5b4c81b91e5":"Simpsons, The - Night of the Living Treehouse of Horror (USA, Europe)","2a63a02445ba22960be3e23fb36607d4":"Wayfarer Boo - Pushing Through (World) (v1.0)","2a65d5c037463fe93127d45d4145a0a6":"102 Dalmatas - Cachorros Al Rescate (Spain)","2aba33e89caca45c9091b25a276dd4c6":"Austin Powers - Oh, Behave! (USA)","2ac166169354e84d0e2d7cf4cb40b312":"Pokemon - Silver Version (USA, Europe) (SGB Enhanced) (GB Compatible)","2acefe79c9813460f0cc80c45d73d0ff":"Rampart (USA)","2acf3b5fb6a9cf4c8194bbadce34aee7":"X-Men - Wolverine's Rage (Europe)","2ad76236e7ea4f655d7d36f3c504ec5e":"Super Nenas, Las - El Malvado Mojo Jojo (Spain)","2adf26f87be3d5e56261d173e74ec4f5":"Tonka Construction Site (USA) (Beta)","2ae0c6e8f9831d6e8f1abac86b01e7d6":"Heroes of Might and Magic (Europe) (En,Fr,De)","2ae37c8a0c3383d43ccbff9831bef5e3":"Meiji Jingu (World)","2b0ad9175fa23c2e278e2174d08df821":"Towers II - Plight of the Stargazer (USA) (Proto 1)","2b55508c1568411d22520fbed55d85f3":"Ruby & Rusty Save the Crows (World) (Beta 1) (GB Compatible)","2b77458ef761618d869eb1713d567aa4":"Tokoro-san no Setagaya C.C. (Japan) (GB Compatible)","2b7e2442d503ce368fc93a9ebf0f70ef":"102 Dalmatians - Puppies to the Rescue (USA, Europe)","2b8b271eae1f3b2e5b3053b22273fa44":"Grimace's Birthday (World) (v1.3)","2b9550a221d829a96e1688fc177cc5c2":"Mingzhu Koudai Guaishou 3 (Taiwan) (En,Es,Zh)","2bb74ace01cabe5d71dfcc329179b4ae":"Little Magic (Japan)","2bbdceb8fa952ff7f5e716532f0c32af":"Tiledentity (World) (v1.1) (GB Compatible)","2bcdaddb7d3b88d6101a652bf86f8071":"Digimon Adventure 2001 (USA)","2bef878c35f3553772634f1b1f212005":"Pokemon Sapphire (Taiwan) (En)","2c03cc138be009ed83f036f919ff8f0a":"Power Pro Kun Pocket 2 (Japan) (SGB Enhanced) (GB Compatible)","2c1ae21f8e8e3d3e4b83bba084719c59":"Bounced! (Europe) (Proto)","2c56bdce336b543de4653a493b870481":"Extreme Ghostbusters (Europe) (En,Fr,De,Es,It,Pt)","2c74082758017e30990e30b145c2f841":"X-Men - Mutant Wars (USA, Europe)","2c7601475b1a252f461811072f70ba8f":"GB-Wordyl (World) (Fr) (GB Compatible)","2c8f92ea472fb0dba87b45e9e580a84a":"Jagainu-kun (Japan) (GB Compatible)","2ca1d1dd8b0dccfb129d31987ed81e5f":"Nintama Rantarou - Ninjutsu Gakuen ni Nyuugaku Shiyou no Dan (Japan)","2cb6bc70fb6a25e988ba4ebba7f769d8":"Karamuchou wa Oosawagi! - Polinkies to Okashina Nakama-tachi (Japan) (SGB Enhanced) (GB Compatible)","2cbb69bd1cda0e7cc186f94b5e161bfd":"Fishing for Asteroids (World) (v1.1) (GB Compatible)","2ccd7a904115b2a96c8b398a142854e2":"Dragon Dance (USA) (Beta 1) (SGB Enhanced) (GB Compatible)","2cd0ad9218bec430085d48e1d4530bba":"Tales of Monsterland (World) (v2.83) (GB Compatible)","2cdd3d78009afdad0a49ded398ff17c9":"Zen-Nihon Shounen Soccer Taikai - Mezase Nihon Ichi! (Japan)","2d0f5d19ea73ccb9cfec6398eb2f70b8":"Tom and Jerry in - Mouse Attacks! (USA) (Rev 1)","2d2a8314f789d490bf83ed3c44538fe3":"New Addams Family Series, The (Europe) (En,Fr,De,Es,It,Pt)","2d52664ee85f0192738fff0b53d4fe20":"Golf King (Europe) (En,Fr,De) (Proto) (SGB Enhanced) (GB Compatible)","2d78683c17765bd98e1c9ccce14b7bba":"EuroSport Pro Champ Fishing (Europe) (Proto) (GB Compatible)","2d7d0adcec6f72ca0755862c5fddf353":"Turok - Rage Wars (USA, Europe) (En,Fr,De,Es)","2d83fb454dd5687a802425c501854dc2":"Pokemon - Edicion Plata (Spain) (SGB Enhanced) (GB Compatible)","2de587b4e14baec8df62ea4c4f43cc46":"Croc (USA, Europe) (Beta 1)","2dfcacff86b06540d528447c21531b46":"Luke Yingxiong Z (Taiwan)","2e02bfbf1aa3f26024480ab8e33ee052":"Pomape Castle (World) (GB Compatible)","2e20e9cbff75913f4e123242a404a2a9":"Halloween Racer (Europe) (En,Fr,De,Es,It,Pt)","2e2596c008d47df901394d28f5bd66ec":"Zelda no Densetsu - Yume o Miru Shima DX (Japan) (Rev 2) (SGB Enhanced) (GB Compatible)","2e3288d0d0b41d6fcc6bec6676a78a3e":"Ferret Monogatari (Japan)","2e6c427203c660a60849efecc1eaca8c":"Stratacombo (World) (v1.0) (Proto) (GB Compatible)","2ea86780d4b6b9220db59df7c6afff4c":"Star Hunt (World) (GB Compatible)","2ebf6f830013d8702eebf93955db52d5":"Bugs Bunny - Crazy Castle 3 (USA, Europe) (GB Compatible)","2ec55d4bf6e38680facbe3efdc974498":"Digimon Saphire (USA)","2f4f1776863912bfc63ea49a19e4231b":"Grand Theft Auto (Europe) (En,Fr,De,Es,It) (GB Compatible)","2f6556846cc09e6165ff05df60bb072b":"Year After, The (World) (Pt) (Beta) (GB Compatible)","2f6b6379f8c7ce5d66a198162f345eaa":"Pocket Bomberman (USA, Europe) (SGB Enhanced) (GB Compatible)","2f7bb3bebbf2deb2b8f3ed62d041fa57":"Jungle Book, The - Mowgli's Wild Adventure (USA) (En,Fr,De,Es,It)","2f93e10fd3392d96fffcd10abe7d9696":"J.League Excite Stage Tactics (Japan)","2f9c669ace651b1eea896045bf8ea672":"Pokemon Jade (Taiwan) (Zh)","2fbdfac0006c9ee889098098cd940f66":"Walaki (World) (Hu)","2fdba20dd19facd380180babc007c56e":"Zhen Sanguo Wushuang 2 - Shin Sangokumusou (Taiwan)","2fe07f1adac3654ccd544b176f31d5cc":"Love Hina Pocket (Japan) (Rev 1)","2ffa53b90351c9a3390ca1f848435239":"Street Fighter Alpha - Warriors' Dreams (Europe)","301899b8087289a6436b0a241fbbb474":"Pokemon - Crystal Version (USA, Europe) (Rev 1)","304c2fe8ef1d9ae537004e3465814b4a":"Tweety's High-Flying Adventure (Europe) (En,Fr,De)","30567b9d1cf0881fee0e15cdfdc250da":"Bugs Bunny - Crazy Castle 4 (Japan)","3073432455a395835de6147399b36cfc":"Sabrina - The Animated Series - Spooked! (USA, Europe)","3097afa0be963c4318cde06184dccf1a":"Let's Bee Friends (World) (GB Compatible)","30a34dd920fa9f3c62b47ec5384052f0":"Razmoket, Les - 100% Angelica (France)","30d8d1eb56fb9e5f34ec0275a0e29362":"Cult of Blood, The (World) (Demo 1) (GB Compatible)","30ec849758f703d7071e2ac28e048101":"Alone in the Dark - The New Nightmare (Europe) (En,Fr,De,Es,It,Nl)","30f38b2be2450f14838a98c5711e303b":"Tottoko Hamutarou - Tomodachi Daisakusen Dechu (Japan)","30f78cb1af3772826ab1d0f6d989bb52":"Shougi 3 (Japan) (GB Compatible)","3143162338a87a52b49d8791909c2b3d":"From TV Animation One Piece - Maboroshi no Grand Line Boukenki! (Japan) (Beta 2) (SGB Enhanced) (GB Compatible)","314cf4f2802b6972aa37c7964f5f0159":"New Adventures of Mary-Kate & Ashley, The (USA, Europe) (GB Compatible)","314fddcec1489efe4a4f959d353ee4db":"Dejiko no Mahjong Party (Japan)","315dcdf71e7af8287ff71c9a79aa8280":"Pocket Color Trump (Japan) (GB Compatible)","31770f7197ea4a7ff99cad7cef5c58b8":"Lucky Luke - Desperado Train (Europe) (En,Fr,De,Es,It,Nl)","317f997c10602f100fa1231f72194505":"Firemen (World)","31a7ba6b72087ca433b43c5ea14ec12e":"Black Tape (World) (GB Compatible)","31ddde6b4c72261181e428ac99103304":"Rayman 2 Forever (Europe) (En,Fr,De,Es,It)","31e1af241f91ca3b9c165431258a4312":"Walt Disney World Quest - Magical Racing Tour (USA, Europe)","31f7a606b52e8d10fc010b4efe9fb514":"Microsoft Pinball Arcade (USA)","31fc2f3df8aa15f627574029c3cf03da":"Monster Rancher Battle Card GB (USA) (SGB Enhanced) (GB Compatible)","325ae325a17554abdb9015fc6f9c8c36":"Ghost of the Arcade (World) (GB Compo 2023) (GB Compatible)","326f861a8fb3e21f1e9379e62cfb6bea":"Stranded Kids (Europe) (En,Fr,De) (SGB Enhanced) (GB Compatible)","3286d6b332edfb46d8504bceba7e55d7":"Power Quest (Europe) (En-US,En-GB,Fr,De,Es,It) (SGB Enhanced) (GB Compatible)","32b2cb72de47a85e07a22d6173459b07":"Tom and Jerry - Mousehunt (Europe) (En,Fr,De,Es,It) (Rev 1)","32c7a63d1fa9c006bba020368cead82a":"Koudai Guaishou - Da Jihe (Taiwan) (Ja) (Pirate)","32cad8c9ca5698e80f7d7801e661cc99":"Fury (World)","32e1169337de052ddfb443d71794f1d7":"Midterm Moments (World) (GB Compatible)","32eb7d18f43e723095e31f1a248b1931":"Chongwu Xiao Jingling - Jiejin Ta Zhi Wang (Taiwan)","32f31220dd01f329be0279e6f5cd6bff":"Tottoko Hamutarou 2 - Hamu-chan Zu Daishuugou Dechu (Japan)","33010ffe2104c0cd6e3b50d624bc29f3":"San Francisco Rush - Extreme Racing (USA) (Proto)","3309fe5963175fa0ae6cc6abe34dbc53":"Gyouten Ningen Batseelor - Doctor Guy no Yabou (Japan)","331cd9f6afa7eab03157a35897af846e":"NFL Blitz (USA, Europe) (Rev 1) (GB Compatible)","3322493d6b7a70bfdea6f6231ceb1ce0":"Grand Theft Auto (USA) (GB Compatible)","3331eb2f36baced132100ff07a1502b1":"Xintiao Huiyi (Taiwan)","3355dc278915f314e263ba0a8e91c8f7":"Cool Hand (Europe) (En,Fr,De) (GB Compatible)","3383c2754015c4da7b5295a28ac09739":"Super Breakout! (Europe) (En,Fr,De,Es,It,Nl) (GB Compatible)","339d4c36fba10397018040e0a4cd1f94":"Brave Saga - Shinshou Astaria (Japan)","33a1389fb8bdc2c4caa3859213140c79":"Pop'n Pop (Japan)","33b0a13dcf79b78b31845b2f0b3e6e71":"Pokemon Pearl (Taiwan) (En)","33b0d63afa3e5ca664a884a8a63d842d":"Pian Wai Zhang - Huangjin Taiyang - Fengyin de Yuangu Lianjin Shu (Taiwan)","33b1f84e036eb954652cbb024aefe538":"Pokemon Ruby (Taiwan)","33e76b95e573464253422d27bf69623f":"Bygone Choices (World) (GB Compatible)","33f621c96e1150266b2519f5901097d8":"Hamtaro - Ham-Hams Unite! (Europe) (En,Fr,De,Es,It) (Beta)","3401da92a9c114cf2a35b677225ba354":"Super Color 26-in-1 (Taiwan)","340d4314e654e05fa9a4705181799096":"Office Combat (World) (GB Compatible)","341249f65f19579b9d335c807982b6fa":"Midway Presents Arcade Hits - Joust & Defender (USA, Europe) (GB Compatible)","341597629f04d5ea6716a7ca9eb24dc1":"Watashi no Kitchen (Japan)","3426bfe0c82da4c6705f996891579a24":"ATV Racing (Europe)","3435ea990961400835b057465ce1ca66":"Pocket Pro Yakyuu (Japan)","344b42a5bf2f591c0ec86cae24238d6d":"International Superstar Soccer 2000 (USA)","344d93f7d968ab5b931806a91f3108a4":"Koudai Guaishou - Sheng Bianshi (China)","34793ee5979947efe26929935803e708":"Silent Hill 2 - 20th Anniversary Demake (World) (Proto) (GB Compatible)","349aebf94c9ae3e1dce9d2a01894bae8":"Catz (Europe)","34d61c282c372f97b55f8dae1ef94fb7":"Harry Potter to Kenja no Ishi (Japan)","34fda0252963cc5a24c7382aa12b72c6":"Super Black Bass - Real Fight (Japan) (Rumble Version)","3508f174b154f500f30af1f06d7012b9":"Chao Jinhua - Shuma Baolong - Zuanshi Ban (Taiwan)","35119708963ee94ae7b634d364c07d50":"Looney Tunes Racing (USA) (En,Fr,De,Es,It,Nl)","3513f4dbf6d283121c6a070f3b92f9df":"GB Karan Koron Gakuen - Hanafuda Mahjong (Japan)","35168b96a50352217130116bd67cdcc1":"Dragon Dance (USA) (Beta 2) (SGB Enhanced) (GB Compatible)","3519c45ce55aad2f0565513723c90672":"Legend of the River King 2 (USA) (SGB Enhanced) (GB Compatible)","35250ce2644d7e8df79bb07c044e40ff":"Tomte Trouble (World)","354bbc5f53babeba8207cba0e764dde6":"Billiard Club (Japan) (Proto)","35773ac09080e95e9dec4b4b2777480f":"Atop the Witch's Tower (World) (v1.1) (GB Compatible)","358b42454a4acb2755834052fe85fc27":"Rocman X Gold + 4 in 1 (Taiwan) (1B-002, 4B-003, Sachen)","35d2e7924408a3460e5c1a770acf3a8a":"Pokemon Picross (Japan) (Proto) (SGB Enhanced) (GB Compatible)","3606f20c43c009075af22991766b2cc7":"Space Invasion (Europe)","3611927be3c7835c594120c4bfdd8d31":"Choro Q - Hyper Customable GB (Japan) (SGB Enhanced) (GB Compatible)","361cb47dbb4af50b2d6d3de9c7d74a58":"Action Replay Xtreme - Special Edition for Pokemon Crystal (Europe)","36306d0677ad4af06062e824c3881111":"Foal's Creek (World) (v1.05) (GB Compatible)","3634a0799df59541607d3240c4a3295b":"No Fear - Downhill Mountain Biking (Europe)","365f913d6f2b0f44d87b7a347daea528":"Tony Hawk's Pro Skater 3 (USA, Europe)","368622c53125b3f86941f7667ec11c8c":"Gedou Zhizun 2003 (Taiwan)","36a056d74781b5963802fb17e0b05222":"Expiration Date (World) (GB Compatible)","36a65f62c7f02c6014d19e5ff5798b69":"Feed The Monster (World) (GB Compatible) (Pirate)","36bf3165da71dc296db9fa1aa9e1d15a":"Basketbrawl - Deluxe Edition (World)","36d3c5208860aae4ac9377fac6c94537":"Flooder (World) (Anniversary Edition)","36d8ffb16dbceede9d62b4bf0a88fd3b":"Clockmaker's Tale, A (World) (GB Compatible)","36df5ebe75980ac4409dead125247bce":"International Superstar Soccer 99 (USA) (SGB Enhanced) (GB Compatible)","3757c89c36bec5e2093741a3e51d22df":"Pokemon Pinball (Europe) (En,Fr,De,Es,It) (Rumble Version) (SGB Enhanced) (GB Compatible)","377447c3f3199d7d58788b1192fd9fb1":"Nakayoshi Cooking Series 2 - Oishii Panya-san (Japan)","37817f1d239b5c8b8c2dac4d49262d7d":"Green Beret (Unknown) (Proto 2)","37824faeedc1d562cae1ceee675c6ac8":"Laura (Europe) (En,Fr,De,Es,It,Nl,Sv,Da) (Beta)","37938c96f34c9be568095f868ff71d1c":"Survival Kids - Kotou no Boukensha (Japan) (SGB Enhanced) (GB Compatible)","37b3cf7650235536e14ec856b497fe61":"Lemmings (Europe) (Proto)","37f4ad4a7baed1ed6eb62787734c00ae":"4 in 1 + 8 in 1 (World) (4B-002, 4B-004, 8B-002, Sachen)","380b1ef48f653e92e35cb81fdeec9419":"Suicide Run (World)","381fd4c2f69053535bc44d1d1882b94e":"Smickeonn - The Game Deluxe (World) (GB Compatible)","3857f9105094b5423f3d230e630df8de":"Rokumon Tengai Mon-Colle-Knight GB (Japan)","3865301a25bb849eb1f216454e014996":"Nyghtmare - The Ninth King (World) (v0.1.0) (Beta) (GB Compatible)","388a603e8b6d0fcf7c553fb00a7c5171":"Sanrio Timenet - Mirai Hen (Japan) (SGB Enhanced) (GB Compatible)","38d51be26c98e1a89cace0d4f0684f72":"Power Pro Kun Pocket (Japan) (Rev 1) (SGB Enhanced) (GB Compatible)","39099c9c22658b15703aeaea20e8ec04":"Melanie and the Magic Forest (World) (GB Compatible)","391e8281aab8aa7c0aab6f11f28fb591":"Jet Set Willy II - The Final Frontier (World)","391f056795b0ba564204b9b99abea0dd":"Shuma Baobei - Huojian Bingtuan (Taiwan)","392e73a2acd4310487e3bfabdd70293d":"Fairy Kitty no Kaiun Jiten - Yousei no Kuni no Uranai Shugyou (Japan) (Rev 1) (SGB Enhanced) (GB Compatible)","396ce73f896f44ebd43f3cd315bb935f":"Qi Tian Dasheng - Sun Wukong (Taiwan)","398f7b60ea114b90b24503178f47e8d8":"Robopon - Sun Version (USA) (SGB Enhanced) (GB Compatible)","39c380ce4edf34382550fdaf4fc24fa1":"Outta Time (World)","39e9649316e36bad957e98a2170df6d0":"Benjamin Bluemchen - Ein verrueckter Tag im Zoo (Germany)","39f214540d2042865211e07c0536cc14":"NHL Blades of Steel (USA)","3a00468ea1520a57f23f88d43cf8c067":"SWiV (Europe) (En,Fr,De,Es,It)","3a3e92c106a8674642e0ee3c0c793a9f":"Meitantei Conan - Karakuri Jiin Satsujin Jiken (Japan) (SGB Enhanced) (GB Compatible)","3a70f79e33ed4ea546d0ba41a7f2ef25":"Jim Henson's Muppets (USA)","3a998a2ec99c89696c9b23bbbd87f116":"Cardcaptor Sakura - Tomoeda Shougakkou Daiundoukai (Japan)","3a9e8eafabf705600d6c6c6eb832a56d":"Games Frenzy (Europe) (En,Fr,De)","3aaaee3ddf6492c2741f63aa98a44874":"Koudai Guaishou - Dongzuo Pian (Taiwan) (En) (Alt)","3abb1ceb5e276926147b127002aa5b92":"Pocket Hanafuda (Japan)","3abeffb860d9e7bea74ce18d0e67029d":"Karate Joe (Europe)","3ad65b50c81a79f826eedc19edcf48f4":"Kindaichi Shounen no Jikenbo - 10 Nenme no Shoutaijou (Japan) (SGB Enhanced) (GB Compatible)","3af0cf37eadd6e98fdc43d4b3967c966":"Cruis'n Exotica (USA)","3b1ddf5b4ccf2be81c5d1454f4a183d0":"Days Without (World) (Multiple Endings)","3b24fbc8e72140fab38a9874b587c479":"Dejiko no Mahjong Party (Japan) (Rev 1) (Proto)","3b26dfc4e7c55cf86f4a4f3c18344ac7":"Quest for Camelot (USA, Australia) (En,Fr,Es) (SGB Enhanced) (GB Compatible)","3b2f918967698c3eef1f04ef7cd5601a":"Titus the Fox (Europe) (GB Compatible)","3b3d047d3264e1af33cb5b8cabfc8840":"Bandits at Zero (World)","3b7597f78e33a3f95055ce559bb0e0c5":"Chuanshuo (Taiwan)","3b783f3fded9c61f2f9bb1d956bfd6cd":"Ballistic (USA) (GB Compatible)","3b789f606b4b249f1557f55cf102d45e":"Medarot 3 - Parts Collection - Z kara no Chousenjou (Japan)","3b9116dcb4a3b4cc943f75b8b7e88212":"Gambler Densetsu Tetsuya - Shinjuku Tenun Hen (Japan)","3bc2db27baff012307501c31d49922ac":"Geheimnis der Happy Hippo-Insel, Das (Germany)","3bcb284142a35a8d86550c2f34549dcc":"Shaun Palmer's Pro Snowboarder (USA, Australia)","3bd0dad0c695a534b9e89264e09e2b11":"Klax (USA, Europe)","3bfa6eca3e26c8b4ee8e31ac7064085a":"Bass Masters Classic (USA, Europe) (GB Compatible)","3c0c5fceebff4d9730875a9362d26aa1":"Resident Evil Gaiden (USA)","3c2a7051b554cf70183cfa5d99ad021f":"Jinsei Game - Tomodachi Takusan Tsukurou yo! (Japan) (SGB Enhanced) (GB Compatible)","3c3f9f06b791df796b55ac94f2188ff2":"Rainbow Islands (Europe) (En,Fr,De,Es,It)","3c6b37b6162d599e3554689500b23af1":"Network Boukenki Bugsite - Beta Version (Japan)","3c6c0bf27c82eea13dfc9697e0cacf57":"Cyborg Kuro-chan 2 - White Woods no Gyakushuu (Japan)","3ccf696ddc0e2ed66c26c2ff2cb9e12a":"Walt Disney World Quest - Magical Racing Tour (Europe) (Fr,De,Es)","3ced79ad60ab5195058d5d658550f04f":"Dance Dance Revolution GB 3 (Japan)","3d04e5c70919118ef6e7cb69dae14b10":"Shin Megami Tensei Devil Children - Aka no Sho (Japan) (SGB Enhanced) (GB Compatible)","3d24f9e876df8c50573c00119d395b73":"Jim Henson's Muppets (Europe) (En,Fr,De,Es,It,Nl,Sv)","3d44046744627646c09c7ccdae604a34":"Daisu-ki - Jam Edition (World) (GB Compatible)","3d630cb2ff52e7fedfca6c938b82fa24":"Arthur's Absolutely Fun Day! (USA)","3d75b453859c2c6f1c84b68ca987adda":"LEGO Stunt Rally (Europe) (En,Fr,De,Es,It,Nl,Pt,Sv,No,Da)","3d818762aa83330ce4426f8005cc374b":"Batman - Chaos in Gotham (USA)","3dbefe8c7ca45427696016902c2ee452":"Data-Navi Pro Yakyuu (Japan)","3dc508d4da71f2e89ca63b42899741a4":"Army Men - Sarge's Heroes 2 (USA, Europe) (En,Fr,De)","3dd14683b58a36f62ff288c7e0ea918d":"Radikal Bikers (Europe) (En,Fr,De,Es) (Proto)","3dd6b4dd7da7f2b412f92c2509b9f1df":"Cannon Fodder (Europe) (En,Fr,De,Es,It)","3df56a809c6c2d7f5de745657f04fd4a":"Chester's Big Ol' Day (World) (Proto) (GB Compatible)","3dfc97eb20570f845bb07db304687666":"Super Mario Bros. Deluxe (Japan) (Rev 1) (NP)","3e3c0ff63a8f5de3c13a60b82cea89d9":"Toy Story Racer (Europe) (En,Fr,De)","3e617f42020b999e008e12e6371b96d2":"Friendly Fire (World) (GB Showdown) (GB Compatible)","3e62f2ac50ccf89d43a111ab0afe93b6":"Qix Adventure (USA) (Proto)","3e7736b358b7750bb451d505816d8b11":"Formula One 2000 (USA)","3ebd3d5cd2a0bbcb0ffa84cfcfb84b4a":"Superman - Battle for Metropolis (Europe) (Proto) (GB Compatible)","3ed4d88927e2ea0d4f75826f1b60d4a1":"Diva Starz (Europe)","3ee67bd4471e60f4fec6b0799219a2f5":"E.T. - The Extra-Terrestrial - Escape from Planet Earth (USA)","3f0f1cc327ff1be267b226b85b7a11c6":"Animal Breeder 3 (Japan) (SGB Enhanced) (GB Compatible)","3f26686accd8714584b966d277973873":"Kidou Senkan Nadesico - Ruri Ruri Mahjong (Japan)","3f45aaeb406c50d03fc6984908fcbfa5":"Titus the Fox (USA) (GB Compatible)","3f4e912a87ffb1e6c53c798fdd51099c":"Bug Byte (World) (Proto) (GB Compatible)","3f56e5776ff9a2b08a0c22f5eacf6017":"Dungeon Savior (Japan) (SGB Enhanced) (GB Compatible)","3f724784e8359413d25c9ee29162ca2d":"Gopher (World)","3fdf7a4784f7cc93f850df9fc1dcc1af":"Boxed In (World) (GB Compatible)","400d3090f58e68e3fc7d186c370c74be":"Taxi 2 (France)","402df05fc7cee731e564b48366bc779d":"Spider-Man (France)","4034ac7df292643c15c10fa2406ad8c2":"Harry Potter (Taiwan)","4040e7a81ee393909429f0bfcbeb1e47":"Dogz (USA)","4042d8319068186a02b3de972f6f4ed0":"3D Pool Allstars (USA) (En,Fr,Es) (Proto)","404e59cb2021179bb4c6ade209a52366":"Booga-Boo (World)","407e0edf45b42f88f96774c9f549cf18":"Mummy, The (USA)","410652f95c575ffde3312e24c754dd2a":"Tarzan (France)","410677787033aa6a5e36fa57eb9a1262":"Hexcite (Europe) (En,Fr,De) (Proto) (SGB Enhanced) (GB Compatible)","413e1acd7847d628364163eb2c97cecd":"Driver - You Are the Wheelman (USA) (En,Fr,De,Es,It)","417ae48b7e288b62fe2540541244fc31":"Loppi Puzzle Magazine - Hirameku Puzzle Dai-3-gou (Japan) (Rev 1) (SGB Enhanced, GB Compatible) (NP)","417b0d90e313a7e2ff10b73925158f46":"Pokemon Diamond (Taiwan) (En)","417c09180a10c47dc212b44a60f06b4c":"Rockman 3 (Taiwan)","419dfcafd48edd0c13624037e2bc81e9":"Bingyuan Lixian Ji II (Taiwan) (Alt)","41b5e9d960ceafc89e8bd740c2c74dc5":"Konchuu Hakase 3 (Japan)","41c1911a80b9138f89868540723c2cdd":"Super Dassalo Land (World) (v1.1)","41c2515a1dda83aadfd0a134bc62656b":"Loppi Puzzle Magazine - Kangaeru Puzzle Soukangou (Japan) (SGB Enhanced, GB Compatible) (NP)","41f99360142c5cc1c115724702ed6648":"Junior Maths 2 (World)","4219f9cd26b14aa29711cd5deebfc994":"Mage and the Grimoire of Beast (World) (Ja) (v1.01) (GB Compatible)","4272d192cf2b14db93f1e2d1bc07aa74":"SpongeBob SquarePants - Legend of the Lost Spatula (USA, Europe)","429e6da4b32d8caa22e78d92c0febd12":"3D Pocket Pool (Europe) (En,Fr,De,Es,It,Nl)","42ad3639f6abf013d5dacd4358abf6ca":"Grinch, The (USA)","42d27df48114658836c5a234f1d7ef81":"Nyghtmare - The Ninth King (World) (v0.2.3) (Beta)","42e66dd2c0470d98487ef364e7daf710":"NASCAR 2000 (USA, Europe)","42ff80b90350d30aafe41ea2c71a79bf":"Men in Black - The Series (USA, Europe) (SGB Enhanced) (GB Compatible)","43202194489c664523243ae75ee041af":"Shutokou Racing, The (Japan) (SGB Enhanced) (GB Compatible)","43351cd46357bd1615a713490401fda8":"Koto Battle - Tengai no Moribito (Japan)","433d5df048561d0a276a56b210e25d9b":"Kaept'n Blaubaer - Die verrueckte Schatzsuche (Germany)","434dcfae5fdcf6f8f8ed466cdc88cc2f":"Tazz (World)","43527e9aff69649306c749da2d3c72c0":"Armada - FX Racers (USA)","435d9fa03b3f891648f9c56d39299807":"VIP (USA) (En,Fr,Es)","436e02804051d43b9b622bb48f7c67bf":"Suzuki Alstare Extreme Racing (USA) (Proto)","437ffe18425cdfa304da7f84cf257fc8":"Bomb Runner 1-2 (World)","439acae020bd073ecf7f41a881ccabda":"2003 Harry Potter 3 (Taiwan)","43ed3a5d16a9bb15e746346ebab6c5a6":"Bubblegum Attack (World) (GB Compatible)","43f61059772e7cef92e32f05dd89205b":"Shaman King Card Game - Chou Senjiryakketsu - Funbari Hen (Japan)","44090e5f80e30abddf264b170c236a9e":"Medarot 2 - Kuwagata Version (Japan) (SGB Enhanced) (GB Compatible)","44173cb9938f95619dc9db70797d5f72":"Larion's Tinker Toys (World) (Proto 2)","4448c35bebf32629e23f64c61cc50565":"F1 Championship Season 2000 (Europe) (En,Fr,De,Es,It)","44837786e1a5eb6ae5b70a14127a869f":"Silent Hill 2 - 20th Anniversary Demake (World) (Proto) (GB Compatible)","448af6d54ce1886456c98209f53abdc7":"Dr. Rin ni Kiitemite! - Koi no Rin Fuusui (Japan)","44bd656c1315621238cc57767e2e0e35":"Finders Keepers (World)","44cc400d990e2284ae843545fe99402e":"Sea-Doo HydroCross (USA) (Proto)","44edc2796dbeeed54658638bf2b7d78c":"Hat Boy (World) (GB Compatible)","4505499c8a53c23195b2d47b9366fba7":"Fillo - Crystal Version (World)","4505fd4df8eb721cf2f5b5be93682874":"Sanrio Timenet - Kako Hen (Japan) (Rev 1) (SGB Enhanced) (GB Compatible)","455df3202a18dfd4e7e93a7881c10901":"Zelda no Densetsu - Yume o Miru Shima DX (Japan) (Beta) (1998-07-14T181500) (GB Compatible)","4563d42db3b0c9f2e14c1cad7725bb34":"Dino Breeder 4 (Japan) (SGB Enhanced) (GB Compatible)","4572f09b61a36e94762ff60cbe182834":"Pokemon Trading Card Game (Europe) (En,Fr,De) (SGB Enhanced) (GB Compatible)","45a4cefca0b17ca193869bf6d6134d7c":"Microsoft - The 6 in 1 Puzzle Collection Entertainment Pack (USA)","45a7802b724dc5431847f60f3e78a302":"Rescue Heroes - Fire Frenzy (USA)","45afa73780709db49ce92eea952b0baf":"ECW Hardcore Revolution (USA, Europe)","45c4b87d2e3fe86fccc6941ffd724098":"Baby Felix - Halloween (Europe) (En,Fr,De,Es,It,Nl)","45d988bdb6cfcc334134dd212cefb7b8":"Pokemon - Version Cristal (France)","45db77fb2f2923c33ff9d521d5eaecce":"Maya the Bee - Garden Adventures (Europe) (En,Fr,De,Es)","45e090a174fd41f2e78759477d5b3ea1":"Shark Attack (World)","45eeade46bd85f80af13af9dce572b9c":"Barbie - Fashion Pack Games (USA, Europe) (GB Compatible)","4633a7b4485391e2fce4674caf00bb85":"Dragon Ball Z - Legendaere Superkaempfer (Germany) (Beta 3)","4639d79e2e02a687a44d19d9c9c3c28a":"Tootuff (Europe) (En,Fr,De,Es,It,Nl)","464acbe3c82887db897c39cdba877237":"Azure Dreams (USA) (SGB Enhanced) (GB Compatible)","4681f5b931a2e60ca163facd1adf56ed":"Mega Man Xtreme (USA, Europe) (GB Compatible)","468a4386f2e26f2f20e262f34a232ddd":"Wolf Pack (World)","469ee8270b66dad56379b29d160ee48c":"Kirikou (Europe) (En,Fr,De,Es,It,Pt)","46b9a55a3049a1113bc5430edaaf9401":"E.T. - The Extra-Terrestrial and the Cosmic Garden (Europe) (En,Fr,De,Es,It,Nl)","46c4958373216fbcf69a0c94946575f8":"Yakouchuu GB (Japan)","46e0e199f58aebbb75b4ed16da5aae60":"Space Invaders (USA, Europe) (GB Compatible)","46ed332d95c5da9a2007945fed9f8118":"Tintin - Le Temple Du Soleil (Europe) (En,Fr,De)","4713c80f75168f12d7582e63abb6edef":"Ottifanten - Kommando Stoertebeker (Germany)","472a51e912d0df0e786989cb6f190b87":"Mommy (World) (GB Compatible)","472b425740f0603fa3b566e028e871bd":"Honkaku Taisen Shougi Ayumu (Japan) (GB Compatible)","473e78b1d576a052492e1b4b80f4d3b3":"Elie no Atelier GB (Japan) (SGB Enhanced) (GB Compatible)","475550607b59e83c5465411015b66f41":"Chopper War (World)","475c56c522cc154c1526ab0900d77123":"Wing Warriors (World) (En,Fr,Es) (Beta 2) (GB Compatible)","476902451bd5da0f854a5c1681495b94":"Tonka Raceway (USA)","47714d6ae7b080a183804144d0672a62":"Emo Cheng 2 - Fengyun Pian (Taiwan)","47c3d8f5246f07f8885e44a9d2008f83":"Gunther the Monster and His Friends (World)","47e8dcb47a5e87f74441bb735f255aba":"Soukoban Densetsu - Hikari to Yami no Kuni (Japan) (SGB Enhanced) (GB Compatible)","482a7fe10c3e3d10127bbb08447a15cb":"Catwoman (Europe)","484020d0bf01d29f2a74322e0d4acc3a":"Zelda no Densetsu - Fushigi no Kinomi - Jikuu no Shou (Japan)","484eeb83ad00353272767485eca59ea5":"Star Wars Episode I - Obi-Wan's Adventures (USA)","488611af773cec5b7ecc5bd3efb754bb":"Spacestation Silicon Valley (Europe) (En,Fr,De,Es,It,Nl,Sv) (GB Compatible)","488c90eea5b5e2e8e217be6b7c9a1318":"NBA Jam 2001 (USA, Europe) (Beta)","48b5fea61742d75e98782803d14871f3":"DT - Lords of Genomes (Japan) (SGB Enhanced) (GB Compatible)","48b6a0ef5009a57d3976013bf42aa81d":"Yingxiong Tianxia (Taiwan) (Zh)","48ce279084e1fc7a9136cc211f4fad5d":"Hamtaro - Ham-Hams Unite! (USA)","4907bfe608ede74e08f4b43c51dc0194":"Auto Zone (World)","490bddbb5b173fad0ee682154bb1fbd9":"5 Minutes until Goodbye (World) (GB Compatible)","490cf7b762f7b735f249c3a3107c3e55":"Beatmania GB - Gotcha Mix 2 (Japan)","491d97b847cadc6c854172008a09fc83":"Legend of Zelda, The - Link's Awakening DX (Europe) (Rev 2) (Beta) (SGB Enhanced) (GB Compatible)","4948bfdacce45f5c1d0facab23f3ba54":"Blinky's Revenge (World)","494fbe8f0770a06be11a4026829e2396":"Shaolin Shisan Gun - Ying Xiong Jiu Zhu (Taiwan) (Zh)","49561c4082206a7e5d5ca2032be81eed":"Buffy the Vampire Slayer (USA, Europe)","495c72cdac3cd684b5d56581ccc183e1":"MTV Sports - T.J. Lavin's Ultimate BMX (USA, Europe)","496820c003cbca91df5dcc266053e3c2":"Shanghai Pocket (USA) (Rev 1) (Proto) (SGB Enhanced) (GB Compatible)","496afc38447d1ddec45583f3df074b35":"Senkai Ibunroku Juntei Taisen - TV Animation Senkaiden Houshin Engi Yori (Japan) (SGB Enhanced) (GB Compatible)","497e32beeface0c5dac4bfe84a5964b6":"Deja Vu I & II - The Casebooks of Ace Harding (Europe) (Fr,De)","4983746a421eff341f842649fcd8be89":"Star Heritage (Europe) (Proto) (Password Version)","498a332679b9ce4392af8d9b0567bf24":"Mail Junkies World Port (United Kingdom) (v1.01)","498c0a50a5e5cde16127617a97ad6162":"Harvest Moon GBC (USA) (SGB Enhanced) (GB Compatible)","49a772d7e66928ecf1ed672c679d99aa":"Digimon Crystal II (USA)","49b4214dceb5404acd5b83fc3d1a36bf":"Lee Carvallo's Putting Challenge II (World) (v1.2) (GB Compatible)","49b48529d5291796a96659468c41cc54":"Logical (Europe)","49b834ac7cd50da9b424e17c112c577a":"Speedy Gonzales - Aztec Adventure (USA, Europe) (GB Compatible)","49bc624c902fcb2e4892e5c823c987d0":"Microsoft Pinball Arcade (Europe)","49c62d2d16ace6a2c46d2cc817a49abf":"Arena 3000 (World)","49dd3c08833fab2509cdd1c724183460":"Lunatic Tower (World)","49e8a2684fd79b892eb4244224019f59":"Capybara Village (World) (v1.0) (Proto) (Cozy Spring Jam)","4a07f33107d47d904f80c53d0e857605":"Test Drive 6 (USA) (GB Compatible)","4a1eefb91466fd1a2368617d4e697c30":"Test Drive 2001 (USA)","4a58b26ef9624192afe5542f790cdb01":"Carmageddon - Carpocalypse Now (Germany)","4a58e3e59100c1791acd3c82f5ebd656":"Shenghuo Jiangmo Lu Waizhuan (Taiwan)","4a6aec32a62b0ecca3e2328fabbeb811":"Leaper (World)","4a8e3506f98e01fcb0da5073b83e4e35":"Q-bert (USA)","4adc91b001cf02dc42d2c0339535b8f9":"Indiana Jones and the Infernal Machine (USA, Europe) (En,Fr,De)","4b068708fb29fdabbee834114fe4a09d":"Hexcite - The Shapes of Victory (USA, Europe) (SGB Enhanced) (GB Compatible)","4b146ce804a9b9c90467742508a67b5f":"BattleTanx (Europe) (En,Fr,De)","4b3484d4a629121131885737ba86ca14":"Zippy The Pinecone (World) (GB Compatible)","4b355f96ea75826ad0e48055482badea":"Tyrannosaurus Tex (USA) (Proto)","4b497dfa757c4c54c67089507a71a715":"David O'Leary's Total Soccer 2000 (Europe) (En,Fr,De,Es,It,Nl)","4b5da8d4b73304b6694651f3fd8c8216":"Pocket Music (USA) (En,Es) (Proto)","4b62032c9cfecf52156ad0a2598444bd":"Robopon - Sun Version (USA) (Beta) (SGB Enhanced) (GB Compatible)","4b64f2a44700d5bf9dc0a25a64a9ebb0":"Batman - Chaos in Gotham (Europe) (En,Fr,De,Es,It,Nl)","4b684b00ecc0cf15536dc5ab58bdd470":"Monsters, Inc. (Europe) (Rev 1)","4b6b4476a9a2f205975db431dfec4533":"All Star Tennis '99 (USA) (Proto) (GB Compatible)","4b9d82d91a575cf96657383a26505eff":"Powerpuff Girls, The - Bad Mojo Jojo (USA) (Rev 1)","4bc8467ed91a94ba23648706b551cef5":"Classic Bubble Bobble (USA) (SGB Enhanced) (GB Compatible)","4c04b4fba57829c2eee5f4f37801c648":"Sabrina - The Animated Series - Zapped! (World) (ModRetro Chromatic)","4c18b5d470b105344ec55d195a05d2de":"Shadowgate Return (Japan) (GB Compatible)","4c634b29b3f20529cc4e0808199fa73e":"Konchuu Hakase 2 (Japan) (Rev 1) (SGB Enhanced) (GB Compatible)","4c9ea697778efdc5cefd32ce63e58598":"Memory Mania Challenge (World) (v1.3) (GB Compatible)","4ca44cbdd4e05c9b3c22da96d3de6338":"Legend of Zelda, The - Oracle of Seasons (Europe) (En,Fr,De,Es,It)","4ca71b12d89a5bcfcc52095081ae9f51":"BattleTanx (USA)","4cde8dac14b8ace83f8a4716ccb2dbf0":"Dragon Ball Z - I Leggendari Super Guerrieri (Italy)","4cec140483baf799e883e717b8ce81a5":"DX Monopoly GB (Japan) (SGB Enhanced) (GB Compatible)","4cf10b2c7ae81e62e82da32de3a9d48e":"Jaguar Mishin Sashi Senyou Soft - Mario Family (Japan)","4cf4a9af727673fa31cfe9d991428b6a":"Loppi Puzzle Magazine - Kangaeru Puzzle Dai-3-gou (Japan) (Rev 1) (SGB Enhanced, GB Compatible) (NP)","4cf9559ece4f20e20f0a0df646f4b68b":"Bikkuriman 2000 - Charging Card GB (Japan) (SGB Enhanced) (GB Compatible)","4d08e5553356aecd728b5ef7d78ee261":"Motocross Maniacs 2 (USA)","4d090ceaa53d571db00d7160ca4be69d":"Ms. Pac-Man - Special Color Edition (USA) (SGB Enhanced) (GB Compatible)","4d3e8bf64b69eb56c5f1786cef422c59":"Command Master (Japan)","4d401d54a616be45156e253213a6f04f":"Sludge & Sorcery (World) (GB Compatible)","4d48457f7138c58be1589a4ddce1f02d":"World Soccer GB 2000 (Japan)","4d6ce58ac78078d47a807cb326c3919a":"Bakusou Dekotora Densetsu GB Special - Otoko Dokyou no Tenka Touitsu (Japan)","4d8cac8dd06fb8da1debf7e84a1c2166":"Pokemon - Sapphire Version (USA)","4df8d03bb1853f949cf4a99dffd21362":"Test Drive Cycles (USA)","4e1a5f02cce49842d4717a8b0ce501f5":"Wendy - Every Witch Way (USA, Europe)","4e362c69c3d8f1e170f8e2a25d929435":"Robopon - Star Version (USA) (Proto) (SGB Enhanced) (GB Compatible)","4e5d7a1b65b52af7ca88e0b7b2016197":"Loppi Puzzle Magazine - Kangaeru Puzzle Soukangou (Japan) (Rev 1) (SGB Enhanced, GB Compatible) (NP)","4e60a2f1edbef45f0794a95dc0607234":"Year After, The (World) (En) (Beta) (GB Compatible)","4e745e7febe4214c484d9c1e0a62ae57":"Jeff Gordon XS Racing (USA) (GB Compatible)","4ea42da8598a4bbf223af121ddfab335":"Shuma Baobei - Hai Zhi Shen (Taiwan) (Zh)","4ef95a30c72008dee31ab836742c9acf":"Shin Megami Tensei Trading Card - Card Summoner (Japan)","4f05f82ad7c0f5aaba6d61438d5d8238":"Cool Bricks (Europe) (Beta)","4f2adc9041f74b1504cec9fa34abe0dc":"Hidden Gems (World) (GB Compo 2023) (GB Compatible)","4f4ad5f3389da1fc85af38cf770d4556":"NFL Blitz 2001 (USA)","4f62184649801733697e35c878092ba4":"Wangzu Tiantang (Taiwan)","4f682b03d485a50cc4a0307e9c949196":"Tootuff (Europe) (En,Fr,De,Es,It,Nl) (Beta)","4fa0f6e7388f072c8bb76761f8068868":"Macross 7 - Ginga no Heart o Furuwasero!! (Japan)","4fcf445c25b4cf798ef15afcd044dcf4":"Quan Ba Tianxia (Taiwan)","4fd68c1cf8b57e90a5b11b054fc68b46":"Donald Duck - Goin' Quackers (USA) (En,Fr,De,Es,It)","4ff574fadd50a18d7e93fe0d7dc4c8d1":"Magical Tetris Challenge (Europe) (En,Fr,De,Es,It,Nl,Sv) (Rev 1)","500c3ad63568b78fe3df71782bdf8592":"Hanasaka Tenshi Tenten-kun no Beat Breaker (Japan) (SGB Enhanced) (GB Compatible)","5045139eb57b9d6cdfa1366f473a1e4c":"Dragon Quest I & II (Japan) (SGB Enhanced) (GB Compatible)","509ca3dc125131b1a4b1667ccc64fd27":"Doraemon no Quiz Boy (Japan)","50aecb6a5ea96b4727e8e475e451b2d4":"Apollo Mission (World)","50af67f7321d84bd052f0e793ee0613c":"Mario Tennis (USA)","50e6d9d88450932743161b7512838ccc":"Flintstones, The - Burgertime in Bedrock (USA)","50f6fe2488600b1b80b8dea0aeeac2e1":"Bakuten Shoot Beyblade (Japan)","51091a6d773823b8731240676d9d25cf":"E.T. - The Extra-Terrestrial - Digital Companion (USA)","510eb8c9df5d3f71e01f5a7898a0a1f1":"Pokemon de Panepon (Japan)","5130d3ec4a93acb84e3f2c3590a0e5a6":"Tech Deck Skateboarding (USA, Europe)","51356c19a22fcb871cbdd721e42fe201":"Wacky Races (Europe) (En,Fr,De,Es,It,Nl)","51518f30eb5e6190671017fc9807016d":"NHL Blades of Steel 2000 (USA)","5164521245f41b0f3a51cffe0704d21d":"Thunderbirds (Europe)","5165faa424c006a72ccacdd62bf61726":"Hiryuu no Ken - Retsuden GB (Japan)","517ef53718009b20d7bf7771aef191dd":"Moomin's Tale (Europe) (En,Fr,De)","51825ecaa3162a1c871fe67e4a83f0b9":"Pia Carrot e Youkoso!! 2.2 (Japan)","51c8578d742ae2306b863776738f6772":"Kanji Boy 3 (Japan)","51f21f61592f05e712b36a0bf10a34a6":"Golden Goal (Europe) (En,Fr,De,Es,It,Nl,Sv) (GB Compatible)","521f0e017a4266355f3f4dc015f1dd46":"Ohasuta Dance Dance Revolution GB (Japan)","522910c5daf605b45745fa97cda41f84":"Barca Total 2000 (Europe) (En,Fr,De,Es,It,Nl,Ca)","523fac00115280ede5ac1647552b2024":"SnowCross (Europe) (En,Fr,De,Es,It,Pt)","5246b47da10ed6e48cbf58b5ee81e5c1":"Grimace's Birthday (World) (v1.6)","5254ea1935c43057358d2efba26c60c8":"Dragon Quest Monsters - Terry no Wonderland (Japan) (SGB Enhanced) (GB Compatible)","528ff2f54eb0b318e8e91a282fd62f2d":"Nakayoshi Cooking Series 5 - Cake o Tsukurou (Japan) (Beta 1)","52a9d2992a270ee3184553caf4fdba2b":"Gakkyuu Ou Yamazaki (Japan) (Rev 1) (GB Compatible)","52c823c2c7fddcfd77768daf42082980":"Robot Poncots - Comic Bom Bom Special Version (Japan) (SGB Enhanced) (GB Compatible)","52e260e54d59fd16cd5cc588123d3e48":"Gonta no Okiraku Daibouken (Japan)","52f46e74689516225055b8576079ee24":"Sewing Machine Operation Software (USA) (En,Fr,Es) (GB Compatible)","5315c21eaffde4a641a02d89f18e2a95":"Donald Duck - Quack Attack (Europe) (En,Fr,De,Es,It)","5323967b4e46c4a76ea3576675be42ac":"Minnie & Friends - Yume no Kuni o Sagashite (Japan)","5328277fe9c9c4b1671c5f40424c34f1":"Yin Ban Zhongwen RPG Zhanlve + Dongzuo + Yizhi 12 in 1 (Taiwan)","535ac79c69b22ed21cc9af0d4c10bea8":"Doug's Big Game (Germany)","535dbd4550114faa20678be0fbf973a9":"Digimon Pocket (Taiwan) (En)","536f2da6f96f278bd59b92bf37b61964":"Cuthbert Enters the Tombs of Doom (World)","538f4d9036a7841cb157b9023346c540":"Konami Winter Games (Europe)","53a98fbfddc370edd2de8eb0af5aa7ac":"Kanji Boy (Japan) (SGB Enhanced) (GB Compatible)","53cfcb50a8273c3fdbbbee9a20777361":"Get!! Loto Club (Japan) (Proto) (GB Compatible)","53fc292b30e0a4c59045e5f6a7587a01":"Pokemon Jade (Taiwan) (En) (Pirate)","54051bc19ce1c0301710d7845717dbad":"Suzuki Alstare Extreme Racing (Europe) (En,Fr,De,Es,It,Nl)","54165d2bf7a040aa31d6d0956408d10d":"MTV Sports - Skateboarding Featuring Andy MacDonald (USA, Europe)","5416dfae15db78cbbb6525051451c284":"Pocket Color Mahjong (Japan) (GB Compatible)","5423b2d603c9d4381594aa3d68441a69":"Babe and Friends (USA) (GB Compatible)","542543461273c69e6966d2599f382eca":"Captain Buzz Lightyear - Star Command (Germany)","5428271d0c9c5eb3dbf28078fafe2031":"F1 World Grand Prix II for Game Boy Color (Europe) (En,Fr,De,Es)","543fe119633338174899829b6d4c571f":"Thunderbirds (Europe) (En,Fr,De,Es,It)","544eb3962ef54f89718c8dfa668ec4be":"Star Wars - Yoda Stories (USA, Europe) (GB Compatible)","545b4875c01233edbdc6c2cd001aec25":"Tomb Raider (USA, Europe) (En,Fr,De,Es,It) (Beta)","547c0d3fdb1c6ef7abc7dff06c457a35":"Frogger (USA) (Rev 1) (GB Compatible)","549b54077fd122943e076f4c2350be05":"Bug's Life, A (Europe) (SGB Enhanced) (GB Compatible)","54c8522c1d924a05bb05ac6673f023e6":"Bomberman Max - Ain Version (Japan)","54dd12ef93fad931df26cdf67ad4677a":"Rugrats en Paris - La pelicula (Spain) (En,Es)","54df933576a8b8ca991b3ac9b6a1ad61":"F1 Racing Championship (USA) (En,Fr,De,Es,It) (Proto)","54f81e8d2232af2503e0e03eeeeb39ce":"Centipede (Europe) (En,Fr,De,Es,It,Nl) (GB Compatible)","55031fadeb053136a4df5cf848a97680":"Tetris Adventure - Susume Mickey to Nakama-tachi (Japan) (Rev 1)","5507d692286e2c57e29c62e78be4c7b5":"Digimon 02 5 (USA)","5563e6e09898599a781750d9ce9f0259":"Tottoko Hamutarou - Tomodachi Daisakusen Dechu (Japan) (Rev 1)","55bd8b9da0d4bf94a93e56d91c8219dc":"Trip World DX (World) (Limited Run Games)","55e3907e1d4c98bb4a3f9ab9005b1727":"Pokemon Vision Jade (Taiwan) (De)","55fea8e7be17975374ab24518bd83171":"Tarzan (USA, Europe)","560256bd5d95f16dead694d680e1c2e8":"Yu-Gi-Oh! Duel Monsters III - Tri Holy God Advant (Japan)","560e27a4d80b88280d8ad7358467c301":"Buzz Lightyear of Star Command (USA, Europe)","565b748f3ee16464bebde853770d39d2":"Powerpuff Girls, The - Battle Him (USA)","5679de3c41c63c6b9dc9432c7ed1105a":"Grandia - Parallel Trippers (Japan)","56aeb68f722483cff5179db47cf5222a":"Expiration Date (World) (v1.5) (GB Compatible)","56b935754216ef447a905c2e516a130c":"Bingyuan Lixian Ji (Taiwan)","56cbf668af5095a073e205a07987c82a":"Snoopy Tennis (USA) (En,Fr,Es)","56d9d8b1da2a329456a101031850e32b":"Kakutou Ryouri Densetsu Bistro Recipe - Kettou Bistgarm Hen (Japan) (SGB Enhanced) (GB Compatible)","57611d2939ee579349f2221c78339bb1":"Swordbird Song - The Iron Owl Tower (World) (v3.1) (GB Compatible)","576187b3bd246be19b9ae997188b7b0d":"Smickeonn - The Game 2 - Virtual Boy Edition (World)","576e3a9d7da60439c8fb28c81b56fe5a":"Beach'n Ball (Europe) (En,Fr,De,Es,It)","5776965258ee78832e7eabc0db66ff4b":"Monsters, Inc. (USA, Europe)","5779b8a387c10d39faf8fd55632375c7":"NASCAR Challenge (USA) (Rumble Version)","578a0860ed55c3e497af423c739f7d84":"Wendy - Der Traum von Arizona (Germany) (Beta)","579291571dac53916fd552ccea5b0bb9":"Front Row (Japan)","57a7d3d3e7d67ec7d72de5701d9227d8":"Daikaijuu Monogatari - Poyon no Dungeon Room (Japan) (SGB Enhanced) (GB Compatible)","57b59bc623b05385ab27a0d7e18295a1":"Tom and Jerry - Mousehunt (Europe) (En,Fr,De,Es,It)","57bcde64a3005d4aad8df640f2b5f07c":"Powerpuff Girls, The - Battle Him (USA) (Rev 1)","57db65568f3c4a523960cd5b35096481":"Tweety's High-Flying Adventure (USA)","58670204ec7b8791576e3c88ba7c1ddf":"F-18 Thunder Strike (USA, Europe)","5878a145e365fa1841b22e837c3226ff":"4x4 World Trophy (Europe) (En,Fr,De,Es,It) (GB Compatible)","5896aa268a344d2b65a70c983ad78c3f":"Star Trek (Europe) (Proto)","58a311a266816b46c8d6775e73a70b69":"Super 21 in 1 - New GB Rumble (Taiwan)","58df996c5721b105989e7052e214a3c4":"Laser Squad Alter (World)","58ff2f0f26205c5bd8c9aecb9973cb6a":"Jack no Daibouken - Daimaou no Gyakushuu (Japan) (SGB Enhanced) (GB Compatible)","59558bce6ef7774132a6109d1d0a0636":"Year After, The (World) (En,Fr,Pt) (GB Compatible)","5962e70172bbe5a77ae507a409d12aa9":"Visiteurs, Les (France) (GB Compatible)","597bd5a8aa26af757cba57aff575eaa3":"Godzilla - The Series - Monster Wars (USA) (En,Fr,De)","59b05dfc07cb8de90de975ea64af29bd":"Kanzume Monsters Parfait (Japan) (SGB Enhanced) (GB Compatible)","59dbf67358b671e2c8dcd9f89ebaf378":"Columns GB - Tezuka Osamu Characters (Japan) (SGB Enhanced) (GB Compatible)","59e3ae1c56f9f22a7da70168757f640a":"Ultimate Surfing (USA)","59e6b58b2f788c5e72bfa93e3052869d":"Woody Woodpecker no Go! Go! Racing (Japan)","59f3f8585cfc12876db9a27018d41f78":"Papyrus (Europe) (En,Fr,De,Es,It,Nl)","59fed43cd1489169d3c51b87988e7abe":"Kaitei Densetsu!! Treasure World (Japan) (GB Compatible)","5a021b40ccc17a66465dab276bf06cbe":"Alone in the Dark - The New Nightmare (USA) (Beta)","5a192fff3db17b8fb1ed19867d4be13a":"NFL Blitz 2000 (USA)","5a736039aab0973d8a014fdacbbeacbb":"Mob Creche Parallel Game (World) (En,Ja)","5a7673f1e61cd707bdc880ff76396a3d":"Cool Bricks (Europe) (En,Fr,De,Es,It)","5a8eb78c3eee9b199483b903344509e8":"Lunar Docking (World)","5a93ecb5781a3338c99e35bd06cc6127":"Tiny Toon Adventures - Buster Saves the Day (USA)","5aa10d5b6e7427a763b7c74b8d804821":"Swordbird Song - The Iron Owl Tower (World) (v3.0) (GB Compatible)","5aab47cf957c82c969bbc0a93232f883":"Atlantis - The Lost Empire (USA, Europe)","5ab6b2a6f4c48aa8a1e77e31370cdcb3":"Power Pro Kun Pocket (Japan) (SGB Enhanced) (GB Compatible)","5adbcf7b767292f53912761b66133455":"GB-Wordyl (World) (Nl) (GB Compatible)","5b250ab006a50301f29e74551531bd7f":"Sylvanian Families - Otogi no Kuni no Pendant (Japan) (SGB Enhanced) (GB Compatible)","5b29ec02452df1c3ce70d6aa82d59409":"Gravitorque (World) (GB Compatible)","5b36285c8491be0e1cb0c2c741d2b793":"Sakura Taisen GB 2 - Thunderbolt Sakusen (Japan)","5b36c3da8bcfee8a5f14a6db12f533a3":"Super Nenas, Las - Panico en Townsville (Spain)","5b40590960c204efd6303b2e89a0cc10":"Nushi Tsuri Adventure - Kite no Bouken (Japan) (Rumble Version)","5b5f4bbec087abc00ce1f834a86bdae3":"Pocket Billiards - Funk the 9 Ball (Japan)","5bad510836505a54f873191391bf7392":"River Styx Round-Up (World) (GB Compatible)","5bcd7a470494ad1c3b58936088532ca6":"Chrome and Blood (World) (v1.02) (Proto) (GB Compatible)","5bcdc0754bce49836a5f4c8614782a6f":"Hejin Zhuangbei II (Taiwan)","5bd9f0923dc29bd9e566933c3c3e7902":"Juukou Senki Bullet Battlers (Japan) (SGB Enhanced) (GB Compatible)","5be268f2761c76de1a0f86efc0f6bd50":"Fighter on the Path of Glory (World) (En,Ja) (v1.00) (GB Compatible)","5bea1b33eb5635e147069215c92b3d41":"Bokujou Monogatari 3 GB - Boy Meets Girl (Japan) (Rev 1)","5c010c6c3243380db1c64e9c01d1b982":"Musical Notes (World)","5c07e6aff1e2cdac8ec09554981ab0c9":"Koushien Pocket (Japan) (SGB Enhanced) (GB Compatible)","5c0ed7c257219b6fab67c5f9d9ab25f8":"Opossum Country (World) (GB Compatible)","5c3a09f365cfa467a11f14075b0d5517":"Ojarumaru - Tsukiyo ga Ike no Takaramono (Japan) (GB Compatible)","5c5917d5396f44aa95341e7d9ee5d79f":"Sir Knight (World)","5c7ecb62a755ce577e7d8a943838d45f":"Nisemon Puzzle da Mon! - Feromon Kyuushutsu Daisakusen! (Japan)","5c8af4e0a5c140ed96af55bc85828abc":"Zelda no Densetsu - Yume o Miru Shima DX (Japan) (Beta) (1998-07-14T022124) (GB Compatible)","5cc6ad2a2406c6c860f36107f6eb414e":"Looney Tunes Collector - Martian Alert! (Europe) (Fr) (Beta 1)","5cfeb93b86fbfe59d7c59e904de3bb88":"Rip-Tide Racer (Europe) (En,Fr,De,Es,It) (GB Compatible)","5d20a03ac7dae3572d4826ae884085d7":"Stellar Wars (World)","5d4cdbf3b54b6857c29cb24ebfaf2470":"Super Me-Mail GB - Me-Mail Bear no Happy Mail Town (Japan)","5d4e5be715d0a30bf1f94bb116a34b84":"Xploder GB (Europe) (v1.2.3E) (GB Compatible)","5da357ef79acb5ab8852d145888dd5cb":"Sesame Street - Elmo's ABCs (Europe) (GB Compatible)","5da63fe252b4cb3e17dd4986fb276690":"Smurfs Nightmare, The (Europe) (En,Fr,De,Es)","5da744788c35f96f9fa249aba68cf095":"2001 Fatal Fury (Taiwan) (En)","5daf6da4a471c6b9517413ef25e498a5":"Puzzle de Shoubuyo! - Wootama-chan (Japan) (GB Compatible)","5dda88b002742dc16fd232ad569dc4c8":"Formula One 2000 (Europe) (En,Fr,De,Es,It) (Proto)","5de22f218b0f679cbfe6fdd880c2f529":"Pinecone Pizza Party (World) (Prototype) (GB Compatible)","5df6d1ec0e9241e1ed8a8ee7ff318631":"Santa Claus Junior (Europe)","5dfe3d8c181023b30cfc942a9aa40a69":"F-1 World Grand Prix (Japan) (En) (Beta 2)","5e0691f5e41302c7477aff9cc252a7d9":"Ninja JaJaMaru - The Great World Adventure DX (USA, Europe) (Ninja JaJaMaru Retro Collection) (Switch)","5e1b4969a76e069acf2622f7bb05d8d3":"Evel Knievel (Europe) (En,Fr,De,Es,It,Nl,Sv) (GB Compatible)","5e374708237a17f322a077daba43ac76":"Hello Kitty's Cube Frenzy (Europe) (Proto) (GB Compatible)","5e9ac200f771f793f4ff65506fb63763":"2003 Koudai Guaishou - Lanbaoshi (Taiwan)","5edc7fd33f6872f6243d746ffb992f11":"Alley Cat (World)","5ee49eaf9a2c19623478215788c0bfdc":"Space Marauder (USA)","5f1481260760c69843a61e9060ad7154":"Monopoly (USA) (GB Compatible)","5f1dc921df67de60d3f6ef1a44870142":"Planet of the Apes (Europe) (En,Fr,De,Es,It,Nl)","5f43dc79250321f235a1ddc422a2d58d":"From TV Animation One Piece - Yume no Luffy Kaizokudan Tanjou! (Japan) (Rev 1) (SGB Enhanced) (GB Compatible)","5f5535bf79444ec15502db9c81e58ced":"Daikatana GB (Japan) (NP)","5f797c8c175237b9ef0d9a6888a4a239":"Medarot 2 - Parts Collection (Japan) (SGB Enhanced) (GB Compatible)","5f821976274f5e6147f2354a6d01f098":"Montezuma's Return! (USA) (En,Es) (GB Compatible)","5f872189d58f841b5672d4cb11ec3bbb":"Pooh and Tigger's Hunny Safari (USA)","5f87a30263bfffd7003b2dda6443e216":"Pact, The (World) (GB Showdown)","5f9bbf43df1837fe1c1d960286513fcb":"Hello Kitty no Sweet Adventure - Daniel-kun ni Aitai (Japan) (SGB Enhanced) (GB Compatible)","5ffa26d048b191bfd6af46be13552aa5":"Chase the Chuck Wagon (World)","600c8c4d9fcc759dae5055297b0ebb5f":"Mizuki Shigeru no Shin Youkaiden (Japan)","600e9e24ebbe4f2b8a09d429b4aee54c":"Jeremy McGrath Supercross 2000 (Japan) (En) (Possible Proto) (NP)","60189a9f7aeda63e0745b347008280f0":"Xingqiu Dazhan II - Kelong Ren Zhanyi (Taiwan)","6027ab122cd183e40184db9297c0b38e":"Yurivania II - Josette's Quest (World) (v1.2)","60abfc4f6f633a708c23d91d0cc2f5bd":"Tamarindo's Freaking Dinner DX (World)","60b253394d8d817afcb80b8c69be907d":"Mythri (USA) (Proto 1)","60df8a170849c5f5a6f94b1531a29a34":"Bakukyuu Renpatsu!! Super B-Daman - Gekitan! Rising Valkyrie!! (Japan) (SGB Enhanced) (GB Compatible)","60f6fbdd07d01ad1835269fdeaebb83d":"Cardcaptor Sakura - Itsumo Sakura-chan to Issho (Japan) (Rev 2) (GB Compatible)","6122caeec0daab1bfa89c2af317dcbd6":"All-Star Baseball 2001 (USA)","6145649e6fa0e5c741fd4916f740e755":"My Friendly Little Island (World)","6156e8789ce8126c299892f34d2c9805":"Snow White and the Seven Dwarfs (Europe) (En,Fr,De,Es,It,Nl,Sv,No,Da)","617dcfac99f28045b8f4c46b9d75b58e":"Rampage 2 - Universal Tour (USA, Europe)","6181d450198ae4ec17f2aa86bbe2a1d1":"Pogo Pete (World)","618946a1d8d7154c200fe278ef030140":"Magical Drop (Europe) (En,Fr,De)","618be0636a482b1c5e5898e7cb5f1bb3":"Road Champs - BXS Stunt Biking (USA, Europe)","618e8914445053d1bd0901ad5297f927":"Tonka Raceway (Europe)","61d38e254879b2b99490573499a801b1":"Legend of Zelda, The - Link's Awakening DX (Germany) (Rev 1) (Beta) (SGB Enhanced) (GB Compatible)","61e893ad650d4f7003cd76ff55d244b4":"NBA in the Zone (USA) (Possible Proto) (SGB Enhanced) (GB Compatible)","620421795af2cb74429b9f2e30d9a38d":"Carrera (Europe) (En,Fr,De) (Proto)","62443f663965ba2f3a4181cd694d88a3":"Raku x Raku - Cut Shuu (Japan)","627c3542307661990802806ebd0acd90":"Oddworld Adventures 2 (USA) (En,Fr,De,Es,It) (GB Compatible)","628804db7252b7bb5a51f6aaea4b7077":"Checkmate (Japan) (En,Ja) (GB Compatible)","62922e55a0a4a4e9e90248ceb13b3c56":"Hunter x Hunter - Hunter no Keifu (Japan)","63073bf7cd416f5facbfe9e9d7d7e6c9":"Fireman Fred (World)","632793107d6a279a2f38236955353906":"Bomberman Quest (Japan) (SGB Enhanced) (GB Compatible)","634c5b73113b589530bc70cfb5ce3598":"Land Before Time, The (Europe) (En,Fr,De,Es,It)","636b1ae4118a8ae1a544b99fcd8d8cb1":"Ack Ack Attack (World)","637b90b33aeb3688187c6ac73db3488e":"Laura (USA)","637ece04f6c5f0c9f4871e5ed5255b0a":"Wink & the Broken Robot (World) (Beta 6) (GB Compatible)","63942b9b7ff673988fdbfbe8e1fdfc78":"Championship Motocross 2001 featuring Ricky Carmichael (USA, Europe)","639ae0f129bb98e17cc1b39e962cc43a":"Phantom Fright (World) (GB Compatible)","63b491b90be8a8ef9301c8b6557fa495":"Dusky Dungeon (World) (v0.1.0) (Proto) (GB Compatible)","63c3dd1377e60b2278ba4bf4c9b04f58":"Ice Age II (Taiwan) (En)","63f1430338d4f8053a34587429fb6b96":"Zoboomafoo - Playtime in Zobooland (USA)","641c8b63e7d9e31154b1f517e74b745c":"Gedou Jian Shen KF (Taiwan) (En)","64237b274859b5424353ca4bb3d6abda":"Tynesoft Commodore 16 Classics (World)","64396458bb3a82f26f522e85291b5fc5":"Caesars Palace II (USA, Europe)","644c2c3cf2dc2e3fce741844e497a18f":"Aladdin (USA)","64616a385482aeb9688a61fd7608b068":"Shuma Baolong 2 (China)","64a1264572a811e5e20831eff18f8ca3":"Shuma Baolong - Shuijing Ban (Taiwan) (Li Cheng)","64a63155c1500b50d6445558bd715787":"Super Fighters 99 (Taiwan) (SGB Enhanced)","64b533c76d258e5ee067a00dcebe700c":"Pokemon - La Version Esmeralda - Special Pikachu Edition (Spain) (Pirate)","64d2d5df9d0e5035ef549a189fbdb475":"Bug's Life, A (USA) (SGB Enhanced) (GB Compatible)","64e6738e474b22efd3132e786c18271f":"Dungeon Savior (Japan) (Rev 1) (Proto) (SGB Enhanced) (GB Compatible)","64f353e4310f83a5fbf2e211a63ec27e":"Pokemon Sapphire (Taiwan) (Zh)","64fa89b64514a71651c1b8dc629ba8f3":"Knockout Kings (USA, Europe)","651c7adc1d8cbcf2de53583f9d75195b":"Darklite (World) (Proto) (GB Compatible)","6556192c6fdfde1e7f7a538bb75ad6d9":"Taikong Zhanshi X - Fantasy War (Taiwan)","65973d7a1446346294f8ca9d2d1b7e66":"Tetris DX (World) (SGB Enhanced) (GB Compatible)","659b233dc37821379ec77f2e066a7619":"David Beckham Soccer (USA) (En,Es) (Proto)","65bd155f47eade36f7bd446cf58b9bdb":"Ultimate Fighting Championship (Europe)","65da43aef4c10cfd8feee70e842a46ae":"Monkey Puncher (Europe) (SGB Enhanced) (GB Compatible)","65ddb5e5db1b3f932d44a28c802e63cc":"Bob the Builder - Fix it Fun! (Europe) (En,Sv,No,Da,Fi)","65e85e5ad524ed60a9b0a8122a55d7af":"Sewing Machine Operation Software (Europe) (En,De,It,Nl) (Proto) (GB Compatible)","660fd044f1e744b8a208fc91481c030d":"Ou Dorobou Jing - Angel Version (Japan) (SGB Enhanced) (GB Compatible)","663eed7079113b1d1e1d7d40e9871cc3":"Powerpuff Girls, The - L'Affreux Mojo Jojo (France)","6655dde446c2f043ab9eafb0e2215086":"Tomb Raider 2 (Taiwan)","6660f1b04169b74397029f3ae3dab5e3":"Remen Gaoxiao - Shuma Guaishou III (Taiwan)","66a744231189d65db54aa4d670975c5a":"Army Men 2 (USA, Europe) (En,Fr,De)","66d0bd1c6da3c84e4d15b59a8a9db476":"Micro Machines 2 - Turbo Tournament (Europe) (Proto)","67117cc76e2b270e65c2778c734f905f":"Lion King, The - Simba's Mighty Adventure (USA, Europe)","671e9ad83a9f01cf7e04bb97bf757553":"Mojie Chuanshuo (Taiwan)","6736e0dc64fa3584ed48b1a9d845abcb":"Kisekae Series 3 - Kisekae Hamster (Japan)","6774580db542b838eff5a155128b7413":"X-Men - Mutant Academy (USA, Europe) (Rev 1)","67a4f5b76b83d37c888cb4de3293ca6d":"Crazy Climber (USA) (Proto 2)","67a76a42def402617d23961b3827d156":"G-Man (World)","67dd4724f032088506dc868078eb4e7e":"Puchi Carat (USA) (Proto 1) (SGB Enhanced) (GB Compatible)","67f1a15025b979833f4c5aa0ef561954":"Carl Lewis Athletics 2000 (Europe) (En,Fr,De,Es,It,Nl)","6800c72c57c0b85973262e45ddd48a6b":"Chaoji Jiqiren Dazhan X - Super Robot War X (Taiwan) (Alt)","6814576ee449d4119027dc4a85b92555":"Sesame Street Sports (USA)","6815ec13f522fd65637be46220371704":"Centipede (USA) (GB Compatible)","68242187b65166b5f8225b20e2021659":"Legend of Zelda, The - Link's Awakening DX (France) (Rev 1) (SGB Enhanced) (GB Compatible)","68271240c1b372f49b01adf583c91f83":"Mummy, The (Europe) (En,Fr,De)","68715e0a2805e3fc019fec35a9cff0d4":"Oddworld Adventures 2 (Europe) (En,Fr,De,Es,It) (GB Compatible)","688228b6718f9220f6e11db58a29220b":"E.T. - The Extra-Terrestrial - Digital Companion (Europe) (Proto)","68bffbbabc15da177c071eea0e055713":"Bakusou Senki Metal Walker GB - Koutetsu no Yuujou (Japan) (Rev 1) (Proto) (GB Compatible)","68c2e5e0b2f2f5d78c50515a1c6a47f2":"Days Without (World)","68cf797f26fdb624fd6a2e543a2f1c43":"Space Fleet (World) (Proto) (GB Compatible)","68e0db3785bc843790d6de9c3877003f":"Loppi Puzzle Magazine - Hirameku Puzzle Soukangou (Japan) (Rev 1) (SGB Enhanced, GB Compatible) (NP)","68e3ccbb7b37d60bc8c9d84a3c0a3b2b":"Shin Megami Tensei Devil Children - Aka no Sho (Japan) (Rev 1) (SGB Enhanced) (GB Compatible)","6902207e70e62fb38a07f49fcee77929":"Tasmanian Devil - Munching Madness (Europe) (En,Fr,De,Es,It) (GB Compatible)","691d6d252e22cbc7f039d0975582ca8f":"Land Before Time, The (USA)","693e77e4cd9c3845693f695a87f4444a":"Loppi Puzzle Magazine - Hirameku Puzzle Dai-2-gou (Japan) (Rev 1) (SGB Enhanced, GB Compatible) (NP)","695e4a82d1a97859365e3b5d5ba28e8c":"Catz (USA)","698c939536f83b474ce90351bae6a47e":"Rockman DX8 (China) (En)","699e1a69e9579545958f60106bb23a19":"DynaMike (Europe) (Proto)","69a6ebc942c7d0ecef2e514989debde6":"F1 World Grand Prix II for Game Boy Color (USA) (En,Fr,De,Es)","69b87b5555a44bcaba30b3f4a53275d8":"Black Onyx, The (Japan)","69c43b8daef3007b252824c22b3bf2ae":"Pandora's Blocks (World) (v1.8) (GB Compatible)","69c68b13bb0da057acbafe24e389e855":"Shrek - Fairy Tale Freakdown (USA, Europe) (En,Fr,De,Es,It)","69ebfa592721cd1d9c835d1b810b7266":"Powerpuff Girls, The - Panique a Townsville (France)","6a2a5ab0dc979f162cbfa4389d1cd71f":"Heroes of Might and Magic (USA) (En,Fr,De)","6a38f9f550a6858f7ced15ba03d2a8cd":"Super Nenas, Las - Lucha Con Ese (Spain)","6a5061a092cfd2c78b7fe65fdea15397":"Hamtaro - Ham-Hams Unite! (USA) (Beta)","6a6f5ec37846f1ee93caa37977e2a15e":"Shi Mian Maifu - Yingxiong Pian (China)","6acd649d8ab0ec4f26b8ca3930434264":"Street Fighter Alpha - Warriors' Dreams (Japan)","6ad6c159e20dfd12efbb3cf93a552909":"Smickeonn - The Game Boy Adventure (World)","6ae02bf9fc6765129b06734ac13e4da4":"Korokoro Kirby (Japan)","6af9bb4957485a0f5cebc9b44e805392":"Blue's Clues - Blue's Alphabet Book (USA)","6b02671ee66e3a9846db327f2b12e390":"Mirror Between Us, The (World) (GB Compatible)","6b055c6d12e477fbfd7bed1b495d56f7":"10-Pin Bowling (USA) (Rumble Version)","6b2118817985dbb1bb36a804a8240641":"Stuart Little - The Journey Home (Europe) (Fr,De)","6b3c4b0263becc3527f4a41e67588ef0":"Yinghan Zidian (Taiwan)","6b3ceb7bb280c0c0cb7543fe33925cb7":"Blade (USA, Europe)","6b63533c97a27dedc48aae58d4e47c1f":"Kisekae Series 2 - Oshare Nikki (Japan) (Rev 1)","6b648d40cb705fc139d045b124dfcf5e":"Foal's Creek (World) (v1.06) (GB Compatible)","6b7d527d4b2062ac2be2cab73aeebfe5":"TNN Outdoors Fishing Champ (USA) (SGB Enhanced) (GB Compatible)","6b94c050291c68d6fb13c642c46873ab":"Wizardry I - Proving Grounds of the Mad Overlord (Japan) (En,Ja)","6b953a346e1fe063d66d8a23f3bfa27d":"Polaris SnoCross (USA) (Beta) (Rumble Version)","6bb272f9361d57d9796cf2bb3615bf1a":"Gaiamaster Duel - Card Attackers (Japan)","6bbdbc468d32a31d21727ec0136ee419":"All Star Tennis 2000 (Europe) (AZTX) (Proto) (GB Compatible)","6bd1dea9af1ed4356c23043cb8af91ae":"Diva Starz (France)","6c024d8dcce9c86bab9dc16596794276":"Roi Lion, Le - La Formidable Aventure de Simba (France) (Rev 1)","6c0599a365bb7dffd2c9c67fa546c8b0":"Choro-Q (World)","6c34052ae5e516f8737982cb93a0845c":"Tweenies - Doodles' Bones (Europe) (En,Nl,Sv,No,Da)","6c7dc7ce74088a9e42a6fb8d98a67714":"Super Robot Pinball (Japan)","6ca4b011f72523dbd40d9ea470d2b4ea":"Pocket Music (USA) (En,Es) (Proto)","6cb5baab4f5d315b9e72a29f5ff8f89c":"Chaoren Tegong Dui (Taiwan)","6cc1cfbd1fc01b948e03f507c530260d":"Medarot 5 - Susutake Mura no Tenkousei - Kabuto (Japan)","6cd3ff8ceafd660a42d540eff59d4161":"Hunt the Gwumbus (World) (v2.1)","6cf89f96af36735e4f26247f93767afe":"Cross Hunter - X Hunter Version (Japan)","6d0d0d7de2730b9f9fdeeb4e202d5115":"Dinosaur (Europe) (En,Fr,De,Es,It)","6d1682824a006ddbde77527a2e62622a":"Puchi Carat (USA) (Proto 2) (SGB Enhanced) (GB Compatible)","6d320548645094a55aa2e6044aecd54f":"Pilgrim's Peril (World) (Demo 1) (GB Compatible)","6d450e010e7d293c743d6f62466b6004":"One Day (World) (GB Compatible)","6d51dcd9012c1140f73d7fd753698abf":"Beauty and the Beast - A Board Game Adventure (Europe) (En,Fr,De,Es,It) (SGB Enhanced) (GB Compatible)","6d6127ca9672dfb7435d6b4e9464725c":"Dragon Ball Z 3 - 2002 Fighting (Taiwan) (En)","6d6507bd38c76a9baa90b8e305ebea13":"Infinity (USA) (Proto)","6d66fe14e66911e36c483ecfccc01615":"Feed IT Souls (World) (v1.4)","6d7ec146b7c1a4a3bc1e948cd82abede":"High Noon (World)","6d8f9cd72201caabdfd0455a819af9ce":"Zelda no Densetsu - Yume o Miru Shima DX (Japan) (Rev 1) (SGB Enhanced) (GB Compatible)","6d92fc307b0285b61a5b3ab0af991519":"Pokemon Jade Version - Special Pikachu Edition (USA) (Pirate)","6d9ab3b90805908d732c275157e29c79":"Animorphs (Europe) (En,Fr,De,Es,It)","6db4b6a1cceebc9ab2629c83a5c838ae":"Frogger 2 (USA) (Rev 1)","6dbc891774265f4bc8ccba65f9383aec":"Super Bombliss DX (Japan) (En) (SGB Enhanced) (GB Compatible)","6dbe685543a02c8a52ff08ef94d784b0":"Monty on the Run (World)","6def7d77e305997838c4b64b5163e3c2":"Snoopy Tennis (Japan)","6e0e4a0131c8bc9904955d97c02933d3":"2123 (World)","6e1b62771a0325ed755adf99a7b501ba":"Jaguar Mishin Sashi Senyou Soft - Kirby Family (Japan) (Proto)","6e2c510ef5562393cda32a807af4069a":"Another Adventure (World) (En,Es) (GB Compatible)","6e6eca68f57407cfb0040c57218064e3":"Chao Jinhua - Shuma Baobei D-3 (Taiwan)","6e863b582bddb6126bb63633f41befd8":"Tom Clancy's Rainbow Six (USA, Europe) (En,Fr,De)","6eab24805e2dea9c991d679fd00a5d87":"Medarot Cardrobottle - Kuwagata Version (Japan) (SGB Enhanced) (GB Compatible)","6eabc4876218996b5d9386fdad23cfc3":"Chaoji Jiqiren Dazhan X - Super Robot War X (Taiwan)","6ebb0ba4beacc1c846295996d92eda8c":"Zhihuan Wang 2 (China) (Zh)","6ebca05013af9c103aea798e0eb924c6":"Saru Puncher (Japan) (SGB Enhanced) (GB Compatible)","6efc4c27d06564f9000667c029ad02a3":"Asterix & Obelix (Europe) (En,Fr,De,Es)","6f0a4d09a4a40ca93a528f2409bb872c":"ATV Racing & Karate Joe (Europe) (Alt)","6f10189fd4a50c6a762eb7e77c52ef39":"Capybara Village (World) (v1.1) (Proto)","6f39124a6dfc3aaa28813286054a5fcb":"Pocket Color Billiards (Japan)","6f40be54d3680d87d36df07815e4c0c8":"Nyghtmare - The Ninth King (World) (v0.2.1) (Beta)","6f4b114b010c05ed286e4470d165abe2":"Kawaii Pet Shop Monogatari 2 (Japan) (Rev 1) (GB Compatible)","6f5aca1f721a92eb956286809f2af28d":"Loppi Puzzle Magazine - Kangaeru Puzzle Dai-2-gou (Japan) (SGB Enhanced, GB Compatible) (NP)","6f67b154450bd3d88924c179f8165721":"Godzilla - The Series - Monster Wars (Europe) (En,Fr,De)","6f77900a7f85480bd41c57d1c8ba1ce8":"Zook Z (USA)","6f94a1bf91839706d2ef586acc9a82c8":"Waternet (World) (Batteryless Save Flash Cartridge Version) (GB Compatible)","6fe80cdfcd6661467a6c1e6d607093de":"Fengkuang Dafuweng (Taiwan)","6fea46cebece96e6dbfb9d9d06ae4a59":"Digimon 02 4 (Taiwan) (En)","7039b471857d20f77a5ba7f48065ed53":"Hype - The Time Quest (Europe) (En,Fr,De,Es,It,Nl,Sv,Da)","7048098ff990c3f26a0f8937dc42e825":"Hopp It (World)","706062c2ab563e87ecd55b41ac4ca013":"Bingyuan Lixian Ji II (Taiwan)","70739bd1b6eb0ecb06fe5954f94d74fc":"Billy Bob's Huntin' 'n' Fishin' (USA, Europe)","70883b45a97984cb033c2b95028bef65":"Sakura Taisen GB - Geki Hanagumi Nyuutai! (Japan)","708f4c9e41d17b8f4fb11cc227fe9989":"Missile Command (Europe)","70a1de16d9a6b88f5ad6883eb658f285":"Pocket GT (USA) (Proto)","70a6a59623177ab1234f160d1ec7bb3f":"Pocket Monsters - Crystal Version (Taiwan)","70aa706f2831fe9736bf0ab76d925497":"Olympic Skier (World)","70ccaf1c458dc09b7c703191ef9b8541":"Konami GB Collection Vol.1 (Europe) (GB Compatible)","70e3ab7ef2061e7075d81aede74ea95c":"Roland Garros French Open (Europe) (En,Fr,De,Es,It,Nl)","7106845f7e0dca5abf221bd5765b587e":"Swing (Europe) (En,Fr,De,Es,It) (Proto)","71156f1794556acd255ae256d8195e32":"Mario Golf (Europe)","7146368b60c8291544ea5314747aed3b":"Test Drive 6 (USA) (Rev 1) (Proto)","71608f971986dd740c8e94f61f9cd020":"Pro Foot (France) (En,Fr,De,Es,It,Nl,Sv) (GB Compatible)","716de1a7f4178fd941edf22d1a907624":"Wacky Races (USA) (En,Fr,Es)","71844ae14b67fbe97b0ab5655e5a87b0":"What Friends Are For (World) (v2.0) (GB Compatible)","7187fe377729db40928fb6c6ee5a0809":"Koguru Guruguru - Guruguru to Nakayoshi (Japan) (SGB Enhanced, GB Compatible) (NP)","71a4659ae44b6594e75f98e013ce6853":"Love Hina Pocket (Japan)","71b5b10dd41f6c8449cb9ca52dd6e590":"Borbo's Quest (World) (GB Compatible)","71b646ac71dbae8984995ef51324f5f5":"M&M's Minis Madness (USA) (Sample)","72448fe75f534f70cd90469da95ef76f":"Pokemon - Version Argent (France) (SGB Enhanced) (GB Compatible)","728feea5c73b9bccd9dbbdde5fa88552":"Yu-Gi-Oh! - Duel des Tenebres (France) (Beta)","729934ddb7aa39779a456523a81b4a45":"Dragon Quest III - Soshite Densetsu e... (Japan)","72b6216fe3094d7798a359b9a4cdf7ed":"Taxi 3 (France)","72d6dc97291e659d0c36e977147c2fd2":"Karamuchou wa Oosawagi! - Okawari! (Japan) (SGB Enhanced, GB Compatible) (NP)","72e653c065ff90b33f77cffa78ebb11d":"True Color 25 in 1 (Taiwan)","7311f937a542baadf113e9115158cde3":"Mortal Kombat 4 (Germany) (En) (SGB Enhanced) (GB Compatible)","734f49ccbe8c131bf38e584a00ce7391":"Xtreme Sports (World) (Switch)","7351daa3c0a91d8f6fe2fbcca6182478":"Legend of Zelda, The - Link's Awakening DX (USA, Europe) (Rev 2) (SGB Enhanced) (GB Compatible)","73a78663a6388bf4d1c56e05bbf790d4":"Aliens - Thanatos Encounter (USA, Europe)","73bc46b4eb6e6924dc1b830e884a05f9":"Sangokushi - Game Boy Ban 2 (Japan) (SGB Enhanced) (GB Compatible)","73fca5b16e5d4d746ecabb8a9489cf48":"Tutti Frutti (World)","7455ea4fb9bc8ac752b4e43fd6864b7f":"Daiku no Gen-san - Kachikachi no Tonkachi ga Kachi (Japan) (SGB Enhanced) (GB Compatible)","745821122e423c09308ab2a97d645e20":"David Beckham Soccer (Europe) (En,Fr,De,Es,It)","748fa9419b35c0e8e43509457aaa1efa":"Game Boy Wars 3 (Japan)","74a6b62520a30ff28d5a7d19a7108c27":"Luca no Puzzle de Daibouken! (Japan) (SGB Enhanced) (GB Compatible)","74a74cfede8c9024c918e9038b5da47c":"Judy's Adventure (World) (v11.3) (GB Compatible)","74b9b221c2b32147422144b327bd5f30":"Tomb Raider (USA, Europe) (En,Fr,De,Es,It)","74c9fe928dd97ae193e9f937ce340dcc":"Harvest Moon 2 GBC (Europe) (SGB Enhanced) (GB Compatible)","74f0ca3425914df4af3210541ff619c8":"Looney Tunes Collector - Martian Quest! (Japan)","74f1d01cd75c5aaad93289e417a10c08":"Neclaus' Quest (World) (GB Compatible)","750640c9102e5e8b09af80601012fb05":"Adventures in Carnal Hell, The (World) (En) (v1.02) (GB Compatible)","7510fe2592accfa6ccd4745612e64f88":"Saban's Power Rangers - Time Force (USA, Europe)","7542ec9b695d4fe38adfdaaa57364d83":"Pokemon - Goldene Edition (Germany) (SGB Enhanced) (GB Compatible)","7545b127e8998e1e299289d79673ef63":"Ruby & Rusty Save the Crows (World) (Beta 3) (GB Compatible)","75519c8b57cea3ac91133b3dec7658de":"Pocket Monsters Gin (Japan) (Rev 1) (SGB Enhanced) (GB Compatible)","756664aa0c9418b200946aa4e1dddf53":"Blaster Master - Enemy Below (USA, Europe) (SGB Enhanced) (GB Compatible)","75b4f10c02a6797ab77a3a9a8f6ee237":"Pocket Puyo Puyo-n (Japan) (Rev 2)","75b4faffd8e9c0277b911d1d0e6ece6a":"Gift (Europe)","75be6e3561908e705d9e790b34eddb4d":"Tony Hawk's Pro Skater (USA, Europe)","75d839dd6c9231fb0c3104ba0060756f":"Diver 94 (World) (GB Compatible)","75e614f3741f6c5ca34efc52a2b35ed5":"Super Donkey Kong 5 (Taiwan) (En) (Rumble Version)","75e8c977bea49b53a3f3219e4cc23daa":"Gekido (Europe) (Proto)","75ea1034b4b26358e74874ad5f33dce4":"Zelda no Densetsu - Yume o Miru Shima DX (Japan) (Rev 2) (Beta) (SGB Enhanced)","762954c946381fcc210bb19962fbfa1f":"Street Fighter Alpha - Warriors' Dreams (Europe) (Rev 1) (Proto)","762d6c94874d8ac894ad100c0a4b50ab":"Cannon Fodder (USA) (En,Fr,De,Es,It)","769f747801caa7ad653b74d3b62b43db":"Cavelon (World)","76a95fee3d90722fd935c7658512f5cc":"Game Conveni 21 (Japan) (GB Compatible)","76c04694db94b72afa78dd6612dfe4a9":"Bomberman Max - Yami no Senshi (Japan)","76e2195c8f2f35c5b88d73830bcb0a4c":"2003 Hali Xiaozi IV (Taiwan)","76fa4014bfbb0ee2b63267af7ac373f2":"Mr. Driller (USA)","77487f5bee8d40db42e7cd8800047919":"Spy vs Spy (USA) (En,Fr,De,Es,It,Nl,Sv) (Rev 1) (Proto)","7752b2476871760a8c00b06df93a89b7":"Guruguru Town Hanamaru-kun (Japan)","77724acf2c481f29e2edb1f538a47892":"Top Gear Pocket 2 (Japan) (Rev 1) (Proto) (Rumble Version)","77836df2b2ce5284e4dda233e118b914":"Zoids - Shirogane no Juukishin Liger Zero (Japan)","7784ff1a16b15e8e55a6b43159cc1774":"O'Leary Manager 2000 (Europe) (En,Fr,De,Es,It,Nl,Ca)","77893d4574b1013a0699c4199c271b8a":"Net de Get - Minigame @ 100 (Japan)","7792a07be51395a9f48043075c29c8d5":"Sanguozhi - Aoshi Tianxia (Taiwan) (Alt)","77c35992b64ab7f2642873a5f266ab79":"Muteki Ou Tri-Zenon (Japan)","781afd1e98b3743c835fcc16df624895":"Golden Goal (Germany) (En,Fr,De,Es,It,Nl,Sv) (GB Compatible)","782b88b1bf9768a2b1b139177a0c1c33":"Yu-Gi-Oh! Duel Monsters II - Dark Duel Stories (Japan) (SGB Enhanced) (GB Compatible)","7830328f323bd77d52a6985b1b10031f":"Metal Gear - Ghost Babel (Japan)","7877eb7a35465b50da15da1e4488663c":"Pokemon Gold (Taiwan) (En)","788cb84e59b3fbf571002cdf2220d845":"Super Fighters S (Taiwan) (GB Compatible)","789142292ee4dd3e2d55c444e04f58b4":"Cool Bricks (Europe) (Beta)","78959c37152e546c5c7c271ae418a453":"Daikaijuu Monogatari - Poyon no Dungeon Room 2 (Japan)","78b152baf4c60314eb96d4d433a3d8f3":"Back to Nature (World)","78f920f4e9174cd3382294129d30f373":"Snobow Champion (Japan)","7902c1e217d8a99d1f9d5b31fd1aa7e2":"Super Jacked Up Tomato Face Johnson (World) (v2.2)","79057202277940eb8a37257ebcb513c3":"POWA! (World) (Ja) (GB Compatible)","793c57f58d4e9c92088c333b129d1c7e":"Dear Daniel no Sweet Adventure - Kitty-chan o Sagashite (Japan) (SGB Enhanced) (GB Compatible)","7971c95ad9745fe20df52e03cd52f636":"Metal Gear Solid (Europe) (En,Fr,De,Es,It)","7984a4468bc3822caa6773075429ca74":"Lightseeker (World) (GB Compatible)","79aece8a042e4fa57aba9455c4d21a97":"Pocket Monsters Kin (Japan) (Rev 1) (SGB Enhanced) (GB Compatible)","79b84a54581ca90b245619522c09e523":"Roadsters (USA) (En,Fr,De,Es,It,Nl) (GB Compatible)","79b855a4daf613f1906f7bf423565c5e":"Minna no Shougi - Shokyuu Hen (Japan) (Rev 1) (GB Compatible)","79d382d378d49695e9867ede063eff17":"Roswell Conspiracies - Aliens, Myths & Legends (Europe) (En,Fr,De)","79e619a79be12b6ac59ae6d4602ffa5e":"Ronaldo V-Soccer (USA) (En,Fr,Es,Pt) (GB Compatible)","79f6386969a59d4974aece5dc7ed1f3f":"Razor Freestyle Scooter (USA)","7a0eadc011668df92933dec1e5b316b0":"Grimace's Birthday (World) (v1.4)","7a36423ec39604d7043336af71145010":"CyberTiger (USA, Europe)","7a58b84e406bd4df6b3c3b8807493aa8":"Pooh and Tigger's Hunny Safari (Europe) (En,Fr,De,Es,It,Nl)","7a826122ccc3818dce9a8e8db6d77edb":"Tom and Jerry in - Mouse Attacks! (USA)","7aa123c53442881d101036559e704dca":"Green Beret (Unknown) (Proto 1)","7acb577a59abc74234754569d49d854a":"Monkey Magic (World)","7b29bf304be1f747c83cf516239b9c61":"Pocket Bowling (Japan) (En) (GB Compatible)","7b312af167e073c60061d843198e724c":"GPC Rally (World) (v1.1)","7b4345daf8ebda416a84c5932bf817ec":"Godzilla - The Series (USA) (En,Fr,De) (GB Compatible)","7b5b0ba31464c55c6d6584e9288d6978":"Powerpuff Girls, The - Bad Mojo Jojo (Europe) (BJJX) (Proto)","7b671745f13bcc3abaa2d9351fc22f8f":"Tasmanian Devil - Munching Madness (USA) (En,Fr,De,Es,It) (GB Compatible)","7b82761db0d43066610abc5429e0d598":"Sanguozhi - Aoshi Tianxia (Taiwan)","7bbd65416ced257da963faa58536cf84":"Burai Senshi Color (Japan)","7bcf428844d32b279b7c25fb98f98a73":"Lode Runner - Domudomu Dan no Yabou (Japan) (GB Compatible)","7bf3b13931f2a50ebe071a18ea14f28b":"Gold and Glory - The Road to El Dorado (USA)","7c27756ee209e70e5d5c5b3e3cba01d1":"Taikong Zhanshi DX3 - Zuizhong Huanxiang (Taiwan)","7c513823f65b92a75e29067745839cc8":"Pokemon - Versione Cristallo (Italy)","7c700360a46f54796802ca7c7bf499c5":"Ganbare Goemon - Mononoke Douchuu Tobidase Nabebugyou! (Japan) (SGB Enhanced) (GB Compatible)","7c80aaf5cf8c1dfaea7a88b39b12c295":"Starseed (World) (GB Compatible)","7c8391e85de79338fc3ae4e5f72d5514":"Gunslinger (World)","7c95103dce318c28b5869984bee4cf8a":"Hightail (World) (Demo 4A)","7cbe6832545e4bea48f8f93b51451273":"Nv Wang Gedou 2000 (Taiwan)","7cf3670a8f345344e4789e41503d7da6":"Lucky Luke (USA) (En,Fr,De,Es)","7d15277dd347fa75d36e5f78a06a5504":"Daisu-ki (World) (v1.1.1)","7d54e3982090c614495c5f470a4cdd11":"Game Boy Camera Gallery 2022, The (World) (GB Compatible)","7d66c7afad2a454926a4d835276bf0ec":"Ghost of the Arcade (World) (v1.7)","7d78cacd5eee9569ebc1b85ff9f05c90":"Hamster Club - Awasete Chuu (Japan)","7d9585c947a7637703fb8ccd6a691ed7":"Top Gear Pocket 2 (USA)","7dae13af3d7373116e7c7558bc402bef":"Perfect Choro Q (Japan)","7de54692e7b42e945b318d20079a5efd":"Grand Theft Auto 2 (Europe) (En,Fr,De,Es,It)","7e0bc856feb59566d167350fc1a1775a":"Emperor's New Groove, The (Europe) (En,Fr,De,Es,It)","7e0df312ccd8f3e25bf3074e17d5aedf":"Worms Armageddon (USA) (En,Fr,Es)","7e32dc8b60413cfaa24f941691e545d2":"Megami Tensei Gaiden - Last Bible II (Japan) (SGB Enhanced) (GB Compatible)","7e35f36f4e91088ab85c4acee89e4157":"Ninja Master (World)","7e667e8c8aa169e5b1bd1e09ec4c0b91":"Swordsman on the Eternal Journey (World) (It) (v1.01) (GB Compatible)","7e6d077d50879c57ff70891aaa312e80":"Pop'n Music GB - Animation Melody (Japan)","7e8280463d7ac79662d8be587bb6b766":"Moorhuhn 3 - ...Es Gibt Huhn! (Europe) (En,Fr,De,Es,It)","7e9f03dcbf376fb935553684d6c7d8f5":"Medarot 4 - Kuwagata Version (Japan)","7e9fd020f578c846fa3ae1d39d0a4671":"Legend of Zelda, The - Link's Awakening DX (Germany) (Rev 1) (Beta) (SGB Enhanced) (GB Compatible)","7eb08ef6d67164251eeeabf537fedccb":"Pokemon Trading Card Game (Europe) (En,Es,It) (SGB Enhanced) (GB Compatible)","7ed224aa3117d2aee48ea72bacefd13e":"Slime's Adventure (World) (Proto) (GB Compatible)","7ee095116f1733dc6ba2b2de3f28f5ef":"Samurai Kid (Japan)","7efce91cccc497e6cd816508ddec3437":"Potbound (World) (Proto) (GBJam 10) (GB Compatible)","7f0d28d7c0268b55bb8682224c178308":"Doraemon no Study Boy - Kuku Game (Japan)","7f1830171eec29ac72ae976d4dfdfc65":"Frogger (USA) (Rev 2) (GB Compatible)","7f306f573ca9759fa2f7aa167ca2dd74":"Dance Dance Revolution GB 2 (Japan)","7f41fb9c4f9627828b6a1ae958a8c0a9":"Chaoji Yinsu de Xiaozi II - Super Sonik II (Taiwan)","7f6c3f5388d3bcc0d02e8a2ea0d5e988":"Doraemon no Quiz Boy (Japan) (Rev 1)","7f8c472f3c7bd1eec56a3bad10a2e94c":"Little Mermaid II, The - Pinball Frenzy (USA) (En,Fr,De,Es,It) (Rumble Version)","7f9dbafd6d16957e9687f89e33765f0b":"Network Boukenki Bugsite - Alpha Version (Japan)","7fa5a6dde384652120b46475b193dff9":"WWF WrestleMania 2000 (USA, Europe) (GB Compatible)","7fb36e36e1ba06bd222c31163213c426":"2002 Adventure Digimon 7 (Taiwan) (En)","7fbbfa00a51547639750e69ff802fa76":"Bugs Bunny et le Chateau des Catastrophes (France) (En)","7fd49763f6a8aceb6aea4cfe601a8b10":"Magical Tetris Challenge (Europe) (En,Fr,De,Es,It,Nl,Sv)","7fe77698974780fec4566d30d183a206":"PlayTime (World) (Proto) (GB Compatible)","8040970140b2e728a0078504c2bcd908":"Super Mario Bros. Deluxe (Japan) (NP)","8076243ea44e1885a9981682fe621eee":"Stars of Zureon (World) (Proto 1) (GB Compatible)","807c2f4a7698ee02ee06169a9e3423d9":"My Friendly Little Island (World) (GB Showdown) (GB Compatible)","808a86f3b113ece265bf882293310042":"Menghuan Moni Zhan II (Taiwan) (Zh)","809059ad595bec85ffc7ba37eba29204":"Pro Darts (USA)","809251d6205bc712211fbcab55190a3a":"Top Gear Pocket (USA) (Rumble Version)","809ec52e50279a174a4908e3ea46dcf6":"Game Boy Gallery 3 (Australia) (SGB Enhanced) (GB Compatible)","809fd84f0c8f4ace455ad40930aff59e":"Maus, Die - Verrueckte Olympiade (Germany) (Beta)","80cf4b05b2a0388a804e54f433cdd126":"Rugrats - Totally Angelica (USA, Europe)","80dd8c9ce55ee28c0a3ef44ea317ea17":"Croc (USA, Europe) (Beta 2)","8109642fb056dbf806c66acac8cfc0e4":"Cat Boy's Stellar Journey (World) (GB Compatible)","814042bfbc1ec31e5f992bde98ed613e":"X-Men - Mutant Academy (Japan)","81433716e1a23aefe5de0fc03ef55519":"Microsoft - The Best of Entertainment Pack (USA)","8150a3978211939d367f48ffcd49f979":"Tintin au Tibet (Europe) (En,Fr,De,Es,It,Nl,Sv)","816ce6275d9d5c78b8497e8d0b6a9ece":"Sylvanian Families 3 - Hoshi Furu Yoru no Sunadokei (Japan)","8187bb1e84f676f110bdf2166b4498d2":"Tiny Toon Adventures - Buster Saves the Day (Europe) (En,Fr,De,Es,It)","8190d7454206e1b8966c9b074eabc359":"Taikong Baobei (Taiwan) (Sintax)","81ae87adbbd59bd8bbb86040fbc530fe":"KnockOut (World)","81dd8a336e1b1b705235a7b20a536bc0":"Quest for Camelot (Europe) (En,Fr,De,Es,It,Nl) (SGB Enhanced) (GB Compatible)","81f4cbffbed0638f59a16203c07e364b":"Hamster Paradise (Japan) (SGB Enhanced) (GB Compatible)","81ff698f38896239d2d68fe1074038cc":"Daisu-ki (World) (v1.2)","820e0a19275fabc03fe619c42db47179":"Star Ocean - Blue Sphere (Japan) (SGB Enhanced) (GB Compatible)","821355e18a306e73ee015ab0ba8510b0":"Zelda no Densetsu - Yume o Miru Shima DX (Japan) (Rev 2) (Beta) (SGB Enhanced)","821f70db4753f0b59a798b9de91cecfc":"Sesame Street Sports (Europe)","825de040ea4dff66661693f8712b1bdb":"Legend of Zelda, The - Oracle of Ages (Europe) (En,Fr,De,Es,It)","8268ae026f73e834f52ee8291bb125b8":"Ultimate Fighting Championship (USA)","82880772ebd67b839c497dfe4308a0a0":"Jim Henson's Bear in the Big Blue House (Europe) (En,Fr,De,Es,It,Nl)","828fa006f4913138bfb964b6685e3463":"Silent Hill 2 - 20th Anniversary Demake (World) (Proto) (GB Compatible)","829da007514e8a1ccc7efe6a7ee5226f":"Barbie - Magic Genie Adventure (USA)","82bd1d9171e60f147d9eeea13ef07a12":"Pocket Monsters Geum (Korea)","82cf6939eb9f1b4da785d8abc321f5e5":"Shoot It (World)","82d17beb1aefd1b93621d6fa61dfa1cb":"Metal Walker (USA) (GB Compatible)","82f9d9b020099e908ef588e1a9de5bb3":"Wing Warriors (World) (En,Fr,Es) (EGS) (GB Compatible)","83087e1a3fa7160a59ee7e4f0b5c3671":"Hoyle Card Games (USA)","830af5154de56ec668db1dd661d4c661":"RunieStory (World) (GB Showdown)","8339e84709ea33723fd11ed2f3e1abee":"Tetris Adventure - Susume Mickey to Nakama-tachi (Japan)","8347efb46014904144d40510d5c9fa05":"Chi to Ase to Namida no Koukou Yakyuu (Japan)","834fb201a446065c06e34f192f8586d0":"Dragon Tales - Dragon Wings (Europe)","83b67b8a10f704a9e3e7ca3814e5b3ca":"Mr. Nutz (Europe) (En,Fr,De,Es,It,Nl)","83ba49181a4eeb41e9628546a2dede19":"GPC Rally (World) (v1.0)","83c090899d4f9d7249249d7f8ec6be09":"Wing Warriors (World) (En,Fr,Es) (Beta 1) (GB Compatible)","83e34702e7c38cd36b506d1084e5ab97":"Monster Traveler (Japan) (Possible Proto)","83f1b6f79b8f0fecc4427efc9fa7d732":"Classic Bubble Bobble (Europe) (SGB Enhanced) (GB Compatible)","83f1f765efdd8d41cdd4f63edce42aff":"Grinch (Japan)","83f735d3357a32576516f6e20b5b7f19":"Rockman X2 - Soul Eraser (Japan)","83f791645ce282093a9d59c121ffc49d":"Mario Golf (USA)","840e1ddb2696ecae487fd264a3c34581":"Perfect Dark (USA, Europe) (En,Fr,De,Es,It) (Rumble Version)","842b07d0add5a3a88bd55653331671dd":"Hello Kitty no Beads Factory (Japan) (SGB Enhanced) (GB Compatible)","84973a134e9e4245d8138ac11807ca3f":"Get Chuu Club - Minna no Konchuu Daizukan (Japan) (Rumble Version) (SGB Enhanced) (GB Compatible)","84a0fe6c3fb014cf43c119c344f99965":"V-Rally - Edition 99 (USA) (En,Fr,Es)","84b71ee450ba95087d2194d17dd3bf1f":"Sanrio Timenet - Mirai Hen (Japan) (Rev 1) (SGB Enhanced) (GB Compatible)","84ee1ac070c9695b6d422adb5525db85":"Top Gear Pocket 2 (Japan) (Rumble Version)","84eede6bb298dd354f251eccb1259316":"Pocket Music (Europe) (En,Fr,De,Es,It)","852d68f167a5957f5e73954763f36ada":"Pokemon Pinball (Japan) (Rumble Version) (SGB Enhanced) (GB Compatible)","853eb2ec6feb27869b7af78f929fe7d2":"Legend of Zelda, The - Link's Awakening DX (USA, Europe) (Rev 2) (Beta) (SGB Enhanced) (GB Compatible)","8565f7b388a1741fe41a8c972d95869e":"Barbie - Avventure nell'Oceano (Italy) (GB Compatible)","85bbad46380dffa631f8ce732e9c5d89":"Spider-Man 2 - The Sinister Six (USA, Europe)","85be569fe89f58c40f60480313314c67":"Pocket Monsters Kin (Japan) (SGB Enhanced) (GB Compatible)","85c0c028e6177cda40401f14d16699f4":"10-Pin Bowling (Europe)","85e78f08c579b8c1d2e4c205a7711494":"Yurivania III - Circle of the Polycule (World) (v1.4)","8624db7ac6f7040b9001a87cc44f1fa9":"Legend of Zelda, The - Link's Awakening DX (France) (Rev 1) (Beta) (SGB Enhanced) (GB Compatible)","86316563964ab9314350c99765a2454d":"Xiao Taiji - Shenhua Lixian (Taiwan)","8632a46ba831eff50d1ac5fb00faab84":"Nyghtmare - The Ninth King (World) (v0.2.6) (Beta)","866994b67b78c02b70573076b27d18fb":"Space Invasion & Karate Joe (Europe)","866dca02365fd72f9ad396dca758d8b5":"Who Wants to Be a Millionaire - 2nd Edition (USA)","867971b1e3b751a6b736d03793241176":"Tweety Sekaiisshuu - 80 Hiki no Neko o Sagase! (Japan)","8691333d9fd10c3bc65bc5577856a72b":"VOX (World)","869d388027e0498e3d9994b0dc71984a":"Ken Griffey Jr.'s Slugfest (USA)","86c1b5f04495e22eedbec15e1a320ff3":"International Karate 2000 (Europe)","86cc962b8a8d51b589d86b2b71bd7e23":"Catwoman (Japan) (Proto)","86d769e211c85c1ac956c4556e77f8f3":"Powerpuff Girls, The - Battle Him (Europe)","86ed74283fe0071f8d3f05923051efab":"Revelations - The Demon Slayer (USA) (SGB Enhanced) (GB Compatible)","8707ad4ad9645d2dcfb33821697173a6":"Ganbare! Nippon! Olympic 2000 (Japan)","87397db3151f3dd5b53cdfbb24a98588":"Antz Racing (USA) (En,Fr,De,Es,It,Nl)","87422721dd67b96736861358c71d5a8b":"Tonka Construction Site (USA)","87599b7f88ae1680b490251cfd417792":"Test Drive 6 (Europe) (En,Fr,De,Es,It) (Sample) (GB Compatible)","8765ee1fe94c16e934ea0d004291e8b0":"Portal Runner (USA)","87a6f7ccb23054b225998225b5ea4089":"Nyghtmare - The Ninth King (World) (Free Version) (GB Compatible)","87a9da6697ed8695141f0ef84a0e26e8":"NBA Jam 2001 (USA, Europe) (Beta)","87b211fe7e0b8080961ddd26245ca1a5":"Pro Pool (Europe) (En,Fr,De)","87c5862edce9eae3d6afe964bfed5204":"WWF Attitude (USA, Europe)","88206c0a37bc9c6d42745211e0c18681":"NBA Show Time - NBA on NBC (USA) (Rev 1) (Proto)","882a7b4d2cadedd7ed2e21d22ca8f93d":"Daffy Duck - Fowl Play (USA, Europe) (GB Compatible)","88938327f7a5a8d11470d14d17f412b3":"Momotarou Densetsu 1-2 (Japan)","889e643c52ca6916a4948f4d1b8b955b":"Bouken! Dondoko Shima (Japan)","88babaabfc8c65454dd11590ff5c9f33":"Waternet (World) (GB Compatible)","88e01db4aee70b3c48324f991d149a2a":"Sylvester & Tweety - Breakfast on the Run (Europe) (En,Fr,De,Es,It,Nl) (GB Compatible)","88ee129f5f61078d8649e2134b2e78a3":"Robot Poncots - Sun Version (Japan) (SGB Enhanced) (GB Compatible)","88f1e88f141ded3b81d0d8789cbe7b5c":"Shuihu Shenshou (Taiwan) (Alt)","890733af5a3766bc1954c186d8f9ba65":"2003 Shuma Baolong - Gedou Ban (Taiwan)","8907aab5acf0ed74753d6f573e81be91":"Boarder Zone (USA)","890cc599a9ec49d5adf1cd225ebd233c":"Woody Woodpecker Racing (Europe)","8920d396b06f733dedc512007f4ef60a":"Chumbles Bumbles (World) (v1.2) (GB Compatible)","8931758738e8a662c88910fd2d33d365":"Pokemon - Crystal Version (Australia)","8940ba032d30f87e6956fbd8009420e3":"WCW Mayhem (USA, Europe)","89bb59dc49b59b0cd30b7384d9860bb8":"Pokemon - Versione Oro (Italy) (SGB Enhanced) (GB Compatible)","89d563bcc7b6f2f087cdafa8a78a8aa7":"Gex 3 - Deep Cover Gecko (Europe) (En,Fr,De,Es,It)","89de435cb69325b42d569015ca09f49f":"Barbie - Ocean Discovery (USA) (GB Compatible)","89de6d072a545f21fb6390f3b9e007d9":"Beach'n Ball (Europe) (En,Fr,De,Es,It) (Beta)","89e7aaec31f7d725864ecd9ebd47387a":"2003 Pocket Monster - Carbuncle (USA)","89f251b40b2420ae1dde4d22ca01ed72":"Tabaluga (Germany) (GB Compatible)","89fff31f11da93a6f1a3045f8ea088b3":"Tycoon Tex (World)","8a0bf3dec344271e01979cee50299897":"Crazy Climber (USA) (Proto 1)","8a626340f6b16ba45c1d4e07f2134875":"Pokemon - Edicion Cristal (Spain)","8a7f483857e251d56a16594ca84d1a7e":"Resident Evil Gaiden (Europe) (En,Fr,De,Es,It)","8ac8f913b5f1e31582de191b367648a9":"Hunter x Hunter - Kindan no Hihou (Japan)","8acdfec71941940bcb1410143254228f":"Snooze (World) (GB Compatible)","8aeedaab8a1df0bc26fae53b2b606b1f":"Qunxia Zhuan II (Taiwan)","8b01ed48b1f51f57cfba2f3024fa60d8":"Wings of Fury (USA) (GB Compatible)","8b071ddfa74c3969320acc839a03395f":"Shuma Baolong - Koudai Ban (Taiwan) (Alt)","8b25ad9bd8ecd09a346c736011ea612b":"Mahjong Quest (Japan) (SGB Enhanced) (GB Compatible)","8b3958e2d61921c787c9a40f4d3f13c0":"NBA in the Zone 2000 (USA)","8b437e964ca98e785010160160cf380a":"Super Gals! Kotobuki Ran (Japan)","8b6e5d99ca3267b8a22dbdef0f50565a":"Munch It (World)","8b8064a09b8fc56182ab423ebad9381b":"Looney Tunes Racing (Europe) (En,Fr,De,Es,It,Nl)","8b9a9f5125206b262348356be15bf598":"Inspector Gadget - Operation Madkactus (Europe) (En,Fr,De,Es,It,Nl)","8bf8f9a1e0080d257820ec5506a3fc8f":"Mat Hoffman's Pro BMX (USA, Europe)","8c0212d475d0ac89e5821291abf87816":"Return of the Ninja (World) (Limited Run Games)","8c188939044778f311bdaf2bc9aca076":"Tsuri Sensei 2 (Japan) (SGB Enhanced) (GB Compatible)","8c3bcd751ebc34abc02e666d8ff057c4":"Front Line - The Next Mission (Japan)","8c41132cb09279febe26e21bd3f1a120":"Primera Division Stars 2001 (Spain) (Proto)","8cbb9b7401be513c913a3a54eee0da54":"NBA 3 on 3 Featuring Kobe Bryant (USA) (SGB Enhanced) (GB Compatible)","8ce641b1efbf76cc5f2a841942345a0f":"Kawa no Nushi Tsuri 4 (Japan) (Rumble Version) (SGB Enhanced) (GB Compatible)","8d0a97cc2c5235656e722b0fb9627504":"Wizardry II - Llylgamyn no Isan (Japan) (En,Ja)","8d222a58636551f679177e37c83eb134":"Nakayoshi Pet Series 5 - Kawaii Hamster 2 (Japan)","8d2a6b487aade7ca05696548c2efb181":"Minna no Shougi - Shokyuu Hen (Japan) (GB Compatible)","8d4b4907e207a824a065b0012b22c62c":"Doug's Big Game (Europe)","8d4e41eb71dda41ef945512eb3b53fb3":"Bugs Bunny - Crazy Castle 3 (Japan) (GB Compatible)","8d9c413f30885be0bb0fe08a1817c842":"Pocket Bowling (USA) (GB Compatible)","8db0381e11b2acb529d6534b97ab967b":"Rockman (World)","8dbab7618855360b2029bdf2841067ab":"Loppi Puzzle Magazine - Hirameku Puzzle Dai-3-gou (Japan) (SGB Enhanced, GB Compatible) (NP)","8dc38a2906306949576e60b8d4babc5f":"Sweet Ange (Japan) (SGB Enhanced) (GB Compatible)","8dfe7db1a07feae65f521a4403ba9d8e":"Larion's Tinker Toys (World) (Proto 1)","8e1c9863cf7ad15c824f2af6acf130c4":"International Rally (USA) (SGB Enhanced) (GB Compatible)","8e23226758be3ae7a83803f9147ada5e":"Jimmy White's Cueball (Europe)","8e7298d92bd4eaec572a7f1bcb223200":"Deadly Skies (Europe) (En,Fr,De)","8e79dcdee0e15ef069b3f376a0fee37d":"Dragon Warrior Monsters 2 - Tara's Adventure (USA) (SGB Enhanced) (GB Compatible)","8e7d7b91c08169d779fda0a49c4dd3b7":"Hamunaptra - Ushinawareta Sabaku no Miyako (Japan)","8e8b42b33f5c0867a9bcaf8374fdc337":"Dragon Ball - Final Bout (Taiwan)","8eb8951d69263571392192bf3d928099":"Space-Net - Cosmo Red (Japan)","8ee55a0ad476a0497a483a30c0b28316":"Mr. Driller (Europe)","8f293537e992cb718f0d055c6d08f882":"Pocket Color Block (Japan) (En) (SGB Enhanced) (GB Compatible)","8f3a309320bceffbee2b430e5bb5de4f":"Pocket Smash Out & Race Time (Europe)","8f43bc56783f98e97fe7f51603c1a025":"Oide Rascal (Japan)","8f490735c17b983c2e2fbc3a9425ffe7":"Ungrateful Son, The (World) (v1.1) (GB Compatible)","8f569486abff8a5a5356956f4fe47212":"Pact, The (World)","8f9c21b8e8ff2cd19c1cfd9743d5509e":"Yixing VS Tiexue Zhanshi (Taiwan)","8fbc58ce16cc0c571eb43a8038c97e83":"Colin McRae Rally (Europe)","8fd828532500c3d3e893fe86b725ade3":"Pac-Man - Special Colour Edition (Europe) (SGB Enhanced) (GB Compatible)","8fe6340c822daa9cb07c7d8ab8509751":"Project S-11 (USA)","8ffcf9da76aa9ba1c5b1789a92f47d21":"Midway Presents Arcade Hits - Moon Patrol & Spy Hunter (USA, Europe) (GB Compatible)","900f66d94349339d3b416b5ff0806314":"20 Second Platformer, A (World) (v1.1) (GB Compatible)","9017ebe4c004fd9597557e28d711316a":"NSYNC - Get to the Show (USA)","90280833c156e2ca8e4eaa29adf369b2":"Shadowgate Classic (Europe) (En,Fr,De,Es,Sv) (Rev 1) (GB Compatible)","904929235f090aa2c875a10f6f5d5e64":"Katakis 3D (Europe) (Proto)","906c78f13135691d300aa6d23dc58037":"Space-Net - Cosmo Neo (Japan) (Proto)","9094e49551e838184d0c9290b1ef3694":"36 in 1 (Taiwan) (SL36-0032)","90c8448a9a4edf4ea6a265d5b4560191":"Dragon Ball Z - Guerreros de Leyenda (Spain) (Beta) (All Unlocked)","90d9ddb15cc652fcd3a158a54ece8808":"Xtreme Wheels (Europe)","90dfd51f7a508a4fac1608fb7a44317f":"Seme COM Dungeon - Drururuaga (Japan) (GB Compatible)","90e6f6d8989d241d386bb1c021687099":"Potbound (World) (Proto) (GB Compatible)","90eb27deb7ab0aaae19c393690e234c0":"Gedou Qi Long Qiu 2002 (Taiwan) (Zh)","90ecc5fb29cc95d58c33d44fe630d12e":"Puzzle Master (USA) (GB Compatible)","90f41034a9d4928bdf4b56d2e5c9b62c":"Fire Ant (World)","90fb966cbb46d038ec7d74b2f3f6487f":"Tintin - Le Temple Du Soleil (Europe) (En,Fr,De) (Beta)","9108d1246f11d0e0f2cec608e79efd65":"Puzzled (USA)","9146fdd44befde06269c9c1642678c94":"F-1 World Grand Prix (Japan) (En) (Beta 1)","916042289eeb231324ccd9bc57c7c254":"Taxi 2 (Europe) (En,Fr,De,Es,It,Nl) (Proto)","916d740fc366ecbf9e5626218e56562d":"Wetrix (Europe) (En,Fr,De)","917ec38fa03325cbbd527ac3465611c1":"Legend of Zelda, The - Link's Awakening DX (France) (Beta) (SGB Enhanced) (GB Compatible)","91889ebca9b20510ece17eabdf2f071a":"Suske en Wiske - De Tijdtemmers ~ Bob et Bobette - Les Dompteurs du Temps (Europe) (Fr,Nl) (Beta 2)","919c330030214de201278fc6a232a661":"SD Hiryuu no Ken EX (Japan) (SGB Enhanced) (GB Compatible)","91eb6db42e92e2df05cc2b40f0dbc2f0":"Gex 3 - Deep Pocket Gecko (USA)","91fd1e446ef8af51080409b7940391e9":"Toonsylvania (Europe) (En,Fr,De,Es,It,Nl)","921074a40d44b70db878f88f7c3b51de":"Bomberman Selection (Korea) (Beta 1)","9253aae0d9257d82f52d879813cf3c19":"Turok 2 - Jikku Senshi (Japan) (GB Compatible)","92637d816181b2515f2c78f30fa41e4e":"Jibaku-kun - Rei no Itsuki no Kajitsu (Japan) (Proto)","92978c96b2368e4aebd84966af8bd06f":"Pop'n Music GB - Disney Tunes (Japan)","929b5bfc4506e14d4abe958091af9cbe":"Adventures in Carnal Hell, The (World) (Es) (v1.02) (GB Compatible)","929b9a2332cb7c1d74692c3a65ffbe99":"Super 16 in 1 (Taiwan) (En) (Sachen)","92d36245a65305a209700608971b0597":"Trade & Battle Card Hero (Japan) (SGB Enhanced) (GB Compatible)","92e01e78a83c86c22ee1dcbbf4c7c2f4":"Monopoly (Japan) (SGB Enhanced) (GB Compatible)","93226ce541766d8b8b7d1f70866ad530":"Austin Powers - Welcome to My Underground Lair! (Europe) (En,Fr,De,Es,It)","9324855fef2227a4410725ed20845bfb":"Dragon Ball Z - Guerreros de Leyenda (Spain)","9354cc341aa23da3e29829da76b8888e":"Shin Megami Tensei Devil Children - Shiro no Sho (Japan)","9357c3dab850692ac8184ccf655d4efd":"Pokemon - Versione Argento (Italy) (SGB Enhanced) (GB Compatible)","9361a8850493dcfd7209b16052c8f9f0":"Xin Shediao Yingxiong Chuan (Taiwan)","93644489ccccff6f5fbe1489fa67b0e4":"Raffles (World)","93671715c210c20ce3a6a1d47de86382":"Equestriad 2001 (Europe) (Proto)","93d1eae88ac42199afa4e45a9900182d":"Retro Quiz Tower (World) (v1.2) (GB Compatible)","93dbee715a523e2081a17c44d7a16459":"Pokemon Trading Card Game (Europe) (En,Fr,De) (Rev 1) (SGB Enhanced) (GB Compatible)","93ff3f6b4bfe0a138d8a8897899e8cb0":"Quest - Brian's Journey (USA) (GB Compatible)","943d6c35c9b43494b90ffbde49eac53f":"Merlin (Europe) (En,Fr,De,Es,It,Nl)","9462bc81907e38c59acccd739690e6f9":"Pokemon - Edicion Oro (Spain) (SGB Enhanced) (GB Compatible)","94716503c16f0387f9f78962bca5b30c":"Microsoft - The 6 in 1 Puzzle Collection Entertainment Pack (Europe) (En,Fr,De,Es,It)","947f96cfd5bab7a03ec2f3fc0ae9238d":"Dragon's Lair (USA, Europe) (En,Ja,Fr,De,Es,Zh)","948f4ff45e8c3a7cd94c08aeac6dbef5":"Forest of Fallen Knights (World) (GB Compatible)","94a53f23bf6200905006082508ea43bf":"Bubble Trouble (World)","94ae7f7e9135b2ba30365e91030a8779":"Mount Vesuvius (World)","94cdb66509527746395b3eed6b16fd73":"2003 Crash II Advance (USA)","94d2aa3fbda301f9c0d0c16e00743183":"Commander Keen (USA, Europe)","94e1575453f54cbe157d13eae6e78d92":"MTV Sports - Pure Ride (USA, Europe)","94f4306cb0c27686661e37a96eef730b":"Chee-Chai Alien (Japan) (Rumble Version)","9562a0aad16857f2f1a8e4169163c18a":"Looney Tunes Collector - Martian Alert! (Europe) (En,Fr,De,Es,It,Nl)","956b38b3692985fbd2850d8983916ddb":"GameShark MX (USA) (v1.02)","957b3a018cd37a886ea3d0f956e966b0":"Wing Warriors (World) (En,Fr,Es) (Kitmaker) (GB Compatible)","958670daeccc225fe23e74a60be59541":"G.B Corp. (World) (Beta) (GB Compatible)","95b284df7ba2f862406f747b4ca7c380":"Qix Adventure (Europe)","95de0eb82c6013224a449fd972006d6f":"Gremlins - Unleashed (Europe) (En,Fr,De,Es,It,Pt) (Beta)","967488fc18b9ee5140c33090fedd7a79":"Powerpuff Girls, The - Paint the Townsville Green (USA)","96935055414491738c463c19081aaa90":"Zhong Zhuang Ji Bing (China) (Pirate)","96a21eff22c8e465cd2c730763aea541":"Canoe Slalom (World)","96ada1aaa3214b4f6ee5c77f7dc61a26":"Skelby (World)","96d2795fd83f03986c5142ec288d384e":"Pumuckls Abenteuer im Geisterschloss (Germany)","96d2f46187d1eee4a7e0253e1f51c7aa":"Triple Play 2001 (USA, Europe)","96d365425eb1134944e1255f0ade1fd7":"Blaze (World)","974d6664dc7114e637c2c1cc2f252724":"Austin Powers Episode IV (Europe) (En,Fr,De,Es,It) (Proto)","975afeb42d4dca06ab6d0b029def64af":"Mountain Climber (World) (En,Es) (GB Compatible)","975b5b649d64fd2334cb69f81bca4c9c":"Sonic Adventure 7 (Taiwan) (En)","978ef3e4e41f9b5330f17cf9a6de9595":"Nakayoshi Cooking Series 5 - Cake o Tsukurou (Japan) (Beta 2)","979eb4fd473c344cb2cfc6ea4211ca5a":"Dragon Quest Monsters 2 - Maruta no Fushigi na Kagi - Ruka no Tabidachi (Japan) (SGB Enhanced) (GB Compatible)","97a3474440373af59774d611d5c52c27":"Owarai Yoiko no Geemumichi - Oyaji Sagashite 3 Choume (Japan) (SGB Enhanced) (GB Compatible)","97b6eb86385cc51fed8f65c6db04548a":"Yurivania 0 - Soul Night Prelude (World) (v1.3) (GB Compatible)","97f3fb212fabe26392d110c13e053173":"Top Gear Pocket 2 (USA) (Rev 1) (Proto)","986bcb950df452ade78fff94a83c56f3":"Cross Hunter - Monster Hunter Version (Japan)","9884397baf27070bf210138ac6b5c4e7":"Mission - Impossible (Europe) (En,Fr,De,Es,It) (Rev 1) (Possible Proto)","9889afc5b4e72c9f96db8e6b4260f6b7":"Hollywood Pinball (Europe) (En,Fr,De,It) (GB Compatible)","9896e3a34ae29d05dd0f5d2a298a75ad":"Ruby & Rusty Save the Crows (World) (Beta 2) (GB Compatible)","98ce3dda6530b382036478bf9850f1a1":"Quest Arrest (World) (v1.1) (Digital) (GB Compatible)","98f7778539e22307d074cf0abb37d05c":"Konami GB Collection Vol.3 (Europe) (GB Compatible)","991957a67a63f1e54bf34a3715402ca5":"Full Time Soccer (Europe)","995cebd28aaa5d94b8a230e9f22606b3":"Nakayoshi Cooking Series 4 - Tanoshii Dessert (Japan)","99825e86250ab53b5ea8ac702930919d":"Flintstones, The - Burgertime in Bedrock (Europe) (En,Fr,De,Es,It)","99c2598c7d38b14a35594083f8a20130":"Gedou Jian Shen - Soul Falchion (Taiwan) (En) (Alt)","99c7758531a1e79a1988f0d6ba26d3d4":"Race Time (Europe)","99ff6f711e458726eac291d560c82d10":"TV-Chan's Great Escape! (World) (Proto) (GB Compatible)","9a43179573d212b528d8f74da044511c":"Dragon Tales - Dragon Wings (USA)","9a8e8451edb7a0ce6b19ac89457cb3fc":"Tiny Grasshopper Goes Away (World) (En,Hu) (v1.2) (GB Compatible)","9a908fd85216b1b3a994ec75d2cf9318":"Hot Wheels - Stunt Track Driver (USA, Europe) (SGB Enhanced) (GB Compatible)","9aa127615d6f0de4ccc534774fe54c37":"All Star Tennis 2000 (USA) (Proto) (GB Compatible)","9abaf0dfeb58b76d6b5cce4b42756c8e":"Arle no Bouken - Mahou no Jewel (Japan) (SGB Enhanced) (GB Compatible)","9ae9d43fc7ec5570badf7a19ae006afd":"Naminori Yarou! (Japan) (NP)","9af19423c5fa3dbe4fdcc78d2bc7d1c0":"Pokemon - Version Or (France) (SGB Enhanced) (GB Compatible)","9af23c3cdf945b6a78f13dbaebbaefc0":"Ultimate Paintball (USA, Europe)","9afe57208b564946dec44244409a9a15":"Zidane - Football Generation (Europe) (En,Fr,De,Es,It) (Beta)","9b2d3dfd0f545b1ac8b10b25f9fbe56b":"Tom and Jerry - Mouse Hunt (USA) (En,Fr,Es)","9b3f141b7747d6d23bca68ec1ff7af35":"Ganso! Doubutsu Uranai (Japan) (Proto)","9b846e9a4eb6b80cdbc8e6c82f2b9e9e":"Ghosts'n Goblins (USA, Europe) (GB Compatible)","9b8869fa36562a32edec76717632875e":"Super Breakout! (USA) (GB Compatible)","9b9be252c3ac04112068db69c4c56512":"Zodiac (World)","9ba7b607ec310589c5ccfb1a8149df59":"Mr. Nutz (USA) (En,Fr,Es)","9bbe3cb922a017053d86d1355ee69794":"Doraemon - Kimi to Pet no Monogatari (Japan) (GB Compatible)","9bdc654fc8acb425fe4b68269928fbfb":"Robot Poncots - Star Version (Japan) (SGB Enhanced) (GB Compatible)","9c1cb86cccb4fa2bbc6137a81d92a3b1":"Return of the Ninja (Europe)","9c3800babd418a937f4429bbaaf2b81d":"Antz World Sportz (Europe) (En,Fr,De,Es,It,Nl)","9c3ae66bffb28ea8ed2896822da02992":"Pocket Monsters - Crystal Version (Japan)","9c6a9c38b987e50001153ad12eb5fcc8":"Hamster Monogatari GB + Magi Ham no Mahou Shoujo (Japan)","9ca299a1f1b3a62d4ef96ef9c9835442":"Neonsomnia (World) (v0.1) (Proto) (GB Compatible)","9cf5135bd746fa7f475c65f46e1ae2e1":"Repugnant Bounty (World) (v0.1.023) (Beta) (GB Compatible)","9cf75b247ec97b8838181ad75d5f983a":"Men in Black 2 - The Series (USA) (En,Fr,De)","9d1067c75dcbce5aacabacabb06b95c4":"Monster Traveler (Japan) (Rev 1)","9d2256a877d29f6b12a81d9961a33cea":"Elang 2003 - Mark of the Wolfs (Taiwan) (En)","9d238ed036bb656acf9765589119f68c":"Pro Mahjong Tsuwamono GB 2 (Japan)","9d2f7e1ac30a46456a841c264963e5ea":"Survival Kids 2 - Dasshutsu!! Futago-jima! (Japan) (SGB Enhanced) (GB Compatible)","9d319a32492c1f4964c244477f6188ea":"Gridtrap (World)","9d3bcec616f238ed41146a2ce94ab562":"Telefang - Power Version (Taiwan)","9d3e582f7a50cd50f37c848ba24ee382":"Tarzan (Germany)","9d5808671cdb4bd5d4e4f0c44d171d6e":"Feng Kuang A Gei III - Chaoji Zhadan Ren (Taiwan)","9d64f8607e9bc3e788f30fff123be448":"AirForce Delta (Japan)","9d79034c9b026f448f84f9898c6ccfd6":"Shadowgate Classic (USA, Europe) (En,Fr,De,Es,Sv) (GB Compatible)","9d80032f7d8dddb30aabf19455e9c6e3":"Mary-Kate and Ashley - Pocket Planner (USA, Europe) (GB Compatible)","9dcf58ce7c379a01c3288975e90624f3":"Jim Henson's Muppets (Europe) (En,Fr,De,Es,It,Nl,Sv) (GB Compatible)","9dd91576606411b753e4a722eb12f296":"Sylvanian Families 2 - Irozuku Mori no Fantasy (Japan) (Rev 1) (Possible Proto)","9de083ff607f9a8022fde52d598160e8":"Mary-Kate and Ashley - Winners Circle (USA, Europe)","9dece7202bd00a2806b36b5848ca985e":"Racin' Ratz (USA)","9e3d4ff0ba3d6deec5080f6dbed4fef8":"Fushigi no Dungeon - Fuurai no Shiren GB 2 - Sabaku no Majou (Japan) (AFMJ)","9e6624b386788a0cebd708f23701eadb":"Guzzler (World)","9e857e7a438acd2e8d9965f49dd21411":"Quest - Fantasy Challenge (USA) (SGB Enhanced) (GB Compatible)","9eb8be5600d2408352bf9ef32b91d1df":"Cubix - Robots for Everyone - Race 'n Robots (USA) (En,Fr,De,Es,It)","9eccd7d587ce52ebf90722dac7fb1eac":"Battle Star (World)","9f28e403eb338a7457f54dee7a6f443e":"Xtreme Wheels (USA)","9f2922b235a5eeb78d65594e82ef5dde":"Pokemon - Crystal Version (USA)","9f4382352a6fd43c844c3aced7cd842a":"Megami Tensei Gaiden - Last Bible (Japan) (SGB Enhanced) (GB Compatible)","9f6135616b201739af43236fcfd5c273":"Millennium Winter Sports (USA)","9f61847ddf25f5244257641bc971c1fd":"Puchi Carat (Japan) (SGB Enhanced) (GB Compatible)","9f77adbb0a6af7bd85d21a8ef9fdea49":"Fix & Foxi - Episode 1 - Lupo (Europe) (En,Fr,De)","9f7fbde333caa987d9069e6d993c4993":"Sam the Optimistic Hedgehog (World) (GB Compatible)","9f88bdc053b035240ff1478ca11e7c23":"Test Drive Off-Road 3 (USA) (Rumble Version) (SGB Enhanced) (GB Compatible)","9fde547bcb70b108895e259da4c4e100":"Spider-Man (USA, Europe)","9fe3162d87054504eb82113f7ae8d6f8":"Zelda no Densetsu - Yume o Miru Shima DX (Japan) (Beta) (GB Compatible)","9ff602e5ebc9be5b1f7ad6a637c35c9f":"Daisu-ki (World) (v1.2.1)","9ff78c16081934ee86be9c7e6c543da6":"Shuma Baobei DX6 (Taiwan)","a00012533e76649f4e7e1b7aa5a9ee07":"Lufia - The Legend Returns (USA)","a01026f30b0b0483f3c048b4eb2513ed":"Matel Gear II (Taiwan) (En)","a0361b10f4006f1fea4b21f5403b5b95":"Xiyou Ji (Taiwan)","a03e3cd1a2c78be11e3a52fe995cec71":"Nakayoshi Cooking Series 5 - Cake o Tsukurou (Japan)","a08b575b947d0249cdf214fc130706ce":"31-in-1 Mighty Mix (Australia) (31B-001, Sachen)","a0993894d9c1bb543caa7acbaf7ca5c0":"Hightail (World) (Demo 4F)","a0b4538f687fc61bc88f7ee111170355":"Tomb Raider - Curse of the Sword (USA, Europe)","a0ceaf6ebf640a48e2bf54478d2e4a63":"Mask of Zorro, The (USA)","a0f33ee506052fe421c741e81a395355":"Super Mario Special 3 (Taiwan) (En)","a0f537747bab3d8599281deae17ff47f":"Proof of Destruction (World)","a10a70354cc998e31f0b5fb27c471c37":"B-Daman Bakugaiden V - Final Mega Tune (Japan)","a11802247b7f38f508f71cb257ff76ab":"Taito Memorial - Chase H.Q. - Secret Police (Japan) (SGB Enhanced) (GB Compatible)","a119452d83b0a2e72bfc0ac706325667":"Mask of Zorro, The (Europe)","a1304bdefa239600bd6116081bae2e23":"Space Invaders X (Japan) (En) (GB Compatible)","a13623a452327ede4553ee2bd1b89a1a":"Magical Tetris Challenge (USA)","a173eb46ef11840b9318a8832828280b":"Gedou Jian Shen - Soul Falchion (Taiwan) (En) (Alt 2)","a18746b05badafb5b8456ace6ba3e65f":"Austin Powers Episode III (Europe) (En,Fr,De,Es,It) (Proto)","a18fcd9883846e35c507eb3ec98dcd73":"Towers II - Plight of the Stargazer (USA) (Proto 3)","a1cf50da360d45d78075ae48313a18fa":"Antz (Europe) (En,Fr,De,Es,It,Nl) (Beta) (GB Compatible)","a1d7687a557dd2a3948c9f498703f4a3":"Beast Fighter (Taiwan) (En) (Sachen)","a20d6884a7d6bc5610ef4078a72ce460":"Phantom Zona (Japan) (SGB Enhanced) (GB Compatible)","a2500f1123909abfa0b0a4fa33ef2905":"Powerpuff Girls, The - Paint the Townsville Green (Europe) (BPTX) (Proto)","a2623acf15ec36ab072ee5b92b88b613":"Sgt. Rock - On the Frontline (USA)","a26cfbd01895b12ad64b7191a607fc11":"Tony Hawk's Pro Skater (Japan) (Proto)","a28184f9cd3f24e67c3fb5d84b3aa78b":"Barcode Taisen Bardigun (Japan) (Rev 1) (SGB Enhanced) (GB Compatible)","a290f281cde7d00059e0e567bffb0d3b":"Hamster Paradise 2 (Japan)","a2a41746a1ec29a25d3e715342cb71f2":"Super Jacked Up Tomato Face Johnson (World) (Jam Version)","a2d07e7da188092c88ef6d9fd2e5eaa4":"LEGO Racers (USA) (En,Fr,Es)","a30b8e40344bcfbeb08110c79de4af14":"Black Bass - Lure Fishing (USA, Europe) (GB Compatible)","a31652b6d1e7fc647c4af7b9dfe05ff5":"1942 (USA, Europe)","a320f9de83767bb1bc1bbbc6fbd96011":"Mario Tennis (Europe)","a34819a548e7a1a2b8a6d1d5ed6e912d":"Wicked Plague (World) (v0.1.1) (Proto)","a3491f8e6f09dd5945448477d4b8f79b":"Zagan Warrior (World)","a35c0fa2e3b3d1c1779cd9f2352bc427":"Pokemon - Kristall-Edition (Germany)","a36188fae0070066ba5989cebaf2a1b6":"Joryuu Janshi ni Chousen GB - Watashi-tachi ni Chousen Shitene! (Japan) (SGB Enhanced) (GB Compatible)","a366feb4c07a1f70890d0bf3e13de38b":"Gamer Boy Mission (World) (GB Compatible)","a3799918a413d72787d4434935df2117":"Pokemon - Silberne Edition (Germany) (Beta) (SGB Enhanced) (GB Compatible)","a395cafa0678f64114e6a8577ed58bfe":"Usurper Ghoul (World) (v1.9) (GB Compatible)","a3c65d746e0e171843e9013e8d8e1021":"Tales of Phantasia - Narikiri Dungeon (Japan) (SGB Enhanced) (GB Compatible)","a41843374fe3bce0b61a641fafd6f415":"Laura (Europe) (En,Fr,De,Es,It,Nl,Sv,Da) (Rev 1) (Proto)","a42bfef360186003c6a8a617581a1155":"Pocket Lure Boy (Japan)","a455a70d52a9ffcfe8c4d8c164267500":"Super Impostor Bros. (World) (GB Compatible)","a456d96b9c3ed51cdf58369fc1f07880":"Pocket Puyo Puyo-n (Japan) (Rev 1)","a4a756be0d12c2ba7ca5a6420bb2198e":"E.T. - The Extra-Terrestrial - Escape from Planet Earth (Europe) (En,Fr,De,Es,It,Nl)","a4af66b229f3bed283f361275484d84d":"Tools of Nexaura (World) (Beta 4) (SGB Enhanced) (GB Compatible)","a4b4323b2786ddf738a0feedd912a909":"Vixen (World)","a4b695325ac28be2e388f5b9186987ba":"Antz (USA) (En,Fr,Es) (GB Compatible)","a4df533c6b9b3423f71385e68bd5c421":"Ojarumaru - Mangan Jinja no Ennichi de Ojaru! (Japan) (GB Compatible)","a4e6f256943c4b7f99a75b73bdd3a3e0":"Harbour Attack (World)","a537394fbf3378116a27a57ca6d588b7":"South Park (USA) (Proto)","a539a0ae1b1ed8034fc3a4733b4298c3":"Looney Tunes (Europe) (GB Compatible)","a539a7a02639395ad8d7723199c81eae":"Harvest Moon 2 GBC (USA) (SGB Enhanced) (GB Compatible)","a55b8d588bbaa4ebcb4d53dbb534329f":"Planet of the Apes (USA) (En,Fr,De,Es,It,Nl)","a562bbe876b8467cc530213ec84eba0a":"Gimmick Land (Japan) (Proto)","a57d5976214d5f8d52dae5faf4354abb":"Ms. Pac-Man - Special Colour Edition (Europe) (SGB Enhanced) (GB Compatible)","a594843d9a5b85cc8c673c6b97945ad2":"Rootin' Tootin' Cowboy Wizard Lizards (World) (Proto) (GB Compatible)","a5bc2e2ad58bbd78609478a60dcda8d7":"Harvest Moon GB (Europe) (SGB Enhanced) (GB Compatible)","a5be435543968412caac1fe7c914472e":"Wario Land 2 (Japan) (SGB Enhanced) (GB Compatible)","a5bfa8b98969ca67811ed2d7bfbf5535":"Spy vs Spy (Japan)","a5c6583784900008ea52b49761f035b8":"Swordsman on the Eternal Journey (World) (En,Ja) (v1.00) (GB Compatible)","a5d013a0066ee9874e88a1c455cc454a":"Kanji Boy 3 (Japan) (Beta)","a601e9009c88c7dcfac8aaea41dd45d8":"Super Chinese Fighter EX (Japan)","a62923faa62daf5e7e5363d238a1d32c":"Pokemon Gold Version 2 (Taiwan)","a649ef1410ae4c24020fb8b0113739e3":"102 Dalmatiner (Germany)","a67cb573673f041098f23f868a153019":"Noddy and the Birthday Party (Europe) (En,Fr,De,Es)","a680117a75204cc8c6f7f0d80f1d8f24":"Cat Jumper (World) (GB Compatible)","a68e210e9e08cfbcccb0350333b5ff4f":"Langrsr II (Taiwan) (En)","a6924ce1f9ad2228e1c6580779b23878":"Pokemon - Gold Version (USA, Europe) (SGB Enhanced) (GB Compatible)","a6d93b1626f127adecc65bb675672cdb":"Hajimari no Mori (Japan) (Proto)","a70b5728772725f9688f91330bc4fbda":"Wayfarer Boo - Pushing Through (World) (v1.1)","a721520df37c636ed924dbc268cdd753":"Micro Machines 1 and 2 - Twin Turbo (USA, Europe)","a7217c8338a2de76b9e50d09589f350a":"Second Edition Harry Boy, The - The Secret of the Chamber of Secrets (USA)","a72a4d45b155f4a41bd2613d0bb3f5fa":"Nyghtmare - The Ninth King (World) (v0.1.2) (Beta) (GB Compatible)","a767370eefdaad9831acb4c3c3258c44":"Hugo (World)","a779f9fd31f32e78d6b4cea27aa15541":"Project S-11 (USA) (Beta)","a7a083bd154392a188dc8ed62c145ea4":"Burger Paradise International (Japan)","a7a2c27cb6fc2c6cf67eb8af2b99c612":"Terrifying 911 (China) (En)","a7af89e99a4cbb2afbe08549088d8fda":"Forest of Fallen Knights (World) (Beta) (GB Compatible)","a7d2695b3ddc268389e36f916815f96d":"F1 Racing Championship (Europe) (En,Fr,De,Es,It) (Beta)","a7e34f3cf77e1df0ef8896a712d7ca82":"To The Stars (World) (GB Compatible)","a7edd8b2fc42450a4ee4874fa67c24de":"Dragon Ball Z - I Leggendari Super Guerrieri (Italy) (Beta) (All Unlocked)","a7f23a751078922169df0f73a1db1564":"Nakayoshi Cooking Series 1 - Oishii Cake-ya-san (Japan)","a87e78da9b5d0d937dd67ddeb970700a":"Baiwan Dafuweng - Jin Ban (Taiwan)","a881f04dee6d67c7bc4be388e247a6fe":"Haunted (World) (GB Compatible)","a8ea5b8df744d028e681f9b608cff68a":"Skycon (World)","a8ee3ff6fbce24d27334cf532a000206":"Pokemon Diamond (Taiwan) (Zh)","a9049c52dd706737a6515822739db1c9":"Hunter in the Lost Forest (World) (En) (GB Compatible)","a9401fbd85e48cf0105ea3aabaf012a2":"Pocket Monsters Diamond (Taiwan) (En)","a94939498326beaec405d3947a7ce2df":"Robin Hood (Europe) (En,Fr,De,Es,It,Nl)","a94a1c6268555926ca1a3b439a2fb65c":"Dragon Ball Z - Densetsu no Chou Senshi-tachi (Japan)","a95f4953766e427456f1f991bb3143dc":"Dragon Ball Z - Guerreros de Leyenda (Spain) (Beta)","a96e95e150e34db6080724c5eeec1348":"Pop'n Pop (Europe)","a9847d8a5683cbcacd7e45e2762c365c":"Princess Poffin and the Spider Invasion! (World) (GB Compatible)","a9a4d4db13b2c35f0e260bf067087055":"Burger Burger Pocket - Hamburger Simulation (Japan) (SGB Enhanced) (GB Compatible)","a9cc81bffb2d1d3a9caa38f04e6f6c1d":"Gute Zeiten Schlechte Zeiten Quiz (Germany) (GB Compatible)","a9d2f36d6c2a334e0b2261c57c20f0d4":"Turok 3 - Shadow of Oblivion (USA, Europe) (En,Fr,De,Es)","a9da27b4eb19db857d3040b6cd1d2328":"Capcom Fight 2003 (Hong Kong) (En)","a9ee6c9625c9bd187bc7fd90df3a4fc4":"Loppi Puzzle Magazine - Hirameku Puzzle Dai-2-gou (Japan) (SGB Enhanced, GB Compatible) (NP)","a9ee7c9fcfe647a75d9f0ce4dde1b64d":"Thunder Blast Man (Europe) (Sachen)","aa0ccc0c4d2472b5fb657aba003efb81":"Daffy Duck - Subette Koron de Oogane Mochi (Japan) (GB Compatible)","aa1bf5ff55e7106b496850e3c6cf7c14":"Tsuriiko!! (Japan)","aa2b420b9eca7479f83423c46b106823":"Cuthbert in Space (World)","aa7235fbdf5f0c7fb5a67bc6d24dd4df":"Micro Maniacs (Europe)","ab00def91c7d2f6d29d3f0c629102033":"GB-Wordyl (World) (Kw) (GB Compatible)","ab2ebc72473b5669dbcfe4d29081c18b":"Fengkuang Dafuweng (Taiwan) (Alt)","ab3245958e1ddea3209841c62ca8448e":"Bob et Bobette - Les Dompteurs du Temps (Europe) (Fr,Nl)","ab38e871b66ee8ad1bb8ea7d92934fd1":"TG Rally 2 (United Kingdom)","ab44aacb4e4c17f5815a8ee1444045fa":"Shi Mian Maifu - Fengyun Pian (China)","ab58102005b510a2d905ed7de9d6267a":"Densha de Go! 2 (Japan)","ac1f4ad52996882c60ce83cac01e9ccf":"Power Quest (USA) (En-US,En-GB,Fr,De,Es,It) (SGB Enhanced) (GB Compatible)","ac2985f193cf8acc1d1cc5124fc2e406":"Nyghtmare - The Ninth King (World) (v0.1.9) (Beta) (GB Compatible)","ac29eaef5fc03f8dd08215a8e162cd2e":"Airwolf 16 (World)","ac2a045c58145b030f9ed61f526fc233":"Capcom vs SNK - Millennium Fight 2001 (Taiwan) (En)","ac38dfd19646ca6e143024d699145c70":"Stuart Little - The Journey Home (USA, Europe)","ac3dfc02635524fbb01dcacd2db3d066":"RPG Tsukuru GB (Japan)","ac46bc779e1e844674de1d4c13d06f96":"Dragon Ball Z - Legendary Super Warriors (USA)","ac812a2c6eaf743efd64972d8fa5a3c4":"World Soccer GB 2 (Japan) (SGB Enhanced) (GB Compatible)","acb10288f383c6b475e11e936aa56c70":"Dino Breeder 3 - Gaia Fukkatsu (Japan) (SGB Enhanced) (GB Compatible)","acb6b136fa26888d42b5f95871a75eaa":"Klustar (Europe) (En,Fr,De,Es,It) (GB Compatible)","acb82a5584f830d6d7bc33f4827571b9":"Xena - Warrior Princess (USA, Europe) (En,Fr,De,Es,It,Nl)","acd26c013ffa1c3a7905be69dd79c67c":"Zoids - Jashin Fukkatsu! Genobreaker Hen (Japan) (Rev 1) (SGB Enhanced) (GB Compatible)","acfa3540921a88cae136da1040ca2302":"Tweety's High-Flying Adventure (Europe) (En,Es,It)","ad2dd8db576cf8aa1262cca24df6ff59":"Exploits of Fingers Malone, The (World)","ad358f284c3303db01212016ed3944d5":"Bomberman Quest (USA) (SGB Enhanced) (GB Compatible)","ad37726c92f43ad7915225b7eaf94ffd":"Heroes of Might and Magic II (USA) (En,Fr,De)","ad380d123ed38ecc6a8068f61602daf7":"Gods of the Universe (World)","ad945d22680a6b2a149079cb564a238e":"DryMouth (USA)","ada59e7dafe1a6b70add7020959c1b23":"Sesame Street - The Adventures of Elmo in Grouchland (Europe) (GB Compatible)","adb95251cfd973f8245e6a869925d6da":"Test Drive Le Mans (USA) (En,Fr,Es)","adfb8d9dc0d5633b1c385be79f3b425f":"Kettou Transformers Beast Wars - Beast Senshi Saikyou Ketteisen (Japan) (SGB Enhanced) (GB Compatible)","ae0a7c2524b627b354098078def54f18":"Xtreme Wheels (Japan) (Possible Proto) (NP)","ae29aed4e24109e18ffe893da6b77fee":"K.O. - The Pro Boxing (Japan)","ae7dd19e6e8b3130498e4a27476e2931":"Outward (World)","ae9b4ed5cd8c80029a3c01096963ee19":"Pitfall GB (Japan) (GB Compatible)","aeb6ac2b389cef6e6133461b38474a7e":"Castlevania - Demon Castle (World)","aeeb6c737c55d4a4d0691e27ec831eec":"Max Steel - Covert Missions (USA) (En,Fr,De,Es) (Proto)","aeec41031271f75b5e0b1d132b8a4505":"Powerpuff Girls, The - Paint the Townsville Green (USA) (Rev 2)","aef3a27b97dd65b17a9c7263eff11322":"Game Boy Wars 2 (Japan) (SGB Enhanced) (GB Compatible)","aef66e8a7c75323ae0981ff5a20722a4":"Pocket Puyo Puyo-n (Japan)","aef9b41fbc898a58fd2aaaeabc2787e9":"Mobile Trainer (Japan)","af157e560d1ff87970c1bd2ee90d0932":"Magical Drop (USA)","af1d1e17a5c568df796f4004be872649":"Xtreme Sports (USA)","af4565bf1ea33c785fc9e05be2a9bad0":"Robot Wars - Metal Mayhem (Europe) (En,Fr,De,It,Nl,Sv)","af584eea2b34afdbb6193348ecb58f11":"Janosch - Das grosse Panama-Spiel (Germany)","af8e059196fcdd29cc0fc417d3abf9ff":"4 in 1 + 8 in 1 (World) (4B-007, 4B-008, 8B-004, Sachen)","afd4ae2f42da36ddb740fa6a5b06d74e":"Shantae (USA) (Beta)","afd9281eac1eacd73c200cbc69f57b9e":"Power Spike - Pro Beach Volleyball (USA)","afe14eef683f3eb910b67ea2e3feb124":"Mage and the Grimoire of Beast (World) (En) (v1.01) (GB Compatible)","afe51a74c6967711ddd263e3998b7afd":"Jim Henson's Bear in the Big Blue House (USA) (En,Fr,De,Es,It,Nl)","afeec69d5ba3afa3ce2279fcda944576":"Prince of Persia (USA, Europe) (En,Fr,De,Es,It) (GB Compatible)","aff1aa8c293dc5e26fa704eb1693dc0c":"Mission - Impossible (Europe) (En,Fr,De,Es,It)","b0080c2f1919a4bb0ea73b788f4a6786":"Legend of Zelda, The - Link's Awakening DX (Germany) (Rev 1) (SGB Enhanced) (GB Compatible)","b03138ad381d8581f245ca6ff88f9ef8":"Mummy Returns, The (USA)","b061db3dd5861addeaf22a83af802491":"Beyblade - Fighting Tournament (Japan)","b06e4ef225fbf01771dea02679f3775e":"Sam the Optimistic Hedgehog (World) (GB Compatible)","b077f0acbb5d2ca07a2d9c035856e01e":"Dinosaur'us (Europe) (En,Fr,De,Es,It,Nl)","b0849abcac5411fc88c90f28b3166bc2":"Tomb Raider (Taiwan)","b08ab767c367afebaa23b1be93f7f318":"Dicee! (World) (v1.1) (GB Compatible)","b090fc649463f99dc413fbae246d400a":"Lee Carvallo's Putting Challenge II (World) (v1.1) (GB Compatible)","b092bd8fc2001baf51d60ce89fe0915e":"Shuihu Zhuan Zhi Qunmo Fengyun Lu (China)","b093e59f676d7e9fc4827139b0cfdc74":"Basketbrawl (World)","b11b76bf7344f01f0608b8b8da83b46b":"Cookie Monster Munch (World)","b11f6063fd7006426d136da1ee27b27a":"Mona and the Witch's Hat Deluxe (World) (GB Compatible)","b12265f9c7139a51d55d354aa5ade32a":"Pachinko Hisshou Guide - Data no Ousama (Japan) (GB Compatible)","b138e131aeee6f969e45673821221b07":"Sei Hai Densetsu (Japan) (SGB Enhanced) (GB Compatible)","b13bbd668d6a9714fc13a8fa903dfe13":"Moshou Shiji - Zhanshen (Taiwan)","b13dda5f217d1e8050af087a3f5ac6bc":"GB-Wordyl (World) (De) (GB Compatible)","b14bf550163b000a7d1ba3caa43ac508":"Lodoss-tou Senki - Eiyuu Kishiden GB (Japan) (SGB Enhanced) (GB Compatible)","b1729716baaea01d4baa795db31800b0":"X-Men - Wolverine's Rage (USA)","b173870c83682e97fcc43b6d3ee9ac7f":"Top Gear Rally (Europe) (Rumble Version)","b1c7dbc6db86ea54fa8caab4eb3148e2":"Unholy Friend (World) (GB Compatible)","b1dba18c324554a433893073599777a7":"Medarot Cardrobottle - Kabuto Version (Japan) (SGB Enhanced) (GB Compatible)","b1e72ba9c23587d002bf1059504ad6db":"Ganbare Goemon - Seikuushi Dynamites Arawaru!! (Japan)","b23248da379be11b7ea91eb6a7c95b2c":"Mission Bravo (USA) (Proto)","b25025224eb338963fc9c0fee91f2c39":"Duke Nukem (Europe) (En,Fr,De,Es,It)","b250ee7ce8d2eaae25379723e054516c":"Daa! Daa! Daa! - Totsuzen Card de Battle de Uranai de! (Japan)","b284dbf9549a8322eadf291c631c057e":"Cops and Robbers (World)","b28a4a00b8a2a0a6055f79d13928f9ff":"Neclaus' Quest (World) (v1.1) (GB Compatible)","b28c999d1b43e8e39998827ff39965cc":"Dragon Quest Monsters - Terry no Wonderland (Japan) (Rev 1) (SGB Enhanced) (GB Compatible)","b290f995cec5958d396055c6c0ff8a3b":"Rocky Mountain - Trophy Hunter (USA)","b2d3713267c9e21b3dae3cb5f437fccd":"Duke Nukem (USA) (En,Fr,De,Es,It)","b2fe715038778210c0c2c8dd06b2a11f":"Super Gals! Kotobuki Ran 2 - Miracle Getting (Japan)","b311207a613d72a52a779b2aa3b3990c":"Rig Attack (World)","b3142aae557bc4e04e2f0f740fae9577":"Dropzone (Europe) (GB Compatible)","b3347b3219a7183697e83655f4628827":"Bionic Commando - Elite Forces (USA, Australia)","b3550a7c733b9392477f5b2e4502d7a8":"Shaman King Card Game - Chou Senjiryakketsu - Meramera Hen (Japan)","b397066e3cad5ae33a31e4adfff0bff5":"Legend of the River King GBC (USA) (SGB Enhanced) (GB Compatible)","b39c09e1a033f08d8160bf5dfa4082bc":"Raku x Raku - Moji (Japan)","b3a3b81d16bf534afe80200995dfc683":"NBA in the Zone (USA) (Rev 1) (SGB Enhanced) (GB Compatible)","b3af66996b1ae8315ad94880af361cec":"Hauntsfield (World) (GB Compatible)","b3bd4adc4613ff8f4b9cf8c80ff0a6ef":"Rocket Power - Gettin' Air (USA, Europe)","b3d08bf6b51ec11b62e1865f484717df":"Dia de Sol Noite de Lua (World) (GB Compatible)","b3e63b970dd30375664a119fa80e9382":"Taikong Baobei (Taiwan) (Li Cheng)","b3e8e32a3f8c3366cb12b4ea7b0a9169":"Powerpuff Girls, The - Paint the Townsville Green (Europe) (BPTP)","b3e97d514a8ad26a0802640a4b8386be":"Dragon Ball Z - Les Guerriers Legendaires (France) (Beta) (All Unlocked)","b3ebf79679aeb1e7fa4840484fcb94c5":"Towers II - Plight of the Stargazer (USA) (Proto 2)","b3f1a058f5702384af5e5d79ee855824":"Top Gear Pocket (Japan) (En) (Rumble Version)","b40dbe0f8ac98ede81f05c37dd0f67b1":"Aqualife (Japan) (SGB Enhanced) (GB Compatible)","b40f87a5332e9638cb92b98cfa4b202b":"Dork's Dilemma (World)","b410f6f84f4e4be7d1e8332067984207":"Yinyang (Taiwan) (De)","b44f01ea2d8a7d1987df04ed1424c260":"Yongzhe Dou E Long VIII (Taiwan)","b4718458fffedc4552c94c2428b78ba4":"Cold Nights (World)","b4c21d6cf67f5742ef3a19860eb31d2e":"Mr. Driller (Japan)","b4da49116eaf8e63d5dd912bc8da33f4":"Cross Country Racing (Europe) (En,Fr,De) (SGB Enhanced) (GB Compatible)","b50ef76b1e81615cf079c373b50c0ab9":"Grinch, The (Europe) (En,Fr,De)","b53d2cbd2377cbadb4f55b03fe58cbac":"Tiny Toon Adventures - Dizzy's Candy Quest (USA) (Proto)","b53eaf56f0c95887f4c009c4a95f28a2":"Grave Encounter, A (World) (v1.21) (GB Compatible)","b541848e14b7b70b679cb640915e8de2":"Take Your Medicine (World) (En,Pt) (v1.0) (GB Compatible)","b542fbcf77dea9de05ceab312648af6d":"Suske en Wiske - De Tijdtemmers ~ Bob et Bobette - Les Dompteurs du Temps (Europe) (Fr,Nl) (Beta 1)","b56c25cc4c2b086055d9d72a04baa1e8":"Ripjack (World) (GB Compatible)","b587d5ae7c464408526489b67dfca07d":"Dragon Ball Z - Legendaere Superkaempfer (Germany)","b59fa772b15a07f44110d5b7aa24b424":"Taito Memorial - Bubble Bobble (Japan) (SGB Enhanced) (GB Compatible)","b5a71128227f5bc953fd55cb0025807f":"Super Mario Bros. Deluxe (Europe) (Rev 2)","b5e7ac93cb6ad3290ee58e4d589e081b":"Digimon - Yellow Jade (USA)","b5eb859e6ea60a0bd83100a10206d9c9":"Warlocked (USA)","b5f00d021a370663458b346fad6903cc":"Tonic Trouble (Europe) (En,Fr,De,Es,It,Nl)","b5fe88bbde541c28625e32b83239e6f0":"Moorhuhn 2 - Die Jagd geht weiter (Germany)","b60a022c89a8e0a2c597dee3de807f32":"Fellowship of the Rings (Taiwan) (En)","b60dbf70d1a54e327a1cd668ade9f43b":"Hole in One Golf (USA) (Rumble Version) (SGB Enhanced) (GB Compatible)","b62cd45af888f008be2ddb84b778af4e":"Madden NFL 2002 (USA)","b639c0dbb1ca57df4f77eac898ea5710":"Powerpuff Girls, The - Il Terribile Mojo Jojo (Italy) (Proto)","b69bbc95fccabd83c8130d7215884504":"Capybara Quest (World) (v1.0) (GB Compatible)","b69e0d23832e1a8631b72d250c0d23c7":"New Super Color 145 in 1 (Taiwan)","b6b81d98a27596443792f47812f15b67":"Worms Armageddon (Europe) (En,Fr,De,Es,It,Nl)","b6c357bb1a544fb1f8731cbdc3046596":"Looney Tunes - Carrot Crazy (USA) (En,Fr,Es) (GB Compatible)","b6ea71372c0acb3cdc8cc64a4b2add2e":"Micro Machines V3 (USA, Europe)","b702980f1562a0d66106ff8722675eb9":"ATV Racing & Karate Joe (Europe)","b717e9a48b44a5d367e8bcb4a5e68535":"Matchbox Emergency Patrol (USA, Europe)","b71d8408e211d4ae4daf7745af550b18":"Diva Starz - Mall Mania (USA)","b71f9207f81109a0358aebba688418b1":"Remi's Pizzaria (World) (GB Compatible)","b734829913e6d58e678441de37dbf88a":"RoboCop (Europe) (En,Fr,De,Es,It,Nl)","b73582e8872c1185f5ca7f5aecd7c7f8":"Cargo (World) (GB Compatible)","b73c9b2f3b03444fa9a098a03691a79e":"Featherless Cake Delivery (World) (v2.0) (GB Compatible)","b742e2ca9ba371665c32173315f8ff5c":"Super Marrio Sunshine (Taiwan) (En)","b749ab5629d40cc4da3e4136f49d7cd8":"Who Dares Wins II (World)","b74b6132326bafcd75e415ddcd9a2932":"Dragon Warrior III (USA)","b74e388091f84c552ea4e2c1be3fba95":"Spider-Man (Japan)","b7598a51e0acc0d74ca8f464826371ed":"Wario Land II (USA, Europe) (SGB Enhanced) (GB Compatible)","b7c5022990adb215bdfa6cb2714c34d2":"Gun Law (World)","b7cc57aba9190a1db492b56716ba048c":"Fugazim (World) (Pt) (GB Compatible)","b7d6335b8d3a34b15ce0b631bb9731a2":"Asterix & Obelix Contre Cesar (Europe) (En,Fr,De,Es,Nl) (GB Compatible)","b7d7a761d1666d4cf9832435c49eb14a":"Rugrats - Typisch Angelica (Germany)","b80371a8c851a4c0b9c944fd14b44d6e":"Wings of Fury (Europe) (En,Fr,De) (GB Compatible)","b814eb1064975392a2db18b5f410abf7":"Yurivania - Uhaul of the Night (World) (v1.5) (GB Compatible)","b81ddb7d86302384efe1675f75cc35f6":"Pac-Man - Special Color Edition (USA) (SGB Enhanced) (GB Compatible)","b85674c7d71d84cef9dcc9b2e35185d3":"Legend of Zelda, The - Link's Awakening DX (USA, Europe) (Rev 2) (Beta) (SGB Enhanced) (GB Compatible)","b85fa198c52bb1aeb40358dd712800a5":"Booty (World)","b863839c61e45db5c6c6492d24688032":"Dragon Quest Monsters 2 - Maruta no Fushigi na Kagi - Ruka no Tabidachi (Japan) (Rev 1) (SGB Enhanced) (GB Compatible)","b868fa9f3cecfa2d39df43a5d1b13b60":"Hello Kitty no Magical Museum (Japan) (SGB Enhanced) (GB Compatible)","b8814bfe24f20d38700822f4904f5c8e":"Legend of Carrot (World)","b883323e9ae3c85548169babe3f9b4f0":"From TV Animation One Piece - Maboroshi no Grand Line Boukenki! (Japan) (SGB Enhanced) (GB Compatible)","b8be3a0807b09038d4feb48dc2ab1e70":"Pocket Racing (Europe)","b8ce3f17001f042e55c8803f0e04cc74":"Pacifist, The (World) (GB Showdown) (GB Compatible)","b8d3db1fd7025e861975433cd718f8d6":"Treasure Island Color (World)","b8e7f2f760dc0e7010ac5a83a793fbd3":"Wendy - Der Traum von Arizona (Germany)","b928699d63702e21a3599b887b947041":"Yu-Gi-Oh! - Das Dunkle Duell (Germany)","b941941050fc32406eca4733926a3779":"Rayman (USA) (En,Fr,De,Es,It,Nl)","b943d261884c20de0b2838cf1416b3a3":"Xin Fengshenbang (Taiwan)","b9795b5d6397d36c1666c3a0bada059f":"International Track & Field - Summer Games (Europe)","b980da92693762bd3a7a4791fe08766e":"Yu-Gi-Oh! - Monster Capsule GB (Japan) (SGB Enhanced) (GB Compatible)","b9a686e4dbc7241bdf72aca235f7f92f":"NYR - New York Race (Europe) (En,Fr,De,Es,It,Pt)","b9bc4621f069f59e22eee05eeb6503cd":"Supreme Snowboarding (Europe) (En,Fr,De)","b9cf2cc6ff8cbe94cb58ffa958475ab8":"Star Wars Episode I - Obi-Wan's Adventures (Europe) (En,Fr,De,Es,It)","b9cf8d2416f8a6dd3b412afd91337f40":"3-D Ultra Pinball - Thrillride (USA) (Rumble Version)","b9fc9e6b9b6a0113c530f5cb0a34da71":"20 Second Platformer, A (World) (GB Compatible)","ba01289e8d646e1407f70275a50114b3":"Love Hina Party (Japan)","ba0aeedae367f82a1fd2760cfcda2bd9":"Soccer Manager (Europe) (En,Fr,De,Es)","ba0d9c7eec69cee04a7ff4faf91f2c4b":"Lucky Luke - Desperado Train (Europe) (En,Fr,De,Es,It,Nl) (Beta)","ba0debf5e0cda9adfa409dab91abb6a9":"Robot Poncots - Moon Version (Japan) (SGB Enhanced) (GB Compatible)","ba1195224261abd308db025d69ee2227":"B-Daman Bakugaiden - Victory e no Michi (Japan) (SGB Enhanced) (GB Compatible)","ba199806fd4f5af5f76fd9c1515b299d":"Casper (Europe) (En,Es,It)","ba1d07a8282202081af5ad985f0c31ad":"Gobs of Games (USA) (En,Fr,De)","ba205296796ad7cdc8ca180b280714d1":"Las Vegas Cool Hand (USA) (GB Compatible)","ba2f38d5c6b03aa44d892b56395a683b":"4 in 1 + 8 in 1 (World) (4B-001, 4B-009, 8B-001, Sachen)","ba2f86e301d723422e92dc2d23fbc976":"Fix It Felix Jr. (World) (GB Compatible)","ba516f1573bd24659e6a73cfbd5da789":"Yuenan Zhanyi X - Shenru Dihou (Taiwan)","ba5624d81e12bd6131cde70f0d9bd18a":"RunieStory (World)","ba7297329e355c7c52a3ae457f0e6069":"Ultimate Surfing (Europe)","ba85a2ae8aa5829c440eef2d5549506c":"Harry Potter and the Sorcerer's Stone (USA, Europe) (En,Fr,De,Es,It,Nl,Pt,Sv,No,Da,Fi)","ba9822126b90c2dc7cd93f45e4780a42":"Caise Gedou 29 in 1 Diannao Huamian Xuan Game (Taiwan)","ba9a1c310a60c37fc2a7dc908ec1e442":"Midterm Moments (World) (GB Compatible)","bad2778ba7e134623a371e986e7356e6":"Mojie 3-bu Wanme de Shijie (Taiwan) (Zh)","bad95d30c38a92e7906feecb6d6bd272":"Aladdin (Europe) (En,Fr,De,Es,It,Nl)","baea8ed885dcdf816e9adddd3e1412b5":"Zelda no Densetsu - Yume o Miru Shima DX (Japan) (Beta) (GB Compatible)","baf1c3ae7147141962d0b61d5176d9ee":"Megaman X4 (Taiwan) (En) (Rumble Version)","bafeee7c09f44ff52570841a135f0f9e":"Yingxiong Jian 2 (Taiwan)","bb0de10abd5c34ec0a203ded19d15cd9":"Gangdan Wuyu 2 (Taiwan)","bb5562d1de66e525271d4673d1376273":"Pocket Pro Wrestling - Perfect Wrestler (Japan)","bb8e268f1413adbbbf8654daa5c645b4":"Koenig der Loewen, Der - Simbas grosses Abenteuer (Germany)","bbbe3c8987de434cffa7839676132e0d":"Star Heritage (Europe) (Proto) (SRAM Version)","bbd777c45d97cd88a5cf7c7bdacac82a":"F-18 Thunder Strike (USA, Europe) (Beta) (Rumble Version)","bbf9b39219ecec88bea41b98c8352634":"Other Life - Azure Dreams GB (Japan) (SGB Enhanced) (GB Compatible)","bbfd881158bae49739dce7e60c6aeab2":"Barbie - Pet Rescue (USA)","bc56b4a1ec8b993b06405f6eccc982b3":"Zelda no Densetsu - Yume o Miru Shima DX (Japan) (Beta) (GB Compatible)","bc60280596bce42d050b764b647dc39b":"Harry Potter and the Chamber of Secrets (USA, Europe) (En,Fr,De,Es,It,Nl,Pt,Sv,Da)","bc910c865527dd524818597b4b4f7f8a":"Shikong Xing Shou (Taiwan)","bc9c451415f5317dbf404b79b059f8b2":"Shuma Baolong 9 - Baolong Pian (Taiwan) (Zh)","bcc135b000c1c54f12f4ae87c7673b0c":"Alfred's Adventure (Europe) (En,Fr,De,Es,It)","bceeb4182da245db9402dd55eedba53f":"F1 World Grand Prix II for Game Boy Color (Japan) (En,Ja)","bcf0f4e74c63c6f11e46353cf51c27dd":"Klustar (Japan) (Proto 1) (GB Compatible)","bcf3e2445346b4ef40c1278b4b46408c":"Gift (Europe) (Sample)","bd34182264a2f503d4e6982718d3bb6d":"Three Lions (United Kingdom) (En,Fr,De,Es,It,Nl,Sv) (GB Compatible)","bd564a55bee8b797bf35ded0c4d9d218":"Vegas Games (USA) (En,Fr,De) (Rev 1) (Proto)","bd81ecd1dfbc99ff8592a0169fe5e7c3":"Bitterroot (World) (En) (GB Compatible)","bda8c4e5e18070924261823e5fca655c":"Chicken Run (USA, Europe) (En,Fr,De,Es,It)","be091e7efda10e4c004eadc3a1a0f27d":"Tezhong Budui (Taiwan)","be116ebc3666cd9de17ec00cc9f74d02":"Pro Pool (USA) (En,Fr,De)","be54c9b734c4d64fd4c22c6b9fc36651":"Feng Zhi Gou II (Taiwan)","be5ddc5d5c429713232599d7303d3fce":"Taikong Zhanshi - Jingdian Ban (Taiwan)","be7c823a2c6feba614afa32606edebe5":"Puchi Carat (Europe) (SGB Enhanced) (GB Compatible)","bea053b0d658d549444a2f3e71a3e135":"Yurivania II - Josette's Quest (World) (v1.3)","bef8d1dd00650a7080e23153d2734cb1":"Hunter in the Lost Forest (World) (Ja) (GB Compatible)","bf02f5bfc27ef44ceb2878359c7a9e0e":"Cardcaptor Sakura - Tomoeda Shougakkou Daiundoukai (Japan) (Rev 1) (Proto)","bf52d7ebed63cdd9f905695504da69c1":"Startled 911 (Taiwan) (En)","bf5c2f39b42212b8af8776b12f31d466":"Rugrats Movie, The (Europe) (SGB Enhanced) (GB Compatible)","bfc30d30c1d5aadcbc71be23e90f7b8d":"Shaoling Legend - Hero, the Saver (Taiwan) (En)","c017cce5845b3c1df8f8c13589f53c16":"Koudai Yaoguai Lu Baoshi (Taiwan)","c046f62bb3baf1f8398f5e3fb93dd82a":"Atlantis - The Lost Empire (Europe) (Fr,De,Nl)","c07737d6917eef4cc044b92c89a8b048":"Sonic Adventure 8 (Taiwan) (En) (Rumble Version)","c0b8edc2ccefc3ed95cf68c84a813609":"Kinniku Banzuke GB 3 - Shinseiki Survival Retsuden! (Japan)","c0e42b4b7ba5605c3ab7b83b1e2fab6d":"Shamus (USA, Europe) (GB Compatible)","c0fb030099f7a347b676d27a8a52d5ea":"Daisu-ki (World) (v1.1)","c0fd19d90d3d876cc321074239c7334e":"Medarot 2 - Kabuto Version (Japan) (SGB Enhanced) (GB Compatible)","c13132e59221fc42ed79dbebc42f7d0e":"Robin to the Rescue (World)","c159483205c4855951fbde09af451984":"Pocket Music (World) (Proto) (Riff Sampler Test)","c16f93ef289c6524dff09b8906eef668":"Loppi Puzzle Magazine - Kangaeru Puzzle Dai-3-gou (Japan) (SGB Enhanced, GB Compatible) (NP)","c18bf7a9e03ba337658060a9392f2e3f":"Cookie's Bakery (World) (v1.0.3) (GB Compatible)","c194c03c9d31ec629fd126551f7364fe":"Luke Yingxiong 2 - Zook Hero 2 (Taiwan)","c1a1a97800c76036e5223e4098b1eefe":"Ghost Town (World)","c1b1a97f28e06ad24516538849fff8d0":"Rockman X3 (Taiwan)","c1cf2d44f37a31fa7d5cdc7d523fd145":"Mia Hamm Soccer Shootout (USA)","c1dee0a8036d61d1483a793126da3b45":"Rugrats in Paris - The Movie (USA, Europe)","c1ef769ab7525ca2b2c3b0eb88b1c49c":"Warp Coin Catastrophe, The (World) (GB Compatible)","c202f380d697a36347aa1fb628e89c4b":"International Superstar Soccer 2000 (Europe)","c20886be531dcaa1157920a7ffa51240":"UXB (World)","c21dc91b8ba1032f7fe9d46fc23638ec":"Pro Mahjong Kiwame II GB (Japan) (SGB Enhanced) (GB Compatible)","c2274789b0a45c67f1ed84a3822b4c52":"Super Gran (World)","c22a900acae07be5aa036d569281adbb":"Mayhem (World)","c23c356a1ed788942e7d0b2cdac2fd36":"Granduel - Shinki Dungeon no Hihou (Japan) (Sample)","c2432f63206255ee5e616c0d7862538c":"Ide Yousuke no Mahjong Kyoushitsu GB (Japan)","c259cf18b489d1ddecb4b7a04fedfd2e":"Super Real Fishing (Japan) (Rumble Version)","c275de8abc3dd903038737a2139b0c18":"Warau Inu no Bouken - Silly Go Lucky! (Japan)","c2a2490640ef568e6fa326ab149bfacc":"Watashi no Kitchen (Japan) (Rev 1)","c2aa8555dad975a7005ab85bd8fefc04":"Pilgrim's Peril (World) (Demo 2) (GB Compatible)","c2bdeda559f02973c213e5085fd0d4df":"Fix My Heart (World) (GB Compo 2021) (GB Compatible)","c2d515839dcbe3717d5ce5a811bea914":"Skull Nightmare (World)","c2f9d399accca79c44cc63c9f79b8c87":"Game Boy Camera Gallery - Mystery Show (World) (v1.2) (Digital) (GB Compatible)","c30add585d87114288ff8e3726c5381b":"Yu-Gi-Oh! - Dark Duel Stories (USA)","c3115fdc071cf3f656555b327a11ee9c":"Guiwu Zhe 2 (Taiwan)","c38509b681a7f16ad7831ba1f2fa6e31":"F1 Racing Championship (Europe) (En,Fr,De,Es,It)","c3987a4d734c37b7d8324f654a45de70":"Dragon Warrior I & II (USA) (SGB Enhanced) (GB Compatible)","c3a774c513a2ab5a2b134e0210b6caf1":"Autumn With You, An (World) (GB Compatible)","c3c33d274e6d7ec077ee9935da8ed7f3":"Mission Mars (World)","c3c3932d5471bc0028ade1cd7a102d43":"Resident Evil (World) (Proto 1)","c3c4b88e40538c1c99b85313bc88df6d":"Saban's Power Rangers - Lightspeed Rescue (USA, Europe)","c3e86e1dd7ad48602f5682401e5c34bf":"Game Boy Camera Gallery - Mystery Show (World) (v1.4) (Digital) (GB Compatible)","c40cc786c254ebb58ff23054e3654635":"Hali Xiaozi Dier Bu - Mishi de Mi (Taiwan)","c40dcff155901f2d6046fec19017fe37":"Nakayoshi Cooking Series 3 - Tanoshii Obentou (Japan)","c4110ff080c6730fa39c290b2e02d8a7":"Driver (Europe) (En,Fr,De,Es,It) (Beta)","c4114cdae922b6b483f6c076b822719b":"Super 6 in 1 (Taiwan) (En,Zh) (6B-001, Sachen)","c412f76e37a24cd8e006e00cc344425e":"Bubble Frog (World) (GB Compatible)","c416450b06fc81fc07ab792c07790d3a":"Friday the 13th - The GB Game (World) (GB Compatible)","c4354362e13a4dcda40b063d96bd6580":"Puzz Loop (Japan) (GB Compatible)","c43ce6e1c66e6fcfc259762a9244a63d":"Mario Golf GB (Japan)","c4583c9127d08f9a7dec2056a8c21c1f":"Zebco Fishing! (USA) (Rumble Version)","c4639cc61c049e5a085526bb6cac03bb":"Legend of Zelda, The - Oracle of Ages (USA, Australia)","c468c6d714a2d86e2f68bdcdbb40b658":"LEGO Stunt Rally (USA)","c48ab40a864707e54688b9cf8db15faa":"International Track & Field (Europe) (En,Fr,De,It) (SGB Enhanced) (GB Compatible)","c48de261bb5111681bd77ca5f0d68a1b":"Army Men - Air Combat (USA, Europe) (En,Fr,De)","c48f26f5079ad1b411c78fbcb2738d67":"Tobu Tobu Girl Deluxe (World) (GB Compatible)","c49c17b7c695d382ff80ae49899109ba":"Iron Cor - Stainless (World) (v2.0) (GB Compatible)","c4ac0427318b26d5a616025edfae68ac":"RunieStory (World) (Alt)","c4cd1e337bb76ad0f7307f5cfa1ef6bc":"Rox (USA, Europe) (GB Compatible)","c50667baee3e2abdb1588394cc5d4534":"Ohasuta Yama-chan & Raymond (Japan) (SGB Enhanced) (GB Compatible)","c53d2f538f6a5f421c87f935a42aa912":"Swing (Germany)","c569cda6ff220773ec5fce7ea38ef777":"Razmoket a Paris, Les - Le Film (France)","c576f119cb3ad8ad7b5f18e6755232f3":"Microsoft - The Best of Entertainment Pack (Europe)","c58361b88496e7ad0179b59122afd687":"Tiger Woods PGA Tour 2000 (USA, Europe) (GB Compatible)","c5e3bb77000c5d3755e816f6c0eed489":"All Star Tennis 2000 (Europe) (AZTP) (GB Compatible)","c5effc311c2248d6de58b487e729406b":"Medarot 4 - Kabuto Version (Japan)","c5fbee23b0f8fc7502046f1a9fc9587e":"Runner (World)","c64b45177c93d6465618199543e1805a":"2003 Hali Bote 2 - Xiaoshi de Mishi (Taiwan)","c663691b1eca7eeeb501c4d00b4b186f":"Dragon Ball Z - Legendary Super Warriors (Europe)","c680639fa687146d2d821bad6b7447d8":"Harry Potter 3 (USA)","c69bf9512a815c37363da0e7ff418d68":"Pocket Cooking (Japan) (Beta)","c6cc317c220b2de231ce6db9af40bd83":"NBA Pro 99 (Europe) (SGB Enhanced) (GB Compatible)","c6d4f6037588f79def05e767f5dd8893":"Sergio Kidd (World) (En,Es) (v1.995)","c712c2c9955893f00a2dcc4c9444a761":"Xzap (World)","c718cd9fa02d51d389d498ac0469c3be":"Silent Hill 2 - 20th Anniversary Demake (World) (Proto) (GB Compatible)","c720432fe26cefbb5b177920ce20cd80":"Bomberman Max - Hikari no Yuusha (Japan)","c720b196e885fe116d8b0c2154438c0e":"Uno (USA) (GB Compatible)","c721161c0ee8b4731d71448b481c93ae":"Winnie the Pooh - Adventures in the 100 Acre Wood (USA)","c72e9b28a77971fe7b6e9c6d3030b24d":"Shuma Baolong - Shuijing Ban (Taiwan) (Vast Fame)","c73016626b9e7eae04b9a53a3dc4fb78":"Legend of Zelda, The - Link's Awakening DX (Germany) (Rev 1) (Beta) (SGB Enhanced) (GB Compatible)","c73b80f668e138c6828c9bcca13a13ba":"Powerpuff Girls, The - Bad Mojo Jojo (USA) (Rev 2)","c74c40b7da1a54568f4d5ccd3eb56090":"Legend of the River King GB (Germany) (SGB Enhanced) (GB Compatible)","c74c728ce3177a3a9abc5870b6762885":"Atsumete Asobu Kuma no Pooh-san - Mori no Takaramono (Japan)","c75bf50b9fec4e89ced9a2bdfbeb4245":"Army Men (USA, Europe) (En,Fr,De)","c768e670d408f2dc1cc41f42de981087":"Bomberman Selection (Korea) (Beta 2)","c7799bcf50583c9dde914e71d559d7d4":"Fishing for Asteroids (World) (v1.0) (Mini Jam 153) (GB Compatible)","c779f71e7a64d6eab07db8668a6fe216":"Elang Chuanshuo - Shiji Zhi Zhan (Taiwan)","c7a879befd45bbc5cdab7413d86fff76":"Pokemon Puzzle Challenge (Europe) (En,Fr,De,Es,It)","c7bcdd8ace2dfac5fdce889880472f80":"M&M's Minis Madness (USA)","c7cf1e919682b3ee613dd155cc12a15a":"Dance Dance Revolution GB (Japan)","c7f39d8f17fa808ee91b21b2e45d8d90":"2003 Digimom Sapphii (Taiwan) (De)","c83e117ad79a22c6a91586a419cdf1f5":"Legend of Zelda, The - Link's Awakening DX (France) (Rev 1) (Beta) (SGB Enhanced) (GB Compatible)","c8402b8dbd686fb77fe9489e651cbd4d":"Gambler Densetsu Tetsuya - Shinjuku Tenun Hen (Japan) (Rev 1)","c84bc300653ada16fc0b95d14205d992":"Silent Hill 2 - 20th Anniversary Demake (World) (Proto) (GB Compatible)","c851452c0cb8837add5802ad214eca15":"Pokemon Adventure (Taiwan)","c888149fe40d8d760ce490a74ca98263":"Nakayoshi Pet Series 2 - Kawaii Usagi (Japan) (GB Compatible)","c8aaf7b73f70f3d600a1d6c435f8349e":"GB-Wordyl (World) (Ca) (GB Compatible)","c8b51becb4edacc3b115a81329aa12c0":"Shougi 2 (Japan) (GB Compatible)","c8f68e280f379ff7cc10c8ec4ed89142":"Powerpuff Girls, The - Paint the Townsville Green (USA) (Rev 1)","c8fafcbb7a673765ade44b404b734a92":"Bugs Bunny in - Crazy Castle 4 (Europe)","c8ff99c216603ff09733bb4f80e2bc61":"Kawaii Pet Shop Monogatari (Japan) (SGB Enhanced) (GB Compatible)","c9146a0bf581d7f99aeeac0e8dfa04df":"Hamster Club - Oshiema Chuu (Japan)","c9156b49032e63498df93e132b0307b3":"Watashi no Restaurant (Japan)","c954d72f5a9131667aaa06ae185638b4":"Player Manager 2001 (Europe) (En,Fr)","c9799917bf3c583453b3da3cd5547398":"Pocket Family GB 2 (Japan)","c987f711dfb9cba8dc1174219877360f":"Bomberman Max - Blue Champion (USA)","c9a1dab66e0b13d5835c392437b16a5a":"Monster Race 2 (Japan) (SGB Enhanced) (GB Compatible)","c9a5171978e3587475bd6ffb17300b75":"Majokko Mari-chan no Kisekae Monogatari (Japan) (Rev 1) (SGB Enhanced) (GB Compatible)","c9c2f79adc7d23bad885f9289bc12283":"Kanji Shishuu (Japan) (Proto)","c9c39627ee5049e47ce1acd67fff7b8a":"POWA! (World) (En) (GB Compatible)","ca00c843a575efd01814fcbf7d84a8dc":"UEFA 2000 (Europe) (En,Fr,De,Es,It,Nl)","ca5f9281e0652b85b68120b9d8e5db70":"Tynesoft Commodore 16 Classics II (World)","ca73fc9c13dd686a34b4807bb50d5390":"2003 King Lion Advance III (USA)","ca74e5da2f81da8280ca6aa6e6fc4788":"Dragon Ball Z - Legendaere Superkaempfer (Germany) (Beta 3) (All Unlocked)","ca9d65eba8af25068242c946c50b6753":"Yu-Gi-Oh! - Duel des Tenebres (France)","cab48584e4caeb5ba3b1260f7d64c829":"Dragon Ball Z - Densetsu no Chou Senshi-tachi (Japan) (Beta) (All Unlocked)","cae65f307fc388ea2ad237cd12a2a507":"Ravenia (World) (GB Compatible)","cae6f72a359b1088efe6c641cbae2f97":"Watashi no Restaurant (Japan) (Beta 2)","cb2969699ac7deca731d67aa473e0024":"Golf de Ohasuta (Japan) (GB Compatible)","cb2f61ea9d959f7270eec59a5eb51aff":"4 in 1 + 8 in 1 (World) (4B-005, 4B-006, 8B-003, Sachen)","cb5348c1b469d698eccddce99a16d384":"Vigilante 8 (USA) (Rumble Version)","cb5ac6ddcac8d7c7ff29bd10e1751344":"Koudai Yaoguai - Baijin Ban (Taiwan)","cb5fe636114fcb0925d08ceced82dc23":"Legend of the River King GB (Europe) (SGB Enhanced) (GB Compatible)","cb689dc8d4e95fe9d190f6f5ad1d0ed4":"Sabrina - The Animated Series - Zapped! (Europe) (En,Fr,De)","cb8eefcdd6dbce5b9cabf9b1f0d93e42":"Stratagem Hero (World) (GB Compatible)","cb9c9001a0df32e6f89216e291684836":"Antz Racing (Europe) (En,Fr,De,Es,It,Nl)","cbb8140e3f755dbff588e60dff4a2d57":"Real Pro Yakyuu! - Pacific League Hen (Japan) (SGB Enhanced) (GB Compatible)","cbc55f3bb98f8c0443917ae477e56e51":"Medarot 3 - Kabuto Version (Japan)","cbdc5112eb8b9878fa5fe905e0aca556":"Sesame Street - The Adventures of Elmo in Grouchland (USA) (GB Compatible)","cbf4a5b2ff566554b014118e3d0e3e9a":"Game & Watch Gallery 2 (USA, Europe) (SGB Enhanced) (GB Compatible)","cc130e8228a37ecc3d38f7f34aafedaa":"Barbie - Diepzee Avontuur (Netherlands) (GB Compatible)","cc17f52e5140c0d1ad892d1856d05212":"X-Men - Mutant Academy (USA, Europe)","cc1d5175df56961476d3e92761cab9f2":"GB-Wordyl (World) (Pt-BR) (GB Compatible)","cc58fc8ca9583d4d7ba3361d93a68a21":"60 Minutes til Rot (World) (v1.6b) (GB Compatible)","cc5a11a92e0a0f6f476341237efa4b10":"JumpStart Dino Adventure - Field Trip (USA)","cc7639a2269210338b52e626096a99d9":"Mary-Kate & Ashley - Get a Clue! (USA, Europe) (GB Compatible)","cca8749da97aae49def1132a6a72d047":"Carmageddon - Carpocalypse Now (USA) (En,Es) (Beta)","ccb604ca00f176ae6ca40f4fc33d8c1a":"Wizardry Empire (Japan)","ccbb56212e3dbaa9007d389a17e9d075":"Legend of Zelda, The - Link's Awakening DX (USA, Europe) (Rev 1) (SGB Enhanced) (GB Compatible)","ccdcb901229a2278d0be673472f411b9":"Puzzled (Europe) (En,Fr,De)","cd197f8f5638f3b5af7b1a7d6e88772e":"Binary Monster 2 (Taiwan) (En)","cd4ca93b289aa0d7ef6a26b848e5e06a":"Donald Duck - Daisy o Sukue! (Japan)","cd5c8be982147d4ba99376c2b60bdbcf":"Yogi Bear - Great Balloon Blast (USA)","cd679208722a1c68ec9537394d6b2d35":"MetaFight EX (Japan)","cd93b7c015782bec5c9e21494421a76b":"Heebie Jeebies (World)","cd9448b31bfcf7c14be4782e874ebff3":"Trade & Battle Card Hero (Japan) (Rev 1) (3DS Virtual Console) (SGB Enhanced) (GB Compatible)","cdb21e5e2502dc8b9d0cc0acde7841fc":"Yu-Gi-Oh! - Duelo en las Tinieblas (Spain)","cdf275a96518efd2236f0bbb5321c0e3":"Batman Beyond - Return of the Joker (Japan) (NP)","ce1b3efd190f51e089bec904e92a5f01":"Barbie - Meeres Abenteuer (Germany) (GB Compatible)","ce6cd6dccc2de88a8fdc4d08612af359":"Kanji Boy 2 (Japan) (SGB Enhanced) (GB Compatible)","ce749b7cec312369d201336c1b90ced7":"Juedui Wuli (Taiwan)","ce74c7ece3f8475cd64b9bcf5f10d465":"Jingling Wang III (Taiwan)","ce826815852f1896518c9e43e24b23e1":"Jieba Tianwang 4 (Taiwan)","ceb1a6c3ce3d2921c0fb65f420f811fa":"Bakusou Senki Metal Walker GB - Koutetsu no Yuujou (Japan) (GB Compatible)","cecc79084e6515e9c59ce8d63d49eace":"Hands of Time (USA, Europe) (En,Fr,De,Es,It,Nl)","ced299d2952ae83c7bbfbb64767e4634":"Rhino Rumble (USA, Europe)","cf0917a92643bed6798b47a84ceb928e":"Panik!16 (World)","cf0dd6ce83aa648a1aa1e6dc7c3846f8":"Tazz (World)","cf27c9d0c3633d6b805c390f49b38642":"Harry Potter II (USA)","cf364669fe4197209fde5d0c32713d53":"Bokujou Monogatari 3 GB - Boy Meets Girl (Japan)","cf43504c5f14fea347dc937efec04049":"Take Your Medicine (World) (En,Pt) (v1.1) (GB Compatible)","cf45b5414ec4515f7a1021c139edd71e":"Super Black Bass Pocket 3 (Japan) (SGB Enhanced) (GB Compatible)","cf9ed892228e2c7ddee857758ea372a9":"Rocket Power - La Glisse de l'Extreme (France)","cfa42de596faaeb161bea96d3f6b9e6a":"Test Drive 6 (Europe) (En,Fr,De,Es,It) (GB Compatible)","cfac8209d5119235f678303dfb3cc0f2":"Asteroids (USA, Europe) (GB Compatible)","cfb6a98bef18c56e466d27b885e20f8f":"F-1 World Grand Prix (Europe) (En,Fr,De,Es)","cfdd9df7434c0a8d0e0ad3fdb04ea9b7":"Vegas Games (Europe) (En,Fr,De)","cffbcb83ed97a4ff88f71ee383bd0eba":"Absolute X (Europe) (Proto)","d0009c14cfdcd02695d84d068c0d4abe":"Doraemon Kart 2 (Japan) (SGB Enhanced) (GB Compatible)","d00eb270d07d5531e31c7e81e97a3f40":"Wicked Plague (World) (v0.1.2) (Proto)","d01e66fa8d96d2c6b1fd029856d7c14b":"Kisekae Series 2 - Oshare Nikki (Japan)","d0308455ba266cc5b0cd6ca9b671cb4b":"Klustar (USA) (GB Compatible)","d054a2c3a5f203e9930d8c4b88cd6a33":"Cardcaptor Sakura - Itsumo Sakura-chan to Issho (Japan) (Rev 1) (GB Compatible)","d05a3c8e6af26686166b5049f1438dff":"Winnie the Pooh - Adventures in the 100 Acre Wood (Europe) (En,Fr,De,Es,It,Nl,Da)","d05a9da7cd90cc9822e9655fb5476d54":"Gremlins - Unleashed (Europe) (En,Fr,De,Es,It,Pt)","d076ab5be2ec4972376de685c3705ff2":"Piecrust (World)","d0ac42bca20014e1cd0fb38540c1a9c7":"Shuma Baolong - Koudai Ban (Taiwan)","d0aeac956185e9fca207aa419fd769ea":"Closet Monsters (World) (GB Compatible)","d0c1449229a8208d0e6753fa05685df3":"Dinosaur (USA) (Beta)","d0c6ffc3602d91c0b2b1b0461553de33":"Bomberman Selection (Korea)","d0ca48aee3ffb5fd44fc4d4359c5d44b":"Polaris SnoCross (USA) (Rumble Version)","d106d2513aa3bcf6ba34b7f8cbbffe28":"Ou Dorobou Jing - Devil Version (Japan) (SGB Enhanced) (GB Compatible)","d10d56951b817115477d72a855d7c025":"Doraemon no Study Boy - Gakushuu Kanji Game (Japan)","d14c8cbcca2510a3c92107312999bebc":"Backgammon (Japan) (GB Compatible)","d154381bd849d7a04cb90e789f32bb8e":"Adulting! Soundtrack (World) (GB Compatible)","d1934b308085c92b2ee492faa0d159c2":"John Romero's Daikatana (Europe) (En,Fr,It)","d197d271f067afb8a4e41c1336e03098":"Zhizhu Xia III - Dianying Ban (Taiwan)","d1b2c36def4b361645eae44f6a0c53ea":"Gifty (Germany) (En)","d1bf9c15a1499231d6f2a8f0c4dd9041":"Pokemon - Mewtwo Strikes Back (Taiwan) (Zh)","d1e875cb7dac0092e83b9e7799b06653":"Star Wars Episode I - Racer (USA, Europe) (Rumble Version)","d219a65aa70fd9e1e75c65bdf97913da":"Mary-Kate and Ashley - Crush Course (USA, Europe)","d240328faacf5583804a30b7003743b3":"Rats! (USA) (En,Es) (GB Compatible)","d26054cdb11d2ea6f4e991de75b30164":"Dark Winter Wander, A (World) (GB Compatible)","d2711ff066f40c4e6c471b79da0f08b7":"Marble Madness (USA, Europe)","d2731c794aaa3fb4700c83727d8583e2":"Watashi no Restaurant (Japan) (Beta 3)","d29f8f062aa966917f0933365f3682ef":"Sergio Kidd (World) (En,Es) (v2.013)","d2a65d336cec301779641a1699ad96d8":"Super Jacked Up Tomato Face Johnson (World) (v2.3)","d30ad90e521ff7c4105129f25bde6dcf":"Chromanoids (World) (v1.1)","d315dc5767c97e99d3d2aec84d6ea226":"Jissen ni Yakudatsu Tsumego (Japan) (Rev 1)","d31bad86d4c8397c85ecf1c8338afe66":"Cross Hunter - Treasure Hunter Version (Japan)","d34abda546c5f42e40a2eeb28d029de4":"ESPN National Hockey Night (USA)","d3c08c1eb4f93b64c30fcb0bb7ff8924":"Zelda no Densetsu - Fushigi no Kinomi - Daichi no Shou (Japan)","d3c6c44a4f6021b4d5a6454a87af9a6c":"Snoopy Tennis (Europe) (En,Fr,De,Es,It,Nl)","d3edbd375df5b18b6dc21380fe1374ee":"Dream Shark - Part 1 (World) (Beta 2) (GB Compatible)","d40ebe25a1447c9e08f66682fc9085d2":"Dragon Ball Z - Legendaere Superkaempfer (Germany) (Beta 1)","d4255175d7cbca6080c31ec839893d05":"Painter (Europe)","d4353731d8d6b29c0fa9969c767994a6":"Mud Warriors (World) (GB Compatible)","d455f4ae266279daa36f3f3e54569239":"Monster Farm Battle Card GB (Japan) (SGB Enhanced) (GB Compatible)","d4662b64f1ecb3683f87c6439d1e6061":"Halo - Combat Devolved (World) (GB Compatible)","d4876d692dcb6ca68786e1df3af361a6":"Kinniku Banzuke GB - Chousensha wa Kimida! (Japan) (SGB Enhanced) (GB Compatible)","d493254422eb969a504242529a8780a0":"Shuma Baolong 02 4 (China)","d4b6a73e0b9c9bd7dc88baa36c839723":"From TV Animation One Piece - Maboroshi no Grand Line Boukenki! (Japan) (Beta 1) (SGB Enhanced) (GB Compatible)","d4ecb934836df8e3f26af4c976cae730":"Dawn Will Come (World) (GB Compatible)","d5161ed7380af488b22302691c9a33cd":"Keep the Balance (Europe) (En,Fr,De,Es,It)","d53652b59f1d8b50d1b30d75a44f4135":"Mahjong Joou (Japan) (SGB Enhanced) (GB Compatible)","d55433c70617d18bb078426e8cd99708":"Anpfiff - Der RTL Fussball-Manager (Germany)","d56e7601673af3c0f78def06c34c8efa":"Zelda no Densetsu - Yume o Miru Shima DX (Japan) (Beta) (1998-07-05T215532) (GB Compatible)","d5961426b8ea089e2f74a91a747acfdb":"Ready 2 Rumble Boxing (USA) (Rumble Version)","d5a4819a4ca8c2d1baaf340abff03430":"Adventure (World)","d5a558f3f63771ac1e40d53976e090ef":"Bugs Bunny & Lola Bunny - Operation Carrot Patch (Europe) (En,Fr,De,Es,It,Nl) (GB Compatible)","d5aef2fb975eebf3b66ea89c469d0d7c":"Warp Coin Catastrophe, The (World) (v1.1.2) (GB Compatible)","d5b4fd7fd703b447bcb8e1f78865208f":"Itsudemo Pachinko GB - CR Monster House (Japan)","d5cde4a6f4877a71b06278a4802c7cce":"Rox (Japan) (En) (GB Compatible)","d5e1af0598a8db7b93f57eb2909edc17":"Flintstones, The - Burgertime in Bedrock (Europe) (En,Fr,De,Es,It) (Beta)","d5ebdbeda4156b34e3c0f01d55a4221c":"Frogger (Europe) (En,Fr,De,Es,It,Nl) (GB Compatible)","d5f373b287d29e882a1f1182542d5b68":"Spy vs Spy (USA)","d60bc0b1aa3f89229420f6685aafdeb8":"Zap'em (World)","d62e0c703bc1a84e0fce512f4b9c46e7":"Monsters, Inc. (Europe) (En,Fr,It)","d6311339384cb70c35975c8d30a1cd98":"Crazy Bikers (Europe)","d63504ea68f55d3c290cd01d71d4d1cc":"Deja Vu I & II - The Casebooks of Ace Harding (USA)","d645be8abbdf5ae2271ec50522edf274":"Don't Forget About Me (World) (v1.1) (GB Compatible)","d69fdc8dafd38ab4f48cc6a6b8fa1df9":"Hercules - The Legendary Journeys (Europe) (En,Fr,De,Es,It,Nl)","d6a568f56d59772c7a83b5e8504c86d6":"Melanie and the Magic Forest (World) (v1.1) (GB Compatible)","d6acc2206f227aacd81b22edcab2da1c":"Zelda no Densetsu - Yume o Miru Shima DX (Japan) (Rev 2) (Beta) (SGB Enhanced)","d6ce41d6e3593ebb7bd5298e959cee8a":"Buried Behind the Cabin (World) (GB Compatible)","d6dce5c8dc02ce77d58f8852653e42e4":"Pitfall - Beyond the Jungle (USA, Europe) (GB Compatible)","d6e59ad9058f410a56356accce0cb488":"Space Invasion & Painter (Europe)","d6f78d93f6c784ed58e43c1c6779f2e4":"Bitterroot (World) (Es) (GB Compatible)","d710cd23e7e38023297d04e935dbebae":"Super Robot Taisen - Link Battler (Japan) (SGB Enhanced) (GB Compatible)","d73b7f013ab9e347398683363f720ab7":"Hamster Club 2 (Japan) (GB Compatible)","d741a2a13d654e45a9b24be6e202a32c":"RunieStory (World) (v1.1)","d794a2c5f75d6b2362aebe684935c694":"Tyrannosaurus Tex (World) (Piko Interactive)","d7a018169bc80c1de1e33c024e0991b7":"Cuthbert in the Cooler (World)","d7b5b58cec32e37c4d29336f4b7c61b7":"Daikatana (USA) (Proto 2)","d7b8309532d3316447a9202cb2f19018":"Bob the Builder - Fix it Fun! (Europe) (En,Fr,It)","d7e62b77572a4db9b8d533141c999ff8":"Shuma Baobei - Chao Mengmeng Fanji Zhan (Taiwan) (Zh)","d7f3a39d4fde196fbe2ddbb2a6e575a3":"Holy Magic Century (Europe) (En,Fr,De) (SGB Enhanced) (GB Compatible)","d7f63bbb351a95d73d085a58c8e9f449":"Mario Tennis GB (Japan)","d80951a01c8e329fd3ccc99f95808857":"Turbo RC Racing (USA) (Proto)","d81945176908cc834d3be242528dde96":"Liberator (World)","d849d85a81be386a0617bce591cf1c40":"Death Race 16 (World)","d8595af2c6a3dbb2659acadbc9440515":"Titi - Le Tour du Monde en 80 Chats (France)","d864d40e51fea6c3ed7e4e340f4613fd":"Pocket GI Stable (Japan) (SGB Enhanced) (GB Compatible)","d8800afecf6c190119f508d450f456df":"NASCAR Heat (USA)","d89dcd9cf1a9f6ec694da01b59541401":"Feed IT Souls (World) (v1.3)","d8de3e22c969198f8701bf861cc60974":"Game Boy Gallery 2 (Japan) (Possible Proto) (SGB Enhanced, GB Compatible) (NP)","d94e22b4c08ab3c7b1929f5490adcbf2":"Frogger (USA) (GB Compatible)","d952041d1970551ee4bedbe341556e6f":"Totsugeki! Papparatai (Japan) (SGB Enhanced) (GB Compatible)","d9575286a0da1da5f6036f649024298c":"Toobin' (USA)","d97055e4a2fd4624fc924c4834ace35e":"Alone in the Dark - The New Nightmare (USA) (En,Fr,Es)","d987545c6662cab8f28eca59b456f2b7":"Magician's Curse, The (World)","d99a820e6fabc76264ee1a08b41ef794":"Men in Black 2 - The Series (Europe) (En,Fr,De)","d9d85b81d1b0b4d3c86c95a6e1846f5a":"Action Man - Search for Base X (USA, Europe)","d9ffed48998c978d6bad4a23ae2567b9":"Pocket King (Japan) (SGB Enhanced) (GB Compatible)","da3fe9c44254b6c2dadcf58187d898ef":"Emo Dao (Taiwan)","da5586315ca857071d557a8fde26c108":"From TV Animation One Piece - Yume no Luffy Kaizokudan Tanjou! (Japan) (SGB Enhanced) (GB Compatible)","dabfbdc9aba5f2edc21f884c52881e0d":"Medarot 3 - Kuwagata Version (Japan)","dad39d89a24962b0457dd8e65b7c6ad1":"Muchang Wuyu GB 6 (Taiwan)","dae7b7625d41d8a06266b09924154bb2":"R-Type DX (USA, Europe) (GB Compatible)","db1aeaa7135bd5707dbbccc427808cd7":"Street Fighter Alpha - Warriors' Dreams (USA)","db87fcfe3cc0fecd88ac09dd2f48c845":"Everlasting Summer (World) (Proto)","db9d9e20af969a2ee248ae9af42a5d36":"Sesame Street - Elmo's ABCs (USA) (GB Compatible)","dba35ac5202ee0b8578a1a275ee13b93":"Crazy Golf (World)","dbada1fdfaba283bede36852843f5ed8":"Dance Dance Revolution GB - Disney Mix (Japan)","dbc9bc98ad0f7730b9136d98992ae656":"Zelda no Densetsu - Yume o Miru Shima DX (Japan) (Rev 2) (Beta) (SGB Enhanced) (Alt 2)","dbcbac05906548b7c7fb8c5639fb7910":"Dicee! (World) (v1.4) (GB Compatible)","dbd7bc8a47d78e84016f0c240e6aa179":"Roswell Conspiracies - Aliens, Myths & Legends (USA) (En,Fr,De)","dbf74341f9d23fe32899ebc9f4bf20c8":"Dragon Ball Z - Densetsu no Chou Senshi-tachi (Japan) (Beta)","dc131a70357d28bc43649c4ad6cd4397":"Dukes of Hazzard, The - Racing for Home (Europe) (En,Fr,De)","dc15bf4d545a2c537f46598cb9204daf":"Solomon (Japan)","dc1680ac734e67945bc4ce002b15d4da":"Harry Potter 3 - Shen Qi Zhi Guang Lun (Taiwan)","dc1ab5d860adc30b57fdadcaf04bf9ef":"Sheng Shou Wuyu - Shenlong Chuanshuo (Taiwan)","dc640627128579ee52c3fb0ff38a96f0":"Supercross Freestyle (Europe) (En,Fr,De,Es,It)","dc835fa5664aa83ff90dc2ff6cc83f24":"Bust-A-Move 4 (USA, Europe) (GB Compatible)","dc94079146ee90d7dd7d72280a3faad5":"Donkey Kong Country (USA, Europe) (En,Fr,De,Es,It)","dca07583bc53befabea1d5467d4ec4d2":"Klustar (Europe) (En,Fr,De,Es,It) (Beta) (GB Compatible)","dcc4505e35d2d4780a56d39c8d268e1c":"Super Donkey Kong 5 (Taiwan) (En) (Rumble Version) (Alt)","dcc73cdf818a54657230bf552504abe1":"Find Out (World) (GB Compatible)","dccb2adec6b97ac35614414a427abdbb":"Barbie - Pet Rescue (Europe) (En,Fr,De,Es,It)","dccbe12f558f971148eb147c32318431":"Madden NFL 2000 (USA, Europe) (Beta) (SGB Enhanced) (GB Compatible)","dce795b0fe13ca2617edb2273cccf0be":"Shin Megami Tensei Devil Children - Shiro no Sho (Japan) (Rev 1) (Proto)","dd1505a3f4d7289b37107c6a98931eb4":"International Superstar Soccer 99 (Europe) (SGB Enhanced) (GB Compatible)","dd34a89c4839949f4a983786ec63a993":"Yu-Gi-Oh! - Racconti Oscuri (Italy)","dd52cfda22b54bb69a4274b85930934c":"Speedy Gonzales - Aztec Adventure (Japan) (Proto) (GB Compatible)","dd53d483612e848d5f636aac67665f72":"Puzzle Bobble Millennium (Japan)","dd6b704cde7ff9516c09ba86833a7f9f":"Aardvark (World)","dd818318641f6c81b8254bc9e04e99af":"Space Baby (USA)","dd8b136f46a0c2ce1381506396e77fde":"Wai Xing Tanxian Zhi Xingqiu Dazhan (Taiwan)","dd9e7c40f202f2c3963930e195d75f4d":"Batman Beyond - Return of the Joker (USA)","ddc44d19f27100e9e9cf440820436152":"Hissatsu Pachinko Boy - CR Monster House (Japan)","dddbe98001059d52284539a631094799":"Trouballs (USA) (Beta)","ddecba0a4e0d1373fad858316faf6f33":"Dinosaur (USA)","de204ad9ae3e29cf2c06ceb372ec9cd2":"Pocket Puyo Puyo Sun (Japan) (SGB Enhanced) (GB Compatible)","de3c7f4b7df2d8c95ea1c5c622c332e8":"Loppi Puzzle Magazine - Hirameku Puzzle Soukangou (Japan) (SGB Enhanced, GB Compatible) (NP)","decde704dfe0a7e4644e3f6c4c9474f3":"Nyghtmare - The Ninth King (World) (v0.1.2) (Beta) (GB Compatible) (Alt)","dedb5679bb7fd73893272195e3c48d9e":"Zhihuan Wang - Shoubu Qu (Taiwan) (Zh)","deef0140c464bff3435061b90e01b70d":"Hamster Paradise 2 (Japan) (Rev 1)","df12fd885c09702ef5f02bfd2a5e1ec3":"Roadsters '98 (USA) (Proto) (SGB Enhanced) (GB Compatible)","df15cf120ba0db664adab8d52f0e4d57":"Rayman - Mister Dark no Wana (Japan)","dfc1c1fa9731807aa8bb5aa7d4849984":"Lemmings VS (Japan)","dfd98373a954974a62043f85fc1e85ae":"Loco-coco (World)","e019b0790ef6e7b2dd39afdbec8ba651":"Glocal Hexcite (Japan) (SGB Enhanced) (GB Compatible)","e0245d992101be481c355e3e2c2cbb83":"Hoyle Casino (USA)","e027bb984964e07be2feeaa712715987":"Dragon Dance (Europe) (Proto) (SGB Enhanced) (GB Compatible)","e041a65713ac7070c9d16cb6501e1a6e":"LEGO Alpha Team (Europe) (En,Fr,De,Es,It,Nl,Pt,Sv,No,Da)","e0b8537949322d3233cc72ee8c1fce15":"Astro Plumber (World)","e0ee709c3bbe5c59be87944dee1c7dcb":"Boing! (World)","e12fecf7cfa7aa217fb30c16fba18499":"Block Droppin' (World) (v1.0) (GB Compatible)","e155c9d08645a64fb63cd09bc3f56edc":"Escape from Vostok (World) (Proto) (GB Compatible)","e16141de4a31074438eb44e808fb6789":"Hime's Quest (World) (Digital)","e1836b1ec913a6bfa1e02fc250727fa9":"Jisedai Begoma Battle Beyblade (Japan)","e1ae3e808f17b972d063a0bb0d58888e":"Aventures de Buzz l'Eclair, Les (France)","e1af297b7083e1958352bbc5655ef480":"Hana Yori Dango - Another Love Story (Japan)","e1bf59102bcd5e3601f4b24b3e873fd2":"Toki Tori (USA, Europe) (En,Ja,Fr,De,Es)","e1da550bf08b9db2ac142da1a76b7456":"Bub-O Escape - Tournament Edition (World)","e1de60430a3de8b26f68e7472d9cae58":"Jet Set Willy (World)","e1ef19561d4f816c0becc3380139af58":"Dusky Dungeon (World) (v0.2.0) (Proto) (GB Compatible)","e1fcd22f776dc38d0bcffa697794cb1e":"ESPN International Track & Field (USA)","e20f2057c2143993c0f844097d0086d5":"Extreme Sports with the Berenstain Bears (USA, Europe) (En,Fr,De,Es,It)","e24141ed6fc94b149bbf43b4bd9658e8":"Atlantis - The Lost Empire (Europe) (En,Es,It)","e260c0118fd3a6b4dfbec651d156bf3a":"Host, The (World)","e27e5d2079fb84a439dbafda7c6e2ef1":"Konchuu Fighters (Japan)","e2b6cfc93021d361ab1cac347499b493":"Hollywood Pinball (Japan) (GB Compatible)","e2b6edd74568e18e37356a1bd75c216b":"Starseed 2 (World) (GB Compatible)","e2f33aaf29750f1142b2b6017b454bd4":"Zoids - Jashin Fukkatsu! Genobreaker Hen (Japan) (SGB Enhanced) (GB Compatible)","e31b25f35267460f474f7079e445025d":"Grand Casino (Japan) (Proto)","e333c74332067d817732f06cf301d736":"Waternet (World) (Batteryless Generic Save Flash Cartridge Version) (GB Compatible)","e35a91c87173b3ddd332b94a85f67257":"Kikstart (World)","e3809354341cfb1f2ebb3e4dd1bc8828":"Yu-Gi-Oh! Duel Monsters 4 - Battle of Great Duelist - Yuugi Deck (Japan)","e3846151ea7d911c9b0b76de2fe5239a":"Blue's Clues - Blue's Alphabet Book (USA) (Rev 1) (Proto)","e384f3789ef10051159217048c62fb16":"Xtreme Sports (World) (Limited Run Games)","e39b039557a7c0629553ce7fed602bb3":"Legend of Zelda, The - Link's Awakening DX (Germany) (Beta) (SGB Enhanced) (GB Compatible)","e3c757e5f4261e962cacc8a999ec0f87":"NBA in the Zone 2000 (Europe)","e3d17744fcbb85d392b746ebb9f49147":"Boxing Master (World) (Proto) (GB Compatible)","e3edbfe8aba5dd198a9e2e0f0141785b":"Tanimura Hitoshi Ryuu Pachinko Kouryaku Daisakusen - Don Quijote ga Iku (Japan) (SGB Enhanced) (GB Compatible)","e4064df09a734c3ed04f69a970715f6f":"Porklike (World) (v1.0.13)","e43684f551fd471b7dd2d694748cdde1":"Tom and Jerry in - Mouse Attacks! (Europe) (En,Fr,De,Es,It,Nl,Da)","e4594f3d22fce6b71642a9f3049a6054":"Denki Blocks! (Europe) (En,Fr,De,Es,It)","e4874674056451f1df22c2cbf7a25f93":"Zok Zok Heroes (Japan)","e49185b5b5268f17a923a459e84bed0d":"Taisen Tsume Shougi (Japan) (NP) (GB Compatible)","e4c1111dcc4dc23860ce016daf584dc1":"Antz (Europe) (En,Fr,De,Es,It,Nl) (GB Compatible)","e4cf23360373168bacf6a7e4925a27ef":"VR Sports - Powerboat Racing (USA) (Proto)","e4e5488d10d69c4c12eb2a9a522ffc7b":"Tonka Raceway (USA) (Rumble Version)","e51c03fc9ed1a31a9e2be404f9e01068":"Deja Vu I & II - The Casebooks of Ace Harding (Europe) (En,Fr)","e56e69bc23281c85a8a17a48a6f2abdb":"Tyrian 2000 (USA) (Proto) (GB Compatible)","e585b4fc4acf013599938e3d84e4afe3":"StarFox - Grounded (World) (GB Compatible)","e599e5aab2cfe2fc95d340a5c910d87e":"Doraemon no Study Boy - Kanji Yomikaki Master (Japan)","e5a5ff83ab27aa5b20d40dd2ddf3100d":"NBA Jam 2001 (USA, Europe) (Beta)","e5bfbe8dd1f3017834496626208b9d7d":"Super JetPak DX (World) (GB Compatible)","e5cf736f37cbbbbe6957e172de5626fc":"DX Jinsei Game (Japan)","e5d8aea67aef0ee94acf1ed35900ea74":"Azarashi Sentai Inazuma - Dokidoki Daisakusen! (Japan)","e6007f4f4d8d671d7c94390be47e6dfa":"Agent B (World) (GB Compatible)","e6009a3556e22fa2f42134999759d366":"McDonald's Monogatari - Honobono Tenchou Ikusei Game (Japan)","e6149202059598ffb69cf5ad6fff0da7":"Tiledentity (World) (v1.0) (GB Compatible)","e6534476aa084c2933a03392e7202473":"Pancho (World)","e69da049d745b89fd28c79fe20a2b861":"Granduel - Shinki Dungeon no Hihou (Japan)","e6a3d906bc47516138ca14578601af02":"Dokidoki Densetsu - Mahoujin Guruguru (Japan)","e6a4ef193f15c78fa2463a693bfb0928":"Trickboarder GP (Japan)","e6b7301f1f8b127fb6a493c50a0c233c":"Shuihu Shenshou (Taiwan)","e6cfb4de1afee7579d21938eba5a69b3":"Grave Encounter, A (World) (v1.3) (GB Compatible)","e6e14aa92b3969da7edd57abef060ba2":"Carnivale (USA) (Proto)","e6f36322946499f2f55b724c3db916cd":"Bomberman Quest (Europe) (En,Fr,De) (SGB Enhanced) (GB Compatible)","e718083d717d4262d3f26eba4040f8e4":"Action Replay Online (Europe)","e7719bb0d0619e2e5fb10dab75f78654":"NBA Hoopz (USA)","e7775efddf4d0a5e6a9e8534f5efc2ef":"Dokapon! - Millennium Quest (Japan) (SGB Enhanced) (GB Compatible)","e77bbfc1ffb3c846752410a371e098ce":"Chibi Maruko-chan - Go Chounai Minna de Game Da yo! (Japan)","e79ce8c2b2e9ea0c0907cfbfadaa8744":"LEGO Alpha Team (USA)","e7c022031cb882912e81970eb63d4f61":"Beatmania GB (Japan) (SGB Enhanced) (GB Compatible)","e81e4977a1380a6a0bac49bfd9e04671":"Wizardry III - Diamond no Kishi (Japan) (En,Ja)","e84bf72a6a82a76237813e3701551ee8":"UEFA 2000 (Europe) (En,Fr,De,Es,It,Nl) (Beta)","e89653bd33d07e1a50a3ff78c2818a53":"NBA Show Time - NBA on NBC (USA)","e8a7906583a479b95e3bc26677f485a0":"World Cup (World)","e8af8eb59a3f8ab95c68769e651ed138":"Climb It (World)","e8b4a4231325adc851229bbde40d2284":"Top Gun - Fire Storm (USA, Europe) (En,Fr,De,Es,It,Nl)","e8bb2b9629f352fdc0f59a7bffdd66bb":"Meteorite (World)","e8e8c096bebc6b6412fa810422ffd872":"Pokemon Trading Card Game (Europe) (En,Es,It) (Rev 1) (SGB Enhanced) (GB Compatible)","e8ea4eeae15080840086fdc5f047b69c":"Slime Dungeon (World) (GB Compatible)","e91752013f0fb62cf0e52873c412ceeb":"Bibi und Tina - Fohlen Felix in Gefahr (Germany)","e91fd46e7092d32ca264f21853f09539":"Legend of Zelda, The - Link's Awakening DX (Germany) (SGB Enhanced) (GB Compatible)","e923107e9c8b13a769371d041ee383d2":"Jankyuusei - Cosplay Paradise (Japan)","e952d78a439e47ab4d77b563973797d5":"Great Battle Pocket, The (Japan) (SGB Enhanced) (GB Compatible)","e95cf6f2c0e1a7276f37ad8926b3f901":"Moomin no Daibouken (Japan) (Beta)","e96fad823b6771c00c04dab88ede40bb":"Katou Hifumi Kudan - Shougi Kyoushitsu (Japan) (SGB Enhanced) (GB Compatible)","e98124b30408c00786068387353e39e5":"Bust-A-Move Millennium (USA, Europe)","e98b6a7bb91bb0a7e80e40985eefb1d0":"Emperor's New Groove, The (USA)","e99687d3558fd7fc4af702ea1abd9957":"Casper (USA)","ea1d92074995590ebe4766f28f476db9":"Sofia the Witch - Curse of the Monster Moon (World)","ea3cfb50763df7977b3e45b280066742":"Kakurenbo Battle - Monster Tactics (Japan)","ea991b38b2a74d10c6d075f509d9b555":"Meitantei Conan - Norowareta Kouro (Japan) (SGB Enhanced) (GB Compatible)","ea9f362f629124c9423a8d9ba933eced":"Rayman (Europe) (En,Fr,De,Es,It,Nl)","eac27e6d4cd1d38d07f2a18ad8169af1":"Logical (USA)","eb14f75bda32d51b8f5751869743bf7a":"Nakayoshi Pet Series 1 - Kawaii Hamster (Japan) (GB Compatible)","eb76fda958f100fb791111b928ffe46f":"Lucky Luke (Europe) (En,Fr,De,Es)","eb8a8817e782cddb4fe0474922a3405d":"Nakayoshi Pet Series 3 - Kawaii Koinu (Japan)","eb8c8c397482963a027aad7bcb60706a":"Egbert (World)","ebb19fe17fd6d13d9d52239e8da9711a":"Rockman X - Cyber Mission (Japan) (GB Compatible)","ebed797f57ecff8918a4a13de340d83d":"Don't Forget About Me (World) (GB Compatible)","ebfe05828463cc004898e6a95ee57fea":"Keitai Denjuu Telefang - Speed Version (Japan) (GB Compatible)","ec0985bdad4b519c492f07f2d01f1613":"Puyo Puyo Gaiden - Puyo Wars (Japan) (SGB Enhanced) (GB Compatible)","ec11bd38c10913047913eab36b06c2a0":"Shantae (World) (Limited Run Games)","ec1613010e8f9e0bd729f37248c435a8":"Out on a Limb (World)","ec1a1e432cba04e33c408a7dad314997":"V-Rally - Championship Edition (Europe) (En,Fr,De,Es)","ec1c9035be5c529795048546b1f35ca5":"Full Time Soccer & Hang Time Basketball (Europe)","ec39462e39e3cbcabe03667fabf12d5a":"Sabrina - The Animated Series - Zapped! (USA, Europe)","ec3ef08bb6d73b1b57958322d1085dad":"It's a World Rally (Japan) (SGB Enhanced) (GB Compatible)","ec648c50e1bc337c399ab40b58b40509":"WDL - World Destruction League - Thunder Tanks (USA) (En,Fr,De)","ec64d367cdc02cfb9019d058ab5a0fdb":"Pocket Densha 2 (Japan) (SGB Enhanced) (GB Compatible)","ec6d8099aa51acc791e3846558c81ebb":"Roadsters (Europe) (En,Fr,De,Es,It,Nl) (GB Compatible)","ec764e03228d212ca794ac0b9df62857":"Super Mario Bros. Deluxe (USA, Europe)","ecf0d8121278d810bf40c4de8a2a080b":"Game Boy Wars Pocket Tactics (Japan) (Beta)","ed002e5b29f7082a6a37191bf5af1d08":"Pocket Cooking (Japan)","ed23c6ab13f2397becf476509e7e1802":"Xian Dan Chaoren - Ultraman (Taiwan)","ed351bbc74e47f7adb4a926c8c59af8b":"BIG2SMALL (World) (Digital) (GB Compatible)","ed517a9923865f4e4945ca4095313fe2":"Dancing Furby (Japan) (GB Compatible)","ed5a1efc26ceb76f61c133303173ab31":"Sanguozhi Wudai (Taiwan)","ed679655b3721327ea36c857c554427a":"Konami GB Collection Vol.2 (Europe) (GB Compatible)","ed842f9b8786b9f7d8cfa082a4cf47b9":"Gedou Jian Shen - Soul Falchion (Taiwan) (En)","edf021b521a496fe7afc5e15949f5c80":"Fish Files, The (Europe) (En,Fr,De,Es,It)","ee133ab2f9ea5b18e9a19ce9b599a883":"Paperboy (USA, Europe)","ee37c79e8df6475d90e99e527823f92f":"AirForce Delta (USA)","ee44254c96fa9318a26a1a5b0a9b48fe":"Montezuma's Return! (Europe) (En,Fr,De,Es,It) (GB Compatible)","ee4fc61afd79c8a20e57fa04f49ad1b3":"Mummy Returns, The (Europe) (En,Fr,De,Es,It)","ee55d33109a6cd761fb3b5f7bc21c6c0":"Xploder GB (Germany) (v1.2.2G) (GB Compatible)","ee5fe52488da10e838a123649d33d809":"Klustar (Japan) (Proto 2) (GB Compatible)","ee6f509cea8b3350c6171d5204f2a797":"New Addams Family Series, The (Europe) (En,Fr,De,Es,It,Pt) (Rev 1) (Proto)","ee700a60bf4e72287e0b9eb377e981d2":"Dragonmaster (World)","eeb8a7311a959035e8a3c3822329ea48":"Sakata Gorou Kudan no Renju Kyoushitsu (Japan) (SGB Enhanced) (GB Compatible)","eec6986c0380b1071a2ca6d25a29b8d4":"Spy vs Spy (Japan) (Rev 1) (NP)","eec8ef2cedff516fa121f6b1698eac31":"Shishang Chaoqiang RPG + Gedou + Yizhi Ban Zuhe Ka 18 in 1 (Taiwan)","ef032b6f603b3a290a91d40cb9c4b3e6":"Toy Story 2 (USA, Europe) (SGB Enhanced) (GB Compatible)","ef24106662ae769dba0c410933736332":"Golf Daisuki! (Japan) (En) (SGB Enhanced) (GB Compatible)","ef2a181785cc591ac53e960c68e14216":"Donkey Kong 2001 (Japan)","ef451d968a8d2494840385c85c128e6f":"Alone in the Dark - The New Nightmare (Europe) (En,Fr,De,Es,It,Nl) (Beta)","ef5566473e95b1d4413b0e2e858ac56d":"Pokemon - Mewtwo Strikes Back (Taiwan) (En)","efa5853ddae4ab47301b2ca0416583a9":"Chiki Chiki Machine Mou Race (Japan)","efab73ec361b19896bfe5a09ceb53c25":"Nyghtmare - The Ninth King (World) (v0.2.5) (Beta)","efc589169180e3b278be99af8cae1a64":"Majokko Mari-chan no Kisekae Monogatari (Japan) (SGB Enhanced) (GB Compatible)","efe18a36fc03264e23ccbb81fef2beba":"Honkaku Hanafuda GB (Japan)","efeb35261663e96d216615704c469a77":"Green Beret (Unknown) (Proto 3)","eff2f1335219f77a8025e881fecf538c":"Cult of Blood, The (World) (Demo 4) (GB Compatible)","effc5fcd69d188d423c2ddf9ee0f7536":"Shi Mian Maifu - Tianlong Pian (China)","f012b129cebd445c8b63f4ddc475bb26":"Diva Starz (Germany)","f0462eba75d879c40668e20d1dbdb612":"Gex - Enter the Gecko (USA, Europe) (GB Compatible)","f0538d924e04ce032c469268c58b1c8b":"Rockets Vs Cars (World) (GB Compatible)","f0568c53b8ec915dda258955a531f37b":"R-Type DX (Japan) (En) (GB Compatible)","f0656cf3aa3d6b539fb1b7da0fd27617":"Warriors of Might and Magic (USA) (En,Fr,De)","f0691682463eb9d3ea942a2f60f29aa9":"Maus, Die (Europe) (En,Fr,De,Es) (Beta)","f09214d17150911af6aacbe5d89bc00f":"Soreike! Anpanman - 5-tsu no Tou no Ousama (Japan)","f0ae420d6ce590baac5b2ca03f4b2ba6":"Chessmaster (USA, Europe) (GB Compatible)","f0bfbded7125dd312eaf36d16c1556a1":"Rampage - World Tour (USA, Europe) (GB Compatible)","f104769941c0c25e8b468c2ae274d632":"All Humans Must Die! (World) (GB Compatible)","f16c1e8b98e0dbe969214fe3df4562d1":"Sylvanian Families 2 - Irozuku Mori no Fantasy (Japan)","f18339f4c836530bea39086969d28964":"Qui Qui (Japan) (GB Compatible)","f19153c5bc422a2b1b13a4b9ff5d7bd9":"Little Mermaid II, The - Pinball Frenzy (Europe) (En,Fr,De,Es,It)","f1a64423cc8cc50338ab69feee3199f6":"Hugo 2 1-2 (Germany) (GB Compatible)","f1b1776986bbadfa4e6771395fbc6214":"E.T. - The Extra-Terrestrial and the Cosmic Garden (USA)","f1bb0127347994b46258adbda0dc0b16":"Game & Watch Gallery 3 (USA, Europe) (SGB Enhanced) (GB Compatible)","f1e27ad24bb3bf71d1d7b048ae21f0b5":"Uno (Europe) (En,Fr,De,Es,It,Nl) (GB Compatible)","f1f013cd591bc4ea77305bbc9f8cbb3c":"Pokemon - Silberne Edition (Germany) (SGB Enhanced) (GB Compatible)","f204617e057286c4320529bf6679740f":"2003 Digimom Sapphii (Taiwan) (En)","f23a400ac0ac9c33fffb464a82ee9ba9":"Pacifist, The (World) (GB Compatible)","f270519e6357bc32fd07fc6386e14dec":"WWF Betrayal (USA, Europe)","f274752501c49963b509168cb9cdd818":"Kanji de Puzzle (Japan) (GB Compatible)","f2842c70cae57f3e7619966bd1dae886":"Pocket Golf! (USA) (Proto) (SGB Enhanced) (GB Compatible)","f2be814c8bf513e8a709254d9b72d361":"Supershot Golf Robot (USA) (Proto) (SGB Enhanced) (GB Compatible)","f2dc6c4e093e4f8c6cbea80e8dbd62cb":"Legend of Zelda, The - Oracle of Seasons (USA, Australia)","f2e24776d93082362c9b435abc167d89":"Kirby - Tilt 'n' Tumble (USA)","f2f1e41f5843c54c35e731445d6a2beb":"Tiny Toon Adventures - Dizzy's Candy Quest (Europe) (En,Fr,De,Es,It,Nl)","f32210eedc7a619a09339764887e2b93":"Wild Thornberrys, The - Rambler (USA)","f32b31ad27ffb8f40c93f92675b72bd3":"Caise Gedou 24 in 1 Diannao Huamian Xuan Game (Taiwan)","f3414d53473e2cc43347774cc5f40495":"Konami GB Collection Vol.4 (Europe) (GB Compatible)","f36a0ed25a601c039b1171d9daf241d6":"Crystalis (USA)","f36cd3e0a8a8eacf4a9c5a2a755f237e":"Wetrix GB (Japan) (SGB Enhanced) (GB Compatible)","f3ab5b9cd7e7d9478cad2cad85f3a3e6":"Knit-Wit (World) (v1.1) (GB Compatible)","f3da15bac37fd41582d8901d55fdc203":"EuroSport XS Racing (Europe) (Proto) (GB Compatible)","f3daa6ce7708668405674c735bea9745":"Monsters, Inc. (Europe) (En,Es,Nl)","f418cde12a87673da824d354a92f93e5":"Kakutou Ryouri Densetsu Bistro Recipe - Gekitou Foodon Battle Hen (Japan) (SGB Enhanced) (GB Compatible)","f47edc51d53ae8f416898b80bd3022a1":"Dragon Quest Monsters 2 - Maruta no Fushigi na Kagi - Iru no Bouken (Japan) (SGB Enhanced) (GB Compatible)","f48db23d4efec93d401aeb888088bf87":"Shengui Diguo Zhi Emo Cheng (Taiwan)","f4aa77a3a2609f42b879bc27983289bc":"Monster Go! Go! Go!! (Taiwan) (En)","f5325eaf1ecbf7cd6e1e561a3b5d77f7":"Meitantei Conan - Kigantou Hihou Densetsu (Japan) (SGB Enhanced) (GB Compatible)","f55ed9e6a8fece5220e9876fb515e222":"Monster Rancher Explorer (USA)","f56a4dd7e30ca39cfe6da0e6e6a28668":"31 in 1 (Taiwan) (31B-001, Sachen)","f5767f97f44365b703eae78afb7562e6":"Road Rash (USA, Europe)","f5780199efb64e9eee31ca35f68489da":"Cannon Fodder (Europe) (En,Fr,De,Es,It) (Beta)","f57c93ad02dab5141f7a5ba9b228977f":"Konchuu Hakase 3 (Japan) (Beta)","f5aa2d1278788af857ee082c0c03a02e":"Legend of Zelda, The - Link's Awakening DX (France) (Rev 1) (Beta) (SGB Enhanced) (GB Compatible)","f5bbcea31c08651a944a9f3ee8ee37b2":"Luoke Yingxiong EXE5 (Taiwan)","f5c243c844137701560617cf9eb7cd97":"Elemental Fighter (USA) (Proto)","f5e14b069eaddee42735572bd23f7ef8":"Pocket Monsters Eun (Korea)","f5e2ceff766584d558eff4eadbc97f2d":"Astro-Jump - The Sequel (World) (GB Compatible)","f5f4239fa64d1ea9144dd834f087c5c0":"Spectipede (World)","f66b21af086612f0f26448e63aa7a9fd":"Woody Woodpecker (Europe) (En,Fr,De,Es,It)","f67e8aa1d9c49401bfbc8dd148223d99":"Swordsman on the Eternal Journey (World) (En,Ja) (v1.01) (GB Compatible)","f687b51a0fab72e03766356b62261a49":"Looney Tunes (USA) (GB Compatible)","f6b6ddfaaf03392dc469f4eed49ec15d":"Azure Dreams (Europe) (En,Fr,De) (SGB Enhanced) (GB Compatible)","f6dd1b1e5747412b9e5f25376c972d5a":"Metal Gear Solid (USA)","f6e5ce8f0b2f886c6f26af215e2438cf":"Gakkyuu Ou Yamazaki (Japan) (Possible Proto) (GB Compatible)","f6ede04cda0b777b8973a9bcb64e4931":"Hime's Quest (World)","f7034b8297393fa04d9752d461f749a5":"Moomin no Daibouken (Japan)","f70756d7502b1374e05c7fce48a4d283":"Toonsylvania (USA)","f71ac6ac4bb335f59bfd2b594d47ab49":"Dragon Warrior Monsters 2 - Cobi's Journey (USA) (SGB Enhanced) (GB Compatible)","f722b68c0f532ed567397a3e53909ccf":"Magical Chase GB - Minarai Mahoutsukai Kenja no Tani e (Japan)","f73c5cc4935ede64f5b2d62754c90262":"Carmageddon - Carpocalypse Now (USA, Europe) (En,Fr,Es,It)","f746b0ace75ac81f1fe1122087087514":"Hauntsfield (World) (v2.0) (GB Compatible)","f75874e3654360094fc2b09bd1fed7e8":"Zelda no Densetsu - Yume o Miru Shima DX (Japan) (SGB Enhanced) (GB Compatible)","f765e4019c3ab207c5804ca530173a31":"Looney Tunes Collector - Martian Revenge! (Europe) (En,Fr,De,Es,It,Nl)","f7a5dc02b67118f6b7b8211f75625ac4":"Vegas Games (USA)","f7db0c6343b12fbef11605077af5d9a2":"GameShark Online (USA)","f7e13de010decf104efa3db865971f34":"Shanghai Pocket (Europe) (Rev 1) (SGB Enhanced) (GB Compatible)","f7e5f82ff68aa678b92e41159db34e90":"Sesame Street - Elmo's 123s (USA) (GB Compatible)","f80034c5241a063e200bce777a9f41fa":"Grimace's Birthday (World) (v1.5)","f8228ad67881ba0b2947f7a0b67de2b1":"Zelda no Densetsu - Yume o Miru Shima DX (Japan) (Beta) (GB Compatible)","f84f21fd860d1d9cfb8ca6ea62a0da8f":"Yu-Gi-Oh! Duel Monsters 4 - Battle of Great Duelist - Jounouchi Deck (Japan)","f853150641026abf3c66dbfb65da428f":"Block Droppin' (World) (v1.1) (GB Compatible)","f855638ad74a7b31cca5786a32bb8868":"International Track & Field (USA) (SGB Enhanced) (GB Compatible)","f85593061b776695d8c0daf0d411eef8":"Shanghai Pocket (USA) (SGB Enhanced) (GB Compatible)","f8690cdd39e182f3bdf09ac5559676ef":"Silent Hill 2 - 20th Anniversary Demake (World) (Proto) (GB Compatible)","f88959b615f284cc120cd17f5263d018":"Elevator Action EX (Europe) (En,Fr,De,Es,It)","f8a6836a0f3448fae3f2e79ba1d32769":"Nobunaga no Yabou - Game Boy Ban 2 (Japan) (SGB Enhanced) (GB Compatible)","f8dd50a061e428e361fd79153a7beb5d":"Mythri (USA) (Proto 2)","f8f8fedf07e783a97a50cd0e05544fc3":"Wizard of Wor (World)","f91bc9d802e1fa17e5611bdd9f0d4d60":"Pine Creek (World) (En-US,Es-MX,Pt-BR) (v2.2) (Beta) (GB Compatible)","f94b2a0548f59d5b90533ed79db9d43e":"Digimon 3 Crystal (Taiwan) (En)","f94f61e6beaec6222e0d35229e2e271e":"Balloon Fight GB (Japan) (SGB Enhanced, GB Compatible) (NP)","f9594360b2a4ed8745b63304063baabb":"Inspector Gadget - Operation Madkactus (USA)","f9726ee26bcba4308493cbbb2ae7b3ea":"Yuenan Zhanyi - Chong Jian Tian Ri (Taiwan)","f985329ca65d773c7bdb40e22612199a":"POWA! (World) (Eu) (GB Compatible)","f9af3abe9471549ff21cea6d81bafc63":"Adventures in Carnal Hell, The (World) (Ja) (v1.02) (GB Compatible)","f9be99d213760ba2e9525abea1de3cb6":"Maus, Die (Europe) (En,Fr,De,Es)","f9c554dfce8383f16e554b61083f0922":"Evel Knievel (USA) (GB Compatible)","f9ec4cc3c9df3887dc731ccf53663ffb":"Pokemon Puzzle Challenge (USA, Australia)","f9feabe8eb6d7921a883fd74faf08bcc":"Ruby & Rusty Save the Crows (World) (v2.6) (GB Compatible)","fa646273b3c23600957c8ccb390a4c51":"AF+ER (World) (GB Compatible)","fa826469ab786988785b6ef36e902010":"Beauty and the Beast - A Board Game Adventure (USA, Australia) (SGB Enhanced) (GB Compatible)","fa8360094cae37a838fabcfd333ae300":"Wizardry Empire - Fukkatsu no Tsue (Japan)","faab6966e9ed5e80ff724cafde1e903d":"Driver (Europe) (En,Fr,De,Es,It)","fac13870841c0f570fff95b0c53a6e24":"Tom and Jerry (USA, Europe)","fac7b33c7d7d3b92e39dfd325e9c7f9a":"Trouble City - Pocket Mission (World) (GB Compatible)","faf6768ebd1b7a72783a2c30fd3eca17":"Musical Notes (World)","fb16f88f0454e1d038c53be5682a017d":"Autobahn (World)","fb343f6c1e4d9ddb10f160ede0f3410e":"Sewing Machine Operation Software (Europe) (En,Fr,Es,Pt) (Proto) (GB Compatible)","fb3c040f2cc720ee26f9744e55371d07":"Trick Boarder (USA)","fb74342ca6ca49f3bad3f6934e13e10f":"Number Builder (World)","fb7b02c4a6e29303255bf0bc6fc819fb":"Friendly Fire (World)","fbbf7c3c11242356586abf2a2c99a6b6":"e'Fighter HOT (Taiwan) (En)","fbc62eb7d5e05f092fd8412bcb9754e3":"Chrome and Blood (World) (v1.00) (Proto) (GB Compatible)","fbd15fa51a3bce25d9041cc522af7fb4":"Hero Hero-kun (Japan)","fbe20570c2e52c937a9395024069ba3c":"Pokemon Pinball (USA, Australia) (Rumble Version) (SGB Enhanced) (GB Compatible)","fbf1ffe76883dffcca299228c81f171f":"Mobile Golf (Japan)","fbfbec8d91d281ca13e52085819058c5":"Nightmare Hamlet (World)","fc03e910ec8028a30f15feee2243d9cb":"Chase H.Q. - Secret Police (Europe) (SGB Enhanced) (GB Compatible)","fc2629620c6a8b67550df2773333788d":"Roi Lion, Le - La Formidable Aventure de Simba (France)","fc327cdb1f787046dae8a17305f10261":"Pumuckls Abenteuer bei den Piraten (Germany)","fca034c2494a20c8a75dd1ff0bcc7545":"Game Boy Gallery 4 (Australia) (SGB Enhanced) (GB Compatible)","fcdd17dd69e273c2830e4eb886fdaf78":"Chaoji Gedou 2001 Alpha (Taiwan)","fcdeae417e8bdf89f1300311e4be5c57":"Postie (World) (v1.1) (GB Compatible)","fce7079639133df3c4d1f7beb8a89b21":"Neighbor (World) (GB Compatible)","fcf910e4d2f27bab40244eb7bf4aa2d3":"Wizardry Empire (Japan) (Rev 1)","fd1f17aa8c4b5c2963db8b0444673a3d":"Battleship (USA, Europe) (GB Compatible)","fd4c412dfb452c267edb508b0e899fdb":"Tristam Island (World) (v1.6) (GB Compatible)","fd5d1ad9fa778895fa24d1fe1eca52b7":"Powerpuff Girls, The - Bulle Contre Lui (France)","fd91d5d69c43f2f0406b3626d625b6e6":"Resident Evil (World) (Proto 2)","fdade90c72f29a498e045323dda5ad37":"Varmit (World)","fdf70472390282fe62765a0838318e52":"Casper (Europe) (En,Fr,De)","fdf704aff61ad3e6848642241ddb6032":"Marvin Strikes Back! (USA) (En,Fr,Es)","fe002ee7d615bf7b728bf6031645b168":"Spy vs Spy (Europe) (En,Fr,De,Es,It,Nl,Sv)","fe22797c8098ac1c18a80875e29aa09b":"Inspector Gadget - Operation Madkactus (Europe) (Fr) (Beta)","fe2df6252f512957b081c1663086b588":"Guaishou Go! Go! II (Taiwan)","fe510196e7fd81b5d9ab9cca091435d7":"Powerpuff Girls, The - Bad Mojo Jojo (Europe) (BJJP)","fe5f723b01bc8cdf7ec1c4a3a61e4ba8":"Shuma Baolong - Diannao Pian (Taiwan) (Zh)","fe97e6bb194bd38e5baeb889b4c8e251":"Marie no Atelier GB (Japan) (SGB Enhanced) (GB Compatible)","feb32471ea029a55d7bdea7e0bdc6961":"Rayman 2 (USA) (En,Fr,De,Es,It)","febd6cdb9f12b6003d7ef33045ef7079":"Spawn (USA)","fee6336f969c9e72e9b78be53d512c1e":"Conker's Pocket Tales (USA, Europe) (En,Fr,De) (SGB Enhanced) (GB Compatible)","ff0001c209fc894c26b339a1519f38a6":"Daikaijuu Monogatari - The Miracle of the Zone II (Japan) (SGB Enhanced) (GB Compatible)","ff1b35a16b0eca8e1fb10af164e66421":"Backgammon (Europe) (En,Fr,De,Es) (GB Compatible)","ff3531643a965dd351b54f32c280c9c0":"Stratacombo (World) (v1.2) (Proto) (GB Compatible)","ff69bcdedca5ac1325af47d8a1e4823f":"Daikatana (USA) (Proto 1)","ff92e59c47a990815bc548e5e253c390":"Chase H.Q. - Secret Police (USA) (SGB Enhanced) (GB Compatible)","ff9b78e1f399fc2bd665b8a08ba27456":"Mickey's Speedway USA (USA, Europe) (En,Fr,De,Es)","ffa003fa747731a9fd547260598538cb":"Dragon Ball Z - Les Guerriers Legendaires (France)","ffadefd2e7e6325cd33f834915a09c8b":"Floracy (Europe) (Proto)","ffe6f6d5b40e249a03b8c80ab140f56d":"Commando (World)"}
\ No newline at end of file
diff --git a/lib/gemba/emulator_frame.rb b/lib/gemba/emulator_frame.rb
index 37ebe55..ae5abff 100644
--- a/lib/gemba/emulator_frame.rb
+++ b/lib/gemba/emulator_frame.rb
@@ -88,6 +88,7 @@ def initialize(app:, config:, platform:, sound:, scale:,
@input_recorder = nil
@save_mgr = nil
@rewind_frame_counter = 0
+ @achievement_backend = Achievements::NullBackend.new
end
# -- Public accessors -------------------------------------------------------
@@ -113,6 +114,17 @@ def initialize(app:, config:, platform:, sound:, scale:,
# @return [Integer] turbo speed multiplier (0 = uncapped)
attr_reader :turbo_speed
+ # @return [Achievements::Backend]
+ attr_reader :achievement_backend
+
+ # Swap in a new achievement backend. Registers callbacks that forward
+ # unlock events through EventBus for any UI consumer to handle.
+ # @param backend [Achievements::Backend]
+ def achievement_backend=(backend)
+ @achievement_backend = backend
+ backend.on_unlock { |ach| emit(:achievement_unlocked, achievement: ach) }
+ end
+
# @return [Boolean]
def muted? = @muted
@@ -272,7 +284,7 @@ def init_sdl2
# @param bios_path [String, nil] full path to BIOS file (loaded before reset)
# @param rom_source_path [String] original path (for input recorder)
# @return [Core] the new core
- def load_core(rom_path, saves_dir:, bios_path: nil, rom_source_path: nil)
+ def load_core(rom_path, saves_dir:, bios_path: nil, rom_source_path: nil, md5: nil)
stop_recording if @recorder&.recording?
stop_input_recording if @input_recorder&.recording?
@@ -284,6 +296,7 @@ def load_core(rom_path, saves_dir:, bios_path: nil, rom_source_path: nil)
FileUtils.mkdir_p(saves_dir) unless File.directory?(saves_dir)
@core = Core.new(rom_path, saves_dir, bios_path)
@rom_source_path = rom_source_path || rom_path
+ @rom_md5 = md5
new_platform = Platform.for(@core)
if new_platform != @platform
@@ -307,6 +320,8 @@ def load_core(rom_path, saves_dir:, bios_path: nil, rom_source_path: nil)
@next_frame = @fps_time
@audio_samples_produced = 0
+ @achievement_backend.load_game(@core, @rom_source_path, @rom_md5)
+
@core
end
@@ -415,8 +430,18 @@ def save_state(slot)
def load_state(slot)
return unless @save_mgr
- _ok, msg = @save_mgr.load_state(slot)
+ ok, msg = @save_mgr.load_state(slot)
@toast&.show(msg) if msg
+ # After a save state loads, memory jumps abruptly to whatever it was when
+ # the state was saved. Achievements that were already in stage 3 (active)
+ # would fire immediately if the saved memory happens to satisfy their
+ # conditions. Reset all achievements back through the priming/waiting
+ # startup sequence — same as what rcheevos does on state load.
+ if ok
+ Gemba.log(:info) { "save state loaded (slot #{slot}) — resetting achievement runtime" }
+ @achievement_backend.reset_runtime
+ render_clean_if_paused
+ end
end
def quick_save
@@ -427,8 +452,14 @@ def quick_save
def quick_load
return unless @save_mgr
- _ok, msg = @save_mgr.quick_load
+ ok, msg = @save_mgr.quick_load
@toast&.show(msg) if msg
+ # Same as load_state — memory jumped, reset achievement runtime.
+ if ok
+ Gemba.log(:info) { "quick save state loaded — resetting achievement runtime" }
+ @achievement_backend.reset_runtime
+ render_clean_if_paused
+ end
end
# -- Screenshot -------------------------------------------------------------
@@ -806,6 +837,7 @@ def run_one_frame
@rewind_frame_counter = 0
end
end
+ @achievement_backend.do_frame(@core)
end
# -- Input ------------------------------------------------------------------
@@ -817,17 +849,17 @@ def setup_input
else
mods = HotkeyMap.modifiers_from_state(state_str.to_i)
case @hotkeys.action_for(k, modifiers: mods)
- when :quit then emit(:request_quit)
+ when :quit then @app.command(:event, 'generate', '.', '<>')
when :pause then toggle_pause
when :fast_forward then toggle_fast_forward
when :fullscreen then emit(:request_fullscreen)
when :show_fps then emit(:request_show_fps_toggle)
- when :quick_save then quick_save
- when :quick_load then quick_load
+ when :quick_save then @app.command(:event, 'generate', '.', '<>')
+ when :quick_load then @app.command(:event, 'generate', '.', '<>')
when :save_states then emit(:request_save_states)
when :screenshot then take_screenshot
when :rewind then do_rewind
- when :record then toggle_recording
+ when :record then @app.command(:event, 'generate', '.', '<>')
when :input_record then toggle_input_recording
when :open_rom then emit(:request_open_rom)
else @keyboard.press(k)
@@ -844,6 +876,14 @@ def setup_input
start_focus_poll
+ # Virtual event bindings — bound on '.' so tests can trigger them directly
+ # without needing widget focus. Physical key handlers above translate to
+ # these virtual events so the action logic lives in one place.
+ @app.command(:bind, '.', '<>', proc { emit(:request_quit) })
+ @app.command(:bind, '.', '<>', proc { quick_save })
+ @app.command(:bind, '.', '<>', proc { quick_load })
+ @app.command(:bind, '.', '<>', proc { toggle_recording })
+
# Alt+Return fullscreen toggle (emulator convention)
@app.command(:bind, @viewport.frame.path, '', proc { emit(:request_fullscreen) })
end
@@ -887,6 +927,16 @@ def render_if_paused
render_frame if @paused && @core && @texture
end
+ # Like render_if_paused but suppresses frame blending for one frame.
+ # Used after state loads: mGBA's previous-frame buffer is stale, so blending
+ # would show a mix of the pre-load frame and the saved state frame.
+ def render_clean_if_paused
+ return unless @paused && @core && @texture
+ @core.frame_blending = false if @frame_blending
+ render_frame
+ @core.frame_blending = true if @frame_blending
+ end
+
def compute_dest_rect
return nil unless @keep_aspect_ratio
diff --git a/lib/gemba/game_index.rb b/lib/gemba/game_index.rb
index 9830350..ef1acf1 100644
--- a/lib/gemba/game_index.rb
+++ b/lib/gemba/game_index.rb
@@ -22,6 +22,15 @@ class GameIndex
"DMG" => "gb_games.json",
}.freeze
+ MD5_FILES = {
+ "AGB" => "gba_md5.json",
+ "CGB" => "gbc_md5.json",
+ "DMG" => "gb_md5.json",
+ }.freeze
+
+ # Maps RomLibrary platform short names → GameIndex prefixes
+ PLATFORM_PREFIX = { "gba" => "AGB", "gbc" => "CGB", "gb" => "DMG" }.freeze
+
class << self
# Look up a canonical game name by serial code.
# @param game_code [String] e.g. "AGB-AXVE", "CGB-BYTE", "DMG-XXXX"
@@ -30,12 +39,26 @@ def lookup(game_code)
return nil unless game_code && !game_code.empty?
platform = game_code.split("-", 2).first
- index = index_for(platform)
+ index = index_for(platform, PLATFORM_FILES)
return nil unless index
index[game_code]
end
+ # Look up a canonical game name by MD5 hex digest.
+ # @param md5 [String] hex MD5 of ROM content (any case)
+ # @param platform [String] short name from RomLibrary — "gba", "gbc", or "gb"
+ # @return [String, nil]
+ def lookup_by_md5(md5, platform)
+ return nil unless md5 && !md5.empty?
+
+ prefix = PLATFORM_PREFIX[platform.to_s.downcase]
+ return nil unless prefix
+
+ idx = index_for(prefix, MD5_FILES)
+ idx&.[](md5.downcase)
+ end
+
# Force-reload all indexes (useful after re-baking).
def reset!
@indexes = {}
@@ -43,17 +66,18 @@ def reset!
private
- def index_for(platform)
+ def index_for(platform, files)
@indexes ||= {}
- return @indexes[platform] if @indexes.key?(platform)
+ key = "#{platform}:#{files.object_id}"
+ return @indexes[key] if @indexes.key?(key)
- file = PLATFORM_FILES[platform]
- return(@indexes[platform] = nil) unless file
+ file = files[platform]
+ return(@indexes[key] = nil) unless file
path = File.join(DATA_DIR, file)
- return(@indexes[platform] = nil) unless File.exist?(path)
+ return(@indexes[key] = nil) unless File.exist?(path)
- @indexes[platform] = JSON.parse(File.read(path))
+ @indexes[key] = JSON.parse(File.read(path))
end
end
end
diff --git a/lib/gemba/game_picker_frame.rb b/lib/gemba/game_picker_frame.rb
index bab5725..884a90a 100644
--- a/lib/gemba/game_picker_frame.rb
+++ b/lib/gemba/game_picker_frame.rb
@@ -25,10 +25,10 @@ class GamePickerFrame
PICKER_ASPECT_H = 4
# Default and minimum picker window dimensions (must satisfy PICKER_ASPECT ratio)
- PICKER_DEFAULT_W = 640
- PICKER_DEFAULT_H = 854 # 640 * 4/3, rounded up
- PICKER_MIN_W = 480
- PICKER_MIN_H = 640
+ PICKER_DEFAULT_W = 768
+ PICKER_DEFAULT_H = 1024 # 768 * 4/3
+ PICKER_MIN_W = 576
+ PICKER_MIN_H = 768
def initialize(app:, rom_library:, boxart_fetcher: nil, rom_overrides: nil)
@app = app
@@ -96,7 +96,12 @@ def build_ui
title_lbl = "#{cell}.title"
@app.command(:label, title_lbl, text: '', anchor: :center,
bg: '#2a2a2a', fg: '#cccccc',
- font: '{TkDefaultFont} 10')
+ font: '{TkDefaultFont} 10',
+ justify: :center, wraplength: IMG_SIZE)
+ @app.command(:bind, title_lbl, '', proc {
+ w = @app.tcl_eval("winfo width #{title_lbl}").to_i
+ @app.command(title_lbl, :configure, wraplength: w - 8) if w > 8
+ })
@app.command(:pack, title_lbl, fill: :x, pady: [4, 2])
plat_lbl = "#{cell}.plat"
diff --git a/lib/gemba/locales/en.yml b/lib/gemba/locales/en.yml
index 31bb4f8..dc28036 100644
--- a/lib/gemba/locales/en.yml
+++ b/lib/gemba/locales/en.yml
@@ -8,6 +8,7 @@ menu:
game_library: "Game Library"
fullscreen: "Fullscreen"
rom_info: "ROM Info…"
+ achievements: "Achievements…"
open_logs_dir: "Open Logs Directory"
patch_rom: "Patch ROM…"
emulation: "Emulation"
@@ -47,6 +48,8 @@ dialog:
game_running_msg: "Another game is running. Switch to {name}?"
return_to_library_title: "Return to Game Library"
return_to_library_msg: "Return to the Game Library? Unsaved progress will be lost."
+ quit_title: "Quit Gemba"
+ quit_msg: "A game is running. Quit anyway? Unsaved progress will be lost."
drop_error_title: "Drop Error"
drop_single_file_only: "Please drop a single ROM file."
drop_unsupported_type: "Unsupported file type: {ext}"
@@ -60,6 +63,8 @@ dialog:
reset_hotkeys_title: "Reset Hotkeys"
reset_hotkeys_msg: "Reset all hotkey bindings to defaults?"
key_conflict_title: "Key Conflict"
+ cancel_bulk_sync_title: "Cancel Sync?"
+ cancel_bulk_sync_msg: "A bulk sync is in progress. Closing will cancel it — games will need to be re-synced manually."
settings:
video: "Video"
@@ -131,6 +136,24 @@ settings:
bios_not_found: "File not found"
skip_bios: "Skip boot animation"
tip_skip_bios: "Jump straight to the game, skipping the Game Boy Advance logo screen.\nOnly applies when a real BIOS file is loaded."
+ retroachievements: "Achievements"
+ ra_enabled: "Enable RetroAchievements"
+ ra_credentials: "Account"
+ ra_username_placeholder: "Username:"
+ ra_token_placeholder: "Password:"
+ ra_rich_presence: "Rich Presence (per-game)"
+ ra_hardcore: "Hardcore mode (disables save states and rewind)"
+ tip_ra_password: "Your password is only used to fetch an API token and is never saved."
+ ra_login: "Login"
+ ra_verify: "Verify Token"
+ ra_logout: "Logout"
+ ra_reset: "Reset"
+ ra_reset_title: "Reset RetroAchievements"
+ ra_reset_confirm: "Clear saved credentials and log out?"
+ ra_test_ok: "Connection OK ✓"
+ ra_disabled: "RetroAchievements is disabled"
+ ra_not_logged_in: "Not logged in"
+ ra_logged_in_as: "Logged in as {username}"
recording: "Recording"
recording_compression: "Compression:"
tip_recording_compression: "Zlib level for .grec files.\n1 = fastest (default), 6+ has diminishing returns."
@@ -206,3 +229,21 @@ player:
ff_max: ">> MAX"
none: "(none)"
clear: "Clear"
+
+achievements:
+ title: "Achievements"
+ game_label: "Game:"
+ sync: "Sync"
+ name_col: "Achievement"
+ points_col: "Points"
+ earned_col: "Earned"
+ none: "No achievements loaded"
+ earned_label: "{earned} / {total} earned"
+ sync_pending: "Syncing…"
+ sync_failed: "Sync failed"
+ sync_no_game: "No game loaded"
+ sync_timeout: "Sync timed out"
+ not_logged_in: "Not logged in"
+ include_unofficial: "Include Unofficial"
+ bulk_syncing: "Syncing {title} ({n}/{total})…"
+ bulk_sync_done: "Synced {count} games"
diff --git a/lib/gemba/locales/ja.yml b/lib/gemba/locales/ja.yml
index 1a6dbac..b0ff827 100644
--- a/lib/gemba/locales/ja.yml
+++ b/lib/gemba/locales/ja.yml
@@ -8,6 +8,7 @@ menu:
game_library: "ゲームライブラリ"
fullscreen: "フルスクリーン"
rom_info: "ROM情報…"
+ achievements: "アチーブメント…"
open_logs_dir: "ログフォルダを開く"
patch_rom: "ROMをパッチ…"
emulation: "エミュレーション"
@@ -47,6 +48,8 @@ dialog:
game_running_msg: "別のゲームが実行中です。{name}に切り替えますか?"
return_to_library_title: "ゲームライブラリに戻る"
return_to_library_msg: "ゲームライブラリに戻りますか?保存されていない進行状況は失われます。"
+ quit_title: "Gembaを終了"
+ quit_msg: "ゲームが実行中です。終了しますか?保存されていない進行状況は失われます。"
drop_error_title: "ドロップエラー"
drop_single_file_only: "ROMファイルを1つだけドロップしてください。"
drop_unsupported_type: "対応していないファイル形式: {ext}"
@@ -60,6 +63,8 @@ dialog:
reset_hotkeys_title: "ホットキーをリセット"
reset_hotkeys_msg: "すべてのホットキー設定をデフォルトに戻しますか?"
key_conflict_title: "キーの競合"
+ cancel_bulk_sync_title: "同期をキャンセル?"
+ cancel_bulk_sync_msg: "一括同期が実行中です。閉じるとキャンセルされます — 手動で再同期が必要になります。"
settings:
video: "映像"
@@ -131,6 +136,24 @@ settings:
bios_not_found: "ファイルが見つかりません"
skip_bios: "起動アニメーションをスキップ"
tip_skip_bios: "ゲームボーイアドバンスのロゴ画面をスキップして\n直接ゲームを開始します。実BIOSが必要です。"
+ retroachievements: "実績"
+ ra_enabled: "RetroAchievementsを有効にする"
+ ra_credentials: "アカウント"
+ ra_username_placeholder: "ユーザー名:"
+ ra_token_placeholder: "パスワード:"
+ ra_rich_presence: "リッチプレゼンス(ゲームごと)"
+ ra_hardcore: "ハードコアモード(セーブステートと巻き戻し無効)"
+ tip_ra_password: "パスワードはAPIトークン取得のみに使用され、保存されません。"
+ ra_login: "ログイン"
+ ra_verify: "トークン確認"
+ ra_logout: "ログアウト"
+ ra_reset: "リセット"
+ ra_reset_title: "RetroAchievementsをリセット"
+ ra_reset_confirm: "保存済みの認証情報を削除してログアウトしますか?"
+ ra_test_ok: "接続OK ✓"
+ ra_disabled: "RetroAchievementsは無効です"
+ ra_not_logged_in: "未ログイン"
+ ra_logged_in_as: "{username}でログイン中"
recording: "録画"
recording_compression: "圧縮レベル:"
tip_recording_compression: ".grecファイルのzlib圧縮レベル。\n1 = 最速(デフォルト)、6以上は効果が小さくなります。"
@@ -206,3 +229,21 @@ player:
ff_max: ">> 最大"
none: "(なし)"
clear: "クリア"
+
+achievements:
+ title: "アチーブメント"
+ game_label: "ゲーム:"
+ sync: "同期"
+ name_col: "アチーブメント"
+ points_col: "ポイント"
+ earned_col: "取得日時"
+ none: "アチーブメントなし"
+ earned_label: "{earned} / {total} 取得"
+ sync_pending: "同期中…"
+ sync_failed: "同期に失敗しました"
+ sync_no_game: "ゲームが読み込まれていません"
+ sync_timeout: "同期がタイムアウトしました"
+ not_logged_in: "ログインしていません"
+ include_unofficial: "非公式を含む"
+ bulk_syncing: "{title} を同期中 ({n}/{total})…"
+ bulk_sync_done: "{count} ゲームを同期しました"
diff --git a/lib/gemba/rom_info.rb b/lib/gemba/rom_info.rb
index c6ff7a4..dc60d21 100644
--- a/lib/gemba/rom_info.rb
+++ b/lib/gemba/rom_info.rb
@@ -18,6 +18,7 @@ module Gemba
:platform, # String — uppercased, e.g. "GBA"
:game_code, # String? — 4-char code e.g. "AGB-AXVE", or nil
:path, # String — absolute path to the ROM file
+ :md5, # String? — MD5 hex digest of ROM content, or nil (lazy)
:has_official_entry, # Boolean — GameIndex has an entry for this game_code
:cached_boxart_path, # String? — auto-fetched cover from libretro CDN, or nil
:custom_boxart_path # String? — user-set cover image path, or nil
@@ -34,17 +35,20 @@ def boxart_path
# @param rom [Hash] entry from RomLibrary#all
# @param fetcher [BoxartFetcher, nil]
# @param overrides [RomOverrides, nil]
- def self.from_rom(rom, fetcher: nil, overrides: nil)
+ def self.from_rom(rom, fetcher: nil, overrides: nil, game_index: GameIndex)
game_code = rom['game_code']
rom_id = rom['rom_id']
new(
rom_id: rom_id,
- title: rom['title'] || rom['rom_id'] || '???',
+ title: game_index.lookup(game_code) ||
+ game_index.lookup_by_md5(rom['md5'], rom['platform'] || 'gba') ||
+ rom['title'] || rom['rom_id'] || '???',
platform: (rom['platform'] || 'gba').upcase,
game_code: game_code,
path: rom['path'],
- has_official_entry: game_code ? !GameIndex.lookup(game_code).nil? : false,
+ md5: rom['md5'],
+ has_official_entry: game_code ? !game_index.lookup(game_code).nil? : false,
cached_boxart_path: (fetcher.cached_path(game_code) if fetcher&.cached?(game_code)),
custom_boxart_path: overrides&.custom_boxart(rom_id),
)
diff --git a/lib/gemba/rom_library.rb b/lib/gemba/rom_library.rb
index 822e450..52ba148 100644
--- a/lib/gemba/rom_library.rb
+++ b/lib/gemba/rom_library.rb
@@ -77,13 +77,14 @@ def save!
private
def subscribe_to_bus
- Gemba.bus.on(:rom_loaded) do |rom_id:, path:, title:, game_code:, platform:, **|
+ Gemba.bus.on(:rom_loaded) do |rom_id:, path:, title:, game_code:, platform:, md5: nil, **|
add(
'rom_id' => rom_id,
'path' => path,
'title' => title,
'game_code' => game_code,
'platform' => platform.downcase,
+ 'md5' => md5,
)
touch(rom_id)
save!
diff --git a/lib/gemba/runtime.rb b/lib/gemba/runtime.rb
index 7e5d502..70b504e 100644
--- a/lib/gemba/runtime.rb
+++ b/lib/gemba/runtime.rb
@@ -65,6 +65,7 @@ def log(level = :info, &block)
loader.ignore(__FILE__) # bootstrap file — not a constant
loader.ignore(File.expand_path("../../gemba.rb", __FILE__)) # entry point, not a constant
loader.ignore(File.expand_path("../platform_open.rb", __FILE__)) # module method, not a constant
+loader.ignore(File.expand_path("../version.rb", __FILE__)) # defines VERSION (all-caps), not Zeitwerk-compatible
loader.setup
# Initialize locale on require
diff --git a/lib/gemba/settings/system_tab.rb b/lib/gemba/settings/system_tab.rb
index 0560eff..cabd66f 100644
--- a/lib/gemba/settings/system_tab.rb
+++ b/lib/gemba/settings/system_tab.rb
@@ -6,15 +6,37 @@ class SystemTab
include Locale::Translatable
include BusEmitter
- FRAME = "#{Paths::NB}.system"
- BIOS_ENTRY = "#{FRAME}.bios_row.entry"
- BIOS_BROWSE = "#{FRAME}.bios_row.browse"
- BIOS_CLEAR = "#{FRAME}.bios_row.clear"
- BIOS_STATUS = "#{FRAME}.bios_status"
+ FRAME = "#{Paths::NB}.system"
+ BIOS_ENTRY = "#{FRAME}.bios_row.entry"
+ BIOS_BROWSE = "#{FRAME}.bios_row.browse"
+ BIOS_CLEAR = "#{FRAME}.bios_row.clear"
+ BIOS_STATUS = "#{FRAME}.bios_status"
SKIP_BIOS_CHECK = "#{FRAME}.skip_row.check"
- VAR_BIOS_PATH = '::gemba_bios_path'
- VAR_SKIP_BIOS = '::gemba_skip_bios'
+ RA_ENABLED_CHECK = "#{FRAME}.ra_enabled_row.check"
+ RA_USERNAME_ENTRY = "#{FRAME}.ra_creds_row.username"
+ RA_USERNAME_RO = "#{FRAME}.ra_creds_row.username_ro"
+ RA_TOKEN_ENTRY = "#{FRAME}.ra_creds_row.token"
+ RA_TOKEN_RO = "#{FRAME}.ra_creds_row.token_ro"
+ RA_LOGIN_BTN = "#{FRAME}.ra_btn_row.login"
+ RA_VERIFY_BTN = "#{FRAME}.ra_btn_row.verify"
+ RA_LOGOUT_BTN = "#{FRAME}.ra_btn_row.logout"
+ RA_RESET_BTN = "#{FRAME}.ra_btn_row.reset"
+ RA_FEEDBACK_LABEL = "#{FRAME}.ra_feedback"
+ RA_HARDCORE_CHECK = "#{FRAME}.ra_hardcore_row.check"
+ RA_RICH_PRESENCE_CHECK = "#{FRAME}.ra_rich_presence_row.check"
+
+ VAR_BIOS_PATH = '::gemba_bios_path'
+ VAR_SKIP_BIOS = '::gemba_skip_bios'
+ VAR_RA_ENABLED = '::gemba_ra_enabled'
+ VAR_RA_USERNAME = '::gemba_ra_username'
+ VAR_RA_TOKEN = '::gemba_ra_token'
+ VAR_RA_HARDCORE = '::gemba_ra_hardcore'
+ VAR_RA_UNOFFICIAL = '::gemba_ra_unofficial'
+ VAR_RA_PASSWORD = '::gemba_ra_password'
+ VAR_RA_RICH_PRESENCE = '::gemba_ra_rich_presence'
+
+ RA_UNOFFICIAL_CHECK = "#{FRAME}.ra_unofficial_row.check"
def initialize(app, tips:, mark_dirty:)
@app = app
@@ -28,6 +50,7 @@ def build
build_bios_section
build_skip_bios_row
+ build_ra_section
end
# Called by SettingsWindow via :config_loaded bus event
@@ -41,17 +64,38 @@ def load_from_config(config)
else
@app.command(BIOS_STATUS, :configure, text: translate('settings.bios_not_set'))
end
+
+ @app.set_variable(VAR_RA_ENABLED, config.ra_enabled? ? '1' : '0')
+ @app.set_variable(VAR_RA_USERNAME, config.ra_username.to_s)
+ @app.set_variable(VAR_RA_HARDCORE, config.ra_hardcore? ? '1' : '0')
+ @app.set_variable(VAR_RA_UNOFFICIAL, config.ra_unofficial? ? '1' : '0')
+ @app.set_variable(VAR_RA_RICH_PRESENCE, config.ra_rich_presence? ? '1' : '0')
+ @app.set_variable(VAR_RA_PASSWORD, '')
+
+ @presenter&.dispose
+ @presenter = Achievements::CredentialsPresenter.new(config)
+ Gemba.bus.on(:credentials_changed) { apply_presenter_state }
+ Gemba.bus.on(:ra_token_test_ok) { @app.after(3000) { @presenter&.clear_transient } }
+ apply_presenter_state
+ end
+
+ # Called by AppController#save_config
+ def save_to_config(config)
+ config.ra_enabled = @app.get_variable(VAR_RA_ENABLED) == '1'
+ config.ra_username = @presenter ? @presenter.username : @app.get_variable(VAR_RA_USERNAME).to_s.strip
+ config.ra_token = @presenter ? @presenter.token : ''
+ config.ra_hardcore = @app.get_variable(VAR_RA_HARDCORE) == '1'
+ config.ra_rich_presence = @app.get_variable(VAR_RA_RICH_PRESENCE) == '1'
+ # Password is never persisted — ephemeral field only
end
private
def build_bios_section
- # Header label
hdr = "#{FRAME}.bios_hdr"
@app.command('ttk::label', hdr, text: translate('settings.bios_header'))
@app.command(:pack, hdr, anchor: :w, padx: 10, pady: [15, 2])
- # Path row: readonly entry + Browse + Clear
row = "#{FRAME}.bios_row"
@app.command('ttk::frame', row)
@app.command(:pack, row, fill: :x, padx: 10, pady: [0, 4])
@@ -73,7 +117,6 @@ def build_bios_section
command: proc { clear_bios })
@app.command(:pack, BIOS_CLEAR, side: :left)
- # Status label
@app.command('ttk::label', BIOS_STATUS, text: translate('settings.bios_not_set'))
@app.command(:pack, BIOS_STATUS, anchor: :w, padx: 14, pady: [0, 10])
end
@@ -96,6 +139,131 @@ def build_skip_bios_row
@tips.register(tip_lbl, translate('settings.tip_skip_bios'))
end
+ def build_ra_section
+ sep = "#{FRAME}.ra_sep"
+ @app.command('ttk::separator', sep, orient: :horizontal)
+ @app.command(:pack, sep, fill: :x, padx: 10, pady: [12, 0])
+
+ hdr = "#{FRAME}.ra_hdr"
+ @app.command('ttk::label', hdr, text: translate('settings.retroachievements'))
+ @app.command(:pack, hdr, anchor: :w, padx: 10, pady: [8, 2])
+
+ # Enable checkbox
+ enabled_row = "#{FRAME}.ra_enabled_row"
+ @app.command('ttk::frame', enabled_row)
+ @app.command(:pack, enabled_row, fill: :x, padx: 10, pady: [0, 6])
+ @app.set_variable(VAR_RA_ENABLED, '0')
+ @app.command('ttk::checkbutton', RA_ENABLED_CHECK,
+ text: translate('settings.ra_enabled'),
+ variable: VAR_RA_ENABLED,
+ command: proc { @mark_dirty.call; @presenter&.enabled = (@app.get_variable(VAR_RA_ENABLED) == '1') })
+ @app.command(:pack, RA_ENABLED_CHECK, side: :left)
+
+ # Username + password fields
+ creds_row = "#{FRAME}.ra_creds_row"
+ @app.command('ttk::frame', creds_row)
+ @app.command(:pack, creds_row, fill: :x, padx: 10, pady: [0, 4])
+
+ @app.command('ttk::label', "#{creds_row}.username_lbl",
+ text: translate('settings.ra_username_placeholder'))
+ @app.command(:pack, "#{creds_row}.username_lbl", side: :left, padx: [0, 4])
+
+ @app.set_variable(VAR_RA_USERNAME, '')
+ @app.command('ttk::entry', RA_USERNAME_ENTRY,
+ textvariable: VAR_RA_USERNAME,
+ width: 18)
+ @app.command(:pack, RA_USERNAME_ENTRY, side: :left, padx: [0, 10])
+ @app.command(:bind, RA_USERNAME_ENTRY, '', proc { @presenter&.username = @app.get_variable(VAR_RA_USERNAME) })
+
+ # Readonly display variant — tk::entry so we can control background color.
+ # Not packed initially; swapped in by apply_presenter_state when logged in.
+ @app.command('entry', RA_USERNAME_RO,
+ textvariable: VAR_RA_USERNAME,
+ state: :readonly,
+ readonlybackground: '#cccccc',
+ relief: :sunken,
+ width: 18)
+
+ pw_lbl = "#{creds_row}.pw_lbl"
+ @app.command('ttk::label', pw_lbl,
+ text: translate('settings.ra_token_placeholder'))
+ @app.command(:pack, pw_lbl, side: :left, padx: [0, 4])
+ @tips.register(pw_lbl, translate('settings.tip_ra_password'))
+
+ @app.set_variable(VAR_RA_PASSWORD, '')
+ @app.command('ttk::entry', RA_TOKEN_ENTRY,
+ textvariable: VAR_RA_PASSWORD,
+ show: '*',
+ width: 18)
+ @app.command(:pack, RA_TOKEN_ENTRY, side: :left)
+ @app.command(:bind, RA_TOKEN_ENTRY, '', proc { @presenter&.password = @app.get_variable(VAR_RA_PASSWORD) })
+
+ # Readonly password display — always empty after login (password is ephemeral).
+ # Not packed initially; swapped in by apply_presenter_state when logged in.
+ @app.command('entry', RA_TOKEN_RO,
+ state: :readonly,
+ readonlybackground: '#cccccc',
+ relief: :sunken,
+ width: 18)
+
+ # Login / Test / Logout buttons
+ btn_row = "#{FRAME}.ra_btn_row"
+ @app.command('ttk::frame', btn_row)
+ @app.command(:pack, btn_row, fill: :x, padx: 10, pady: [4, 0])
+
+ @app.command('ttk::button', RA_LOGIN_BTN,
+ text: translate('settings.ra_login'),
+ state: :disabled,
+ command: proc { emit(:ra_login,
+ username: @app.get_variable(VAR_RA_USERNAME).strip,
+ password: @app.get_variable(VAR_RA_PASSWORD)) })
+ @app.command(:pack, RA_LOGIN_BTN, side: :left, padx: [0, 6])
+
+ @app.command('ttk::button', RA_VERIFY_BTN,
+ text: translate('settings.ra_verify'),
+ state: :disabled,
+ command: proc { emit(:ra_verify) })
+ @app.command(:pack, RA_VERIFY_BTN, side: :left, padx: [0, 6])
+
+ @app.command('ttk::button', RA_LOGOUT_BTN,
+ text: translate('settings.ra_logout'),
+ state: :disabled,
+ command: proc { emit(:ra_logout) })
+ @app.command(:pack, RA_LOGOUT_BTN, side: :left, padx: [0, 6])
+
+ @app.command('ttk::button', RA_RESET_BTN,
+ text: translate('settings.ra_reset'),
+ state: :disabled,
+ command: proc { confirm_ra_reset })
+ @app.command(:pack, RA_RESET_BTN, side: :left)
+
+ # Feedback label — shows auth result, errors, etc.
+ @app.command('ttk::label', RA_FEEDBACK_LABEL, text: '')
+ @app.command(:pack, RA_FEEDBACK_LABEL, anchor: :w, padx: 14, pady: [4, 6])
+
+ # Rich Presence (per-game)
+ rp_row = "#{FRAME}.ra_rich_presence_row"
+ @app.command('ttk::frame', rp_row)
+ @app.command(:pack, rp_row, fill: :x, padx: 10, pady: [0, 4])
+ @app.set_variable(VAR_RA_RICH_PRESENCE, '0')
+ @app.command('ttk::checkbutton', RA_RICH_PRESENCE_CHECK,
+ text: translate('settings.ra_rich_presence'),
+ variable: VAR_RA_RICH_PRESENCE,
+ command: proc { @mark_dirty.call })
+ @app.command(:pack, RA_RICH_PRESENCE_CHECK, side: :left)
+
+ # TODO: hardcore mode — not yet wired up, hidden until ready
+ # hardcore_row = "#{FRAME}.ra_hardcore_row"
+ # @app.command('ttk::frame', hardcore_row)
+ # @app.command(:pack, hardcore_row, fill: :x, padx: 10, pady: [0, 4])
+ # @app.set_variable(VAR_RA_HARDCORE, '0')
+ # @app.command('ttk::checkbutton', RA_HARDCORE_CHECK,
+ # text: translate('settings.ra_hardcore'),
+ # variable: VAR_RA_HARDCORE,
+ # command: proc { @mark_dirty.call })
+ # @app.command(:pack, RA_HARDCORE_CHECK, side: :left)
+ end
+
def browse_bios
path = @app.tcl_eval("tk_getOpenFile -filetypes {{{BIOS Files} {.bin}} {{All Files} *}}")
return if path.to_s.strip.empty?
@@ -127,6 +295,68 @@ def update_status(bios)
@app.command(BIOS_STATUS, :configure, text: text)
end
+ def apply_presenter_state
+ return unless @presenter
+
+ # Swap between editable ttk::entry and styled readonly tk::entry
+ swap_cred_fields(@presenter.fields_state == :readonly)
+
+ # Buttons (login/verify/logout/reset still use ttk)
+ @app.command(RA_LOGIN_BTN, :configure, state: @presenter.login_button_state)
+ @app.command(RA_VERIFY_BTN, :configure, state: @presenter.verify_button_state)
+ @app.command(RA_LOGOUT_BTN, :configure, state: @presenter.logout_button_state)
+ @app.command(RA_RESET_BTN, :configure, state: @presenter.reset_button_state)
+
+ # Feedback label
+ fb = @presenter.feedback
+ text = case fb[:key]
+ when :empty then ''
+ when :not_logged_in then translate('settings.ra_not_logged_in')
+ when :logged_in_as then translate('settings.ra_logged_in_as', username: fb[:username].to_s)
+ when :test_ok then translate('settings.ra_test_ok')
+ when :error then fb[:message].to_s
+ else ''
+ end
+ @app.command(RA_FEEDBACK_LABEL, :configure, text: text)
+
+ # Keep Tcl variable in sync with presenter (e.g. after logout)
+ @app.set_variable(VAR_RA_USERNAME, @presenter.username)
+ end
+
+ # Swap between editable ttk::entry widgets and gray readonly tk::entry widgets.
+ # Uses pack -before to preserve visual order relative to the password label.
+ def swap_cred_fields(readonly)
+ pw_lbl = "#{FRAME}.ra_creds_row.pw_lbl"
+ creds_row = "#{FRAME}.ra_creds_row"
+ if readonly
+ @app.tcl_eval("pack forget #{RA_USERNAME_ENTRY} #{RA_TOKEN_ENTRY}")
+ @app.tcl_eval("pack #{RA_USERNAME_RO} -in #{creds_row} -side left -padx {0 10} -before #{pw_lbl}")
+ @app.tcl_eval("pack #{RA_TOKEN_RO} -in #{creds_row} -side left")
+ else
+ @app.tcl_eval("pack forget #{RA_USERNAME_RO} #{RA_TOKEN_RO}")
+ @app.tcl_eval("pack #{RA_USERNAME_ENTRY} -in #{creds_row} -side left -padx {0 10} -before #{pw_lbl}")
+ @app.tcl_eval("pack #{RA_TOKEN_ENTRY} -in #{creds_row} -side left -after #{RA_USERNAME_ENTRY}")
+ @app.command(RA_USERNAME_ENTRY, :configure, state: @presenter.fields_state)
+ @app.command(RA_TOKEN_ENTRY, :configure, state: @presenter.fields_state)
+ end
+ end
+
+ def confirm_ra_reset
+ answer = @app.tcl_eval(
+ "tk_messageBox -parent #{Settings::Paths::TOP} " \
+ "-type yesno -icon warning " \
+ "-title {#{translate('settings.ra_reset_title')}} " \
+ "-message {#{translate('settings.ra_reset_confirm')}}"
+ )
+ return unless answer == 'yes'
+
+ @presenter&.username = ''
+ @app.set_variable(VAR_RA_USERNAME, '')
+ @app.set_variable(VAR_RA_PASSWORD, '')
+ emit(:ra_logout)
+ @mark_dirty.call
+ end
+
end
end
end
diff --git a/lib/gemba/settings_window.rb b/lib/gemba/settings_window.rb
index 8a8abec..4cf41ba 100644
--- a/lib/gemba/settings_window.rb
+++ b/lib/gemba/settings_window.rb
@@ -125,6 +125,9 @@ def initialize(app, callbacks: {}, tip_dismiss_ms: TipService::DEFAULT_DISMISS_M
subscribe_to_bus
end
+ # Exposes SystemTab for AppController save_config
+ def system_tab = @system_tab
+
# Delegates to GamepadTab
def listening_for = @gamepad_tab.listening_for
def keyboard_mode? = @gamepad_tab.keyboard_mode?
diff --git a/script/bake_game_index.rb b/script/bake_game_index.rb
index 48bd50c..9f21f9a 100644
--- a/script/bake_game_index.rb
+++ b/script/bake_game_index.rb
@@ -15,9 +15,12 @@
# ruby script/bake_game_index.rb
#
# Output:
-# lib/gemba/data/gba_games.json
+# lib/gemba/data/gba_games.json (game_code → name, serial-based)
# lib/gemba/data/gb_games.json
# lib/gemba/data/gbc_games.json
+# lib/gemba/data/gba_md5.json (md5 → name, for all platforms)
+# lib/gemba/data/gb_md5.json
+# lib/gemba/data/gbc_md5.json
require "json"
require "fileutils"
@@ -31,12 +34,14 @@
# name "Pokemon - Emerald Version (USA, Europe)"
# region "USA"
# serial "BPEE"
-# rom ( ... )
+# rom ( name "..." size N crc XXXXXXXX md5 YYYYYYYY sha1 ZZZZZZZZ serial "BPEE" )
# )
+# Returns array of hashes: { name:, region:, serial: (may be nil), md5: (may be nil) }
def parse_nointro_dat(path)
entries = []
current_name = nil
current_region = nil
+ current_serial = nil
File.foreach(path) do |line|
line.strip!
@@ -45,13 +50,18 @@ def parse_nointro_dat(path)
elsif line =~ /^region "(.+)"$/
current_region = $1
elsif line =~ /^serial "(.+)"$/
- serial = $1
- if current_name && !serial.empty?
- entries << { serial: serial, name: current_name, region: current_region }
- end
+ current_serial = $1
+ elsif line =~ /^rom \(/
+ # Extract md5 from rom line: md5 AABBCCDD...
+ md5 = line[/\bmd5 ([0-9A-Fa-f]{32})\b/, 1]&.downcase
+ # Also grab serial from rom line if not already set at game level
+ rom_serial = line[/\bserial "([^"]+)"/, 1]
+ serial = current_serial || rom_serial
+ entries << { name: current_name, region: current_region, serial: serial, md5: md5 } if current_name
elsif line == ")"
current_name = nil
current_region = nil
+ current_serial = nil
end
end
@@ -79,10 +89,11 @@ def parse_nointro_dat(path)
raw_entries = parse_nointro_dat(dat_path)
puts " #{raw_entries.size} raw entries"
- # Build map: "AGB-BPEE" => "Pokemon - Emerald Version (USA, Europe)"
+ # Build serial map: "AGB-BPEE" => "Pokemon - Emerald Version (USA, Europe)"
# When multiple regions share a serial, prefer USA > World > Europe > first seen.
by_code = {}
raw_entries.each do |entry|
+ next unless entry[:serial]
key = "#{info[:prefix]}-#{entry[:serial]}"
existing = by_code[key]
region = entry[:region] || ""
@@ -101,6 +112,27 @@ def parse_nointro_dat(path)
json_path = File.join(DATA_DIR, "#{platform}_games.json")
File.write(json_path, JSON.generate(by_code.sort.to_h))
puts " #{json_path} (#{File.size(json_path)} bytes)"
+
+ # Build MD5 map: lowercase md5 => canonical name
+ # Prefer USA > World > Europe > first seen when multiple regions share an MD5 (unlikely).
+ by_md5 = {}
+ raw_entries.each do |entry|
+ next unless entry[:md5]
+ existing = by_md5[entry[:md5]]
+ region = entry[:region] || ""
+
+ if existing.nil?
+ by_md5[entry[:md5]] = entry[:name]
+ elsif region.include?("USA") && !existing.include?("(USA")
+ by_md5[entry[:md5]] = entry[:name]
+ end
+ end
+
+ puts " #{by_md5.size} unique MD5s"
+
+ md5_path = File.join(DATA_DIR, "#{platform}_md5.json")
+ File.write(md5_path, JSON.generate(by_md5.sort.to_h))
+ puts " #{md5_path} (#{File.size(md5_path)} bytes)"
end
puts "\nDone."
diff --git a/test/achievements_window/test_bulk_sync.rb b/test/achievements_window/test_bulk_sync.rb
new file mode 100644
index 0000000..eafa24e
--- /dev/null
+++ b/test/achievements_window/test_bulk_sync.rb
@@ -0,0 +1,218 @@
+# frozen_string_literal: true
+
+require "minitest/autorun"
+require_relative "../shared/tk_test_helper"
+
+# Tests for AchievementsWindow bulk sync — unofficial toggle fires bus event,
+# UI locks/unlocks during sync, per-game status updates, and done count display.
+class TestAchievementsWindowBulkSync < Minitest::Test
+ include TeekTestHelper
+
+ def test_unofficial_toggle_fires_bus_event
+ assert_tk_app("toggling unofficial checkbox fires :ra_unofficial_changed on the bus") do
+ begin
+ require "gemba/headless"
+ require "support/achievements_window_helpers"
+ require "tmpdir"
+ Gemba.bus = Gemba::EventBus.new
+
+ received = nil
+ Gemba.bus.on(:ra_unofficial_changed) { |value:, **| received = value }
+
+ backend = Gemba::Achievements::FakeBackend.new
+ backend.login_with_token(username: 'u', token: 't')
+ backend.stub_fetch_for_display([])
+
+ Dir.mktmpdir("ach_win_test") do |tmpdir|
+ ENV['GEMBA_CONFIG_DIR'] = tmpdir
+ win = Gemba::AchievementsWindow.new(
+ app: app, rom_library: make_rom_library, config: FakeConfig.new(false)
+ )
+ win.update_game(rom_id: nil, backend: backend)
+ win.show
+ app.update
+
+ top = Gemba::AchievementsWindow::TOP
+ app.command("#{top}.toolbar.unofficial", 'invoke')
+ app.update
+
+ assert_equal true, received, ":ra_unofficial_changed should fire with true"
+ ensure
+ ENV.delete('GEMBA_CONFIG_DIR')
+ end
+ ensure
+ app.command(:destroy, Gemba::AchievementsWindow::TOP) rescue nil
+ end
+ end
+ end
+
+ def test_unofficial_toggle_locks_ui_during_sync
+ assert_tk_app("unofficial toggle disables both buttons while bulk sync runs") do
+ begin
+ require "gemba/headless"
+ require "support/achievements_window_helpers"
+ require "tmpdir"
+ Gemba.bus = Gemba::EventBus.new
+
+ backend = Gemba::Achievements::FakeBackend.new
+ backend.login_with_token(username: 'u', token: 't')
+
+ # Capture widget states from INSIDE the fetch callback — FakeBackend
+ # calls synchronously so we're mid-sync right here.
+ mid_sync_states = {}
+ backend.stub_fetch_for_display do |_|
+ top = Gemba::AchievementsWindow::TOP
+ mid_sync_states[:sync] = app.command("#{top}.toolbar.sync", :cget, '-state').to_s
+ mid_sync_states[:unoff] = app.command("#{top}.toolbar.unofficial", :cget, '-state').to_s
+ nil
+ end
+
+ roms = [make_rom_entry(id: 'r1', title: 'Game')]
+ Dir.mktmpdir("ach_win_test") do |tmpdir|
+ ENV['GEMBA_CONFIG_DIR'] = tmpdir
+ win = Gemba::AchievementsWindow.new(
+ app: app, rom_library: make_rom_library(*roms), config: FakeConfig.new(false)
+ )
+ win.update_game(rom_id: nil, backend: backend)
+ win.show
+ app.update
+
+ top = Gemba::AchievementsWindow::TOP
+ app.command("#{top}.toolbar.unofficial", 'invoke')
+ app.update
+
+ assert_equal 'disabled', mid_sync_states[:sync], "sync button locked during bulk sync"
+ assert_equal 'disabled', mid_sync_states[:unoff], "unofficial button locked during bulk sync"
+ ensure
+ ENV.delete('GEMBA_CONFIG_DIR')
+ end
+ ensure
+ app.command(:destroy, Gemba::AchievementsWindow::TOP) rescue nil
+ end
+ end
+ end
+
+ def test_bulk_sync_shows_per_game_status_updates
+ assert_tk_app("bulk sync updates the status bar for each game in sequence") do
+ begin
+ require "gemba/headless"
+ require "support/achievements_window_helpers"
+ require "tmpdir"
+ Gemba.bus = Gemba::EventBus.new
+
+ backend = Gemba::Achievements::FakeBackend.new
+ backend.login_with_token(username: 'u', token: 't')
+
+ statuses = []
+ backend.stub_fetch_for_display do |_|
+ top = Gemba::AchievementsWindow::TOP
+ statuses << app.command("#{top}.status_bar.status", :cget, '-text').to_s
+ []
+ end
+
+ roms = [
+ make_rom_entry(id: 'r1', title: 'Game One'),
+ make_rom_entry(id: 'r2', title: 'Game Two'),
+ ]
+ Dir.mktmpdir("ach_win_test") do |tmpdir|
+ ENV['GEMBA_CONFIG_DIR'] = tmpdir
+ win = Gemba::AchievementsWindow.new(
+ app: app, rom_library: make_rom_library(*roms), config: FakeConfig.new(false)
+ )
+ win.update_game(rom_id: nil, backend: backend)
+ win.show
+ app.update
+
+ top = Gemba::AchievementsWindow::TOP
+ app.command("#{top}.toolbar.unofficial", 'invoke')
+ app.update
+
+ assert_equal 2, statuses.size, "one status update per game"
+ assert_includes statuses[0], 'Game One', "first update names Game One"
+ assert_includes statuses[1], 'Game Two', "second update names Game Two"
+ ensure
+ ENV.delete('GEMBA_CONFIG_DIR')
+ end
+ ensure
+ app.command(:destroy, Gemba::AchievementsWindow::TOP) rescue nil
+ end
+ end
+ end
+
+ def test_bulk_sync_unlocks_ui_when_complete
+ assert_tk_app("bulk sync re-enables buttons after all games are done") do
+ begin
+ require "gemba/headless"
+ require "support/achievements_window_helpers"
+ require "tmpdir"
+ Gemba.bus = Gemba::EventBus.new
+
+ backend = Gemba::Achievements::FakeBackend.new
+ backend.login_with_token(username: 'u', token: 't')
+ backend.stub_fetch_for_display([])
+
+ roms = [make_rom_entry(id: 'r1', title: 'Game')]
+ Dir.mktmpdir("ach_win_test") do |tmpdir|
+ ENV['GEMBA_CONFIG_DIR'] = tmpdir
+ win = Gemba::AchievementsWindow.new(
+ app: app, rom_library: make_rom_library(*roms), config: FakeConfig.new(false)
+ )
+ win.update_game(rom_id: nil, backend: backend)
+ win.show
+ app.update
+
+ top = Gemba::AchievementsWindow::TOP
+ app.command("#{top}.toolbar.unofficial", 'invoke')
+ app.update
+
+ assert_equal 'normal', app.command("#{top}.toolbar.sync", :cget, '-state').to_s
+ assert_equal 'normal', app.command("#{top}.toolbar.unofficial", :cget, '-state').to_s
+ ensure
+ ENV.delete('GEMBA_CONFIG_DIR')
+ end
+ ensure
+ app.command(:destroy, Gemba::AchievementsWindow::TOP) rescue nil
+ end
+ end
+ end
+
+ def test_bulk_sync_done_status_shows_count
+ assert_tk_app("status bar shows N-game count after bulk sync completes") do
+ begin
+ require "gemba/headless"
+ require "support/achievements_window_helpers"
+ require "tmpdir"
+ Gemba.bus = Gemba::EventBus.new
+
+ backend = Gemba::Achievements::FakeBackend.new
+ backend.login_with_token(username: 'u', token: 't')
+ backend.stub_fetch_for_display([])
+
+ roms = [
+ make_rom_entry(id: 'r1', title: 'Game A'),
+ make_rom_entry(id: 'r2', title: 'Game B'),
+ ]
+ Dir.mktmpdir("ach_win_test") do |tmpdir|
+ ENV['GEMBA_CONFIG_DIR'] = tmpdir
+ win = Gemba::AchievementsWindow.new(
+ app: app, rom_library: make_rom_library(*roms), config: FakeConfig.new(false)
+ )
+ win.update_game(rom_id: nil, backend: backend)
+ win.show
+ app.update
+
+ top = Gemba::AchievementsWindow::TOP
+ app.command("#{top}.toolbar.unofficial", 'invoke')
+ app.update
+
+ status = app.command("#{top}.status_bar.status", :cget, '-text').to_s
+ assert_includes status, '2', "done status should mention 2 games synced"
+ ensure
+ ENV.delete('GEMBA_CONFIG_DIR')
+ end
+ ensure
+ app.command(:destroy, Gemba::AchievementsWindow::TOP) rescue nil
+ end
+ end
+ end
+end
diff --git a/test/achievements_window/test_bus_events.rb b/test/achievements_window/test_bus_events.rb
new file mode 100644
index 0000000..acb015b
--- /dev/null
+++ b/test/achievements_window/test_bus_events.rb
@@ -0,0 +1,125 @@
+# frozen_string_literal: true
+
+require "minitest/autorun"
+require_relative "../shared/tk_test_helper"
+
+# Tests for AchievementsWindow event bus subscriptions — sync started/done
+# disables/enables the sync button and auth-result logout disables it.
+class TestAchievementsWindowBusEvents < Minitest::Test
+ include TeekTestHelper
+
+ def test_ra_sync_started_disables_sync_button
+ assert_tk_app(":ra_sync_started disables the sync button") do
+ begin
+ require "gemba/headless"
+ require "support/achievements_window_helpers"
+ Gemba.bus = Gemba::EventBus.new
+
+ backend = Gemba::Achievements::FakeBackend.new
+ backend.login_with_token(username: 'u', token: 't')
+ win = Gemba::AchievementsWindow.new(
+ app: app, rom_library: make_rom_library, config: FakeConfig.new(false)
+ )
+ win.update_game(rom_id: nil, backend: backend)
+ win.show
+ app.update
+
+ Gemba.bus.emit(:ra_sync_started)
+ app.update
+
+ top = Gemba::AchievementsWindow::TOP
+ assert_equal 'disabled',
+ app.command("#{top}.toolbar.sync", :cget, '-state').to_s
+ ensure
+ app.command(:destroy, Gemba::AchievementsWindow::TOP) rescue nil
+ end
+ end
+ end
+
+ def test_ra_sync_done_ok_re_enables_sync_button
+ assert_tk_app(":ra_sync_done(ok: true) re-enables the sync button") do
+ begin
+ require "gemba/headless"
+ require "support/achievements_window_helpers"
+ Gemba.bus = Gemba::EventBus.new
+
+ backend = Gemba::Achievements::FakeBackend.new
+ backend.login_with_token(username: 'u', token: 't')
+ win = Gemba::AchievementsWindow.new(
+ app: app, rom_library: make_rom_library, config: FakeConfig.new(false)
+ )
+ win.update_game(rom_id: nil, backend: backend)
+ win.show
+ app.update
+
+ Gemba.bus.emit(:ra_sync_started)
+ app.update
+ Gemba.bus.emit(:ra_sync_done, ok: true)
+ app.update
+
+ top = Gemba::AchievementsWindow::TOP
+ assert_equal 'normal',
+ app.command("#{top}.toolbar.sync", :cget, '-state').to_s
+ ensure
+ app.command(:destroy, Gemba::AchievementsWindow::TOP) rescue nil
+ end
+ end
+ end
+
+ def test_ra_sync_done_fail_shows_error_status
+ assert_tk_app(":ra_sync_done(ok: false) shows sync_failed in status bar") do
+ begin
+ require "gemba/headless"
+ require "support/achievements_window_helpers"
+ Gemba.bus = Gemba::EventBus.new
+
+ backend = Gemba::Achievements::FakeBackend.new
+ backend.login_with_token(username: 'u', token: 't')
+ win = Gemba::AchievementsWindow.new(
+ app: app, rom_library: make_rom_library, config: FakeConfig.new(false)
+ )
+ win.update_game(rom_id: nil, backend: backend)
+ win.show
+ app.update
+
+ Gemba.bus.emit(:ra_sync_done, ok: false)
+ app.update
+
+ top = Gemba::AchievementsWindow::TOP
+ status = app.command("#{top}.status_bar.status", :cget, '-text').to_s
+ assert_equal Gemba::Locale.translate('achievements.sync_failed'), status
+ ensure
+ app.command(:destroy, Gemba::AchievementsWindow::TOP) rescue nil
+ end
+ end
+ end
+
+ def test_ra_auth_result_logout_disables_sync_button
+ assert_tk_app(":ra_auth_result after logout disables sync button") do
+ begin
+ require "gemba/headless"
+ require "support/achievements_window_helpers"
+ Gemba.bus = Gemba::EventBus.new
+
+ backend = Gemba::Achievements::FakeBackend.new
+ backend.login_with_token(username: 'u', token: 't')
+ win = Gemba::AchievementsWindow.new(
+ app: app, rom_library: make_rom_library, config: FakeConfig.new(false)
+ )
+ win.update_game(rom_id: nil, backend: backend)
+ win.show
+ app.update
+
+ backend.logout
+ Gemba.bus.emit(:ra_auth_result, status: :logout)
+ app.update
+
+ top = Gemba::AchievementsWindow::TOP
+ assert_equal 'disabled',
+ app.command("#{top}.toolbar.sync", :cget, '-state').to_s
+ ensure
+ app.command(:destroy, Gemba::AchievementsWindow::TOP) rescue nil
+ end
+ end
+ end
+end
diff --git a/test/achievements_window/test_close_confirmation.rb b/test/achievements_window/test_close_confirmation.rb
new file mode 100644
index 0000000..ee9cd8f
--- /dev/null
+++ b/test/achievements_window/test_close_confirmation.rb
@@ -0,0 +1,201 @@
+# frozen_string_literal: true
+
+require "minitest/autorun"
+require_relative "../shared/tk_test_helper"
+
+# Tests for AchievementsWindow close-during-bulk-sync confirmation dialog —
+# no dialog when not syncing, dialog shown mid-sync, 'no' keeps window open,
+# 'yes' stops sync and withdraws the window.
+class TestAchievementsWindowCloseConfirmation < Minitest::Test
+ include TeekTestHelper
+
+ def test_hide_without_bulk_sync_does_not_show_dialog
+ assert_tk_app("win.hide when not syncing closes without showing any dialog") do
+ begin
+ require "gemba/headless"
+ require "support/achievements_window_helpers"
+ Gemba.bus = Gemba::EventBus.new
+
+ app.tcl_eval("set ::ach_dlg 0")
+ app.tcl_eval("proc tk_messageBox {args} { incr ::ach_dlg; return yes }")
+
+ backend = Gemba::Achievements::FakeBackend.new
+ backend.login_with_token(username: 'u', token: 't')
+ win = Gemba::AchievementsWindow.new(
+ app: app, rom_library: make_rom_library, config: FakeConfig.new(false)
+ )
+ win.update_game(rom_id: nil, backend: backend)
+ win.show
+ app.update
+
+ win.hide
+ app.update
+
+ assert_equal '0', app.tcl_eval("set ::ach_dlg").strip,
+ "tk_messageBox must not be called when not in bulk sync"
+ ensure
+ app.tcl_eval("catch {rename tk_messageBox {}}") rescue nil
+ app.command(:destroy, Gemba::AchievementsWindow::TOP) rescue nil
+ end
+ end
+ end
+
+ def test_hide_during_bulk_sync_shows_dialog
+ assert_tk_app("win.hide mid-sync triggers a tk_messageBox confirmation") do
+ begin
+ require "gemba/headless"
+ require "support/achievements_window_helpers"
+ require "tmpdir"
+ Gemba.bus = Gemba::EventBus.new
+
+ app.tcl_eval("set ::ach_dlg 0")
+ app.tcl_eval("proc tk_messageBox {args} { incr ::ach_dlg; return no }")
+
+ backend = Gemba::Achievements::FakeBackend.new
+ backend.login_with_token(username: 'u', token: 't')
+
+ win = nil
+ attempted = false
+ backend.stub_fetch_for_display do |_|
+ unless attempted
+ attempted = true
+ win.hide # dialog returns "no" → stays open
+ app.update
+ end
+ nil
+ end
+
+ roms = [make_rom_entry(id: 'r1', title: 'Game')]
+ Dir.mktmpdir("ach_win_test") do |tmpdir|
+ ENV['GEMBA_CONFIG_DIR'] = tmpdir
+ win = Gemba::AchievementsWindow.new(
+ app: app, rom_library: make_rom_library(*roms), config: FakeConfig.new(false)
+ )
+ win.update_game(rom_id: nil, backend: backend)
+ win.show
+ app.update
+
+ top = Gemba::AchievementsWindow::TOP
+ app.command("#{top}.toolbar.unofficial", 'invoke')
+ app.update
+
+ assert_equal '1', app.tcl_eval("set ::ach_dlg").strip,
+ "tk_messageBox must be shown when hiding during bulk sync"
+ ensure
+ ENV.delete('GEMBA_CONFIG_DIR')
+ end
+ ensure
+ app.tcl_eval("catch {rename tk_messageBox {}}") rescue nil
+ app.command(:destroy, Gemba::AchievementsWindow::TOP) rescue nil
+ end
+ end
+ end
+
+ def test_hide_confirm_no_keeps_window_visible
+ assert_tk_app("answering 'no' to the cancel-sync dialog keeps the window open") do
+ begin
+ require "gemba/headless"
+ require "support/achievements_window_helpers"
+ require "tmpdir"
+ Gemba.bus = Gemba::EventBus.new
+
+ app.tcl_eval("proc tk_messageBox {args} { return no }")
+
+ backend = Gemba::Achievements::FakeBackend.new
+ backend.login_with_token(username: 'u', token: 't')
+
+ win = nil
+ attempted = false
+ backend.stub_fetch_for_display do |_|
+ unless attempted
+ attempted = true
+ win.hide
+ app.update
+ end
+ nil
+ end
+
+ roms = [make_rom_entry(id: 'r1', title: 'Game')]
+ Dir.mktmpdir("ach_win_test") do |tmpdir|
+ ENV['GEMBA_CONFIG_DIR'] = tmpdir
+ win = Gemba::AchievementsWindow.new(
+ app: app, rom_library: make_rom_library(*roms), config: FakeConfig.new(false)
+ )
+ win.update_game(rom_id: nil, backend: backend)
+ win.show
+ app.update
+
+ top = Gemba::AchievementsWindow::TOP
+ app.command("#{top}.toolbar.unofficial", 'invoke')
+ app.update
+
+ # wm state is unreliable in xvfb when the root is withdrawn; instead
+ # verify the sync completed and UI was unlocked — only possible if
+ # the window stayed open and the sync ran to completion.
+ assert_equal 'normal', app.command("#{top}.toolbar.sync", :cget, '-state').to_s,
+ "sync button must be re-enabled after sync completes (window stayed open)"
+ ensure
+ ENV.delete('GEMBA_CONFIG_DIR')
+ end
+ ensure
+ app.tcl_eval("catch {rename tk_messageBox {}}") rescue nil
+ app.command(:destroy, Gemba::AchievementsWindow::TOP) rescue nil
+ end
+ end
+ end
+
+ def test_hide_confirm_yes_stops_sync_and_withdraws_window
+ assert_tk_app("answering 'yes' stops the bulk sync and withdraws the window") do
+ begin
+ require "gemba/headless"
+ require "support/achievements_window_helpers"
+ require "tmpdir"
+ Gemba.bus = Gemba::EventBus.new
+
+ app.tcl_eval("proc tk_messageBox {args} { return yes }")
+
+ win = nil
+ fetch_count = 0
+ hide_done = false
+ backend = Gemba::Achievements::FakeBackend.new
+ backend.login_with_token(username: 'u', token: 't')
+ backend.stub_fetch_for_display do |_|
+ fetch_count += 1
+ unless hide_done
+ hide_done = true
+ win.hide # dialog returns "yes" → cancel + withdraw
+ app.update
+ end
+ nil
+ end
+
+ roms = [
+ make_rom_entry(id: 'r1', title: 'Game One'),
+ make_rom_entry(id: 'r2', title: 'Game Two'),
+ ]
+ Dir.mktmpdir("ach_win_test") do |tmpdir|
+ ENV['GEMBA_CONFIG_DIR'] = tmpdir
+ win = Gemba::AchievementsWindow.new(
+ app: app, rom_library: make_rom_library(*roms), config: FakeConfig.new(false)
+ )
+ win.update_game(rom_id: nil, backend: backend)
+ win.show
+ app.update
+
+ top = Gemba::AchievementsWindow::TOP
+ app.command("#{top}.toolbar.unofficial", 'invoke')
+ app.update
+
+ assert_equal 1, fetch_count, "sync must stop after the first game when user says yes"
+ assert_equal 'withdrawn', app.tcl_eval("wm state #{top}").strip,
+ "window must be withdrawn after user confirms close"
+ ensure
+ ENV.delete('GEMBA_CONFIG_DIR')
+ end
+ ensure
+ app.tcl_eval("catch {rename tk_messageBox {}}") rescue nil
+ app.command(:destroy, Gemba::AchievementsWindow::TOP) rescue nil
+ end
+ end
+ end
+end
diff --git a/test/achievements_window/test_initial_state.rb b/test/achievements_window/test_initial_state.rb
new file mode 100644
index 0000000..87c8a41
--- /dev/null
+++ b/test/achievements_window/test_initial_state.rb
@@ -0,0 +1,164 @@
+# frozen_string_literal: true
+
+require "minitest/autorun"
+require_relative "../shared/tk_test_helper"
+
+# Tests for AchievementsWindow initial widget state — sync button, unofficial
+# checkbox, game combo filter, and status bar default text.
+class TestAchievementsWindowInitialState < Minitest::Test
+ include TeekTestHelper
+
+ TOP = Gemba::AchievementsWindow::TOP rescue '.gemba_achievements'
+
+ def test_sync_button_disabled_when_not_authenticated
+ assert_tk_app("sync button disabled when not authenticated") do
+ begin
+ require "gemba/headless"
+ require "support/achievements_window_helpers"
+ Gemba.bus = Gemba::EventBus.new
+
+ backend = Gemba::Achievements::FakeBackend.new # NOT logged in
+ win = Gemba::AchievementsWindow.new(
+ app: app, rom_library: make_rom_library, config: FakeConfig.new(false)
+ )
+ win.update_game(rom_id: nil, backend: backend)
+ win.show
+ app.update
+
+ top = Gemba::AchievementsWindow::TOP
+ assert_equal 'disabled',
+ app.command("#{top}.toolbar.sync", :cget, '-state').to_s
+ ensure
+ app.command(:destroy, Gemba::AchievementsWindow::TOP) rescue nil
+ end
+ end
+ end
+
+ def test_sync_button_enabled_when_authenticated
+ assert_tk_app("sync button enabled when authenticated") do
+ begin
+ require "gemba/headless"
+ require "support/achievements_window_helpers"
+ Gemba.bus = Gemba::EventBus.new
+
+ backend = Gemba::Achievements::FakeBackend.new
+ backend.login_with_token(username: 'u', token: 't')
+ win = Gemba::AchievementsWindow.new(
+ app: app, rom_library: make_rom_library, config: FakeConfig.new(false)
+ )
+ win.update_game(rom_id: nil, backend: backend)
+ win.show
+ app.update
+
+ top = Gemba::AchievementsWindow::TOP
+ assert_equal 'normal',
+ app.command("#{top}.toolbar.sync", :cget, '-state').to_s
+ ensure
+ app.command(:destroy, Gemba::AchievementsWindow::TOP) rescue nil
+ end
+ end
+ end
+
+ def test_unofficial_checkbox_reflects_config_false
+ assert_tk_app("unofficial checkbox is unchecked when config is false") do
+ begin
+ require "gemba/headless"
+ require "support/achievements_window_helpers"
+ Gemba.bus = Gemba::EventBus.new
+
+ backend = Gemba::Achievements::FakeBackend.new
+ backend.login_with_token(username: 'u', token: 't')
+ win = Gemba::AchievementsWindow.new(
+ app: app, rom_library: make_rom_library, config: FakeConfig.new(false)
+ )
+ win.update_game(rom_id: nil, backend: backend)
+ win.show
+ app.update
+
+ assert_equal '0', app.get_variable(Gemba::AchievementsWindow::VAR_UNOFFICIAL)
+ ensure
+ app.command(:destroy, Gemba::AchievementsWindow::TOP) rescue nil
+ end
+ end
+ end
+
+ def test_unofficial_checkbox_reflects_config_true
+ assert_tk_app("unofficial checkbox is checked when config is true") do
+ begin
+ require "gemba/headless"
+ require "support/achievements_window_helpers"
+ Gemba.bus = Gemba::EventBus.new
+
+ backend = Gemba::Achievements::FakeBackend.new
+ backend.login_with_token(username: 'u', token: 't')
+ win = Gemba::AchievementsWindow.new(
+ app: app, rom_library: make_rom_library, config: FakeConfig.new(true)
+ )
+ win.update_game(rom_id: nil, backend: backend)
+ win.show
+ app.update
+
+ assert_equal '1', app.get_variable(Gemba::AchievementsWindow::VAR_UNOFFICIAL)
+ ensure
+ app.command(:destroy, Gemba::AchievementsWindow::TOP) rescue nil
+ end
+ end
+ end
+
+ def test_combo_shows_only_gba_games
+ assert_tk_app("combo lists GBA games only, not GB or GBC") do
+ begin
+ require "gemba/headless"
+ require "support/achievements_window_helpers"
+ Gemba.bus = Gemba::EventBus.new
+
+ roms = [
+ make_rom_entry(id: 'gba1', title: 'GBA Game', platform: 'gba'),
+ make_rom_entry(id: 'gb1', title: 'GB Game', platform: 'gb'),
+ make_rom_entry(id: 'gbc1', title: 'GBC Game', platform: 'gbc'),
+ ]
+ backend = Gemba::Achievements::FakeBackend.new
+ backend.login_with_token(username: 'u', token: 't')
+ win = Gemba::AchievementsWindow.new(
+ app: app, rom_library: make_rom_library(*roms), config: FakeConfig.new(false)
+ )
+ win.update_game(rom_id: nil, backend: backend)
+ win.show
+ app.update
+
+ top = Gemba::AchievementsWindow::TOP
+ values = app.command("#{top}.toolbar.combo", :cget, '-values').to_s
+ assert_includes values, 'GBA Game'
+ refute_includes values, 'GB Game'
+ refute_includes values, 'GBC Game'
+ ensure
+ app.command(:destroy, Gemba::AchievementsWindow::TOP) rescue nil
+ end
+ end
+ end
+
+ def test_status_shows_none_when_empty
+ assert_tk_app("status shows 'no achievements' when backend has no achievements") do
+ begin
+ require "gemba/headless"
+ require "support/achievements_window_helpers"
+ Gemba.bus = Gemba::EventBus.new
+
+ backend = Gemba::Achievements::FakeBackend.new
+ backend.login_with_token(username: 'u', token: 't')
+ win = Gemba::AchievementsWindow.new(
+ app: app, rom_library: make_rom_library, config: FakeConfig.new(false)
+ )
+ win.update_game(rom_id: nil, backend: backend)
+ win.show
+ app.update
+
+ top = Gemba::AchievementsWindow::TOP
+ status = app.command("#{top}.status_bar.status", :cget, '-text').to_s
+ assert_equal Gemba::Locale.translate('achievements.none'), status
+ ensure
+ app.command(:destroy, Gemba::AchievementsWindow::TOP) rescue nil
+ end
+ end
+ end
+end
diff --git a/test/achievements_window/test_sorting.rb b/test/achievements_window/test_sorting.rb
new file mode 100644
index 0000000..d96cbd8
--- /dev/null
+++ b/test/achievements_window/test_sorting.rb
@@ -0,0 +1,227 @@
+# frozen_string_literal: true
+
+require "minitest/autorun"
+require_relative "../shared/tk_test_helper"
+
+# Tests for AchievementsWindow treeview column sorting — default order,
+# heading click indicators, and indicator cleanup when switching columns.
+class TestAchievementsWindowSorting < Minitest::Test
+ include TeekTestHelper
+
+ def test_default_sort_earned_first_then_alphabetical
+ assert_tk_app("default sort: earned first, then unearned A→Z") do
+ begin
+ require "gemba/headless"
+ require "support/achievements_window_helpers"
+ require "support/fake_core"
+ Gemba.bus = Gemba::EventBus.new
+
+ backend = Gemba::Achievements::FakeBackend.new
+ backend.login_with_token(username: 'u', token: 't')
+ backend.add_achievement(id: 'z', title: 'Zebra', description: '', points: 5) { false }
+ backend.add_achievement(id: 'a', title: 'Aardvark', description: '', points: 5) { |_| true }
+ backend.add_achievement(id: 'm', title: 'Monkey', description: '', points: 5) { false }
+ backend.do_frame(FakeCore.new)
+
+ win = Gemba::AchievementsWindow.new(
+ app: app, rom_library: make_rom_library, config: FakeConfig.new(false)
+ )
+ win.update_game(rom_id: nil, backend: backend)
+ win.show
+ win.refresh(backend)
+ app.update
+
+ tree = "#{Gemba::AchievementsWindow::TOP}.tf.tree"
+ items = app.tcl_eval("#{tree} children {}").split
+ titles = items.map { |id| app.tcl_eval("#{tree} set #{id} name") }
+ assert_equal 'Aardvark', titles[0], "earned should be first"
+ assert_equal 'Monkey', titles[1], "Monkey before Zebra alphabetically"
+ assert_equal 'Zebra', titles[2]
+ ensure
+ app.command(:destroy, Gemba::AchievementsWindow::TOP) rescue nil
+ end
+ end
+ end
+
+ def test_click_name_heading_sorts_asc_with_indicator
+ assert_tk_app("clicking name heading sorts A→Z and shows ▲") do
+ begin
+ require "gemba/headless"
+ require "support/achievements_window_helpers"
+ Gemba.bus = Gemba::EventBus.new
+
+ backend = Gemba::Achievements::FakeBackend.new
+ backend.login_with_token(username: 'u', token: 't')
+ backend.add_achievement(id: 'z', title: 'Zebra', description: '', points: 5) { false }
+ backend.add_achievement(id: 'a', title: 'Aardvark', description: '', points: 5) { false }
+ backend.add_achievement(id: 'm', title: 'Monkey', description: '', points: 5) { false }
+
+ win = Gemba::AchievementsWindow.new(
+ app: app, rom_library: make_rom_library, config: FakeConfig.new(false)
+ )
+ win.update_game(rom_id: nil, backend: backend)
+ win.show
+ win.refresh(backend)
+ app.update
+
+ tree = "#{Gemba::AchievementsWindow::TOP}.tf.tree"
+ cmd = app.tcl_eval("#{tree} heading name -command")
+ app.tcl_eval("uplevel #0 {#{cmd}}")
+ app.update
+
+ items = app.tcl_eval("#{tree} children {}").split
+ titles = items.map { |id| app.tcl_eval("#{tree} set #{id} name") }
+ assert_equal %w[Aardvark Monkey Zebra], titles
+
+ assert_includes app.tcl_eval("#{tree} heading name -text"), '▲'
+ ensure
+ app.command(:destroy, Gemba::AchievementsWindow::TOP) rescue nil
+ end
+ end
+ end
+
+ def test_click_name_heading_twice_reverses_to_desc
+ assert_tk_app("clicking name heading twice reverses to Z→A and shows ▼") do
+ begin
+ require "gemba/headless"
+ require "support/achievements_window_helpers"
+ Gemba.bus = Gemba::EventBus.new
+
+ backend = Gemba::Achievements::FakeBackend.new
+ backend.login_with_token(username: 'u', token: 't')
+ backend.add_achievement(id: 'z', title: 'Zebra', description: '', points: 5) { false }
+ backend.add_achievement(id: 'a', title: 'Aardvark', description: '', points: 5) { false }
+
+ win = Gemba::AchievementsWindow.new(
+ app: app, rom_library: make_rom_library, config: FakeConfig.new(false)
+ )
+ win.update_game(rom_id: nil, backend: backend)
+ win.show
+ win.refresh(backend)
+ app.update
+
+ tree = "#{Gemba::AchievementsWindow::TOP}.tf.tree"
+ cmd = app.tcl_eval("#{tree} heading name -command")
+ app.tcl_eval("uplevel #0 {#{cmd}}") # asc
+ app.tcl_eval("uplevel #0 {#{cmd}}") # desc
+ app.update
+
+ items = app.tcl_eval("#{tree} children {}").split
+ titles = items.map { |id| app.tcl_eval("#{tree} set #{id} name") }
+ assert_equal %w[Zebra Aardvark], titles
+ assert_includes app.tcl_eval("#{tree} heading name -text"), '▼'
+ ensure
+ app.command(:destroy, Gemba::AchievementsWindow::TOP) rescue nil
+ end
+ end
+ end
+
+ def test_click_points_heading_sorts_low_to_high
+ assert_tk_app("clicking points heading sorts by points low→high") do
+ begin
+ require "gemba/headless"
+ require "support/achievements_window_helpers"
+ Gemba.bus = Gemba::EventBus.new
+
+ backend = Gemba::Achievements::FakeBackend.new
+ backend.login_with_token(username: 'u', token: 't')
+ backend.add_achievement(id: 'a', title: 'High', description: '', points: 50) { false }
+ backend.add_achievement(id: 'b', title: 'Low', description: '', points: 5) { false }
+ backend.add_achievement(id: 'c', title: 'Mid', description: '', points: 25) { false }
+
+ win = Gemba::AchievementsWindow.new(
+ app: app, rom_library: make_rom_library, config: FakeConfig.new(false)
+ )
+ win.update_game(rom_id: nil, backend: backend)
+ win.show
+ win.refresh(backend)
+ app.update
+
+ tree = "#{Gemba::AchievementsWindow::TOP}.tf.tree"
+ cmd = app.tcl_eval("#{tree} heading points -command")
+ app.tcl_eval("uplevel #0 {#{cmd}}")
+ app.update
+
+ items = app.tcl_eval("#{tree} children {}").split
+ pts = items.map { |id| app.tcl_eval("#{tree} set #{id} points").to_i }
+ assert_equal [5, 25, 50], pts
+ ensure
+ app.command(:destroy, Gemba::AchievementsWindow::TOP) rescue nil
+ end
+ end
+ end
+
+ def test_click_earned_heading_puts_unearned_last
+ assert_tk_app("clicking earned heading keeps unearned rows at the bottom") do
+ begin
+ require "gemba/headless"
+ require "support/achievements_window_helpers"
+ require "support/fake_core"
+ Gemba.bus = Gemba::EventBus.new
+
+ backend = Gemba::Achievements::FakeBackend.new
+ backend.login_with_token(username: 'u', token: 't')
+ backend.add_achievement(id: 'e', title: 'Earned', description: '', points: 5) { |_| true }
+ backend.add_achievement(id: 'u', title: 'Unearned', description: '', points: 5) { false }
+ backend.do_frame(FakeCore.new)
+
+ win = Gemba::AchievementsWindow.new(
+ app: app, rom_library: make_rom_library, config: FakeConfig.new(false)
+ )
+ win.update_game(rom_id: nil, backend: backend)
+ win.show
+ win.refresh(backend)
+ app.update
+
+ tree = "#{Gemba::AchievementsWindow::TOP}.tf.tree"
+ cmd = app.tcl_eval("#{tree} heading earned -command")
+ app.tcl_eval("uplevel #0 {#{cmd}}")
+ app.update
+
+ items = app.tcl_eval("#{tree} children {}").split
+ earned = items.map { |id| app.tcl_eval("#{tree} set #{id} earned") }
+ assert_equal '', earned.last, "unearned must be last"
+ refute_equal '', earned.first, "earned must be first"
+ ensure
+ app.command(:destroy, Gemba::AchievementsWindow::TOP) rescue nil
+ end
+ end
+ end
+
+ def test_switching_sort_column_clears_old_indicator
+ assert_tk_app("switching sort column removes indicator from previously sorted column") do
+ begin
+ require "gemba/headless"
+ require "support/achievements_window_helpers"
+ Gemba.bus = Gemba::EventBus.new
+
+ backend = Gemba::Achievements::FakeBackend.new
+ backend.login_with_token(username: 'u', token: 't')
+ backend.add_achievement(id: 'a', title: 'Alpha', description: '', points: 5) { false }
+
+ win = Gemba::AchievementsWindow.new(
+ app: app, rom_library: make_rom_library, config: FakeConfig.new(false)
+ )
+ win.update_game(rom_id: nil, backend: backend)
+ win.show
+ win.refresh(backend)
+ app.update
+
+ tree = "#{Gemba::AchievementsWindow::TOP}.tf.tree"
+ name_cmd = app.tcl_eval("#{tree} heading name -command")
+ pts_cmd = app.tcl_eval("#{tree} heading points -command")
+ app.tcl_eval("uplevel #0 {#{name_cmd}}") # sort by name
+ app.tcl_eval("uplevel #0 {#{pts_cmd}}") # switch to points
+ app.update
+
+ name_text = app.tcl_eval("#{tree} heading name -text")
+ pts_text = app.tcl_eval("#{tree} heading points -text")
+ refute_includes name_text, '▲', "name heading must lose indicator after switching"
+ refute_includes name_text, '▼', "name heading must lose indicator after switching"
+ assert_includes pts_text, '▲', "points heading should show ▲"
+ ensure
+ app.command(:destroy, Gemba::AchievementsWindow::TOP) rescue nil
+ end
+ end
+ end
+end
diff --git a/test/achievements_window/test_tree_rendering.rb b/test/achievements_window/test_tree_rendering.rb
new file mode 100644
index 0000000..de61a14
--- /dev/null
+++ b/test/achievements_window/test_tree_rendering.rb
@@ -0,0 +1,133 @@
+# frozen_string_literal: true
+
+require "minitest/autorun"
+require_relative "../shared/tk_test_helper"
+
+# Tests for AchievementsWindow treeview rendering — achievement rows, earned/
+# unearned column display, and status bar earned count.
+class TestAchievementsWindowTreeRendering < Minitest::Test
+ include TeekTestHelper
+
+ def test_tree_shows_achievement_titles
+ assert_tk_app("treeview rows show achievement titles from the backend") do
+ begin
+ require "gemba/headless"
+ require "support/achievements_window_helpers"
+ Gemba.bus = Gemba::EventBus.new
+
+ backend = Gemba::Achievements::FakeBackend.new
+ backend.login_with_token(username: 'u', token: 't')
+ backend.add_achievement(id: 'a1', title: 'First Act', description: '', points: 5) { false }
+ backend.add_achievement(id: 'a2', title: 'Second Act', description: '', points: 10) { false }
+
+ win = Gemba::AchievementsWindow.new(
+ app: app, rom_library: make_rom_library, config: FakeConfig.new(false)
+ )
+ win.update_game(rom_id: nil, backend: backend)
+ win.show
+ win.refresh(backend)
+ app.update
+
+ tree = "#{Gemba::AchievementsWindow::TOP}.tf.tree"
+ items = app.tcl_eval("#{tree} children {}").split
+ titles = items.map { |id| app.tcl_eval("#{tree} set #{id} name") }
+ assert_equal 2, items.size
+ assert_includes titles, 'First Act'
+ assert_includes titles, 'Second Act'
+ ensure
+ app.command(:destroy, Gemba::AchievementsWindow::TOP) rescue nil
+ end
+ end
+ end
+
+ def test_unearned_achievements_have_empty_earned_column
+ assert_tk_app("unearned achievements show empty earned column") do
+ begin
+ require "gemba/headless"
+ require "support/achievements_window_helpers"
+ Gemba.bus = Gemba::EventBus.new
+
+ backend = Gemba::Achievements::FakeBackend.new
+ backend.login_with_token(username: 'u', token: 't')
+ backend.add_achievement(id: 'a1', title: 'Unearned', description: '', points: 5) { false }
+
+ win = Gemba::AchievementsWindow.new(
+ app: app, rom_library: make_rom_library, config: FakeConfig.new(false)
+ )
+ win.update_game(rom_id: nil, backend: backend)
+ win.show
+ win.refresh(backend)
+ app.update
+
+ tree = "#{Gemba::AchievementsWindow::TOP}.tf.tree"
+ item = app.tcl_eval("#{tree} children {}").split.first
+ assert_equal '', app.tcl_eval("#{tree} set #{item} earned")
+ ensure
+ app.command(:destroy, Gemba::AchievementsWindow::TOP) rescue nil
+ end
+ end
+ end
+
+ def test_earned_achievements_show_date
+ assert_tk_app("earned achievements show a YYYY-MM-DD date in the earned column") do
+ begin
+ require "gemba/headless"
+ require "support/achievements_window_helpers"
+ require "support/fake_core"
+ Gemba.bus = Gemba::EventBus.new
+
+ backend = Gemba::Achievements::FakeBackend.new
+ backend.login_with_token(username: 'u', token: 't')
+ backend.add_achievement(id: 'a1', title: 'Earned One', description: '', points: 5) { |_| true }
+ backend.do_frame(FakeCore.new)
+
+ win = Gemba::AchievementsWindow.new(
+ app: app, rom_library: make_rom_library, config: FakeConfig.new(false)
+ )
+ win.update_game(rom_id: nil, backend: backend)
+ win.show
+ win.refresh(backend)
+ app.update
+
+ tree = "#{Gemba::AchievementsWindow::TOP}.tf.tree"
+ item = app.tcl_eval("#{tree} children {}").split.first
+ earned = app.tcl_eval("#{tree} set #{item} earned")
+ assert_match(/\d{4}-\d{2}-\d{2}/, earned)
+ ensure
+ app.command(:destroy, Gemba::AchievementsWindow::TOP) rescue nil
+ end
+ end
+ end
+
+ def test_status_bar_shows_earned_count
+ assert_tk_app("status bar shows 'X / Y earned'") do
+ begin
+ require "gemba/headless"
+ require "support/achievements_window_helpers"
+ require "support/fake_core"
+ Gemba.bus = Gemba::EventBus.new
+
+ backend = Gemba::Achievements::FakeBackend.new
+ backend.login_with_token(username: 'u', token: 't')
+ backend.add_achievement(id: 'a1', title: 'Alpha', description: '', points: 5) { |_| true }
+ backend.add_achievement(id: 'a2', title: 'Beta', description: '', points: 5) { false }
+ backend.do_frame(FakeCore.new)
+
+ win = Gemba::AchievementsWindow.new(
+ app: app, rom_library: make_rom_library, config: FakeConfig.new(false)
+ )
+ win.update_game(rom_id: nil, backend: backend)
+ win.show
+ win.refresh(backend)
+ app.update
+
+ top = Gemba::AchievementsWindow::TOP
+ status = app.command("#{top}.status_bar.status", :cget, '-text').to_s
+ assert_includes status, '1'
+ assert_includes status, '2'
+ ensure
+ app.command(:destroy, Gemba::AchievementsWindow::TOP) rescue nil
+ end
+ end
+ end
+end
diff --git a/test/shared/tk_test_helper.rb b/test/shared/tk_test_helper.rb
index 84a0d83..2d1124e 100644
--- a/test/shared/tk_test_helper.rb
+++ b/test/shared/tk_test_helper.rb
@@ -72,6 +72,25 @@ def initialize(*)
})
end
end
+
+ # Wrap after() to capture the full Ruby backtrace before Teek converts
+ # the exception to a Tcl error (at which point the backtrace is lost).
+ def after(ms, on_error: :raise, &block)
+ path = ENV['GEMBA_BGERROR_LOG']
+ return super unless path
+ super(ms, on_error: on_error) do
+ begin
+ block.call
+ rescue => e
+ File.open(path, 'a') do |f|
+ f.puts "Ruby exception in after(#{ms}ms): #{e.class}: #{e.message}"
+ f.puts e.backtrace.join("\n")
+ f.puts "---"
+ end
+ raise
+ end
+ end
+ end
end
Teek::App.prepend(BgerrorCapture)
RUBY
diff --git a/test/support/achievements_window_helpers.rb b/test/support/achievements_window_helpers.rb
new file mode 100644
index 0000000..94a43e1
--- /dev/null
+++ b/test/support/achievements_window_helpers.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+# Minimal config stand-in for AchievementsWindow tests.
+# The window only reads ra_unofficial? from config at build time.
+FakeConfig = Struct.new(:ra_unofficial) {
+ def ra_unofficial? = ra_unofficial
+} unless defined?(FakeConfig)
+
+# Build a plain rom hash suitable for RomLibrary stubbing.
+def make_rom_entry(id:, title:, platform: 'gba', game_code: 'AGB-TEST', md5: "#{id}abcd")
+ { 'rom_id' => id, 'title' => title, 'platform' => platform,
+ 'game_code' => game_code, 'path' => "/games/#{id}.gba", 'md5' => md5 }
+end unless respond_to?(:make_rom_entry, true)
+
+# Wrap an array of rom hashes in a minimal RomLibrary-compatible struct.
+def make_rom_library(*roms)
+ Struct.new(:roms) { def all = roms }.new(roms)
+end unless respond_to?(:make_rom_library, true)
diff --git a/test/support/fake_core.rb b/test/support/fake_core.rb
new file mode 100644
index 0000000..40b503c
--- /dev/null
+++ b/test/support/fake_core.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+# Minimal Core stub — no mGBA dependency, just a programmable memory map.
+# Used by achievement backend tests to simulate bus reads without a real ROM.
+class FakeCore
+ def initialize
+ @mem = Hash.new(0)
+ end
+
+ # Write a byte into the fake memory map.
+ # @param address [Integer] GBA address
+ # @param value [Integer] 0..255
+ def poke(address, value)
+ @mem[address] = value & 0xFF
+ end
+
+ # Reads back what was poked (or 0 for anything not explicitly written).
+ def bus_read8(address)
+ @mem[address]
+ end
+
+ def destroyed?
+ false
+ end
+end
diff --git a/test/support/fake_ra_runtime.rb b/test/support/fake_ra_runtime.rb
new file mode 100644
index 0000000..060ebcb
--- /dev/null
+++ b/test/support/fake_ra_runtime.rb
@@ -0,0 +1,74 @@
+# frozen_string_literal: true
+
+# Test double for Gemba::RARuntime (the C extension).
+#
+# Mirrors the full RARuntime interface so RetroAchievements::Backend can be
+# tested without a real rcheevos instance or ROM memory.
+#
+# Usage:
+# rt = FakeRARuntime.new
+# rt.queue_triggers("101", "102") # do_frame will return these once
+# rt.rp_message = "Playing Stage 1" # get_richpresence returns this
+# rt.rp_activate_result = false # activate_richpresence returns false
+class FakeRARuntime
+ attr_reader :activated, :deactivated, :cleared, :reset_count
+ attr_reader :rp_script
+ attr_accessor :rp_message, :rp_activate_result
+
+ def initialize
+ @activated = {} # id => memaddr
+ @deactivated = []
+ @trigger_queue = [] # Array> — one entry consumed per do_frame
+ @cleared = false
+ @reset_count = 0
+ @rp_script = nil
+ @rp_message = nil
+ @rp_activate_result = true
+ end
+
+ # Queue one frame's worth of triggered achievement IDs.
+ # Each call adds one "frame": the next do_frame call pops and returns it.
+ def queue_triggers(*ids)
+ @trigger_queue << ids.flatten.map(&:to_s)
+ end
+
+ # -- RARuntime interface ----------------------------------------------------
+
+ def activate(id, memaddr)
+ @activated[id.to_s] = memaddr.to_s
+ end
+
+ def deactivate(id)
+ @deactivated << id.to_s
+ @activated.delete(id.to_s)
+ end
+
+ def reset_all
+ @reset_count += 1
+ end
+
+ def clear
+ @activated.clear
+ @deactivated.clear
+ @trigger_queue.clear
+ @cleared = true
+ end
+
+ # Returns the next queued batch of triggered IDs, or [] if nothing queued.
+ def do_frame(_core)
+ @trigger_queue.shift || []
+ end
+
+ def count
+ @activated.size
+ end
+
+ def activate_richpresence(script)
+ @rp_script = script
+ @rp_activate_result
+ end
+
+ def get_richpresence(_core)
+ @rp_message
+ end
+end
diff --git a/test/support/fake_requester.rb b/test/support/fake_requester.rb
new file mode 100644
index 0000000..1f975b0
--- /dev/null
+++ b/test/support/fake_requester.rb
@@ -0,0 +1,68 @@
+# frozen_string_literal: true
+
+# Synchronous test double for the RetroAchievements HTTP transport.
+#
+# Designed to match Teek::BackgroundWork's fluent interface so it can be
+# injected without any branching in ra_request — the same code path runs
+# in production and tests.
+#
+# Usage:
+# req = FakeRequester.new
+# req.stub(r: "login2", body: { "Success" => true, "Token" => "tok" })
+# req.stub(r: "gameid", body: { "GameID" => 42 })
+#
+# backend = Backend.new(app: nil, runtime: FakeRARuntime.new, requester: req)
+# backend.login_with_token(username: "u", token: "t")
+# assert backend.authenticated?
+# assert req.requested?("login2")
+class FakeRequester
+ # Returned by call() — mirrors BackgroundWork's fluent on_progress/on_done chain.
+ # on_progress fires synchronously with the canned result so callers behave
+ # identically to the async production path without needing an event loop.
+ class Result
+ def initialize(value)
+ @value = value
+ end
+
+ def on_progress(&block)
+ block.call(@value)
+ self
+ end
+
+ def on_done(&block)
+ self
+ end
+ end
+
+ attr_reader :requests
+
+ def initialize
+ @stubs = {} # r_string => [json_or_nil, ok_bool]
+ @requests = [] # all params hashes, in call order
+ end
+
+ # Register a canned response for a given r= value.
+ def stub(r:, body: nil, ok: true)
+ @stubs[r.to_s] = [body, ok]
+ end
+
+ # Called by ra_request with the same signature as Teek::BackgroundWork.new.
+ # Ignores the block (which contains real Net::HTTP code) and returns a
+ # Result that fires on_progress synchronously with the canned response.
+ def call(_app, params, mode: nil, **_opts, &_block)
+ @requests << params.dup
+ r = (params[:r] || params["r"]).to_s
+ result = @stubs.fetch(r, [nil, false])
+ Result.new(result)
+ end
+
+ # True if at least one request with the given r= value was made.
+ def requested?(r)
+ @requests.any? { |p| (p[:r] || p["r"]).to_s == r.to_s }
+ end
+
+ # All params hashes for requests with the given r= value.
+ def requests_for(r)
+ @requests.select { |p| (p[:r] || p["r"]).to_s == r.to_s }
+ end
+end
diff --git a/test/support/player_helpers.rb b/test/support/player_helpers.rb
index 743e78d..9d8d0df 100644
--- a/test/support/player_helpers.rb
+++ b/test/support/player_helpers.rb
@@ -60,14 +60,21 @@ def poll_until_focused(player, timeout_ms: 2_000, &block)
app.after(50, &check)
end
-def poll_until_ready(player, timeout_ms: 5_000, &block)
- app = player.app
+# Polls every 50ms until the given condition block returns truthy, then
+# yields the action block. Aborts with exit 1 if the deadline is exceeded.
+#
+# Example — wait for a menu entry to become enabled:
+# poll_until(app, timeout_ms: 3_000,
+# condition: -> { app.tcl_eval('...entrycget 0 -state').strip == 'normal' }) do
+# app.command(...)
+# end
+def poll_until(app, timeout_ms: 5_000, condition:, label: "condition", &block)
deadline = Process.clock_gettime(Process::CLOCK_MONOTONIC) + timeout_ms / 1000.0
check = proc do
- if player.ready?
+ if condition.call
block.call
elsif Process.clock_gettime(Process::CLOCK_MONOTONIC) > deadline
- $stderr.puts "FAIL: Player not ready within #{timeout_ms}ms"
+ $stderr.puts "FAIL: #{label} not true within #{timeout_ms}ms"
exit 1
else
app.after(50, &check)
@@ -75,3 +82,11 @@ def poll_until_ready(player, timeout_ms: 5_000, &block)
end
app.after(50, &check)
end
+
+def poll_until_ready(player, timeout_ms: 5_000, &block)
+ poll_until(player.app, timeout_ms: timeout_ms,
+ condition: -> { player.ready? },
+ label: "Player not ready") do
+ block.call
+ end
+end
diff --git a/test/test_achievement.rb b/test/test_achievement.rb
new file mode 100644
index 0000000..260b3c6
--- /dev/null
+++ b/test/test_achievement.rb
@@ -0,0 +1,32 @@
+# frozen_string_literal: true
+
+require "minitest/autorun"
+require "gemba/headless"
+require "gemba/achievements"
+
+class TestAchievement < Minitest::Test
+ def test_unearned_by_default
+ ach = Gemba::Achievements::Achievement.new(
+ id: 'x', title: 'T', description: 'D', points: 10, earned_at: nil
+ )
+ refute ach.earned?
+ assert_nil ach.earned_at
+ end
+
+ def test_earn_returns_copy_with_timestamp
+ ach = Gemba::Achievements::Achievement.new(
+ id: 'x', title: 'T', description: 'D', points: 10, earned_at: nil
+ )
+ earned = ach.earn
+ assert earned.earned?
+ assert_instance_of Time, earned.earned_at
+ end
+
+ def test_earn_does_not_mutate_original
+ ach = Gemba::Achievements::Achievement.new(
+ id: 'x', title: 'T', description: 'D', points: 10, earned_at: nil
+ )
+ ach.earn
+ refute ach.earned?
+ end
+end
diff --git a/test/test_app_controller.rb b/test/test_app_controller.rb
index 0a5c8c8..4d7fcaf 100644
--- a/test/test_app_controller.rb
+++ b/test/test_app_controller.rb
@@ -17,6 +17,7 @@ def test_exit_with_rom_loaded_does_not_hang
require "support/player_helpers"
player = Gemba::AppController.new("#{TEST_ROM}")
+ player.disable_confirmations!
app = player.app
poll_until_ready(player) { player.running = false }
@@ -39,6 +40,7 @@ def test_quit_hotkey_without_rom
require "gemba"
player = Gemba::AppController.new
+ player.disable_confirmations!
app = player.app
app.after(100) do
@@ -70,11 +72,11 @@ def test_view_menu_game_library_returns_to_picker
player.disable_confirmations!
app = player.app
- poll_until_ready(player) do
+ poll_until(app, timeout_ms: 5_000,
+ condition: -> { app.tcl_eval('.menubar.view entrycget 0 -state').strip == 'normal' },
+ label: "View menu entry never became enabled") do
puts "BEFORE=#{player.current_view}"
-
- app.command('.menubar.view', 'invoke', 0)
-
+ app.tcl_eval('.menubar.view invoke 0')
app.after(100) do
puts "AFTER=#{player.current_view}"
player.running = false
@@ -157,6 +159,7 @@ def test_fullscreen_toggle_does_not_hang
require "support/player_helpers"
player = Gemba::AppController.new("#{TEST_ROM}")
+ player.disable_confirmations!
app = player.app
poll_until_ready(player) do
@@ -173,8 +176,8 @@ def test_fullscreen_toggle_does_not_hang
app.update
app.after(50) do
- # User presses q → quit
- app.command(:event, 'generate', frame, '', keysym: 'q')
+ # Trigger quit via virtual event — no focus dependency
+ app.command(:event, 'generate', '.', '<>')
end
end
end
@@ -201,6 +204,7 @@ def test_exit_during_turbo_does_not_hang
require "support/player_helpers"
player = Gemba::AppController.new("#{TEST_ROM}")
+ player.disable_confirmations!
app = player.app
poll_until_ready(player) do
@@ -212,8 +216,8 @@ def test_exit_during_turbo_does_not_hang
app.update
app.after(50) do
- # User presses q → quit (while still in turbo)
- app.command(:event, 'generate', frame, '', keysym: 'q')
+ # Trigger quit via virtual event — no focus dependency
+ app.command(:event, 'generate', '.', '<>')
end
end
@@ -255,11 +259,8 @@ def test_quick_save_and_load_creates_files_and_restores_state
# Recompute state_dir after overriding config.states_dir
player.frame.save_mgr.state_dir = player.frame.save_mgr.state_dir_for_rom(core)
state_dir = player.frame.save_mgr.state_dir
- vp = player.frame.viewport
- frame_path = vp.frame.path
-
- # Quick save (F5)
- app.command(:event, 'generate', frame_path, '', keysym: 'F5')
+ # Quick save
+ app.command(:event, 'generate', '.', '<>')
app.update
app.after(50) do
@@ -283,7 +284,7 @@ def test_quick_save_and_load_creates_files_and_restores_state
# Save again to test backup rotation (after debounce)
app.after(50) do
- app.command(:event, 'generate', frame_path, '', keysym: 'F5')
+ app.command(:event, 'generate', '.', '<>')
app.update
app.after(50) do
@@ -300,8 +301,8 @@ def test_quick_save_and_load_creates_files_and_restores_state
exit 1
end
- # Quick load (F8)
- app.command(:event, 'generate', frame_path, '', keysym: 'F8')
+ # Quick load
+ app.command(:event, 'generate', '.', '<>')
app.update
app.after(50) do
@@ -374,11 +375,9 @@ def test_quick_save_debounce_blocks_rapid_fire
poll_until_ready(player) do
# Recompute state_dir after overriding config.states_dir
player.frame.save_mgr.state_dir = player.frame.save_mgr.state_dir_for_rom(player.frame.save_mgr.core)
- vp = player.frame.viewport
- frame_path = vp.frame.path
# First save should succeed
- app.command(:event, 'generate', frame_path, '', keysym: 'F5')
+ app.command(:event, 'generate', '.', '<>')
app.update
app.after(50) do
@@ -389,7 +388,7 @@ def test_quick_save_debounce_blocks_rapid_fire
first_mtime = first_exists ? File.mtime(ss_path) : nil
# Immediate second save should be debounced (within 5s window)
- app.command(:event, 'generate', frame_path, '', keysym: 'F5')
+ app.command(:event, 'generate', '.', '<>')
app.update
app.after(50) do
@@ -789,11 +788,8 @@ def test_recording_toggle_creates_trec_file
config.recordings_dir = rec_dir
poll_until_ready(player) do
- vp = player.frame.viewport
- frame = vp.frame.path
-
- # Press F10 → start recording
- app.command(:event, 'generate', frame, '', keysym: 'F10')
+ # Start recording via virtual event (no focus needed)
+ app.command(:event, 'generate', '.', '<>')
app.update
# Let a few frames render with the recording indicator (red dot)
@@ -804,10 +800,8 @@ def test_recording_toggle_creates_trec_file
next
end
- # Refocus needed under xvfb after timer callbacks
- app.tcl_eval("focus -force \#{frame}")
- # Press F10 → stop recording
- app.command(:event, 'generate', frame, '', keysym: 'F10')
+ # Stop recording via virtual event
+ app.command(:event, 'generate', '.', '<>')
app.update
app.after(50) do
@@ -1090,9 +1084,7 @@ def test_question_hotkey_shows_help_window
app = player.app
app.after(100) do
- app.tcl_eval("focus -force .")
- app.update
- app.tcl_eval("event generate . ")
+ app.command(:event, 'generate', '.', '<>')
app.update
state = app.tcl_eval("wm state .help_window")
puts state == 'normal' ? "PASS" : "FAIL: help window not visible (state=\#{state})"
@@ -1120,13 +1112,11 @@ def test_question_hotkey_toggles_help_window
app = player.app
app.after(100) do
- app.tcl_eval("focus -force .")
- app.update
# First press — show
- app.tcl_eval("event generate . ")
+ app.command(:event, 'generate', '.', '<>')
app.update
# Second press — hide
- app.tcl_eval("event generate . ")
+ app.command(:event, 'generate', '.', '<>')
app.update
state = app.tcl_eval("wm state .help_window")
puts state == 'withdrawn' ? "PASS" : "FAIL: help window still visible after second ? press (state=\#{state})"
@@ -1154,13 +1144,11 @@ def test_help_window_hidden_in_fullscreen
app = player.app
app.after(100) do
- app.tcl_eval("focus -force .")
- app.update
# Go fullscreen via bus
Gemba.bus.emit(:request_fullscreen)
app.update
- # Press ? — should be suppressed
- app.tcl_eval("event generate . ")
+ # Toggle help — should be suppressed in fullscreen
+ app.command(:event, 'generate', '.', '<>')
app.update
exists = app.tcl_eval("winfo exists .help_window")
state = exists == '1' ? app.tcl_eval("wm state .help_window") : 'withdrawn'
diff --git a/test/test_cli.rb b/test/test_cli.rb
index 368215b..52f297e 100644
--- a/test/test_cli.rb
+++ b/test/test_cli.rb
@@ -4,186 +4,6 @@
require "gemba/headless"
class TestCLI < Minitest::Test
- def parse_play(args)
- Gemba::CLI.parse_play(args)
- end
-
- # -- ROM argument --
-
- def test_rom_path
- opts = parse_play(["game.gba"])
- assert_equal File.expand_path("game.gba"), opts[:rom]
- end
-
- def test_rom_path_expands_tilde
- opts = parse_play(["~/game.gba"])
- assert_equal File.join(Dir.home, "game.gba"), opts[:rom]
- end
-
- def test_no_rom
- opts = parse_play([])
- assert_nil opts[:rom]
- end
-
- # -- play flags --
-
- def test_scale
- opts = parse_play(["--scale", "2"])
- assert_equal 2, opts[:scale]
- end
-
- def test_scale_short
- opts = parse_play(["-s", "3"])
- assert_equal 3, opts[:scale]
- end
-
- def test_scale_clamps_high
- opts = parse_play(["--scale", "10"])
- assert_equal 4, opts[:scale]
- end
-
- def test_scale_clamps_low
- opts = parse_play(["--scale", "0"])
- assert_equal 1, opts[:scale]
- end
-
- def test_volume
- opts = parse_play(["--volume", "50"])
- assert_equal 50, opts[:volume]
- end
-
- def test_volume_short
- opts = parse_play(["-v", "75"])
- assert_equal 75, opts[:volume]
- end
-
- def test_volume_clamps
- opts = parse_play(["--volume", "200"])
- assert_equal 100, opts[:volume]
- end
-
- def test_mute
- opts = parse_play(["--mute"])
- assert opts[:mute]
- end
-
- def test_mute_short
- opts = parse_play(["-m"])
- assert opts[:mute]
- end
-
- def test_no_sound
- opts = parse_play(["--no-sound"])
- assert_equal false, opts[:sound]
- end
-
- def test_fullscreen
- opts = parse_play(["--fullscreen"])
- assert opts[:fullscreen]
- end
-
- def test_fullscreen_short
- opts = parse_play(["-f"])
- assert opts[:fullscreen]
- end
-
- def test_show_fps
- opts = parse_play(["--show-fps"])
- assert opts[:show_fps]
- end
-
- def test_turbo_speed
- opts = parse_play(["--turbo-speed", "3"])
- assert_equal 3, opts[:turbo_speed]
- end
-
- def test_turbo_speed_clamps
- opts = parse_play(["--turbo-speed", "99"])
- assert_equal 4, opts[:turbo_speed]
- end
-
- def test_locale
- opts = parse_play(["--locale", "ja"])
- assert_equal "ja", opts[:locale]
- end
-
- def test_help_flag
- opts = parse_play(["--help"])
- assert opts[:help]
- end
-
- # -- combinations --
-
- def test_flags_with_rom
- opts = parse_play(["-s", "2", "--mute", "pokemon.gba"])
- assert_equal 2, opts[:scale]
- assert opts[:mute]
- assert_equal File.expand_path("pokemon.gba"), opts[:rom]
- end
-
- def test_rom_before_flags
- opts = parse_play(["game.gba", "--scale", "4"])
- assert_equal File.expand_path("game.gba"), opts[:rom]
- assert_equal 4, opts[:scale]
- end
-
- # -- parser included for help output --
-
- def test_parser_present
- opts = parse_play([])
- assert_kind_of OptionParser, opts[:parser]
- end
-
- def test_help_output_includes_banner
- opts = parse_play([])
- help = opts[:parser].to_s
- assert_includes help, "Usage: gemba"
- end
-
- # -- apply --
-
- class MockConfig
- attr_accessor :scale, :volume, :muted, :show_fps, :turbo_speed, :locale
-
- def initialize
- @scale = 3
- @volume = 100
- @muted = false
- @show_fps = false
- @turbo_speed = 0
- @locale = 'auto'
- end
- end
-
- def test_apply_overrides_config
- config = MockConfig.new
- Gemba::CLI.apply(config, { scale: 2, volume: 50, mute: true, show_fps: true })
- assert_equal 2, config.scale
- assert_equal 50, config.volume
- assert config.muted
- assert config.show_fps
- end
-
- def test_apply_skips_unset_options
- config = MockConfig.new
- Gemba::CLI.apply(config, {})
- assert_equal 3, config.scale
- assert_equal 100, config.volume
- refute config.muted
- end
-
- def test_apply_locale
- config = MockConfig.new
- Gemba::CLI.apply(config, { locale: 'ja' })
- assert_equal 'ja', config.locale
- end
-
- def test_apply_turbo_speed
- config = MockConfig.new
- Gemba::CLI.apply(config, { turbo_speed: 3 })
- assert_equal 3, config.turbo_speed
- end
-
# -- subcommand dispatch --
def test_subcommands_constant
@@ -206,286 +26,8 @@ def test_main_help_lists_subcommands
assert_includes help, "version"
end
- # -- record subcommand parsing --
-
- def test_parse_record_frames_and_rom
- opts = Gemba::CLI.parse_record(["--frames", "100", "game.gba"])
- assert_equal 100, opts[:frames]
- assert_equal File.expand_path("game.gba"), opts[:rom]
- end
-
- def test_parse_record_output
- opts = Gemba::CLI.parse_record(["-o", "out.grec", "--frames", "10", "game.gba"])
- assert_equal "out.grec", opts[:output]
- end
-
- def test_parse_record_help
- opts = Gemba::CLI.parse_record(["--help"])
- assert opts[:help]
- end
-
- # -- decode subcommand parsing --
-
- def test_parse_decode_grec
- opts = Gemba::CLI.parse_decode(["recording.grec"])
- assert_equal "recording.grec", opts[:grec]
- end
-
- def test_parse_decode_output
- opts = Gemba::CLI.parse_decode(["-o", "out.mkv", "recording.grec"])
- assert_equal "out.mkv", opts[:output]
- end
-
- def test_parse_decode_codecs
- opts = Gemba::CLI.parse_decode(["--video-codec", "libx265", "--audio-codec", "opus", "r.grec"])
- assert_equal "libx265", opts[:video_codec]
- assert_equal "opus", opts[:audio_codec]
- end
-
- def test_parse_decode_stats
- opts = Gemba::CLI.parse_decode(["--stats", "recording.grec"])
- assert opts[:stats]
- assert_equal "recording.grec", opts[:grec]
- end
-
- def test_parse_decode_list
- opts = Gemba::CLI.parse_decode(["--list"])
- assert opts[:list]
- end
-
- def test_parse_decode_list_short
- opts = Gemba::CLI.parse_decode(["-l"])
- assert opts[:list]
- end
-
- # -- replay subcommand parsing --
-
- def test_parse_replay_gir
- opts = Gemba::CLI.parse_replay(["session.gir"])
- assert_equal "session.gir", opts[:gir]
- end
-
- def test_parse_replay_headless
- opts = Gemba::CLI.parse_replay(["--headless", "session.gir"])
- assert opts[:headless]
- end
-
- def test_parse_replay_list
- opts = Gemba::CLI.parse_replay(["--list"])
- assert opts[:list]
- end
-
- def test_parse_replay_fullscreen
- opts = Gemba::CLI.parse_replay(["-f", "session.gir"])
- assert opts[:fullscreen]
- end
-
- def test_parse_replay_no_sound
- opts = Gemba::CLI.parse_replay(["--no-sound", "session.gir"])
- assert_equal false, opts[:sound]
- end
-
- def test_parse_replay_help
- opts = Gemba::CLI.parse_replay(["--help"])
- assert opts[:help]
- end
-
- # -- config subcommand parsing --
-
- def test_parse_config_reset
- opts = Gemba::CLI.parse_config(["--reset"])
- assert opts[:reset]
- end
-
- def test_parse_config_reset_with_yes
- opts = Gemba::CLI.parse_config(["--reset", "-y"])
- assert opts[:reset]
- assert opts[:yes]
- end
-
- def test_parse_config_help
- opts = Gemba::CLI.parse_config(["--help"])
- assert opts[:help]
- end
-
- def test_parse_config_no_flags
- opts = Gemba::CLI.parse_config([])
- refute opts[:reset]
- refute opts[:help]
- end
-
- # -- version --
-
- def test_run_version
- out = capture_io { Gemba::CLI.run_version([]) }[0]
- assert_includes out, "gemba"
- assert_includes out, Gemba::VERSION
- end
-
- # -- dry_run: full dispatch pipeline --
-
- def test_dry_run_play_no_args
- result = Gemba::CLI.run([], dry_run: true)
- assert_equal :play, result[:command]
- assert_nil result[:rom]
- assert_equal true, result[:sound]
- end
-
- def test_dry_run_play_with_rom
- result = Gemba::CLI.run(["game.gba"], dry_run: true)
- assert_equal :play, result[:command]
- assert_equal File.expand_path("game.gba"), result[:rom]
- end
-
- def test_dry_run_explicit_play
- result = Gemba::CLI.run(["play", "-s", "2", "game.gba"], dry_run: true)
- assert_equal :play, result[:command]
- assert_equal File.expand_path("game.gba"), result[:rom]
- assert_equal 2, result[:options][:scale]
- end
-
- def test_dry_run_play_no_sound
- result = Gemba::CLI.run(["--no-sound", "game.gba"], dry_run: true)
- assert_equal :play, result[:command]
- assert_equal false, result[:sound]
- end
-
- def test_dry_run_play_fullscreen
- result = Gemba::CLI.run(["-f", "game.gba"], dry_run: true)
- assert_equal :play, result[:command]
- assert_equal true, result[:fullscreen]
- end
-
- def test_dry_run_play_help
- result = Gemba::CLI.run(["play", "--help"], dry_run: true)
- assert_equal :play, result[:command]
- assert result[:help]
- end
-
- def test_dry_run_record
- result = Gemba::CLI.run(["record", "--frames", "100", "game.gba"], dry_run: true)
- assert_equal :record, result[:command]
- assert_equal File.expand_path("game.gba"), result[:rom]
- assert_equal 100, result[:frames]
- end
-
- def test_dry_run_record_with_output
- result = Gemba::CLI.run(["record", "--frames", "50", "-o", "out.grec", "game.gba"], dry_run: true)
- assert_equal :record, result[:command]
- assert_equal "out.grec", result[:output]
- assert_equal 50, result[:frames]
- end
-
- def test_dry_run_record_help
- result = Gemba::CLI.run(["record", "--help"], dry_run: true)
- assert_equal :record, result[:command]
- assert result[:help]
- end
-
- def test_dry_run_decode_no_args_lists
- result = Gemba::CLI.run(["decode"], dry_run: true)
- assert_equal :decode_list, result[:command]
- end
-
- def test_dry_run_decode
- result = Gemba::CLI.run(["decode", "recording.grec"], dry_run: true)
- assert_equal :decode, result[:command]
- assert_equal "recording.grec", result[:grec]
- refute result[:stats]
- end
-
- def test_dry_run_decode_stats
- result = Gemba::CLI.run(["decode", "--stats", "recording.grec"], dry_run: true)
- assert_equal :decode_stats, result[:command]
- assert result[:stats]
- assert_equal "recording.grec", result[:grec]
- end
-
- def test_dry_run_decode_with_codecs
- result = Gemba::CLI.run(["decode", "--video-codec", "libx265", "--audio-codec", "opus", "r.grec"], dry_run: true)
- assert_equal :decode, result[:command]
- assert_equal "libx265", result[:video_codec]
- assert_equal "opus", result[:audio_codec]
- end
-
- def test_dry_run_decode_list
- result = Gemba::CLI.run(["decode", "--list"], dry_run: true)
- assert_equal :decode_list, result[:command]
- end
-
- def test_dry_run_decode_help
- result = Gemba::CLI.run(["decode", "--help"], dry_run: true)
- assert_equal :decode, result[:command]
- assert result[:help]
- end
-
- def test_dry_run_replay
- result = Gemba::CLI.run(["replay", "session.gir"], dry_run: true)
- assert_equal :replay, result[:command]
- assert_equal File.expand_path("session.gir"), result[:gir]
- assert_equal true, result[:sound]
- end
-
- def test_dry_run_replay_headless
- result = Gemba::CLI.run(["replay", "--headless", "session.gir"], dry_run: true)
- assert_equal :replay_headless, result[:command]
- assert result[:headless]
- end
-
- def test_dry_run_replay_list
- result = Gemba::CLI.run(["replay", "--list"], dry_run: true)
- assert_equal :replay_list, result[:command]
- end
-
- def test_dry_run_replay_help
- result = Gemba::CLI.run(["replay", "--help"], dry_run: true)
- assert_equal :replay, result[:command]
- assert result[:help]
- end
-
- def test_dry_run_config_show
- result = Gemba::CLI.run(["config"], dry_run: true)
- assert_equal :config_show, result[:command]
- refute result[:reset]
- end
-
- def test_dry_run_config_reset
- result = Gemba::CLI.run(["config", "--reset"], dry_run: true)
- assert_equal :config_reset, result[:command]
- assert result[:reset]
- end
-
- def test_dry_run_config_reset_yes
- result = Gemba::CLI.run(["config", "--reset", "-y"], dry_run: true)
- assert_equal :config_reset, result[:command]
- assert result[:reset]
- assert result[:yes]
- end
-
- def test_dry_run_config_help
- result = Gemba::CLI.run(["config", "--help"], dry_run: true)
- assert_equal :config, result[:command]
- assert result[:help]
- end
-
- def test_dry_run_version
- result = Gemba::CLI.run(["version"], dry_run: true)
- assert_equal :version, result[:command]
- assert_equal Gemba::VERSION, result[:version]
- end
-
def test_dry_run_main_help
result = Gemba::CLI.run(["--help"], dry_run: true)
assert_equal :help, result[:command]
end
-
- # -- error cases --
-
- def test_unknown_play_flag_raises
- assert_raises(OptionParser::InvalidOption) { parse_play(["--bogus"]) }
- end
-
- def test_missing_scale_value_raises
- assert_raises(OptionParser::MissingArgument) { parse_play(["--scale"]) }
- end
end
diff --git a/test/test_cli_config.rb b/test/test_cli_config.rb
new file mode 100644
index 0000000..900fa5a
--- /dev/null
+++ b/test/test_cli_config.rb
@@ -0,0 +1,64 @@
+# frozen_string_literal: true
+
+require "minitest/autorun"
+require "gemba/headless"
+require "gemba/cli/commands/config_cmd"
+
+class TestCLIConfig < Minitest::Test
+ ConfigCmd = Gemba::CLI::Commands::ConfigCmd
+
+ # -- parse --
+
+ def test_reset_flag
+ assert cfg(["--reset"]).parse[:reset]
+ end
+
+ def test_reset_with_yes
+ opts = cfg(["--reset", "-y"]).parse
+ assert opts[:reset]
+ assert opts[:yes]
+ end
+
+ def test_help
+ assert cfg(["--help"]).parse[:help]
+ end
+
+ def test_no_flags
+ opts = cfg([]).parse
+ refute opts[:reset]
+ refute opts[:help]
+ end
+
+ # -- dry_run via CLI.run dispatch --
+
+ def test_dry_run_show
+ result = Gemba::CLI.run(["config"], dry_run: true)
+ assert_equal :config_show, result[:command]
+ refute result[:reset]
+ end
+
+ def test_dry_run_reset
+ result = Gemba::CLI.run(["config", "--reset"], dry_run: true)
+ assert_equal :config_reset, result[:command]
+ assert result[:reset]
+ end
+
+ def test_dry_run_reset_yes
+ result = Gemba::CLI.run(["config", "--reset", "-y"], dry_run: true)
+ assert_equal :config_reset, result[:command]
+ assert result[:reset]
+ assert result[:yes]
+ end
+
+ def test_dry_run_help
+ result = Gemba::CLI.run(["config", "--help"], dry_run: true)
+ assert_equal :config, result[:command]
+ assert result[:help]
+ end
+
+ private
+
+ def cfg(argv)
+ ConfigCmd.new(argv)
+ end
+end
diff --git a/test/test_cli_decode.rb b/test/test_cli_decode.rb
new file mode 100644
index 0000000..cda64ea
--- /dev/null
+++ b/test/test_cli_decode.rb
@@ -0,0 +1,97 @@
+# frozen_string_literal: true
+
+require "minitest/autorun"
+require "gemba/headless"
+require "gemba/cli/commands/decode"
+
+class TestCLIDecode < Minitest::Test
+ Decode = Gemba::CLI::Commands::Decode
+ # -- parse --
+
+ def test_grec_file
+ opts = dec(["recording.grec"]).parse
+ assert_equal "recording.grec", opts[:grec]
+ end
+
+ def test_output
+ opts = dec(["-o", "out.mkv", "recording.grec"]).parse
+ assert_equal "out.mkv", opts[:output]
+ end
+
+ def test_codecs
+ opts = dec(["--video-codec", "libx265", "--audio-codec", "opus", "r.grec"]).parse
+ assert_equal "libx265", opts[:video_codec]
+ assert_equal "opus", opts[:audio_codec]
+ end
+
+ def test_stats
+ opts = dec(["--stats", "recording.grec"]).parse
+ assert opts[:stats]
+ assert_equal "recording.grec", opts[:grec]
+ end
+
+ def test_list
+ opts = dec(["--list"]).parse
+ assert opts[:list]
+ end
+
+ def test_list_short
+ opts = dec(["-l"]).parse
+ assert opts[:list]
+ end
+
+ def test_no_progress
+ opts = dec(["--no-progress", "r.grec"]).parse
+ assert_equal false, opts[:progress]
+ end
+
+ def test_help
+ opts = dec(["--help"]).parse
+ assert opts[:help]
+ end
+
+ # -- dry_run via CLI.run dispatch --
+
+ def test_dry_run_no_args_lists
+ result = Gemba::CLI.run(["decode"], dry_run: true)
+ assert_equal :decode_list, result[:command]
+ end
+
+ def test_dry_run
+ result = Gemba::CLI.run(["decode", "recording.grec"], dry_run: true)
+ assert_equal :decode, result[:command]
+ assert_equal "recording.grec", result[:grec]
+ refute result[:stats]
+ end
+
+ def test_dry_run_stats
+ result = Gemba::CLI.run(["decode", "--stats", "recording.grec"], dry_run: true)
+ assert_equal :decode_stats, result[:command]
+ assert result[:stats]
+ assert_equal "recording.grec", result[:grec]
+ end
+
+ def test_dry_run_with_codecs
+ result = Gemba::CLI.run(["decode", "--video-codec", "libx265", "--audio-codec", "opus", "r.grec"], dry_run: true)
+ assert_equal :decode, result[:command]
+ assert_equal "libx265", result[:video_codec]
+ assert_equal "opus", result[:audio_codec]
+ end
+
+ def test_dry_run_list
+ result = Gemba::CLI.run(["decode", "--list"], dry_run: true)
+ assert_equal :decode_list, result[:command]
+ end
+
+ def test_dry_run_help
+ result = Gemba::CLI.run(["decode", "--help"], dry_run: true)
+ assert_equal :decode, result[:command]
+ assert result[:help]
+ end
+
+ private
+
+ def dec(argv)
+ Decode.new(argv)
+ end
+end
diff --git a/test/test_cli_patch.rb b/test/test_cli_patch.rb
new file mode 100644
index 0000000..c56c30d
--- /dev/null
+++ b/test/test_cli_patch.rb
@@ -0,0 +1,58 @@
+# frozen_string_literal: true
+
+require "minitest/autorun"
+require "gemba/headless"
+require "gemba/cli/commands/patch"
+
+class TestCLIPatch < Minitest::Test
+ Patch = Gemba::CLI::Commands::Patch
+
+ # -- parse --
+
+ def test_rom_and_patch_args
+ opts = pat(["game.gba", "fix.ips"]).parse
+ assert_equal File.expand_path("game.gba"), opts[:rom]
+ assert_equal File.expand_path("fix.ips"), opts[:patch]
+ end
+
+ def test_output_flag
+ opts = pat(["-o", "/tmp/out.gba", "game.gba", "fix.ips"]).parse
+ assert_equal File.expand_path("/tmp/out.gba"), opts[:output]
+ end
+
+ def test_help
+ assert pat(["--help"]).parse[:help]
+ end
+
+ def test_missing_args_returns_error
+ result = pat([]).call
+ assert_equal :patch, result[:command]
+ assert_equal :missing_args, result[:error]
+ end
+
+ # -- dry_run via CLI.run dispatch --
+
+ def test_dry_run
+ result = Gemba::CLI.run(["patch", "game.gba", "fix.ips"], dry_run: true)
+ assert_equal :patch, result[:command]
+ assert_equal File.expand_path("game.gba"), result[:rom]
+ assert_equal File.expand_path("fix.ips"), result[:patch]
+ end
+
+ def test_dry_run_default_out_path
+ result = Gemba::CLI.run(["patch", "game.gba", "fix.ips"], dry_run: true)
+ assert_match(/-patched\.gba\z/, result[:out])
+ end
+
+ def test_dry_run_help
+ result = Gemba::CLI.run(["patch", "--help"], dry_run: true)
+ assert_equal :patch, result[:command]
+ assert result[:help]
+ end
+
+ private
+
+ def pat(argv)
+ Patch.new(argv)
+ end
+end
diff --git a/test/test_cli_play.rb b/test/test_cli_play.rb
new file mode 100644
index 0000000..447ce59
--- /dev/null
+++ b/test/test_cli_play.rb
@@ -0,0 +1,213 @@
+# frozen_string_literal: true
+
+require "minitest/autorun"
+require "gemba/headless"
+require "gemba/cli/commands/play"
+
+class TestCLIPlay < Minitest::Test
+ Play = Gemba::CLI::Commands::Play
+ # -- ROM argument --
+
+ def test_rom_path
+ assert_equal File.expand_path("game.gba"), play(["game.gba"]).parse[:rom]
+ end
+
+ def test_rom_path_expands_tilde
+ assert_equal File.join(Dir.home, "game.gba"), play(["~/game.gba"]).parse[:rom]
+ end
+
+ def test_no_rom
+ assert_nil play([]).parse[:rom]
+ end
+
+ # -- flags --
+
+ def test_scale
+ assert_equal 2, play(["--scale", "2"]).parse[:scale]
+ end
+
+ def test_scale_short
+ assert_equal 3, play(["-s", "3"]).parse[:scale]
+ end
+
+ def test_scale_clamps_high
+ assert_equal 4, play(["--scale", "10"]).parse[:scale]
+ end
+
+ def test_scale_clamps_low
+ assert_equal 1, play(["--scale", "0"]).parse[:scale]
+ end
+
+ def test_volume
+ assert_equal 50, play(["--volume", "50"]).parse[:volume]
+ end
+
+ def test_volume_short
+ assert_equal 75, play(["-v", "75"]).parse[:volume]
+ end
+
+ def test_volume_clamps
+ assert_equal 100, play(["--volume", "200"]).parse[:volume]
+ end
+
+ def test_mute
+ assert play(["--mute"]).parse[:mute]
+ end
+
+ def test_mute_short
+ assert play(["-m"]).parse[:mute]
+ end
+
+ def test_no_sound
+ assert_equal false, play(["--no-sound"]).parse[:sound]
+ end
+
+ def test_fullscreen
+ assert play(["--fullscreen"]).parse[:fullscreen]
+ end
+
+ def test_fullscreen_short
+ assert play(["-f"]).parse[:fullscreen]
+ end
+
+ def test_show_fps
+ assert play(["--show-fps"]).parse[:show_fps]
+ end
+
+ def test_turbo_speed
+ assert_equal 3, play(["--turbo-speed", "3"]).parse[:turbo_speed]
+ end
+
+ def test_turbo_speed_clamps
+ assert_equal 4, play(["--turbo-speed", "99"]).parse[:turbo_speed]
+ end
+
+ def test_locale
+ assert_equal "ja", play(["--locale", "ja"]).parse[:locale]
+ end
+
+ def test_help_flag
+ assert play(["--help"]).parse[:help]
+ end
+
+ def test_flags_with_rom
+ opts = play(["-s", "2", "--mute", "pokemon.gba"]).parse
+ assert_equal 2, opts[:scale]
+ assert opts[:mute]
+ assert_equal File.expand_path("pokemon.gba"), opts[:rom]
+ end
+
+ def test_rom_before_flags
+ opts = play(["game.gba", "--scale", "4"]).parse
+ assert_equal File.expand_path("game.gba"), opts[:rom]
+ assert_equal 4, opts[:scale]
+ end
+
+ def test_parser_present
+ assert_kind_of OptionParser, play([]).parse[:parser]
+ end
+
+ def test_help_output_includes_banner
+ assert_includes play([]).parse[:parser].to_s, "Usage: gemba"
+ end
+
+ # -- apply --
+
+ class MockConfig
+ attr_accessor :scale, :volume, :muted, :show_fps, :turbo_speed, :locale
+
+ def initialize
+ @scale = 3
+ @volume = 100
+ @muted = false
+ @show_fps = false
+ @turbo_speed = 0
+ @locale = 'auto'
+ end
+ end
+
+ def test_apply_overrides_config
+ config = MockConfig.new
+ play([]).apply(config, { scale: 2, volume: 50, mute: true, show_fps: true })
+ assert_equal 2, config.scale
+ assert_equal 50, config.volume
+ assert config.muted
+ assert config.show_fps
+ end
+
+ def test_apply_skips_unset_options
+ config = MockConfig.new
+ play([]).apply(config, {})
+ assert_equal 3, config.scale
+ assert_equal 100, config.volume
+ refute config.muted
+ end
+
+ def test_apply_locale
+ config = MockConfig.new
+ play([]).apply(config, { locale: 'ja' })
+ assert_equal 'ja', config.locale
+ end
+
+ def test_apply_turbo_speed
+ config = MockConfig.new
+ play([]).apply(config, { turbo_speed: 3 })
+ assert_equal 3, config.turbo_speed
+ end
+
+ # -- dry_run via CLI.run dispatch --
+
+ def test_dry_run_no_args
+ result = Gemba::CLI.run([], dry_run: true)
+ assert_equal :play, result[:command]
+ assert_nil result[:rom]
+ assert_equal true, result[:sound]
+ end
+
+ def test_dry_run_with_rom
+ result = Gemba::CLI.run(["game.gba"], dry_run: true)
+ assert_equal :play, result[:command]
+ assert_equal File.expand_path("game.gba"), result[:rom]
+ end
+
+ def test_dry_run_explicit_play
+ result = Gemba::CLI.run(["play", "-s", "2", "game.gba"], dry_run: true)
+ assert_equal :play, result[:command]
+ assert_equal File.expand_path("game.gba"), result[:rom]
+ assert_equal 2, result[:options][:scale]
+ end
+
+ def test_dry_run_no_sound
+ result = Gemba::CLI.run(["--no-sound", "game.gba"], dry_run: true)
+ assert_equal :play, result[:command]
+ assert_equal false, result[:sound]
+ end
+
+ def test_dry_run_fullscreen
+ result = Gemba::CLI.run(["-f", "game.gba"], dry_run: true)
+ assert_equal :play, result[:command]
+ assert_equal true, result[:fullscreen]
+ end
+
+ def test_dry_run_help
+ result = Gemba::CLI.run(["play", "--help"], dry_run: true)
+ assert_equal :play, result[:command]
+ assert result[:help]
+ end
+
+ # -- error cases --
+
+ def test_unknown_flag_raises
+ assert_raises(OptionParser::InvalidOption) { play(["--bogus"]).parse }
+ end
+
+ def test_missing_scale_value_raises
+ assert_raises(OptionParser::MissingArgument) { play(["--scale"]).parse }
+ end
+
+ private
+
+ def play(argv)
+ Play.new(argv)
+ end
+end
diff --git a/test/test_cli_ra.rb b/test/test_cli_ra.rb
new file mode 100644
index 0000000..0f44418
--- /dev/null
+++ b/test/test_cli_ra.rb
@@ -0,0 +1,175 @@
+# frozen_string_literal: true
+
+require "minitest/autorun"
+require "tmpdir"
+require "gemba/headless"
+require "gemba/cli/commands/retro_achievements"
+require_relative "support/fake_requester"
+
+# Tests for the `gemba ra` CLI subcommand.
+#
+# All tests use:
+# - FakeRequester so no real HTTP calls are made
+# - A temp Config so real credentials on disk are never read or written
+class TestCLIRa < Minitest::Test
+ RA = Gemba::CLI::Commands::RetroAchievements
+
+ def setup
+ @tmpdir = Dir.mktmpdir("gemba_cli_ra_test")
+ @config = Gemba::Config.new(path: File.join(@tmpdir, "settings.json"))
+ @req = FakeRequester.new
+ end
+
+ def teardown
+ FileUtils.rm_rf(@tmpdir)
+ end
+
+ def run_ra(argv, dry_run: false)
+ RA.new(argv, dry_run: dry_run, config: @config, requester: @req).call
+ end
+
+ # ---------------------------------------------------------------------------
+ # parse / dry_run
+ # ---------------------------------------------------------------------------
+
+ def test_parse_login_returns_subcommand_and_username
+ result = run_ra(["login", "--username", "bob"], dry_run: true)
+ assert_equal :ra_login, result[:command]
+ assert_equal :login, result[:subcommand]
+ assert_equal "bob", result[:username]
+ end
+
+ def test_parse_login_captures_password
+ result = run_ra(["login", "--username", "bob", "--password", "s3cr3t"], dry_run: true)
+ assert_equal "s3cr3t", result[:password]
+ end
+
+ def test_parse_verify_returns_subcommand
+ result = run_ra(["verify"], dry_run: true)
+ assert_equal :ra_verify, result[:command]
+ end
+
+ def test_parse_logout_returns_subcommand
+ result = run_ra(["logout"], dry_run: true)
+ assert_equal :ra_logout, result[:command]
+ end
+
+ def test_parse_achievements_captures_rom_and_json
+ result = run_ra(["achievements", "--rom", "/tmp/game.gba", "--json"], dry_run: true)
+ assert_equal :ra_achievements, result[:command]
+ assert_equal File.expand_path("/tmp/game.gba"), result[:rom]
+ assert result[:json]
+ end
+
+ def test_parse_no_subcommand_returns_help
+ result = run_ra([], dry_run: true)
+ assert_equal :ra, result[:command]
+ assert result[:help]
+ end
+
+ def test_parse_unknown_subcommand_returns_help
+ result = run_ra(["frobnicate"], dry_run: true)
+ assert result[:help]
+ end
+
+ # ---------------------------------------------------------------------------
+ # ra login
+ # ---------------------------------------------------------------------------
+
+ def test_login_success_saves_credentials
+ @req.stub(r: "login2", body: { "Success" => true, "Token" => "tok123" })
+
+ out, = capture_io do
+ run_ra(["login", "--username", "bob", "--password", "pass"])
+ end
+
+ assert_match(/logged in as bob/i, out)
+ assert_equal "bob", @config.ra_username
+ assert_equal "tok123", @config.ra_token
+ assert @config.ra_enabled?
+
+ # Verify persisted to disk
+ reloaded = Gemba::Config.new(path: @config.instance_variable_get(:@path))
+ assert_equal "bob", reloaded.ra_username
+ assert_equal "tok123", reloaded.ra_token
+ end
+
+ def test_login_failure_prints_error_and_exits
+ @req.stub(r: "login2", body: { "Success" => false, "Error" => "Bad password" }, ok: false)
+
+ assert_raises(SystemExit) do
+ capture_io { run_ra(["login", "--username", "bob", "--password", "wrong"]) }
+ end
+
+ assert_empty @config.ra_username, "credentials must not be saved on failure"
+ end
+
+ def test_login_missing_username_exits
+ assert_raises(SystemExit) do
+ capture_io { run_ra(["login", "--password", "pass"]) }
+ end
+ end
+
+ def test_login_posts_to_login2
+ @req.stub(r: "login2", body: { "Success" => true, "Token" => "t" })
+ capture_io { run_ra(["login", "--username", "bob", "--password", "p"]) }
+ assert @req.requested?("login2")
+ assert_equal "bob", @req.requests_for("login2").first[:u]
+ end
+
+ # ---------------------------------------------------------------------------
+ # ra verify
+ # ---------------------------------------------------------------------------
+
+ def test_verify_success_prints_ok
+ @config.ra_username = "bob"
+ @config.ra_token = "tok"
+ @req.stub(r: "login2", body: { "Success" => true })
+
+ out, = capture_io { run_ra(["verify"]) }
+ assert_match(/token valid for bob/i, out)
+ end
+
+ def test_verify_failure_exits
+ @config.ra_username = "bob"
+ @config.ra_token = "bad"
+ @req.stub(r: "login2", body: { "Success" => false, "Error" => "Token invalid" }, ok: false)
+
+ assert_raises(SystemExit) do
+ capture_io { run_ra(["verify"]) }
+ end
+ end
+
+ def test_verify_not_logged_in_exits
+ assert_raises(SystemExit) do
+ capture_io { run_ra(["verify"]) }
+ end
+ end
+
+ # ---------------------------------------------------------------------------
+ # ra logout
+ # ---------------------------------------------------------------------------
+
+ def test_logout_clears_credentials
+ @config.ra_username = "bob"
+ @config.ra_token = "tok"
+ @config.ra_enabled = true
+ @config.save!
+
+ out, = capture_io { run_ra(["logout"]) }
+
+ assert_match(/logged out/i, out)
+ assert_empty @config.ra_username
+ assert_empty @config.ra_token
+ refute @config.ra_enabled?
+
+ reloaded = Gemba::Config.new(path: @config.instance_variable_get(:@path))
+ assert_empty reloaded.ra_username
+ assert_empty reloaded.ra_token
+ end
+
+ def test_logout_makes_no_http_requests
+ capture_io { run_ra(["logout"]) }
+ assert_empty @req.requests
+ end
+end
diff --git a/test/test_cli_record.rb b/test/test_cli_record.rb
new file mode 100644
index 0000000..21db163
--- /dev/null
+++ b/test/test_cli_record.rb
@@ -0,0 +1,69 @@
+# frozen_string_literal: true
+
+require "minitest/autorun"
+require "gemba/headless"
+require "gemba/cli/commands/record"
+
+class TestCLIRecord < Minitest::Test
+ Record = Gemba::CLI::Commands::Record
+ # -- parse --
+
+ def test_frames_and_rom
+ opts = rec(["--frames", "100", "game.gba"]).parse
+ assert_equal 100, opts[:frames]
+ assert_equal File.expand_path("game.gba"), opts[:rom]
+ end
+
+ def test_output
+ opts = rec(["-o", "out.grec", "--frames", "10", "game.gba"]).parse
+ assert_equal "out.grec", opts[:output]
+ end
+
+ def test_compression
+ opts = rec(["-c", "6", "--frames", "10", "game.gba"]).parse
+ assert_equal 6, opts[:compression]
+ end
+
+ def test_compression_clamps
+ opts = rec(["--compression", "99", "--frames", "10", "game.gba"]).parse
+ assert_equal 9, opts[:compression]
+ end
+
+ def test_progress_flag
+ opts = rec(["--progress", "--frames", "10", "game.gba"]).parse
+ assert opts[:progress]
+ end
+
+ def test_help
+ opts = rec(["--help"]).parse
+ assert opts[:help]
+ end
+
+ # -- dry_run via CLI.run dispatch --
+
+ def test_dry_run
+ result = Gemba::CLI.run(["record", "--frames", "100", "game.gba"], dry_run: true)
+ assert_equal :record, result[:command]
+ assert_equal File.expand_path("game.gba"), result[:rom]
+ assert_equal 100, result[:frames]
+ end
+
+ def test_dry_run_with_output
+ result = Gemba::CLI.run(["record", "--frames", "50", "-o", "out.grec", "game.gba"], dry_run: true)
+ assert_equal :record, result[:command]
+ assert_equal "out.grec", result[:output]
+ assert_equal 50, result[:frames]
+ end
+
+ def test_dry_run_help
+ result = Gemba::CLI.run(["record", "--help"], dry_run: true)
+ assert_equal :record, result[:command]
+ assert result[:help]
+ end
+
+ private
+
+ def rec(argv)
+ Record.new(argv)
+ end
+end
diff --git a/test/test_cli_replay.rb b/test/test_cli_replay.rb
new file mode 100644
index 0000000..2792d2d
--- /dev/null
+++ b/test/test_cli_replay.rb
@@ -0,0 +1,72 @@
+# frozen_string_literal: true
+
+require "minitest/autorun"
+require "gemba/headless"
+require "gemba/cli/commands/replay"
+
+class TestCLIReplay < Minitest::Test
+ Replay = Gemba::CLI::Commands::Replay
+ # -- parse --
+
+ def test_gir_file
+ opts = rep(["session.gir"]).parse
+ assert_equal "session.gir", opts[:gir]
+ end
+
+ def test_headless
+ opts = rep(["--headless", "session.gir"]).parse
+ assert opts[:headless]
+ end
+
+ def test_list
+ opts = rep(["--list"]).parse
+ assert opts[:list]
+ end
+
+ def test_fullscreen
+ opts = rep(["-f", "session.gir"]).parse
+ assert opts[:fullscreen]
+ end
+
+ def test_no_sound
+ opts = rep(["--no-sound", "session.gir"]).parse
+ assert_equal false, opts[:sound]
+ end
+
+ def test_help
+ opts = rep(["--help"]).parse
+ assert opts[:help]
+ end
+
+ # -- dry_run via CLI.run dispatch --
+
+ def test_dry_run
+ result = Gemba::CLI.run(["replay", "session.gir"], dry_run: true)
+ assert_equal :replay, result[:command]
+ assert_equal File.expand_path("session.gir"), result[:gir]
+ assert_equal true, result[:sound]
+ end
+
+ def test_dry_run_headless
+ result = Gemba::CLI.run(["replay", "--headless", "session.gir"], dry_run: true)
+ assert_equal :replay_headless, result[:command]
+ assert result[:headless]
+ end
+
+ def test_dry_run_list
+ result = Gemba::CLI.run(["replay", "--list"], dry_run: true)
+ assert_equal :replay_list, result[:command]
+ end
+
+ def test_dry_run_help
+ result = Gemba::CLI.run(["replay", "--help"], dry_run: true)
+ assert_equal :replay, result[:command]
+ assert result[:help]
+ end
+
+ private
+
+ def rep(argv)
+ Replay.new(argv)
+ end
+end
diff --git a/test/test_cli_sync_requester.rb b/test/test_cli_sync_requester.rb
new file mode 100644
index 0000000..b079e85
--- /dev/null
+++ b/test/test_cli_sync_requester.rb
@@ -0,0 +1,152 @@
+# frozen_string_literal: true
+
+require "minitest/autorun"
+require "webmock"
+require "gemba/headless"
+
+RA_URL = "https://retroachievements.org/dorequest.php" unless defined?(RA_URL)
+
+class TestCLISyncRequester < Minitest::Test
+ include WebMock::API
+
+ Requester = Gemba::Achievements::RetroAchievements::CliSyncRequester
+
+ def setup
+ WebMock.enable!
+ @req = Requester.new
+ end
+
+ def teardown
+ WebMock.reset!
+ WebMock.disable!
+ end
+
+ def stub_ra(body:, status: 200)
+ WebMock.stub_request(:post, RA_URL)
+ .to_return(status: status, body: body, headers: { "Content-Type" => "application/json" })
+ end
+
+ # -- Result interface -------------------------------------------------------
+
+ def test_result_on_progress_fires_synchronously
+ result = Requester::Result.new(["data", true])
+ received = nil
+ result.on_progress { |v| received = v }
+ assert_equal ["data", true], received
+ end
+
+ def test_result_on_progress_returns_self_for_chaining
+ r = Requester::Result.new(nil)
+ assert_same r, r.on_progress {}
+ end
+
+ def test_result_on_done_returns_self
+ r = Requester::Result.new(nil)
+ assert_same r, r.on_done {}
+ end
+
+ # -- Successful HTTP call ---------------------------------------------------
+
+ def test_success_returns_parsed_json_and_true
+ stub_ra(body: JSON.generate("Success" => true, "Token" => "abc"))
+
+ received = nil
+ @req.call(nil, { r: "login2", u: "user", p: "pass" })
+ .on_progress { |v| received = v }
+
+ assert_equal true, received[1]
+ assert_equal true, received[0]["Success"]
+ assert_equal "abc", received[0]["Token"]
+ end
+
+ def test_posts_to_correct_url
+ stub_ra(body: JSON.generate("Success" => true))
+
+ @req.call(nil, { r: "gameid", m: "deadbeef" })
+ .on_progress {}
+
+ assert_requested :post, RA_URL
+ end
+
+ def test_sends_params_as_form_data
+ stub_ra(body: JSON.generate("GameID" => 42))
+
+ @req.call(nil, { r: "gameid", m: "abc123" })
+ .on_progress {}
+
+ assert_requested :post, RA_URL, body: "r=gameid&m=abc123"
+ end
+
+ def test_symbol_keys_stringified
+ stub_ra(body: JSON.generate("Success" => true))
+
+ @req.call(nil, { r: "ping", u: "user", t: "tok", g: 42, m: "Playing" })
+ .on_progress {}
+
+ assert_requested :post, RA_URL,
+ body: hash_including("r" => "ping", "u" => "user", "t" => "tok")
+ end
+
+ # -- HTTP error responses ---------------------------------------------------
+
+ def test_http_404_returns_nil_false
+ stub_ra(body: "Not Found", status: 404)
+
+ received = nil
+ @req.call(nil, { r: "gameid", m: "bad" })
+ .on_progress { |v| received = v }
+
+ assert_equal [nil, false], received
+ end
+
+ def test_http_500_returns_nil_false
+ stub_ra(body: "Internal Server Error", status: 500)
+
+ received = nil
+ @req.call(nil, { r: "patch", u: "u", t: "t", g: 1 })
+ .on_progress { |v| received = v }
+
+ assert_equal [nil, false], received
+ end
+
+ # -- Network errors ---------------------------------------------------------
+
+ def test_connection_error_returns_nil_false
+ WebMock.stub_request(:post, RA_URL).to_raise(Errno::ECONNREFUSED)
+
+ received = nil
+ _, stderr = capture_io do
+ @req.call(nil, { r: "login2" }).on_progress { |v| received = v }
+ end
+
+ assert_equal [nil, false], received
+ assert_match(/request error/i, stderr)
+ end
+
+ def test_timeout_returns_nil_false
+ WebMock.stub_request(:post, RA_URL).to_raise(Net::ReadTimeout)
+
+ received = nil
+ capture_io do
+ @req.call(nil, { r: "login2" }).on_progress { |v| received = v }
+ end
+
+ assert_equal [nil, false], received
+ end
+
+ # -- mode: and worker: kwargs are accepted but ignored ----------------------
+
+ def test_accepts_mode_kwarg
+ stub_ra(body: JSON.generate("ok" => true))
+ assert_silent do
+ @req.call(nil, { r: "ping" }, mode: :ractor).on_progress {}
+ end
+ end
+
+ def test_accepts_worker_kwarg
+ stub_ra(body: JSON.generate("ok" => true))
+ assert_silent do
+ @req.call(nil, { r: "ping" }, worker: Object.new).on_progress {}
+ end
+ end
+end
diff --git a/test/test_cli_version.rb b/test/test_cli_version.rb
new file mode 100644
index 0000000..403507c
--- /dev/null
+++ b/test/test_cli_version.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+require "minitest/autorun"
+require "gemba/headless"
+require "gemba/cli/commands/version"
+
+class TestCLIVersion < Minitest::Test
+ Version = Gemba::CLI::Commands::Version
+
+ def test_dry_run_returns_version
+ result = Version.new([], dry_run: true).call
+ assert_equal :version, result[:command]
+ assert_equal Gemba::VERSION, result[:version]
+ end
+
+ def test_prints_version
+ out = capture_io { Version.new([]).call }[0]
+ assert_includes out, "gemba"
+ assert_includes out, Gemba::VERSION
+ end
+
+ def test_dry_run_via_dispatch
+ result = Gemba::CLI.run(["version"], dry_run: true)
+ assert_equal :version, result[:command]
+ assert_equal Gemba::VERSION, result[:version]
+ end
+end
diff --git a/test/test_config.rb b/test/test_config.rb
index 151cccc..80a9200 100644
--- a/test/test_config.rb
+++ b/test/test_config.rb
@@ -746,7 +746,7 @@ def test_reload_with_active_game
def test_per_game_settings_constant_keys
expected = %w[scale pixel_filter integer_scale color_correction frame_blending
- volume muted turbo_speed quick_save_slot save_state_backup]
+ volume muted turbo_speed quick_save_slot save_state_backup ra_rich_presence]
assert_equal expected.sort, Gemba::Config::PER_GAME_SETTINGS.keys.sort
end
diff --git a/test/test_config_ra.rb b/test/test_config_ra.rb
new file mode 100644
index 0000000..bc94abf
--- /dev/null
+++ b/test/test_config_ra.rb
@@ -0,0 +1,69 @@
+# frozen_string_literal: true
+
+require "minitest/autorun"
+require "tmpdir"
+require "gemba/headless"
+
+class TestConfigRA < Minitest::Test
+ def setup
+ @dir = Dir.mktmpdir("gemba-ra-test")
+ @path = File.join(@dir, "settings.json")
+ end
+
+ def teardown
+ FileUtils.rm_rf(@dir)
+ end
+
+ def new_config
+ Gemba::Config.new(path: @path)
+ end
+
+ def test_defaults
+ c = new_config
+ refute c.ra_enabled?
+ assert_equal '', c.ra_username
+ assert_equal '', c.ra_token
+ refute c.ra_hardcore?
+ end
+
+ def test_enabled_setter
+ c = new_config
+ c.ra_enabled = true
+ assert c.ra_enabled?
+ c.ra_enabled = false
+ refute c.ra_enabled?
+ end
+
+ def test_username_setter
+ c = new_config
+ c.ra_username = 'alice'
+ assert_equal 'alice', c.ra_username
+ end
+
+ def test_token_setter
+ c = new_config
+ c.ra_token = 'abc123'
+ assert_equal 'abc123', c.ra_token
+ end
+
+ def test_hardcore_setter
+ c = new_config
+ c.ra_hardcore = true
+ assert c.ra_hardcore?
+ end
+
+ def test_persistence_roundtrip
+ c = new_config
+ c.ra_enabled = true
+ c.ra_username = 'alice'
+ c.ra_token = 'secret'
+ c.ra_hardcore = true
+ c.save!
+
+ c2 = new_config
+ assert c2.ra_enabled?
+ assert_equal 'alice', c2.ra_username
+ assert_equal 'secret', c2.ra_token
+ assert c2.ra_hardcore?
+ end
+end
diff --git a/test/test_credentials_presenter.rb b/test/test_credentials_presenter.rb
new file mode 100644
index 0000000..8c9e737
--- /dev/null
+++ b/test/test_credentials_presenter.rb
@@ -0,0 +1,192 @@
+# frozen_string_literal: true
+
+require "minitest/autorun"
+require "gemba/headless"
+
+class TestCredentialsPresenter < Minitest::Test
+ def setup
+ Gemba.bus = Gemba::EventBus.new
+ @config = Gemba::Config.new(path: nil) # in-memory defaults
+ end
+
+ def presenter(**overrides)
+ cfg = @config
+ cfg.ra_enabled = overrides.fetch(:enabled, false)
+ cfg.ra_username = overrides.fetch(:username, '')
+ cfg.ra_token = overrides.fetch(:token, '')
+ Gemba::Achievements::CredentialsPresenter.new(cfg)
+ end
+
+ # -- Disabled state ----------------------------------------------------------
+
+ def test_disabled_everything_off
+ p = presenter(enabled: false)
+ assert_equal :disabled, p.fields_state
+ assert_equal :disabled, p.login_button_state
+ assert_equal :disabled, p.verify_button_state
+ assert_equal :disabled, p.logout_button_state
+ assert_equal :disabled, p.reset_button_state
+ assert_equal :empty, p.feedback[:key]
+ end
+
+ # -- Enabled, not logged in --------------------------------------------------
+
+ def test_enabled_no_token_fields_editable
+ p = presenter(enabled: true)
+ assert_equal :normal, p.fields_state
+ end
+
+ def test_enabled_no_token_login_disabled_when_fields_empty
+ p = presenter(enabled: true)
+ assert_equal :disabled, p.login_button_state
+ assert_equal :disabled, p.verify_button_state
+ end
+
+ def test_enabled_login_enabled_when_fields_filled
+ p = presenter(enabled: true)
+ p.username = 'alice'
+ p.password = 'secret'
+ assert_equal :normal, p.login_button_state
+ assert_equal :disabled, p.verify_button_state # no token yet — verify stays disabled
+ end
+
+ def test_enabled_login_disabled_with_only_username
+ p = presenter(enabled: true)
+ p.username = 'alice'
+ assert_equal :disabled, p.login_button_state
+ end
+
+ def test_enabled_login_disabled_with_only_password
+ p = presenter(enabled: true)
+ p.password = 'secret'
+ assert_equal :disabled, p.login_button_state
+ end
+
+ def test_enabled_no_token_logout_and_reset_disabled
+ p = presenter(enabled: true)
+ assert_equal :disabled, p.logout_button_state
+ assert_equal :disabled, p.reset_button_state
+ end
+
+ def test_enabled_no_token_feedback_not_logged_in
+ p = presenter(enabled: true)
+ assert_equal :not_logged_in, p.feedback[:key]
+ end
+
+ # -- Enabled, logged in (token present) --------------------------------------
+
+ def test_logged_in_fields_disabled
+ p = presenter(enabled: true, username: 'alice', token: 'tok123')
+ assert_equal :readonly, p.fields_state
+ end
+
+ def test_logged_in_login_disabled
+ p = presenter(enabled: true, username: 'alice', token: 'tok123')
+ assert_equal :disabled, p.login_button_state
+ end
+
+ def test_logged_in_verify_enabled
+ p = presenter(enabled: true, username: 'alice', token: 'tok123')
+ assert_equal :normal, p.verify_button_state
+ end
+
+ def test_logged_in_logout_and_reset_enabled
+ p = presenter(enabled: true, username: 'alice', token: 'tok123')
+ assert_equal :normal, p.logout_button_state
+ assert_equal :normal, p.reset_button_state
+ end
+
+ def test_logged_in_feedback_shows_username
+ p = presenter(enabled: true, username: 'alice', token: 'tok123')
+ fb = p.feedback
+ assert_equal :logged_in_as, fb[:key]
+ assert_equal 'alice', fb[:username]
+ end
+
+ # -- State mutations ----------------------------------------------------------
+
+ def test_enabling_clears_disabled_state
+ p = presenter(enabled: false)
+ assert_equal :disabled, p.fields_state
+ p.enabled = true
+ assert_equal :normal, p.fields_state
+ end
+
+ def test_credentials_changed_emitted_on_mutations
+ p = presenter(enabled: false)
+ fired = 0
+ Gemba.bus.on(:credentials_changed) { fired += 1 }
+ p.enabled = true
+ p.username = 'alice'
+ p.password = 'pw'
+ assert_equal 3, fired
+ end
+
+ # -- Auth result handling (via :ra_auth_result bus events) -------------------
+
+ def auth(status, token: nil, message: nil)
+ Gemba.bus.emit(:ra_auth_result, status: status, token: token, message: message)
+ end
+
+ def test_login_success_stores_token_and_clears_password
+ p = presenter(enabled: true, username: 'alice')
+ p.password = 'pw'
+ auth(:ok, token: 'real_token')
+ assert_equal 'real_token', p.token
+ assert_equal '', p.password
+ assert p.logged_in?
+ end
+
+ def test_login_success_locks_fields
+ p = presenter(enabled: true, username: 'alice')
+ auth(:ok, token: 'tok')
+ assert_equal :readonly, p.fields_state
+ assert_equal :normal, p.logout_button_state
+ assert_equal :normal, p.verify_button_state
+ end
+
+ def test_login_error_sets_feedback
+ p = presenter(enabled: true, username: 'alice')
+ auth(:error, message: 'Bad credentials')
+ assert_equal :error, p.feedback[:key]
+ assert_equal 'Bad credentials', p.feedback[:message]
+ end
+
+ def test_login_error_does_not_affect_button_states
+ p = presenter(enabled: true, username: 'alice')
+ p.password = 'pw'
+ auth(:error, message: 'Bad credentials')
+ # Fields and login button should still be enabled
+ assert_equal :normal, p.fields_state
+ assert_equal :normal, p.login_button_state
+ end
+
+ def test_logout_clears_token_keeps_username
+ p = presenter(enabled: true, username: 'alice', token: 'tok')
+ auth(:logout)
+ assert_equal '', p.token
+ assert_equal 'alice', p.username # kept so user can re-enter password
+ refute p.logged_in?
+ end
+
+ def test_logout_re_enables_fields
+ p = presenter(enabled: true, username: 'alice', token: 'tok')
+ auth(:logout)
+ assert_equal :normal, p.fields_state
+ end
+
+ # -- Transient feedback -------------------------------------------------------
+
+ def test_transient_overrides_normal_feedback
+ p = presenter(enabled: true, username: 'alice', token: 'tok')
+ p.show_transient(:test_ok)
+ assert_equal :test_ok, p.feedback[:key]
+ end
+
+ def test_clear_transient_restores_normal_feedback
+ p = presenter(enabled: true, username: 'alice', token: 'tok')
+ p.show_transient(:test_ok)
+ p.clear_transient
+ assert_equal :logged_in_as, p.feedback[:key]
+ end
+end
diff --git a/test/test_fake_backend_achievements.rb b/test/test_fake_backend_achievements.rb
new file mode 100644
index 0000000..d4fde31
--- /dev/null
+++ b/test/test_fake_backend_achievements.rb
@@ -0,0 +1,130 @@
+# frozen_string_literal: true
+
+require "minitest/autorun"
+require "gemba/headless"
+require "gemba/achievements"
+require_relative "support/fake_core"
+
+class TestFakeBackendAchievements < Minitest::Test
+ ADDR = 0x02000000
+
+ def setup
+ @backend = Gemba::Achievements::FakeBackend.new
+ @backend.add_achievement(id: 'test', title: 'Test', description: 'desc', points: 5) do |mem|
+ mem.call(ADDR) == 0x42
+ end
+ @core = FakeCore.new
+ @unlocked = []
+ @backend.on_unlock { |ach| @unlocked << ach }
+ end
+
+ def test_no_unlock_when_condition_false
+ @core.poke(ADDR, 0x00)
+ @backend.do_frame(@core)
+ assert_empty @unlocked
+ end
+
+ def test_unlock_fires_when_condition_becomes_true
+ @core.poke(ADDR, 0x42)
+ @backend.do_frame(@core)
+ assert_equal 1, @unlocked.size
+ assert_equal 'test', @unlocked.first.id
+ assert_equal 'Test', @unlocked.first.title
+ assert_equal 5, @unlocked.first.points
+ assert @unlocked.first.earned?
+ end
+
+ def test_unlock_fires_only_once_rising_edge
+ @core.poke(ADDR, 0x42)
+ @backend.do_frame(@core)
+ @backend.do_frame(@core)
+ assert_equal 1, @unlocked.size
+ end
+
+ def test_no_second_unlock_after_condition_cycles
+ @core.poke(ADDR, 0x42)
+ @backend.do_frame(@core)
+ @core.poke(ADDR, 0x00)
+ @backend.do_frame(@core)
+ @core.poke(ADDR, 0x42)
+ @backend.do_frame(@core)
+ assert_equal 1, @unlocked.size
+ end
+
+ def test_fires_on_first_true_frame
+ @core.poke(ADDR, 0x42)
+ @backend.do_frame(@core)
+ assert_equal 1, @unlocked.size
+ end
+
+ def test_no_unlock_on_wrong_value
+ @core.poke(ADDR, 0x01)
+ @backend.do_frame(@core)
+ assert_empty @unlocked
+ end
+
+ def test_achievement_list_reflects_earned_state
+ assert_equal 1, @backend.total_count
+ assert_equal 0, @backend.earned_count
+
+ @core.poke(ADDR, 0x42)
+ @backend.do_frame(@core)
+
+ assert_equal 1, @backend.earned_count
+ assert @backend.achievement_list.first.earned?
+ end
+
+ def test_multiple_achievements_independent
+ @backend.add_achievement(id: 'two', title: 'Two', description: '', points: 10) do |mem|
+ mem.call(ADDR + 1) == 0xFF
+ end
+
+ @core.poke(ADDR, 0x42)
+ @backend.do_frame(@core)
+ assert_equal 1, @unlocked.size
+ assert_equal 'test', @unlocked.first.id
+
+ @core.poke(ADDR + 1, 0xFF)
+ @backend.do_frame(@core)
+ assert_equal 2, @unlocked.size
+ assert_equal 'two', @unlocked.last.id
+ end
+
+ def test_reset_earned_allows_re_unlock
+ @core.poke(ADDR, 0x42)
+ @backend.do_frame(@core)
+ assert_equal 1, @backend.earned_count
+
+ @backend.reset_earned
+ assert_equal 0, @backend.earned_count
+
+ @unlocked.clear
+ @core.poke(ADDR, 0x00)
+ @backend.do_frame(@core)
+ @core.poke(ADDR, 0x42)
+ @backend.do_frame(@core)
+ assert_equal 1, @unlocked.size
+ end
+
+ def test_load_game_resets_earned
+ @core.poke(ADDR, 0x42)
+ @backend.do_frame(@core)
+ assert_equal 1, @backend.earned_count
+
+ @backend.load_game(@core)
+ assert_equal 0, @backend.earned_count
+ end
+
+ def test_multiple_unlock_callbacks_all_fire
+ other = []
+ @backend.on_unlock { |ach| other << ach.id }
+ @core.poke(ADDR, 0x42)
+ @backend.do_frame(@core)
+ assert_equal ['test'], @unlocked.map(&:id)
+ assert_equal ['test'], other
+ end
+
+ def test_enabled
+ assert @backend.enabled?
+ end
+end
diff --git a/test/test_fake_backend_auth.rb b/test/test_fake_backend_auth.rb
new file mode 100644
index 0000000..494d88b
--- /dev/null
+++ b/test/test_fake_backend_auth.rb
@@ -0,0 +1,68 @@
+# frozen_string_literal: true
+
+require "minitest/autorun"
+require "gemba/headless"
+require "gemba/achievements"
+
+class TestFakeBackendAuth < Minitest::Test
+ def test_any_nonempty_creds_succeed_by_default
+ b = Gemba::Achievements::FakeBackend.new
+ statuses = []
+ b.on_auth_change { |status, _| statuses << status }
+ b.login_with_token(username: 'alice', token: 'anything')
+ assert b.authenticated?
+ assert_equal [:ok], statuses
+ end
+
+ def test_empty_username_fails
+ b = Gemba::Achievements::FakeBackend.new
+ b.login_with_token(username: '', token: 'tok')
+ refute b.authenticated?
+ end
+
+ def test_empty_token_fails
+ b = Gemba::Achievements::FakeBackend.new
+ b.login_with_token(username: 'alice', token: '')
+ refute b.authenticated?
+ end
+
+ def test_restricted_correct_pair_succeeds
+ b = Gemba::Achievements::FakeBackend.new(valid_username: 'alice', valid_token: 'secret')
+ b.login_with_token(username: 'alice', token: 'secret')
+ assert b.authenticated?
+ end
+
+ def test_restricted_wrong_user_fails
+ b = Gemba::Achievements::FakeBackend.new(valid_username: 'alice', valid_token: 'secret')
+ statuses = []
+ errors = []
+ b.on_auth_change { |s, e| statuses << s; errors << e }
+ b.login_with_token(username: 'bob', token: 'secret')
+ refute b.authenticated?
+ assert_equal [:error], statuses
+ refute_nil errors.first
+ end
+
+ def test_restricted_wrong_token_fails
+ b = Gemba::Achievements::FakeBackend.new(valid_username: 'alice', valid_token: 'secret')
+ b.login_with_token(username: 'alice', token: 'wrong')
+ refute b.authenticated?
+ end
+
+ def test_logout_clears_auth
+ b = Gemba::Achievements::FakeBackend.new
+ b.login_with_token(username: 'alice', token: 'tok')
+ assert b.authenticated?
+ b.logout
+ refute b.authenticated?
+ end
+
+ def test_multiple_auth_callbacks_all_fired
+ b = Gemba::Achievements::FakeBackend.new
+ results = []
+ b.on_auth_change { |s, _| results << "cb1:#{s}" }
+ b.on_auth_change { |s, _| results << "cb2:#{s}" }
+ b.login_with_token(username: 'u', token: 't')
+ assert_equal ['cb1:ok', 'cb2:ok'], results
+ end
+end
diff --git a/test/test_game_index.rb b/test/test_game_index.rb
index e9a8ab0..1012533 100644
--- a/test/test_game_index.rb
+++ b/test/test_game_index.rb
@@ -8,6 +8,8 @@ def setup
Gemba::GameIndex.reset!
end
+ # -- lookup (by game code) -----------------------------------------------
+
def test_lookup_known_gba_game
name = Gemba::GameIndex.lookup("AGB-AXVE")
assert_includes name, "Pokemon"
@@ -26,20 +28,49 @@ def test_lookup_returns_nil_for_empty_string
assert_nil Gemba::GameIndex.lookup("")
end
- def test_lookup_returns_nil_for_unknown_platform
+ def test_lookup_returns_nil_for_unknown_platform_prefix
assert_nil Gemba::GameIndex.lookup("XYZ-AAAA")
end
- def test_lookup_gb_game
- # GB has very few entries but Pokemon Red should be there
- name = Gemba::GameIndex.lookup("DMG-APAU")
- assert_includes name, "Pokemon" if name
+ def test_lookup_known_gbc_game
+ # Pokemon Gold is a well-known GBC title
+ name = Gemba::GameIndex.lookup("CGB-BYEE")
+ assert_includes name, "Pokemon" if name # only assert content if present
+ # At minimum it must not raise
+ end
+
+ # -- lookup_by_md5 -------------------------------------------------------
+
+ def test_lookup_by_md5_returns_nil_for_nil_md5
+ assert_nil Gemba::GameIndex.lookup_by_md5(nil, "gba")
end
- def test_reset_clears_cache
+ def test_lookup_by_md5_returns_nil_for_empty_md5
+ assert_nil Gemba::GameIndex.lookup_by_md5("", "gba")
+ end
+
+ def test_lookup_by_md5_returns_nil_for_unknown_platform
+ assert_nil Gemba::GameIndex.lookup_by_md5("abc123", "snes")
+ end
+
+ def test_lookup_by_md5_returns_nil_for_unknown_digest
+ assert_nil Gemba::GameIndex.lookup_by_md5("0" * 32, "gba")
+ end
+
+ def test_lookup_by_md5_is_case_insensitive
+ # Use a real digest present in gba_md5.json so both lookups must return a non-nil title
+ md5 = "0007d212d9b76a466c7ca003d50c8c74"
+ lower = Gemba::GameIndex.lookup_by_md5(md5.downcase, "gba")
+ upper = Gemba::GameIndex.lookup_by_md5(md5.upcase, "gba")
+ refute_nil lower, "lowercase MD5 lookup must return a title"
+ assert_equal lower, upper
+ end
+
+ # -- reset! / caching ----------------------------------------------------
+
+ def test_reset_clears_cache_and_reloads
Gemba::GameIndex.lookup("AGB-AXVE")
Gemba::GameIndex.reset!
- # Should still work after reset (reloads lazily)
name = Gemba::GameIndex.lookup("AGB-AXVE")
assert_includes name, "Pokemon"
end
diff --git a/test/test_game_picker_frame.rb b/test/test_game_picker_frame.rb
index 27e06a9..7a3fea4 100644
--- a/test/test_game_picker_frame.rb
+++ b/test/test_game_picker_frame.rb
@@ -47,7 +47,7 @@ def test_populated_card_shows_title_and_platform
picker = Gemba::GamePickerFrame.new(app: app, rom_library: lib)
picker.show
- assert_equal 'Pokemon Ruby', app.command('.game_picker.card0.title', :cget, '-text')
+ assert_equal 'Pokemon - Ruby Version (USA, Europe)', app.command('.game_picker.card0.title', :cget, '-text')
assert_equal 'GBA', app.command('.game_picker.card0.plat', :cget, '-text')
picker.cleanup
diff --git a/test/test_help_window.rb b/test/test_help_window.rb
index b3cf2e6..b96e5e8 100644
--- a/test/test_help_window.rb
+++ b/test/test_help_window.rb
@@ -18,6 +18,7 @@ def test_visible_after_show
win = Gemba::HelpWindow.new(app: app, hotkeys: hotkeys)
app.show
win.show
+ app.update # flush pending Tk map events before checking visibility
assert win.visible?, "help window should be visible after show"
diff --git a/test/test_null_backend.rb b/test/test_null_backend.rb
new file mode 100644
index 0000000..2a7be67
--- /dev/null
+++ b/test/test_null_backend.rb
@@ -0,0 +1,42 @@
+# frozen_string_literal: true
+
+require "minitest/autorun"
+require "gemba/headless"
+require "gemba/achievements"
+require_relative "support/fake_core"
+
+class TestNullBackend < Minitest::Test
+ def setup
+ @b = Gemba::Achievements::NullBackend.new
+ end
+
+ def test_not_enabled
+ refute @b.enabled?
+ end
+
+ def test_not_authenticated
+ refute @b.authenticated?
+ end
+
+ def test_achievement_list_empty
+ assert_equal [], @b.achievement_list
+ end
+
+ def test_counts_zero
+ assert_equal 0, @b.earned_count
+ assert_equal 0, @b.total_count
+ end
+
+ def test_do_frame_is_noop
+ assert_nil @b.do_frame(FakeCore.new)
+ end
+
+ def test_login_noop
+ assert_nil @b.login_with_token(username: 'u', token: 't')
+ refute @b.authenticated?
+ end
+
+ def test_logout_noop
+ assert_nil @b.logout
+ end
+end
diff --git a/test/test_offline_backend.rb b/test/test_offline_backend.rb
new file mode 100644
index 0000000..adbb957
--- /dev/null
+++ b/test/test_offline_backend.rb
@@ -0,0 +1,116 @@
+# frozen_string_literal: true
+
+require "minitest/autorun"
+require "gemba/headless"
+
+class TestOfflineBackend < Minitest::Test
+ ROM = "test/fixtures/test.gba"
+
+ def setup
+ skip "test.gba fixture not found" unless File.exist?(ROM)
+ @unlocked = []
+ @backend = Gemba::Achievements::OfflineBackend.new
+ @backend.on_unlock { |ach| @unlocked << ach }
+ end
+
+ def test_always_authenticated
+ assert @backend.authenticated?
+ end
+
+ def test_enabled
+ assert @backend.enabled?
+ end
+
+ def test_login_and_logout_are_noops
+ @backend.login_with_password(username: "anyone", password: "anything")
+ assert @backend.authenticated?
+ @backend.logout
+ assert @backend.authenticated?
+ end
+
+ def test_on_load_achievement_fires_during_load_game
+ Gemba::HeadlessPlayer.open(ROM) do |player|
+ @backend.load_game(player.core)
+ assert_equal 1, @unlocked.size
+ assert_equal "gembatest_loaded", @unlocked.first.id
+ assert_equal "Ready to Play", @unlocked.first.title
+ assert @unlocked.first.earned?
+ end
+ end
+
+ def test_achievement_list_shows_earned_after_load
+ Gemba::HeadlessPlayer.open(ROM) do |player|
+ @backend.load_game(player.core)
+ list = @backend.achievement_list
+ assert_equal 1, list.size
+ assert list.first.earned?
+ end
+ end
+
+ def test_counts
+ Gemba::HeadlessPlayer.open(ROM) do |player|
+ assert_equal 0, @backend.total_count
+ @backend.load_game(player.core)
+ assert_equal 1, @backend.total_count
+ assert_equal 1, @backend.earned_count
+ end
+ end
+
+ def test_unload_game_clears_state
+ Gemba::HeadlessPlayer.open(ROM) do |player|
+ @backend.load_game(player.core)
+ assert_equal 1, @backend.earned_count
+ @backend.unload_game
+ assert_equal 0, @backend.total_count
+ assert_equal 0, @backend.earned_count
+ end
+ end
+
+ def test_unknown_rom_has_no_achievements
+ Gemba::HeadlessPlayer.open(ROM) do |player|
+ custom = Gemba::Achievements::OfflineBackend.new(db: {})
+ custom.load_game(player.core)
+ assert_equal 0, custom.total_count
+ assert_empty @unlocked
+ end
+ end
+
+ def test_store_adds_definitions
+ Gemba::HeadlessPlayer.open(ROM) do |player|
+ custom = Gemba::Achievements::OfflineBackend.new(db: {})
+ custom.on_unlock { |a| @unlocked << a }
+ custom.store(player.core.checksum, [
+ { id: "extra", title: "Extra", description: "desc",
+ points: 5, trigger: :on_load }
+ ])
+ custom.load_game(player.core)
+ assert_equal 1, @unlocked.size
+ assert_equal "extra", @unlocked.first.id
+ end
+ end
+
+ def test_memory_achievement_fires_on_rising_edge
+ addr = 0x02000000
+ Gemba::HeadlessPlayer.open(ROM) do |player|
+ backend = Gemba::Achievements::OfflineBackend.new(db: {
+ player.core.checksum => [
+ { id: "mem_test", title: "Mem", description: "d", points: 2,
+ trigger: :memory,
+ condition: ->(mem) { mem.call(addr) == 0x01 } }
+ ]
+ })
+ backend.on_unlock { |a| @unlocked << a }
+ backend.load_game(player.core)
+
+ # EWRAM starts zeroed — condition false
+ player.step(1)
+ backend.do_frame(player.core)
+ assert_empty @unlocked
+
+ # Write 0x01 to EWRAM — but we can't poke real memory from Ruby,
+ # so verify do_frame doesn't crash and condition stays unevaluated
+ backend.do_frame(player.core)
+ assert_empty @unlocked
+ end
+ end
+end
diff --git a/test/test_ra_backend.rb b/test/test_ra_backend.rb
new file mode 100644
index 0000000..d62c6dc
--- /dev/null
+++ b/test/test_ra_backend.rb
@@ -0,0 +1,313 @@
+# frozen_string_literal: true
+
+require "minitest/autorun"
+require "gemba/headless"
+require_relative "support/fake_ra_runtime"
+require_relative "support/fake_requester"
+require_relative "support/fake_core"
+
+PATCH_RESPONSE = {
+ "PatchData" => {
+ "RichPresencePatch" => "",
+ "Achievements" => [
+ { "ID" => 101, "Title" => "First Blood", "Description" => "Get a kill",
+ "Points" => 5, "MemAddr" => "0=1", "Flags" => 3 },
+ { "ID" => 102, "Title" => "Survivor", "Description" => "Survive 60s",
+ "Points" => 10, "MemAddr" => "1=1", "Flags" => 3 },
+ ],
+ },
+}.freeze
+
+# Tests for Gemba::Achievements::RetroAchievements::Backend.
+#
+# FakeRequester replaces BackgroundWork so all HTTP callbacks fire synchronously
+# in-process — no Tk event loop, no subprocesses, no wait_until.
+class TestRABackend < Minitest::Test
+ Backend = Gemba::Achievements::RetroAchievements::Backend
+
+ def setup
+ @rt = FakeRARuntime.new
+ @req = FakeRequester.new
+ @b = Backend.new(app: nil, runtime: @rt, requester: @req)
+ end
+
+ # Authenticate @b via the real login_with_token path.
+ def login(username: "user", token: "tok")
+ @req.stub(r: "login2", body: { "Success" => true })
+ @b.login_with_token(username: username, token: token)
+ end
+
+ # Drive the full gameid→patch→unlocks chain.
+ def load_game(earned_ids: [], patch: PATCH_RESPONSE)
+ @req.stub(r: "gameid", body: { "GameID" => 42 })
+ @req.stub(r: "patch", body: patch)
+ @req.stub(r: "unlocks", body: { "Success" => true, "UserUnlocks" => earned_ids })
+ Dir.mktmpdir do |dir|
+ rom = File.join(dir, "test.gba")
+ File.write(rom, "FAKEGBAROM")
+ @b.load_game(nil, rom, "deadbeef" * 4)
+ end
+ end
+
+ # ---------------------------------------------------------------------------
+ # Initial state
+ # ---------------------------------------------------------------------------
+
+ def test_not_authenticated_by_default
+ refute @b.authenticated?
+ end
+
+ def test_enabled
+ assert @b.enabled?
+ end
+
+ def test_achievement_list_empty_before_game_load
+ assert_empty @b.achievement_list
+ end
+
+ def test_rich_presence_message_nil_initially
+ assert_nil @b.rich_presence_message
+ end
+
+ # ---------------------------------------------------------------------------
+ # Authentication
+ # ---------------------------------------------------------------------------
+
+ def test_login_with_password_success
+ @req.stub(r: "login2", body: { "Success" => true, "Token" => "tok123" })
+ result = nil
+ @b.on_auth_change { |status, payload| result = [status, payload] }
+ @b.login_with_password(username: "user", password: "hunter2")
+
+ assert_equal :ok, result[0]
+ assert_equal "tok123", result[1]
+ assert @b.authenticated?
+ end
+
+ def test_login_with_password_failure
+ @req.stub(r: "login2", body: { "Success" => false, "Error" => "Invalid credentials" })
+ result = nil
+ @b.on_auth_change { |status, msg| result = [status, msg] }
+ @b.login_with_password(username: "user", password: "wrong")
+
+ assert_equal :error, result[0]
+ assert_match(/invalid credentials/i, result[1])
+ refute @b.authenticated?
+ end
+
+ def test_login_with_token_success
+ result = nil
+ @b.on_auth_change { |status, _| result = status }
+ login
+ assert_equal :ok, result
+ assert @b.authenticated?
+ end
+
+ def test_login_with_token_failure
+ @req.stub(r: "login2", body: { "Success" => false, "Error" => "Token invalid" })
+ result = nil
+ @b.on_auth_change { |status, msg| result = [status, msg] }
+ @b.login_with_token(username: "user", token: "bad")
+
+ assert_equal :error, result[0]
+ refute @b.authenticated?
+ end
+
+ def test_token_test_success
+ login
+ result = nil
+ @b.on_auth_change { |status, _| result = status }
+ @b.token_test
+ assert_equal :ok, result
+ end
+
+ def test_token_test_failure
+ login
+ @req.stub(r: "login2", body: { "Success" => false, "Error" => "Token invalid" })
+ result = nil
+ @b.on_auth_change { |status, _| result = status }
+ @b.token_test
+ assert_equal :error, result
+ refute @b.authenticated?
+ end
+
+ def test_logout_clears_auth_state
+ login
+ @b.logout
+ refute @b.authenticated?
+ assert_empty @b.achievement_list
+ end
+
+ # ---------------------------------------------------------------------------
+ # Game load chain
+ # ---------------------------------------------------------------------------
+
+ def test_load_game_skipped_when_not_authenticated
+ load_game
+ assert_empty @b.achievement_list
+ refute @req.requested?("gameid"), "should not hit network when unauthenticated"
+ end
+
+ def test_load_game_populates_achievement_list
+ login
+ load_game
+
+ assert_equal 2, @b.total_count
+ assert_equal "101", @b.achievement_list[0].id
+ assert_equal "102", @b.achievement_list[1].id
+ assert_equal 2, @rt.count
+ end
+
+ def test_load_game_marks_preearned_achievements
+ login
+ load_game(earned_ids: [101])
+
+ list = @b.achievement_list
+ assert list.find { |a| a.id == "101" }&.earned?, "101 should be earned"
+ refute list.find { |a| a.id == "102" }&.earned?, "102 should not be earned"
+ assert_includes @rt.deactivated, "101"
+ end
+
+ def test_load_game_aborts_when_game_id_zero
+ login
+ @req.stub(r: "gameid", body: { "GameID" => 0 })
+ Dir.mktmpdir do |dir|
+ rom = File.join(dir, "test.gba")
+ File.write(rom, "FAKE")
+ @b.load_game(nil, rom, "deadbeef" * 4)
+ end
+
+ assert_empty @b.achievement_list
+ refute @req.requested?("patch"), "patch must not be requested when GameID is 0"
+ end
+
+ def test_load_game_activates_rich_presence_script
+ rp_patch = PATCH_RESPONSE.merge(
+ "PatchData" => PATCH_RESPONSE["PatchData"].merge("RichPresencePatch" => "Display: Hello")
+ )
+ login
+ load_game(patch: rp_patch)
+
+ assert_equal "Display: Hello", @rt.rp_script
+ end
+
+ def test_unload_game_clears_achievement_list
+ login
+ load_game
+ @b.unload_game
+ assert_empty @b.achievement_list
+ end
+
+ def test_sync_unlocks_repopulates_list
+ login
+ load_game
+
+ # Re-stub for the sync re-fetch
+ @req.stub(r: "patch", body: PATCH_RESPONSE)
+ @req.stub(r: "unlocks", body: { "Success" => true, "UserUnlocks" => [102] })
+ @b.sync_unlocks
+
+ list = @b.achievement_list
+ refute list.find { |a| a.id == "101" }&.earned?
+ assert list.find { |a| a.id == "102" }&.earned?
+ end
+
+ # ---------------------------------------------------------------------------
+ # do_frame
+ # ---------------------------------------------------------------------------
+
+ def test_do_frame_silent_before_game_loaded
+ unlocked = []
+ @b.on_unlock { |a| unlocked << a }
+ @b.do_frame(FakeCore.new)
+ assert_empty unlocked
+ end
+
+ def test_do_frame_fires_unlock_and_submits_to_server
+ login
+ load_game
+
+ @req.stub(r: "awardachievement", body: { "Success" => true })
+ @rt.queue_triggers("101")
+
+ unlocked = []
+ @b.on_unlock { |a| unlocked << a }
+ @b.do_frame(FakeCore.new)
+
+ assert_equal 1, unlocked.size
+ assert_equal "101", unlocked.first.id
+ assert @req.requested?("awardachievement")
+ assert_equal "101", @req.requests_for("awardachievement").first[:a].to_s
+ end
+
+ def test_do_frame_skips_already_earned_achievement
+ login
+ load_game(earned_ids: [101])
+
+ @rt.queue_triggers("101")
+ unlocked = []
+ @b.on_unlock { |a| unlocked << a }
+ @b.do_frame(FakeCore.new)
+
+ assert_empty unlocked, "already-earned achievement must not fire again"
+ refute @req.requested?("awardachievement")
+ end
+
+ def test_do_frame_rich_presence_fires_callback_when_enabled
+ login
+ load_game
+
+ @rt.rp_message = "Playing Stage 1"
+ @b.rich_presence_enabled = true
+ @b.instance_variable_set(:@rp_eval_frame, 239)
+
+ fired = []
+ @b.on_rich_presence_changed { |m| fired << m }
+ @b.do_frame(FakeCore.new)
+
+ assert_equal ["Playing Stage 1"], fired
+ assert_equal "Playing Stage 1", @b.rich_presence_message
+ end
+
+ def test_do_frame_rich_presence_silent_when_disabled
+ login
+ load_game
+
+ @rt.rp_message = "Playing Stage 1"
+ @b.rich_presence_enabled = false
+ @b.instance_variable_set(:@rp_eval_frame, 239)
+
+ fired = []
+ @b.on_rich_presence_changed { |m| fired << m }
+ @b.do_frame(FakeCore.new)
+
+ assert_empty fired
+ end
+
+ # ---------------------------------------------------------------------------
+ # FakeRARuntime self-tests
+ # ---------------------------------------------------------------------------
+
+ def test_fake_runtime_activate_deactivate
+ @rt.activate("101", "0=1")
+ @rt.activate("102", "1=1")
+ assert_equal 2, @rt.count
+ @rt.deactivate("101")
+ assert_equal 1, @rt.count
+ refute @rt.activated.key?("101")
+ end
+
+ def test_fake_runtime_clear_resets_state
+ @rt.activate("101", "0=1")
+ @rt.queue_triggers("101")
+ @rt.clear
+ assert_equal 0, @rt.count
+ assert_empty @rt.do_frame(nil)
+ end
+
+ def test_fake_runtime_queue_consumed_once
+ @rt.queue_triggers("101")
+ assert_equal ["101"], @rt.do_frame(nil)
+ assert_empty @rt.do_frame(nil)
+ end
+end
diff --git a/test/test_ra_backend_unlock_gate.rb b/test/test_ra_backend_unlock_gate.rb
new file mode 100644
index 0000000..59616e8
--- /dev/null
+++ b/test/test_ra_backend_unlock_gate.rb
@@ -0,0 +1,56 @@
+# frozen_string_literal: true
+
+require "minitest/autorun"
+require "gemba/headless"
+require "gemba/achievements"
+require_relative "support/fake_core"
+
+# Tests that RetroAchievements::Backend never awards achievements before the
+# server's earned list is known.
+#
+# The bug scenario:
+# fetch_patch_data completes → runtime activated with 89 achievements
+# emulator starts → do_frame fires → some conditions true at frame 0
+# @earned is empty (r=unlocks still in flight) → all are re-awarded
+#
+# The fix: @achievements stays empty until fetch_unlocks completes.
+# do_frame's `return if @achievements.empty?` guards the window by construction.
+#
+# These tests verify the fix through the public API (no instance_variable_set):
+# if @achievements is empty, do_frame must be silent regardless of what the
+# underlying runtime would report.
+class TestRABackendUnlockGate < Minitest::Test
+ def setup
+ @backend = Gemba::Achievements::RetroAchievements::Backend.new(app: nil)
+ @unlocked = []
+ @backend.on_unlock { |ach| @unlocked << ach }
+ @core = FakeCore.new
+ end
+
+ # Before any game is loaded, @achievements is empty → do_frame is a no-op.
+ def test_do_frame_silent_before_game_loaded
+ @backend.do_frame(@core)
+ assert_empty @unlocked
+ end
+
+ # @achievements only becomes non-empty after fetch_unlocks completes (HTTP).
+ # Since we can't make real HTTP calls, verify the state via achievement_list
+ # and total_count — they reflect @achievements.
+ def test_achievements_empty_until_unlocks_arrive
+ assert_equal 0, @backend.total_count,
+ "achievement list must be empty before fetch_unlocks completes"
+ assert_empty @backend.achievement_list
+ end
+
+ # do_frame with an empty achievement list never fires unlock callbacks.
+ # This is the structural guarantee — as long as @achievements is empty,
+ # no award can happen even if the C runtime were somehow active.
+ def test_do_frame_never_fires_when_achievement_list_empty
+ # Simulate being "mid-load": patch data fetched but unlocks not yet back.
+ # In the new design @achievements stays [] during this window.
+ 5.times { @backend.do_frame(@core) }
+ assert_empty @unlocked,
+ "no unlock must fire during the patch→unlocks window"
+ assert_equal 0, @backend.earned_count
+ end
+end
diff --git a/test/test_rom_info.rb b/test/test_rom_info.rb
index 3d5efc0..507805c 100644
--- a/test/test_rom_info.rb
+++ b/test/test_rom_info.rb
@@ -4,13 +4,14 @@
require "tmpdir"
require "fileutils"
require "gemba/headless"
-require "gemba/headless"
-require "gemba/headless"
-require "gemba/headless"
-require "gemba/headless"
-require "gemba/headless"
class TestRomInfo < Minitest::Test
+ # Stub that returns nil for every lookup — isolates RomInfo from real DAT data.
+ NULL_INDEX = Struct.new(:_) {
+ def lookup(_) = nil
+ def lookup_by_md5(*) = nil
+ }.new(nil)
+
ROM = {
'rom_id' => 'AGB_AXVE-DEADBEEF',
'title' => 'Pokemon Ruby',
@@ -20,7 +21,7 @@ class TestRomInfo < Minitest::Test
}.freeze
def test_from_rom_sets_basic_fields
- info = Gemba::RomInfo.from_rom(ROM)
+ info = Gemba::RomInfo.from_rom(ROM, game_index: NULL_INDEX)
assert_equal 'AGB_AXVE-DEADBEEF', info.rom_id
assert_equal 'Pokemon Ruby', info.title
assert_equal 'GBA', info.platform
@@ -29,38 +30,49 @@ def test_from_rom_sets_basic_fields
end
def test_platform_is_uppercased
- info = Gemba::RomInfo.from_rom(ROM.merge('platform' => 'gbc'))
+ info = Gemba::RomInfo.from_rom(ROM.merge('platform' => 'gbc'), game_index: NULL_INDEX)
assert_equal 'GBC', info.platform
end
def test_title_falls_back_to_rom_id
rom = ROM.merge('title' => nil)
- info = Gemba::RomInfo.from_rom(rom)
+ info = Gemba::RomInfo.from_rom(rom, game_index: NULL_INDEX)
assert_equal 'AGB_AXVE-DEADBEEF', info.title
end
+ def test_title_from_game_index_wins_over_stored_title
+ index = Struct.new(:_) {
+ def lookup(_) = 'Index Title'
+ def lookup_by_md5(*) = nil
+ }.new(nil)
+ info = Gemba::RomInfo.from_rom(ROM, game_index: index)
+ assert_equal 'Index Title', info.title
+ end
+
def test_no_fetcher_or_overrides_yields_nil_boxart_fields
- info = Gemba::RomInfo.from_rom(ROM)
+ info = Gemba::RomInfo.from_rom(ROM, game_index: NULL_INDEX)
assert_nil info.cached_boxart_path
assert_nil info.custom_boxart_path
assert_nil info.boxart_path
end
- def test_has_official_entry_true_for_known_game_code
- # AGB-AXVE is Pokemon Ruby — present in gba_games.json
- info = Gemba::RomInfo.from_rom(ROM)
- assert info.has_official_entry, "Known game_code should have official entry"
+ def test_has_official_entry_true_when_index_returns_title
+ index = Struct.new(:_) {
+ def lookup(_) = 'Some Game'
+ def lookup_by_md5(*) = nil
+ }.new(nil)
+ info = Gemba::RomInfo.from_rom(ROM, game_index: index)
+ assert info.has_official_entry
end
- def test_has_official_entry_false_for_unknown_game_code
- rom = ROM.merge('game_code' => 'AGB-ZZZZ')
- info = Gemba::RomInfo.from_rom(rom)
+ def test_has_official_entry_false_when_index_returns_nil
+ info = Gemba::RomInfo.from_rom(ROM, game_index: NULL_INDEX)
refute info.has_official_entry
end
def test_has_official_entry_false_when_no_game_code
rom = ROM.merge('game_code' => nil)
- info = Gemba::RomInfo.from_rom(rom)
+ info = Gemba::RomInfo.from_rom(rom, game_index: NULL_INDEX)
refute info.has_official_entry
end
@@ -72,7 +84,7 @@ def test_boxart_path_returns_custom_when_file_exists
overrides = Gemba::RomOverrides.new(File.join(dir, "overrides.json"))
overrides.set_custom_boxart('AGB_AXVE-DEADBEEF', custom)
- info = Gemba::RomInfo.from_rom(ROM, overrides: overrides)
+ info = Gemba::RomInfo.from_rom(ROM, overrides: overrides, game_index: NULL_INDEX)
assert_equal File.join(dir, 'boxart', 'AGB_AXVE-DEADBEEF', 'custom.png'), info.boxart_path
ensure
ENV.delete('GEMBA_CONFIG_DIR')
@@ -87,12 +99,11 @@ def test_boxart_path_falls_back_to_cache_when_no_custom
backend: Gemba::BoxartFetcher::NullBackend.new)
overrides = Gemba::RomOverrides.new(File.join(dir, "overrides.json"))
- # Pre-populate the cache
cached = fetcher.cached_path('AGB-AXVE')
FileUtils.mkdir_p(File.dirname(cached))
File.write(cached, "fake")
- info = Gemba::RomInfo.from_rom(ROM, fetcher: fetcher, overrides: overrides)
+ info = Gemba::RomInfo.from_rom(ROM, fetcher: fetcher, overrides: overrides, game_index: NULL_INDEX)
assert_equal cached, info.boxart_path
ensure
ENV.delete('GEMBA_CONFIG_DIR')
@@ -106,7 +117,7 @@ def test_boxart_path_nil_when_neither_present
backend: Gemba::BoxartFetcher::NullBackend.new)
overrides = Gemba::RomOverrides.new(File.join(dir, "overrides.json"))
- info = Gemba::RomInfo.from_rom(ROM, fetcher: fetcher, overrides: overrides)
+ info = Gemba::RomInfo.from_rom(ROM, fetcher: fetcher, overrides: overrides, game_index: NULL_INDEX)
assert_nil info.boxart_path
ensure
ENV.delete('GEMBA_CONFIG_DIR')
@@ -121,7 +132,6 @@ def test_custom_beats_cache_in_boxart_path
backend: Gemba::BoxartFetcher::NullBackend.new)
overrides = Gemba::RomOverrides.new(File.join(dir, "overrides.json"))
- # Pre-populate both cache and custom
cached = fetcher.cached_path('AGB-AXVE')
FileUtils.mkdir_p(File.dirname(cached))
File.write(cached, "cached")
@@ -130,7 +140,7 @@ def test_custom_beats_cache_in_boxart_path
File.write(src, "custom")
overrides.set_custom_boxart('AGB_AXVE-DEADBEEF', src)
- info = Gemba::RomInfo.from_rom(ROM, fetcher: fetcher, overrides: overrides)
+ info = Gemba::RomInfo.from_rom(ROM, fetcher: fetcher, overrides: overrides, game_index: NULL_INDEX)
assert_match %r{custom\.png$}, info.boxart_path, "Custom should beat cached"
ensure
ENV.delete('GEMBA_CONFIG_DIR')
diff --git a/test/test_virtual_events.rb b/test/test_virtual_events.rb
new file mode 100644
index 0000000..91c3505
--- /dev/null
+++ b/test/test_virtual_events.rb
@@ -0,0 +1,156 @@
+# frozen_string_literal: true
+
+require "minitest/autorun"
+require_relative "shared/tk_test_helper"
+require "gemba"
+
+# Tests for the virtual event layer.
+#
+# Physical key → virtual event translation is one line per action; the
+# interesting thing to test is that the virtual event bindings on '.'
+# actually fire when triggered directly (no focus needed).
+#
+# assert_virtual_event_fires runs a subprocess that:
+# 1. Appends {+lappend ::virt_fired EventName} to the binding on '.'
+# 2. Generates the virtual event from an after(50) callback
+# 3. In an after(0) reads ::virt_fired and prints EVENTNAME_FIRED
+# 4. Quits via <> (or player.running = false for no-ROM cases)
+#
+# <> is special — its original binding stops the mainloop before
+# after(0) can run, so it prints synchronously inside the appended binding.
+class TestVirtualEvents < Minitest::Test
+ include TeekTestHelper
+
+ TEST_ROM = File.expand_path("fixtures/test.gba", __dir__)
+
+ # ── Key → action mapping (pure unit tests, no subprocess) ─────────────────
+
+ def test_default_quit_key_maps_to_quit_action
+ assert_equal :quit, Gemba::HotkeyMap.new(Gemba::Config.new).action_for('q')
+ end
+
+ def test_default_quick_save_key_maps_to_quick_save_action
+ assert_equal :quick_save, Gemba::HotkeyMap.new(Gemba::Config.new).action_for('F5')
+ end
+
+ def test_default_quick_load_key_maps_to_quick_load_action
+ assert_equal :quick_load, Gemba::HotkeyMap.new(Gemba::Config.new).action_for('F8')
+ end
+
+ def test_default_record_key_maps_to_record_action
+ assert_equal :record, Gemba::HotkeyMap.new(Gemba::Config.new).action_for('F10')
+ end
+
+ # ── Virtual event bindings (subprocess, no physical keypresses) ────────────
+
+ def test_quit_virtual_event_fires_binding
+ # <> stops the mainloop before after(0) runs — print synchronously
+ # inside the appended binding instead.
+ code = <<~RUBY
+ require "gemba"
+ require "support/player_helpers"
+
+ player = Gemba::AppController.new("#{TEST_ROM}")
+ player.disable_confirmations!
+ app = player.app
+
+ poll_until_ready(player) do
+ app.tcl_eval('bind . <> {+puts QUIT_FIRED; flush stdout}')
+ app.after(50) { app.command(:event, 'generate', '.', '<>') }
+ end
+
+ player.run
+ RUBY
+
+ _, stdout, stderr, _ = tk_subprocess(code)
+ output = ["STDOUT:\n#{stdout}", "STDERR:\n#{stderr}"].reject { |s| s.end_with?("\n") }
+ assert_includes stdout, "QUIT_FIRED", "<> binding did not fire\n#{output.join("\n")}"
+ end
+
+ def test_quick_save_virtual_event_fires_binding
+ assert_virtual_event_fires('QuickSave',
+ setup_code: 'player.config.states_dir = Dir.mktmpdir("gemba-virt-test")',
+ cleanup_code: 'FileUtils.rm_rf(player.config.states_dir)')
+ end
+
+ def test_quick_load_virtual_event_fires_binding
+ assert_virtual_event_fires('QuickLoad')
+ end
+
+ def test_record_toggle_virtual_event_fires_binding
+ assert_virtual_event_fires('RecordToggle',
+ setup_code: 'player.config.recordings_dir = Dir.mktmpdir("gemba-virt-rec")',
+ cleanup_code: 'FileUtils.rm_rf(player.config.recordings_dir)')
+ end
+
+ def test_toggle_help_window_virtual_event_fires_binding
+ assert_virtual_event_fires('ToggleHelpWindow', with_rom: false)
+ end
+
+ private
+
+ # Verifies that generating <> on '.' fires the binding.
+ # Uses lappend ::virt_fired as a Tcl side-channel — no physical keypresses.
+ #
+ # Options:
+ # with_rom: load TEST_ROM (default true; false for no-ROM app controller)
+ # setup_code: Ruby injected after player/app created, before poll_until_ready
+ # cleanup_code: Ruby injected in after(0) before quitting
+ def assert_virtual_event_fires(event_name, with_rom: true, setup_code: '', cleanup_code: '')
+ marker = "#{event_name.upcase.tr('-', '_')}_FIRED"
+
+ if with_rom
+ code = <<~RUBY
+ require "gemba"
+ require "support/player_helpers"
+ require "tmpdir"
+ require "fileutils"
+
+ player = Gemba::AppController.new("#{TEST_ROM}")
+ player.disable_confirmations!
+ app = player.app
+ #{setup_code}
+
+ poll_until_ready(player) do
+ app.tcl_eval('bind . <<#{event_name}>> {+lappend ::virt_fired #{event_name}}')
+ app.after(50) do
+ app.command(:event, 'generate', '.', '<<#{event_name}>>')
+ app.after(0) do
+ fired = app.tcl_eval('lsearch -exact $::virt_fired #{event_name}') rescue "-1"
+ puts fired.to_i >= 0 ? "#{marker}" : "NOT_FIRED"
+ #{cleanup_code}
+ app.command(:event, 'generate', '.', '<>')
+ end
+ end
+ end
+
+ player.run
+ RUBY
+ else
+ code = <<~RUBY
+ require "gemba"
+
+ player = Gemba::AppController.new
+ app = player.app
+ #{setup_code}
+
+ app.tcl_eval('bind . <<#{event_name}>> {+lappend ::virt_fired #{event_name}}')
+ app.after(50) do
+ app.command(:event, 'generate', '.', '<<#{event_name}>>')
+ app.after(0) do
+ fired = app.tcl_eval('lsearch -exact $::virt_fired #{event_name}') rescue "-1"
+ puts fired.to_i >= 0 ? "#{marker}" : "NOT_FIRED"
+ #{cleanup_code}
+ player.running = false
+ end
+ end
+
+ player.run
+ RUBY
+ end
+
+ _, stdout, stderr, _ = tk_subprocess(code)
+ output = ["STDOUT:\n#{stdout}", "STDERR:\n#{stderr}"].reject { |s| s.end_with?("\n") }
+ assert_includes stdout, marker, "<<#{event_name}>> binding did not fire\n#{output.join("\n")}"
+ end
+end
diff --git a/vendor/rcheevos b/vendor/rcheevos
new file mode 160000
index 0000000..e9ca369
--- /dev/null
+++ b/vendor/rcheevos
@@ -0,0 +1 @@
+Subproject commit e9ca3694c862b61235595176dac4b22677848c93