Exemple #1
0
        private void RomToDMA()
        {
            //Transfer data from ROM to DMA Tables
            if (Info.DMATableOffset == 0x0)
            {
                IsDMALoaded = false;
                return;
            }

            IsCompressed = false;

            DMATable.Clear();

            int CurrentPos = (int)Info.DMATableOffset;

            try
            {
                while (CurrentPos < Size - 16)
                {
                    uint VStart   = ToolSettings.ReadUInt(_romData, CurrentPos, ROMEndianness);
                    uint PStart   = ToolSettings.ReadUInt(_romData, CurrentPos + 4, ROMEndianness);
                    uint PEnd     = ToolSettings.ReadUInt(_romData, CurrentPos + 8, ROMEndianness);
                    uint CompFlag = ToolSettings.ReadUInt(_romData, CurrentPos + 12, ROMEndianness);

                    //Create the actual data
                    byte[] dmaBytes = new byte[PEnd - PStart];
                    Array.Copy(_romData, PStart, dmaBytes, 0, dmaBytes.Length);

                    DMATableEntry entry = new DMATableEntry(VStart, PStart, PEnd, CompFlag, dmaBytes);

                    if ((entry.PStart == 0x00) && (entry.PEnd == 0x00))
                    {
                        break;
                    }

                    if (entry.CompFlag == 1)
                    {
                        IsCompressed = true;
                    }

                    DMATable.Add(entry);

                    CurrentPos += 16;
                }
                IsDMALoaded = true;
            }
            catch
            {
                IsDMALoaded = false;
            }

            //if (IsCompressed)
            //{
            //    if (DecompressDMA())
            //    {
            //        DMAToRom();
            //        FixCRC();
            //    }
            //}
        }
Exemple #2
0
        public bool FixCRC()
        {
            //Only apply crc fix to the full rom data container, not to the separated dma table data container
            if (N64Sums.FixChecksum(_romData))
            {
                IsValidRom = true;
                uint crc1 = ToolSettings.ReadUInt(_romData, 16, ROMEndianness);
                uint crc2 = ToolSettings.ReadUInt(_romData, 20, ROMEndianness);

                Info = new ROMInfo(Info.Title, Info.GameID, Info.Version, crc1, crc2, Info.DMATableOffset);

                return(true);
            }
            return(false);
        }
Exemple #3
0
        private void SetRomInfo(uint dmaTableOffset = 0x0)
        {
            string title   = System.Text.Encoding.UTF8.GetString(_romData, 32, 20);
            string gameID  = System.Text.Encoding.UTF8.GetString(_romData, 59, 4);
            byte   version = _romData[63];

            uint endian = ToolSettings.ReadUInt(_romData, 0);

            ROMEndianness = StarFoxRomInfo.GetEndianness(endian);

            uint crc1 = ToolSettings.ReadUInt(_romData, 16, ROMEndianness);
            uint crc2 = ToolSettings.ReadUInt(_romData, 20, ROMEndianness);

            if (dmaTableOffset == 0x0)
            {
                dmaTableOffset = StarFoxRomInfo.GetDMATableOffset(gameID, version);
            }

            //To be discovered: will this need to be changed to also change the CRC values??? Or can I leave them untouched?
            Info = new ROMInfo(title, gameID, version, crc1, crc2, dmaTableOffset);

            IsValidRom = StarFoxRomInfo.IsValidVersion(Info);
        }