Save data structure in Generation IV

The save data structure in the Nintendo DS is stored as a .SAV file, which is broken up into two pairs of blocks. Each pair has one small block, and one big block. The offsets for are different from.

In Diamond and Pearl, the first small block starts at 0x00000 and ends at 0x0C0FF, the first big block starts at 0x0C100 and ends at 0x1E2DF. In Platinum, the first small block starts at 0x00000 and ends at 0x0CF2B, the first big block starts at 0x0CF2C and ends at 0x1F10F. The second pair of blocks are at the same address plus 0x40000 for all the three games.

One block pair is always a backup of the other block pair.

Small block
The small block has the following data:

Item placeholders
In these placeholders, each item takes 4 bytes with the following structure: Each item has a unique ID to get identified. See the list of items by index number (Generation IV) for these IDs.

Footer
The last 0x14 bytes of each block (small and big) are used as a footer. It has the following structure:

Checksum
The game uses a algorithm for the checksums. These checksums are calculated from a whole block without taking the footer.

Example
SMALL BLOCK 1 D1 01 00 00 | 42 04 00 00 | 00 C1 00 00 | 23 06 06 20 | 00 00 | 7E 7A BIG BLOCK 1 D0 01 00 00 | F1 02 00 00 | E0 21 01 00 | 23 06 06 20 | 01 00 | 0D 39

SMALL BLOCK 2 D0 01 00 00 | 41 04 00 00 | 00 C1 00 00 | 23 06 06 20 | 00 00 | 0C 7F BIG BLOCK 2 D1 01 00 00 | F2 02 00 00 | E0 21 01 00 | 23 06 06 20 | 01 00 | F6 8A

Since the value of is higher in small block 1 (42 04 00 00 > 41 04 00 00), that is the current small block. Then, by matching the value of (which is D1 01 00 00) to the big block. This means that the current big block is actually big block 2 (assuming the big block's checksum is correct).