예제 #1
0
        private void LoadRom(string fileName)
        {
            var romFileInfo = new FileInfo(fileName);

            // Open only existing rom files
            if (!romFileInfo.Exists)
            {
                throw new FileNotFoundException();
            }
            if (romFileInfo.Length < 512)
            {
                throw new InvalidOperationException("ROM files must be at least 512 bytes.");
            }
            if (romFileInfo.Length > 8 * 1024 * 1024)
            {
                throw new InvalidOperationException("ROM files cannot exceed 8MB.");
            }

            emulatedGameBoy.LoadRom(MemoryUtility.ReadFile(romFileInfo, true));

            if (emulatedGameBoy.RomInformation.HasRam && emulatedGameBoy.RomInformation.HasBattery)
            {
                var ramFileInfo = new FileInfo(Path.Combine(romFileInfo.DirectoryName, Path.GetFileNameWithoutExtension(romFileInfo.Name)) + ".sav");

                var ramSaveStream = ramFileInfo.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None);
                ramSaveStream.SetLength(emulatedGameBoy.Mapper.SavedRamSize + (emulatedGameBoy.RomInformation.HasTimer ? 48 : 0));
                ramSaveStream.Read(emulatedGameBoy.ExternalRam, 0, emulatedGameBoy.Mapper.SavedRamSize);
                ramSaveWriter = new BinaryWriter(ramSaveStream);

                if (emulatedGameBoy.RomInformation.HasTimer)
                {
                    var mbc3 = emulatedGameBoy.Mapper as CrystalBoy.Emulation.Mappers.MemoryBankController3;

                    if (mbc3 != null)
                    {
                        var rtcState = mbc3.RtcState;
                        ramSaveReader = new BinaryReader(ramSaveStream);

                        rtcState.Frozen = true;

                        rtcState.Seconds = (byte)ramSaveReader.ReadInt32();
                        rtcState.Minutes = (byte)ramSaveReader.ReadInt32();
                        rtcState.Hours   = (byte)ramSaveReader.ReadInt32();
                        rtcState.Days    = (short)((byte)ramSaveReader.ReadInt32() + ((byte)ramSaveReader.ReadInt32() << 8));

                        rtcState.LatchedSeconds = (byte)ramSaveReader.ReadInt32();
                        rtcState.LatchedMinutes = (byte)ramSaveReader.ReadInt32();
                        rtcState.LatchedHours   = (byte)ramSaveReader.ReadInt32();
                        rtcState.LatchedDays    = (short)((byte)ramSaveReader.ReadInt32() + ((byte)ramSaveReader.ReadInt32() << 8));

                        rtcState.DateTime = new DateTime(1970, 1, 1) + TimeSpan.FromSeconds(ramSaveReader.ReadInt64());

                        rtcState.Frozen = false;
                    }
                }

                emulatedGameBoy.Mapper.RamUpdated += Mapper_RamUpdated;
            }

            emulatedGameBoy.Run();
        }
예제 #2
0
 private void runButton_Click(object sender, EventArgs e)
 {
     EmulatedGameBoy.Run();
 }