Looney Tunes B-Ball Recompiled

Looney Tunes B-Ball Recompiled is a native PC port of Looney Tunes B-Ball for the Super Nintendo Entertainment System that supports 16:9 widescreen.

README

Looney Tunes B-Ball Recomp

Looney Tunes B-Ball in 16:9 widescreen

A native recompilation of Looney Tunes B-Ball (USA), built on snesrecomp.

Two-on-two street basketball from 1995 with Bugs, Daffy, Taz, Yosemite Sam and the rest, recompiled from the 65816 to native code: the game's own logic runs as compiled C against an emulated SNES video chip, sound chip and DMA, with the framework's interpreter as a fallback for code no analysis has reached. The court can be played in 16:9 widescreen.

You must legally own a copy of the game. No ROM data is distributed with this project, in the repository or in any release. The recompiled C is generated locally from your own copy and is never committed.

Just want to play? Download the latest release from the Releases page and see PLAYING.md: setup, controls, options and how to report a problem. The rest of this file is for building and developing the port.

Widescreen

On by default: the launcher's Aspect ratio row chooses 16:9 widescreen or the original 4:3. In widescreen the court widens to both sides and everything on it carries on into the extra space: the street, the buildings, the hoops, the players and the ball. At the far ends of the court, past where the game's artwork ends, the side is black. The bottom HUD (portraits, money, power-up names) sits at the screen edges, and the off-screen arrows point from the widened edges, hidden for players you can already see. Menus, character select, breaks and the stats screen keep their 4:3 picture.

4:3 (the original)16:9 widescreen
The same moment in 4:3The same moment in 16:9
Daffy is off the screen; the arrow on the right points to himThe court carries on, and Daffy is in view

It only changes what is drawn: the game plays exactly the same in both modes (identical game memory throughout a scripted match). How it works and how it was checked: docs/WIDESCREEN.md.

Screenshots

Title screenMain menu
Title screenMain menu
Character selectDaffy going up for a dunk
Character selectDaffy going up for a dunk (widescreen)
A Cream Pie power-upThe end of the court
A Cream Pie power-up in action (widescreen)At the court's end, the side past the game's artwork is black

Status

Playable (as of 2026-10-22): boot, attract demo, menus, character select, exhibition matches through the stats screen, a full one-player tournament, and two-player games (play-checked in widescreen), on Windows. The tournament screens have not been checked in widescreen yet.

  • Graphics. Fixed during the port and checked against bsnes: one-line HUD artefacts on the court and under the scoreboard (HDMA ran a line late in the framework), and black squares flashing on character select (the portrait decompressor overran the frame). The teal line at the bottom of Sylvester's character-select screen is in the original game.
  • Audio. Correct with VSync = adaptive (see PLAYING.md); with plain VSync the music can skip.
  • Native code. 1,735 compiled variants, seeded from five coverage captures of the attract mode and menus, matches and a full tournament (recomp/coverage/). 147 still run on the interpreter, mostly where the analyzer cannot prove how a routine exits; frames take 2-4 ms either way.
  • Mods: a Testing aids package on the launcher's Mods page, off by default, with Team 1 always wins (src/mod_team1_wins.c): team 1's score is kept two points ahead once team 2 scores, for playing through a tournament while testing.

Open items and what has been ruled out are in KNOWN_ISSUES.md.

ROM identity

FileLooney Tunes B-Ball (USA).sfc
PublisherSunsoft
DeveloperSculptured Software
Year1995
Mappinglorom
RegionUSA (North America)
Coprocessornone
CRC326d3bc96f
SHA-25676ba0fc1f5c1f39354bb3173a600f23915f1191f400f7d525d220b4b3c8d958d

tools/regen.sh refuses to run against anything else, so a mismatched revision fails immediately instead of producing subtly wrong output.

Build

On Windows, configure with Ninja and clang (the retcomm cmake-clang-v1 toolchain): the default Visual Studio generator uses MSVC, which cannot compile the framework. The analyzer needs Rust (cargo) the first time.

git clone --recursive https://github.com/SlippyGetBackHere/looney_tunes_b-ball_recomp.git
cd looney_tunes_b-ball_recomp
bash tools/regen.sh --rom "/path/to/Looney Tunes B-Ball (USA).sfc"
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++
cmake --build build -j

The snesrecomp submodule comes from a fork, SlippyGetBackHere/snesrecomp, branch local/looney-tunes-b-ball: upstream plus four fixes this port needs that are not upstream yet. git clone --recursive fetches it. patches/README.md lists the fixes and how to re-apply them to upstream; docs/UPSTREAM_ISSUES.md lists every framework problem the port ran into.

The ROM does not have to live in the repository; keeping it on your own drive is the better habit, and SNESRECOMP_ROM sets the path once for a shell. Without either, tools/regen.sh finds Looney Tunes B-Ball (USA).sfc at the repo root, then the path the setup wizard recorded in rom.cfg; .gitignore blocks both from ever being committed.

tools/regen.sh verifies the ROM, generates src/gen/*.c from the analysis input and the coverage captures, and re-syncs recomp/funcs.h. Re-run it whenever you change anything under recomp/.

Run

./build/LooneyTunesBBallSNESRecomp                                          # launcher picks the ROM
./build/LooneyTunesBBallSNESRecomp "/path/to/Looney Tunes B-Ball (USA).sfc" # or name it and skip the launcher

With no ROM on the command line the build opens the recomp-ui launcher: a ROM picker with a verification badge, plus display / audio / input settings. Your choice is cached in rom.cfg beside the executable, so the next launch opens on it and "Skip launcher on boot" makes it immediate.

Either way the ROM is checked against the digests above before anything boots: a dump that could not have produced this build is refused at the door rather than mis-executing ten frames in.

Layout

PathWhat lives there
recomp/Analysis input: bank*.cfg, symbols.toml, generated funcs.h
recomp/coverage/Coverage captures that seed the analyzer (addresses and hit counts, no ROM data)
rom_identity.txtROM digests, read by the build, tools/regen.sh and CI
src/Host code: main.c (identity, launcher rows, window), game_rtl.c (frame driver), ltbb_widescreen.c and ltbb_oam_widen.c (widescreen), mod_team1_wins.c
src/gen/Generated C. Never committed; regenerate locally
snesrecomp/Framework submodule (owns lib/recomp-net, lib/retcomm-rbengine)
mods/The preloaded Testing aids mod package
tools/regen.sh (the ROM to C pipeline), ws_baseline.py (4:3 picture check)
scripts/package_release.sh: the player-facing setup pack
patches/The framework fixes on the fork branch, one patch per commit, with notes
docs/WIDESCREEN.md, UPSTREAM_ISSUES.md
framework_pins.txtExact framework commits this project is pinned to
KNOWN_ISSUES.mdOpen issues, resolved ones, and what was ruled out

How the port works

  • Frame driver (src/game_rtl.c): the framework's beam-aligned driver, one frame per PPU field, interrupts taken where the beam latches them.
  • Portrait decompressor (recomp/bank83.cfg): its computed jumps (indirect_dispatch) and its exits (exit_mx_variant) are declared, so it and its callers compile, and an interpreted callee stops at the frame deadline instead of running past vblank.
  • Sprite emitter (recomp/bank00.cfg, src/ltbb_oam_widen.c): the routine at $80:C3C0 that builds the sprite table is wrapped (hle_func). The original runs unchanged, then a read-only pass adds the sprites the game culled at the 4:3 edge that fall in the widescreen margins, and adapts the off-screen arrows.
  • Widescreen court (src/ltbb_widescreen.c): the margins are drawn from the court's four-screen tilemap strip in video memory, line by line from the game's own per-line scroll, so the perspective floor lines up.

Continuing

  • Coverage. Capture more of the game as described in snesrecomp/docs/COVERAGE_FEEDBACK.md, add the capture to recomp/coverage/, re-run tools/regen.sh, rebuild, and check the result plays the same.
  • The 4:3 picture. python tools/ws_baseline.py compare <route> (attract, match, charselect) replays a scripted route and compares every sampled frame with the recorded hashes. Re-record after a regen that changes what is compiled.
  • Never edit src/gen/ or synthesise a result to get past uncovered code. Fix the config or the framework and regenerate.

Multiplayer

Two players on one PC, one controller each. Netplay is not built into this target.

License

This project's own source is under the license in LICENSE. The framework carries its own terms; see snesrecomp/LICENSE and snesrecomp/THIRD_PARTY_ATTRIBUTION.md. Neither covers the game data, which is not distributed here.