The Final Fantasy Legend/ROM map

From Data Crystal
Jump to navigation Jump to search

Chip tiny.png The following article is a ROM map for The Final Fantasy Legend.

The following article is a ROM map for The Final Fantasy Legend. Offsets are file offsets in the 128 KiB ROM image. No external header (no copier header). MBC2 controls bank switching: bank 0 fixed at CPU 0000–3FFF, banks 1–7 switchable at CPU 4000–7FFF. All addresses and sizes in hexadecimal.

Sources: saga1dx (layout.link, rom.asm), Fledermaus formffl.txt, Tower Reversed (ffl-meat-theory.txt). Feel free to add any locations you have found that aren't on this document.

This ROM map documents the memory layout of The Final Fantasy Legend (USA version). All addresses are file offsets in hexadecimal within the 128 KiB ROM. The game uses MBC2 for bank switching, with 8 banks of 16 KiB each. CPU addresses differ when code is bank-switched (e.g., Bank 6 file offset $1A008 = CPU address $6008 when Bank 6 is active).

ROM Header

Start End Size Description Notes
0000 00FF 256 B ROM Header Internal name: SAGA, ROM size: 128 KiB, Cart type: MBC2+Battery, Checksum: $BE66

Bank 0 (0000-3FFF) - Fixed Bank

Start End Size Description Notes
0000 00FF 256 B ROM Header See ROM Header section
0100 014F 80 B Startup Code Entry point, interrupt vectors
014E 014F 2 B Global Checksum gcb1, gcb2 (formffl)
0150 03FF 688 B Core Code RST handlers, interrupt routines
0400 0BFF 2 KiB Code / Data Undocumented
0E00 0EFF 256 B Code Meat flavour algorithm at $00E02 (Tower Reversed)
0E16 0E19 4 B Flavour Offsets Batch offsets: 00, 07, 12, 1B (Tower Reversed)
0E7F 0EFF 129 B Code Far-call template (copied to WRAM $C38A)
0F00 3FFF 12.5 KiB Code / Data Undocumented

Bank 1 (4000-7FFF) - Switchable

Start End Size Description Notes
4000 7FFF 16 KiB Code / Data Undocumented (Bank 1)

Bank 2 (8000-BFFF) - Switchable

Start End Size Description Notes
8000 83FF 1 KiB Map Tile Data maptilepos $4000 (formffl)
8800 8BFF 1 KiB Graphics/Sprite Set gsetaddr $08820, gsetstart $08000 (formffl)
8C00 8FFF 1 KiB Sprite Set Data ssetstart $08840, ssetmax $27 (formffl)
9000 91FF 512 B NPC Pics npcpics $09240, piclistmax $17 (formffl)
9200 92FF 256 B Exit Table exitspos $092D0, exitmax $1D9 (formffl)
9800 98CF 208 B NPC Blocks npc1start-npc1end $0985E-$098CF (formffl)
98D0 99FF 48 B Room Metadata roomaddr $098D0, roommax $C7 (formffl)
9A60 A2EF 2.1 KiB Room Data Room data (formffl)
A2F0 AFA4 3.2 KiB NPC Blocks 2 npc2start-npc2end $0A2F0-$0AFA4 (formffl)
AFD3 B2A7 725 B Flavour Combination Table meattable $0AFD3 (formffl) - 25 rows × 29 bytes
B2A8 B437 400 B Result Lists meatlists $0B2A8 (formffl) - 25 lists × 16 bytes
B438 B4FF 200 B Meat Levels spidmlpos $0B438 (formffl) - low nybbles, 0-E hex per monster
B500 B8FF 1 KiB Field Text ftextstart $0B500, ftextend $0B85F (formffl)
B860 B8FF 160 B Field Text Addr ftextaddr $0B860 (formffl)
B900 B9C7 200 B Meat Flavours (LPIC IDs) lpidpos $0B900 (formffl)
B9C8 B9FF 56 B Meat Flavour Specs lspecpos $0B9C8 (formffl)
BA00 BDFF 1 KiB Title Tile Data titlepos $BA00 (formffl) - 2bpp
BE00 BEFF 256 B Sphere Tile Data crystalpos $BE00 (formffl) - 2bpp
BF00 BFFF 256 B Misc Tile Data heartpos $BF00, textpos $F100 (formffl) - trash icon, ©, etc.

Bank 3 (C000-FFFF) - Switchable

Start End Size Description Notes
F100 FD4F 3.2 KiB Font Tile Data FontTileData (saga1dx) - 2bpp
FD50 FFDE 655 B Title Scene Scene_Title (saga1dx) at CPU $7D50
FFDF FFFF 33 B Code FUN_03_7FDF (saga1dx)

Bank 4 (10000-13FFF) - Switchable

Start End Size Description Notes
10000 13FFF 16 KiB Enemy Tile Data EnemyTileData (saga1dx) - 2bpp enemy character tiles

Bank 5 (14000-17FFF) - Switchable

Start End Size Description Notes
14000 1463F 1.6 KiB Character Names cnamepos $14000 (formffl)
14640 14E3F 2 KiB Ability Names anamepos $14640 (formffl)
14E40 14E9F 96 B DTE 1 Tile Spec dte1pos $14E40 (formffl)
14EA0 14EEF 80 B DTE 2 Tile Spec dte2pos $14EA0 (formffl)
14EF0 17B2F 10.8 KiB Status/Scene Text stextstart $14EF0, stextend $17B2F (formffl)
17B30 17D2D 510 B Status Text Addr/Data stextaddr $17B30 (formffl)
17D2E 17E0F 226 B Shop Data shopdata $17D2E (formffl)
17E10 17F8F 384 B Item Prices itemprices $17E10 (formffl)
17F90 17FBF 48 B Guild Data guilddata $17F90 (formffl)
17FC0 17FFF 64 B Status Position/Tail statuspos $17FC0 (formffl)

Bank 6 (18000-1BFFF) - Switchable

Start End Size Description Notes
18000 193BE 4.9 KiB Battle Code Scene_Battle, LoadBattleScreenGraphic (saga1dx)
193BF 193ED 47 B Mutant Effect Dispatch Post-battle effect loop (traced)
193EE 193FF 18 B Learn Ability Handler CPU $53EE (traced)
1A400 1A867 1.1 KiB Encounter List/Data enclistpos $1A400, encdatapos $1A868 (formffl)
1A868 1AAE7 640 B Encounter Data encdatapos to cdatapos (formffl)
1AAE8 1AB27 64 B Character/Monster Table cdatapos $1AAE8, charmax $C7 (200 entries, 8 bytes each)
1B1F0 1B253 100 B Creature Type/Moves crtypepos $1B1F0, movesstart $1B321 (formffl)
1B254 1B293 64 B HP Values hpvalues $1B254 (formffl) - 2 bytes per monster, 16-bit LE
1B294 1B2A3 16 B Silver Values silvvalues $1B294 (formffl)
1B2A4 1B6FF 1.1 KiB Gold Values / Move Data goldvalues $1B2A4, movesend $1B6FF (formffl)
1B700 1BFFF 2.3 KiB Ability Data adatapos $1B700, abilmax $FF (formffl)

Bank 7 (1C000-1FFFF) - Switchable

Start End Size Description Notes
1C000 1C002 3 B Reset Audio ResetAudio (saga1dx) at CPU $4000
1C003 1C62E 1.6 KiB Update Audio / Code UpdateAudio at $4003 (saga1dx)
1C62F 1C69A 108 B Music Table Addr musicaddr $1C62F (formffl)
1C69B 1E86E 6.5 KiB Music Data musicstart $1C69B, musicend $1E86F (formffl)
1EBC7 1EC56 144 B SFX Table Addr sfxaddr $1EBC7 (formffl)
1EC57 1EDFE 424 B SFX Data sfxstart $1EC57, sfxend $1EDFF (formffl)
1F1AC 1FBAF 2.5 KiB Battle Screen Graphic Loader ___LOADBATTLESCREENGRAPHIC (saga1dx) at CPU $71AC
1FC1E 1FCAB 142 B Attack Sequence Addr seqaddrpos $1FC00, seqsstart $1FCAC (formffl)
1FCAC 1FFFF 852 B Attack Sequences seqsend $1FFFF (formffl)

Text Routines (Bank 6, CPU addresses)

Start End Size Description Notes
CPU $6008 CPU $6008 1 B Text Display Routine File $1A008 - Copies $DE00→$C600
CPU $63DE CPU $63DE 1 B Copy Textbox to VRAM File $1A3DE - Copies $C600→VRAM $9900
CPU $5F80 CPU $5F80 1 B Message-ID Path File $19F80 - Builds message from table using ID in E

Field Code Entry Points (formffl)

Start End Size Description Notes
03739 03739 1 B Field Code Table Pointer 1 fcaddr1pos $03739
03769 03769 1 B Field Code Table Pointer 2 fcaddr2pos $03769

Bugfix Patches (formffl)

Start End Size Description Notes
18A04 18E78 Various Combat Tweaks mcsawfix1/2/3, mcexplfix1/2, mcconffix1/2/3, mcstrblfix, mcsmdeffix, mcwmdeffix
18990 18DCC Various Ability Fixes mcxclypfix, mcxclyfixo/c/a, mcmhitefix, mcebarrfix, mccoiltfix, mcshshdfix, mcdrnpcfix
194CE 190D0 Various Rate Fixes mcmuqrfix1/2, mcescrate, mccritrate, mcstlrate1/2, mcsanerate, mcfailrate, mcwidefail
18DE4 19D52 Various Ability Handlers mcsthtwork, mcsthtdenm, mcmrrlimit, mcpoisabil, mcstlabil, mcwrnabil1-4, mcparaabil, mcslepabil

Mutation Data (formffl)

Start End Size Description Notes
1BF00 1BF09 10 B Mutation Frequency mutatefreq $1BF00 (formffl)
1BF0A 1BF0E 5 B Mutation Values mutatevals $1BF0A (formffl)
1BF0F 1BF4F 65 B Mutation Abilities mutateabil $1BF0F (formffl)
1BF50 1BFFF 176 B Creature HP Values creahpvals $1BF50 (formffl)
1F4D7 1F4D7 1 B Fight Music fightmusic $1F4D7 (formffl)

Character Names Table

Character names stored at cnamepos $14000–$1463F (200 entries × 8 bytes). All entries verified via text extraction (2026-02-12).

ID Name ID Name ID Name ID Name
00 FLY 50 OGRE A0 KINGSWRD F0 MUTANT
01 DRGONFLY 51 GIANT A1 MAGICIAN F1 MUTANT
02 HORNET 52 TITAN A2 CONJURER F2 HUMAN
03 MOSQUITO 53 SUSANO-O A3 SORCERER F3 HUMAN
04 CICADA 54 GRIFFIN A4 WIZARD F4 MUTANT
05 MANTIS 55 MANTCORE A5 VAMPIRE F5 MUTANT
06 BARRACUD 56 CHIMERA A6 STEWARD F6 HUMAN
07 PIRANHA 57 NUE A7 GUARD F7 HUMAN
08 SHARK 58 SPHINX A8 HUNTER F8 MUTANT
09 GUNFISH 59 KI-RIN A9 ROBOT F9 MUTANT
0A ELEC 5A BIG AA TROOPER FA HUMAN
0B LEVIATHN 5B GAZER AB ARMOR FB HUMAN
0C CACTUS 5C SEEKER AC MACHINE FC MUTANT
0D P-FLOWER 5D WATCHER AD HUMAN FD MUTANT
0E GARLIC 5E EVIL AE HUMAN FE GEN-BU
0F THORN 5F BEHOLDER AF MUTANT FF SEI-RYU
10 F-FLOWER 60 SKELETON B0 MUTANT 100 BYAK-KO
11 DARKROSE 61 RED B1 HUMAN 101 SU-ZAKU
12 CLIPPER 62 DOKURO B2 HUMAN 102 GEN-BU2
13 BEETLE 63 WARRIOR B3 MUTANT 103 SEI-RYU2
14 ANT 64 BONEKING B4 MUTANT 104 BYAK-KO2
15 ATOM 65 LICH B5 HUMAN 105 SU-ZAKU2
16 SCORPION 66 SLIME B6 HUMAN 106 SU-ZAKU
17 SCARAB 67 JELLY B7 MUTANT 107 ASHURA
18 SHRIMP 68 TORORO B8 MUTANT 108 CREATOR
19 ATOMCRAB 69 GUMMY B9 HUMAN
1A CRAB 6A PUDDING BA HUMAN
1B ICE 6B HI-SLIME BB MUTANT
1C KINGCRAB 6C GARGOYLE BC MUTANT
1D DAGON 6D IMP BD GEN-BU
1E WOLF 6E DEMON BE SEI-RYU
1F JAGUAR 6F DEMOLORD BF BYAK-KO
20 SABERCAT 70 DEMOKING C0 SU-ZAKU
21 SNOWCAT 71 ATHTALOT C1 GEN-BU2
22 BLACKCAT 72 MEDUSA C2 SEI-RYU2
23 FENSWOLF 73 SIREN C3 BYAK-KO2
24 REDBULL 74 LAMIA C4 SU-ZAKU2
25 RHINO 75 NAGA C5 SU-ZAKU
26 TRICERAS 76 SCYLLA C6 ASHURA
27 BEHEMOTH 77 LILITH C7 CREATOR
28 BAKU 78 ZOMBIE
29 GANESHA 79 GHOUL
2A CONDOR 7A MOU-JYA
2B RAVEN 7B WIGHT
2C HARPY 7C GHAST
2D TEN-GU 7D REVNANT
2E GARUDA 7E O-BAKE
2F NIKE 7F PHANTOM
30 SNAKE 80 BURUBURU
31 SERPENT 81 WRAITH
32 ANACONDA 82 SPECTOR
33 HYDRA 83 GHOST
34 KO-RUN 84 WOODMAN
35 JORGANDR 85 CLAYMAN
36 OCTOPUS 86 STONEMAN
37 CLAM 87 IRONMAN
38 AMOEBA 88 FIREMAN
39 AMMONITE 89 MAZIN
3A SQUID 8A ALBATROS
3B KRAKEN 8B EAGLE
3C WORM 8C THUNDER
3D P-WORM 8D COCATRIS
3E CRAWLER 8E ROCK
3F LAVAWORM 8F PHOENIX
40 SANDWORM 90 DRAGON
41 GIGAWORM 91 DRAGON
42 LIZARD 92 DRAGON
43 P-FROG 93 DRAGON
44 GECKO 94 DRAGON
45 DINOSAUR 95 TIAMAT
46 SALAMAND 96 KARATEKA
47 BASILISK 97 PIRATE
48 WERERAT 98 WRESTLER
49 WEREWOLF 99 KELLER
4A CATWOMAN 9A GANG
4B MINOTAUR 9B ASIGARU
4C RAKSHASA 9C SAMURAI
4D ANUBIS 9D NINJA
4E GOBLIN 9E SOLDIER
4F ONI 9F MUSASI

Ability Names Table

Ability names stored at anamepos $14640–$14E3F (256 entries × 8 bytes, 252 used). All entries verified via text extraction (2026-02-12).

ID Name ID Name ID Name ID Name
00 POTION 40 WHIP 80 HONEY C0 TORNADO
01 XPOTION 41 E-WHIP 81 CURE C1 ACID
02 CURE 42 SAW 82 HEAL C2 WHIRL
03 ROD 43 SMG 83 REVIVE C3 STEAL
04 NEEDLE 44 GRENADE 84 CARE C4 TENTACL
05 SYMBOL 45 BAZOOKA 85 RAISE C5 D-BEAM
06 EYEDROP 46 BALKAN 86 TELEPOR C6 FIRE
07 REVIVE 47 MISSILE 87 HEAD C7 ICE
08 ELIXIR 48 N-BOMB 88 NOSE C8 ELEC
09 <3 49 LASER 89 PINCER C9 FLARE
0A ARCANE 4A HYPER 8A BEAK CA STOP
0B DOOR 4B [SHIELD]BRONZE 8B PUNCH CB SLEEP
0C STRONG 4C [SHIELD]GOLD 8C BITE CC AXE
0D AGILITY 4D [SHIELD]SILVER 8D FIN CD S-SKIN
0E HP200 4E [SHIELD]FLAME 8E BONE CE P-SKIN
0F HP400 4F [SHIELD]ICE 8F SWORD CF P-SKIN
10 HP600 50 [SHIELD]DRAGON 90 HARI-TE D0 BURNING
11 [SWORD]KING 51 [SHIELD]AEZIS 91 BASH D1 [43]FIRE
12 [AXE]KING 52 [DTE2:ED]BRONZE 92 SAW D2 [43]ICE
13 [SHIELD]KING 53 [DTE2:ED]GOLD 93 2PINCER D3 [43]ELEC
14 AIRSEED 54 [DTE2:ED]SILVER 94 4HEADS D4 [43]POISON
15 RED ORB 55 [DTE2:ED]ARMY 95 NAIL D5 [43]STONE
16 BLUEORB 56 [DTE2:ED]BAND 96 [DTE1:88]LEGS D6 [43]PARA
17 ERASE99 57 [DTE2:ED]DRAGON 97 2TUSKS D7 [43]WEAPON
18 BLUEKEY 58 [AXE]BRONZE 98 4HORNS D8 [43]QUAKE
19 JAILKEY 59 [AXE]GOLD 99 2SWORDS D9 EXPLODE
1A WHITKEY 5A [AXE]SILVER 9A 6ARMS DA [43]CHANGE
1B ROCK 5B [AXE]DRAGON 9B POISON DB [43]DAMAGE
1C LIGHT 5C [AXE]SUIT 9C POISON DC STONE
1D REPENT 5D [AXE]ARTHUR 9D TUSK DD [43]ICE WP
1E ROM 5E [DTE2:EA]BRONZE 9E P-FANGS DE [43]ALL
1F BOARD 5F [DTE2:EA]GOLD 9F STRICT DF [44]FIRE
20 HAMMER 60 [DTE2:EA]SILVER A0 PETRIFY E0 [44]ELEC
21 [SWORD]LONG 61 [DTE2:EA]GIANT A1 D-FANGS E1 [44]ICE
22 AXE 62 [DTE2:EA]NINJA A2 SL-GAZE E2 SHELL
23 [SWORD]BATTLE 63 [DTE2:EB]HERMES A3 SLEEP E3 SHELL
24 [SWORD]KATANA 64 [DTE2:EB]GETA A4 BLIND E4 DRINK
25 [SWORD]SILVER 65 [DTE2:EB] A5 FLASH E5 CHILL
26 [SWORD]CORAL 66 [AXE]POWER A6 INK E6 POLLEN
27 [SWORD]OGRE 67 WAND A7 HORN E7 ROCKET
28 [SWORD]DRAGON 68 STAFF A8 GAZE E8 BEAM
29 [SWORD]SUN 69 BOOK A9 GAZE E9 MELT
2A [SWORD]FLAME 6A FIRE AA RIDDLE EA SPHERE
2B [SWORD]ICE 6B ICE AB SING EB MIRROR
2C [SWORD]ELEC 6C ELEC AC TAIL EC KINESIS
2D RAPIER 6D FOG AD GAZE ED P-BLAST
2E SABER 6E FLARE AE GAZE EE LEECH
2F L-SABER 6F SLEEP AF DRAIN EF UNCURSE
30 CATCRAW 70 STONE B0 STENCH F0 ESP
31 P-KNIFE 71 DEATH B1 SAND F1 HYPNOS
32 P-SWORD 72 PUNCH B2 TREMBLE F2 BARRIER
33 REVENGE 73 KICK B3 ELECTRO F3 MIRROR
34 [SWORD]VAMPIC 74 BUTT B4 BOTHER F4 POWER
35 [SWORD]DEFEND 75 X-KICK B5 WEB F5 ARMOR
36 [SWORD]RUNE 76 JUDO B6 TOUCH F6 GAZE
37 [SWORD]XCLBR 77 KARATE B7 KISS F7 [DTE1:83]HEADS
38 [SWORD]GLASS 78 TEMPTER B8 KICK F8 [43]PAR WP
39 MASMUNE 79 COUNTER B9 FLAME F9 STEALTH
3A BOW 7A ANTDOTE BA ICE FA WARNING
3B LONGBOW 7B BELL BB THUNDER FB FORSEEN
3C Gr. BOW 7C PAN BC GAS
3D COLT 7D SHOCKER BD ACID
3E MUSKET 7E LEFT BE SQUIRT
3F MAGNUM 7F RIGHT BF QUAKE

Note: Some ability names contain control codes (e.g., [CTRL_FE], [DASH], [SWORD], [SHIELD], [AXE]) and DTE references (e.g., [DTE1:88], [DTE2:ED]) which are decoded during display. Numbers in brackets (e.g., [43], [44]) represent special control codes.

Notes

  • All addresses are file offsets (hex) in the 128 KiB ROM
  • CPU addresses differ when code is bank-switched (e.g., Bank 6 file $1A008 = CPU $6008 when Bank 6 is active)
  • Character table layout: 8 bytes per record, +2..+5 = S,D,A,M (Strength, Defense, Agility, Magic)
  • HP stored separately in hpvalues table at $1B254 (2 bytes per monster, 16-bit little-endian)
  • Text encoding: Tile indices (space=$FF, normalbase=$8A verified, dte1base=$50, dte2base=$C0, borderbase=$F7). Character/ability names use fixed-width 8-byte entries. NORMALBASE is $8A (not $80), verified via "FLY" decoding (2026-02-12).
  • DTE (Double Tile Encoding): DTE bytes expand to 2-byte sequences via lookup tables. DTE decoding is recursive (DTE result can contain another DTE byte). Character names heavily use DTE compression.
  • Mutant post-battle effects: Dispatch loop at $193BF, handlers at $53EE (learn ability), $542F, $546F, $5468, $545A (gain stats), etc.

Sources

  • formffl.txt (Fledermaus ROM editor)
  • saga1dx disassembly (GitHub: akatsuki105/saga1dx)
  • Tower Reversed dumps (https://towerreversed.neocities.org/)
  • Traced execution (meat-eating message, post-battle effects)