Savegames: Difference between revisions

No edit summary
Shchmue (talk | contribs)
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#Save_Struct|Save Struct]]
| [[Filesystem_services#SaveDataAttribute|SaveDataAttribute]]
|-
|-
| 0x40
| 0x40
Line 658: Line 661:
== File allocation table ==
== File allocation table ==


The savedata FS uses a fairly basic allocation table to keep track of block allocation. The FAT contains doubly-linked lists of the blocks allocated to each file. Each entry in the FAT is 8 bytes in size.
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.
|-
|-
|}
|}