Savegames: Difference between revisions
Moosehunter (talk | contribs) No edit summary |
→Extra data: prior save struct link fix pointed to wrong struct |
||
(5 intermediate revisions by 2 users not shown) | |||
Line 67: | Line 67: | ||
== AES CMAC header == | == AES CMAC header == | ||
This is internally referred to as MasterHeaderMac. | |||
{| class="wikitable" | {| class="wikitable" | ||
|- | |- | ||
Line 432: | Line 435: | ||
| 0x00 | | 0x00 | ||
| 0x40 | | 0x40 | ||
| [[Filesystem_services# | | [[Filesystem_services#SaveDataAttribute|SaveDataAttribute]] | ||
|- | |- | ||
| 0x40 | | 0x40 | ||
Line 658: | Line 661: | ||
== File allocation table == | == File allocation table == | ||
The savedata FS uses | The savedata FS uses an allocation table to keep track of block allocation. This FAT contains doubly-linked lists of the blocks allocated to each file. Each entry in the FAT is 8 bytes in size. | ||
FAT entry 0 is reserved for the list of free blocks. Because of this, the FAT entry for block n is found at FAT index n+1. The indexes stored in FAT entries refer the index of the next/previous FAT entry in the chain, not the index of the next/previous block. | FAT entry 0 is reserved for the list of free blocks. Because of this, the FAT entry for block n is found at FAT index n+1. The indexes stored in FAT entries refer the index of the next/previous FAT entry in the chain, not the index of the next/previous block. | ||
The FAT header is internally called AllocationTableControlArea. The FAT itself is called AllocationTableMeta. The actual save FS data is called AllocationTableData. | |||
=== File allocation table header === | === File allocation table header === | ||
Line 705: | Line 710: | ||
| 4 | | 4 | ||
| File table block index | | File table block index | ||
|- | |||
|} | |||
=== File allocation table entry === | |||
{| class="wikitable" | |||
|- | |||
! Start | |||
! Length | |||
! Description | |||
|- | |||
| 0 | |||
| 4 (High bit) | |||
| Set if entry is the first entry in the list. | |||
|- | |||
| 0 | |||
| 4 (Lower 31 bits) | |||
| Previous entry index. First entry in list if 0. | |||
|- | |||
| 4 | |||
| 4 (High bit) | |||
| Set if the allocation segment has multiple blocks. | |||
|- | |||
| 4 | |||
| 4 (Lower 31 bits) | |||
| Next entry index. Last entry in list if 0. | |||
|- | |||
|} | |||
If the allocation segment has multiple blocks, the first entry will be followed by a range descriptor entry. The last entry in the segment will contain a duplicate of this entry. | |||
{| class="wikitable" | |||
|- | |||
! Start | |||
! Length | |||
! Description | |||
|- | |||
| 0 | |||
| 4 (High bit) | |||
| Always set. | |||
|- | |||
| 0 | |||
| 4 (Lower 31 bits) | |||
| First entry in this segment. | |||
|- | |||
| 4 | |||
| 4 (High bit) | |||
| Never set. | |||
|- | |||
| 4 | |||
| 4 (Lower 31 bits) | |||
| Last entry in this segment. | |||
|- | |- | ||
|} | |} |