FFTPatcher suite v0.492

@Glain Glain released this Jan 11, 2017 · 10 commits to master since this release


  • The ENTD tab now labels and uses a combo box for the Experience field instead of listing it as an Unknown field.


  • Fixed an issue where a selected patch would sometimes not patch to the ISO or save state. This would come up intermittently, and was caused by the patch iterator not being reset properly.
  • Fixed an issue where selecting a variable could cause its value to erroneously change to its maximum value if the previously selected variable's value was higher than the newly selected variable's maximum value.
  • Fixed resizing issues with the main form, including an issue where some of the form elements would size incorrectly after minimizing and restoring (and cover the Reload button).
  • Added a text area to display ASM encoder warnings relating to hazards (load delay, etc.); see ASM Encoder/Decoder section below.
  • Highlights any patches containing possible ASM hazards in red; see ASM Encoder/Decoder section below.
  • The "mode" attribute inside the <Location> tag in XML patches now accepts a value of "DATA". This explicitly tells FFTorgASM that the contents are data and shouldn't be checked as ASM.
  • Revamped the functionality for the Patch to Save State feature (the logic is now much simpler and more extensible).


  • File numbering has been changed slightly when using Expand ISO (Added 1 to some of the numbers).

ASM Encoder/Decoder:

  • Added check functionality that warns about various possible hazards:
    • Load delay (Attempt to use a loaded value from memory immediately after loading it; ignored in PSP mode)
    • Unaligned offset (When doing a memory load or store)
    • Using mult or div within 2 commands of mflo/mfhi
    • Adding or subtracting a value from the stack pointer register ($sp, r29) that is not a multiple of 8
    • Putting a branch inside a branch delay slot
  • Added the ability to use %hi(address) and %lo(address) to get the high and low 16-bit parts of an address. The low 16-bit portion is considered to be signed. e.g.:
    .label @address_current_action, 0x80192d90
    # (...)
    lui t0, %hi(@address_current_action)
    # (...)
    lw t0, %lo(@address_current_action)(t0)
    • Note that %hi(address) will be one higher than first 16 bits when the low 16 bit value is negative.
      • e.g. %hi(0x8018f5f0) = 0x8019; %lo(0x8018f5f0) = -0x0a10 (0xf5f0).
      • This means that the %hi,%lo combination works well with load and store commands, and also with the (lui, addiu) pattern, but not with the (lui, ori) pattern.
  • Fixed some issues with the load and store psuedoinstructions when using values between 0x8000 and 0x10000.
  • Modified the error checking functionality to report more errors, particularly when an undefined label is referenced.
  • Now recognizes GTE and COP0 register names as used by pSX's disassembly.
  • Added beqz (branch if equal to zero) and bnez (branch if not equal to zero) psuedoinstructions.
  • Fixed potential issues with byte order that could have occurred if running on a big endian machine.
  • Added "replaceLabels" optional attribute to the tag in XML patches, which, if set to "true", will replace any labels found in the hex with the correct hex address. The idea here is basically to be able to create dispatch tables using a list of labels if so desired.
  • (Undocumented from last release)
    Added "equivalences" which function similar to macros. Defined with .eqv and are replaced with the specified value before encoding. e.g.:
    .label @address_controller_input, 0x80045944
    .eqv %start_button_flag, 0x0800
    # (...)
    lw t0, @address_controller_input
    andi t0, t0, %start_button_flag
    # (...)