# Minish Cap 3DS: a native dual-screen port of The Minish Cap for Nintendo 3DS

> EstebanPdN/zelda-tmc-3ds turns the Project Picori decompilation into a Nintendo 3DS build with a live bottom-screen interface, widescreen rendering and an in-app updater. It needs a ROM you supply yourself, and the European release is the one that has been tested.

**EstebanPdN/zelda-tmc-3ds** — Native Nintendo 3DS port of The Legend of Zelda: The Minish Cap based on Project Picori

- Repository: https://github.com/EstebanPdN/zelda-tmc-3ds
- Stars: 721 · Forks: 28
- Language: C
- License: NOASSERTION
- Published: 2026-09-17 · Updated: 2026-09-17 · Language: en
- Canonical page: https://hysenlabs.com/projects/estebanpdn-zelda-tmc-3ds

## What the Minish Cap 3DS port actually replaces

The obvious way to play The Minish Cap on a 3DS is an emulator, and that is what most people do. This project takes a different route: it builds a native ARM binary from the open-source decompilation and runs it directly on the console. The README lists three upstreams it inherits from, samyost1/tmc-android for the dual-screen source base, Project Picori for the native engine and port infrastructure, and zeldaret/tmc for the original decompilation. The result is a 3DS application rather than a GBA emulator.

The audience is narrow and specific. You need a 3DS or 2DS already running homebrew, a legally obtained USA or European .gba ROM, and enough patience to read a diagnostics section before filing a bug. The README is explicit that no ROM or extracted Nintendo assets ship with the project. That single constraint decides whether this is for you: the CIA is the player, not the game.

What you get in exchange is hardware-level integration an emulator cannot offer. The bottom screen carries a live map, dungeon information, quest status, touch item controls and settings. The top screen runs at 400x240 for widescreen gameplay, with Original and Stretch modes alongside it. On a New Nintendo 3DS the port uses 804 MHz mode, L2 cache and multi-core rendering, and the C-Stick can drive optional 2x to 5x turbo.

## How the rendering and performance profiles split between console models

The port does not ship one renderer with a settings toggle. It detects the console and picks a profile. On a New Nintendo 3DS it keeps the full-presentation path with the higher clock, L2 cache, multi-core rendering and C-Stick turbo. On an Old Nintendo 3DS it switches to an optimized renderer, a lower-overhead audio path, and an adaptive presentation-skip profile.

That last mechanism is the interesting design decision. When the engine cannot sustain 60 visual FPS, it can keep advancing near its 60 Hz target instead of slowing the whole game down. Input, touch, audio and lifecycle handling continue to run on the skipped presentation ticks, so a dropped frame does not become a dropped button press. The bottom-screen worker takes a related approach: it avoids redundant static redraws but still samples touch input on every engine tick. Whether that trade reads as smooth to you depends on how much you notice presentation skips, and the README does not quantify how often the Old 3DS profile triggers.

Display output has three styles, Blur, Bilinear and Pixel Perfect. On a New Nintendo 3DS, combining Wide with Pixel Perfect enables what the README calls experimental Full View: compatible outdoor rooms render at 400x240, while supported interiors use a centered 200x120 view scaled exactly 2x. That is a per-room compromise, not a global setting, and the word experimental is doing real work there.

## Installing the CIA and placing your ROM

Installation is two steps on the console plus one file placement. The README says to install the CIA with FBI, or to use the 3DSX build with the Homebrew Launcher. The release artifact is named for the version, for example:

```text
tmc-3ds-v1.3-E19.cia
```

Next, create the folder the port reads from on your SD card. The README gives the path with a trailing slash, and the ROM can have any filename as long as the extension is .gba:

```text
sdmc:/3ds/The Minish Cap 3DS/
```

Place your legally obtained USA or European .gba ROM inside that folder. The README states the ROM stays on the SD card and is never included in the CIA, so the application and the game data remain separate files.

Before you spend time debugging odd behaviour, compare your dump against the expected clean ROM hashes:

```text
USA:    b4bd50e4131b027c334547b4524e2dbbd4227130
Europe: cff199b36ff173fb6faf152653d1bccf87c26fb7
```

The README recommends the European ROM, because that is the version used throughout development and testing, and it includes multiple languages including English. The USA version is described as compatible but slightly different in some parts of the game, which is a polite way of saying you may hit bugs the European build does not have. Region detection is automatic, so you do not pick a region in a menu.

## Silent audio, DSP firmware and the diagnostic dump

Two failure modes are documented clearly enough to plan around. The first is audio. The README states audio requires a working Nintendo 3DS DSP firmware setup, and if homebrew audio is not working you open the Luma3DS Rosalina Menu and use:

```text
Miscellaneous options > Dump DSP firmware
```

If you skip that step and hear nothing, the problem is your environment, not the port.

The second is the bug report path. Press L + R + A and the port pauses and writes a diagnostic dump with screenshots, memory information, runtime state and performance data. Dumps land under sdmc:/3ds/The Minish Cap 3DS/dumps/, and gameplay dumps also include a validated load-state.bin checkpoint. To reproduce the most recent dump, open Settings > Developer > Load State. Folders are numbered 000-dump-YYYYMMDD-HHMMSS, 001-dump-YYYYMMDD-HHMMSS and so on, and the sequence survives restarts and clock changes, though an emptied dumps folder starts again at 000.

The loader asks for confirmation, picks the newest numbered folder or a legacy dump-* folder, and rejects corrupted checkpoints or checkpoints created with a different ROM region. Older dumps containing only save-state.bin still work, but they resume from the saved checkpoint rather than the exact captured position. That distinction matters if you are chasing a crash that depends on precise timing.

## In-app updates and what the installer checks before overwriting

Updates run from Settings > Update. You select Stable or Pre-release, tap the release version to read its changelog on the top screen, and use Prev / Next to turn pages. Download Update asks for confirmation before downloading and installing. The README warns you to save your game first, because the application closes after a successful update.

The verification differs by build type. CIA builds overwrite only this application's title after checking its ID and SHA-256 digest. 3DSX builds replace the launched file with rollback protection. Wi-Fi is required, and connection failures leave the current installation available, so a dropped network does not brick your setup.

Every GitHub release includes an installable CIA, a Homebrew Launcher 3DSX, an FBI QR code and a source code archive. If you prefer to build it yourself, the README lists devkitPro, devkitARM, libctru, Citro2D, Citro3D, CMake, and makerom plus bannertool for CIA packaging. The documented build command is:

```sh
chmod +x platform/3ds/build.sh
./platform/3ds/build.sh
```

Outputs go to build-3ds/game/tmc-3ds-v1.3-E19.cia and build-3ds/game/tmc-3ds-v1.3-E19.3dsx. The README notes the build does not include or embed a ROM, which is consistent with the distribution constraint.

## Where the port stops and an emulator or the Android build makes more sense

The clearest alternative is not another 3DS port, it is samyost1/tmc-android, the dual-screen Android source base this port is built on. Both share the Project Picori engine, and both put game information on a second screen. The difference is the target hardware and what that hardware allows. On Android you are running on a phone with far more memory and a touchscreen as the primary input, and the port infrastructure there is built for that. On the 3DS you get the console's own controls, the C-Stick, the DSP, and a fixed 400x240 top screen the renderer can address directly. Neither is a superset of the other; the Android build is not a fallback for a 3DS owner, and the 3DS build cannot run on a phone.

If your goal is simply to see Minish Cap on a bigger screen, a GBA emulator on another platform is the lower-effort path. It will not give you the bottom-screen map, the quest status panel or the touch item controls, and it will not use the New 3DS clock and cache. It also will not produce a diagnostic dump you can attach to a bug report, which is the practical reason to prefer this port if you intend to report problems rather than just play.

One thing this project is not: a Switch port. The README and the repository layout cover the 3DS platform under platform/3ds, and nothing published describes a Switch target. Search traffic asking about a Switch version is not answered by anything shipped here.

## Licence position and the cost of keeping up

The repository's licence field is NOASSERTION, which means GitHub could not map the LICENSE file to a recognised identifier. The top level contains LICENSE and THIRD-PARTY-LICENSES.md, and the README credits four upstream projects by name. Whatever the LICENSE file says, the port sits on top of a decompilation and an Android fork, so the obligations you inherit are the union of those projects, not just this one. Read LICENSE and THIRD-PARTY-LICENSES.md together before you redistribute a build, and note that the ROM question is separate from the code licence: the project distributes no ROM, and supplying one is your responsibility. This is a description of the files present, not legal advice.

Upgrade cost is low but not zero. The last push was on 2026-09-13, and releases v1.1, v1.2 and v1.3-E19 appeared on 2026-08-14, 2026-08-26 and 2026-09-13 respectively, so the release cadence in that window was roughly every two weeks. The in-app updater means following that cadence costs you a tap and a save, not a reinstall. The catch is the version string in artifact names: build outputs are named for the version, so a local build script that hardcodes tmc-3ds-v1.3-E19.cia will need editing when the next release lands. The E19 suffix on the current release also suggests a pre-release line alongside the Stable channel, and the updater lets you choose which one you track.

## Conclusion

Adopt it if you already run homebrew on a 3DS and own a European or USA Minish Cap ROM: the install path is a CIA through FBI or a 3DSX through the Homebrew Launcher, plus one folder at sdmc:/3ds/The Minish Cap 3DS/. Skip it if you are not willing to supply your own ROM, if you expect a polished emulator front end, or if you want to play on a Switch, which this port does not target. Before you commit, check your ROM's SHA-1 against the expected values, dump your DSP firmware if audio is silent, and note that the European ROM has had the most testing while the USA ROM behaves differently in some parts of the game.

## FAQ

### Can I play Minish Cap on 3DS with this port?

Yes, if your console runs homebrew and you supply your own legally obtained USA or European .gba ROM. Install the CIA with FBI or use the 3DSX build with the Homebrew Launcher, then place the ROM in sdmc:/3ds/The Minish Cap 3DS/. No ROM or extracted Nintendo assets are distributed with the project.

### How do I install the Minish Cap 3DS port?

Install the CIA with FBI, or run the 3DSX build from the Homebrew Launcher. Then create sdmc:/3ds/The Minish Cap 3DS/ on your SD card and put your .gba ROM inside it; the filename can be anything as long as the extension is .gba.

### Which ROM region should I use for the Minish Cap 3DS port?

The README highly recommends the European ROM, because that is the version used throughout development and testing and it includes multiple languages including English. The USA version is described as compatible but behaves slightly differently in some parts of the game, so it may show bugs the European version does not.

### Why is there no audio in the Minish Cap 3DS port?

Audio requires a working Nintendo 3DS DSP firmware setup. If homebrew audio is not working, open the Luma3DS Rosalina Menu and use Miscellaneous options > Dump DSP firmware.

## Sources

- [EstebanPdN/zelda-tmc-3ds on GitHub](https://github.com/EstebanPdN/zelda-tmc-3ds)
- [Issues](https://github.com/EstebanPdN/zelda-tmc-3ds/issues)
- [README](https://github.com/EstebanPdN/zelda-tmc-3ds/blob/main/README.md)
- [Releases](https://github.com/EstebanPdN/zelda-tmc-3ds/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/estebanpdn-zelda-tmc-3ds
