UPS vs BPS
UPS and BPS were both created by byuu and both embed CRC32 checksums, so either will refuse to patch the wrong ROM. BPS replaced UPS because UPS stores a plain XOR difference, which balloons when a hack shifts data. BPS understands copies and moves, so its patches stay small.
BPS, from the same author, replaced UPS for good reasons.
| UPS | BPS | |
|---|---|---|
| Verifies your ROM | Yes | Yes |
| Encoding | XOR difference | Copy and insert instructions |
| Handles shifted data well | No | Yes |
| Can resize a ROM | Yes | Yes |
| Carries metadata | No | Yes, optional |
| Still recommended | Only for existing projects | Yes |
Why byuu replaced his own format
UPS fixed the real problem with IPS: it validates the source ROM. But its encoding is a straight XOR of the two files, and XOR has no concept of data moving. Insert one byte near the start of a ROM and everything after it differs, so the patch becomes nearly as large as the ROM.
BPS addresses exactly that. Its SourceCopy and TargetCopy actions describe relocated data as a reference rather than as literal bytes.
What this means in practice
If you have a UPS patch, apply it and move on; it works fine. If you are creating a patch, choose BPS. The only reason to produce UPS today is consistency with an existing project that already distributes it.
Frequently asked questions
Is UPS obsolete?
For new patches, effectively yes. BPS came from the same author to replace it and is better in every dimension. Existing UPS patches remain perfectly usable.
Why is my UPS patch almost as large as the ROM?
The hack shifted data. XOR encoding cannot express a move, so every displaced byte is stored in the patch. This is the limitation BPS was designed to solve.