Hey there...
I already posted this in another topic but it fits better in a dedicated one.
PLEASE DON'T HESITATE TO POST IF YOU FIND ANY ERRORS OR MISSING INFOS.
I will update it if something we don't know yet is posted (LAST EDIT : DECEMBER 14TH 2010).
For now, here are the infos we gathered (Thx again for contributions.) :
*****
Location : 0x00180000 - 0x0018FFFF (odd bytes only) (mirrored at 0x00190000-0x001FFFFF)
Size : 32768 bytes.
The whole area is divided into 512 blocks of 64 bytes each.
Blocks are labeled in order from Block#0000 to Block01FF.
Block#0000 is reserved for the backup memory header and must fit the following ascii string :
"BackUpRam FormatBackUpRam FormatBackUpRam FormatBackUpRam Format"
Block#0001 obviously acts as a separator block.
It cannot be used to store data and all its bytes must be set to 0x00.
Block#0002 - Block#01FF can be used to store game saves data.
The first double word of all these blocks is reserved for the block header and must fit one of the following values :
- 0x00000000 > if the block is unused or used but not the first of a game save
- 0x80000000 > if the block is the first of a game save
Each game save data may not always be stored to contiguous blocks, due to preceeding game saves writings.
Anyway, it must fit the following scheme (in addtion to all the previous rules), starting at the first available block :
block header :
- 0x80000000 > specifies this block is the 1st of a game save
game save header :
- 11 bytes > game save name
- 1 byte > game save language (mainly for multi-language games : 0x00=jap / 0x01=eng / 0x02=fra / 0x03=deu / 0x04=esp / 0x05=ita)
- 10 bytes > game save description
- 1 dword > game save time stamp (minutes elapsed since 1/1/1980 00:00:00), big endian
- 1 dword > game save data size, in bytes, big endian
- (word array) > only for game saves using more than 1 block : listing of blocks used by the game save in order, starting from the second one, in Block#, big endian (variable length)
- 0x0000 > separator
game save data :
- byte array > game save data (variable length)
*****
For example, the deza 2 default save looks like this in memory (even bytes included) :
block start
FF 80 FF 00 FF 00 FF 00 > block header
FF 44 FF 45 FF 5A FF 41 FF 32 FF 5F FF 5F FF 5F FF 53 FF 59 FF 53 > save name
FF 00 > save language
FF C3 FF DE FF BB FF DE FF 32 FF 5F FF BC FF BD FF C3 FF D1 > save description
FF 00 FF F7 FF 95 FF A4 > save timestamp
FF 00 FF 00 FF 00 FF 11 > save data size
> blocks listing skipped because only 1 used block
FF 00 FF 00 > separator
FF 1E FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 01 FF 02 FF 03 FF 05 FF 04 FF 01 FF 02 FF 03 FF 05 FF 04 > save data
FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 > unused block bytes
block end
I already posted this in another topic but it fits better in a dedicated one.
PLEASE DON'T HESITATE TO POST IF YOU FIND ANY ERRORS OR MISSING INFOS.
I will update it if something we don't know yet is posted (LAST EDIT : DECEMBER 14TH 2010).
For now, here are the infos we gathered (Thx again for contributions.) :
*****
Location : 0x00180000 - 0x0018FFFF (odd bytes only) (mirrored at 0x00190000-0x001FFFFF)
Size : 32768 bytes.
The whole area is divided into 512 blocks of 64 bytes each.
Blocks are labeled in order from Block#0000 to Block01FF.
Block#0000 is reserved for the backup memory header and must fit the following ascii string :
"BackUpRam FormatBackUpRam FormatBackUpRam FormatBackUpRam Format"
Block#0001 obviously acts as a separator block.
It cannot be used to store data and all its bytes must be set to 0x00.
Block#0002 - Block#01FF can be used to store game saves data.
The first double word of all these blocks is reserved for the block header and must fit one of the following values :
- 0x00000000 > if the block is unused or used but not the first of a game save
- 0x80000000 > if the block is the first of a game save
Each game save data may not always be stored to contiguous blocks, due to preceeding game saves writings.
Anyway, it must fit the following scheme (in addtion to all the previous rules), starting at the first available block :
block header :
- 0x80000000 > specifies this block is the 1st of a game save
game save header :
- 11 bytes > game save name
- 1 byte > game save language (mainly for multi-language games : 0x00=jap / 0x01=eng / 0x02=fra / 0x03=deu / 0x04=esp / 0x05=ita)
- 10 bytes > game save description
- 1 dword > game save time stamp (minutes elapsed since 1/1/1980 00:00:00), big endian
- 1 dword > game save data size, in bytes, big endian
- (word array) > only for game saves using more than 1 block : listing of blocks used by the game save in order, starting from the second one, in Block#, big endian (variable length)
- 0x0000 > separator
game save data :
- byte array > game save data (variable length)
*****
For example, the deza 2 default save looks like this in memory (even bytes included) :
block start
FF 80 FF 00 FF 00 FF 00 > block header
FF 44 FF 45 FF 5A FF 41 FF 32 FF 5F FF 5F FF 5F FF 53 FF 59 FF 53 > save name
FF 00 > save language
FF C3 FF DE FF BB FF DE FF 32 FF 5F FF BC FF BD FF C3 FF D1 > save description
FF 00 FF F7 FF 95 FF A4 > save timestamp
FF 00 FF 00 FF 00 FF 11 > save data size
> blocks listing skipped because only 1 used block
FF 00 FF 00 > separator
FF 1E FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 01 FF 02 FF 03 FF 05 FF 04 FF 01 FF 02 FF 03 FF 05 FF 04 > save data
FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 > unused block bytes
block end