Merge pull request #4233 from hp9k/m68000_aerr_rw_fix

m68000: fix rw bit in address error frame (nw)
This commit is contained in:
R. Belmont 2018-11-03 00:08:08 -04:00 committed by GitHub
commit 21f836ccf8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 16 additions and 16 deletions

View File

@ -1519,12 +1519,12 @@ void m68000_base_device::set_reset_callback(write_line_delegate callback)
}
// fault_addr = address to indicate fault at
// rw = 0 for read, 1 for write
// rw = 1 for read, 0 for write
// fc = 3-bit function code of access (usually you'd just put what m68k_get_fc() returns here)
void m68000_base_device::set_buserror_details(uint32_t fault_addr, uint8_t rw, uint8_t fc)
{
m_aerr_address = fault_addr;
m_aerr_write_mode = rw;
m_aerr_write_mode = (rw << 4);
m_aerr_fc = fc;
m_mmu_tmp_buserror_address = fault_addr; // Hack for x68030
}

View File

@ -283,7 +283,7 @@ void hp9k3xx_state::add_dio32_bus(machine_config &config)
dio32.irq7_out_cb().set(FUNC(hp9k3xx_state::dio_irq7_w));
}
void hp9k3xx_state::set_bus_error(uint32_t address, bool write, uint16_t mem_mask)
void hp9k3xx_state::set_bus_error(uint32_t address, bool rw, uint16_t mem_mask)
{
if (m_maincpu->m68851_buserror())
return;
@ -292,7 +292,7 @@ void hp9k3xx_state::set_bus_error(uint32_t address, bool write, uint16_t mem_mas
return;
m_bus_error = true;
m_maincpu->set_buserror_details(address, write, m_maincpu->get_fc());
m_maincpu->set_buserror_details(address, rw, m_maincpu->get_fc());
m_maincpu->set_input_line(M68K_LINE_BUSERROR, ASSERT_LINE);
m_bus_error_timer->adjust(m_maincpu->cycles_to_attotime(16)); // let rmw cycles complete
}
@ -300,14 +300,14 @@ void hp9k3xx_state::set_bus_error(uint32_t address, bool write, uint16_t mem_mas
READ16_MEMBER(hp9k3xx_state::buserror16_r)
{
if (!machine().side_effects_disabled())
set_bus_error((offset << 1) & 0xFFFFFF, false, mem_mask);
set_bus_error((offset << 1) & 0xFFFFFF, true, mem_mask);
return 0xffff;
}
WRITE16_MEMBER(hp9k3xx_state::buserror16_w)
{
if (!machine().side_effects_disabled())
set_bus_error((offset << 1) & 0xFFFFFF, true, mem_mask);
set_bus_error((offset << 1) & 0xFFFFFF, false, mem_mask);
}
READ32_MEMBER(hp9k3xx_state::buserror_r)

View File

@ -457,7 +457,7 @@ void hp_ipc_state::device_timer(emu_timer &timer, device_timer_id id, int param,
m_bus_error = false;
}
void hp_ipc_state::set_bus_error(uint32_t address, bool write, uint16_t mem_mask)
void hp_ipc_state::set_bus_error(uint32_t address, bool rw, uint16_t mem_mask)
{
if (m_bus_error)
{
@ -468,7 +468,7 @@ void hp_ipc_state::set_bus_error(uint32_t address, bool write, uint16_t mem_mask
address++;
}
m_bus_error = true;
m_maincpu->set_buserror_details(address, write, m_maincpu->get_fc());
m_maincpu->set_buserror_details(address, rw, m_maincpu->get_fc());
m_maincpu->set_input_line(M68K_LINE_BUSERROR, ASSERT_LINE);
m_bus_error_timer->adjust(m_maincpu->cycles_to_attotime(16)); // let rmw cycles complete
}
@ -562,14 +562,14 @@ WRITE16_MEMBER(hp_ipc_state::mem_w)
READ16_MEMBER(hp_ipc_state::trap_r)
{
if (!machine().side_effects_disabled()) set_bus_error((offset << 1) & 0xFFFFFF, 0, mem_mask);
if (!machine().side_effects_disabled()) set_bus_error((offset << 1) & 0xFFFFFF, true, mem_mask);
return 0xffff;
}
WRITE16_MEMBER(hp_ipc_state::trap_w)
{
if (!machine().side_effects_disabled()) set_bus_error((offset << 1) & 0xFFFFFF, 1, mem_mask);
if (!machine().side_effects_disabled()) set_bus_error((offset << 1) & 0xFFFFFF, false, mem_mask);
}

View File

@ -392,7 +392,7 @@ READ16_MEMBER( wicat_state::invalid_r )
{
if(!machine().side_effects_disabled())
{
m_maincpu->set_buserror_details(0x300000+offset*2-2,0,m_maincpu->get_fc());
m_maincpu->set_buserror_details(0x300000+offset*2-2,true,m_maincpu->get_fc());
m_maincpu->set_input_line(M68K_LINE_BUSERROR, ASSERT_LINE);
m_maincpu->set_input_line(M68K_LINE_BUSERROR, CLEAR_LINE);
}
@ -403,7 +403,7 @@ WRITE16_MEMBER( wicat_state::invalid_w )
{
if(!machine().side_effects_disabled())
{
m_maincpu->set_buserror_details(0x300000+offset*2-2,1,m_maincpu->get_fc());
m_maincpu->set_buserror_details(0x300000+offset*2-2,false,m_maincpu->get_fc());
m_maincpu->set_input_line(M68K_LINE_BUSERROR, ASSERT_LINE);
m_maincpu->set_input_line(M68K_LINE_BUSERROR, CLEAR_LINE);
}

View File

@ -935,14 +935,14 @@ TIMER_CALLBACK_MEMBER(x68k_state::bus_error)
m_bus_error = false;
}
void x68k_state::set_bus_error(uint32_t address, bool write, uint16_t mem_mask)
void x68k_state::set_bus_error(uint32_t address, bool rw, uint16_t mem_mask)
{
if(m_bus_error)
return;
if(!ACCESSING_BITS_8_15)
address++;
m_bus_error = true;
m_maincpu->set_buserror_details(address, write, m_maincpu->get_fc());
m_maincpu->set_buserror_details(address, rw, m_maincpu->get_fc());
m_maincpu->set_input_line(M68K_LINE_BUSERROR, ASSERT_LINE);
m_maincpu->set_input_line(M68K_LINE_BUSERROR, CLEAR_LINE);
m_bus_error_timer->adjust(m_maincpu->cycles_to_attotime(16)); // let rmw cycles complete
@ -954,7 +954,7 @@ READ16_MEMBER(x68k_state::rom0_r)
/* this location contains the address of some expansion device ROM, if no ROM exists,
then access causes a bus error */
if((m_options->read() & 0x02) && !machine().side_effects_disabled())
set_bus_error((offset << 1) + 0xbffffc, 0, mem_mask);
set_bus_error((offset << 1) + 0xbffffc, true, mem_mask);
return 0xff;
}
@ -963,7 +963,7 @@ WRITE16_MEMBER(x68k_state::rom0_w)
/* this location contains the address of some expansion device ROM, if no ROM exists,
then access causes a bus error */
if((m_options->read() & 0x02) && !machine().side_effects_disabled())
set_bus_error((offset << 1) + 0xbffffc, 1, mem_mask);
set_bus_error((offset << 1) + 0xbffffc, false, mem_mask);
}
READ16_MEMBER(x68k_state::emptyram_r)