From GC-Forever Wiki
Jump to navigation Jump to search

GameCube Disc Format Please Note this is a work in progress doc

XOR Encryption is done using discID and a random seed by the Disc Controller Firmware, Panasonic MN103S And is controlled by the System Controller MN102H

Data Frame

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

Random Seed List

   0 0x0003
   8 0x0030
   1 0x7f00
   9 0x7001
   2 0x0006
   A 0x0060
   3 0x7e00
   B 0x6003
   4 0x000c
   C 0x00c0
   5 0x7c00
   D 0x4007
   6 0x0018
   E 0x0180
   7 0x7800
   F 0x000f

Burst Cutting Area

   // UserData(64 Bytes)
   u8 optionalInfo[52];
   u8 manufacturerCode[2];
   u8 recorderDeviceCode[2];
   u8 APMRecorderDeviceCode;
   u8 discManufactureDate[2];
   u8 discManufactureTime[2];
   u8 discNumber[3];
   // KeyData(16 Bytes)
   u8 bcakey[8];
   u8 bcaSerial[8];
   // Encrypted(48 Bytes)
   u64 psn[6]; //BCA mark positions
   // 188 Total Bytes

Disc Physical Format

   // Leadin Area
   PhysicalFormatInfo m_pfi;
   DiscManufacturingInfo m_dmi;


   u8 reversed[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];


   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 m_dataAreaAllocation;
   u8 bcaDescriptor; // The value is fixed on 128.
   u8 reversed2[1983];
   u8 reversed3[6];


   u8 reversed;
   u16 startSector; // 196608
   u8 reversed2;
   u16 endSector; // 909487
   u8 reversed3[3];
   // 12 Bytes

Disc Image Format

   BootHeader m_header; // boot.bin
   BootHeaderInfo m_bi; // bi2.bin
   AppLoader m_apploader; // appldr.img
   FileSystemTable m_fst; // fst.bin
   u8 userdata[0]; // application is stored here, including boot file


   u8 ConsoleID; // G = Gamecube, R = Wii.
   u8 Gamecode[2];
   u8 CountryCode;    //J=JAP . P=PAL . E=USA . D=OoT MasterQuest
   u8 MakerCode[2];
   u8 DiscID;
   u8 Version;
   u8 AudioStreaming; //01 = Enable it. 00 = Don't
   u8 StreamBufSize; // For the AudioEnable.
   u8 unused_1[18];    
   u32 DVDMagicWord; // 3258163005
   char GameName[64];
   u8 unused_2[416];
   u32 NKitMagicWord;
   u32 NKitVersion;
   u32 ImageCRC;
   u32 ForceCRC;
   u32 ImageSize;
   u32 JunkID;
   u8 unused_3[488];
   u32 ApploaderSize;
   u32 ApploaderInit;
   u32 ApploaderMain;
   u32 ApploaderExit;
   u8 unused_4[16];
   u32 DOLOffset;
   u32 FSTOffset;
   u32 FSTSize;
   u32 MaxFSTSize;
   u32 FSTAddress;
   u32 UserPos;
   u32 UserLength;
   u32 unused_5;


   u32 DebugMonSize;
   u32 SimMemSize;
   u32 ArgOffset;
   u32 DebugFlag;
   u32 DebugOffset;
   u32 DebugSize;
   u32 RegionCode;
   u32 TotalDisc;
   u32 LongFileName;
   u32 PADSpec;
   u32 DOLLimit;
   u8 unused_6[8148];
   // 8192 Bytes


   char revision[16]; // Revision compile date (example "2001/12/17")
   u32 entryPoint; // Apploader's entrypoint
   u32 size; // Size of apploader code
   u32 rebootSize; // Size of reboot code
   u8 pad[4]; // zeroes
   u8 code[0]; // PPC code


   u32 entityCount;
   FileSystemEntity* m_entity;
   StringTable* m_string;


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


   char name[0];
   char dummy;