m68kmmu: deduplicate code to set buserror details

This commit is contained in:
Sven Schnelle 2018-10-20 20:19:56 +02:00
parent 031f507a17
commit 6e5965a939

View File

@ -102,6 +102,17 @@ uint32_t DECODE_EA_32(int ea)
return 0; return 0;
} }
void pmmu_set_buserror(uint32_t addr_in)
{
if (++m_mmu_tmp_buserror_occurred == 1)
{
m_mmu_tmp_buserror_address = addr_in;
m_mmu_tmp_buserror_rw = m_mmu_tmp_rw;
m_mmu_tmp_buserror_fc = m_mmu_tmp_fc;
m_mmu_tmp_buserror_sz = m_mmu_tmp_sz;
}
}
/* /*
pmmu_atc_add: adds this address to the ATC pmmu_atc_add: adds this address to the ATC
*/ */
@ -482,35 +493,11 @@ uint32_t pmmu_translate_addr_with_fc(uint32_t addr_in, uint8_t fc, uint8_t ptest
if (!ptest) if (!ptest)
{ {
if (m_mmu_tmp_sr & M68K_MMU_SR_INVALID) if ((m_mmu_tmp_sr & (M68K_MMU_SR_INVALID|M68K_MMU_SR_SUPERVISOR_ONLY)) ||
((m_mmu_tmp_sr & M68K_MMU_SR_WRITE_PROTECT) && !m_mmu_tmp_rw))
{ {
if (++m_mmu_tmp_buserror_occurred == 1) pmmu_set_buserror(addr_in);
{
m_mmu_tmp_buserror_address = addr_in;
m_mmu_tmp_buserror_rw = m_mmu_tmp_rw;
m_mmu_tmp_buserror_fc = m_mmu_tmp_fc;
m_mmu_tmp_buserror_sz = m_mmu_tmp_sz;
}
}
else if (m_mmu_tmp_sr & M68K_MMU_SR_SUPERVISOR_ONLY)
{
if (++m_mmu_tmp_buserror_occurred == 1)
{
m_mmu_tmp_buserror_address = addr_in;
m_mmu_tmp_buserror_rw = m_mmu_tmp_rw;
m_mmu_tmp_buserror_fc = m_mmu_tmp_fc;
m_mmu_tmp_buserror_sz = m_mmu_tmp_sz;
}
}
else if ((m_mmu_tmp_sr & M68K_MMU_SR_WRITE_PROTECT) && !m_mmu_tmp_rw)
{
if (++m_mmu_tmp_buserror_occurred == 1)
{
m_mmu_tmp_buserror_address = addr_in;
m_mmu_tmp_buserror_rw = m_mmu_tmp_rw;
m_mmu_tmp_buserror_fc = m_mmu_tmp_fc;
m_mmu_tmp_buserror_sz = m_mmu_tmp_sz;
}
} }
if (!m_mmu_tmp_buserror_occurred) if (!m_mmu_tmp_buserror_occurred)
@ -566,13 +553,7 @@ uint32_t pmmu_translate_addr_with_fc_040(uint32_t addr_in, uint8_t fc, uint8_t p
// fprintf(stderr, "TT0 match on address %08x (TT0 = %08x, mask = %08x)\n", addr_in, tt0, mask); // fprintf(stderr, "TT0 match on address %08x (TT0 = %08x, mask = %08x)\n", addr_in, tt0, mask);
if ((tt0 & 4) && !m_mmu_tmp_rw && !ptest) // write protect? if ((tt0 & 4) && !m_mmu_tmp_rw && !ptest) // write protect?
{ {
if (++m_mmu_tmp_buserror_occurred == 1) pmmu_set_buserror(addr_in);
{
m_mmu_tmp_buserror_address = addr_in;
m_mmu_tmp_buserror_rw = m_mmu_tmp_rw;
m_mmu_tmp_buserror_fc = m_mmu_tmp_fc;
m_mmu_tmp_buserror_sz = m_mmu_tmp_sz;
}
} }
return addr_in; return addr_in;
@ -592,13 +573,7 @@ uint32_t pmmu_translate_addr_with_fc_040(uint32_t addr_in, uint8_t fc, uint8_t p
// fprintf(stderr, "TT1 match on address %08x (TT0 = %08x, mask = %08x)\n", addr_in, tt1, mask); // fprintf(stderr, "TT1 match on address %08x (TT0 = %08x, mask = %08x)\n", addr_in, tt1, mask);
if ((tt1 & 4) && !m_mmu_tmp_rw && !ptest) // write protect? if ((tt1 & 4) && !m_mmu_tmp_rw && !ptest) // write protect?
{ {
if (++m_mmu_tmp_buserror_occurred == 1) pmmu_set_buserror(addr_in);
{
m_mmu_tmp_buserror_address = addr_in;
m_mmu_tmp_buserror_rw = m_mmu_tmp_rw;
m_mmu_tmp_buserror_fc = m_mmu_tmp_fc;
m_mmu_tmp_buserror_sz = m_mmu_tmp_sz;
}
} }
return addr_in; return addr_in;
@ -663,14 +638,7 @@ uint32_t pmmu_translate_addr_with_fc_040(uint32_t addr_in, uint8_t fc, uint8_t p
// write protected by the root or pointer entries? // write protected by the root or pointer entries?
if ((((root_entry & 4) && !m_mmu_tmp_rw) || ((pointer_entry & 4) && !m_mmu_tmp_rw)) && !ptest) if ((((root_entry & 4) && !m_mmu_tmp_rw) || ((pointer_entry & 4) && !m_mmu_tmp_rw)) && !ptest)
{ {
if (++m_mmu_tmp_buserror_occurred == 1) pmmu_set_buserror(addr_in);
{
m_mmu_tmp_buserror_address = addr_in;
m_mmu_tmp_buserror_rw = m_mmu_tmp_rw;
m_mmu_tmp_buserror_fc = m_mmu_tmp_fc;
m_mmu_tmp_buserror_sz = m_mmu_tmp_sz;
}
return addr_in; return addr_in;
} }
@ -678,14 +646,7 @@ uint32_t pmmu_translate_addr_with_fc_040(uint32_t addr_in, uint8_t fc, uint8_t p
if (!(pointer_entry & 2) && !ptest) if (!(pointer_entry & 2) && !ptest)
{ {
// fprintf(stderr, "Invalid pointer entry! PC=%x, addr=%x\n", m_ppc, addr_in); // fprintf(stderr, "Invalid pointer entry! PC=%x, addr=%x\n", m_ppc, addr_in);
if (++m_mmu_tmp_buserror_occurred == 1) pmmu_set_buserror(addr_in);
{
m_mmu_tmp_buserror_address = addr_in;
m_mmu_tmp_buserror_rw = m_mmu_tmp_rw;
m_mmu_tmp_buserror_fc = m_mmu_tmp_fc;
m_mmu_tmp_buserror_sz = m_mmu_tmp_sz;
}
return addr_in; return addr_in;
} }
@ -697,13 +658,7 @@ uint32_t pmmu_translate_addr_with_fc_040(uint32_t addr_in, uint8_t fc, uint8_t p
if (!ptest) if (!ptest)
{ {
if (++m_mmu_tmp_buserror_occurred == 1) pmmu_set_buserror(addr_in);
{
m_mmu_tmp_buserror_address = addr_in;
m_mmu_tmp_buserror_rw = m_mmu_tmp_rw;
m_mmu_tmp_buserror_fc = m_mmu_tmp_fc;
m_mmu_tmp_buserror_sz = m_mmu_tmp_sz;
}
} }
return addr_in; return addr_in;
@ -742,14 +697,7 @@ uint32_t pmmu_translate_addr_with_fc_040(uint32_t addr_in, uint8_t fc, uint8_t p
// is the page write protected or supervisor protected? // is the page write protected or supervisor protected?
if ((((page_entry & 4) && !m_mmu_tmp_rw) || ((page_entry & 0x80) && !(fc&4))) && !ptest) if ((((page_entry & 4) && !m_mmu_tmp_rw) || ((page_entry & 0x80) && !(fc&4))) && !ptest)
{ {
if (++m_mmu_tmp_buserror_occurred == 1) pmmu_set_buserror(addr_in);
{
m_mmu_tmp_buserror_address = addr_in;
m_mmu_tmp_buserror_rw = m_mmu_tmp_rw;
m_mmu_tmp_buserror_fc = m_mmu_tmp_fc;
m_mmu_tmp_buserror_sz = m_mmu_tmp_sz;
}
return addr_in; return addr_in;
} }
@ -759,13 +707,7 @@ uint32_t pmmu_translate_addr_with_fc_040(uint32_t addr_in, uint8_t fc, uint8_t p
// fprintf(stderr, "Invalid page entry! PC=%x, addr=%x\n", m_ppc, addr_in); // fprintf(stderr, "Invalid page entry! PC=%x, addr=%x\n", m_ppc, addr_in);
if (!ptest) if (!ptest)
{ {
if (++m_mmu_tmp_buserror_occurred == 1) pmmu_set_buserror(addr_in);
{
m_mmu_tmp_buserror_address = addr_in;
m_mmu_tmp_buserror_rw = m_mmu_tmp_rw;
m_mmu_tmp_buserror_fc = m_mmu_tmp_fc;
m_mmu_tmp_buserror_sz = m_mmu_tmp_sz;
}
} }
return addr_in; return addr_in;