Previous 15994 Revisions Next

r14570 Wednesday 22nd February, 2012 at 07:40:21 UTC by Olivier Galibert
680x0: Ensure fc/rw and fault address are consistant [O. Galibert]
[src/emu/cpu/m68000]m68kcpu.h m68kmmu.h

src/emu/cpu/m68000/m68kcpu.h
r14569r14570
707707   UINT16 mmu_tmp_rw;      /* temporary hack: read/write (1/0) for the mmu */
708708   UINT32 mmu_tmp_buserror_address;   /* temporary hack: (first) bus error address */
709709   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 */
710712
711713   UINT32 ic_address[M68K_IC_SIZE];   /* instruction cache address data */
712714   UINT16 ic_data[M68K_IC_SIZE];      /* instruction cache content data */
r14569r14570
15711573 */
15721574void m68ki_stack_frame_1010(m68ki_cpu_core *m68k, UINT32 sr, UINT32 vector, UINT32 pc, UINT32 fault_address)
15731575{
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;
15761578
15771579   /* INTERNAL REGISTER */
15781580   m68ki_push_16(m68k, 0);
r14569r14570
16231625 */
16241626void m68ki_stack_frame_1011(m68ki_cpu_core *m68k, UINT32 sr, UINT32 vector, UINT32 pc, UINT32 fault_address)
16251627{
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;
16281630
16291631   /* INTERNAL REGISTERS (18 words) */
16301632   m68ki_push_32(m68k, 0);
r14569r14570
16971699 */
16981700void m68ki_stack_frame_0111(m68ki_cpu_core *m68k, UINT32 sr, UINT32 vector, UINT32 pc, UINT32 fault_address, bool in_mmu)
16991701{
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;
17021704
17031705   /* INTERNAL REGISTERS (18 words) */
17041706   m68ki_push_32(m68k, 0);
src/emu/cpu/m68000/m68kmmu.h
r14569r14570
488488         if (++m68k->mmu_tmp_buserror_occurred == 1)
489489         {
490490            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;
491493         }
492494      }
493495      else if (m68k->mmu_tmp_sr & M68K_MMU_SR_SUPERVISOR_ONLY)
r14569r14570
495497         if (++m68k->mmu_tmp_buserror_occurred == 1)
496498         {
497499            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;
498502         }
499503      }
500504      else if ((m68k->mmu_tmp_sr & M68K_MMU_SR_WRITE_PROTECT) && !m68k->mmu_tmp_rw)
r14569r14570
502506         if (++m68k->mmu_tmp_buserror_occurred == 1)
503507         {
504508            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;
505511         }
506512      }
507513
r14569r14570
561567            if (++m68k->mmu_tmp_buserror_occurred == 1)
562568            {
563569               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;
564572            }
565573         }
566574
r14569r14570
584592            if (++m68k->mmu_tmp_buserror_occurred == 1)
585593            {
586594               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;
587597            }
588598         }
589599
r14569r14570
611621
612622      // get the root entry
613623      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      }
623624
624625      // is UDT marked valid?
625626      if (root_entry & 2)
r14569r14570
627628         pointer_ptr = (root_entry & ~0x1ff) + (ptr_idx<<2);
628629         pointer_entry = m68k->program->read_dword(pointer_ptr);
629630
630         //          fprintf(stderr, "pointer entry = %08x\n", pointer_entry);
631         //          logerror("pointer entry = %08x\n", pointer_entry);
631632
632633         // write protected by the root or pointer entries?
633634         if ((((root_entry & 4) && !m68k->mmu_tmp_rw) || ((pointer_entry & 4) && !m68k->mmu_tmp_rw)) && !ptest)
r14569r14570
635636            if (++m68k->mmu_tmp_buserror_occurred == 1)
636637            {
637638               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;
638641            }
639642
640643            return addr_in;
r14569r14570
643646         // is UDT valid on the pointer entry?
644647         if (!(pointer_entry & 2) && !ptest)
645648         {
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);
647650            if (++m68k->mmu_tmp_buserror_occurred == 1)
648651            {
649652               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;
650655            }
651656
652657            return addr_in;
r14569r14570
656661      }
657662      else // throw an error
658663      {
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
660666         if (!ptest)
661667         {
662668            if (++m68k->mmu_tmp_buserror_occurred == 1)
663669            {
664670               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;
665673            }
666674         }
667675
r14569r14570
675683         page = addr_in & 0x1fff;
676684         pointer_entry &= ~0x7f;
677685
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);
679687      }
680688      else   // 4k pages
681689      {
r14569r14570
683691         page = addr_in & 0xfff;
684692         pointer_entry &= ~0xff;
685693
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);
687695      }
688696
689697      page_ptr = pointer_entry + (page_idx<<2);
690698      page_entry = m68k->program->read_dword(page_ptr);
691699
692      //      fprintf(stderr, "page_entry = %08x\n", page_entry);
700      //      logerror("page_entry = %08x\n", page_entry);
693701
694702      // resolve indirect page pointers
695703      while ((page_entry & 3) == 2)
r14569r14570
703711         if (++m68k->mmu_tmp_buserror_occurred == 1)
704712         {
705713            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;
706716         }
707717
708718         return addr_in;
r14569r14570
711721      switch (page_entry & 3)
712722      {
713723         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);
715725            if (!ptest)
716726            {
717727               if (++m68k->mmu_tmp_buserror_occurred == 1)
718728               {
719729                  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;
720732               }
721733            }
722734

Previous 15994 Revisions Next


© 1998-2018 The MESS Team