diff --git a/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/CPU/SM83.cs b/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/CPU/SM83.cs index ac131721..5461099e 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/CPU/SM83.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/CPU/SM83.cs @@ -68,9 +68,9 @@ namespace Essgee.Emulation.CPU if (AppEnvironment.EnableSuperSlowCPULogger) { - logFile = @"D:\Temp\Essgee\log-lr35902.txt"; - numLogEntries = 0; - logEntries = new string[2000]; + //logFile = @"D:\Temp\Essgee\log-lr35902.txt"; + //numLogEntries = 0; + //logEntries = new string[2000]; } } diff --git a/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/Cartridges/Nintendo/GBCameraCartridge.cs b/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/Cartridges/Nintendo/GBCameraCartridge.cs index 2a8e8c7c..1db9ff62 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/Cartridges/Nintendo/GBCameraCartridge.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/Cartridges/Nintendo/GBCameraCartridge.cs @@ -70,6 +70,7 @@ namespace Essgee.Emulation.Cartridges.Nintendo public void LoadAxiStatus(AxiEssgssStatusData data) { + //TODO GB相机暂时不实现 } public AxiEssgssStatusData SaveAxiStatus() diff --git a/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/Cartridges/Nintendo/MBC1Cartridge.cs b/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/Cartridges/Nintendo/MBC1Cartridge.cs index fef802d8..930ab4f1 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/Cartridges/Nintendo/MBC1Cartridge.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/Cartridges/Nintendo/MBC1Cartridge.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; namespace Essgee.Emulation.Cartridges.Nintendo { @@ -31,11 +32,26 @@ namespace Essgee.Emulation.Cartridges.Nintendo public void LoadAxiStatus(AxiEssgssStatusData data) { + ramData = data.MemberData[nameof(ramData)]; + hasBattery = BitConverter.ToBoolean(data.MemberData[nameof(hasBattery)]); + + romBank = data.MemberData[nameof(romBank)].First(); + ramBank = data.MemberData[nameof(ramBank)].First(); + ramEnable = BitConverter.ToBoolean(data.MemberData[nameof(ramEnable)]); + bankingMode = data.MemberData[nameof(bankingMode)].First(); + //看是否还需要补存储字段 } public AxiEssgssStatusData SaveAxiStatus() { AxiEssgssStatusData data = new AxiEssgssStatusData(); + data.MemberData[nameof(ramData)] = ramData; + data.MemberData[nameof(hasBattery)] = BitConverter.GetBytes(hasBattery); + //看是否还需要补存储字段 + data.MemberData[nameof(romBank)] = BitConverter.GetBytes(romBank); + data.MemberData[nameof(ramBank)] = BitConverter.GetBytes(ramBank); + data.MemberData[nameof(ramEnable)] = BitConverter.GetBytes(ramEnable); + data.MemberData[nameof(bankingMode)] = BitConverter.GetBytes(bankingMode); return data; } #endregion diff --git a/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/Cartridges/Nintendo/MBC2Cartridge.cs b/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/Cartridges/Nintendo/MBC2Cartridge.cs index 77b4111c..06ffc165 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/Cartridges/Nintendo/MBC2Cartridge.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/Cartridges/Nintendo/MBC2Cartridge.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; namespace Essgee.Emulation.Cartridges.Nintendo { @@ -23,13 +24,25 @@ namespace Essgee.Emulation.Cartridges.Nintendo } #region AxiState + public void LoadAxiStatus(AxiEssgssStatusData data) { + ramData = data.MemberData[nameof(ramData)]; + hasBattery = BitConverter.ToBoolean(data.MemberData[nameof(hasBattery)]); + + romBank = data.MemberData[nameof(romBank)].First(); + ramEnable = BitConverter.ToBoolean(data.MemberData[nameof(ramEnable)]); + //看是否还需要补存储字段 } public AxiEssgssStatusData SaveAxiStatus() { AxiEssgssStatusData data = new AxiEssgssStatusData(); + data.MemberData[nameof(ramData)] = ramData; + data.MemberData[nameof(hasBattery)] = BitConverter.GetBytes(hasBattery); + //看是否还需要补存储字段 + data.MemberData[nameof(romBank)] = BitConverter.GetBytes(romBank); + data.MemberData[nameof(ramEnable)] = BitConverter.GetBytes(ramEnable); return data; } #endregion diff --git a/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/Cartridges/Nintendo/MBC3Cartridge.cs b/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/Cartridges/Nintendo/MBC3Cartridge.cs index 9e91d228..0124168d 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/Cartridges/Nintendo/MBC3Cartridge.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/Cartridges/Nintendo/MBC3Cartridge.cs @@ -135,11 +135,26 @@ namespace Essgee.Emulation.Cartridges.Nintendo public void LoadAxiStatus(AxiEssgssStatusData data) { + ramData = data.MemberData[nameof(ramData)]; + hasBattery = BitConverter.ToBoolean(data.MemberData[nameof(hasBattery)]); + hasRTC = BitConverter.ToBoolean(data.MemberData[nameof(hasRTC)]); + + romBank = data.MemberData[nameof(romBank)].First(); + ramBank = data.MemberData[nameof(ramBank)].First(); + ramEnable = BitConverter.ToBoolean(data.MemberData[nameof(ramEnable)]); + //看是否还需要补存储字段 } public AxiEssgssStatusData SaveAxiStatus() { AxiEssgssStatusData data = new AxiEssgssStatusData(); + data.MemberData[nameof(ramData)] = ramData; + data.MemberData[nameof(hasBattery)] = BitConverter.GetBytes(hasBattery); + data.MemberData[nameof(hasRTC)] = BitConverter.GetBytes(hasRTC); + //看是否还需要补存储字段 + data.MemberData[nameof(romBank)] = BitConverter.GetBytes(romBank); + data.MemberData[nameof(ramBank)] = BitConverter.GetBytes(ramBank); + data.MemberData[nameof(ramEnable)] = BitConverter.GetBytes(ramEnable); return data; } #endregion diff --git a/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/Cartridges/Nintendo/MBC5Cartridge.cs b/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/Cartridges/Nintendo/MBC5Cartridge.cs index 62ff26c7..ad56b192 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/Cartridges/Nintendo/MBC5Cartridge.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/Cartridges/Nintendo/MBC5Cartridge.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; namespace Essgee.Emulation.Cartridges.Nintendo { @@ -34,11 +35,26 @@ namespace Essgee.Emulation.Cartridges.Nintendo public void LoadAxiStatus(AxiEssgssStatusData data) { + ramData = data.MemberData[nameof(ramData)]; + hasBattery = BitConverter.ToBoolean(data.MemberData[nameof(hasBattery)]); + hasRumble = BitConverter.ToBoolean(data.MemberData[nameof(hasRumble)]); + + romBank = BitConverter.ToUInt16(data.MemberData[nameof(romBank)]); + ramBank = data.MemberData[nameof(ramBank)].First(); + ramEnable = BitConverter.ToBoolean(data.MemberData[nameof(ramEnable)]); + //看是否还需要补存储字段 } public AxiEssgssStatusData SaveAxiStatus() { - AxiEssgssStatusData data = new AxiEssgssStatusData(); + AxiEssgssStatusData data = new AxiEssgssStatusData(); + data.MemberData[nameof(ramData)] = ramData; + data.MemberData[nameof(hasBattery)] = BitConverter.GetBytes(hasBattery); + data.MemberData[nameof(hasRumble)] = BitConverter.GetBytes(hasRumble); + //看是否还需要补存储字段 + data.MemberData[nameof(romBank)] = BitConverter.GetBytes(romBank); + data.MemberData[nameof(ramBank)] = BitConverter.GetBytes(ramBank); + data.MemberData[nameof(ramEnable)] = BitConverter.GetBytes(ramEnable); return data; } #endregion diff --git a/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/Cartridges/Nintendo/NoMapperCartridge.cs b/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/Cartridges/Nintendo/NoMapperCartridge.cs index fc795ca8..ed8ef5a4 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/Cartridges/Nintendo/NoMapperCartridge.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/Cartridges/Nintendo/NoMapperCartridge.cs @@ -1,4 +1,5 @@ using System; +using System.Xml; namespace Essgee.Emulation.Cartridges.Nintendo { @@ -17,11 +18,17 @@ namespace Essgee.Emulation.Cartridges.Nintendo public void LoadAxiStatus(AxiEssgssStatusData data) { + ramData = data.MemberData[nameof(ramData)]; + hasBattery = BitConverter.ToBoolean(data.MemberData[nameof(hasBattery)]); + //看是否还需要补存储字段 } public AxiEssgssStatusData SaveAxiStatus() { AxiEssgssStatusData data = new AxiEssgssStatusData(); + data.MemberData[nameof(ramData)] = ramData; + data.MemberData[nameof(hasBattery)] = BitConverter.GetBytes(hasBattery); + //看是否还需要补存储字段 return data; } #endregion diff --git a/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/EmulatorHandler.cs b/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/EmulatorHandler.cs index 74df43e4..36b59d30 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/EmulatorHandler.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/EmulatorHandler.cs @@ -99,11 +99,12 @@ namespace Essgee.Emulation public (string Manufacturer, string Model, string DatFileName, double RefreshRate, double PixelAspectRatio, (string Name, string Description)[] RuntimeOptions) Information => (emulator.ManufacturerName, emulator.ModelName, emulator.DatFilename, emulator.RefreshRate, emulator.PixelAspectRatio, emulator.RuntimeOptions); - public EmulatorHandler(Type type, Action<Exception> exceptionHandler = null) + public EmulatorHandler(Type type, Action<Exception> exceptionHandler = null, IAxiEssgssStatusBytesCover statusBytesCover = null) { this.exceptionHandler = exceptionHandler; emulator = (IMachine)Activator.CreateInstance(type); + AxiStatus.Init(statusBytesCover); } public void SetConfiguration(IConfiguration config) diff --git a/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/Machines/GameBoy.cs b/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/Machines/GameBoy.cs index 1ad5db52..2fbd7f6f 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/Machines/GameBoy.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/Machines/GameBoy.cs @@ -136,11 +136,93 @@ namespace Essgee.Emulation.Machines public void LoadAxiStatus(AxiEssgssStatusData data) { + //config 暂时不需要存什么? + //configuration. = data.MemberData[nameof(configuration.)].ToEnum<TVStandard>(); + + if (data.MemberData.ContainsKey(nameof(bootstrap))) + bootstrap = data.MemberData[nameof(bootstrap)]; + + cartridge.LoadAxiStatus(data.ClassData[nameof(cartridge)]); + wram = data.MemberData[nameof(wram)]; + hram = data.MemberData[nameof(hram)]; + ie = data.MemberData[nameof(ie)].First(); + cpu.LoadAxiStatus(data.ClassData[nameof(cpu)]); + video.LoadAxiStatus(data.ClassData[nameof(video)]); + audio.LoadAxiStatus(data.ClassData[nameof(audio)]); + + //看是否还需要补存储字段 + + + joypadRegister = data.MemberData[nameof(joypadRegister)].First(); + serialData = data.MemberData[nameof(serialData)].First(); + serialUseInternalClock = BitConverter.ToBoolean(data.MemberData[nameof(serialUseInternalClock)]); + divider = data.MemberData[nameof(divider)].First(); + timerCounter = data.MemberData[nameof(timerCounter)].First(); + clockCycleCount = BitConverter.ToUInt16(data.MemberData[nameof(clockCycleCount)]); + timerModulo = data.MemberData[nameof(timerModulo)].First(); + timerRunning = BitConverter.ToBoolean(data.MemberData[nameof(timerRunning)]); + timerInputClock = data.MemberData[nameof(timerInputClock)].First(); + timerOverflow = BitConverter.ToBoolean(data.MemberData[nameof(timerOverflow)]); + timerLoading = BitConverter.ToBoolean(data.MemberData[nameof(timerLoading)]); + irqVBlank = BitConverter.ToBoolean(data.MemberData[nameof(irqVBlank)]); + irqLCDCStatus = BitConverter.ToBoolean(data.MemberData[nameof(irqLCDCStatus)]); + irqTimerOverflow = BitConverter.ToBoolean(data.MemberData[nameof(irqTimerOverflow)]); + irqSerialIO = BitConverter.ToBoolean(data.MemberData[nameof(irqSerialIO)]); + irqKeypad = BitConverter.ToBoolean(data.MemberData[nameof(irqKeypad)]); + bootstrapDisabled = BitConverter.ToBoolean(data.MemberData[nameof(bootstrapDisabled)]); + + + serialBitsCounter = BitConverter.ToInt32(data.MemberData[nameof(serialBitsCounter)]); + serialCycles = BitConverter.ToInt32(data.MemberData[nameof(serialCycles)]); + currentMasterClockCyclesInFrame = BitConverter.ToInt32(data.MemberData[nameof(currentMasterClockCyclesInFrame)]); + totalMasterClockCyclesInFrame = BitConverter.ToInt32(data.MemberData[nameof(totalMasterClockCyclesInFrame)]); + + ReconfigureSystem(); } public AxiEssgssStatusData SaveAxiStatus() { AxiEssgssStatusData data = new AxiEssgssStatusData(); + + //config 暂时不需要存什么? + //data.MemberData[nameof(configuration.TVStandard)] = configuration.TVStandard.ToByteArray(); + + if (bootstrap != null) + data.MemberData[nameof(bootstrap)] = bootstrap; + + data.ClassData[nameof(cartridge)] = cartridge.SaveAxiStatus(); + data.MemberData[nameof(wram)] = wram; + data.MemberData[nameof(hram)] = hram; + data.MemberData[nameof(ie)] = BitConverter.GetBytes(ie); + data.ClassData[nameof(cpu)] = cpu.SaveAxiStatus(); + data.ClassData[nameof(video)] = video.SaveAxiStatus(); + data.ClassData[nameof(audio)] = audio.SaveAxiStatus(); + + //看是否还需要补存储字段 + + data.MemberData[nameof(joypadRegister)] = BitConverter.GetBytes(joypadRegister); + data.MemberData[nameof(serialData)] = BitConverter.GetBytes(serialData); + data.MemberData[nameof(serialUseInternalClock)] = BitConverter.GetBytes(serialUseInternalClock); + data.MemberData[nameof(divider)] = BitConverter.GetBytes(divider); + data.MemberData[nameof(timerCounter)] = BitConverter.GetBytes(timerCounter); + data.MemberData[nameof(clockCycleCount)] = BitConverter.GetBytes(clockCycleCount); + data.MemberData[nameof(timerModulo)] = BitConverter.GetBytes(timerModulo); + data.MemberData[nameof(timerRunning)] = BitConverter.GetBytes(timerRunning); + data.MemberData[nameof(timerInputClock)] = BitConverter.GetBytes(timerInputClock); + data.MemberData[nameof(timerOverflow)] = BitConverter.GetBytes(timerOverflow); + data.MemberData[nameof(timerLoading)] = BitConverter.GetBytes(timerLoading); + data.MemberData[nameof(irqVBlank)] = BitConverter.GetBytes(irqVBlank); + data.MemberData[nameof(irqLCDCStatus)] = BitConverter.GetBytes(irqLCDCStatus); + data.MemberData[nameof(irqTimerOverflow)] = BitConverter.GetBytes(irqTimerOverflow); + data.MemberData[nameof(irqSerialIO)] = BitConverter.GetBytes(irqSerialIO); + data.MemberData[nameof(irqKeypad)] = BitConverter.GetBytes(irqKeypad); + data.MemberData[nameof(bootstrapDisabled)] = BitConverter.GetBytes(bootstrapDisabled); + + data.MemberData[nameof(serialBitsCounter)] = BitConverter.GetBytes(serialBitsCounter); + data.MemberData[nameof(serialCycles)] = BitConverter.GetBytes(serialCycles); + data.MemberData[nameof(currentMasterClockCyclesInFrame)] = BitConverter.GetBytes(currentMasterClockCyclesInFrame); + data.MemberData[nameof(totalMasterClockCyclesInFrame)] = BitConverter.GetBytes(totalMasterClockCyclesInFrame); + return data; } #endregion diff --git a/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/Machines/GameGear.cs b/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/Machines/GameGear.cs index d218db46..bc7ce208 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/Machines/GameGear.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/Emulation/Machines/GameGear.cs @@ -301,7 +301,9 @@ namespace Essgee.Emulation.Machines { configuration.Region = data.MemberData[nameof(configuration.Region)].ToEnum<Region>(); - bootstrap.LoadAxiStatus(data.ClassData[nameof(bootstrap)]); + if (data.ClassData.ContainsKey(nameof(bootstrap))) + bootstrap.LoadAxiStatus(data.ClassData[nameof(bootstrap)]); + cartridge.LoadAxiStatus(data.ClassData[nameof(cartridge)]); wram = data.MemberData[nameof(wram)]; cpu.LoadAxiStatus(data.ClassData[nameof(cpu)]); @@ -327,7 +329,9 @@ namespace Essgee.Emulation.Machines AxiEssgssStatusData data = new AxiEssgssStatusData(); data.MemberData[nameof(configuration.Region)] = configuration.Region.ToByteArray(); - data.ClassData[nameof(bootstrap)] = bootstrap.SaveAxiStatus(); + if (bootstrap != null) + data.ClassData[nameof(bootstrap)] = bootstrap.SaveAxiStatus(); + data.ClassData[nameof(cartridge)] = cartridge.SaveAxiStatus(); data.MemberData[nameof(wram)] = wram; data.ClassData[nameof(cpu)] = cpu.SaveAxiStatus(); diff --git a/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/IAxiStatus.cs b/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/IAxiStatus.cs index 64c9382c..1682cf97 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/IAxiStatus.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/Essgee.Unity/IAxiStatus.cs @@ -12,6 +12,7 @@ public class AxiEssgssStatusData public Dictionary<string, AxiEssgssStatusData> ClassData = new Dictionary<string, AxiEssgssStatusData>(); } + [Serializable] public class AxiEssgssStatusData_2DArray { @@ -30,25 +31,16 @@ public class AxiEssgssStatusData_2DArray return array1D.CreateByteArray2D(rows, cols); } } -public static class AxiEssgssStatusDataExtention +internal static class AxiEssgssStatusDataExtention { - public static byte[] ToByteArray(this AxiEssgssStatusData data) + internal static byte[] ToByteArray(this AxiEssgssStatusData data) { - using (MemoryStream ms = new MemoryStream()) - { - BinaryFormatter formatter = new BinaryFormatter(); - formatter.Serialize(ms, data); - return ms.ToArray(); - } + return AxiStatus.saveCover.ToByteArray(data); } - public static AxiEssgssStatusData ToAxiEssgssStatusData(this byte[] byteArray) + internal static AxiEssgssStatusData ToAxiEssgssStatusData(this byte[] byteArray) { - using (MemoryStream ms = new MemoryStream(byteArray)) - { - BinaryFormatter formatter = new BinaryFormatter(); - return (AxiEssgssStatusData)formatter.Deserialize(ms); - } + return AxiStatus.saveCover.ToAxiEssgssStatusData(byteArray); } } public interface IAxiStatus @@ -57,8 +49,19 @@ public interface IAxiStatus public AxiEssgssStatusData SaveAxiStatus(); } +public interface IAxiEssgssStatusBytesCover +{ + public byte[] ToByteArray(AxiEssgssStatusData data); + public AxiEssgssStatusData ToAxiEssgssStatusData(byte[] byteArray); +} + internal static class AxiStatus { + public static IAxiEssgssStatusBytesCover saveCover { get; private set; } + public static void Init(IAxiEssgssStatusBytesCover coverter) + { + saveCover = coverter; + } // ������ö������ת��Ϊbyte[] public static byte[] ToByteArray<TEnum>(this TEnum[] enumArray) where TEnum : struct, Enum {