Skip to content

Super Nintendo · Assembly

Bank C3 Compendium

By Novalia Spirit

Final Fantasy III · All hacks & resources →

About this project

A set of fully commented disassemblies and complementary documents pertaining to bank C3 from the SNES and SFC versions of Final Fantasy VI. The bank handles all of the field menus, as well as ending scenes that are beyond the scope of the event program.

The archive includes:

  • An optimized disassembly of bank C3 that saves more than 14,200 bytes while retaining the simplicity and flexibility of the original code.
  • An optimized disassembly of bank C3 that seeks to maximize free space without regard for practicality. As it stands, the bank is reduced by 26,054 bytes, and is consequently 42.3% smaller.
  • An alternative version of the heavily optimized disassembly that sacrifices an insignificant amount of space in favor of definitions for global text arrays.
  • A reassemblable, unmodified disassembly of bank C3. Recommended for projects of limited scope or for testing purposes. Useful for reverting modifications, for locating data, or for determining loop points or entry points.
  • A basic disassembly of bank C3. The main purpose of this document is to provide the address of every instruction in an unmodified game.
  • A basic disassembly of bank D4, which acts as an extension of bank C3. A reassemblable, unmodified version is also available.
  • A basic disassembly of bank C2, a hodgepodge in terms of content, purged of code and data irrelevant to bank C3.
  • A complete memory map, one for the menus and one for the ending, that details the structure of both RAM and VRAM.
  • Scripts, tools, character tables, and define-type directives for compilation purposes.
  • A folder that contains two copies of bank C3, one for each console, that have been specially formatted for side-by-side comparison. Also included is a list of noteworthy version differences.
  • Release notes that include additional information such as abbreviations and compilation instructions. A list of bug findings as well as content that has been cut may be added in the future.

Given the abundance of memory available, the implementation of labels for RAM addresses was dismissed as impractical. In the same vein, the size of every instruction is not explicitly specified at this time.

Original game requirements

See the release instructions.

Creator credits

Novalia Spirit
Listed creator

RELEASE 1.0

Readme & instructions

ff6_diff_c3_notes.txt

Instructions: 1. Download Notepad++ (v6.9.2): https://notepad-plus-plus.org 2. In the preferences, set the tab size to eight spaces.

Read moreRead less
Instructions:
1. Download Notepad++ (v6.9.2): https://notepad-plus-plus.org
2. In the preferences, set the tab size to eight spaces.
3. In the style configurator, set the font to Lucida Console (normal), size 10.
4. Open both disassemblies in Notepad++.
5. Right-click on the tab for the SNES document and choose "Move to Other View."
6. Select "View" in the menu, then enable "Synchronize Vertical Scrolling."

Both documents should now be displayed on a split screen and should scroll
simultaneously. Simply search for "===" to find parameter changes, or for
"%%%" to find instructions or data exclusive to the current document.


Noteworthy local differences:
 • SNS: Actor classes were removed.
 • SNS: Button Settings menu was removed.
 • SNS: SwdTech naming menu was removed.
 • SNS: Various oversights led to new bugs.
 • SFC: Party gear overview lists body parts.
 • SFC: Actor naming menu has two pages of choices.
 • SFC: No "Please enter a name." in the actor naming menu.
 • SNS: Most narrow windows were expanded to accommodate for longer strings.
 • SFC: Buy menu adds a separator between item list and quantities on hand.
 • SNS: Cursor in gear menus points at body parts rather than equipped items.
 • SNS: Partial bug fix for lingering mosaic when switching members with L or R.
 • SNS: Magic and rare item lists have two columns rather than three.
 • SNS: Mastery percentages in Magic menu are preceded by an ellipsis.
 • SFC: Magic list separates spell types with a blank row.
 • SNS: Rare item list has fewer slots as a result of having fewer columns.
 • SNS: Inventory and Lore list have one column rather than two.
 • SNS: Inventory lists item classes to fill the void caused by the above.
 • SNS: Description window in Skills menu allows for two lines instead of one.
 • SNS: The above causes scrollable skill lists to contain one less onscreen row.
 • SNS: Title window in skill menus is moved to the other side and is shorter.
 • SNS: Changes made to Skills menu affect the bottom position of the scrollbar.
 • SFC: List of available equipment displays quantities owned.
 • SFC: Equip menu lists Gauntlet, Genji Glove, and Merit Award effects in use.
 • SNS: Actor name in Equip and Relic menus is drawn onto the portrait.
 • SNS: Spell types in Config menu are preceded by a magic icon.
 • SNS: Spell types in Config menu are preceded by A, B, C rather than 1, 2, 3.
 • SNS: Two-dot leader is replaced with an ellipsis in some menus.
 • SFC: Spell elements are depicted using kanji instead of icons.
 • SFC: "Time" in the main menu and save file menus is fully capitalized.
 • SFC: "Empty" on blank save files is fully capitalized.
 • SNS: Portrait in Status menu is lower.
 • SNS: Status info in Status menu is displayed where the actor class would be.
 • SNS: Inconsistent spacing around two-dot leaders in the Status menu.
 • SNS: Changes "rate" to "%" after "Evade" and "MBlock" (redundant in Status menu).
 • SFC: Gear data menu appends "OK" to "SwdTech," "Runic," and "2-hand."
 • SNS: Some actor names in the ending differ, such as "Terra" instead of "Tina."
 • SNS: Translator's name was added to the credits.
 • SNS: List of special thanks in the ending differs, which affects the timing.
 • SNS: The small font for the credits is thicker.
 • SNS: "coordinater" is now "coordinator" in the credits.

Noteworthy global differences:
 • SNS: 256th inventory slot was made inaccessible to fix equip bugs.
 • SNS: The black and gray magic icons are mirrored horizontally.
 • SFC: No real VWF; all large characters in a string share the same width.
 • SNS: Monospaced digit characters are retained, but were touched up.
 • SNS: Monospaced capital letters are retained, but were touched up.
 • SFC: Monospaced font has no ellipsis.

ff6_bank_c3_notes.txt

Final Fantasy VI Bank C3 Compendium By Novalia Spirit Contact: novaliaspirit (AIM, Hotmail) Released on July 11, 2016 Last updated on October 11, 2016 Table of contents 1. Project description 2. Disassembly notes 2.1 General notes 2.2 Limitations and warnings 2.3 Optimized disassembly 2.4 Corrected coding mistakes 2.5 Optimizations ruled out 2.6 Menu variables freed 2.7 Ending variables freed 2.8 SRAM variables freed 2.9 Terminology 3.

Read moreRead less
Final Fantasy VI
Bank C3 Compendium

By Novalia Spirit
Contact: novaliaspirit (AIM, Hotmail)

Released on July 11, 2016
Last updated on October 11, 2016


Table of contents
1. Project description
2. Disassembly notes
  2.1 General notes
  2.2 Limitations and warnings
  2.3 Optimized disassembly
  2.4 Corrected coding mistakes
  2.5 Optimizations ruled out
  2.6 Menu variables freed
  2.7 Ending variables freed
  2.8 SRAM variables freed
  2.9 Terminology
3. Memory map notes
4. Assembler notes
  4.1 Compilation instructions
  4.2 Noteworthy bugs
5. Acknowledgements
6. Legal notice


###############################################################################
                            1. Project description
###############################################################################

A set of fully commented disassemblies and complementary documents pertaining
to bank C3 from the SNES and SFC versions of Final Fantasy VI. The bank handles
all of the field menus, as well as ending scenes that are beyond the scope of
the event program.

The archive includes:

 • An optimized disassembly of bank C3 that saves more than 14,200 bytes while
   retaining the simplicity and flexibility of the original code.

 • An optimized disassembly of bank C3 that seeks to maximize free space
   without regard for practicality. As it stands, the bank is reduced by
   26,054 bytes, and is consequently 42.3% smaller.

 • An alternative version of the heavily optimized disassembly that sacrifices
   an insignificant amount of space in favor of definitions for global text
   arrays.

 • A reassemblable, unmodified disassembly of bank C3. Recommended for
   projects of limited scope or for testing purposes. Useful for reverting
   modifications, for locating data, or for determining loop points or entry
   points.

 • A basic disassembly of bank C3. The main purpose of this document is to
   provide the address of every instruction in an unmodified game.

 • A basic disassembly of bank D4, which acts as an extension of bank C3. A
   reassemblable, unmodified version is also available.

 • A basic disassembly of bank C2, a hodgepodge in terms of content, purged of
   code and data irrelevant to bank C3.

 • A complete memory map, one for the menus and one for the ending, that
   details the structure of both RAM and VRAM.

 • Scripts, tools, character tables, and define-type directives for compilation
   purposes.

 • A folder that contains two copies of bank C3, one for each console, that
   have been specially formatted for side-by-side comparison. Also included is
   a list of noteworthy version differences.

 • Release notes that include additional information such as abbreviations and
   compilation instructions. A list of bug findings as well as content that has
   been cut may be added in the future.

Given the abundance of memory available, the implementation of labels for RAM
addresses was dismissed as impractical. In the same vein, the size of every
instruction is not explicitly specified at this time.


###############################################################################
                             2. Disassembly notes
###############################################################################

General notes:
 • A tabulation is expected to correspond to eight spaces.
 • Functions called during an NMI are marked with "(NMI)."
 • Select is not listed but is interpreted as R (excludes $04 and $05).
 • Positions and slot numbers are counted from one and upward, not from zero.
 • SFC: Strings with diacritics must be positioned a row higher than intended.

Limitations and warnings:
 • Item descriptions that exceed 64 characters will corrupt shop prices.
 • Rare item count will likely be inaccurate if no empty slot (fix: C3/839A).
 • Merit Award effect is automatically applied to Guest Slot 2 (see C3/9C5F).
 • Gear data menu can only display up to six elements per category (C3/8921).
 • Target of the 'Optimize Gear' event command must be in the active party.
 • Palette of Locke's portrait in Lineup menu is affected by his disguise.
 • Dance list retains last palette used; normally that of "Dance" in menu list.
 • C3/7173 lacks TDC (forced member check for Lineup menu choice 1).
 • The decompression routine in bank C2 changes the WRAM bank.

Optimized disassembly:
 • This has not been tested on hardware.
 • Bug fixes have not been implemented; such a decision is left to the user.
   However, two minor sprite position bugs had to be fixed as a result of an
   optimization. One affects the scrollbar in the Espers menu, while the other
   concerns one of the playing cards during Setzer's ending scene. Another bug
   that was fixed for the same reason is the fact that key presses are ignored
   during the prologue in certain situations. Likewise, I had to fix a bug that
   caused the game to be saved to the wrong save slot while moving the cursor.
   I also ended up fixing the timing for the glowing eye in the helmet during
   Gogo's ending scene, and the NMI-based variant of the "Equip Anything" bug.
   Some of these bugs are only fixed in the heavily optimized disassembly.
 • The transparent color at C3/10F4 must be kept for the final airship scene.
 • Variables $B7-$C2 now reflect the order of register addresses.


The following lists are for the heavily optimized disassembly.

Corrected coding mistakes:
 • Three names were missing in the special thanks as a consequence of a
   miscalculated string count in the comments. To fix this manually, change
   "BEQ credx6b" to "BEQ credx9" at C3D928. (Oct. 11, 2016)
 • Item menu failed to delete description after returning from item usage menu
   because of a stock shortage. See updated version of C3572A. (Oct. 11, 2016)
 • Member swap animation always assumed the first choice was above the second.
   Change "ASL A" to "LDA #$18" at C32491 to fix this. (Oct. 11, 2016)
 • Spacing between status icons was too wide. Change ADC #$10 to ADC #$0A
   at C3628B. (Oct. 11, 2016)
 • Inconsequential: "ASL A, BEQ" -> "ASL A, BPL" at C37701. (Oct. 11, 2016)

Optimizations ruled out (vastly incomplete):
 • Reorder entry points to remove JMP C3001B. Requires editing other banks.
 • Switch code in D4 with data in C3, and optimize the code accordingly.
 • #$FFFF -> $02 (always holds this value except in main menu on world map).
 • C3/69BA: Could drop pointer tables and simply add Y to X before looping.
 • Append two-dot leader to some or all stat names (SFC does so in some cases).
 • Adjust tilemap pointers to remove any "INC A" after $E6. (for SFC diac.)
 • Reorder button checks in various functions to allow for LSR or ASL.
 • Might be able to free space and $46:4 by using timer $20 instead of $22.
 • Freezing CGRAM may not serve any purpose other than saving cycles.
 • Remove unused entries at C3/C406. Requires editing the event script.
 • Setting direct page to 0 in the NMI function might be redundant.
 • Do SEC in advance before calling any animation queue function.
 • Setting the data bank register to 7E by default might save space.
 • C3/10D4: Redirect to free space (high bit is unused so #$FFFF works).
 • C3/10F4: Redirect to a matching sequence in the ROM.
 • C3/02DB: STZ $0205 would have the same effect.
 • Ones digit at C3/8854 and beyond is always zero.
 • Clearing item quantities seems pointless.

Menu variables freed:
 • $22 (Lineup)
 • $28 (Lineup's Status menu)
 • $2B, $2C
 • $2F, $30
 • $49, $4C (Lineup)
 • $51, $52
 • $57, $58
 • $5A, $5B, $5D (Lineup)
 • $5F (Espers menu)
 • $64 (Status, Equip, Relic, Item, Cmd.Set)
 • $65, $79 (Status)
 • $79-$7B, $8D-$8F, $90 (Lineup)
 • $97, $98 (zeroed in D4)
 • $99 (Relic, Lineup)
 • $9A (Lineup)
 • $9E, $9F (Save menu)
 • $B0, $B1 (item usage menu)
 • $C9 (Equip)
 • $CB, $CC
 • $D1
 • $0201 (joypad decoding in battle; must delete C1/1B8F)
 • $020F
 • $0213-$021A, $0220-$0223, $0229, $022A
 • $1D50-$1D53
 • $1DC7, $1DC8
 • $3040-$3048 (Equip, Relic)
 • $374A,X
 • $9DB9-$9DE4 (Lineup)
 • $9E09-$9E19 (gear data menu)
 • $9E51-$9E7C (Lineup)
 • $AA89-$AA8C

Ending variables freed:
 • $2B, $2C
 • $2F, $30
 • $4D-$50
 • $53, $54
 • $58, $59
 • $60, $61 (zeroed in D4)
 • $374A,X

SRAM variables freed:
 • $307FFE, $307FFF (SRAM marker)


Terminology:
 • ...           Pointless code or data
 • 2H            Two-handed
 • 2Rx1B         2 registers, 1 byte each
 • Adr           Address
 • Alias         Actor name defined by player
 • Anim          Animation
 • b1            Bit 1
 • B1            Byte 1
 • Bar           Scrollbar
 • BG1a          Background 1, tilemap a
 • Blinker       Blinking hand cursor
 • Box           Text box (menu window)
 • bpp           Bits per pixel
 • BRT           Brightness
 • BWD           Backward
 • C-            Clear Carry flag
 • CCW           Counterclockwise
 • Cfg           Config
 • CH1           Channel 1
 • Char          Character
 • Cmd           Command
 • Col           Column
 • Coord         Coordinate
 • CW            Clockwise
 • D-Pad         Directional pad
 • DB            Data bank
 • Desc          Description
 • Desig         Designation
 • DP            Direct page
 • Draw          Build tilemap for
 • Dst           Destination
 • Elem          Element
 • Fn            Function
 • Fract         Fractional
 • Frontview     Facing the camera
 • FWD           Forward
 • FWF           Fixed-width font
 • GFX           Graphics
 • H             Horizontal
 • HB            High byte
 • Hi-fork       Fork above main function
 • Indir         Indirect
 • Init          Initialize
 • INT           Interrupt
 • L             Left
 • LB            Low byte
 • Loc           Location
 • LSB           Least significant bit
 • M7            Mode 7
 • MB            Middle byte
 • Min           Minimum
 • MS            Main screen
 • MSB           Most significant bit
 • Msg           Message
 • MT            Multitarget
 • Num           Number
 • OBJ           Object
 • Optimzn       Optimization
 • Pad           Joypad
 • Pal           Palette
 • Prio          Priority
 • PS            Processor status
 • Ptr           Pointer
 • Px            Pixel
 • Qty           Quantity
 • R             Right
 • Rearview      Viewed from the back
 • Rel           Relative
 • SFC           Super Famicom (version)
 • SFX           Sound effects
 • Sideview      Viewed from the side
 • Skin          Wallpaper
 • Spd           Speed
 • Specs         Specifics
 • Src           Source
 • ST            Single target
 • Stock         Inventory
 • Sub           Subtract
 • Sub:          Function in a function
 • Tbl           Table
 • Upload        Transfer to VRAM
 • User          Player
 • V             Vertical
 • V1            Version 1
 • Var           Variable
 • Vol           Volume
 • VWF           Variable-width font
 • Win           Window
 • WIP           Work in progress
 • WR            Write


###############################################################################
                              3. Memory map notes
###############################################################################

 • Unlisted flags are unused.
 • An unspecified condition usually implies "if nonzero."
 • A vertical bar denotes an array. Refer to the next line for the range.
 • Alternate purposes for $00-$FF in Lineup menu were omitted for readability.
 • Some variables may serve a different purpose in the Super Famicom version.
 • $11A0 only covers actor data. Refer to bank C2 doc for alternate purposes.


###############################################################################
                              4. Assembler notes
###############################################################################

Compilation instructions (SNES):
1. Download Asar (1.35): http://www.romhacking.net/utilities/964
2. Extract asar.exe to a new folder.
3. Copy the .asm disassembly of your choice to the folder.
4. Copy ff6_bank_c3.tbl and ff6_bank_c3_defs.asm to the folder.
5. Copy a clean dump of the SNES ROM (1.0 or 1.1) to the folder.
6. Change its extension to .sfc if the ROM is headerless, otherwise use .smc.
7a. Execute asar.exe and follow the program's instructions.
7b. Execute compile.bat (see step 6 below to define file names).

Compilation instructions (SFC):
1. Extract the "sfc" folder from the archive.
2. Download Asar (1.35): http://www.romhacking.net/utilities/964
3. Extract asar.exe to the "bin" subdirectory.
4. Copy a clean dump of the SFC ROM to the "sfc" folder.
5. Change its extension to .sfc if the ROM is headerless, otherwise use .smc.
6. Open "compile.bat" in a text editor and rename "ff6_bank_c3j_opti.asm" and
   "ff6j.smc" in the code if need be. Both names must not contain spaces.
7. Execute compile.bat after applying the changes.

Open "charset.awk" in a text editor to consult or modify the character encoding
for strings enclosed in vertical bars, but keep in mind that substitutions are
not simultaneous.

Consider removing both "del" commands in the batch script to preserve the
temporary files; their file size provides an alarm for the corruption issue
described below, as making a mistake while modifying one of the scripts may
lead to a blank disasssembly.

Finally, be aware that Notepad adds a header (BOM) to UTF documents, which
may cause some issues.


Noteworthy bugs:

 • From my experience, Asar will silently fail to convert text preceded by a
   label and four or more spaces, unless followed by a hex value, such as
   that of the terminator. As a workaround for the issue, a colon can be added
   to the indentation, as was done at C3/5CF7 in the vanilla SNES disassembly.

 • If the very last instruction in bank C3 would be written to C4/0000, which
   is protected by the warnpc directive, assembling will abort as expected, but
   the console will return an "invalid command" error instead of warning about
   the crossed boundary.

 • If a string contains a character that is missing from the .tbl document, a
   random hex value will be written to the ROM without notice.

 • Asar updates the checksum and its complement at C0/FFDC, but the resulting
   values are incorrect.

 • Asar accepts blank .asm files, but assumes a LoROM in the absence of the
   "hirom" directive. As a result, the checksum is written to adddress C0/7FDC,
   and consequently corrupts a portion of the field dialogue handler.


###############################################################################
                              5. Acknowledgements
###############################################################################

Anomie, for his register map.

Pelrun, for his disassembler, DisPel.

Geiger, for his debug builds of Snes9X.

Martin Korth, for the various data viewers in no$sns.

Assassin, for his bank C2 disassembly, which helped to identify a number of
battle variables for my partial disassembly of the bank.

The authors of the various tools included in the bin folder.


###############################################################################
                              6. Legal disclaimer
###############################################################################

The contents of the documents included in the archive cannot be reproduced
without the written consent of the author, unless for personal purposes.
Permission to distribute the archive and its contents is granted exclusively
to www.romhacking.net.

© 2016 Jame Coban. All rights reserved.

Download ff6_diff_c3_notes.txt ↓

Download ff6_bank_c3_notes.txt ↓

FROM THE COMMUNITY

Player reviews

0 reviews
No ratings yet

Played this project? Tell other players how it holds up.

Your take on Bank C3 Compendium

Spam has been overwhelming. To help us approve your review, sign up and introduce yourself in the Introductions forum so we know you’re not a bot.

Sign in with your Retro Replay account to rate this project and share your experience.

Sign in to review