diff options
author | mooglyguy <therealmogminer@gmail.com> | 2018-09-12 00:21:28 +0200 |
---|---|---|
committer | mooglyguy <therealmogminer@gmail.com> | 2018-09-12 00:21:39 +0200 |
commit | 97db10afb84c84d72946a771a0899b486a749e15 (patch) | |
tree | f62e0444ae9220d71a5bee596883b6eb01d62544 | |
parent | 813c5ff2f4d07de9f53ce233bb7327716f379e75 (diff) |
-sparc, sun4: Miscellaneous fixes, nw
-rw-r--r-- | src/devices/cpu/sparc/sparc.h | 1 | ||||
-rw-r--r-- | src/mame/drivers/sun4.cpp | 22 |
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; } |