NCSD: Difference between revisions

Myria (talk | contribs)
Card Info Header: added system update info
Myria (talk | contribs)
Development Card Info Header Extension: filled in a bunch of missing pieces
Line 280: Line 280:
|  CardDeviceReserved2
|  CardDeviceReserved2
|}
|}
== Development Card Info Header Extension ==
{| class="wikitable" border="1"
|-
!  OFFSET
!  SIZE
!  DESCRIPTION
|-
|  0x1200
|  0x200
|  CardDeviceReserved1
|-
|  0x1400
|  0x10
|  TitleKey
|-
|  0x1410
|  0xF0
|  CardDeviceReserved2
|-
|  0x1500
|  0x1B00
|  CardDeviceReserved3
|-
|  0x3000
|  0x1000
|  Test pattern
|}
"TitleKey" is the decrypted version of the title key at 0x1000-0x103B ("Encrypted card seed").  This field appears to be what development--and maybe retail?--cards read to know what card encryption seed to use in the CTR protocol.


Note that a particular flashcard vendor puts what many refer to as "private headers" here in place of actual development card information. This header is constituted by a cartridge-unique Id obtained from [[Process_Services_PXI|pxi:ps9::GetRomId]] and the title-unique cart ID (identical for all carts of the same title; can be retrieved using the NTR gamecard protocol command 0x90 or through the CTR protocol commands 0x90 or 0xA2).
Note that a particular flashcard vendor puts what many refer to as "private headers" here in place of actual development card information. This header is constituted by a cartridge-unique Id obtained from [[Process_Services_PXI|pxi:ps9::GetRomId]] and the title-unique cart ID (identical for all carts of the same title; can be retrieved using the NTR gamecard protocol command 0x90 or through the CTR protocol commands 0x90 or 0xA2).
The CardDeviceReserved areas have random-looking data whose purpose is unknown, other than perhaps to hide the TitleKey.
The test pattern is the same one encountered in development DS/DSi cartridges.  Its layout is as follows:
{| class="wikitable" border="1"
|-
!  OFFSET
!  SIZE
!  DESCRIPTION
|-
|  0x3000
|  8
|  The bytes FF,00,FF,00,AA,55,AA,55.
|-
|  0x3008
|  0x1F8
|  An ascending byte sequence equal to the offset mod 256 (08,09,0A, ..., FE,FF,00,01, ..., FF).
|-
|  0x3200
|  0x200
|  A descending byte sequence equal to 255 minus the offset mod 256 (FF,FE,FD, ..., 00,FF,DE, ..., 00).
|-
|  0x3400
|  0x200
|  Filled with 00 bytes.
|-
|  0x3600
|  0x200
|  Filled with FF bytes.
|-
|  0x3800
|  0x200
|  Filled with 0F bytes.
|-
|  0x3A00
|  0x200
|  Filled with F0 bytes.
|-
|  0x3C00
|  0x200
|  Filled with 55 bytes.
|-
|  0x3E00
|  0x1FF
|  Filled with AA bytes.
|-
|  0x3FFF
|  1
|  The final byte is a 00.
|}
Retail cards always return FF when attempting to read 0x1200-0x3FFF.  They probably actually have the same data as development cards, but there's no way to read it.


== Tools ==
== Tools ==