diff options
author | 2008-08-14 06:13:56 +0000 | |
---|---|---|
committer | 2008-08-14 06:13:56 +0000 | |
commit | 51c1079953e4cc559dd019e1f40b1d6f3a04b9b3 (patch) | |
tree | ec0cc863b888a6fbcea42c10529057c1608383e4 /src/emu | |
parent | 3b76b8e25ec2ad0947c8e9e26a6ffd092a4f99ac (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.c | 120 |
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); |