summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu
diff options
context:
space:
mode:
author Aaron Giles <aaron@aarongiles.com>2008-08-14 06:13:56 +0000
committer Aaron Giles <aaron@aarongiles.com>2008-08-14 06:13:56 +0000
commit51c1079953e4cc559dd019e1f40b1d6f3a04b9b3 (patch)
treeec0cc863b888a6fbcea42c10529057c1608383e4 /src/emu
parent3b76b8e25ec2ad0947c8e9e26a6ffd092a4f99ac (diff)
From: Atari Ace [mailto:atari_ace@verizon.net]
Subject: [patch] Fix 1802 cybrcomm, raveracw, raveracj, raveraja, ridgerac, ridgerab, ridgeraj, acedrvrw, victlapw: No sound in games after reloading via the MAME UI Hi mamedev, The problem with namcos22 games losing sound when running multisession is actually an m37710 cpu initialization bug. The attached patch fixes it, and also collapses all the timer callbacks together as an unrelated code cleanup. Note: namcos22 has a lot of uninitialized state, so I wouldn't be surprised if there are other multisession issues.
Diffstat (limited to 'src/emu')
-rw-r--r--src/emu/cpu/m37710/m37710.c120
1 files changed, 17 insertions, 103 deletions
diff --git a/src/emu/cpu/m37710/m37710.c b/src/emu/cpu/m37710/m37710.c
index 0fa07e0e2b3..0217673085a 100644
--- a/src/emu/cpu/m37710/m37710.c
+++ b/src/emu/cpu/m37710/m37710.c
@@ -268,106 +268,17 @@ static const char *const m37710_tnames[8] =
};
#endif
-static TIMER_CALLBACK( m37710_timer_a0_cb)
+static TIMER_CALLBACK( m37710_timer_cb )
{
+ int which = (int)ptr;
+ int curirq = M37710_LINE_TIMERA0 - which;
int cpunum = param;
cpuintrf_push_context(cpunum);
- timer_adjust_oneshot(m37710i_cpu.timers[0], m37710i_cpu.reload[0], cpunum);
+ timer_adjust_oneshot(m37710i_cpu.timers[which], m37710i_cpu.reload[which], cpunum);
- m37710i_cpu.m37710_regs[m37710_irq_levels[12]] |= 0x04;
- m37710_set_irq_line(M37710_LINE_TIMERA0, PULSE_LINE);
- cpu_triggerint(machine, cpunum);
- cpuintrf_pop_context();
-}
-
-static TIMER_CALLBACK( m37710_timer_a1_cb )
-{
- int cpunum = param;
-
- cpuintrf_push_context(cpunum);
- timer_adjust_oneshot(m37710i_cpu.timers[1], m37710i_cpu.reload[1], cpunum);
-
- m37710i_cpu.m37710_regs[m37710_irq_levels[11]] |= 0x04;
- m37710_set_irq_line(M37710_LINE_TIMERA1, PULSE_LINE);
- cpu_triggerint(machine, cpunum);
- cpuintrf_pop_context();
-}
-
-static TIMER_CALLBACK( m37710_timer_a2_cb )
-{
- int cpunum = param;
-
- cpuintrf_push_context(cpunum);
- timer_adjust_oneshot(m37710i_cpu.timers[2], m37710i_cpu.reload[2], cpunum);
-
- m37710i_cpu.m37710_regs[m37710_irq_levels[10]] |= 0x04;
- m37710_set_irq_line(M37710_LINE_TIMERA2, PULSE_LINE);
- cpu_triggerint(machine, cpunum);
- cpuintrf_pop_context();
-}
-
-static TIMER_CALLBACK( m37710_timer_a3_cb )
-{
- int cpunum = param;
-
- cpuintrf_push_context(cpunum);
- timer_adjust_oneshot(m37710i_cpu.timers[3], m37710i_cpu.reload[3], cpunum);
-
- m37710i_cpu.m37710_regs[m37710_irq_levels[9]] |= 0x04;
- m37710_set_irq_line(M37710_LINE_TIMERA3, PULSE_LINE);
- cpu_triggerint(machine, cpunum);
- cpuintrf_pop_context();
-}
-
-static TIMER_CALLBACK( m37710_timer_a4_cb )
-{
- int cpunum = param;
-
- cpuintrf_push_context(cpunum);
- timer_adjust_oneshot(m37710i_cpu.timers[4], m37710i_cpu.reload[4], cpunum);
-
- m37710i_cpu.m37710_regs[m37710_irq_levels[8]] |= 0x04;
- m37710_set_irq_line(M37710_LINE_TIMERA4, PULSE_LINE);
- cpu_triggerint(machine, cpunum);
- cpuintrf_pop_context();
-}
-
-static TIMER_CALLBACK( m37710_timer_b0_cb )
-{
- int cpunum = param;
-
- cpuintrf_push_context(cpunum);
- timer_adjust_oneshot(m37710i_cpu.timers[5], m37710i_cpu.reload[5], cpunum);
-
- m37710i_cpu.m37710_regs[m37710_irq_levels[7]] |= 0x04;
- m37710_set_irq_line(M37710_LINE_TIMERB0, PULSE_LINE);
- cpu_triggerint(machine, cpunum);
- cpuintrf_pop_context();
-}
-
-static TIMER_CALLBACK( m37710_timer_b1_cb )
-{
- int cpunum = param;
-
- cpuintrf_push_context(cpunum);
- timer_adjust_oneshot(m37710i_cpu.timers[6], m37710i_cpu.reload[6], cpunum);
-
- m37710i_cpu.m37710_regs[m37710_irq_levels[6]] |= 0x04;
- m37710_set_irq_line(M37710_LINE_TIMERB1, PULSE_LINE);
- cpu_triggerint(machine, cpunum);
- cpuintrf_pop_context();
-}
-
-static TIMER_CALLBACK( m37710_timer_b2_cb )
-{
- int cpunum = param;
-
- cpuintrf_push_context(cpunum);
- timer_adjust_oneshot(m37710i_cpu.timers[7], m37710i_cpu.reload[7], cpunum);
-
- m37710i_cpu.m37710_regs[m37710_irq_levels[5]] |= 0x04;
- m37710_set_irq_line(M37710_LINE_TIMERB2, PULSE_LINE);
+ m37710i_cpu.m37710_regs[m37710_irq_levels[curirq]] |= 0x04;
+ m37710_set_irq_line(curirq, PULSE_LINE);
cpu_triggerint(machine, cpunum);
cpuintrf_pop_context();
}
@@ -1051,16 +962,19 @@ static STATE_POSTLOAD( m37710_restore_state )
static void m37710_init(int index, int clock, const void *config, int (*irqcallback)(int))
{
+ int i;
+
INT_ACK = irqcallback;
- m37710i_cpu.timers[0] = timer_alloc(m37710_timer_a0_cb, NULL);
- m37710i_cpu.timers[1] = timer_alloc(m37710_timer_a1_cb, NULL);
- m37710i_cpu.timers[2] = timer_alloc(m37710_timer_a2_cb, NULL);
- m37710i_cpu.timers[3] = timer_alloc(m37710_timer_a3_cb, NULL);
- m37710i_cpu.timers[4] = timer_alloc(m37710_timer_a4_cb, NULL);
- m37710i_cpu.timers[5] = timer_alloc(m37710_timer_b0_cb, NULL);
- m37710i_cpu.timers[6] = timer_alloc(m37710_timer_b1_cb, NULL);
- m37710i_cpu.timers[7] = timer_alloc(m37710_timer_b2_cb, NULL);
+ memset(&m37710i_cpu, 0, sizeof(m37710i_cpu));
+ m37710_ICount = 0;
+ m37710_fullCount = 0;
+
+ m37710i_source = 0;
+ m37710i_destination = 0;
+
+ for (i=0; i<8; i++)
+ m37710i_cpu.timers[i] = timer_alloc(m37710_timer_cb, (void*)i);
state_save_register_item("M377xx", index, m37710i_cpu.a);
state_save_register_item("M377xx", index, m37710i_cpu.b);