src/emu/cpu/m68000/m68kcpu.h
| r14569 | r14570 | |
| 707 | 707 | UINT16 mmu_tmp_rw; /* temporary hack: read/write (1/0) for the mmu */ |
| 708 | 708 | UINT32 mmu_tmp_buserror_address; /* temporary hack: (first) bus error address */ |
| 709 | 709 | UINT16 mmu_tmp_buserror_occurred; /* temporary hack: flag that bus error has occurred from mmu */ |
| 710 | UINT16 mmu_tmp_buserror_fc; /* temporary hack: (first) bus error fc */ |
| 711 | UINT16 mmu_tmp_buserror_rw; /* temporary hack: (first) bus error rw */ |
| 710 | 712 | |
| 711 | 713 | UINT32 ic_address[M68K_IC_SIZE]; /* instruction cache address data */ |
| 712 | 714 | UINT16 ic_data[M68K_IC_SIZE]; /* instruction cache content data */ |
| r14569 | r14570 | |
| 1571 | 1573 | */ |
| 1572 | 1574 | void m68ki_stack_frame_1010(m68ki_cpu_core *m68k, UINT32 sr, UINT32 vector, UINT32 pc, UINT32 fault_address) |
| 1573 | 1575 | { |
| 1574 | | int orig_rw = m68k->mmu_tmp_rw; // this gets splatted by the following pushes, so save it now |
| 1575 | | int orig_fc = m68k->mmu_tmp_fc; |
| 1576 | int orig_rw = m68k->mmu_tmp_buserror_rw; // this gets splatted by the following pushes, so save it now |
| 1577 | int orig_fc = m68k->mmu_tmp_buserror_fc; |
| 1576 | 1578 | |
| 1577 | 1579 | /* INTERNAL REGISTER */ |
| 1578 | 1580 | m68ki_push_16(m68k, 0); |
| r14569 | r14570 | |
| 1623 | 1625 | */ |
| 1624 | 1626 | void m68ki_stack_frame_1011(m68ki_cpu_core *m68k, UINT32 sr, UINT32 vector, UINT32 pc, UINT32 fault_address) |
| 1625 | 1627 | { |
| 1626 | | int orig_rw = m68k->mmu_tmp_rw; // this gets splatted by the following pushes, so save it now |
| 1627 | | int orig_fc = m68k->mmu_tmp_fc; |
| 1628 | int orig_rw = m68k->mmu_tmp_buserror_rw; // this gets splatted by the following pushes, so save it now |
| 1629 | int orig_fc = m68k->mmu_tmp_buserror_fc; |
| 1628 | 1630 | |
| 1629 | 1631 | /* INTERNAL REGISTERS (18 words) */ |
| 1630 | 1632 | m68ki_push_32(m68k, 0); |
| r14569 | r14570 | |
| 1697 | 1699 | */ |
| 1698 | 1700 | void m68ki_stack_frame_0111(m68ki_cpu_core *m68k, UINT32 sr, UINT32 vector, UINT32 pc, UINT32 fault_address, bool in_mmu) |
| 1699 | 1701 | { |
| 1700 | | int orig_rw = m68k->mmu_tmp_rw; // this gets splatted by the following pushes, so save it now |
| 1701 | | int orig_fc = m68k->mmu_tmp_fc; |
| 1702 | int orig_rw = m68k->mmu_tmp_buserror_rw; // this gets splatted by the following pushes, so save it now |
| 1703 | int orig_fc = m68k->mmu_tmp_buserror_fc; |
| 1702 | 1704 | |
| 1703 | 1705 | /* INTERNAL REGISTERS (18 words) */ |
| 1704 | 1706 | m68ki_push_32(m68k, 0); |
src/emu/cpu/m68000/m68kmmu.h
| r14569 | r14570 | |
| 488 | 488 | if (++m68k->mmu_tmp_buserror_occurred == 1) |
| 489 | 489 | { |
| 490 | 490 | m68k->mmu_tmp_buserror_address = addr_in; |
| 491 | m68k->mmu_tmp_buserror_rw = m68k->mmu_tmp_rw; |
| 492 | m68k->mmu_tmp_buserror_fc = m68k->mmu_tmp_fc; |
| 491 | 493 | } |
| 492 | 494 | } |
| 493 | 495 | else if (m68k->mmu_tmp_sr & M68K_MMU_SR_SUPERVISOR_ONLY) |
| r14569 | r14570 | |
| 495 | 497 | if (++m68k->mmu_tmp_buserror_occurred == 1) |
| 496 | 498 | { |
| 497 | 499 | m68k->mmu_tmp_buserror_address = addr_in; |
| 500 | m68k->mmu_tmp_buserror_rw = m68k->mmu_tmp_rw; |
| 501 | m68k->mmu_tmp_buserror_fc = m68k->mmu_tmp_fc; |
| 498 | 502 | } |
| 499 | 503 | } |
| 500 | 504 | else if ((m68k->mmu_tmp_sr & M68K_MMU_SR_WRITE_PROTECT) && !m68k->mmu_tmp_rw) |
| r14569 | r14570 | |
| 502 | 506 | if (++m68k->mmu_tmp_buserror_occurred == 1) |
| 503 | 507 | { |
| 504 | 508 | m68k->mmu_tmp_buserror_address = addr_in; |
| 509 | m68k->mmu_tmp_buserror_rw = m68k->mmu_tmp_rw; |
| 510 | m68k->mmu_tmp_buserror_fc = m68k->mmu_tmp_fc; |
| 505 | 511 | } |
| 506 | 512 | } |
| 507 | 513 | |
| r14569 | r14570 | |
| 561 | 567 | if (++m68k->mmu_tmp_buserror_occurred == 1) |
| 562 | 568 | { |
| 563 | 569 | m68k->mmu_tmp_buserror_address = addr_in; |
| 570 | m68k->mmu_tmp_buserror_rw = m68k->mmu_tmp_rw; |
| 571 | m68k->mmu_tmp_buserror_fc = m68k->mmu_tmp_fc; |
| 564 | 572 | } |
| 565 | 573 | } |
| 566 | 574 | |
| r14569 | r14570 | |
| 584 | 592 | if (++m68k->mmu_tmp_buserror_occurred == 1) |
| 585 | 593 | { |
| 586 | 594 | m68k->mmu_tmp_buserror_address = addr_in; |
| 595 | m68k->mmu_tmp_buserror_rw = m68k->mmu_tmp_rw; |
| 596 | m68k->mmu_tmp_buserror_fc = m68k->mmu_tmp_fc; |
| 587 | 597 | } |
| 588 | 598 | } |
| 589 | 599 | |
| r14569 | r14570 | |
| 611 | 621 | |
| 612 | 622 | // get the root entry |
| 613 | 623 | root_entry = m68k->program->read_dword(root_ptr); |
| 614 | | static UINT32 psrp = 0, purp=0; |
| 615 | | if(psrp != m68k->mmu_srp_aptr) { |
| 616 | | psrp = m68k->mmu_srp_aptr; |
| 617 | | // fprintf(stderr, "srp = %08x\n", psrp); |
| 618 | | } |
| 619 | | if(purp != m68k->mmu_urp_aptr) { |
| 620 | | purp = m68k->mmu_urp_aptr; |
| 621 | | // fprintf(stderr, "urp = %08x\n", purp); |
| 622 | | } |
| 623 | 624 | |
| 624 | 625 | // is UDT marked valid? |
| 625 | 626 | if (root_entry & 2) |
| r14569 | r14570 | |
| 627 | 628 | pointer_ptr = (root_entry & ~0x1ff) + (ptr_idx<<2); |
| 628 | 629 | pointer_entry = m68k->program->read_dword(pointer_ptr); |
| 629 | 630 | |
| 630 | | // fprintf(stderr, "pointer entry = %08x\n", pointer_entry); |
| 631 | // logerror("pointer entry = %08x\n", pointer_entry); |
| 631 | 632 | |
| 632 | 633 | // write protected by the root or pointer entries? |
| 633 | 634 | if ((((root_entry & 4) && !m68k->mmu_tmp_rw) || ((pointer_entry & 4) && !m68k->mmu_tmp_rw)) && !ptest) |
| r14569 | r14570 | |
| 635 | 636 | if (++m68k->mmu_tmp_buserror_occurred == 1) |
| 636 | 637 | { |
| 637 | 638 | m68k->mmu_tmp_buserror_address = addr_in; |
| 639 | m68k->mmu_tmp_buserror_rw = m68k->mmu_tmp_rw; |
| 640 | m68k->mmu_tmp_buserror_fc = m68k->mmu_tmp_fc; |
| 638 | 641 | } |
| 639 | 642 | |
| 640 | 643 | return addr_in; |
| r14569 | r14570 | |
| 643 | 646 | // is UDT valid on the pointer entry? |
| 644 | 647 | if (!(pointer_entry & 2) && !ptest) |
| 645 | 648 | { |
| 646 | | fprintf(stderr, "Invalid pointer entry! PC=%x, addr=%x\n", m68k->ppc, addr_in); |
| 649 | // fprintf(stderr, "Invalid pointer entry! PC=%x, addr=%x\n", m68k->ppc, addr_in); |
| 647 | 650 | if (++m68k->mmu_tmp_buserror_occurred == 1) |
| 648 | 651 | { |
| 649 | 652 | m68k->mmu_tmp_buserror_address = addr_in; |
| 653 | m68k->mmu_tmp_buserror_rw = m68k->mmu_tmp_rw; |
| 654 | m68k->mmu_tmp_buserror_fc = m68k->mmu_tmp_fc; |
| 650 | 655 | } |
| 651 | 656 | |
| 652 | 657 | return addr_in; |
| r14569 | r14570 | |
| 656 | 661 | } |
| 657 | 662 | else // throw an error |
| 658 | 663 | { |
| 659 | | fprintf(stderr, "Invalid root entry! PC=%x, addr=%x\n", m68k->ppc, addr_in); |
| 664 | // fprintf(stderr, "Invalid root entry! PC=%x, addr=%x\n", m68k->ppc, addr_in); |
| 665 | |
| 660 | 666 | if (!ptest) |
| 661 | 667 | { |
| 662 | 668 | if (++m68k->mmu_tmp_buserror_occurred == 1) |
| 663 | 669 | { |
| 664 | 670 | m68k->mmu_tmp_buserror_address = addr_in; |
| 671 | m68k->mmu_tmp_buserror_rw = m68k->mmu_tmp_rw; |
| 672 | m68k->mmu_tmp_buserror_fc = m68k->mmu_tmp_fc; |
| 665 | 673 | } |
| 666 | 674 | } |
| 667 | 675 | |
| r14569 | r14570 | |
| 675 | 683 | page = addr_in & 0x1fff; |
| 676 | 684 | pointer_entry &= ~0x7f; |
| 677 | 685 | |
| 678 | | // fprintf(stderr, "8k pages: index %x page %x\n", page_idx, page); |
| 686 | // logerror("8k pages: index %x page %x\n", page_idx, page); |
| 679 | 687 | } |
| 680 | 688 | else // 4k pages |
| 681 | 689 | { |
| r14569 | r14570 | |
| 683 | 691 | page = addr_in & 0xfff; |
| 684 | 692 | pointer_entry &= ~0xff; |
| 685 | 693 | |
| 686 | | // fprintf(stderr, "4k pages: index %x page %x\n", page_idx, page); |
| 694 | // logerror("4k pages: index %x page %x\n", page_idx, page); |
| 687 | 695 | } |
| 688 | 696 | |
| 689 | 697 | page_ptr = pointer_entry + (page_idx<<2); |
| 690 | 698 | page_entry = m68k->program->read_dword(page_ptr); |
| 691 | 699 | |
| 692 | | // fprintf(stderr, "page_entry = %08x\n", page_entry); |
| 700 | // logerror("page_entry = %08x\n", page_entry); |
| 693 | 701 | |
| 694 | 702 | // resolve indirect page pointers |
| 695 | 703 | while ((page_entry & 3) == 2) |
| r14569 | r14570 | |
| 703 | 711 | if (++m68k->mmu_tmp_buserror_occurred == 1) |
| 704 | 712 | { |
| 705 | 713 | m68k->mmu_tmp_buserror_address = addr_in; |
| 714 | m68k->mmu_tmp_buserror_rw = m68k->mmu_tmp_rw; |
| 715 | m68k->mmu_tmp_buserror_fc = m68k->mmu_tmp_fc; |
| 706 | 716 | } |
| 707 | 717 | |
| 708 | 718 | return addr_in; |
| r14569 | r14570 | |
| 711 | 721 | switch (page_entry & 3) |
| 712 | 722 | { |
| 713 | 723 | case 0: // invalid |
| 714 | | fprintf(stderr, "Invalid page entry! PC=%x, addr=%x\n", m68k->ppc, addr_in); |
| 724 | // fprintf(stderr, "Invalid page entry! PC=%x, addr=%x\n", m68k->ppc, addr_in); |
| 715 | 725 | if (!ptest) |
| 716 | 726 | { |
| 717 | 727 | if (++m68k->mmu_tmp_buserror_occurred == 1) |
| 718 | 728 | { |
| 719 | 729 | m68k->mmu_tmp_buserror_address = addr_in; |
| 730 | m68k->mmu_tmp_buserror_rw = m68k->mmu_tmp_rw; |
| 731 | m68k->mmu_tmp_buserror_fc = m68k->mmu_tmp_fc; |
| 720 | 732 | } |
| 721 | 733 | } |
| 722 | 734 | |