From 1aec567eb23898319262064f3d6604777a9424d2 Mon Sep 17 00:00:00 2001 From: sin365 <353374337@qq.com> Date: Fri, 7 Nov 2025 00:30:07 +0800 Subject: [PATCH] =?UTF-8?q?MAME:=E7=BB=88=E4=BA=8E=E5=9F=BA=E6=9C=AC?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E4=BA=86MAME=E7=9A=84CPU=20Timer=E7=9A=84?= =?UTF-8?q?=E5=AF=B9=E8=B1=A1=E6=B1=A0=EF=BC=8C=E5=BC=80=E5=BF=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Plugins/Mame.Core/cpu/m6800/M6800.cs | 12 +- .../Assets/Plugins/Mame.Core/emu/Cpuexec.cs | 17 +- .../Assets/Plugins/Mame.Core/emu/EmuTimer.cs | 434 +++++++++++++++--- .../Assets/Plugins/Mame.Core/emu/Mame.cs | 4 +- .../Assets/Plugins/Mame.Core/emu/Video.cs | 31 +- .../Assets/Plugins/Mame.Core/emu/Watchdog.cs | 3 +- .../Mame.Core/mame/konami68000/Konami68000.cs | 2 +- .../Plugins/Mame.Core/mame/m72/Audio.cs | 10 +- .../Assets/Plugins/Mame.Core/mame/m72/M72.cs | 2 +- .../Assets/Plugins/Mame.Core/mame/m92/M92.cs | 11 +- .../Plugins/Mame.Core/mame/m92/Video.cs | 6 +- .../Plugins/Mame.Core/mame/neogeo/Neogeo.cs | 13 +- .../Plugins/Mame.Core/mame/neogeo/Video.cs | 7 +- .../Plugins/Mame.Core/mame/taito/Opwolf.cs | 2 +- .../Plugins/Mame.Core/mame/taitob/Taitob.cs | 20 +- .../Assets/Plugins/Mame.Core/sound/ICS2115.cs | 29 +- .../Assets/Plugins/Mame.Core/sound/MSM5205.cs | 6 +- .../Assets/Plugins/Mame.Core/sound/Sound.cs | 45 +- .../Assets/Plugins/Mame.Core/sound/Upd7759.cs | 3 +- .../Assets/Plugins/Mame.Core/sound/YM2151.cs | 6 +- .../Assets/Plugins/Mame.Core/sound/YM2203.cs | 28 +- .../Assets/Plugins/Mame.Core/sound/YM2610.cs | 24 +- .../Assets/Plugins/Mame.Core/sound/YM3812.cs | 27 +- 23 files changed, 580 insertions(+), 162 deletions(-) diff --git a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/cpu/m6800/M6800.cs b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/cpu/m6800/M6800.cs index 288bd5fd..dbd25d5b 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/cpu/m6800/M6800.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/cpu/m6800/M6800.cs @@ -245,8 +245,10 @@ namespace cpu.m6800 cycles = cycles_63701; clock = 1536000; irq_callback = null; - m6800_rx_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.M6800_action_rx, false); - m6800_tx_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.M6800_action_tx, false); + //m6800_rx_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.M6800_action_rx, false); + EmuTimer.timer_alloc_common(ref m6800_rx_timer, EmuTimer.TIME_ACT.M6800_action_rx, false); + //m6800_tx_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.M6800_action_tx, false); + EmuTimer.timer_alloc_common(ref m6800_tx_timer, EmuTimer.TIME_ACT.M6800_action_tx, false); } public override void Reset() { @@ -1344,8 +1346,10 @@ namespace cpu.m6800 }; clock = 1000000; irq_callback = Cpuint.cpu_3_irq_callback; - m6800_rx_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.M6800_action_rx, false); - m6800_tx_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.M6800_action_tx, false); + //m6800_rx_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.M6800_action_rx, false); + EmuTimer.timer_alloc_common(ref m6800_rx_timer, EmuTimer.TIME_ACT.M6800_action_rx, false); + //m6800_tx_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.M6800_action_tx, false); + EmuTimer.timer_alloc_common(ref m6800_tx_timer, EmuTimer.TIME_ACT.M6800_action_tx, false); } public override int ExecuteCycles(int cycles) { diff --git a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/emu/Cpuexec.cs b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/emu/Cpuexec.cs index 2426fead..ea3236dd 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/emu/Cpuexec.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/emu/Cpuexec.cs @@ -2244,12 +2244,15 @@ namespace MAME.Core case "CPS-1(QSound)": case "CPS2": timedint_period = new Atime(0, (long)(1e18 / 250)); - timedint_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Generic_irq_1_0_line_hold, false); + //timedint_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Generic_irq_1_0_line_hold, false); + EmuTimer.timer_alloc_common(ref timedint_timer, EmuTimer.TIME_ACT.Generic_irq_1_0_line_hold, false); EmuTimer.timer_adjust_periodic(timedint_timer, timedint_period, timedint_period); break; case "Neo Geo": - interleave_boost_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Cpuexec_null_callback, false); - interleave_boost_timer_end = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Cpuexec_end_interleave_boost, false); + //interleave_boost_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Cpuexec_null_callback, false); + EmuTimer.timer_alloc_common(ref interleave_boost_timer, EmuTimer.TIME_ACT.Cpuexec_null_callback, false); + //interleave_boost_timer_end = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Cpuexec_end_interleave_boost, false); + EmuTimer.timer_alloc_common(ref interleave_boost_timer_end, EmuTimer.TIME_ACT.Cpuexec_end_interleave_boost, false); break; case "CPS1": case "Namco System 1": @@ -2295,7 +2298,7 @@ namespace MAME.Core case "bublcave11": case "bublcave10": timeslice_period = new Atime(0, Video.screenstate.frame_period / 100); - timeslice_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Cpuexec_cpu_timeslicecallback, false); + EmuTimer.timer_alloc_common(ref timeslice_timer, EmuTimer.TIME_ACT.Cpuexec_cpu_timeslicecallback, false); EmuTimer.timer_adjust_periodic(timeslice_timer, timeslice_period, timeslice_period); break; case "opwolf": @@ -2305,14 +2308,14 @@ namespace MAME.Core case "opwolfb": case "opwolfp": timeslice_period = new Atime(0, Video.screenstate.frame_period / 10); - timeslice_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Cpuexec_cpu_timeslicecallback, false); + EmuTimer.timer_alloc_common(ref timeslice_timer, EmuTimer.TIME_ACT.Cpuexec_cpu_timeslicecallback, false); EmuTimer.timer_adjust_periodic(timeslice_timer, timeslice_period, timeslice_period); break; } break; case "Taito B": timeslice_period = new Atime(0, Video.screenstate.frame_period / 10); - timeslice_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Cpuexec_cpu_timeslicecallback, false); + EmuTimer.timer_alloc_common(ref timeslice_timer, EmuTimer.TIME_ACT.Cpuexec_cpu_timeslicecallback, false); EmuTimer.timer_adjust_periodic(timeslice_timer, timeslice_period, timeslice_period); break; case "Capcom": @@ -2338,7 +2341,7 @@ namespace MAME.Core case "sfan": case "sfp": timedint_period = new Atime(0, (long)(1e18 / 8000)); - timedint_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Generic_irq_2_0_line_hold, false); + EmuTimer.timer_alloc_common(ref timedint_timer, EmuTimer.TIME_ACT.Generic_irq_2_0_line_hold, false); EmuTimer.timer_adjust_periodic(timedint_timer, timedint_period, timedint_period); break; } diff --git a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/emu/EmuTimer.cs b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/emu/EmuTimer.cs index 4b5016d6..3a81bbf3 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/emu/EmuTimer.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/emu/EmuTimer.cs @@ -2,12 +2,87 @@ using System; using System.Collections.Concurrent; using System.Collections.Generic; +using System.Runtime.ConstrainedExecution; +using System.Threading; +using System.Timers; +using static MAME.Core.EmuTimer; namespace MAME.Core { + public class EmuTimerLister + { + public emu_timer this[int index] + { + get { return timerlist[index]; } + set { timerlist[index] = value; } // 如果需要设置的话 + } + public static void GetNewTimerLister(ref EmuTimerLister tlistObj) + { + //如果新旧值替换 + if (tlistObj != null) + { + tlistObj.ReleaseLister(); + ObjectPoolAuto.Release(tlistObj); + tlistObj = null; + } + + tlistObj = ObjectPoolAuto.Acquire(); + tlistObj.InitLister(); + } + + List timerlist; + + public List GetSrcList() + { + return timerlist; + } + public int Count + { + get { return timerlist.Count; } + } + + void InitLister() + { + ReleaseLister(); + timerlist = ObjectPoolAuto.AcquireList(); + } + void ReleaseLister() + { + if (timerlist != null) + { + Clear(); + ObjectPoolAuto.Release(timerlist); + timerlist = null; + } + } + + public void Clear() + { + emu_timer.ClearList(ref timerlist); + } + public void Add(emu_timer timer) + { + emu_timer.AddList(ref timerlist, ref timer); + } + public void Remove(emu_timer timer) + { + emu_timer.RemoveToList(ref timerlist, ref timer); + } + + public void Insert(int index, emu_timer timer) + { + emu_timer.InsertToList(ref timerlist, index, ref timer); + } + + public int IndexOf(emu_timer timer) + { + return timerlist.IndexOf(timer); + } + } + public class EmuTimer { - public static List lt; + public static EmuTimerLister lt; private static List lt2; public static Atime global_basetime; public static Atime global_basetime_obj; @@ -29,7 +104,8 @@ namespace MAME.Core public static void instancingTimerList() { - lt = new List(); + //lt = new List(); + EmuTimerLister.GetNewTimerLister(ref lt); } public class emu_timer @@ -49,27 +125,167 @@ namespace MAME.Core period = default; start = default; expire = default; + _refCount = 1; } + static HashSet _readyToRelease = new HashSet(); /// /// 线程安全队列(因为析构函数是额外线程来的) /// static ConcurrentQueue _failedDeletions = new ConcurrentQueue(); + + static int outTimerAllCount = 0; + static int newTimerCount = 0; public static emu_timer GetEmu_timer() { - if (_failedDeletions.TryDequeue(out emu_timer obj)) - { - obj.reset(); - return obj; + emu_timer obj; + if (!_failedDeletions.TryDequeue(out obj)) + { + obj = new emu_timer(); + newTimerCount++; } - - return new emu_timer(); + obj.reset(); + outTimerAllCount++; + return obj; } - public static void EnqueueObj(emu_timer obj) + /// + /// 释放创建的引用,这个要和GetEmu_timer成对 + /// + /// + public static void ReleaseCreateRef(emu_timer obj) + { + obj.ReleaseRef(); + } + + public static void CheckReadyRelaseAfterRun() + { + if (_readyToRelease.Count < 1) + return; + + int beforpoolcount = _failedDeletions.Count; + int releaseCount = 0; + foreach (var ready in _readyToRelease) + { + if (ready._refCount <= 0) + { + ready.ReturnToPool(); + releaseCount++; + } + } + //UnityEngine.Debug.Log($"CheckReadyRelaseAfterRun 出池数量{outTimerAllCount},其中new创建的数量{newTimerCount} 回收数量{releaseCount} ,处理前池数量{beforpoolcount},处理后池数量{_failedDeletions.Count}"); + outTimerAllCount = 0; + newTimerCount = 0; + _readyToRelease.Clear(); + } + + // 引用计数字段(线程安全) + private int _refCount = 1; // 初始为1,表示创建时的引用 + + /// + /// 增加引用计数 + /// + void AddRef() + { + int newCount = Interlocked.Increment(ref _refCount); + + //引用计数重新回到1时,移除。 + //但是还是不在这里做把注释了,在每一帧开始之前统一检测 + //if (newCount == 1) + //{ + // if (_readyToRelease.Contains(this)) + // { + // //UnityEngine.Debug.Log("移除ReadyToRelease"); + // _readyToRelease.Remove(this); + // } + //} + } + + /// + /// 减少引用计数,当计数为0时释放对象回池 + /// + void ReleaseRef() + { + int newCount = Interlocked.Decrement(ref _refCount); + if (newCount == 0) + { + // 引用计数为0,释放资源并回池 + ReadyToRelease(); + } + else if (newCount < 0) + { + // 引用计数异常,不应出现负数 + throw new InvalidOperationException("引用计数出现负数"); + } + } + + void ReadyToRelease() + { + //UnityEngine.Debug.Log("ReadyToRelease"); + if(!_readyToRelease.Contains(this)) + _readyToRelease.Add(this); + } + + /// + /// 释放资源并回池 + /// + void ReturnToPool() + { + reset(); + _failedDeletions.Enqueue(this); + } + + #region 外部操作 间接影响引用计数 + public static void SetRefUsed(ref emu_timer refattr, ref emu_timer emu_timer) + { + if (refattr == emu_timer) + return; + if (emu_timer == null) + { + SetNull(ref refattr); + return; + } + if (refattr != null) + refattr.ReleaseRef(); + + refattr = emu_timer; + refattr.AddRef(); + } + public static void SetNull(ref emu_timer timer) + { + if (timer != null) + { + timer.ReleaseRef(); + timer = null; + } + } + public static void AddList(ref List list, ref emu_timer timer) + { + list.Add(timer); + timer.AddRef(); + } + internal static void InsertToList(ref List list, int index, ref emu_timer timer) + { + list.Insert(index, timer); + timer.AddRef(); + } + public static void RemoveToList(ref List list, ref emu_timer timer) + { + list.Remove(timer); + timer.ReleaseRef(); + } + internal static void ClearList(ref List list) + { + for (int i = 0; i < list.Count; i++) + list[i].ReleaseRef(); + list.Clear(); + } + #endregion + /* + static void EnqueueObj(emu_timer obj) { _failedDeletions.Enqueue(obj); } - + ~emu_timer() { //咱也没办法,这样子来实现emu_timer的回收到对象池。只能这样实现,MAME里面对于emu_timer持有引用比较混沌,在确保没有引用计数时,再安全回池。 @@ -79,7 +295,7 @@ namespace MAME.Core //说人话,就是用析构驱动回池,而不破坏现有代码 EnqueueObj(this); GC.ReRegisterForFinalize(this);//手动注册,否则析构函数再也不会回调 - } + }*/ } public class emu_timer2 { @@ -258,7 +474,8 @@ namespace MAME.Core public static void timer_init() { global_basetime = Attotime.ATTOTIME_ZERO; - lt = new List(); + //lt = new List(); + EmuTimerLister.GetNewTimerLister(ref lt); lt2 = new List(); lt2.Add(new emu_timer2(1, TIME_ACT.Video_vblank_begin_callback)); lt2.Add(new emu_timer2(2, TIME_ACT.Mame_soft_reset)); @@ -518,12 +735,14 @@ namespace MAME.Core } public static void timer_pulse_internal(Atime period, TIME_ACT action) { - emu_timer timer = timer_alloc_common(action, false); + //emu_timer timer = timer_alloc_common(action, false); + emu_timer timer = timer_alloc_common_NoRef(action, false); timer_adjust_periodic(timer, period, period); } public static void timer_set_internal(TIME_ACT action) { - emu_timer timer = timer_alloc_common(action, true); + //emu_timer timer = timer_alloc_common(action, true); + emu_timer timer = timer_alloc_common_NoRef(action, true); timer_adjust_periodic(timer, Attotime.ATTOTIME_ZERO, Attotime.ATTOTIME_NEVER); } public static void timer_list_insert(emu_timer timer1) @@ -532,7 +751,8 @@ namespace MAME.Core int i1 = -1; if (timer1.action == TIME_ACT.Cpuint_cpunum_empty_event_queue || timer1.action == TIME_ACT.setvector) { - foreach (emu_timer et in lt) + //foreach (emu_timer et in lt) + foreach (emu_timer et in lt.GetSrcList()) { if (et.action == timer1.action && Attotime.attotime_compare(et.expire, global_basetime) <= 0) { @@ -561,7 +781,8 @@ namespace MAME.Core if (timer1.action == TIME_ACT.Cpuint_cpunum_empty_event_queue || timer1.action == TIME_ACT.setvector) { timer_list_remove_lt1.Clear(); - foreach (emu_timer et in lt) + //foreach (emu_timer et in lt) + foreach (emu_timer et in lt.GetSrcList()) { if (et.action == timer1.action && Attotime.attotime_compare(et.expire, timer1.expire) == 0) { @@ -585,7 +806,10 @@ namespace MAME.Core } else { - foreach (emu_timer et in lt) + //TODO MAME.NET原来这么foreach写删除是有问题的 + + //foreach (emu_timer et in lt) + foreach (emu_timer et in lt.GetSrcList()) { if (et.action == timer1.action) { @@ -667,10 +891,54 @@ namespace MAME.Core } } } - public static emu_timer timer_alloc_common(TIME_ACT action, bool temp) + //public static emu_timer timer_alloc_common(TIME_ACT action, bool temp) + //{ + // Atime time = get_current_time(); + // //emu_timer timer = new emu_timer(); + // emu_timer timer = emu_timer.GetEmu_timerNoRef(); + // timer.action = action; + // timer.enabled = false; + // timer.temporary = temp; + // timer.period = Attotime.ATTOTIME_ZERO; + // //timer.func = func; + // timer.start = time; + // timer.expire = Attotime.ATTOTIME_NEVER; + // timer_list_insert(timer); + // return timer; + //} + + /// + /// 申请新的timer,且直接操作引用计数 + /// + /// + /// + /// + public static void timer_alloc_common(ref emu_timer refattr, TIME_ACT action, bool temp) + { + //Atime time = get_current_time(); + //emu_timer timer = emu_timer.GetEmu_timerNoRef(); + //timer.action = action; + //timer.enabled = false; + //timer.temporary = temp; + //timer.period = Attotime.ATTOTIME_ZERO; + ////timer.func = func; + //timer.start = time; + //timer.expire = Attotime.ATTOTIME_NEVER; + //timer_list_insert(timer); + emu_timer timer = timer_alloc_common_NoRef(action, temp); + emu_timer.SetRefUsed(ref refattr, ref timer); + } + + /// + /// 申请新的timer,不操作额外引用计数,用于外部中间传递 + /// + /// + /// + /// + public static emu_timer timer_alloc_common_NoRef(TIME_ACT action, bool temp) { Atime time = get_current_time(); - //emu_timer timer = new emu_timer(); + //创建一个timer emu_timer timer = emu_timer.GetEmu_timer(); timer.action = action; timer.enabled = false; @@ -680,8 +948,11 @@ namespace MAME.Core timer.start = time; timer.expire = Attotime.ATTOTIME_NEVER; timer_list_insert(timer); + //断开创建的引用计数 + emu_timer.ReleaseCreateRef(timer); return timer; } + public static bool timer_enable(emu_timer which, bool enable) { bool old; @@ -734,10 +1005,12 @@ namespace MAME.Core { int i, i1, n; n = reader.ReadInt32(); - lt = new List(); + //lt = new List(); + EmuTimerLister.GetNewTimerLister(ref lt); for (i = 0; i < n; i++) { - emu_timer etimer = new emu_timer(); + emu_timer etimer = emu_timer.GetEmu_timer(); + #region lt.Add(etimer); i1 = reader.ReadInt32(); etimer.action = getactionbyindex(i1); @@ -753,43 +1026,49 @@ namespace MAME.Core //if (etimer.func == "vblank_begin_callback") if (etimer.action == TIME_ACT.Video_vblank_begin_callback) { - Video.vblank_begin_timer = etimer; + emu_timer.SetRefUsed(ref Video.vblank_begin_timer, ref etimer);//Video.vblank_begin_timer = etimer; lt.Remove(etimer); lt.Add(Video.vblank_begin_timer); } else if (etimer.action == TIME_ACT.Video_vblank_end_callback) { - Video.vblank_end_timer = etimer; + //Video.vblank_end_timer = etimer; + emu_timer.SetRefUsed(ref Video.vblank_end_timer, ref etimer); lt.Remove(etimer); lt.Add(Video.vblank_end_timer); } else if (etimer.action == TIME_ACT.Mame_soft_reset) { - Mame.soft_reset_timer = etimer; + //Mame.soft_reset_timer = etimer; + emu_timer.SetRefUsed(ref Mame.soft_reset_timer, ref etimer); lt.Remove(etimer); lt.Add(Mame.soft_reset_timer); } else if (etimer.action == TIME_ACT.Watchdog_watchdog_callback) { - Watchdog.watchdog_timer = etimer; + //Watchdog.watchdog_timer = etimer; + emu_timer.SetRefUsed(ref Watchdog.watchdog_timer, ref etimer); lt.Remove(etimer); lt.Add(Watchdog.watchdog_timer); } else if (etimer.action == TIME_ACT.Generic_irq_1_0_line_hold) { - Cpuexec.timedint_timer = etimer; + //Cpuexec.timedint_timer = etimer; + emu_timer.SetRefUsed(ref Cpuexec.timedint_timer, ref etimer); lt.Remove(etimer); lt.Add(Cpuexec.timedint_timer); } else if (etimer.action == TIME_ACT.YM2151_timer_callback_a) { - YM2151.PSG.timer_A = etimer; + //YM2151.PSG.timer_A = etimer; + emu_timer.SetRefUsed(ref YM2151.PSG.timer_A, ref etimer); lt.Remove(etimer); lt.Add(YM2151.PSG.timer_A); } else if (etimer.action == TIME_ACT.YM2151_timer_callback_b) { - YM2151.PSG.timer_B = etimer; + //YM2151.PSG.timer_B = etimer; + emu_timer.SetRefUsed(ref YM2151.PSG.timer_B, ref etimer); lt.Remove(etimer); lt.Add(YM2151.PSG.timer_B); } @@ -800,12 +1079,14 @@ namespace MAME.Core case "CPS2": case "IGS011": case "Konami68000": - Cpuexec.cpu[0].partial_frame_timer = etimer; + //Cpuexec.cpu[0].partial_frame_timer = etimer; + emu_timer.SetRefUsed(ref Cpuexec.cpu[0].partial_frame_timer, ref etimer); lt.Remove(etimer); lt.Add(Cpuexec.cpu[0].partial_frame_timer); break; case "M72": - Cpuexec.cpu[1].partial_frame_timer = etimer; + //Cpuexec.cpu[1].partial_frame_timer = etimer; + emu_timer.SetRefUsed(ref Cpuexec.cpu[1].partial_frame_timer, ref etimer); lt.Remove(etimer); lt.Add(Cpuexec.cpu[1].partial_frame_timer); break; @@ -823,7 +1104,8 @@ namespace MAME.Core case "makaimurc": case "makaimurg": case "diamond": - Cpuexec.cpu[1].partial_frame_timer = etimer; + //Cpuexec.cpu[1].partial_frame_timer = etimer; + emu_timer.SetRefUsed(ref Cpuexec.cpu[1].partial_frame_timer, ref etimer); lt.Remove(etimer); lt.Add(Cpuexec.cpu[1].partial_frame_timer); break; @@ -833,178 +1115,210 @@ namespace MAME.Core } else if (etimer.action == TIME_ACT.Cpuexec_null_callback) { - Cpuexec.interleave_boost_timer = etimer; + //Cpuexec.interleave_boost_timer = etimer; + emu_timer.SetRefUsed(ref Cpuexec.interleave_boost_timer, ref etimer); lt.Remove(etimer); lt.Add(Cpuexec.interleave_boost_timer); } else if (etimer.action == TIME_ACT.Cpuexec_end_interleave_boost) { - Cpuexec.interleave_boost_timer_end = etimer; + //Cpuexec.interleave_boost_timer_end = etimer; + emu_timer.SetRefUsed(ref Cpuexec.interleave_boost_timer_end, ref etimer); lt.Remove(etimer); lt.Add(Cpuexec.interleave_boost_timer_end); } else if (etimer.action == TIME_ACT.Video_scanline0_callback) { - Video.scanline0_timer = etimer; + //Video.scanline0_timer = etimer; + emu_timer.SetRefUsed(ref Video.scanline0_timer, ref etimer); lt.Remove(etimer); lt.Add(Video.scanline0_timer); } else if (etimer.action == TIME_ACT.Neogeo_display_position_interrupt_callback) { - Neogeo.display_position_interrupt_timer = etimer; + //Neogeo.display_position_interrupt_timer = etimer; + emu_timer.SetRefUsed(ref Neogeo.display_position_interrupt_timer, ref etimer); lt.Remove(etimer); lt.Add(Neogeo.display_position_interrupt_timer); } else if (etimer.action == TIME_ACT.Neogeo_display_position_vblank_callback) { - Neogeo.display_position_vblank_timer = etimer; + //Neogeo.display_position_vblank_timer = etimer; + emu_timer.SetRefUsed(ref Neogeo.display_position_vblank_timer, ref etimer); lt.Remove(etimer); lt.Add(Neogeo.display_position_vblank_timer); } else if (etimer.action == TIME_ACT.Neogeo_vblank_interrupt_callback) { - Neogeo.vblank_interrupt_timer = etimer; + //Neogeo.vblank_interrupt_timer = etimer; + emu_timer.SetRefUsed(ref Neogeo.vblank_interrupt_timer, ref etimer); lt.Remove(etimer); lt.Add(Neogeo.vblank_interrupt_timer); } else if (etimer.action == TIME_ACT.Neogeo_auto_animation_timer_callback) { - Neogeo.auto_animation_timer = etimer; + //Neogeo.auto_animation_timer = etimer; + emu_timer.SetRefUsed(ref Neogeo.auto_animation_timer, ref etimer); lt.Remove(etimer); lt.Add(Neogeo.auto_animation_timer); } else if (etimer.action == TIME_ACT.Neogeo_sprite_line_timer_callback) { - Neogeo.sprite_line_timer = etimer; + //Neogeo.sprite_line_timer = etimer; + emu_timer.SetRefUsed(ref Neogeo.sprite_line_timer, ref etimer); lt.Remove(etimer); lt.Add(Neogeo.sprite_line_timer); } else if (etimer.action == TIME_ACT.YM2610_F2610_timer_callback_0) { - YM2610.timer[0] = etimer; + //YM2610.timer[0] = etimer; + emu_timer.SetRefUsed(ref YM2610.timer[0], ref etimer); lt.Remove(etimer); lt.Add(YM2610.timer[0]); } else if (etimer.action == TIME_ACT.YM2610_F2610_timer_callback_1) { - YM2610.timer[1] = etimer; + //YM2610.timer[1] = etimer; + emu_timer.SetRefUsed(ref YM2610.timer[1], ref etimer); lt.Remove(etimer); lt.Add(YM2610.timer[1]); } else if (etimer.action == TIME_ACT.M6800_action_rx) { - M6800.m1.m6800_rx_timer = etimer; + //M6800.m1.m6800_rx_timer = etimer; + emu_timer.SetRefUsed(ref M6800.m1.m6800_rx_timer, ref etimer); lt.Remove(etimer); lt.Add(M6800.m1.m6800_rx_timer); } else if (etimer.action == TIME_ACT.M6800_action_tx) { - M6800.m1.m6800_tx_timer = etimer; + //M6800.m1.m6800_tx_timer = etimer; + emu_timer.SetRefUsed(ref M6800.m1.m6800_tx_timer, ref etimer); lt.Remove(etimer); lt.Add(M6800.m1.m6800_tx_timer); } else if (etimer.action == TIME_ACT.YM3812_timer_callback_3812_0) { - YM3812.timer[0] = etimer; + //YM3812.timer[0] = etimer; + emu_timer.SetRefUsed(ref YM3812.timer[0], ref etimer); lt.Remove(etimer); lt.Add(YM3812.timer[0]); } else if (etimer.action == TIME_ACT.YM3812_timer_callback_3812_1) { - YM3812.timer[1] = etimer; + //YM3812.timer[1] = etimer; + emu_timer.SetRefUsed(ref YM3812.timer[1], ref etimer); lt.Remove(etimer); lt.Add(YM3812.timer[1]); } else if (etimer.action == TIME_ACT.ICS2115_timer_cb_0) { - ICS2115.timer[0].timer = etimer; + //ICS2115.timer[0].timer = etimer; + emu_timer.SetRefUsed(ref ICS2115.timer[0].timer, ref etimer); lt.Remove(etimer); lt.Add(ICS2115.timer[0].timer); } else if (etimer.action == TIME_ACT.ICS2115_timer_cb_1) { - ICS2115.timer[1].timer = etimer; + //ICS2115.timer[1].timer = etimer; + emu_timer.SetRefUsed(ref ICS2115.timer[1].timer, ref etimer); lt.Remove(etimer); lt.Add(ICS2115.timer[1].timer); } else if (etimer.action == TIME_ACT.M72_m72_scanline_interrupt) { - M72.scanline_timer = etimer; + //M72.scanline_timer = etimer; + emu_timer.SetRefUsed(ref M72.scanline_timer, ref etimer); lt.Remove(etimer); lt.Add(M72.scanline_timer); } else if (etimer.action == TIME_ACT.M92_m92_scanline_interrupt) { - M92.scanline_timer = etimer; + //M92.scanline_timer = etimer; + emu_timer.SetRefUsed(ref M72.scanline_timer, ref etimer); lt.Remove(etimer); lt.Add(M92.scanline_timer); } else if (etimer.action == TIME_ACT.Cpuexec_cpu_timeslicecallback) { - Cpuexec.timeslice_timer = etimer; + //Cpuexec.timeslice_timer = etimer; + emu_timer.SetRefUsed(ref Cpuexec.timeslice_timer, ref etimer); lt.Remove(etimer); lt.Add(Cpuexec.timeslice_timer); } else if (etimer.action == TIME_ACT.Upd7759_upd7759_slave_update) { - Upd7759.chip.timer = etimer; + //Upd7759.chip.timer = etimer; + emu_timer.SetRefUsed(ref Upd7759.chip.timer, ref etimer); lt.Remove(etimer); lt.Add(Upd7759.chip.timer); } else if (etimer.action == TIME_ACT.Generic_irq_2_0_line_hold) { - Cpuexec.timedint_timer = etimer; + //Cpuexec.timedint_timer = etimer; + emu_timer.SetRefUsed(ref Cpuexec.timedint_timer, ref etimer); lt.Remove(etimer); lt.Add(Cpuexec.timedint_timer); } else if (etimer.action == TIME_ACT.MSM5205_MSM5205_vclk_callback0) { - MSM5205.timer[0] = etimer; + //MSM5205.timer[0] = etimer; + emu_timer.SetRefUsed(ref MSM5205.timer[0], ref etimer); lt.Remove(etimer); lt.Add(MSM5205.timer[0]); } else if (etimer.action == TIME_ACT.MSM5205_MSM5205_vclk_callback1) { - MSM5205.timer[1] = etimer; + //MSM5205.timer[1] = etimer; + emu_timer.SetRefUsed(ref MSM5205.timer[1], ref etimer); lt.Remove(etimer); lt.Add(MSM5205.timer[1]); } else if (etimer.action == TIME_ACT.YM2203_timer_callback_2203_0_0) { - YM2203.FF2203[0].timer[0] = etimer; + //YM2203.FF2203[0].timer[0] = etimer; + emu_timer.SetRefUsed(ref YM2203.FF2203[0].timer[0], ref etimer); lt.Remove(etimer); lt.Add(YM2203.FF2203[0].timer[0]); } else if (etimer.action == TIME_ACT.YM2203_timer_callback_2203_0_1) { - YM2203.FF2203[0].timer[1] = etimer; + //YM2203.FF2203[0].timer[1] = etimer; + emu_timer.SetRefUsed(ref YM2203.FF2203[0].timer[1], ref etimer); lt.Remove(etimer); lt.Add(YM2203.FF2203[0].timer[1]); } else if (etimer.action == TIME_ACT.YM2203_timer_callback_2203_1_0) { - YM2203.FF2203[1].timer[0] = etimer; + //YM2203.FF2203[1].timer[0] = etimer; + emu_timer.SetRefUsed(ref YM2203.FF2203[1].timer[0], ref etimer); lt.Remove(etimer); lt.Add(YM2203.FF2203[1].timer[0]); } else if (etimer.action == TIME_ACT.YM2203_timer_callback_2203_1_1) { - YM2203.FF2203[1].timer[1] = etimer; + //YM2203.FF2203[1].timer[1] = etimer; + emu_timer.SetRefUsed(ref YM2203.FF2203[1].timer[1], ref etimer); lt.Remove(etimer); lt.Add(YM2203.FF2203[1].timer[1]); } else if (etimer.action == TIME_ACT.YM3812_timer_callback_3526_0) { - YM3812.timer[0] = etimer; + //YM3812.timer[0] = etimer; + emu_timer.SetRefUsed(ref YM3812.timer[0], ref etimer); lt.Remove(etimer); lt.Add(YM3812.timer[0]); } else if (etimer.action == TIME_ACT.YM3812_timer_callback_3526_1) { - YM3812.timer[1] = etimer; + //YM3812.timer[1] = etimer; + emu_timer.SetRefUsed(ref YM3812.timer[1], ref etimer); lt.Remove(etimer); lt.Add(YM3812.timer[1]); } + #endregion + //断开创建的引用计数 + emu_timer.ReleaseCreateRef(etimer); } for (i = n; i < 32; i++) { diff --git a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/emu/Mame.cs b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/emu/Mame.cs index 59c7968e..7a9ac40e 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/emu/Mame.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/emu/Mame.cs @@ -99,6 +99,7 @@ namespace MAME.Core if (exit_pending) return; + EmuTimer.emu_timer.CheckReadyRelaseAfterRun(); long lastframe = Video.screenstate.frame_number; //执行CPU命令,直到一次画面更新 while (lastframe == Video.screenstate.frame_number) @@ -167,7 +168,8 @@ namespace MAME.Core Palette.palette_init(); Generic.generic_machine_init(); EmuTimer.timer_init(); - soft_reset_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Mame_soft_reset, false); + //soft_reset_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Mame_soft_reset, false); + EmuTimer.timer_alloc_common(ref soft_reset_timer,EmuTimer.TIME_ACT.Mame_soft_reset, false); Window.osd_init(); Inptport.input_port_init(); Cpuexec.cpuexec_init(); diff --git a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/emu/Video.cs b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/emu/Video.cs index 213d69cc..7d739454 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/emu/Video.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/emu/Video.cs @@ -706,11 +706,14 @@ namespace MAME.Core - vblank_begin_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Video_vblank_begin_callback, false); + //vblank_begin_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Video_vblank_begin_callback, false); + EmuTimer.timer_alloc_common(ref vblank_begin_timer, EmuTimer.TIME_ACT.Video_vblank_begin_callback, false); EmuTimer.timer_adjust_periodic(vblank_begin_timer, video_screen_get_time_until_vblank_start(), Attotime.ATTOTIME_NEVER); - scanline0_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Video_scanline0_callback, false); + //scanline0_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Video_scanline0_callback, false); + EmuTimer.timer_alloc_common(ref scanline0_timer, EmuTimer.TIME_ACT.Video_scanline0_callback, false); EmuTimer.timer_adjust_periodic(scanline0_timer, video_screen_get_time_until_pos(0, 0), Attotime.ATTOTIME_NEVER); - vblank_end_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Video_vblank_end_callback, false); + //vblank_end_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Video_vblank_end_callback, false); + EmuTimer.timer_alloc_common(ref vblank_end_timer, EmuTimer.TIME_ACT.Video_vblank_end_callback, false); switch (Machine.sBoard) { case "CPS-1": @@ -721,19 +724,19 @@ namespace MAME.Core break; case "CPS2": Cpuexec.cpu[0].partial_frame_period = Attotime.attotime_div(Video.frame_update_time, 262); - Cpuexec.cpu[0].partial_frame_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Cpuexec_trigger_partial_frame_interrupt, false); + EmuTimer.timer_alloc_common(ref Cpuexec.cpu[0].partial_frame_timer, EmuTimer.TIME_ACT.Cpuexec_trigger_partial_frame_interrupt, false); break; case "Tehkan": Cpuexec.cpu[1].partial_frame_period = Attotime.attotime_div(Video.frame_update_time, 2); - Cpuexec.cpu[1].partial_frame_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Cpuexec_trigger_partial_frame_interrupt, false); + EmuTimer.timer_alloc_common(ref Cpuexec.cpu[1].partial_frame_timer, EmuTimer.TIME_ACT.Cpuexec_trigger_partial_frame_interrupt, false); break; case "Neo Geo": break; case "SunA8": Cpuexec.cpu[0].partial_frame_period = Attotime.attotime_div(Video.frame_update_time, 0x100); - Cpuexec.cpu[0].partial_frame_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Cpuexec_trigger_partial_frame_interrupt, false); + EmuTimer.timer_alloc_common(ref Cpuexec.cpu[0].partial_frame_timer, EmuTimer.TIME_ACT.Cpuexec_trigger_partial_frame_interrupt, false); Cpuexec.cpu[1].partial_frame_period = Attotime.attotime_div(Video.frame_update_time, 4); - Cpuexec.cpu[1].partial_frame_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Cpuexec_trigger2, false); + EmuTimer.timer_alloc_common(ref Cpuexec.cpu[1].partial_frame_timer, EmuTimer.TIME_ACT.Cpuexec_trigger2, false); break; case "IGS011": switch (Machine.sName) @@ -748,27 +751,27 @@ namespace MAME.Core case "drgnwrldv40k": case "lhb2": Cpuexec.cpu[0].partial_frame_period = Attotime.attotime_div(Video.frame_update_time, 5); - Cpuexec.cpu[0].partial_frame_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Cpuexec_trigger_partial_frame_interrupt, false); + EmuTimer.timer_alloc_common(ref Cpuexec.cpu[0].partial_frame_timer, EmuTimer.TIME_ACT.Cpuexec_trigger_partial_frame_interrupt, false); break; case "lhb": case "lhbv33c": case "dbc": case "ryukobou": Cpuexec.cpu[0].partial_frame_period = Attotime.attotime_div(Video.frame_update_time, 4); - Cpuexec.cpu[0].partial_frame_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Cpuexec_trigger_partial_frame_interrupt, false); + EmuTimer.timer_alloc_common(ref Cpuexec.cpu[0].partial_frame_timer, EmuTimer.TIME_ACT.Cpuexec_trigger_partial_frame_interrupt, false); break; } break; case "M72": Cpuexec.cpu[1].partial_frame_period = Attotime.attotime_div(Video.frame_update_time, 128); - Cpuexec.cpu[1].partial_frame_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Cpuexec_trigger_partial_frame_interrupt, false); + EmuTimer.timer_alloc_common(ref Cpuexec.cpu[1].partial_frame_timer, EmuTimer.TIME_ACT.Cpuexec_trigger_partial_frame_interrupt, false); break; case "Taito": switch (Machine.sName) { case "bub68705": Cpuexec.cpu[3].partial_frame_period = Attotime.attotime_div(Video.frame_update_time, 2); - Cpuexec.cpu[3].partial_frame_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Cpuexec_trigger_partial_frame_interrupt, false); + EmuTimer.timer_alloc_common(ref Cpuexec.cpu[3].partial_frame_timer, EmuTimer.TIME_ACT.Cpuexec_trigger_partial_frame_interrupt, false); break; } break; @@ -777,7 +780,8 @@ namespace MAME.Core { case "cuebrick": Cpuexec.cpu[0].partial_frame_period = Attotime.attotime_div(Video.frame_update_time, 10); - Cpuexec.cpu[0].partial_frame_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Cpuexec_trigger_partial_frame_interrupt, false); + //Cpuexec.cpu[0].partial_frame_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Cpuexec_trigger_partial_frame_interrupt, false); + EmuTimer.timer_alloc_common(ref Cpuexec.cpu[0].partial_frame_timer, EmuTimer.TIME_ACT.Cpuexec_trigger_partial_frame_interrupt, false); break; } break; @@ -796,7 +800,8 @@ namespace MAME.Core case "makaimurg": case "diamond": Cpuexec.cpu[1].partial_frame_period = Attotime.attotime_div(Video.frame_update_time, 4); - Cpuexec.cpu[1].partial_frame_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Cpuexec_trigger_partial_frame_interrupt, false); + //Cpuexec.cpu[1].partial_frame_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Cpuexec_trigger_partial_frame_interrupt, false); + EmuTimer.timer_alloc_common(ref Cpuexec.cpu[1].partial_frame_timer, EmuTimer.TIME_ACT.Cpuexec_trigger_partial_frame_interrupt, false); break; } break; diff --git a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/emu/Watchdog.cs b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/emu/Watchdog.cs index 1b49f61b..b5a4af4f 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/emu/Watchdog.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/emu/Watchdog.cs @@ -7,7 +7,8 @@ public static Atime watchdog_time; public static void watchdog_init() { - watchdog_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Watchdog_watchdog_callback, false); + //watchdog_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Watchdog_watchdog_callback, false); + EmuTimer.timer_alloc_common(ref watchdog_timer, EmuTimer.TIME_ACT.Watchdog_watchdog_callback, false); switch (Machine.sBoard) { case "CPS-1": diff --git a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/konami68000/Konami68000.cs b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/konami68000/Konami68000.cs index 57c6596a..7ae1de63 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/konami68000/Konami68000.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/konami68000/Konami68000.cs @@ -814,7 +814,7 @@ namespace MAME.Core public static void sound_arm_nmi_w() { Cpuint.cpunum_set_input_line(1, (int)LineState.INPUT_LINE_NMI, LineState.CLEAR_LINE); - EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common( EmuTimer.TIME_ACT.Konami68000_nmi_callback, true); + EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common_NoRef(EmuTimer.TIME_ACT.Konami68000_nmi_callback, true); EmuTimer.timer_adjust_periodic(timer, new Atime(0, (long)50e12), Attotime.ATTOTIME_NEVER); } public static ushort punkshot_kludge_r() diff --git a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/m72/Audio.cs b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/m72/Audio.cs index 68efbb85..8f8a0a8e 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/m72/Audio.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/m72/Audio.cs @@ -47,7 +47,7 @@ //Cpuint.lvec.Add(new vec(1, EmuTimer.get_current_time())); Cpuint.lvec.Add(ObjectPoolAuto.Acquire().setdata(1, EmuTimer.get_current_time())); setvector_param = 1; - EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.setvector, true); + EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common_NoRef(EmuTimer.TIME_ACT.setvector, true); EmuTimer.timer_adjust_periodic(timer, Attotime.ATTOTIME_ZERO, Attotime.ATTOTIME_NEVER); } else @@ -55,7 +55,7 @@ //Cpuint.lvec.Add(new vec(2, EmuTimer.get_current_time())); Cpuint.lvec.Add(ObjectPoolAuto.Acquire().setdata(2, EmuTimer.get_current_time())); setvector_param = 2; - EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.setvector, true); + EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common_NoRef(EmuTimer.TIME_ACT.setvector, true); EmuTimer.timer_adjust_periodic(timer, Attotime.ATTOTIME_ZERO, Attotime.ATTOTIME_NEVER); } } @@ -67,7 +67,7 @@ //Cpuint.lvec.Add(new vec(3, EmuTimer.get_current_time())); Cpuint.lvec.Add(ObjectPoolAuto.Acquire().setdata(3, EmuTimer.get_current_time())); setvector_param = 3; - EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.setvector, true); + EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common_NoRef(EmuTimer.TIME_ACT.setvector, true); EmuTimer.timer_adjust_periodic(timer, Attotime.ATTOTIME_ZERO, Attotime.ATTOTIME_NEVER); } } @@ -77,7 +77,7 @@ //Cpuint.lvec.Add(new vec(3, EmuTimer.get_current_time())); Cpuint.lvec.Add(ObjectPoolAuto.Acquire().setdata(3, EmuTimer.get_current_time())); setvector_param = 3; - EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.setvector, true); + EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common_NoRef(EmuTimer.TIME_ACT.setvector, true); EmuTimer.timer_adjust_periodic(timer, Attotime.ATTOTIME_ZERO, Attotime.ATTOTIME_NEVER); } public static void m72_sound_irq_ack_w(int offset, byte data) @@ -85,7 +85,7 @@ //Cpuint.lvec.Add(new vec(4, EmuTimer.get_current_time())); Cpuint.lvec.Add(ObjectPoolAuto.Acquire().setdata(4, EmuTimer.get_current_time())); setvector_param = 4; - EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.setvector, true); + EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common_NoRef(EmuTimer.TIME_ACT.setvector, true); EmuTimer.timer_adjust_periodic(timer, Attotime.ATTOTIME_ZERO, Attotime.ATTOTIME_NEVER); } public static void m72_set_sample_start(int start) diff --git a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/m72/M72.cs b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/m72/M72.cs index 48509fcd..239c88c5 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/m72/M72.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/m72/M72.cs @@ -297,7 +297,7 @@ namespace MAME.Core } public static void machine_start_m72() { - scanline_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.M72_m72_scanline_interrupt, false); + EmuTimer.timer_alloc_common(ref scanline_timer, EmuTimer.TIME_ACT.M72_m72_scanline_interrupt, false); } public static void machine_reset_m72() { diff --git a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/m92/M92.cs b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/m92/M92.cs index 90fa27eb..6d68d3f3 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/m92/M92.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/m92/M92.cs @@ -411,7 +411,8 @@ namespace MAME.Core { setvector_param = 0; setvector_callback(); - scanline_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.M92_m92_scanline_interrupt, false); + //scanline_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.M92_m92_scanline_interrupt, false); + EmuTimer.timer_alloc_common(ref scanline_timer,EmuTimer.TIME_ACT.M92_m92_scanline_interrupt, false); } public static void machine_reset_m92() { @@ -530,7 +531,7 @@ namespace MAME.Core //Cpuint.lvec.Add(new vec(3, EmuTimer.get_current_time())); Cpuint.lvec.Add(ObjectPoolAuto.Acquire().setdata(3, EmuTimer.get_current_time())); setvector_param = 3; - EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.setvector, true); + EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common_NoRef(EmuTimer.TIME_ACT.setvector, true); EmuTimer.timer_adjust_periodic(timer, Attotime.ATTOTIME_ZERO, Attotime.ATTOTIME_NEVER); Sound.soundlatch_w((ushort)(data & 0xff)); } @@ -547,7 +548,7 @@ namespace MAME.Core //Cpuint.lvec.Add(new vec(4, EmuTimer.get_current_time())); Cpuint.lvec.Add(ObjectPoolAuto.Acquire().setdata(4, EmuTimer.get_current_time())); setvector_param = 4; - EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.setvector, true); + EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common_NoRef(EmuTimer.TIME_ACT.setvector, true); EmuTimer.timer_adjust_periodic(timer, Attotime.ATTOTIME_ZERO, Attotime.ATTOTIME_NEVER); } public static void m92_sound_status_w(ushort data) @@ -562,7 +563,7 @@ namespace MAME.Core //Cpuint.lvec.Add(new vec(1, EmuTimer.get_current_time())); Cpuint.lvec.Add(ObjectPoolAuto.Acquire().setdata(1, EmuTimer.get_current_time())); setvector_param = 1; - EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.setvector, true); + EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common_NoRef(EmuTimer.TIME_ACT.setvector, true); EmuTimer.timer_adjust_periodic(timer, Attotime.ATTOTIME_ZERO, Attotime.ATTOTIME_NEVER); } else @@ -570,7 +571,7 @@ namespace MAME.Core //Cpuint.lvec.Add(new vec(2, EmuTimer.get_current_time())); Cpuint.lvec.Add(ObjectPoolAuto.Acquire().setdata(2, EmuTimer.get_current_time())); setvector_param = 2; - EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.setvector, true); + EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common_NoRef(EmuTimer.TIME_ACT.setvector, true); EmuTimer.timer_adjust_periodic(timer, Attotime.ATTOTIME_ZERO, Attotime.ATTOTIME_NEVER); } } diff --git a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/m92/Video.cs b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/m92/Video.cs index 71543a2c..0a345f22 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/m92/Video.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/m92/Video.cs @@ -45,7 +45,7 @@ namespace MAME.Core { Generic.buffer_spriteram16_w(); m92_sprite_buffer_busy = 0; - EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.M92_spritebuffer_callback, true); + EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common_NoRef(EmuTimer.TIME_ACT.M92_spritebuffer_callback, true); EmuTimer.timer_adjust_periodic(timer, Attotime.attotime_mul(new Atime(0, (long)(1e18 / 26666000)), 0x400), Attotime.ATTOTIME_NEVER); } } @@ -67,7 +67,7 @@ namespace MAME.Core { Generic.buffer_spriteram16_w(); m92_sprite_buffer_busy = 0; - EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.M92_spritebuffer_callback, true); + EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common_NoRef(EmuTimer.TIME_ACT.M92_spritebuffer_callback, true); EmuTimer.timer_adjust_periodic(timer, Attotime.attotime_mul(new Atime(0, (long)(1e18 / 26666000)), 0x400), Attotime.ATTOTIME_NEVER); } } @@ -89,7 +89,7 @@ namespace MAME.Core { Generic.buffer_spriteram16_w(); m92_sprite_buffer_busy = 0; - EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.M92_spritebuffer_callback, true); + EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common_NoRef(EmuTimer.TIME_ACT.M92_spritebuffer_callback, true); EmuTimer.timer_adjust_periodic(timer, Attotime.attotime_mul(new Atime(0, (long)(1e18 / 26666000)), 0x400), Attotime.ATTOTIME_NEVER); } } diff --git a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/neogeo/Neogeo.cs b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/neogeo/Neogeo.cs index 7e2f6854..5fa7c27c 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/neogeo/Neogeo.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/neogeo/Neogeo.cs @@ -365,9 +365,12 @@ namespace MAME.Core audio_cpu_banks[1] = 0x0e; audio_cpu_banks[2] = 0x06; audio_cpu_banks[3] = 0x02; - display_position_interrupt_timer = EmuTimer.timer_alloc_common( EmuTimer.TIME_ACT.Neogeo_display_position_interrupt_callback, false); - display_position_vblank_timer = EmuTimer.timer_alloc_common( EmuTimer.TIME_ACT.Neogeo_display_position_vblank_callback, false); - vblank_interrupt_timer = EmuTimer.timer_alloc_common( EmuTimer.TIME_ACT.Neogeo_vblank_interrupt_callback, false); + //display_position_interrupt_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Neogeo_display_position_interrupt_callback, false); + EmuTimer.timer_alloc_common(ref display_position_interrupt_timer, EmuTimer.TIME_ACT.Neogeo_display_position_interrupt_callback, false); + //display_position_vblank_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Neogeo_display_position_vblank_callback, false); + EmuTimer.timer_alloc_common(ref display_position_vblank_timer, EmuTimer.TIME_ACT.Neogeo_display_position_vblank_callback, false); + //vblank_interrupt_timer = EmuTimer.timer_alloc_common( EmuTimer.TIME_ACT.Neogeo_vblank_interrupt_callback, false); + EmuTimer.timer_alloc_common(ref vblank_interrupt_timer, EmuTimer.TIME_ACT.Neogeo_vblank_interrupt_callback, false); Pd4900a.pd4990a_init(); calendar_init(); irq3_pending = 1; @@ -393,8 +396,8 @@ namespace MAME.Core byte[] temp = new byte[0x2000]; Buffer.BlockCopy(mainram2_src, 0, temp, 0, temp.Length); using (System.IO.MemoryStream ms = new System.IO.MemoryStream(temp)) - { - MameMainMotion.IoSupport.File_WriteAllBytesFromStre("nvram\\" + Machine.sName + ".nv",ms); + { + MameMainMotion.IoSupport.File_WriteAllBytesFromStre("nvram\\" + Machine.sName + ".nv", ms); } } public static void machine_reset_neogeo() diff --git a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/neogeo/Video.cs b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/neogeo/Video.cs index aee7fa0e..15e53f53 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/neogeo/Video.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/neogeo/Video.cs @@ -130,7 +130,8 @@ namespace MAME.Core } private static void create_auto_animation_timer() { - auto_animation_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Neogeo_auto_animation_timer_callback, false); + //auto_animation_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Neogeo_auto_animation_timer_callback, false); + EmuTimer.timer_alloc_common(ref auto_animation_timer, EmuTimer.TIME_ACT.Neogeo_auto_animation_timer_callback, false); } private static void start_auto_animation_timer() { @@ -516,7 +517,7 @@ namespace MAME.Core } } } - + //private static void draw_sprites(int iBitmap, int scanline) //{ // int x_2, code_2; @@ -735,7 +736,7 @@ namespace MAME.Core } private static void create_sprite_line_timer() { - sprite_line_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Neogeo_sprite_line_timer_callback, false); + EmuTimer.timer_alloc_common(ref sprite_line_timer, EmuTimer.TIME_ACT.Neogeo_sprite_line_timer_callback, false); } private static void start_sprite_line_timer() { diff --git a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/taito/Opwolf.cs b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/taito/Opwolf.cs index 29c25c6c..905e2943 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/taito/Opwolf.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/taito/Opwolf.cs @@ -981,7 +981,7 @@ namespace MAME.Core if (cchip_ram[0x7a] == 0 && cchip_last_7a != 0 && current_cmd != 0xf5) { current_cmd = 0xf5; - EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Taito_opwolf_timer_callback, true); + EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common_NoRef(EmuTimer.TIME_ACT.Taito_opwolf_timer_callback, true); EmuTimer.timer_adjust_periodic(timer, new Atime(0, (long)(80000 * Cpuexec.cpu[0].attoseconds_per_cycle)), Attotime.ATTOTIME_NEVER); } cchip_last_7a = cchip_ram[0x7a]; diff --git a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/taitob/Taitob.cs b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/taitob/Taitob.cs index 50587bb6..b0dabfe3 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/taitob/Taitob.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/mame/taitob/Taitob.cs @@ -186,7 +186,7 @@ namespace MAME.Core } public static void rastansaga2_interrupt() { - EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common(TIME_ACT.Taitob_rsaga2_interrupt2, true); + EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common_NoRef(TIME_ACT.Taitob_rsaga2_interrupt2, true); EmuTimer.timer_adjust_periodic(timer, new Atime(0, (long)(5000 * Cpuexec.cpu[0].attoseconds_per_cycle)), Attotime.ATTOTIME_NEVER); Cpuint.cpunum_set_input_line(0, 4, LineState.HOLD_LINE); } @@ -196,7 +196,7 @@ namespace MAME.Core } public static void crimec_interrupt() { - EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common(TIME_ACT.Taitob_crimec_interrupt3, true); + EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common_NoRef(TIME_ACT.Taitob_crimec_interrupt3, true); EmuTimer.timer_adjust_periodic(timer, new Atime(0, (long)(5000 * Cpuexec.cpu[0].attoseconds_per_cycle)), Attotime.ATTOTIME_NEVER); Cpuint.cpunum_set_input_line(0, 5, LineState.HOLD_LINE); } @@ -206,7 +206,7 @@ namespace MAME.Core } public static void hitice_interrupt() { - EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common(TIME_ACT.Taitob_hitice_interrupt6, true); + EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common_NoRef(TIME_ACT.Taitob_hitice_interrupt6, true); EmuTimer.timer_adjust_periodic(timer, new Atime(0, (long)(5000 * Cpuexec.cpu[0].attoseconds_per_cycle)), Attotime.ATTOTIME_NEVER); Cpuint.cpunum_set_input_line(0, 4, LineState.HOLD_LINE); } @@ -216,7 +216,7 @@ namespace MAME.Core } public static void rambo3_interrupt() { - EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common(TIME_ACT.Taitob_rambo3_interrupt1, true); + EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common_NoRef(TIME_ACT.Taitob_rambo3_interrupt1, true); EmuTimer.timer_adjust_periodic(timer, new Atime(0, (long)(5000 * Cpuexec.cpu[0].attoseconds_per_cycle)), Attotime.ATTOTIME_NEVER); Cpuint.cpunum_set_input_line(0, 6, LineState.HOLD_LINE); } @@ -226,7 +226,7 @@ namespace MAME.Core } public static void pbobble_interrupt() { - EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common(TIME_ACT.Taitob_pbobble_interrupt5, true); + EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common_NoRef(TIME_ACT.Taitob_pbobble_interrupt5, true); EmuTimer.timer_adjust_periodic(timer, new Atime(0, (long)(5000 * Cpuexec.cpu[0].attoseconds_per_cycle)), Attotime.ATTOTIME_NEVER); Cpuint.cpunum_set_input_line(0, 3, LineState.HOLD_LINE); } @@ -236,7 +236,7 @@ namespace MAME.Core } public static void viofight_interrupt() { - EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common(TIME_ACT.Taitob_viofight_interrupt1, true); + EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common_NoRef(TIME_ACT.Taitob_viofight_interrupt1, true); EmuTimer.timer_adjust_periodic(timer, new Atime(0, (long)(5000 * Cpuexec.cpu[0].attoseconds_per_cycle)), Attotime.ATTOTIME_NEVER); Cpuint.cpunum_set_input_line(0, 4, LineState.HOLD_LINE); } @@ -246,7 +246,7 @@ namespace MAME.Core } public static void masterw_interrupt() { - EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common(TIME_ACT.Taitob_masterw_interrupt4, true); + EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common_NoRef(TIME_ACT.Taitob_masterw_interrupt4, true); EmuTimer.timer_adjust_periodic(timer, new Atime(0, (long)(5000 * Cpuexec.cpu[0].attoseconds_per_cycle)), Attotime.ATTOTIME_NEVER); Cpuint.cpunum_set_input_line(0, 5, LineState.HOLD_LINE); } @@ -256,7 +256,7 @@ namespace MAME.Core } public static void silentd_interrupt() { - EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common(TIME_ACT.Taitob_silentd_interrupt4, true); + EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common_NoRef(TIME_ACT.Taitob_silentd_interrupt4, true); EmuTimer.timer_adjust_periodic(timer, new Atime(0, (long)(5000 * Cpuexec.cpu[0].attoseconds_per_cycle)), Attotime.ATTOTIME_NEVER); Cpuint.cpunum_set_input_line(0, 6, LineState.HOLD_LINE); } @@ -266,7 +266,7 @@ namespace MAME.Core } public static void selfeena_interrupt() { - EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common(TIME_ACT.Taitob_selfeena_interrupt4, true); + EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common_NoRef(TIME_ACT.Taitob_selfeena_interrupt4, true); EmuTimer.timer_adjust_periodic(timer, new Atime(0, (long)(5000 * Cpuexec.cpu[0].attoseconds_per_cycle)), Attotime.ATTOTIME_NEVER); Cpuint.cpunum_set_input_line(0, 6, LineState.HOLD_LINE); } @@ -276,7 +276,7 @@ namespace MAME.Core } public static void sbm_interrupt() { - EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common(TIME_ACT.Taitob_sbm_interrupt5, true); + EmuTimer.emu_timer timer = EmuTimer.timer_alloc_common_NoRef(TIME_ACT.Taitob_sbm_interrupt5, true); EmuTimer.timer_adjust_periodic(timer, new Atime(0, (long)(10000 * Cpuexec.cpu[0].attoseconds_per_cycle)), Attotime.ATTOTIME_NEVER); Cpuint.cpunum_set_input_line(0, 4, LineState.HOLD_LINE); } diff --git a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/sound/ICS2115.cs b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/sound/ICS2115.cs index 24a806e1..9769225f 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/sound/ICS2115.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/sound/ICS2115.cs @@ -328,13 +328,36 @@ namespace MAME.Core return 0; } } + + static void ReInit_timer() + { + if (timer != null) + { + if (timer[0].timer != null) EmuTimer.emu_timer.SetNull(ref timer[0].timer); + if (timer[1].timer != null) EmuTimer.emu_timer.SetNull(ref timer[1].timer); + timer[0].scale = default; + timer[0].preset = default; + timer[0].period = default; + timer[1].scale = default; + timer[1].preset = default; + timer[1].period = default; + } + else + { + timer = new timer_struct[2]; + } + } + public static void ics2115_start() { int i; voice2 = new voice_struct[32]; - timer = new timer_struct[2]; - timer[0].timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.ICS2115_timer_cb_0, false); - timer[1].timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.ICS2115_timer_cb_1, false); + //timer = new timer_struct[2]; + ReInit_timer(); + //timer[0].timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.ICS2115_timer_cb_0, false); + EmuTimer.timer_alloc_common(ref timer[0].timer,EmuTimer.TIME_ACT.ICS2115_timer_cb_0, false); + //timer[1].timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.ICS2115_timer_cb_1, false); + EmuTimer.timer_alloc_common(ref timer[1].timer,EmuTimer.TIME_ACT.ICS2115_timer_cb_1, false); ulaw = new short[256]; for (i = 0; i < 256; i++) { diff --git a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/sound/MSM5205.cs b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/sound/MSM5205.cs index c2208f6d..9243d30f 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/sound/MSM5205.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/sound/MSM5205.cs @@ -176,11 +176,13 @@ namespace MAME.Core mm1[sndindex].voice.stream = new sound_stream(clock, 0, 1, mm1[sndindex].MSM5205_update); if (sndindex == 0) { - timer[0] = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.MSM5205_MSM5205_vclk_callback0, false); + //timer[0] = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.MSM5205_MSM5205_vclk_callback0, false); + EmuTimer.timer_alloc_common(ref timer[0], EmuTimer.TIME_ACT.MSM5205_MSM5205_vclk_callback0, false); } else if (sndindex == 1) { - timer[1] = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.MSM5205_MSM5205_vclk_callback1, false); + //timer[1] = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.MSM5205_MSM5205_vclk_callback1, false); + EmuTimer.timer_alloc_common(ref timer[1], EmuTimer.TIME_ACT.MSM5205_MSM5205_vclk_callback1, false); } mm1[sndindex].msm5205_reset(); } diff --git a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/sound/Sound.cs b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/sound/Sound.cs index 39f114d5..6c815b45 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/sound/Sound.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/sound/Sound.cs @@ -74,7 +74,8 @@ namespace MAME.Core latched_value = new ushort[2]; utempdata = new ushort[2]; sound_update = sound_updateC; - sound_update_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Sound_sound_update, false); + //sound_update_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Sound_sound_update, false); + EmuTimer.timer_alloc_common(ref sound_update_timer, EmuTimer.TIME_ACT.Sound_sound_update, false); YM2151.ym2151_init(3579545); OKI6295.okim6295_start(); ym2151stream = new sound_stream(55930, 0, 2, YM2151.ym2151_update_one); @@ -84,7 +85,8 @@ namespace MAME.Core case "CPS-1(QSound)": case "CPS2": sound_update = sound_updateQ; - sound_update_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Sound_sound_update, false); + //sound_update_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Sound_sound_update, false); + EmuTimer.timer_alloc_common(ref sound_update_timer, EmuTimer.TIME_ACT.Sound_sound_update, false); QSound.qsound_start(); qsoundstream = new sound_stream(4000000 / 166, 0, 2, QSound.qsound_update); mixerstream = new sound_stream(48000, 2, 0, null); @@ -93,7 +95,8 @@ namespace MAME.Core latched_value = new ushort[1]; utempdata = new ushort[1]; sound_update = sound_updateDataeast_pcktgal; - sound_update_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Sound_sound_update, false); + //sound_update_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Sound_sound_update, false); + EmuTimer.timer_alloc_common(ref sound_update_timer, EmuTimer.TIME_ACT.Sound_sound_update, false); YM2203.ym2203_start(0, 1500000); YM3812.ym3812_start(3000000); MSM5205.msm5205_start(0, 384000, Dataeast.pcktgal_adpcm_int, 5); @@ -104,7 +107,8 @@ namespace MAME.Core latched_value = new ushort[1]; utempdata = new ushort[1]; sound_update = sound_updateTehkan_pbaction; - sound_update_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Sound_sound_update, false); + //sound_update_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Sound_sound_update, false); + EmuTimer.timer_alloc_common(ref sound_update_timer, EmuTimer.TIME_ACT.Sound_sound_update, false); AY8910.ay8910_interface generic_ay8910 = new AY8910.ay8910_interface(); generic_ay8910.flags = 1; generic_ay8910.res_load = new int[3] { 1000, 1000, 1000 }; @@ -121,7 +125,7 @@ namespace MAME.Core latched_value = new ushort[2]; utempdata = new ushort[2]; sound_update = sound_updateN; - sound_update_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Sound_sound_update, false); + EmuTimer.timer_alloc_common(ref sound_update_timer, EmuTimer.TIME_ACT.Sound_sound_update, false); YM2610.ym2610_start(8000000); ym2610stream = new sound_stream(111111, 0, 2, YM2610.F2610.ym2610_update_one); mixerstream = new sound_stream(48000, 3, 0, null); @@ -130,7 +134,7 @@ namespace MAME.Core latched_value = new ushort[2]; utempdata = new ushort[2]; sound_update = sound_updateSunA8; - sound_update_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Sound_sound_update, false); + EmuTimer.timer_alloc_common(ref sound_update_timer, EmuTimer.TIME_ACT.Sound_sound_update, false); YM3812.ym3812_start(4000000); AY8910.ay8910_interface starfigh_ay8910_interface = new AY8910.ay8910_interface(); starfigh_ay8910_interface.flags = 1; @@ -147,7 +151,7 @@ namespace MAME.Core break; case "Namco System 1": sound_update = sound_updateNa; - sound_update_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Sound_sound_update, false); + EmuTimer.timer_alloc_common(ref sound_update_timer, EmuTimer.TIME_ACT.Sound_sound_update, false); YM2151.ym2151_init(3579580); Namco.namco_start(); DAC.dac_start(); @@ -168,7 +172,7 @@ namespace MAME.Core case "drgnwrldv11h": case "drgnwrldv40k": sound_update = sound_updateIGS011_drgnwrld; - sound_update_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Sound_sound_update, false); + EmuTimer.timer_alloc_common(ref sound_update_timer, EmuTimer.TIME_ACT.Sound_sound_update, false); OKI6295.okim6295_start(); YM3812.ym3812_start(3579545); okistream = new sound_stream(1047600 / 132, 0, 1, OKI6295.okim6295_update); @@ -182,7 +186,7 @@ namespace MAME.Core case "xymg": case "wlcc": sound_update = sound_updateIGS011_lhb; - sound_update_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Sound_sound_update, false); + EmuTimer.timer_alloc_common(ref sound_update_timer, EmuTimer.TIME_ACT.Sound_sound_update, false); OKI6295.okim6295_start(); okistream = new sound_stream(1047600 / 132, 0, 1, OKI6295.okim6295_update); mixerstream = new sound_stream(48000, 1, 0, null); @@ -190,7 +194,7 @@ namespace MAME.Core case "lhb2": case "nkishusp": sound_update = sound_updateIGS011_lhb2; - sound_update_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Sound_sound_update, false); + EmuTimer.timer_alloc_common(ref sound_update_timer, EmuTimer.TIME_ACT.Sound_sound_update, false); OKI6295.okim6295_start(); YM2413.ym2413_start(3579545); okistream = new sound_stream(1047600 / 132, 0, 1, OKI6295.okim6295_update); @@ -200,7 +204,7 @@ namespace MAME.Core case "vbowl": case "vbowlj": sound_update = sound_updateIGS011_vbowl; - sound_update_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Sound_sound_update, false); + EmuTimer.timer_alloc_common(ref sound_update_timer, EmuTimer.TIME_ACT.Sound_sound_update, false); ICS2115.ics2115_start(); ics2115stream = new sound_stream(33075, 0, 2, ICS2115.ics2115_update); mixerstream = new sound_stream(48000, 2, 0, null); @@ -211,7 +215,7 @@ namespace MAME.Core latched_value = new ushort[3]; utempdata = new ushort[3]; sound_update = sound_updatePGM; - sound_update_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Sound_sound_update, false); + EmuTimer.timer_alloc_common(ref sound_update_timer, EmuTimer.TIME_ACT.Sound_sound_update, false); ICS2115.ics2115_start(); ics2115stream = new sound_stream(33075, 0, 2, ICS2115.ics2115_update); mixerstream = new sound_stream(48000, 2, 0, null); @@ -220,7 +224,7 @@ namespace MAME.Core latched_value = new ushort[1]; utempdata = new ushort[1]; sound_update = sound_updateM72; - sound_update_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Sound_sound_update, false); + EmuTimer.timer_alloc_common(ref sound_update_timer, EmuTimer.TIME_ACT.Sound_sound_update, false); YM2151.ym2151_init(3579545); DAC.dac_start(); ym2151stream = new sound_stream(55930, 0, 2, YM2151.ym2151_update_one); @@ -231,7 +235,7 @@ namespace MAME.Core latched_value = new ushort[1]; utempdata = new ushort[1]; sound_update = sound_updateM92; - sound_update_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Sound_sound_update, false); + EmuTimer.timer_alloc_common(ref sound_update_timer, EmuTimer.TIME_ACT.Sound_sound_update, false); YM2151.ym2151_init(3579545); Iremga20.iremga20_start(); ym2151stream = new sound_stream(55930, 0, 2, YM2151.ym2151_update_one); @@ -248,7 +252,7 @@ namespace MAME.Core latched_value = new ushort[2]; utempdata = new ushort[2]; sound_update = sound_updateTaito_tokio; - sound_update_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Sound_sound_update, false); + EmuTimer.timer_alloc_common(ref sound_update_timer, EmuTimer.TIME_ACT.Sound_sound_update, false); YM2203.ym2203_start(0, 3000000); mixerstream = new sound_stream(48000, 4, 0, null); break; @@ -273,7 +277,7 @@ namespace MAME.Core latched_value = new ushort[2]; utempdata = new ushort[2]; sound_update = sound_updateTaito_bublbobl; - sound_update_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Sound_sound_update, false); + EmuTimer.timer_alloc_common(ref sound_update_timer, EmuTimer.TIME_ACT.Sound_sound_update, false); YM2203.ym2203_start(0, 3000000); YM3812.ym3526_start(3000000); ym3526stream = new sound_stream(41666, 0, 1, FMOpl.ym3526_update_one); @@ -288,7 +292,7 @@ namespace MAME.Core latched_value = new ushort[1]; utempdata = new ushort[1]; sound_update = sound_updateTaito_opwolf; - sound_update_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Sound_sound_update, false); + EmuTimer.timer_alloc_common(ref sound_update_timer, EmuTimer.TIME_ACT.Sound_sound_update, false); YM2151.ym2151_init(4000000); ym2151stream = new sound_stream(62500, 0, 2, YM2151.ym2151_update_one); MSM5205.msm5205_start(0, 384000, Taito.opwolf_msm5205_vck, 5); @@ -315,7 +319,7 @@ namespace MAME.Core AY8910.AA8910[0].stream.gain = 0x100; ym2610stream.gain = 0x100; sound_update = sound_updateTaitoB; - sound_update_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Sound_sound_update, false); + EmuTimer.timer_alloc_common(ref sound_update_timer, EmuTimer.TIME_ACT.Sound_sound_update, false); mixerstream = new sound_stream(48000, 3, 0, null); break; case "Konami 68000": @@ -441,7 +445,7 @@ namespace MAME.Core mixerstream = new sound_stream(48000, 2, 0, null); break; } - sound_update_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Sound_sound_update, false); + EmuTimer.timer_alloc_common(ref sound_update_timer, EmuTimer.TIME_ACT.Sound_sound_update, false); break; case "Capcom": latched_value = new ushort[1]; @@ -480,7 +484,8 @@ namespace MAME.Core mixerstream = new sound_stream(48000, 4, 0, null); break; } - sound_update_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Sound_sound_update, false); + //sound_update_timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Sound_sound_update, false); + EmuTimer.timer_alloc_common(ref sound_update_timer, EmuTimer.TIME_ACT.Sound_sound_update, false); break; } EmuTimer.timer_adjust_periodic(sound_update_timer, update_frequency, update_frequency); diff --git a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/sound/Upd7759.cs b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/sound/Upd7759.cs index 2c9909d3..29bc779a 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/sound/Upd7759.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/sound/Upd7759.cs @@ -302,7 +302,8 @@ namespace MAME.Core chip.rombase = 0; if (updrom == null) { - chip.timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Upd7759_upd7759_slave_update, false); + //chip.timer = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.Upd7759_upd7759_slave_update, false); + EmuTimer.timer_alloc_common(ref chip.timer, EmuTimer.TIME_ACT.Upd7759_upd7759_slave_update, false); } chip.reset = 1; chip.start = 1; diff --git a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/sound/YM2151.cs b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/sound/YM2151.cs index be596e71..773f2329 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/sound/YM2151.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/sound/YM2151.cs @@ -933,8 +933,10 @@ namespace MAME.Core PSG.eg_timer_add = (uint)(0x10000 * (clock / 64.0) / PSG.sampfreq); PSG.eg_timer_overflow = 0x30000; /* this must be done _before_ a call to ym2151_reset_chip() */ - PSG.timer_A = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.YM2151_timer_callback_a, false); - PSG.timer_B = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.YM2151_timer_callback_b, false); + //PSG.timer_A = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.YM2151_timer_callback_a, false); + EmuTimer.timer_alloc_common(ref PSG.timer_A,EmuTimer.TIME_ACT.YM2151_timer_callback_a, false); + //PSG.timer_B = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.YM2151_timer_callback_b, false); + EmuTimer.timer_alloc_common(ref PSG.timer_B,EmuTimer.TIME_ACT.YM2151_timer_callback_b, false); ym2151_reset_chip(); switch (Machine.sBoard) { diff --git a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/sound/YM2203.cs b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/sound/YM2203.cs index d5467b94..05a73cd6 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/sound/YM2203.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/sound/YM2203.cs @@ -8,6 +8,19 @@ namespace MAME.Core public sound_stream stream; public static YM2203[] FF2203 = new YM2203[2]; public EmuTimer.emu_timer[] timer; + + public void ReInit_timer() + { + if (timer != null) + { + if (timer[0] != null) EmuTimer.emu_timer.SetNull(ref timer[0]); + if (timer[1] != null) EmuTimer.emu_timer.SetNull(ref timer[1]); + } + else + { + timer = new EmuTimer.emu_timer[2]; + } + } public static void timer_callback_2203_0_0() { FF2203[0].ym2203_timer_over(0); @@ -139,16 +152,21 @@ namespace MAME.Core FMOpl.sin_tab = new uint[0x1000]; int rate = clock / 72; AY8910.ay8910_start_ym(14, sndindex, clock, generic_2203); - FF2203[sndindex].timer = new EmuTimer.emu_timer[2]; + //FF2203[sndindex].timer = new EmuTimer.emu_timer[2]; + FF2203[sndindex].ReInit_timer(); if (sndindex == 0) { - FF2203[sndindex].timer[0] = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.YM2203_timer_callback_2203_0_0, false); - FF2203[sndindex].timer[1] = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.YM2203_timer_callback_2203_0_1, false); + //FF2203[sndindex].timer[0] = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.YM2203_timer_callback_2203_0_0, false); + EmuTimer.timer_alloc_common(ref FF2203[sndindex].timer[0], EmuTimer.TIME_ACT.YM2203_timer_callback_2203_0_0, false); + //FF2203[sndindex].timer[1] = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.YM2203_timer_callback_2203_0_1, false); + EmuTimer.timer_alloc_common(ref FF2203[sndindex].timer[1], EmuTimer.TIME_ACT.YM2203_timer_callback_2203_0_1, false); } else if (sndindex == 1) { - FF2203[sndindex].timer[0] = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.YM2203_timer_callback_2203_1_0, false); - FF2203[sndindex].timer[1] = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.YM2203_timer_callback_2203_1_1, false); + //FF2203[sndindex].timer[0] = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.YM2203_timer_callback_2203_1_0, false); + EmuTimer.timer_alloc_common(ref FF2203[sndindex].timer[0], EmuTimer.TIME_ACT.YM2203_timer_callback_2203_1_0, false); + //FF2203[sndindex].timer[1] = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.YM2203_timer_callback_2203_1_1, false); + EmuTimer.timer_alloc_common(ref FF2203[sndindex].timer[1], EmuTimer.TIME_ACT.YM2203_timer_callback_2203_1_1, false); } FF2203[sndindex].stream = new sound_stream(rate, 0, 1, FF2203[sndindex].ym2203_update_one); ym2203_init(sndindex, clock, rate); diff --git a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/sound/YM2610.cs b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/sound/YM2610.cs index 105e499e..28741661 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/sound/YM2610.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/sound/YM2610.cs @@ -85,6 +85,21 @@ namespace MAME.Core } FM.out_adpcm[FM.ipan[c]] += adpcm[c].adpcm_out; } + + + static void ReInit_timer() + { + if (timer != null) + { + if (timer[0] != null) EmuTimer.emu_timer.SetNull(ref timer[0]); + if (timer[1] != null) EmuTimer.emu_timer.SetNull(ref timer[1]); + } + else + { + timer = new EmuTimer.emu_timer[2]; + } + } + public static void ym2610_start(int clock) { F2610 = new YM2610(); @@ -98,9 +113,12 @@ namespace MAME.Core generic_ay8910.portBwrite = null; int rate = clock / 72; AY8910.ay8910_start_ym(17, 0, clock, generic_ay8910); - timer = new EmuTimer.emu_timer[2]; - timer[0] = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.YM2610_F2610_timer_callback_0, false); - timer[1] = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.YM2610_F2610_timer_callback_1, false); + ReInit_timer(); + //timer = new EmuTimer.emu_timer[2]; + //timer[0] = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.YM2610_F2610_timer_callback_0, false); + EmuTimer.timer_alloc_common(ref timer[0], EmuTimer.TIME_ACT.YM2610_F2610_timer_callback_0, false); + //timer[1] = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.YM2610_F2610_timer_callback_1, false); + EmuTimer.timer_alloc_common(ref timer[1], EmuTimer.TIME_ACT.YM2610_F2610_timer_callback_1, false); ym2610_init(clock, rate); } public static void ym2610_init(int clock, int rate) diff --git a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/sound/YM3812.cs b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/sound/YM3812.cs index 658e5d6c..95f488c6 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/sound/YM3812.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/Mame.Core/sound/YM3812.cs @@ -36,11 +36,25 @@ namespace MAME.Core { Sound.ym3812stream.stream_update(); } + + static void ReInit_timer() + { + if (timer != null) + { + if (timer[0] != null) EmuTimer.emu_timer.SetNull(ref timer[0]); + if (timer[1] != null) EmuTimer.emu_timer.SetNull(ref timer[1]); + } + else + { + timer = new EmuTimer.emu_timer[2]; + } + } public static void ym3812_start(int clock) { FMOpl.tl_tab = new int[0x1800]; FMOpl.sin_tab = new uint[0x1000]; - timer = new EmuTimer.emu_timer[2]; + ReInit_timer(); + //timer = new EmuTimer.emu_timer[2]; int rate = clock / 72; switch (Machine.sName) { @@ -73,8 +87,8 @@ namespace MAME.Core FMOpl.ym3812_set_timer_handler(TimerHandler_3812); FMOpl.ym3812_set_irq_handler(IRQHandler_3812); FMOpl.ym3812_set_update_handler(_stream_update_3812); - timer[0] = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.YM3812_timer_callback_3812_0, false); - timer[1] = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.YM3812_timer_callback_3812_1, false); + EmuTimer.timer_alloc_common(ref timer[0], EmuTimer.TIME_ACT.YM3812_timer_callback_3812_0, false); + EmuTimer.timer_alloc_common(ref timer[1],EmuTimer.TIME_ACT.YM3812_timer_callback_3812_1, false); } public static void ym3812_control_port_0_w(byte data) { @@ -228,12 +242,13 @@ namespace MAME.Core { int rate = clock / 72; FMOpl.YM3526 = FMOpl.ym3526_init(0, clock, rate); - timer = new EmuTimer.emu_timer[2]; + ReInit_timer(); + //timer = new EmuTimer.emu_timer[2]; FMOpl.ym3526_set_timer_handler(TimerHandler_3526); FMOpl.ym3526_set_irq_handler(IRQHandler_3526); FMOpl.ym3526_set_update_handler(_stream_update_3526); - timer[0] = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.YM3812_timer_callback_3526_0, false); - timer[1] = EmuTimer.timer_alloc_common(EmuTimer.TIME_ACT.YM3812_timer_callback_3526_1, false); + EmuTimer.timer_alloc_common(ref timer[0], EmuTimer.TIME_ACT.YM3812_timer_callback_3526_0, false); + EmuTimer.timer_alloc_common(ref timer[1], EmuTimer.TIME_ACT.YM3812_timer_callback_3526_1, false); } public static void ym3526_control_port_0_w(byte data) {