For whatever reason transactional update blocks are ignored by Alcor Micro assemblers. These updates hold the last modifications written to the device that weren’t committed to a full block. Controllers use these blocks in their wear leveling/garbage collection routines to reduce erasing and writing a single block. In an effort to help develop better assemblers here are some quick insights.
Parameters Controller: AU6987HL Page Size: 0x2000 Block Size: 0x180000 Bank Size: 0x400
Logical blocks 0x3f8 though 0x3fb in each bank contain the update blocks for that bank stored in page increments starting at Page 1. Page 0 in these blocks contains metadata. ushort contains the logical block number in little endian. For example: logical block 0x001d
00 1d 1d 00 69 86 00 00 00 00 00 05 40 01 01 00
Using your favorite SA parser we skip the first page containing metadata. Byte in the SA is the page offset in the logical block number. Simply overwrite the data on page boundaries in the master image with the updated data. Once you read an empty page your done with that block.
Dump 0x05580000 (2ac0) Block 03f9 SA f9 f0 00 00 Dump 0x05582000 (2ac1) Block 01b7 SA b7 d0 01 00 (lBlk: 0x1d page 0xb7) Dump 0x05584000 (2ac2) Block 01b7 SA b7 d0 02 00 (lBlk: 0x1d page 0xb7) Dump 0x05586000 (2ac3) Block 01b8 SA b8 d0 03 00 (lBlk: 0x1d page 0xb8)
That’s how its done, not very complicated.