MAME:终于基本实现了MAME的CPU Timer的对象池,开心
This commit is contained in:
parent
9e7b37a709
commit
1aec567eb2
@ -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)
|
||||
{
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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<EmuTimerLister>();
|
||||
tlistObj.InitLister();
|
||||
}
|
||||
|
||||
List<emu_timer> timerlist;
|
||||
|
||||
public List<emu_timer> GetSrcList()
|
||||
{
|
||||
return timerlist;
|
||||
}
|
||||
public int Count
|
||||
{
|
||||
get { return timerlist.Count; }
|
||||
}
|
||||
|
||||
void InitLister()
|
||||
{
|
||||
ReleaseLister();
|
||||
timerlist = ObjectPoolAuto.AcquireList<emu_timer>();
|
||||
}
|
||||
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<emu_timer> lt;
|
||||
public static EmuTimerLister lt;
|
||||
private static List<emu_timer2> 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<emu_timer>();
|
||||
//lt = new List<emu_timer>();
|
||||
EmuTimerLister.GetNewTimerLister(ref lt);
|
||||
}
|
||||
|
||||
public class emu_timer
|
||||
@ -49,23 +125,163 @@ namespace MAME.Core
|
||||
period = default;
|
||||
start = default;
|
||||
expire = default;
|
||||
_refCount = 1;
|
||||
}
|
||||
|
||||
static HashSet<emu_timer> _readyToRelease = new HashSet<emu_timer>();
|
||||
/// <summary>
|
||||
/// 线程安全队列(因为析构函数是额外线程来的)
|
||||
/// </summary>
|
||||
static ConcurrentQueue<emu_timer> _failedDeletions = new ConcurrentQueue<emu_timer>();
|
||||
|
||||
static int outTimerAllCount = 0;
|
||||
static int newTimerCount = 0;
|
||||
public static emu_timer GetEmu_timer()
|
||||
{
|
||||
if (_failedDeletions.TryDequeue(out emu_timer obj))
|
||||
emu_timer obj;
|
||||
if (!_failedDeletions.TryDequeue(out obj))
|
||||
{
|
||||
obj.reset();
|
||||
return obj;
|
||||
obj = new emu_timer();
|
||||
newTimerCount++;
|
||||
}
|
||||
|
||||
return new emu_timer();
|
||||
obj.reset();
|
||||
outTimerAllCount++;
|
||||
return obj;
|
||||
}
|
||||
public static void EnqueueObj(emu_timer obj)
|
||||
/// <summary>
|
||||
/// 释放创建的引用,这个要和GetEmu_timer成对
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
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,表示创建时的引用
|
||||
|
||||
/// <summary>
|
||||
/// 增加引用计数
|
||||
/// </summary>
|
||||
void AddRef()
|
||||
{
|
||||
int newCount = Interlocked.Increment(ref _refCount);
|
||||
|
||||
//引用计数重新回到1时,移除。
|
||||
//但是还是不在这里做把注释了,在每一帧开始之前统一检测
|
||||
//if (newCount == 1)
|
||||
//{
|
||||
// if (_readyToRelease.Contains(this))
|
||||
// {
|
||||
// //UnityEngine.Debug.Log("移除ReadyToRelease");
|
||||
// _readyToRelease.Remove(this);
|
||||
// }
|
||||
//}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 减少引用计数,当计数为0时释放对象回池
|
||||
/// </summary>
|
||||
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);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 释放资源并回池
|
||||
/// </summary>
|
||||
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<emu_timer> list, ref emu_timer timer)
|
||||
{
|
||||
list.Add(timer);
|
||||
timer.AddRef();
|
||||
}
|
||||
internal static void InsertToList(ref List<emu_timer> list, int index, ref emu_timer timer)
|
||||
{
|
||||
list.Insert(index, timer);
|
||||
timer.AddRef();
|
||||
}
|
||||
public static void RemoveToList(ref List<emu_timer> list, ref emu_timer timer)
|
||||
{
|
||||
list.Remove(timer);
|
||||
timer.ReleaseRef();
|
||||
}
|
||||
internal static void ClearList(ref List<emu_timer> list)
|
||||
{
|
||||
for (int i = 0; i < list.Count; i++)
|
||||
list[i].ReleaseRef();
|
||||
list.Clear();
|
||||
}
|
||||
#endregion
|
||||
/*
|
||||
static void EnqueueObj(emu_timer obj)
|
||||
{
|
||||
_failedDeletions.Enqueue(obj);
|
||||
}
|
||||
@ -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<emu_timer>();
|
||||
//lt = new List<emu_timer>();
|
||||
EmuTimerLister.GetNewTimerLister(ref lt);
|
||||
lt2 = new List<emu_timer2>();
|
||||
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;
|
||||
//}
|
||||
|
||||
/// <summary>
|
||||
/// 申请新的timer,且直接操作引用计数
|
||||
/// </summary>
|
||||
/// <param name="refattr"></param>
|
||||
/// <param name="action"></param>
|
||||
/// <param name="temp"></param>
|
||||
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);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 申请新的timer,不操作额外引用计数,用于外部中间传递
|
||||
/// </summary>
|
||||
/// <param name="action"></param>
|
||||
/// <param name="temp"></param>
|
||||
/// <returns></returns>
|
||||
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<emu_timer>();
|
||||
//lt = new List<emu_timer>();
|
||||
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++)
|
||||
{
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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":
|
||||
|
||||
@ -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()
|
||||
|
||||
@ -47,7 +47,7 @@
|
||||
//Cpuint.lvec.Add(new vec(1, EmuTimer.get_current_time()));
|
||||
Cpuint.lvec.Add(ObjectPoolAuto.Acquire<vec>().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<vec>().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<vec>().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<vec>().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<vec>().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)
|
||||
|
||||
@ -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()
|
||||
{
|
||||
|
||||
@ -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<vec>().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<vec>().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<vec>().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<vec>().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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
@ -394,7 +397,7 @@ namespace MAME.Core
|
||||
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()
|
||||
|
||||
@ -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()
|
||||
{
|
||||
@ -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()
|
||||
{
|
||||
|
||||
@ -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];
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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++)
|
||||
{
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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)
|
||||
{
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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)
|
||||
{
|
||||
|
||||
Loading…
Reference in New Issue
Block a user