Street-Alpha-3-Dreamcast-Recomp

Street Alpha 3 Dreamcast Recomp is a native PC port of Street Fighter Alpha 3 for Windows and Linux, built by statically recompiling the game's code.

README

SFA3 Native — Street Fighter Alpha 3 (Dreamcast) static recompilation

A native PC port (Linux and Windows) of the US Dreamcast version of Street Fighter Alpha 3, built by statically recompiling the game's SH-4 machine code into C and pairing it with a native runtime (Vulkan renderer, SDL3 input/audio). It is not an emulator: no CPU is interpreted or JIT-compiled at runtime.

Built 100% with AI. All of this project's code, from the recompiler and runtime to the setup app and build tooling, was written by AI (Claude Code, Anthropic's Claude), with a human directing, testing and play-testing it.

You need your own copy of the game

Use your own legally acquired copy of Street Fighter Alpha 3 for the Sega Dreamcast (USA release). This project does not include the game, and it does not tell you where to download it.

Only this release is supported:

TitleStreet Fighter Alpha 3 (USA), Sega Dreamcast
Product numberT-1203N
Versionv1.001
RegionNTSC-U (US)

Other regions (the Japanese Street Fighter Zero 3, the European PAL release) are rejected: the recompiler is tied to this exact build's code. The setup checks your disc's main executable before doing anything else.

This repository contains no game data

Nothing from the game ships here: no code, assets or recompiled output. The setup reads the disc image you made from your own disc, verifies it, recompiles it and builds the executable on your own machine. Everything derived from the game stays on your machine (build/ in a checkout, or the install folder the setup app creates) and must not be redistributed.

1. Dump your disc

Dreamcast GD-ROMs can't be read by ordinary PC drives. Use one of:

  • Dreamcast + SD card adapter: run a GD-ROM ripping homebrew (e.g. SD Rip) from a boot disc or ODE, rip to SD card, copy the resulting .gdi set to your PC.
  • Dreamcast + Broadband Adapter: run httpd-ack and download the tracks over your network (the method documented by Redump).
  • Dreamcast + coder's cable / serial: dcload-based rippers (slow but works).
  • PC "swap trick" with a compatible drive (see Redump's GD-ROM dumping guide).

You should end up with a .gdi file plus track01.bin, track02.raw, track03.bin. A Redump CUE/BIN set or a CHD (chdman createcd) of it works too.

2. Build

The easy way: the setup app

Download SFA3-Setup for your system from the Releases page, unpack it and run it. Choose your disc image (GDI, CUE/BIN or CHD) and an install folder, press Convert, then Play. It takes about 5 minutes and needs nothing else installed: the app carries its own C compiler (Zig), SDL3 and the port's runtime. The game needs a Vulkan graphics driver: on Windows, Windows 10 or 11; on Linux, glibc 2.31 or newer (Ubuntu 20.04, Debian 11, Fedora 32 or later). SFA3-Setup --convert IMAGE FOLDER does the same without the window.

The install keeps its own compact copy of the game's data (about 700 MB: the disc's files, without the empty part of the disc), so afterwards your disc image can be moved or deleted.

Updating: run the setup app again. It finds your install and offers Update: no disc image needed, and your saves and settings stay as they are. An update redoes only what the new version changed (steps with nothing to do show as unchanged): a fix in the port's runtime takes seconds, one in the game's tables or the PSP characters a minute or two. Rebuild everything does it all again, in case an update ever misbehaves. The app also tells you when a new version of itself is out (Get it downloads it and updates the game right after).

Optional: the PSP characters. If you also own Street Fighter Alpha 3 MAX for the PSP (USA, ULUS-10062), choose its disc image too (PSP image: an ISO, a CSO, or a ZIP of either). The setup then adds the four characters the PSP version has and the Dreamcast doesn't (Eagle, Maki, Yun and Ingrid): their code is recompiled from the PSP's, their sprites, voices, portraits and endings converted, and they join the select screens, arcade mode (with their own stories and endings), versus, World Tour and the rankings. This adds about a minute and 200 MB (the install keeps the PSP files it reads and what it converted, so updates don't need the image). Leave it empty for the Dreamcast's 38 characters. SFA3-Setup --convert IMAGE FOLDER PSP-IMAGE and ./sfa3port.py setup IMAGE --psp PSP-IMAGE do the same.

When it's done, the app has added the game to your Start Menu (Windows) or app menu (Linux), and to your desktop if you left that ticked. Add to Steam puts it in your Steam library as a non-Steam game, so it works from Big Picture and on a Steam Deck. The library artwork is downloaded from SteamGridDB at that moment, onto your machine only (credits below).

From source (developers)

Requirements: Python 3.9+, CMake, Ninja, a C/C++ compiler (GCC or Clang), Vulkan SDK/headers + glslc, SDL3.

./sfa3port.py setup "/path/to/Street Fighter Alpha 3.gdi"

The pipeline:

  1. Extract — reads the GD-ROM high-density area's ISO9660 filesystem.
  2. Verify — checks the SHA-1 of 1ST_READ.BIN against the known release (so any dump format of the same disc validates).
  3. Recompile — tools/recomp disassembles the main executable (1ST_READ.BIN, loaded at 0x8C010000) and the 111 per-character code overlays (PLnnA/B/C.BIN, linked for the player slots at 0x8C800000, 0x8C814000 and 0x8C828000) and emits C.
  4. Build — compiles generated C + runtime/ into build/cmake/sfa3.

After changing the recompiler or runtime: ./sfa3port.py rebuild.

Packaging the setup app (Linux and Windows, both from Linux):

  • Zig 0.17 for Linux in build/toolchain/, for Windows in build/toolchain/win/.
  • ./sfa3port.py dev-libs builds the prebuilt parts players get into build/lib/<platform>/ and build/tools/<platform>/: SDL3, the runtime library, what the game links for Vulkan, the Windows manifest (UTF-8 paths) and the CHD helper. Linux targets glibc 2.31.
  • python3 tools/make_bundle.py makes the downloads in build/dist/. It needs PyInstaller in build/venv, and for Windows, Windows Python 3.14 with PyInstaller in the Wine prefix build/wine (C:\Python314).

3. Play

Run ./build/cmake/sfa3.

KeyboardDreamcast
Arrows / WASDD-pad
EnterStart
U, I, OX, Y, L trigger (punches)
J, K, LA, B, R trigger (kicks)
F1settings overlay (pauses the game, except in netplay)
Escon the title screen: QUIT GAME? (YES / NO)
F11 or Alt+Enterfullscreen

Gamepads work too. In menus A confirms and B goes back, whatever the attacks are bound to; on the title screen Back (or B) asks QUIT GAME?, YES / NO. Default gamepad layout: X / Y / RB = light / medium / heavy punch, A / B / RT = light / medium / heavy kick, LB / LT = all three punches / kicks (Xbox names; same positions on other pads).

Controls: BUTTON CONFIG (in Option Mode, and in the pause menu during a fight), one column per player, each set with that player's controller:

  • A grid of the attacks, punches on the left and kicks on the right: L, M, H, and 3 (all three at once). Each cell shows the key or gamepad button that does it (X, RB, TRI, SQR, LSH...); choose a cell and press a new key / button to rebind it (Esc / Back cancels). A key or button already in use swaps.
  • VIBRATE: rumble on the player's gamepad (an emulated Jump Pack).
  • DEVICE: AUTO, XBOX, PS, SWITCH or KEYBOARD. It picks the device and how buttons are named. On AUTO, player 1 uses the first gamepad and the keyboard; player 2 the second gamepad.
  • COMMAND is the game's own: extra time for special-move inputs (ARCADE +0, NORMAL +2, LONG +4 frames per step).
  • DEFAULT also restores that player's bindings.

The same settings are on F1 / Esc > CONTROLS (with the keyboard's directions and START, and the gamepad choice when several are connected). Gamepads always move with the d-pad and left stick. Player 2 on KEYBOARD defaults to the numeric keypad, Insert / Home / Page Up and Delete / End / Page Down. Bindings are saved in sfa3.cfg (p1_hp = Left Shift, p1_pad_3k = lefttrigger).

Display settings — in the game's own menus: Option Mode > DISPLAY, and DISPLAY in the pause menu during a fight (the Dreamcast's CRT "display adjust" screen, rebuilt for PC). The same settings are also on F1 / Esc at any time (this pauses the game):

SettingValues
Window modewindow, borderless fullscreen, exclusive fullscreen
Window sizewindow mode: FIT (as big as the screen allows), or 4:3 sizes from 640x480 to 2560x1920; with Picture 16:9, 16:9 sizes from 854x480 to 3840x2160
Resolutionyour monitor's modes and refresh rates (exclusive fullscreen)
Picture4:3: the original picture (black at the sides of a wider screen). 16:9: fights show more of the stage, not stretched; the health and super bars stay where they are, the walls and how far apart the fighters can be are the original's, and at a wall the stage's edge is the screen's edge. Where part of a stage was only painted as far as the 4:3 game shows it, or holds flat unpainted patches the 4:3 game never showed, it is continued from its own art, softened; art the 4:3 game simply never reached is shown as painted. Menus, cutscenes and online games stay 4:3
Render resinternal resolution: 4:3 from 640x480 to 3840x2880; with Picture 16:9, from 854x480 to 5120x2880. Match your screen's height for the sharpest picture: on a 4K screen, 3840x2160 at 16:9 (2880x2160 at 4:3)
VSyncon / off
CRToff, scanlines, PVM (a Trinitron monitor: beam, mask, glow); level 10-100
Texturessmooth / sharp
Skip introon: power-on goes straight to the title (Capcom logos, QSound screen and intro skipped; the save still loads)

Changes apply immediately and are saved to sfa3.cfg (not to the memory card save), which can also be edited by hand.

Cheats — Option Mode > CHEATS (a fifth button, under DISPLAY), and CHEATS on F1:

CheatWhat it does
Infinite healthyour health refills after every hit
Infinite superyour super meter stays full (every -ism)
Infinite guardyour guard meter never wears down: no guard crush
Half healthhalf a health bar for you, the CPU or both
One hit KO on CPUthe CPU has 1 health point: any damage knocks it out
Guard crush on CPUthe CPU's guard meter stays on its last point: its next blocked hit crushes it
No super for CPUthe CPU's super meter stays empty
Final Bisonunlocks Final Bison: hold Start and press a button on M. Bison (Arcade, VS, Training)
World Tour max EXPyour World Tour EXP at the most (9999999)
World Tour X-ism / A-ism / V-ism EXPthat -ism's World Tour EXP at the most (three separate cheats)

The World Tour cheats work in World Tour mode; the game raises a level from the EXP only after a fight you win with that -ism, so an -ism you haven't fought with yet shows level 1 with the EXP at the most until you win once with it (then it jumps up, with the stat gains). The game also caps a character's total level at 32, shared by all three -isms: every -ism level-up counts toward it, and once it reaches 32 no -ism can level any more. So with the EXP cheats on, the first -ism you win with takes it to 32 and the other two stay where they were (the original game works this way; the cheats don't change its rules). The levels are saved with your World Tour data. In World Tour your fighter's label reads I-ISM: that's the Dreamcast's World Tour style (your chosen X, A or V gauge plus the ISM-Plus abilities), the same on the original disc. The fight cheats work only in fights against the CPU: never in netplay, and not while two people are fighting (a challenger joining an Arcade fight turns them off for that fight). CHEATS ON shows above the meters while they are working. Final Bison stays unlocked once chosen and goes into the memory card save the next time the game saves. Shin Akuma needs no cheat: hold Start and press a button on Akuma. Cheat settings are saved in sfa3.cfg.

Saves — a memory card is emulated in controller port A, slot 1, and stored in build/vmu_a1.bin (written every few seconds and on exit). Use the game's Memory Card / Option menus to save and load as on a Dreamcast. The memory card screen shows one card per controller port, drawn with the port's own images (assets/vmu_card.png for a card, assets/vmu_empty.png for none; 64x64, replaceable, built in when the port is built).

Netplay — Mode Menu > NETWORK is a two-player lobby (the Dreamcast's online menu, rebuilt):

  • NAME sets the name others see (type it, or pick letters with a controller).
  • HOST GAME waits for a player; it shows your address and port (UDP 7777).
  • JOIN GAME lists games on your local network; ENTER ADDRESS joins by IP.

When a player joins, both games restart into a shared lobby (about two seconds). The host picks VS Mode, Team Battle, Dramatic Battle or VS Dramatic Battle, and the game goes straight to that mode's character select. VS Dramatic Battle (two against one) needs a third player: a second controller on either machine plays it, otherwise the game's own CPU does, at a level the host sets on that lobby row (left / right). Players choose their sides as usual; the CPU's teammate picks its fighter after their own (if the CPU is on its own, whoever finishes choosing first does); the select screens label it CPU. Quitting a match (pause > Mode Menu) brings both players back to the lobby; F1 / Esc has BACK TO LOBBY for any other screen, and LEAVE SESSION. The host can remove the guest; if either player leaves, closes the game or loses the connection, the other returns to the NETWORK menu with a message (the pause menu during a fight also has LEAVE SESSION). Both players use the host's memory card during a session and nothing is saved; each player's own card is back afterwards.

Command line: --host, --join <address>, --name <name>, --delay <frames> (fixed input delay instead of automatic).

Layout

PathWhat
sfa3port.pysetup pipeline entry point
tools/gdi_extract.pyGDI / ISO9660 extractor
tools/recomp/SH-4 decoder, function discovery, C code generator
runtime/native runtime: memory, Vulkan PowerVR2 renderer, input, audio, saves
assets/the port's own images (not game data)
build/your extracted disc and all derived output (never commit)

License

This project's code is licensed under the GNU General Public License v3.0 or later (see LICENSE).

The licence covers this project's own code and images only. Street Fighter Alpha 3 is © Capcom; none of its code or data is part of this repository, and the GPL grants no rights to it.

Third-party components keep their own licences:

ComponentLicenceUse
libchdr (tools/third_party/libchdr)BSD-3-Clausethe CHD helper
SDL3zlibbundled with the setup app and the game
ZigMITthe setup app's bundled C compiler

Steam library artwork is not part of this repository or the downloads: Add to Steam fetches it from SteamGridDB on the player's machine. Banner by Alfonso72394 (#164774), cover by brendanrfoley (#297136), game page hero by Shahars71 (#7916) and logo by wulfbraker (#61805).