Changes

5,305 bytes added ,  Yesterday at 18:36
Adding GameCube Disc Format
GameCube Disc Format aka NROM(Read-only) or NR-Disc(Rewritable), based on DVD tech.

Please Note this is a work in progress doc.

DVD Sector Scrambling(XOR) is done using Disk ID(gamecode + makercode), it is 6 bytes and of 16 Random Numbers to pick from to scramble the DVD sectors, done by the Disc Drive Firmware, it is stored on a on-chip ROM
Firmware for the MN102 System Controller is stored on a on-board ROM chip that stores the firmware it is 128KB

Panasonic MN103S (32 bit) is the Disk Controller(ECC, Servo Control, Descramble, XADPCM Decoding)
Panasonic MN102H (16 bit) is the System Controller(Manager, Checks Copy protection, Handles Commands, Checks Disc Type, Etc.)

The development tools used to develop for these Panasonic microcontrollers is called Debug Factory 3, it comes with a toolchain that has compiler, linker, assembler.

[[File:Debug Factor 3 MN102H.png|thumb|Panasonic Debug Factory 3 MN102]]

In the firmware the text "Nintendo Game Disk" can be found this is the Media ID 19 byte string that is used as meta data in the lead-in area of the DVD.
MN102H looks for this string to check if the disc type is a GameCube\Wii Game Disc.
It's also does the BCA copy protection check.

== Data Types ==
u8 = unsigned char (1 byte) or string
s8 = signed char (1 byte) or string
u16 = unsigned short (2 bytes)
s16 = signed short (2 bytes)
u32 = unsigned int (4 bytes)
s32 = signed int (4 bytes)
u64 = unsigned long long (8 bytes)
s64 = signed long long (8 bytes)

== Data Frame ==
u32 id; // PSN(Physical Sector Number)
u16 ied; // ID Error Detection Code, CRC16
u8 userdata[2048]; // Sector Data
u8 cpr_mai[6]; // Copyright Management Information(Not used)
u32 edc; // Error Detection Code, CRC32
// 2064B

== Random Numbers ==
0: 3
1: 48
2: 32512
3: 28673
4: 6
5: 69
6: 32256
7: 24579
8: 12
9: 192
10: 31744
11: 16391
12: 24
13: 384
14: 30720
15: 15

== DiscId ==
char gamecode[4];
char makercode[2];
u8 diskNumber;
u8 version;
u8 streaming;
u8 streamingBufferSize;
u8 pad[18];
u32 magic;

== Burst Cutting Area ==
// UserData(unencrypted), 64B
u8 optionalInfo[52];
u8 manufacturer[2];
u8 recorderDevice[2];
u8 bcaSerial;
u8 discDate[2];
u8 discTime[2];
u8 discNumber[3];
// SecureData(unencrypted), 12B
u8 key[8]; // used to xor scramble the 6 sector locations data
u8 id[4];
// AuthenticationData(encrypted), 48B
PsnRegion psn[6]; // 6 sector locations
// 188 Total Bytes

struct_PsnRegion
{
u32 start;
u32 end;
};

== Disc Physical Format ==
// Leadin Area
PhysicalFormatInfo pfi;
DiscManufacturingInfo dmi;

PhysicalFormatInfo
u8 reserved[6];
u8 discMagic; // value is -1.
u8 discSizeMinTransferRate; // The value is fixed on 16.
u8 discStructure; // The value is fixed on 1.
u8 recordedDensity; // The value is fixed on 1.
DataAreaAllocation m_dataAreaAllocation;
u8 reversed2[2026];
u8 reversed3[6];

DiscManufacturingInfo
u8 reversed[6];
u8 unknown1[6];
u8 randomNumber2[6];
u8 unknown2[6];
u8 randomNumber3[6];
char mediaId[19]; // "Nintendo Game Disk"
u8 randomNumber4[6];
u8 bookTypePartVersion; // value must be 1.
u8 discSizeMinReadoutRate; // The value is fixed on 16.
u8 discStructure; // The value is fixed on 1.
u8 recordedDensity; // The value is fixed on 0.
DataAreaAllocation dataAreaAllocation;
u8 bcaDescriptor; // The value is fixed on 128.
u8 reserved2[1983];
u8 reserved3[6];

DataAreaAllocation
u8 reserved;
u16 startSector;
u8 reserved2;
u16 endSector;
u8 reserved3[3];
// 12 Bytes

== Disc Image Format ==
BootHeader m_header;
BootHeaderInfo m_bi;
AppLoader m_apploader;
FileSystemTable m_fst;
u8* userdata; // application is stored here, including boot file

BootHeader
u8 game_code[4];
u8 company_code[2];
u8 diskNumber;
u8 gameVersion;
u8 audioStreaming;
u8 streamBufSize;
u8 unused_1[18];
u32 magic; // 3258163005
char gameName[64];
u8 unused_2[416];
u32 nkitMagicWord;
u32 nkitVersion;
u32 dataCRC;
u32 headerCRC;
u32 dataSize;
u32 junkId;
u8 unused_3[488];
u32 apploaderSize;
u32 apploaderInit;
u32 apploaderMain;
u32 apploaderExit;
u8 unused_4[16];
u32 bootOffset;
u32 fstOffset;
u32 fstSize;
u32 maxFstSize;
u32 fstAddress;
u32 userPos;
u32 userLength;
u32 unused_5;

BootHeaderInfo
u32 debugMonSize; // debug monitor size
u32 simMemSize; // size of simulator memory
u32 argOffset;
u32 debugFlag;
u32 debugOffset;
u32 debugSize;
u32 country;
u32 totalDisc;
u32 supportLongFileName;
u32 padSpec;
u32 dolLimit;
u8 unused_6[8148];
// 8192 Bytes

AppLoader
char date[16];
u32 entryAddress;
u32 size;
u32 rebootSize;
u8 pad[4];
u8* code;

FileSystemTable
u32 entryCount;
FileSystemEntity* m_entity;
StringTable* m_string;

FileSystemEntity
u8 flags;
u16 filenameOffset;
u32 fileOffset;
u32 fileSize;

StringTable
char* name;
u8 pad;