Skip to content

Commit 6407418

Browse files
committed
update readme
1 parent aeb2e66 commit 6407418

File tree

2 files changed

+9
-7
lines changed

2 files changed

+9
-7
lines changed

README.md

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,14 @@
44

55
Extract, import and FUSE program for common save format for 3DS, written in rust.
66

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.
88

99
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
1111
- Editing title database and tickets
1212

1313
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)
1414

15-
TODO:
16-
- Complete cartridge save data support
17-
1815
## Build
1916

2017

@@ -86,6 +83,8 @@ You can put options in arbitrary order. The detail description of them are:
8683
- `--game FILE`: the game dumped from the cartridge in CCI format, required by cartridge save
8784
- `--priv FILE`: the private header dumped from the cartrdige, required by cartridge save
8885
- `--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
8988

9089
`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.
9190

@@ -146,6 +145,9 @@ Prohibited characters specific to Windows are not taken care of. They are usuall
146145

147146
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.
148147

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+
149151
### Extdata file size
150152

151153
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.

save3ds_fuse/src/main.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1242,13 +1242,13 @@ fn main_inner() -> Result<(), Box<dyn std::error::Error>> {
12421242
opts.optopt(
12431243
"",
12441244
"key19x",
1245-
"AES slot 0x19 key X for decrypting New3DS cartridge save",
1245+
"AES slot 0x19 key X for decrypting New3DS exclusive cartridge save",
12461246
"HEX|FILE",
12471247
);
12481248
opts.optopt(
12491249
"",
12501250
"key1ax",
1251-
"AES slot 0x19 key X for decrypting New3DS cartridge save",
1251+
"AES slot 0x19 key X for decrypting New3DS exclusive cartridge save",
12521252
"HEX|FILE",
12531253
);
12541254
opts.optopt("m", "movable", "movable.sed file path", "FILE");

0 commit comments

Comments
 (0)