Line 271: |
Line 271: |
| = Gamecard commands = | | = Gamecard commands = |
| These commands are issued by the Gamecard ASIC to the actual Gamecard using the [[#OperationBuffer]] passed to [[#SendCardCommand]]. | | These commands are issued by the Gamecard ASIC to the actual Gamecard using the [[#OperationBuffer]] passed to [[#SendCardCommand]]. |
| + | |
| + | Additional data buffers are then read/written using standard MMC read/write commands. |
| | | |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
Line 278: |
Line 280: |
| |- | | |- |
| | 0x10 | | | 0x10 |
− | | ReadId1Writer | + | | [[#ReadId1Normal, ReadId1Secure, ReadId1Writer|#ReadId1Writer]] |
| |- | | |- |
| | 0x11 | | | 0x11 |
− | | ReadId2Writer | + | | [[#ReadId2Normal, ReadId2Secure, ReadId2Writer|#ReadId2Writer]] |
| |- | | |- |
| | 0x12 | | | 0x12 |
− | | ReadId3Writer | + | | [[#ReadId3Normal, ReadId3Secure, ReadId3Writer|#ReadId3Writer]] |
| |- | | |- |
| | 0x15 | | | 0x15 |
− | | ReadCrc | + | | [[#ReadCrc]] |
| |- | | |- |
| | 0x16 | | | 0x16 |
− | | WritePage | + | | [[#WritePage, WritePageSecure|#WritePage]] |
| |- | | |- |
| | 0x18 | | | 0x18 |
− | | Erase | + | | [[#Erase]] |
| |- | | |- |
| | 0x19 | | | 0x19 |
− | | ReadDevParam | + | | [[#ReadDevParam]] |
| |- | | |- |
| | 0x20 | | | 0x20 |
− | | WriteDevParam | + | | [[#WriteDevParam]] |
| |- | | |- |
| | 0x21 | | | 0x21 |
− | | ReadPageSecure | + | | [[#ReadPage, ReadPageSecure|#ReadPageSecure]] |
| |- | | |- |
| | 0x28 | | | 0x28 |
− | | ReadId2Normal | + | | [[#ReadId2Normal, ReadId2Secure, ReadId2Writer|#ReadId2Normal]] |
| |- | | |- |
| | 0x2E | | | 0x2E |
Line 311: |
Line 313: |
| |- | | |- |
| | 0x30 | | | 0x30 |
− | | ReadId3Secure | + | | [[#ReadId3Normal, ReadId3Secure, ReadId3Writer|#ReadId3Secure]] |
| |- | | |- |
| | 0x39 | | | 0x39 |
Line 317: |
Line 319: |
| |- | | |- |
| | 0x56 | | | 0x56 |
− | | ReadId1Normal | + | | [[#ReadId1Normal, ReadId1Secure, ReadId1Writer|#ReadId1Normal]] |
| |- | | |- |
| | 0x83 | | | 0x83 |
− | | WritePageSecure | + | | [[#WritePage, WritePageSecure|#WritePageSecure]] |
| |- | | |- |
| | 0x5B | | | 0x5B |
− | | ReadPage | + | | [[#ReadPage, ReadPageSecure|#ReadPage]] |
| |- | | |- |
| | 0x67 | | | 0x67 |
− | | ReadId1Secure | + | | [[#ReadId1Normal, ReadId1Secure, ReadId1Writer|#ReadId1Secure]] |
| |- | | |- |
| | 0xA5 | | | 0xA5 |
− | | ReadId3Normal | + | | [[#ReadId3Normal, ReadId3Secure, ReadId3Writer|#ReadId3Normal]] |
| |- | | |- |
| | 0xB8 | | | 0xB8 |
Line 335: |
Line 337: |
| |- | | |- |
| | 0xC4 | | | 0xC4 |
− | | ReadId2Secure | + | | [[#ReadId2Normal, ReadId2Secure, ReadId2Writer|#ReadId2Secure]] |
| |- | | |- |
| | 0xE0 | | | 0xE0 |
Line 342: |
Line 344: |
| | 0xE2 | | | 0xE2 |
| | | | | |
| + | |} |
| + | |
| + | == ReadId1Normal, ReadId1Secure, ReadId1Writer == |
| + | Returns the Gamecard ID1 under one of the valid [[#Gamecard modes|Gamecard modes]]. |
| + | |
| + | The [[#OperationBuffer]] is as follows. |
| + | |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x0 |
| + | | 0x1 |
| + | | Gamecard ASIC operation command (0x10) |
| + | |- |
| + | | 0x1 |
| + | | 0x1 |
| + | | Set to 1 |
| + | |- |
| + | | 0x2 |
| + | | 0x1 |
| + | | Set to 0 |
| + | |- |
| + | | 0x3 |
| + | | 0x1 |
| + | | Padding |
| + | |- |
| + | | 0x4 |
| + | | 0x4 |
| + | | Set to 0 |
| + | |- |
| + | | 0x8 |
| + | | 0x1 |
| + | | Gamecard command (0x10, 0x56 or 0x67) |
| + | |- |
| + | | 0x9 |
| + | | 0x4 |
| + | | Set to 0 |
| + | |- |
| + | | 0xD |
| + | | 0x2 |
| + | | Set to 0 |
| + | |- |
| + | | 0xF |
| + | | 0x1 |
| + | | Set to 0 |
| + | |- |
| + | | 0x10 |
| + | | 0x10 |
| + | | Empty |
| + | |- |
| + | | 0x20 |
| + | | 0x20 |
| + | | Command verification value |
| + | |} |
| + | |
| + | == ReadId2Normal, ReadId2Secure, ReadId2Writer == |
| + | Returns the Gamecard ID2 under one of the valid [[#Gamecard modes|Gamecard modes]]. |
| + | |
| + | The [[#OperationBuffer]] is as follows. |
| + | |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x0 |
| + | | 0x1 |
| + | | Gamecard ASIC operation command (0x10) |
| + | |- |
| + | | 0x1 |
| + | | 0x1 |
| + | | Set to 1 |
| + | |- |
| + | | 0x2 |
| + | | 0x1 |
| + | | Set to 0 |
| + | |- |
| + | | 0x3 |
| + | | 0x1 |
| + | | Padding |
| + | |- |
| + | | 0x4 |
| + | | 0x4 |
| + | | Set to 0 |
| + | |- |
| + | | 0x8 |
| + | | 0x1 |
| + | | Gamecard command (0x11, 0x28 or 0xC4) |
| + | |- |
| + | | 0x9 |
| + | | 0x4 |
| + | | Set to 0 |
| + | |- |
| + | | 0xD |
| + | | 0x2 |
| + | | Set to 0 |
| + | |- |
| + | | 0xF |
| + | | 0x1 |
| + | | Set to 0 |
| + | |- |
| + | | 0x10 |
| + | | 0x10 |
| + | | Empty |
| + | |- |
| + | | 0x20 |
| + | | 0x20 |
| + | | Command verification value |
| + | |} |
| + | |
| + | == ReadId3Normal, ReadId3Secure, ReadId3Writer == |
| + | Returns the Gamecard ID3 under one of the valid [[#Gamecard modes|Gamecard modes]]. |
| + | |
| + | The [[#OperationBuffer]] is as follows. |
| + | |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x0 |
| + | | 0x1 |
| + | | Gamecard ASIC operation command (0x10) |
| + | |- |
| + | | 0x1 |
| + | | 0x1 |
| + | | Set to 1 |
| + | |- |
| + | | 0x2 |
| + | | 0x1 |
| + | | Set to 0 |
| + | |- |
| + | | 0x3 |
| + | | 0x1 |
| + | | Padding |
| + | |- |
| + | | 0x4 |
| + | | 0x4 |
| + | | Set to 0 |
| + | |- |
| + | | 0x8 |
| + | | 0x1 |
| + | | Gamecard command (0x12, 0x30 or 0xA5) |
| + | |- |
| + | | 0x9 |
| + | | 0x4 |
| + | | Set to 0 |
| + | |- |
| + | | 0xD |
| + | | 0x2 |
| + | | Set to 0 |
| + | |- |
| + | | 0xF |
| + | | 0x1 |
| + | | Set to 0 |
| + | |- |
| + | | 0x10 |
| + | | 0x10 |
| + | | Empty |
| + | |- |
| + | | 0x20 |
| + | | 0x20 |
| + | | Command verification value |
| + | |} |
| + | |
| + | == ReadCrc == |
| + | Reads pages from the Gamecard, calculates their CRC and returns it. This command is only available in [[#Gamecard modes|Write]] mode. |
| + | |
| + | The [[#OperationBuffer]] is as follows. |
| + | |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x0 |
| + | | 0x1 |
| + | | Gamecard ASIC operation command (0x10) |
| + | |- |
| + | | 0x1 |
| + | | 0x1 |
| + | | Set to 1 |
| + | |- |
| + | | 0x2 |
| + | | 0x1 |
| + | | Set to 0 |
| + | |- |
| + | | 0x3 |
| + | | 0x1 |
| + | | Padding |
| + | |- |
| + | | 0x4 |
| + | | 0x4 |
| + | | Set to 0 |
| + | |- |
| + | | 0x8 |
| + | | 0x1 |
| + | | Gamecard command (0x15) |
| + | |- |
| + | | 0x9 |
| + | | 0x4 |
| + | | Gamecard page offset |
| + | |- |
| + | | 0xD |
| + | | 0x3 |
| + | | Gamecard page count |
| + | |- |
| + | | 0x10 |
| + | | 0x10 |
| + | | Empty |
| + | |- |
| + | | 0x20 |
| + | | 0x20 |
| + | | Command verification value |
| + | |} |
| + | |
| + | == WritePage, WritePageSecure == |
| + | Writes Gamecard pages. This command is only available in [[#Gamecard modes|Write]] and [[#Gamecard modes|Secure]] modes. |
| + | |
| + | The [[#OperationBuffer]] is as follows. |
| + | |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x0 |
| + | | 0x1 |
| + | | Gamecard ASIC operation command (0x10) |
| + | |- |
| + | | 0x1 |
| + | | 0x1 |
| + | | Set to 3 |
| + | |- |
| + | | 0x2 |
| + | | 0x1 |
| + | | Set to 1 |
| + | |- |
| + | | 0x3 |
| + | | 0x1 |
| + | | Padding |
| + | |- |
| + | | 0x4 |
| + | | 0x4 |
| + | | Gamecard page count (duplicate) |
| + | |- |
| + | | 0x8 |
| + | | 0x1 |
| + | | Gamecard command (0x16 or 0x83) |
| + | |- |
| + | | 0x9 |
| + | | 0x4 |
| + | | Gamecard page offset |
| + | |- |
| + | | 0xD |
| + | | 0x3 |
| + | | Gamecard page count |
| + | |- |
| + | | 0x10 |
| + | | 0x10 |
| + | | Empty |
| + | |- |
| + | | 0x20 |
| + | | 0x20 |
| + | | Command verification value |
| + | |} |
| + | |
| + | == ReadPage, ReadPageSecure == |
| + | Reads Gamecard pages. This command is only available in [[#Gamecard modes|Normal]] and [[#Gamecard modes|Secure]] modes. |
| + | |
| + | The [[#OperationBuffer]] is as follows. |
| + | |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x0 |
| + | | 0x1 |
| + | | Gamecard ASIC operation command (0x10) |
| + | |- |
| + | | 0x1 |
| + | | 0x1 |
| + | | Set to 3 |
| + | |- |
| + | | 0x2 |
| + | | 0x1 |
| + | | Set to 0 |
| + | |- |
| + | | 0x3 |
| + | | 0x1 |
| + | | Padding |
| + | |- |
| + | | 0x4 |
| + | | 0x4 |
| + | | Gamecard page count (duplicate) |
| + | |- |
| + | | 0x8 |
| + | | 0x1 |
| + | | Gamecard command (0x21 or 0x5B) |
| + | |- |
| + | | 0x9 |
| + | | 0x4 |
| + | | Gamecard page offset |
| + | |- |
| + | | 0xD |
| + | | 0x3 |
| + | | Gamecard page count |
| + | |- |
| + | | 0x10 |
| + | | 0x10 |
| + | | Empty |
| + | |- |
| + | | 0x20 |
| + | | 0x20 |
| + | | Command verification value |
| + | |} |
| + | |
| + | == Erase == |
| + | Fully erases a Gamecard's contents. This command is only available in [[#Gamecard modes|Write]] mode. |
| + | |
| + | The [[#OperationBuffer]] is as follows. |
| + | |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x0 |
| + | | 0x1 |
| + | | Gamecard ASIC operation command (0x10) |
| + | |- |
| + | | 0x1 |
| + | | 0x1 |
| + | | Set to 1 |
| + | |- |
| + | | 0x2 |
| + | | 0x1 |
| + | | Set to 0 |
| + | |- |
| + | | 0x3 |
| + | | 0x1 |
| + | | Padding |
| + | |- |
| + | | 0x4 |
| + | | 0x4 |
| + | | Set to 0 |
| + | |- |
| + | | 0x8 |
| + | | 0x1 |
| + | | Gamecard command (0x18) |
| + | |- |
| + | | 0x9 |
| + | | 0x4 |
| + | | Set to 0 |
| + | |- |
| + | | 0xD |
| + | | 0x2 |
| + | | Set to 0 |
| + | |- |
| + | | 0xF |
| + | | 0x1 |
| + | | Set to 0 |
| + | |- |
| + | | 0x10 |
| + | | 0x10 |
| + | | Empty |
| + | |- |
| + | | 0x20 |
| + | | 0x20 |
| + | | Command verification value |
| + | |} |
| + | |
| + | == ReadDevParam == |
| + | Reads a development Gamecard's parameters. This command is only available in [[#Gamecard modes|Write]] mode. |
| + | |
| + | The [[#OperationBuffer]] is as follows. |
| + | |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x0 |
| + | | 0x1 |
| + | | Gamecard ASIC operation command (0x10) |
| + | |- |
| + | | 0x1 |
| + | | 0x1 |
| + | | Set to 3 |
| + | |- |
| + | | 0x2 |
| + | | 0x1 |
| + | | Set to 0 |
| + | |- |
| + | | 0x3 |
| + | | 0x1 |
| + | | Padding |
| + | |- |
| + | | 0x4 |
| + | | 0x4 |
| + | | Set to 1 |
| + | |- |
| + | | 0x8 |
| + | | 0x1 |
| + | | Gamecard command (0x19) |
| + | |- |
| + | | 0x9 |
| + | | 0x4 |
| + | | Set to 0 |
| + | |- |
| + | | 0xD |
| + | | 0x2 |
| + | | Set to 0 |
| + | |- |
| + | | 0xF |
| + | | 0x1 |
| + | | Set to 0 |
| + | |- |
| + | | 0x10 |
| + | | 0x10 |
| + | | Empty |
| + | |- |
| + | | 0x20 |
| + | | 0x20 |
| + | | Command verification value |
| + | |} |
| + | |
| + | == WriteDevParam == |
| + | Writes a development Gamecard's parameters. This command is only available in [[#Gamecard modes|Write]] mode. |
| + | |
| + | The [[#OperationBuffer]] is as follows. |
| + | |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Offset |
| + | ! Size |
| + | ! Description |
| + | |- |
| + | | 0x0 |
| + | | 0x1 |
| + | | Gamecard ASIC operation command (0x10) |
| + | |- |
| + | | 0x1 |
| + | | 0x1 |
| + | | Set to 3 |
| + | |- |
| + | | 0x2 |
| + | | 0x1 |
| + | | Set to 1 |
| + | |- |
| + | | 0x3 |
| + | | 0x1 |
| + | | Padding |
| + | |- |
| + | | 0x4 |
| + | | 0x4 |
| + | | Set to 1 |
| + | |- |
| + | | 0x8 |
| + | | 0x1 |
| + | | Gamecard command (0x20) |
| + | |- |
| + | | 0x9 |
| + | | 0x4 |
| + | | Set to 0 |
| + | |- |
| + | | 0xD |
| + | | 0x2 |
| + | | Set to 0 |
| + | |- |
| + | | 0xF |
| + | | 0x1 |
| + | | Set to 0 |
| + | |- |
| + | | 0x10 |
| + | | 0x10 |
| + | | Empty |
| + | |- |
| + | | 0x20 |
| + | | 0x20 |
| + | | Command verification value |
| |} | | |} |
| | | |