A static recompilation of Yu-Gi-Oh! Forbidden Memories (USA, SLUS-01411). The game's MIPS code is translated to C ahead of time and compiled into a native executable — it is not interpreted by an emulator.
On top of that sits a set of quality-of-life features built for this game: a live duel-rank meter, a fusion assistant that reads your actual hand, a card-drop multiplier with a proper results screen, a full drop-table manager in its own window — view, edit and share every duelist's drops — and a cheat menu. All drawn in the game's own art, all toggleable at runtime.
Built on PSXRecomp.
You bring your own disc. Nothing in this repository, and nothing in the download, contains any part of the game. The C is generated on your machine, from your copy, the first time you run it.
| Serial | SLUS-01411 (USA / NTSC-U) |
| Players | 2 |
| Publisher | Konami, 1999 |
| BIOS | OpenBIOS, bundled — a retail dump is optional |
Everything below lives in the in-game overlay menu on F10, and every
setting takes effect immediately — no restart, no patched save.
The game grades every duel you win but only tells you afterwards. This puts the grade on screen while you play, in the game's own HUD sprites, lifted from its own VRAM. It tracks the picture through scaling and aspect changes and hides itself when a card view covers the box it labels.
| Mode | What you get |
|---|---|
OFF |
stock behaviour |
IN GAME |
the game's POW/TEC badge and rank letter, beside the FIELD box |
IN GAME + SCORE |
the same, plus the raw 0–99 score |
OVERLAY TEXT |
plain text in the corner — never covered by a card view |
Forbidden Memories has thousands of fusions and teaches you none of them. This reads the cards in your hand against the game's real fusion and equip tables in memory — not a copied list — so its answers are the game's answers, including the awkward three-step rule the game actually implements.
| Mode | What you get |
|---|---|
OFF |
stock behaviour |
NUMBERS |
pick order marked on the cards themselves |
NUMBERS + INFO |
pick order plus the name of the card it produces |
VIEW → SUGGEST FUSION BY chooses ATTACK or DEFENSE.
Stock, a won duel awards exactly one card. This makes it 1–99, so grinding a specific drop stops being a weekend.
It comes with a results screen stock never had: the cards you won across three pages you flip with D-pad Left/Right, with the game's own yellow New! tag on anything you didn't already own.
82 of the game's 722 cards are dropped by nobody — both of Exodia's legs among them, which is why the set cannot be completed by duelling in the stock game. This gives every one of them a source.
Nothing on your disc is touched: the duel loads the opponent's drop weights into memory and this rewrites that copy, so the change lasts as long as the duel does.
Placement is yours to change. On first run the mod writes
drop_missing_cards.ini into your player-data folder, listing every card by
name under the duelist that drops it:
[Weevil Underwood]
52 = 30, 20, 0 ; Hercules Beetle
278 = 30, 20, 0 ; Petit MothThe three numbers are the S/A POW, B/C/D and S/A TEC rates, as weights out of 2048 — 20 is about 1%. Each band always totals 2048, so what you add comes off that duelist's normal drops in proportion; the shipped table adds 1–6% each. Delete the file for the defaults back.
Opens a separate window you can move to another monitor and leave open while you play. It knows every card and every duelist's drop table — and it does not just show them. You can rewrite any duelist's drops and the game rolls what you wrote.
| View | What you get |
|---|---|
BY CARD |
all 722 cards — id, name, type, ATK, DEF, how many tables drop it — sortable on any column, with every duelist that drops the selected one, the rank band needed, and the chance |
BY DUELIST |
all 39 duelists, with everything they drop, the band, and the weight both raw and as a percentage |
Type to search by name or id, click a column heading to sort, scroll with the wheel or the scrollbars, click a row on the right to cross over into the other view. Weights are out of 2048, which is what lets one read as a percentage.
Editing. Click a weight and type a new one. Click the rank cell to move a
drop between bands. Right-click anything for the rest: add a card to a
duelist, move it, remove it. Or just drag a card out of the left list and
drop it on a duelist — the ALL CPU toggle lists every duelist under a
card, greyed where they do not drop it, so every one of them is a drop target
without leaving the view. Every band still totals exactly 2048 — whatever you
add or grow comes off that duelist's other drops in proportion, the same
arithmetic the game's own roll assumes — and an edit that cannot balance is
refused, not fudged.
Nothing is written until you press SAVE, which persists your table as
drop_table_edits.ini in your player-data folder (hand-editable, same format
as the mod's file). DEFAULTS clears the selected duelist back to stock.
Sharing. LOAD → EXPORT CURRENT writes your table as a timestamped file
in drop_tables/ next to your saves — send it to someone, they drop it in
their own drop_tables/ folder and pick it from LOAD. Loading replaces the
edit layer in memory only; it too is nothing until saved.
If DROP MISSING CARDS is on, the manager shows — and edits on top of — the
table you will actually roll against: it runs the same transform the mod runs,
so the two cannot disagree, and your edits apply over the mod's placements.
Card names and ATK/DEF are read out of the running game; the drop tables are
baked from your disc when you build. Duelist portraits are the game's FREE
DUEL art and, like every other piece of Konami art here, are never
shipped — instead your game captures them itself, from its own screen,
the first time you browse FREE DUEL. Scroll the opponent list once and the
Manager fills in for good (they persist next to your saves). A duelist you
have never met draws nothing there, so their plate stays plain — unless you
use CHEATS → REVEAL ALL PORTRAITS, which temporarily marks everyone as met
just long enough for the capture to finish, then reverts itself: the
moment the last portrait is stored, the flags it set are cleared again and
your save is bit-for-bit what your campaign earned.
16:9, contributed by yamyi.
Projected 3D — the duel field — renders genuinely wider; flat 2D screens stay
4:3 and are pillarboxed rather than stretched. Also available as a mod-catalog
feature (psx.enhancement.widescreen). Experimental, as the framework labels
this feature class: culling pop-in at the wide edges has not been fully
checked for this title.
| Row | Range | Notes |
|---|---|---|
LIFE POINTS |
1–9999 | 8000 is stock. Applies to both duellists |
SHOW OPPONENT HAND |
on / off | their hand is drawn face-up, like yours |
FORCE FACE UP |
on / off | their set cards play face-up — and stay face-up |
STARCHIPS |
0–99999 | written straight to your save |
FREE SPENDING |
on / off | purchases succeed, the deduction is undone |
ALL CARDS |
1, 2 or 3 of each | fills the trunk. Apply with the chest closed |
REVEAL ALL PORTRAITS |
on / off | shows every FREE DUEL portrait so the Drop Table Manager can capture them — then reverts itself. Does not unlock duels |
Neither reveal is an overlay. SHOW OPPONENT HAND clears the one flag that
keeps their hand hidden, so you get their real sprites, names and ATK/DEF in the
game's own renderer. FORCE FACE UP clears the face-down bit, which is real
game state and not a drawing choice — a monster revealed that way genuinely is
face-up and will not flip when attacked. Turning it off stops new reveals; it
does not re-hide what has already turned over.
LIFE POINTS, SHOW OPPONENT HAND and FORCE FACE UP are preferences,
restored on every launch. The other three write live save data, so they are
deliberately not re-applied at startup and decline with a message until a save
is loaded, rather than writing over whatever else is in memory.
Also in the F10 menu, courtesy of PSXRecomp: save states, rewind (F8), an
emulation-speed multiplier, and GAME → FAST LOADING, which cuts disc loads
to near-instant. That one ships off; the setting persists once you turn it
on.
Xbox controllers work out of the box — plug one in, no setup. So do PS4 and PS5 DualShock/DualSense pads (rumble supported on DualSense), and Steam's virtual controller through Steam Input. The game is a PS1 title, so it starts in digital pad mode and the sticks map to the d-pad.
Very old DirectInput-only pads are the exception. DirectInput is off by default because enumerating it stalled startup by up to 40 seconds on some machines. Set
SDL_JOYSTICK_DIRECTINPUT=1in your environment to bring it back.
| PlayStation | Key | PlayStation | Key | |
|---|---|---|---|---|
| D-pad | Arrow keys | L1 | Q |
|
| ✕ Cross | X |
R1 | W |
|
| ○ Circle | S |
L2 | E |
|
| □ Square | Z |
R2 | R |
|
| △ Triangle | A |
L3 / R3 | T / Y |
|
| Start | Enter |
Select | Right Shift |
Mostly you need arrows to move, X to confirm, S to cancel.
| Key | Does |
|---|---|
F10 |
Open the overlay menu — every feature on this page lives there |
F7 |
Save / load state |
F8 |
Rewind |
Tab |
Turbo (hold) |
Alt+Enter or Ctrl+F |
Fullscreen |
F |
Show performance stats |
Numpad + / - |
Volume |
Keys are stored in keybinds.ini next to the executable, in plain text with the
accepted names listed at the top. Edit it and restart. Each input takes an
optional second binding after a comma, so cross = X, Mouse1 binds both.
The download is a setup host — a small executable plus the recompiler and the framework source. It has no game code in it until you supply a disc.
- Run
Yu_Gi_Oh_Forbidden_Memories_Recompiled.exe. - It asks for your disc image and checks it against the CRC32 of the data track this build expects. A mismatch is refused, naming the release it needs and the one you gave it.
- It downloads a compiler if you have none, translates the game to C from your copy, and compiles it.
- It builds into
build-release/and starts the game.
Nothing needs installing first — the setup brings its own compiler and Python, and uses yours if you already have them.
A compiler download, a whole game translated to C, and a real compile happen before you see anything; the console window working away is not hanging. Every run after the first starts immediately.
That wait is the point. This download contains no game code and no game assets — not the executable, not the sprites, not even the font. All of it is produced on your machine, from the disc you own, and never leaves it.
.cue is preferred, with its .bin beside it; .bin, .img, .iso, .car
and .chd also work.
This build is compiled from the USA release, serial SLUS-01411. A PAL,
Japanese or Greatest Hits disc is a different program and cannot run here. The
expected data-track CRC32 is recorded in game.toml as disc_crc, and is
computed once when you choose the disc, not on every boot. To repoint it, use
FILE → CHANGE GAME DISC in the F10 menu.
Scripted and headless runs have no picker and must be told:
Yu_Gi_Oh_Forbidden_Memories_Recompiled.exe --disc "/path/to/game.cue"Also available: --bios <path>, --memcard-dir <path>, --no-launcher.
The framework is a submodule at psxrecomp/, so clone recursively (or run
git submodule update --init --recursive if you already cloned):
git clone --recurse-submodules https://github.com/Unchiga/YuGiOhForbiddenMemoriesRecomp.gitgenerate produces both the recompiled BIOS and the game's C — the
framework ships bios/openbios.bin but not its recompiled form, so a fresh
clone has no BIOS backend until this runs:
python3 psxrecomp/psxrecomp_cli.py generate \
--config game.toml --project-root . --disc /path/to/your.cue
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release
cmake --build build --target psx-runtime(The setup host does exactly this for you — see First run.)
generated/ and the baked sprite and font sources come from your disc; they
are gitignored and must not be published — see NOTICE. The art is
baked at build time, so CMake must know where your disc is: running generate
first is enough. Failing that it tries -DYGOFM_DISC=<path>, the disc this
build directory already verified, then the one recorded beside the executable,
and stops with a message rather than shipping a runtime with no art.
Add -DPSX_DEBUG_TOOLS=ON for a debug build with the TCP inspection server on
127.0.0.1:4370.
cmake -S psxrecomp/recompiler -B build-recompiler -G Ninja -DCMAKE_BUILD_TYPE=Release
cmake --build build-recompiler --target psxrecomp-game psxrecomp-bios
cmake -S . -B build-setup -G Ninja -DCMAKE_BUILD_TYPE=Release -DPSXRECOMP_FORCE_SETUP_HOST=ON
cmake --build build-setup --target psx-runtime
scripts/package_setup_release.sh build-setup <artifact-tag>Writes dist/ygofm-<version>-<tag>.zip. Needs objdump on PATH so bundled
MinGW DLLs can be resolved, and the build directory must be a setup host
build (PSXRECOMP_FORCE_SETUP_HOST=ON), not the game.
psxrecomp/ is pinned to the
ygofm branch of a fork of
PSXRecomp, because this project needs
framework work not upstream yet: the disc-identity gate, registration APIs so a
title owns its own debug commands and guest-space overlays, per-vblank game and
SDL-event hooks (how the Drop Table Manager owns its second window), and a
launcher-less setup host. All additive and intended for upstream; the branch
exists so this repository builds today.
Symbols: symbols.toml → python3 tools/sync_symbols.py → psx_symbols.h
(PSX_FN_*). See psxrecomp/docs/SYMBOLS.md.
PolyForm Noncommercial License 1.0.0 — see LICENSE. Noncommercial use only, and the licence cannot be sublicensed or swapped for a permissive one, because the framework it builds on is offered on the same terms (Copyright © 2026 Matthew Stan).
That covers this project and the framework. It grants nothing in respect of the game, which is Konami's — use only a disc image and BIOS you obtained legally.
Read NOTICE before redistributing anything — particularly before sharing a compiled build, which is not the same as sharing this repository.
Join our newly created Discord, https://discord.gg/SR8qWG9Ve
