summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Angelo Salese <angelosa@users.noreply.github.com>2013-01-09 23:26:45 +0000
committer Angelo Salese <angelosa@users.noreply.github.com>2013-01-09 23:26:45 +0000
commit06514dbcc6452fb052475b15c0ec0da7bf41cbe3 (patch)
treed676d63fd8a9ba4de9cb8dc1cce813513f2120c5
parent67b59583c900669897c44b05e4515e2c37b2f4b5 (diff)
Improved irq routine
-rw-r--r--src/mame/includes/3do.h3
-rw-r--r--src/mame/machine/3do.c54
2 files changed, 28 insertions, 29 deletions
diff --git a/src/mame/includes/3do.h b/src/mame/includes/3do.h
index 8b7baca6fdc..2bf349ac1af 100644
--- a/src/mame/includes/3do.h
+++ b/src/mame/includes/3do.h
@@ -191,8 +191,7 @@ public:
UINT32 screen_update__3do(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
private:
- void m_3do_request_fiq0(UINT32 irq_req);
- void m_3do_request_fiq1(UINT32 irq_req);
+ void m_3do_request_fiq(UINT32 irq_req, UINT8 type);
};
/*----------- defined in machine/3do.c -----------*/
diff --git a/src/mame/machine/3do.c b/src/mame/machine/3do.c
index 0028d010118..7959d1ac3f7 100644
--- a/src/mame/machine/3do.c
+++ b/src/mame/machine/3do.c
@@ -61,14 +61,14 @@ Expansion bus stuff:
#define LOG(x) do { if (VERBOSE) printf x; } while (0)
/*
-0x80000000 Second Priority (?)
+0x80000000 Second Priority
0x40000000 SW irq
0x20000000 DMA<->EXP
0x1fff0000 DMA RAM->DSPP *
0x0000f000 DMA DSPP->RAM *
0x00000800 DSPP
0x00000400 Timer 1
-0x00000200 Timer 3
+0x00000200 Timer 3 <- needed to surpass current hang point
0x00000100 Timer 5
0x00000080 Timer 7
0x00000040 Timer 9
@@ -79,15 +79,23 @@ Expansion bus stuff:
0x00000002 Vertical 1
0x00000001 Vertical 0
*/
-void _3do_state::m_3do_request_fiq0(UINT32 irq_req)
+void _3do_state::m_3do_request_fiq(UINT32 irq_req, UINT8 type)
{
- m_clio.irq0 |= irq_req;
+ if(type)
+ m_clio.irq1 |= irq_req;
+ else
+ m_clio.irq0 |= irq_req;
- if(m_clio.irq0 & m_clio.irq0_enable)
- m_maincpu->set_input_line(ARM7_FIRQ_LINE, ASSERT_LINE);
+ if(m_clio.irq1)
+ m_clio.irq0 |= 1 << 31; // Second Priority
+ else
+ m_clio.irq0 &= ~(1 << 31);
- if((m_clio.irq0 & m_clio.irq0_enable) == 0)
- m_maincpu->set_input_line(ARM7_FIRQ_LINE, CLEAR_LINE);
+ if((m_clio.irq0 & m_clio.irq0_enable) || (m_clio.irq1 & m_clio.irq1_enable))
+ {
+ printf("Go irq %08x & %08x %08x & %08x\n",m_clio.irq0, m_clio.irq0_enable, m_clio.irq1, m_clio.irq1_enable);
+ generic_pulse_irq_line(m_maincpu, ARM7_FIRQ_LINE, 1);
+ }
}
/*
@@ -103,16 +111,6 @@ void _3do_state::m_3do_request_fiq0(UINT32 irq_req)
0x00000002 Disk Inserted
0x00000001 DMA Player bus
*/
-void _3do_state::m_3do_request_fiq1(UINT32 irq_req)
-{
- m_clio.irq1 |= irq_req;
-
- if(m_clio.irq1 & m_clio.irq1_enable)
- m_maincpu->set_input_line(ARM7_FIRQ_LINE, ASSERT_LINE);
-
- if((m_clio.irq1 & m_clio.irq1_enable) == 0)
- m_maincpu->set_input_line(ARM7_FIRQ_LINE, CLEAR_LINE);
-}
READ32_MEMBER(_3do_state::_3do_nvarea_r){
@@ -608,7 +606,8 @@ void _3do_madam_init( running_machine &machine )
READ32_MEMBER(_3do_state::_3do_clio_r)
{
- logerror( "%08X: CLIO read offset = %08X\n", machine().device("maincpu")->safe_pc(), offset * 4 );
+ if (!space.debugger_access())
+ logerror( "%08X: CLIO read offset = %08X\n", machine().device("maincpu")->safe_pc(), offset * 4 );
switch( offset )
{
@@ -759,6 +758,7 @@ READ32_MEMBER(_3do_state::_3do_clio_r)
return m_clio.uncle_rom;
default:
+ if (!space.debugger_access())
logerror( "%08X: unhandled CLIO read offset = %08X\n", machine().device("maincpu")->safe_pc(), offset * 4 );
break;
}
@@ -806,22 +806,22 @@ WRITE32_MEMBER(_3do_state::_3do_clio_w)
case 0x0040/4:
LOG(("%08x PEND0\n",data));
m_clio.irq0 |= data;
- m_3do_request_fiq0(0);
+ m_3do_request_fiq(0,0);
break;
case 0x0044/4:
LOG(("%08x PEND0 CLEAR\n",data));
m_clio.irq0 &= ~data;
- m_3do_request_fiq0(0);
+ m_3do_request_fiq(0,0);
break;
case 0x0048/4:
LOG(("%08x MASK0\n",data));
m_clio.irq0_enable |= data;
- m_3do_request_fiq0(0);
+ m_3do_request_fiq(0,0);
break;
case 0x004c/4:
LOG(("%08x MASK0 CLEAR\n",data));
m_clio.irq0_enable &= ~data;
- m_3do_request_fiq0(0);
+ m_3do_request_fiq(0,0);
break;
case 0x0050/4:
m_clio.mode |= data;
@@ -838,22 +838,22 @@ WRITE32_MEMBER(_3do_state::_3do_clio_w)
case 0x0060/4:
LOG(("%08x PEND1\n",data));
m_clio.irq1 |= data;
- m_3do_request_fiq1(0);
+ m_3do_request_fiq(0,1);
break;
case 0x0064/4:
LOG(("%08x PEND1 CLEAR\n",data));
m_clio.irq1 &= ~data;
- m_3do_request_fiq1(0);
+ m_3do_request_fiq(0,1);
break;
case 0x0068/4:
LOG(("%08x MASK1\n",data));
m_clio.irq1_enable |= data;
- m_3do_request_fiq1(0);
+ m_3do_request_fiq(0,1);
break;
case 0x006c/4:
LOG(("%08x MASK1 CLEAR\n",data));
m_clio.irq1_enable &= ~data;
- m_3do_request_fiq1(0);
+ m_3do_request_fiq(0,1);
break;
case 0x0080/4:
m_clio.hdelay = data;