GodMode9/arm9/source/game/ifat_common.h

76 lines
1.9 KiB
C

#pragma once
#include "types.h"
// These structures are shared across 3 different inner-FAT (named ifat for brevity) types:
// - SAVE: save data
// - EXSV: extdata
// - IRDB (BDRI): title.db & ticket.db
// Each ifat type has its own type of file and directory entry.
typedef struct {
union {
// this describes data inside the FAT (and thus, in the data region)
struct {
u32 starting_block_index;
u32 block_count;
u32 max_entry_count;
} PACKED_STRUCT;
// this describes data outside the FAT (and thus, outside the data region)
struct {
u64 outfat_offset;
u32 outfat_count;
} PACKED_STRUCT;
};
u32 _pad;
} PACKED_STRUCT IFatTableInfo;
typedef struct {
union {
u32 magic;
char magic_str[4];
};
u32 version;
u64 fs_info_offset;
u64 fs_image_size_blocks;
u32 fs_image_blocksize;
u32 __pad;
} PACKED_STRUCT IFatPreHeader;
typedef struct {
u32 _unk;
u32 data_region_blocksize;
IFatTableInfo dir_hashtbl;
IFatTableInfo file_hashtbl;
IFatTableInfo fat;
IFatTableInfo data_region;
IFatTableInfo dirtable_info;
IFatTableInfo filetable_info;
} PACKED_STRUCT IFatFsInfo;
/*
* for node head,
* - U.index --> index of previous node head.
* - U.flag --> set if this is the first node head.
* - V.index --> index of next node head.
* - V.flag --> whether or not this node has extended entries (multiple entries)
*/
/*
* for extended node,
* - U.index --> index of previous entry in this node.
* - U.flag --> always set.
* - V.index --> index of next entry in this node.
* - V.flag --> never set.
*/
typedef struct __attribute__((packed)) IFatEntryHalf {
u32 index: 31;
u32 flag: 1;
} IFatEntryHalf;
typedef struct __attribute__((packed)) IFatEntry {
IFatEntryHalf U, V;
} IFatEntry;