trunk/src/emu/cpu/powerpc/ppccom.c
r17608 | r17609 | |
541 | 541 | UINT32 lower = ppc->spr[SPROEA_IBAT0U + 2*batnum + 1]; |
542 | 542 | int privbit = ((intention & TRANSLATE_USER_MASK) == 0) ? 3 : 2; |
543 | 543 | |
544 | | // printf("bat %d upper = %08x privbit %d\n", batnum, upper, privbit); |
| 544 | // printf("bat %d upper = %08x privbit %d\n", batnum, upper, privbit); |
545 | 545 | |
546 | 546 | // is this pair valid? |
547 | 547 | if (lower & 0x40) |
548 | 548 | { |
549 | | UINT32 mask = (~lower & 0x3f) << 17; |
| 549 | UINT32 mask = ((lower & 0x3f) << 17) ^ 0xfffe0000; |
550 | 550 | UINT32 addrout; |
551 | 551 | UINT32 key = (upper >> privbit) & 1; |
552 | 552 | |
553 | 553 | /* check for a hit against this bucket */ |
554 | | if ((*address & 0xfffe0000) == (upper & 0xfffe0000)) |
| 554 | if ((*address & mask) == (upper & mask)) |
555 | 555 | { |
556 | 556 | /* verify protection; if we fail, return false and indicate a protection violation */ |
557 | 557 | if (!page_access_allowed(transtype, key, upper & 3)) |
r17608 | r17609 | |
560 | 560 | } |
561 | 561 | |
562 | 562 | /* otherwise we're good */ |
563 | | addrout = (lower & 0xff100000) | (*address & ~0xfffe0000); |
564 | | addrout |= ((*address & mask) | (lower & mask)); |
| 563 | addrout = (lower & mask) | (*address & ~mask); |
565 | 564 | *address = addrout; // top 9 bits from top 9 of PBN |
566 | 565 | return 0x001; |
567 | 566 | } |
r17608 | r17609 | |
2536 | 2535 | } |
2537 | 2536 | } |
2538 | 2537 | |
| 2538 | |