u/austinswagger

▲ 239 r/PSP

GBAdhoc 3.5.0 released: GBA Link Cable over WiFi (Mario Kart, Advance Wars), Game Boy Trades, New Menus, Button Remapping, and more!

GBAdhoc is a Game Boy Advance emulator for the PSP that also plays Game Boy and Game Boy Color. This release links two PSPs together like two consoles and a link cable, over the PSP's own ad-hoc WiFi: race in Mario Kart: Super Circuit, fight in Advance Wars 2, trade Pokémon from Red to Crystal. No cable, no router, no Internet. It still runs the hard ROM hacks at full speed on a PSP-1000, because the renderer lives on the console's second processor. Free, open source (GPL-2.0), no BIOS needed.

Download 3.5.0 · Source and README

What's new in 3.5.0

GBA link cable between two PSPs. The GBA's link-cable games, with no cable. Open the game on both PSPs; one picks Wireless → Host and keeps playing while it waits, the other picks Join: scan for rooms. A short LINKING screen, and both games carry on from where they are: nobody starts over. Your friend's moves play out on your screen exactly as two GBAs on a cable would show them, battle animations and all.

https://i.redd.it/wacua49wlgth1.gif

https://i.redd.it/ex5tlhrwlgth1.gif

How it works without a cable: a real link cable answers in microseconds and WiFi answers in milliseconds, so sending the cable over the air can't work, and GBAdhoc doesn't try. Each PSP runs both games: yours, on screen with sound, plus an invisible copy of your friend's, joined by a perfect cable in memory. The only thing that crosses the air is which buttons each player pressed, one tiny message per frame. Same buttons, same order, same result on both PSPs. No game needs special code: if it links by cable, it can link this way.

https://preview.redd.it/r3te7h6ylgth1.png?width=1920&format=png&auto=webp&s=6dc5a88e15ecde4c210f2093fa4759591445217d

Safe by design. About once a second the two PSPs compare a fingerprint of both games. If they ever disagree, the link ends and nothing is saved. If the other PSP leaves, your game carries on.

Tested on two real consoles (a PSP-3000 hosting, a PSP-1000 joining): Advance Wars 2 at 59.2 fps, a Mario Kart: Super Circuit two-player race at 58.9 fps. Also passing in emulated pairs: Sonic Advance, Mario Tennis: Power Tour, and Pokémon Emerald's Cable Club. You need the same ROM on both PSPs; two players.

Game Boy and Game Boy Color link cable (from the 3.1 beta). Trades and battles between two PSPs, tested with Pokémon Red, Blue, Yellow, Gold, Silver and Crystal. Only one of you needs the cartridge: if your friend doesn't have it, it is sent over for the session, kept in memory and never written to their Memory Stick.

https://i.redd.it/il0zk71zlgth1.gif

A new in-game menu, over your paused game: Resume, Save states, Wireless, Settings, Quit to game list, Exit. Save states you can see: five slots, each with a picture and the time you saved; ✕ loads, □ saves, △ deletes.

https://i.redd.it/wbgq2p00mgth1.gif

Remap every button. Every game button and every shortcut (fast-forward, quick save/load, screenshot, Mystery Gift, the menu), or leave one blank to turn it off. HOME can open the menu if you want it to (START+SELECT stays the default).

Quit to game list in about a second. The game unloads inside the app and fades into your library, no relaunch, save written first.

Sharper pictures, per console. GBA, GB and GBC each remember their own picture: integer 2x, a sharp bilinear filter (crisp pixels, no shimmer), and Ambient bars that fill the sides with the game's own art. More accurate Game Boy Color colours too.

https://preview.redd.it/5vxvvry0mgth1.png?width=970&format=png&auto=webp&s=5bf4ddeb87c9ec2f4065a59f892ecf9b0cb18426

Also new: Settings and the loading screen sit over the game's art; fast-forward reworked (Unlimited draws 30 frames a second, Unlimited Smooth 60, the rest goes to the game); dynarec optimisations; a PSP-2000/3000/Go crash traced to the PSP firmware itself and worked around; audio that no longer drifts; Media Engine renderer fixes.

What it does

  • Link play: GBA Link Cable and GB/GBC link cable between two PSPs (new), plus full AGB-015 Wireless Adapter emulation for Emerald, FireRed and LeafGreen: Union Room, Trade Center, link battles, Mystery Gift.
  • Mystery Gift: real Gen-3 Wonder Cards from an Android phone (Mystery Gift Station).
  • Two processors: the Media Engine draws every frame while the main CPU emulates the next. Full speed on a PSP-1000.
  • GB and GBC: the same browser, save states, menus and remapping as GBA.
  • A browser worth using: Marquee or Shelf, dark or light, one list per console, favourites, hero art.
  • Wake from sleep: slide it shut, come back tomorrow, the game is exactly where it was.
  • All three PSPs: 1000, 2000/3000 and Go, tested on hardware. Custom firmware needed (developed on ARK-4).

Linking: the three things to get right

  • The WLAN switch must be on (on the Go it is a setting).
  • Both PSPs on the same fixed ad-hoc channel, not Automatic: Settings → Network Settings → Ad Hoc Mode, pick 1, 6 or 11 on both, away from your router's channel.
  • Start from the in-game menu: Wireless → Host on one PSP, Join: scan for rooms on the other. For GBA, both PSPs need the same ROM.

Install

  • Unzip the release to the root of your Memory Stick; it lands in PSP/GAME/GBAdhoc.
  • Put your .gba, .gb and .gbc files in GBAdhoc/roms/ (subfolders are fine).
  • Launch it from the XMB. No BIOS needed. Upgrading: copy EBOOT.PBP, gbadhoc_me.prx and gbadhoc_home.prx over your install, always all three together. Your config.ini carries over.

Box art and hero art are optional and matched by filename; ready-made packs and the tool that renames them to your ROMs live in GBAdhoc-heroart.

This stands on other people's work. The Wireless Adapter reverse-engineering and emulation are davidgfnet's (gpSP); the GB/GBC core is TGB Dual by Hii, built to run two Game Boys on a cable, as ported to the PSP in Brunni's MasterBoy; sleep/wake with code on the Media Engine exists because of mcidclan's libraries. GBAdhoc is the PSP shell, the link and the radio transport around them. Full credits, the architecture notes and the changelog are in the README.

No ROMs, no BIOS, no game files are included or linked. Bug reports: GitHub issues, with your PSP model and the game.

u/austinswagger — 11 days ago
▲ 28 r/GameboyAdvance+1 crossposts

[Update] GBAdhoc 2.0 — new ROM browser, Improved Performance, Sleep/wake

https://github.com/ShoshinFauteux/GBAdhoc

The browser

Two layouts, each in light or dark. Marquee gives one game a whole screen with its hero art behind it. Shelf packs more of the library in with box art and save status at a glance. Art loads only while you are idle and never while you are scrolling, so holding a direction stays smooth.

⬇ Download GBAdhoc 2.0 · Source

⬇ Hero Art Pack · unzip into GBAdhoc/hero/

Everything else in 2.0

  • Dual-core rendering — Updated Dual-Core render pipeline, 15% faster than the previous iteration.
  • Wake from sleep — slide it shut, flick the switch, come back whenever. Your game is exactly where you left it.
  • Full-speed wireless — Version 2.0 holds 59.73 on both.
  • Six fast-forward presets — 1.5×, 3× and uncapped, each in normal or smooth. Normal skips frames to go as fast as possible; smooth forces every emulated frame to be drawn. It's not as fast (100fps vs 160fps) but it's extremely satisfying.
  • Save states on the shoulders — Select + L saves, Select + R loads, one slot per game. Your SRAM is flushed on exit, on HOME and as you play, with a backup kept.
  • Pokémon Unbound and other CFRU hacks at full speed.
  • All three models — 1000, 2000/3000 and Go, all tested on hardware. No BIOS needed.

Coming from 1.0.0? For simplicitly sake delete any previous builds.
Unzip to the root of your memory stick  it lands in PSP/GAME/GBAdhoc. Put your .gba files in roms/ and launch it from the XMB. No BIOS needed.

Make sure to leave me a nice comment if you liked the emulator, I am a smol bean motivated by adjulation.

OBLIGATORY CLANKER DISCLOSURE
Produced with Help from Claude Opus 5.0

u/austinswagger — 1 month ago

Claude and Time

Does anyone else find that their agents have absolutely no sense of how much time has elapsed? Often Opus and Fable will say things like "finally! After months of scouring assembly we find the smoking gun" when the session has only been a day or two.

Sometimes they will give absurd estimates like "this will take WEEKS" only to one shot it on the first attempt.

Weird.

reddit.com
u/austinswagger — 2 months ago
▲ 229 r/PSP

GBAdhoc v1.0.0: Gameboy Advance Emulation w/ Wireless Adapter Support

Follow up to the post I made last week: https://www.reddit.com/r/PSP/comments/1vj8g0f/gbadhoc_gba_wireless_adapter_emulation_over_psp/

**Game Boy Advance emulation for PSP with AGB-015 (Wireless Adapter) support.**

Two PSPs, a copy of Pokémon Emerald on each. Walk in, sit down, trade, battle, walk out with the attendant stamping your trainer card. Exactly as if you'd plugged an AGB-015 Wireless Adapter into a real Game Boy Advance; except the "GBAs" are PSPs, and the radio is the PSP's WLAN.

**Repo + downloads:** https://github.com/ShoshinFauteux/GBAdhoc
**Programmed with Assistance from Fable 5.0(AI)**

GBAdhoc is a fork of libretro gpSP with a heavily modified native PSP frontend. It does two things that are brand new to GBA emulation on PSP.

# It emulates the GBA Wireless Adapter over PSP ad-hoc

The AGB-015 wireless adapter is emulated entirely in software and bridged directly to the PSP's sceNetAdhoc library. The emulator provides a transparent hardware interface to the guest ROMs, enabling features that were previously unsupported in handheld emulators, such as Pokémon Emerald's Union Room, Trade Center, and wireless link battles.

This implementation is not a timing-agnostic approximation. The emulated adapter strictly reproduces the physical hardware's packet delivery behavior. Network packets are paced to the exact cadence expected by the games' internal polling loops. Pokémon's link code silently discards input polling when the receive queue overflows; matching the hardware delivery pacing eliminates the desynchronization issues. GBAdhoc maintains wireless sessions at full speed (59.73 fps) with a clean input path. Measured across hundreds of automated hardware trades, the in-game receive queue never saturates.

# It's the first true dual-core GBA emulator on PSP

GBAdhoc initializes the PSP's secondary processor (the Media Engine) to offload the entire GBA video renderer. While the primary CPU emulates the next system frame, the Media Engine rasterizes the previous frame. This parallel execution handles roughly one-third of the frame's total computational workload.

The performance yield is most apparent during heavy GPU loads (e.g., trade animations and alpha-blended battle effects), maintaining stable framerates where previous single-core iterations dropped below 40 fps. Furthermore, during ad-hoc sessions, this parallelization frees up primary CPU cycles to handle the WLAN stack without stalling emulation.

The renderer's output is bit-for-bit identical to the single-core fallback path, verified via frame-by-frame reference testing. If the Media Engine is unavailable, the emulator transparently falls back to main-CPU rendering without loss of stability.

**Media Engine mode ships ON by default.** The toggle is in Settings → "Media Engine mode" (requires restart).

[How the dual-core pipeline works (infographic)](https://raw.githubusercontent.com/ShoshinFauteux/GBAdhoc/main/assets/dual-core-pipeline.svg)

# Screenshots

All captured from real hardware, the UI pages are GE dumps taken mid-session, and the Trade Center frame was rendered by the Media Engine during one of the automated hardware trades.

# Quick start

**You need:** a PSP on custom firmware (developed and tested on ARK-4, PSP-1000s), your own GBA ROMs, and (for trading) Two PSPs.

  1. Grab the release zip (or `builds/playable/` from the repo) and copy the GBADHOC folder to `ms0:/PSP/GAME/` on each console.
  2. Put ROMs in the `roms/` folder beside the EBOOT. (`gba_bios.bin` is optional — a built-in open-source BIOS is bundled.)
  3. Launch, pick a game, play.

**To link two consoles:** WLAN switch on, then on both PSPs: Start+Select → **Wireless** → one console **Host**, the other **Join** (same room code, set in Settings). In-game, head to the Union Room or Trade Center and play; the game handles the rest, because as far as it knows, you're both holding GBAs with Wireless Adapters.

**IMPORTANT:** make sure **BOTH** PSPs are configured in the network settings of the XMB to occupy the **SAME** ad-hoc channel.

Pokémon **Emerald** is the validated flagship; trades and clean session exits are regression-tested on real hardware. Other RFU-aware games should negotiate with the adapter; wireless behavior outside the Pokémon gen-3 family is untested.

Link **battles** are supported and complete end to end, but currently run a bit slow. The client in particular has to wait about 200-300ms between actions. This might just be a fundamental reality of the network stack. I'm curious if someone more intelligent than me is able to optimize this further.

# Known limits

- Two-player sessions; wireless validated primarily on Emerald; custom firmware required (the Media Engine and ad-hoc stack need kernel access).

- **Fast-forward does not yet work properly in Media Engine mode.** The dual-core renderer increases performance significantly, but pacing a fast-forwarded display through its parallel pipeline needs a thoughtful implementation of its own; coming in a future update. (I was too excited to wait any longer.)

- If you mainly play single-player and want working fast-forward today, turn **Media Engine mode off** in Settings. That falls back to the conventional single-core emulator stack, less peak performance but, counter-intuitively, full fast-forward support.

# How it was tested (the fun part)

Netcode like this can't be validated in a software emulator, PPSSPP reproduces neither real PSP WLAN latency nor two consoles' clock drift, and that's where the bugs live. So the repo ships the test rig I built: an autonomous two-console harness.

two PSPs run a scripted trade → exit → expose their memory sticks over USB

→ the PC collects logs/saves/screenshots, restores golden saves, stages the

next build → the consoles relaunch themselves → repeat, all night

Every run ends with an oracle check: the post-run save is decoded and the Pokémon party must actually differ from the golden baseline — "the script finished" is never accepted as "the trade happened." Hundreds of recorded hardware trades went into the settings this release ships with. The full harness (PC loop, autopilot fixtures, golden saves) is in the repo if you want to run your own experiments.

# Credits

The adapter emulation (`rfu.c`, `serial_proto.c`) the hardest and most valuable piece of this stack is **David Guillen Fandos**'s reverse-engineering work, inherited, not ours. gpSP is **Exophase**'s; the MIPS dynarec that makes GBA-on-PSP possible at all is by **notaz** and the **libretro/gpsp** contributors. The Media Engine boot method descends from **mrbrown**'s melib via **DaedalusX64**. Wireless Adapter protocol documentation by **Rodrigo Alfonso (afska)** and **kuiper.dev**. Game-side link behavior was understood through the **pret** pokeemerald decompilation. GPL-2.0; upstream copyright headers intact.

u/austinswagger — 2 months ago
▲ 121 r/PSP

GBAdhoc: GBA Wireless Adapter emulation over PSP ad-hoc WiFi

First and foremost, a huge thanks to Exophase, who wrote gpSP in the first place. The only reason a PSP can emulate a GBA at full speed today is because of his groundbreaking work over a decade ago.

Secondly, David Guillen Fandos (davidgfnet) is the one keeping the modern gpSP core alive. More critically, he did the heavy lifting of reverse-engineering the GBA Wireless Adapter and writing its emulation (rfu.c and serial_proto.c). By a wide margin, that is the hardest and most valuable piece of this entire stack. His deep-dive write-up on the wireless adapter is a fantastic read, even if you don't normally care about PSP hardware.

David’s emulation was built upon, and checked against, some incredibly thorough community documentation of the wireless protocol. Massive credit goes to Rodrigo Alfonso (afska) and Corwin (kuiper.dev) for figuring this out. You can check out their work in the gba-link-connection docs and on Corwin's blog.

I also have to shout out notaz and the libretro/gpsp contributors. Their work on the MIPS32 dynarec and the rewritten renderer is the fundamental reason any of this actually runs on real PSP hardware.

Finally, thank you to pret for the pokeemerald decompilation, as well as pspdev, the PSPSDK, and the ARK-4 team for maintaining the foundational tools that keep the PSP homebrew scene alive.

Every hard problem here was solved by someone else before I started.

As for my contribution, token printer go brrrrr.
And that's all I have to say about that.

Things to know:

  1. The frontend has a fast-forward hold that most GBA emulators on PSP don't. Roughly 2x in normal play, including battles, and it's a proper multiplier rather than frameskip alone, you can cap it at 1.5x/2x/3x or leave it uncapped.
  2. The client can still occasionally land on the recoverable "press A to return to the lobby" screen when leaving the Union Room.
  3. PSP-1000? Yes, one of my two units is a 1000, and it's the host.
  4. Press Start + Select to open the menu, hold start + select for 3~ seconds to force exit the emulator.
  5. This has basically only been used for trading Pokémon. That's the use case it was built for and the only one that's had real testing. Emerald ↔ Emerald works, back-to-back sessions without rebooting.
u/austinswagger — 2 months ago