mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-10-01 14:58:14 +00:00
Most UMDs carry a firmware updater in PSP_GAME/SYSDIR/UPDATE, so the fonts can come from a game the user already has instead of a separate download. Its DATA.BIN turns out to be exactly the same archive as a downloaded updater's DATA.PSAR, just without the PBP around it. UnpackUpdater() replaces UnpackUpdaterPBP() and takes any of the three shapes: a downloaded EBOOT.PBP, a bare DATA.BIN/PSAR, or a disc image, which it opens with the block device and ISO filesystem we already have and looks in SYSDIR/UPDATE. ReadUpdaterVersion() answers the version from the PARAM.SFO next to the archive without decrypting anything, which is cheap enough to check every disc with. Testing across eras turned up three things the 6.61 updater alone never showed: Old archives name entries differently. 3.x groups them by model - "com:00123", "01g:00005" - with "<group>:00000" as that group's file list, keyed on just the number, separated by '|' rather than ',' and with paths written "flash0/font/x" rather than "flash0:/font/x". 1.x skips the indirection and stores real paths. Both are handled now. Which numbers are file lists isn't fixed either. 6.61 uses 1-11, but 6.00 has real files at 00010-00012, which were being taken for corrupt lists and dropped. A list always decrypts, since the PRX layer under it validates a hash, so a failure there now just means "this is a file" - which recovered 3 files each on 6.00 and 6.20. And the walk ran one record past the end. The archive header says how long the records really are, and both archives have a few bytes of padding after that. Read from the discs of Coded Arms (1.50), Ace Combat X (2.81), Crisis Core (3.95), Assassin's Creed Bloodlines (6.00) and BlazBlue (6.20), plus the downloaded 6.61. Every one gives up its fonts - 17 of them on 1.50, 19 on 2.81, 21 from 3.95 on. All but two are clean: 1.50 has one .rco whose block won't decrypt, and 2.81 has one name no list claims. Co-Authored-By: Claude Opus 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01GZq8ZtJmFY7bkX5FVkr3P9