summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author mooglyguy <therealmogminer@gmail.com>2018-09-12 00:21:28 +0200
committer mooglyguy <therealmogminer@gmail.com>2018-09-12 00:21:39 +0200
commit97db10afb84c84d72946a771a0899b486a749e15 (patch)
treef62e0444ae9220d71a5bee596883b6eb01d62544
parent813c5ff2f4d07de9f53ce233bb7327716f379e75 (diff)
-sparc, sun4: Miscellaneous fixes, nw
-rw-r--r--src/devices/cpu/sparc/sparc.h1
-rw-r--r--src/mame/drivers/sun4.cpp22
2 files changed, 14 insertions, 9 deletions
diff --git a/src/devices/cpu/sparc/sparc.h b/src/devices/cpu/sparc/sparc.h
index 435fee74e91..29856915845 100644
--- a/src/devices/cpu/sparc/sparc.h
+++ b/src/devices/cpu/sparc/sparc.h
@@ -50,6 +50,7 @@ public:
uint8_t get_asi() { return m_asi; }
uint32_t pc() { return m_pc; }
+ void set_mae() { m_mae = 1; }
void add_asi_desc(std::function<void (sparc_disassembler *)> f) { m_asi_desc_adder = f; }
diff --git a/src/mame/drivers/sun4.cpp b/src/mame/drivers/sun4.cpp
index 4ead5927205..13e8285e141 100644
--- a/src/mame/drivers/sun4.cpp
+++ b/src/mame/drivers/sun4.cpp
@@ -760,9 +760,10 @@ void sun4_state::write_insn_data_4c(uint8_t asi, address_space &space, uint32_t
if ((!(m_pagemap[entry] & PM_WRITEMASK)) || ((m_pagemap[entry] & PM_SYSMASK) && !(asi & 1)))
{
printf("sun4c: write protect MMU error (PC=%x)\n", m_maincpu->pc());
- m_buserr[0] = 0x8040; // write, protection error
+ m_buserr[0] |= 0x8040; // write, protection error
m_buserr[1] = offset<<2;
- m_maincpu->set_input_line(SPARC_MAE, ASSERT_LINE);
+ //m_maincpu->set_input_line(SPARC_MAE, ASSERT_LINE);
+ m_maincpu->set_mae();
return;
}
@@ -790,10 +791,12 @@ void sun4_state::write_insn_data_4c(uint8_t asi, address_space &space, uint32_t
}
else
{
- printf("sun4c: INVALID PTE entry %d %08x accessed! data=%08x vaddr=%x PC=%x\n", entry, m_pagemap[entry], data, offset <<2, m_maincpu->pc());
+ //printf("sun4c: INVALID PTE entry %d %08x accessed! data=%08x vaddr=%x PC=%x\n", entry, m_pagemap[entry], data, offset <<2, m_maincpu->pc());
//m_maincpu->trap(SPARC_DATA_ACCESS_EXCEPTION);
- //m_buserr[0] = 0x8; // invalid PTE
- //m_buserr[1] = offset<<2;
+ //m_maincpu->set_input_line(SPARC_NMI, ASSERT_LINE);
+ m_maincpu->set_mae();
+ m_buserr[0] |= 0x8080; // write cycle, invalid PTE
+ m_buserr[1] = offset<<2;
}
}
@@ -827,7 +830,7 @@ READ32_MEMBER( sun4_state::sun4c_mmu_r )
case 6: // bus error register
printf("sun4c: read buserror, PC=%x (mask %08x)\n", m_maincpu->pc(), mem_mask);
- m_maincpu->set_input_line(SPARC_MAE, CLEAR_LINE);
+ //m_maincpu->set_input_line(SPARC_MAE, CLEAR_LINE);
retval = m_buserr[offset & 0xf];
m_buserr[offset & 0xf] = 0; // clear on reading
return retval;
@@ -1037,9 +1040,10 @@ uint32_t sun4_state::read_insn_data(uint8_t asi, address_space &space, uint32_t
if (!machine().side_effects_disabled())
{
printf("sun4: INVALID PTE entry %d %08x accessed! vaddr=%x PC=%x\n", entry, m_pagemap[entry], offset <<2, m_maincpu->pc());
- //m_maincpu->trap(SPARC_DATA_ACCESS_EXCEPTION);
- //m_buserr[0] = 0x88; // read, invalid PTE
- //m_buserr[1] = offset<<2;
+ m_maincpu->set_mae();
+ m_buserr[0] |= 0x80; // invalid PTE
+ m_buserr[0] &= ~0x8000; // read
+ m_buserr[1] = offset<<2;
}
return 0;
}