mirror of
https://github.com/holub/mame
synced 2025-05-17 11:15:06 +03:00
Removed PPC_MMU_ENABLED flag (no whatsnew)
This commit is contained in:
parent
124ee70ef1
commit
1d7d5e7081
@ -119,15 +119,6 @@ enum
|
|||||||
PPC_TRANSLATE_NOEXCEPTION = 0x0004
|
PPC_TRANSLATE_NOEXCEPTION = 0x0004
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef MESS
|
|
||||||
#define PPC_MMU_ENABLED 1
|
|
||||||
#else /* !MESS */
|
|
||||||
/* MMU not enabled in MAME; model3 drivers don't work properly */
|
|
||||||
#define PPC_MMU_ENABLED 0
|
|
||||||
#endif /* MESS */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static int ppc_is_protected(UINT32 pp, int flags)
|
static int ppc_is_protected(UINT32 pp, int flags)
|
||||||
{
|
{
|
||||||
if (flags & PPC_TRANSLATE_WRITE)
|
if (flags & PPC_TRANSLATE_WRITE)
|
||||||
@ -145,153 +136,145 @@ static int ppc_is_protected(UINT32 pp, int flags)
|
|||||||
|
|
||||||
static int ppc_translate_address(offs_t *addr_ptr, int flags)
|
static int ppc_translate_address(offs_t *addr_ptr, int flags)
|
||||||
{
|
{
|
||||||
if (PPC_MMU_ENABLED)
|
const BATENT *bat;
|
||||||
|
UINT32 address;
|
||||||
|
UINT32 sr, vsid, hash;
|
||||||
|
UINT32 pteg_address;
|
||||||
|
UINT32 target_pte, bl, mask;
|
||||||
|
UINT64 pte;
|
||||||
|
UINT64 *pteg_ptr[2];
|
||||||
|
int i, hash_type;
|
||||||
|
UINT32 dsisr = DSISR_PROT;
|
||||||
|
|
||||||
|
bat = (flags & PPC_TRANSLATE_CODE) ? ppc.ibat : ppc.dbat;
|
||||||
|
|
||||||
|
address = *addr_ptr;
|
||||||
|
|
||||||
|
/* first check the block address translation table */
|
||||||
|
for (i = 0; i < 4; i++)
|
||||||
{
|
{
|
||||||
const BATENT *bat;
|
if (bat[i].u & ((MSR & MSR_PR) ? 0x00000001 : 0x00000002))
|
||||||
UINT32 address;
|
|
||||||
UINT32 sr, vsid, hash;
|
|
||||||
UINT32 pteg_address;
|
|
||||||
UINT32 target_pte, bl, mask;
|
|
||||||
UINT64 pte;
|
|
||||||
UINT64 *pteg_ptr[2];
|
|
||||||
int i, hash_type;
|
|
||||||
UINT32 dsisr = DSISR_PROT;
|
|
||||||
|
|
||||||
bat = (flags & PPC_TRANSLATE_CODE) ? ppc.ibat : ppc.dbat;
|
|
||||||
|
|
||||||
address = *addr_ptr;
|
|
||||||
|
|
||||||
/* first check the block address translation table */
|
|
||||||
for (i = 0; i < 4; i++)
|
|
||||||
{
|
{
|
||||||
if (bat[i].u & ((MSR & MSR_PR) ? 0x00000001 : 0x00000002))
|
bl = bat[i].u & 0x00001FFC;
|
||||||
|
mask = (~bl << 15) & 0xFFFE0000;
|
||||||
|
|
||||||
|
if ((address & mask) == (bat[i].u & 0xFFFE0000))
|
||||||
|
{
|
||||||
|
if (ppc_is_protected(bat[i].l, flags))
|
||||||
|
goto exception;
|
||||||
|
|
||||||
|
*addr_ptr = (bat[i].l & 0xFFFE0000)
|
||||||
|
| (address & ((bl << 15) | 0x0001FFFF));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* now try page address translation */
|
||||||
|
sr = ppc.sr[(address >> 28) & 0x0F];
|
||||||
|
if (sr & 0x80000000)
|
||||||
|
{
|
||||||
|
/* direct store translation */
|
||||||
|
if ((flags & PPC_TRANSLATE_NOEXCEPTION) == 0)
|
||||||
|
fatalerror("ppc: direct store translation not yet implemented");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* is no execute is set? */
|
||||||
|
if ((flags & PPC_TRANSLATE_CODE) && (sr & 0x10000000))
|
||||||
|
goto exception;
|
||||||
|
|
||||||
|
vsid = sr & 0x00FFFFFF;
|
||||||
|
hash = (vsid & 0x0007FFFF) ^ ((address >> 12) & 0xFFFF);
|
||||||
|
target_pte = (vsid << 7) | ((address >> 22) & 0x3F) | 0x80000000;
|
||||||
|
|
||||||
|
/* we have to try both types of hashes */
|
||||||
|
for (hash_type = 0; hash_type <= 1; hash_type++)
|
||||||
|
{
|
||||||
|
pteg_address = (ppc.sdr1 & 0xFFFF0000)
|
||||||
|
| (((ppc.sdr1 & 0x01FF) & (hash >> 10)) << 16)
|
||||||
|
| ((hash & 0x03FF) << 6);
|
||||||
|
|
||||||
|
pteg_ptr[hash_type] = ppc->program->get_read_ptr(pteg_address);
|
||||||
|
if (pteg_ptr[hash_type])
|
||||||
|
{
|
||||||
|
for (i = 0; i < 8; i++)
|
||||||
|
{
|
||||||
|
pte = pteg_ptr[hash_type][i];
|
||||||
|
|
||||||
|
/* is valid? */
|
||||||
|
if (((pte >> 32) & 0xFFFFFFFF) == target_pte)
|
||||||
|
{
|
||||||
|
if (ppc_is_protected((UINT32) pte, flags))
|
||||||
|
goto exception;
|
||||||
|
|
||||||
|
*addr_ptr = ((UINT32) (pte & 0xFFFFF000))
|
||||||
|
| (address & 0x0FFF);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
hash ^= 0x7FFFF;
|
||||||
|
target_pte ^= 0x40;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (DUMP_PAGEFAULTS)
|
||||||
|
{
|
||||||
|
mame_printf_debug("PAGE FAULT: address=%08X PC=%08X SDR1=%08X MSR=%08X\n", address, ppc.pc, ppc.sdr1, ppc.msr);
|
||||||
|
mame_printf_debug("\n");
|
||||||
|
|
||||||
|
for (i = 0; i < 4; i++)
|
||||||
{
|
{
|
||||||
bl = bat[i].u & 0x00001FFC;
|
bl = bat[i].u & 0x00001FFC;
|
||||||
mask = (~bl << 15) & 0xFFFE0000;
|
mask = (~bl << 15) & 0xFFFE0000;
|
||||||
|
mame_printf_debug(" BAT[%d]=%08X%08X (A & %08X = %08X)\n", i, bat[i].u, bat[i].l,
|
||||||
if ((address & mask) == (bat[i].u & 0xFFFE0000))
|
mask, bat[i].u & 0xFFFE0000);
|
||||||
{
|
|
||||||
if (ppc_is_protected(bat[i].l, flags))
|
|
||||||
goto exception;
|
|
||||||
|
|
||||||
*addr_ptr = (bat[i].l & 0xFFFE0000)
|
|
||||||
| (address & ((bl << 15) | 0x0001FFFF));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
mame_printf_debug("\n");
|
||||||
|
mame_printf_debug(" VSID=%06X HASH=%05X HASH\'=%05X\n", vsid, hash, hash ^ 0x7FFFF);
|
||||||
|
|
||||||
/* now try page address translation */
|
|
||||||
sr = ppc.sr[(address >> 28) & 0x0F];
|
|
||||||
if (sr & 0x80000000)
|
|
||||||
{
|
|
||||||
/* direct store translation */
|
|
||||||
if ((flags & PPC_TRANSLATE_NOEXCEPTION) == 0)
|
|
||||||
fatalerror("ppc: direct store translation not yet implemented");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* is no execute is set? */
|
|
||||||
if ((flags & PPC_TRANSLATE_CODE) && (sr & 0x10000000))
|
|
||||||
goto exception;
|
|
||||||
|
|
||||||
vsid = sr & 0x00FFFFFF;
|
|
||||||
hash = (vsid & 0x0007FFFF) ^ ((address >> 12) & 0xFFFF);
|
|
||||||
target_pte = (vsid << 7) | ((address >> 22) & 0x3F) | 0x80000000;
|
|
||||||
|
|
||||||
/* we have to try both types of hashes */
|
|
||||||
for (hash_type = 0; hash_type <= 1; hash_type++)
|
for (hash_type = 0; hash_type <= 1; hash_type++)
|
||||||
{
|
{
|
||||||
pteg_address = (ppc.sdr1 & 0xFFFF0000)
|
|
||||||
| (((ppc.sdr1 & 0x01FF) & (hash >> 10)) << 16)
|
|
||||||
| ((hash & 0x03FF) << 6);
|
|
||||||
|
|
||||||
pteg_ptr[hash_type] = ppc->program->get_read_ptr(pteg_address);
|
|
||||||
if (pteg_ptr[hash_type])
|
if (pteg_ptr[hash_type])
|
||||||
{
|
{
|
||||||
for (i = 0; i < 8; i++)
|
for (i = 0; i < 8; i++)
|
||||||
{
|
{
|
||||||
pte = pteg_ptr[hash_type][i];
|
pte = pteg_ptr[hash_type][i];
|
||||||
|
mame_printf_debug(" PTE[%i%c]=%08X%08X\n",
|
||||||
/* is valid? */
|
i,
|
||||||
if (((pte >> 32) & 0xFFFFFFFF) == target_pte)
|
hash_type ? '\'' : ' ',
|
||||||
{
|
(unsigned) (pte >> 32),
|
||||||
if (ppc_is_protected((UINT32) pte, flags))
|
(unsigned) (pte >> 0));
|
||||||
goto exception;
|
|
||||||
|
|
||||||
*addr_ptr = ((UINT32) (pte & 0xFFFFF000))
|
|
||||||
| (address & 0x0FFF);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
hash ^= 0x7FFFF;
|
|
||||||
target_pte ^= 0x40;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (DUMP_PAGEFAULTS)
|
|
||||||
{
|
|
||||||
mame_printf_debug("PAGE FAULT: address=%08X PC=%08X SDR1=%08X MSR=%08X\n", address, ppc.pc, ppc.sdr1, ppc.msr);
|
|
||||||
mame_printf_debug("\n");
|
|
||||||
|
|
||||||
for (i = 0; i < 4; i++)
|
|
||||||
{
|
|
||||||
bl = bat[i].u & 0x00001FFC;
|
|
||||||
mask = (~bl << 15) & 0xFFFE0000;
|
|
||||||
mame_printf_debug(" BAT[%d]=%08X%08X (A & %08X = %08X)\n", i, bat[i].u, bat[i].l,
|
|
||||||
mask, bat[i].u & 0xFFFE0000);
|
|
||||||
}
|
|
||||||
mame_printf_debug("\n");
|
|
||||||
mame_printf_debug(" VSID=%06X HASH=%05X HASH\'=%05X\n", vsid, hash, hash ^ 0x7FFFF);
|
|
||||||
|
|
||||||
for (hash_type = 0; hash_type <= 1; hash_type++)
|
|
||||||
{
|
|
||||||
if (pteg_ptr[hash_type])
|
|
||||||
{
|
|
||||||
for (i = 0; i < 8; i++)
|
|
||||||
{
|
|
||||||
pte = pteg_ptr[hash_type][i];
|
|
||||||
mame_printf_debug(" PTE[%i%c]=%08X%08X\n",
|
|
||||||
i,
|
|
||||||
hash_type ? '\'' : ' ',
|
|
||||||
(unsigned) (pte >> 32),
|
|
||||||
(unsigned) (pte >> 0));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
dsisr = DSISR_PAGE;
|
dsisr = DSISR_PAGE;
|
||||||
|
|
||||||
exception:
|
exception:
|
||||||
/* lookup failure - exception */
|
/* lookup failure - exception */
|
||||||
if ((flags & PPC_TRANSLATE_NOEXCEPTION) == 0)
|
if ((flags & PPC_TRANSLATE_NOEXCEPTION) == 0)
|
||||||
{
|
|
||||||
if (flags & PPC_TRANSLATE_CODE)
|
|
||||||
{
|
|
||||||
ppc_exception(EXCEPTION_ISI);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ppc.dar = address;
|
|
||||||
if (flags & PPC_TRANSLATE_WRITE)
|
|
||||||
ppc.dsisr = dsisr | DSISR_STORE;
|
|
||||||
else
|
|
||||||
ppc.dsisr = dsisr;
|
|
||||||
|
|
||||||
ppc_exception(EXCEPTION_DSI);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
/* MMU not enabled in MAME; model3 drivers don't work properly */
|
if (flags & PPC_TRANSLATE_CODE)
|
||||||
return 1;
|
{
|
||||||
|
ppc_exception(EXCEPTION_ISI);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ppc.dar = address;
|
||||||
|
if (flags & PPC_TRANSLATE_WRITE)
|
||||||
|
ppc.dsisr = dsisr | DSISR_STORE;
|
||||||
|
else
|
||||||
|
ppc.dsisr = dsisr;
|
||||||
|
|
||||||
|
ppc_exception(EXCEPTION_DSI);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ppc_translate_address_cb(int space, offs_t *addr)
|
static int ppc_translate_address_cb(int space, offs_t *addr)
|
||||||
|
Loading…
Reference in New Issue
Block a user