diff options
author | Phil Bennett <philipjbennett@users.noreply.github.com> | 2010-07-29 07:08:29 +0000 |
---|---|---|
committer | Phil Bennett <philipjbennett@users.noreply.github.com> | 2010-07-29 07:08:29 +0000 |
commit | 10d74db99111042f02bc4412d11e4558dc731fa9 (patch) | |
tree | 0e534b4d090cf41bc1bfe76044a55e5aa798a8a0 | |
parent | c87c7e6f1805d16a471b0048ac74e81fe5a25651 (diff) |
Fixed HD63701 SLP opcode [Sandro Ronco]
---------- Forwarded message ----------
From: Sandro Ronco <sandro.ronco@gmx.com>
Date: Mon, Jul 26, 2010 at 6:07 PM
Subject: [HD63701]Fix slp opcode
To: submit@mamedev.org
Fixed SLP opcode basing on HD63701 and HD6303 datasheet.
This is need for psion driver in MESS, but I did some testing in MAME
and I have not seen regressions.
Probably nobody noticed this before because this opcode is almost
unused in arcade machine.
If you want have a confirmation of this you can see the diagram at
page 14 of the HD63701 datasheet or at page 24 of the HD6303
datasheet, where it is clear that the "sleep cancel signal" is not
conditional at the IRQ mask.
Regards
Sandro Ronco
-rw-r--r-- | src/emu/cpu/m6800/m6800.c | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/src/emu/cpu/m6800/m6800.c b/src/emu/cpu/m6800/m6800.c index 4da2e7a7d74..247a376223f 100644 --- a/src/emu/cpu/m6800/m6800.c +++ b/src/emu/cpu/m6800/m6800.c @@ -596,19 +596,29 @@ INLINE void CHECK_IRQ_LINES(m6800_state *cpustate) { if (cpustate->nmi_pending) { + if(cpustate->wai_state & M6800_SLP) + cpustate->wai_state &= ~M6800_SLP; + cpustate->nmi_pending = FALSE; enter_interrupt(cpustate, "M6800 '%s' take NMI\n",0xfffc); } - else if( !(CC & 0x10) ) + else { if( cpustate->irq_state[M6800_IRQ_LINE] != CLEAR_LINE ) { /* standard IRQ */ - enter_interrupt(cpustate, "M6800 '%s' take IRQ1\n",0xfff8); - if( cpustate->irq_callback ) - (void)(*cpustate->irq_callback)(cpustate->device, M6800_IRQ_LINE); + if(cpustate->wai_state & M6800_SLP) + cpustate->wai_state &= ~M6800_SLP; + + if( !(CC & 0x10) ) + { + enter_interrupt(cpustate, "M6800 '%s' take IRQ1\n",0xfff8); + if( cpustate->irq_callback ) + (void)(*cpustate->irq_callback)(cpustate->device, M6800_IRQ_LINE); + } } else - m6800_check_irq2(cpustate); + if( !(CC & 0x10) ) + m6800_check_irq2(cpustate); } } @@ -622,6 +632,8 @@ static void check_timer_event(m6800_state *cpustate) cpustate->tcsr |= TCSR_OCF; cpustate->pending_tcsr |= TCSR_OCF; MODIFIED_tcsr; + if((cpustate->tcsr & TCSR_EOCI) && cpustate->wai_state & M6800_SLP) + cpustate->wai_state &= ~M6800_SLP; if ( !(CC & 0x10) && (cpustate->tcsr & TCSR_EOCI)) TAKE_OCI; } @@ -635,6 +647,8 @@ static void check_timer_event(m6800_state *cpustate) cpustate->tcsr |= TCSR_TOF; cpustate->pending_tcsr |= TCSR_TOF; MODIFIED_tcsr; + if((cpustate->tcsr & TCSR_ETOI) && cpustate->wai_state & M6800_SLP) + cpustate->wai_state &= ~M6800_SLP; if ( !(CC & 0x10) && (cpustate->tcsr & TCSR_ETOI)) TAKE_TOI; } |