|
4 | 4 |
|
5 | 5 | Extract, import and FUSE program for common save format for 3DS, written in rust. |
6 | 6 |
|
7 | | -This project, along with documentation, is still WIP. There are two main components in the project: the library `libsave3ds`, and the FUSE program + extract/import tool `save3ds_fuse` that builds on top of it. The FUSE feature is not available on Windows. |
| 7 | +There are two main components in the project: the library `libsave3ds`, and the FUSE program + extract/import tool `save3ds_fuse` that builds on top of it. The FUSE feature is not available on Windows. |
8 | 8 |
|
9 | 9 | Both the library and the program currently supports the following operations: |
10 | | - - Full filesystem operation on save data and extdata stored on NAND, on SD or standalone |
| 10 | + - Full filesystem operation on save data and extdata stored on NAND, on SD, on cartridge or standalone |
11 | 11 | - Editing title database and tickets |
12 | 12 |
|
13 | 13 | Note that the supported NAND format is in unpacked cleartext filesystem. If you want to read/write on the original NAND FAT image, you need to use other tools to extract the NAND data, or map another layer of virtual filesystem (e.g. https://github.com/ihaveamac/ninfs) |
14 | 14 |
|
15 | | -TODO: |
16 | | - - Complete cartridge save data support |
17 | | - |
18 | 15 | ## Build |
19 | 16 |
|
20 | 17 |
|
@@ -86,6 +83,8 @@ You can put options in arbitrary order. The detail description of them are: |
86 | 83 | - `--game FILE`: the game dumped from the cartridge in CCI format, required by cartridge save |
87 | 84 | - `--priv FILE`: the private header dumped from the cartrdige, required by cartridge save |
88 | 85 | - `--key FILE|HEX`: AES slot 0x2F key Y for decrypting v6.0 cartridge save |
| 86 | + - `--key19x FILE|HEX`: AES slot 0x19 key X for decrypting New3DS exclusive cartridge save |
| 87 | + - `--key1ax FILE|HEX`: AES slot 0x1A key X for decrypting New3DS exclusive cartridge save |
89 | 88 |
|
90 | 89 | `FORMAT_PARAM` is an optional group of options in the form of `--format param1:value1,param2:value2,...`, used in conjuntion with mount mode or import mode. When the flag `--format` presents, the archive will be formatted using the given parameters before mounting/importing. This is useful for creating a completely new archives. If an archive already exists in the place, it will be deleted. The difference between `--import` and `--import --format` is that, although both clearing the content, `--import` retains the archive layout and capacity that depends on the formatting parameters, while the addition `--format` flag can change the layout and capacity. |
91 | 90 |
|
@@ -146,6 +145,9 @@ Prohibited characters specific to Windows are not taken care of. They are usuall |
146 | 145 |
|
147 | 146 | Files in title database archives are named with title ID in 16-digit hex. File names that contains non-hex characters or that is too long are rejected. |
148 | 147 |
|
| 148 | +### Cartridge save wear leveling |
| 149 | +The exact mechanism of Card1 wear leveling is unclear yet. When writing a Card1 cartridge save data, save3ds will simply clear the journal and flush everything into the block map, without updating the allocation count or the two unknown integers at the beginning. 3DS seems fine with this in my test, but it might cause unexpected things. |
| 150 | + |
149 | 151 | ### Extdata file size |
150 | 152 |
|
151 | 153 | Due to the format design, extdata does not support resizing files natively on 3DS, nor creating files with zero size. This program works around the issue by deleting and recreating files on resizing, which is stupidly slow if the user appends a file on every write operation. Zero-size files created by this program can't be opened on 3DS either, so one needs to make sure there is no such file before importing the data back to 3DS. |
|
0 commit comments