Previous 15994 Revisions Next

r9865 Saturday 1st January, 2011 at 01:42:56 UTC by R. Belmont
ARM7: Sync latest from MAME (should match 0.141 when that comes over)
[src/emu/cpu/arm7]arm7.c arm7.h arm7core.c arm7core.h arm7exec.c

src/emu/cpu/arm7/arm7core.c
r9864r9865
131131{
132132    if( COPRO_CTRL & COPRO_CTRL_MMU_EN )
133133    {
134        addr = arm7_tlb_translate( cpustate, addr, 0 );
134        addr = arm7_tlb_translate( cpustate, addr, ARM7_TLB_ABORT_D );
135135    }
136136
137137    addr &= ~3;
r9864r9865
146146{
147147    if( COPRO_CTRL & COPRO_CTRL_MMU_EN )
148148    {
149        addr = arm7_tlb_translate( cpustate, addr, 0 );
149        addr = arm7_tlb_translate( cpustate, addr, ARM7_TLB_ABORT_D );
150150    }
151151
152152    addr &= ~1;
r9864r9865
160160{
161161    if( COPRO_CTRL & COPRO_CTRL_MMU_EN )
162162    {
163        addr = arm7_tlb_translate( cpustate, addr, 0 );
163        addr = arm7_tlb_translate( cpustate, addr, ARM7_TLB_ABORT_D );
164164    }
165165
166166   if ( cpustate->endian == ENDIANNESS_BIG )
r9864r9865
175175
176176    if( COPRO_CTRL & COPRO_CTRL_MMU_EN )
177177    {
178        addr = arm7_tlb_translate( cpustate, addr, 0 );
178        addr = arm7_tlb_translate( cpustate, addr, ARM7_TLB_ABORT_D );
179179    }
180180
181181    if (addr & 3)
r9864r9865
203203
204204    if( COPRO_CTRL & COPRO_CTRL_MMU_EN )
205205    {
206        addr = arm7_tlb_translate( cpustate, addr, 0 );
206        addr = arm7_tlb_translate( cpustate, addr, ARM7_TLB_ABORT_D );
207207    }
208208
209209   if ( cpustate->endian == ENDIANNESS_BIG )
r9864r9865
223223{
224224    if( COPRO_CTRL & COPRO_CTRL_MMU_EN )
225225    {
226        addr = arm7_tlb_translate( cpustate, addr, 0 );
226        addr = arm7_tlb_translate( cpustate, addr, ARM7_TLB_ABORT_D );
227227    }
228228
229229    // Handle through normal 8 bit handler (for 32 bit cpu)
r9864r9865
474474                if (s) /* Pull full contents from stack */
475475                    SET_REGISTER(cpustate, 15, data);
476476                else /* Pull only address, preserve mode & status flags */
477                    SET_REGISTER(cpustate, 15, data);
477                   if (MODE32)
478                       SET_REGISTER(cpustate, 15, data);
479                    else
480                    {
481                       SET_REGISTER(cpustate, 15, (GET_REGISTER(cpustate, 15) & ~0x03FFFFFC) | (data & 0x03FFFFFC));
482                    }
478483            } else
479484                SET_REGISTER(cpustate, i, data);
480485
r9864r9865
501506                if (s) /* Pull full contents from stack */
502507                    SET_REGISTER(cpustate, 15, data);
503508                else /* Pull only address, preserve mode & status flags */
504                    SET_REGISTER(cpustate, 15, data);
509                   if (MODE32)
510                       SET_REGISTER(cpustate, 15, data);
511                    else
512                    {
513                       SET_REGISTER(cpustate, 15, (GET_REGISTER(cpustate, 15) & ~0x03FFFFFC) | (data & 0x03FFFFFC));
514                    }
505515            }
506516            else
507517                SET_REGISTER(cpustate, i, data);
r9864r9865
556566 ***************************************************************************/
557567
558568// CPU INIT
559static void arm7_core_init(running_device *device, const char *cpuname)
569static void arm7_core_init(device_t *device, const char *cpuname)
560570{
561571    arm_state *cpustate = get_safe_token(device);
562572
r9864r9865
584594   cpustate->direct = &cpustate->program->direct();
585595
586596    /* start up in SVC mode with interrupts disabled. */
597    ARM7REG(eCPSR) = I_MASK | F_MASK | 0x10;
587598    SwitchMode(cpustate, eARM7_MODE_SVC);
588    SET_CPSR(GET_CPSR | I_MASK | F_MASK | 0x10);
589599    R15 = 0;
590600}
591601
r9864r9865
611621
612622    // Data Abort
613623    if (cpustate->pendingAbtD) {
624       if (MODE26) fatalerror( "pendingAbtD (todo)");
614625        SwitchMode(cpustate, eARM7_MODE_ABT);             /* Set ABT mode so PC is saved to correct R14 bank */
615626        SET_REGISTER(cpustate, 14, pc - 8 + 8);                   /* save PC to R14 */
616627        SET_REGISTER(cpustate, SPSR, cpsr);               /* Save current CPSR */
r9864r9865
624635
625636    // FIQ
626637    if (cpustate->pendingFiq && (cpsr & F_MASK) == 0) {
638       if (MODE26) fatalerror( "pendingFiq (todo)");
627639        SwitchMode(cpustate, eARM7_MODE_FIQ);             /* Set FIQ mode so PC is saved to correct R14 bank */
628640        SET_REGISTER(cpustate, 14, pc - 4 + 4);                   /* save PC to R14 */
629641        SET_REGISTER(cpustate, SPSR, cpsr);               /* Save current CPSR */
r9864r9865
637649    // IRQ
638650    if (cpustate->pendingIrq && (cpsr & I_MASK) == 0) {
639651        SwitchMode(cpustate, eARM7_MODE_IRQ);             /* Set IRQ mode so PC is saved to correct R14 bank */
640        SET_REGISTER(cpustate, 14, pc - 4 + 4);                   /* save PC to R14 */
641        SET_REGISTER(cpustate, SPSR, cpsr);               /* Save current CPSR */
642        SET_CPSR(GET_CPSR | I_MASK);            /* Mask IRQ */
643        SET_CPSR(GET_CPSR & ~T_MASK);
644        R15 = 0x18;                             /* IRQ Vector address */
652          SET_REGISTER(cpustate, 14, pc - 4 + 4);                   /* save PC to R14 */
653        if (MODE32)
654        {
655           SET_REGISTER(cpustate, SPSR, cpsr);               /* Save current CPSR */
656           SET_CPSR(GET_CPSR | I_MASK);            /* Mask IRQ */
657           SET_CPSR(GET_CPSR & ~T_MASK);
658           R15 = 0x18;                             /* IRQ Vector address */
659        }
660        else
661        {
662           UINT32 temp;
663           R15 = (pc & 0xF4000000) /* N Z C V F */ | 0x18 | 0x00000002 /* IRQ */ | 0x08000000 /* I */;
664           temp = (GET_CPSR & 0x0FFFFF3F) /* N Z C V I F */ | (R15 & 0xF0000000) /* N Z C V */ | ((R15 & 0x0C000000) >> (26 - 6)) /* I F */;
665           SET_CPSR(temp);            /* Mask IRQ */
666        }
645667        if ((COPRO_CTRL & COPRO_CTRL_MMU_EN) && (COPRO_CTRL & COPRO_CTRL_INTVEC_ADJUST)) R15 |= 0xFFFF0000;
646668        return;
647669    }
648670
649671    // Prefetch Abort
650672    if (cpustate->pendingAbtP) {
673       if (MODE26) fatalerror( "pendingAbtP (todo)");
651674        SwitchMode(cpustate, eARM7_MODE_ABT);             /* Set ABT mode so PC is saved to correct R14 bank */
652675        SET_REGISTER(cpustate, 14, pc - 4 + 4);                   /* save PC to R14 */
653676        SET_REGISTER(cpustate, SPSR, cpsr);               /* Save current CPSR */
r9864r9865
661684
662685    // Undefined instruction
663686    if (cpustate->pendingUnd) {
687       if (MODE26) fatalerror( "pendingUnd (todo)");
664688        SwitchMode(cpustate, eARM7_MODE_UND);             /* Set UND mode so PC is saved to correct R14 bank */
689        // compensate for prefetch (should this also be done for normal IRQ?)
665690        if (T_IS_SET(GET_CPSR))
666691        {
667692                SET_REGISTER(cpustate, 14, pc - 4 + 2);         /* save PC to R14 */
r9864r9865
691716        {
692717                SET_REGISTER(cpustate, 14, pc - 4 + 4);           /* save PC to R14 */
693718        }
694        SET_REGISTER(cpustate, SPSR, cpsr);               /* Save current CPSR */
695        SET_CPSR(GET_CPSR | I_MASK);            /* Mask IRQ */
696        SET_CPSR(GET_CPSR & ~T_MASK);           /* Go to ARM mode */
697        R15 = 0x08;                             /* Jump to the SWI vector */
719        if (MODE32)
720        {
721           SET_REGISTER(cpustate, SPSR, cpsr);               /* Save current CPSR */
722           SET_CPSR(GET_CPSR | I_MASK);            /* Mask IRQ */
723           SET_CPSR(GET_CPSR & ~T_MASK);           /* Go to ARM mode */
724           R15 = 0x08;                             /* Jump to the SWI vector */
725        }
726        else
727        {
728           UINT32 temp;
729           R15 = (pc & 0xF4000000) /* N Z C V F */ | 0x08 | 0x00000003 /* SVC */ | 0x08000000 /* I */;
730           temp = (GET_CPSR & 0x0FFFFF3F) /* N Z C V I F */ | (R15 & 0xF0000000) /* N Z C V */ | ((R15 & 0x0C000000) >> (26 - 6)) /* I F */;
731           SET_CPSR(temp);            /* Mask IRQ */
732        }
698733        if ((COPRO_CTRL & COPRO_CTRL_MMU_EN) && (COPRO_CTRL & COPRO_CTRL_INTVEC_ADJUST)) R15 |= 0xFFFF0000;
734        if ((COPRO_CTRL & COPRO_CTRL_MMU_EN) && (COPRO_CTRL & COPRO_CTRL_INTVEC_ADJUST)) R15 |= 0xFFFF0000;
699735        cpustate->pendingSwi = 0;
700736        return;
701737    }
r9864r9865
846882    /* Sign-extend the 24-bit offset in our calculations */
847883    if (off & 0x2000000u)
848884    {
849        R15 -= ((~(off | 0xfc000000u)) + 1) - 8;
885       if (MODE32)
886           R15 -= ((~(off | 0xfc000000u)) + 1) - 8;
887        else
888           R15 = ((R15 - (((~(off | 0xfc000000u)) + 1) - 8)) & 0x03FFFFFC) | (R15 & ~0x03FFFFFC);
850889    }
851890    else
852891    {
853        R15 += off + 8;
892       if (MODE32)
893           R15 += off + 8;
894        else
895           R15 = ((R15 + (off + 8)) & 0x03FFFFFC) | (R15 & ~0x03FFFFFC);
854896    }
855897}
856898
r9864r9865
878920        /* Pre-indexed addressing */
879921        if (insn & INSN_SDT_U)
880922        {
881            rnv = (GET_REGISTER(cpustate, rn) + off);
923           if ((MODE32) || (rn != eR15))
924               rnv = (GET_REGISTER(cpustate, rn) + off);
925            else
926               rnv = (GET_PC + off);
882927        }
883928        else
884929        {
885            rnv = (GET_REGISTER(cpustate, rn) - off);
930           if ((MODE32) || (rn != eR15))
931               rnv = (GET_REGISTER(cpustate, rn) - off);
932         else
933               rnv = (GET_PC - off);
886934        }
887935
888936        if (insn & INSN_SDT_W)
r9864r9865
902950        /* Post-indexed addressing */
903951        if (rn == eR15)
904952        {
905            rnv = R15 + 8;
953           if (MODE32)
954               rnv = R15 + 8;
955           else
956               rnv = GET_PC + 8;
906957        }
907958        else
908959        {
r9864r9865
930981            {
931982                if (rd == eR15)
932983                {
933                    R15 = data - 4;
934                    // LDR, PC takes 2S + 2N + 1I (5 total cycles)
984                   if (MODE32)
985                     R15 = data - 4;
986                 else
987                    R15 = (R15 & ~0x03FFFFFC) /* N Z C V I F M1 M0 */ | ((data - 4) & 0x03FFFFFC);
988               // LDR, PC takes 2S + 2N + 1I (5 total cycles)
935989                    ARM7_ICOUNT -= 2;
936990                }
937991                else
r9864r9865
11711225           // WRITE16(rnv, rd == eR15 ? R15 + 8 : GET_REGISTER(cpustate, rd));
11721226           WRITE16(rnv, rd == eR15 ? R15 + 8 + 4 : GET_REGISTER(cpustate, rd)); // manual says STR RD=PC, +12 of address
11731227
1174         // if R15 is not increased then e.g. "STRH R10, [R15,#$10]" will be executed over and over again             
1175         //if (rn != eR15)
1176           R15 += 4;
1228// if R15 is not increased then e.g. "STRH R10, [R15,#$10]" will be executed over and over again
1229#if 0
1230           if (rn != eR15)
1231#endif
1232               R15 += 4;
11771233
11781234           // STRH takes 2 cycles, so we add + 1
11791235           ARM7_ICOUNT += 1;
r9864r9865
13401396            }
13411397        }
13421398
1399#if 0
13431400        // force valid mode
13441401        newval |= 0x10;
1402#endif
13451403
13461404        // Update the Register
1347        SET_REGISTER(cpustate, reg, newval);
1405        if (reg == eCPSR)
1406           SET_CPSR(newval);
1407        else
1408           SET_REGISTER(cpustate, reg, newval);
13481409
13491410        // Switch to new mode if changed
13501411        if ((newval & MODE_FLAG) != oldmode)
r9864r9865
14061467#if ARM7_DEBUG_CORE
14071468            LOG(("%08x:  Pipelined R15 (Shift %d)\n", R15, (insn & INSN_I ? 8 : insn & 0x10u ? 12 : 12)));
14081469#endif
1409            rn = R15 + 8;
1470         if (MODE32)
1471               rn = R15 + 8;
1472            else
1473               rn = GET_PC + 8;
14101474        }
14111475        else
14121476        {
r9864r9865
14821546        // If Rd = R15, but S Flag not set, Result is placed in R15, but CPSR is not affected (page 44)
14831547        if (rdn == eR15 && !(insn & INSN_S))
14841548        {
1485            R15 = rd;
1549         if (MODE32)
1550         {
1551               R15 = rd;
1552           }
1553           else
1554           {
1555               R15 = (R15 & ~0x03FFFFFC) | (rd & 0x03FFFFFC);
1556           }
14861557        }
14871558        else
14881559        {
14891560            // Rd = 15 and S Flag IS set, Result is placed in R15, and current mode SPSR moved to CPSR
1490            if (rdn == eR15)
1491         {
1492               // When Rd is R15 and the S flag is set the result of the operation is placed in R15 and the SPSR corresponding to
1493               // the current mode is moved to the CPSR. This allows state changes which automatically restore both PC and
1494               // CPSR. --> This form of instruction should not be used in User mode. <--
1561            if (rdn == eR15) {
1562
1563            if (MODE32)
1564            {
1565            // When Rd is R15 and the S flag is set the result of the operation is placed in R15 and the SPSR corresponding to
1566            // the current mode is moved to the CPSR. This allows state changes which automatically restore both PC and
1567            // CPSR. --> This form of instruction should not be used in User mode. <--
1568
14951569            if (GET_MODE != eARM7_MODE_USER)
14961570            {
1497                  // Update CPSR from SPSR
1498                  SET_CPSR(GET_REGISTER(cpustate, SPSR));
1499                  SwitchMode(cpustate, GET_MODE);
1500            }
1571                   // Update CPSR from SPSR
1572                   SET_CPSR(GET_REGISTER(cpustate, SPSR));
1573                   SwitchMode(cpustate, GET_MODE);
1574               }
1575
15011576                R15 = rd;
15021577
1578                }
1579                else
1580                {
1581                  UINT32 temp;
1582               R15 = rd; //(R15 & 0x03FFFFFC) | (rd & 0xFC000003);
1583               temp = (GET_CPSR & 0x0FFFFF20) | (rd & 0xF0000000) /* N Z C V */ | ((rd & 0x0C000000) >> (26 - 6)) /* I F */ | (rd & 0x00000003) /* M1 M0 */;
1584               SET_CPSR( temp);
1585               SwitchMode( cpustate, temp & 3);
1586                }
1587
15031588                /* IRQ masks may have changed in this instruction */
15041589//              ARM7_CHECKIRQ;
15051590            }
r9864r9865
15161601#if ARM7_DEBUG_CORE
15171602                LOG(("%08x: TST class on R15 s bit set\n", R15));
15181603#endif
1519            R15 = rd;
1604         if (MODE32)
1605               R15 = rd;
1606            else
1607            {
1608               UINT32 temp;
1609            R15 = (R15 & 0x03FFFFFC) | (rd & ~0x03FFFFFC);
1610            temp = (GET_CPSR & 0x0FFFFF20) | (rd & 0xF0000000) /* N Z C V */ | ((rd & 0x0C000000) >> (26 - 6)) /* I F */ | (rd & 0x00000003) /* M1 M0 */;
1611            SET_CPSR( temp);
1612            SwitchMode( cpustate, temp & 3);
1613         }
15201614
15211615            /* IRQ masks may have changed in this instruction */
15221616//          ARM7_CHECKIRQ;
r9864r9865
16881782                // S - Flag Set? Signals transfer of current mode SPSR->CPSR
16891783                if (insn & INSN_BDT_S)
16901784            {
1691                    SET_CPSR(GET_REGISTER(cpustate, SPSR));
1692                    SwitchMode(cpustate, GET_MODE);
1785                   if (MODE32)
1786                   {
1787                       SET_CPSR(GET_REGISTER(cpustate, SPSR));
1788                       SwitchMode(cpustate, GET_MODE);
1789                    }
1790                    else
1791                    {
1792                       UINT32 temp;
1793//                       LOG(("LDM + S | R15 %08X CPSR %08X\n", R15, GET_CPSR));
1794                  temp = (GET_CPSR & 0x0FFFFF20) | (R15 & 0xF0000000) /* N Z C V */ | ((R15 & 0x0C000000) >> (26 - 6)) /* I F */ | (R15 & 0x00000003) /* M1 M0 */;
1795                  SET_CPSR( temp);
1796                  SwitchMode(cpustate, temp & 3);
1797                    }
16931798                }
1694
1695            // LDM PC - takes 1 extra cycle
1696            ARM7_ICOUNT -= 1;
1799               // LDM PC - takes 1 extra cycle
1800               ARM7_ICOUNT -= 1;
16971801            }
16981802        }
16991803        else
r9864r9865
17311835                // S - Flag Set? Signals transfer of current mode SPSR->CPSR
17321836                if (insn & INSN_BDT_S)
17331837            {
1734                    SET_CPSR(GET_REGISTER(cpustate, SPSR));
1735                    SwitchMode(cpustate, GET_MODE);
1838                   if (MODE32)
1839                   {
1840                       SET_CPSR(GET_REGISTER(cpustate, SPSR));
1841                       SwitchMode(cpustate, GET_MODE);
1842                    }
1843                    else
1844                    {
1845                       UINT32 temp;
1846//                       LOG(("LDM + S | R15 %08X CPSR %08X\n", R15, GET_CPSR));
1847                  temp = (GET_CPSR & 0x0FFFFF20) /* N Z C V I F M4 M3 M2 M1 M0 */ | (R15 & 0xF0000000) /* N Z C V */ | ((R15 & 0x0C000000) >> (26 - 6)) /* I F */ | (R15 & 0x00000003) /* M1 M0 */;
1848                  SET_CPSR( temp);
1849                  SwitchMode(cpustate, temp & 3);
1850                    }
17361851                }
17371852                // LDM PC - takes 1 extra cycle
17381853                ARM7_ICOUNT -= 1;
src/emu/cpu/arm7/arm7core.h
r9864r9865
3333#ifndef __ARM7CORE_H__
3434#define __ARM7CORE_H__
3535
36#define ARM7_MMU_ENABLE_HACK 0
3637
3738/****************************************************************************************************
3839 *  INTERRUPT LINES/EXCEPTIONS
r9864r9865
188189   UINT8 archRev;         // ARM architecture revision (3, 4, and 5 are valid)
189190   UINT8 archFlags;      // architecture flags
190191
192#if ARM7_MMU_ENABLE_HACK
193   UINT32 mmu_enable_addr;   // workaround for "MMU is enabled when PA != VA" problem
194#endif
191195} arm_state;
192196
193197/****************************************************************************************************
r9864r9865
485489#define R15                     ARM7REG(eR15)
486490#define SPSR                    17                     // SPSR is always the 18th register in our 0 based array sRegisterTable[][18]
487491#define GET_CPSR                ARM7REG(eCPSR)
488#define SET_CPSR(v)             (GET_CPSR = (v))
492#define SET_CPSR(v)             set_cpsr(cpustate,v)
489493#define MODE_FLAG               0xF                    // Mode bits are 4:0 of CPSR, but we ignore bit 4.
490494#define GET_MODE                (GET_CPSR & MODE_FLAG)
491495#define SIGN_BIT                ((UINT32)(1 << 31))
r9864r9865
494498#define THUMB_SIGN_BIT               ((UINT32)(1 << 31))
495499#define THUMB_SIGN_BITS_DIFFER(a, b) (((a)^(b)) >> 31)
496500
501#define MODE32               (GET_CPSR & 0x10)
502#define MODE26               (!(GET_CPSR & 0x10))
503#define GET_PC                  (MODE32 ? R15 : R15 & 0x03FFFFFC)
504
505enum
506{
507   ARM7_TLB_NO_ABORT,
508   ARM7_TLB_ABORT_D,
509   ARM7_TLB_ABORT_P
510};
511
497512/* At one point I thought these needed to be cpu implementation specific, but they don't.. */
498513#define GET_REGISTER(state, reg)       GetRegister(state, reg)
499514#define SET_REGISTER(state, reg, val)  SetRegister(state, reg, val)
src/emu/cpu/arm7/arm7.c
r9864r9865
6868#define ARM7REG(reg)        cpustate->sArmRegister[reg]
6969#define ARM7_ICOUNT         cpustate->iCount
7070
71INLINE arm_state *get_safe_token(running_device *device)
71INLINE arm_state *get_safe_token(device_t *device)
7272{
7373   assert(device != NULL);
74   assert(device->type() == ARM7 || device->type() == ARM7_BE || device->type() == ARM9 || device->type() == ARM920T || device->type() == PXA255);
74   assert(device->type() == ARM7 || device->type() == ARM7_BE || device->type() == ARM7500 || device->type() == ARM9 || device->type() == ARM920T || device->type() == PXA255);
7575   return (arm_state *)downcast<legacy_cpu_device *>(device)->token();
7676}
7777
78void set_cpsr( arm_state *cpustate, UINT32 val)
79{
80   if ((val & 0x10) != (ARM7REG(eCPSR) & 0x10))
81   {
82      if (val & 0x10)
83      {
84         // 26 -> 32
85         val = (val & 0x0FFFFF3F) | (R15 & 0xF0000000) /* N Z C V */ | ((R15 & 0x0C000000) >> (26 - 6)) /* I F */;
86         R15 = R15 & 0x03FFFFFC;
87      }
88      else
89      {
90         // 32 -> 26
91         R15 = (R15 & 0x03FFFFFC) /* PC */ | (val & 0xF0000000) /* N Z C V */ | ((val & 0x000000C0) << (26 - 6)) /* I F */ | (val & 0x00000003) /* M1 M0 */;
92      }
93   }
94   else
95   {
96      if (!(val & 0x10))
97      {
98         // mirror bits in pc
99         R15 = (R15 & 0x03FFFFFF) | (val & 0xF0000000) /* N Z C V */ | ((val & 0x000000C0) << (26 - 6)) /* I F */;
100      }
101   }
102   ARM7REG(eCPSR) = val;
103}
104
78105INLINE INT64 saturate_qbit_overflow(arm_state *cpustate, INT64 res)
79106{
80107   if (res > 2147483647)   // INT32_MAX
r9864r9865
128155    return cpustate->program->read_dword( desc_lvl2 );
129156}
130157
131static UINT32 r15_mmu_enable_addr = 1;
132
133158INLINE UINT32 arm7_tlb_translate(arm_state *cpustate, UINT32 vaddr, int mode)
134159{
135160    UINT32 desc_lvl1;
r9864r9865
151176
152177    paddr = vaddr;
153178
154    if ((R15 == (r15_mmu_enable_addr + 4)) || (R15 == (r15_mmu_enable_addr + 8)))
179#if ARM7_MMU_ENABLE_HACK
180    if ((R15 == (cpustate->mmu_enable_addr + 4)) || (R15 == (cpustate->mmu_enable_addr + 8)))
155181    {
156182        LOG( ( "ARM7: fetch flat, PC = %08x, vaddr = %08x\n", R15, vaddr ) );
157183       return vaddr;
158184    }
159185    else
160186    {
161       r15_mmu_enable_addr = 1;
187       cpustate->mmu_enable_addr = 1;
162188    }
189#endif
163190
164191   domain = (desc_lvl1 >> 5) & 0xF;
165192   permission = (COPRO_DOMAIN_ACCESS_CONTROL >> (domain << 1)) & 3;
r9864r9865
168195    {
169196        case COPRO_TLB_UNMAPPED:
170197            // Unmapped, generate a translation fault
171            if (mode == 0)
198            if (mode == ARM7_TLB_ABORT_D)
172199            {
173200               LOG( ( "ARM7: Not Yet Implemented: Translation fault on unmapped virtual address, PC = %08x, vaddr = %08x\n", R15, vaddr ) );
174201               COPRO_FAULT_STATUS = (5 << 0);
175202               COPRO_FAULT_ADDRESS = vaddr;
176203               cpustate->pendingAbtD = 1;
177204            }
178            else if (mode == 1)
205            else if (mode == ARM7_TLB_ABORT_P)
179206            {
180207               LOG( ( "ARM7: Not Yet Implemented: Translation fault on unmapped virtual address, PC = %08x, vaddr = %08x\n", R15, vaddr ) );
181208               cpustate->pendingAbtP = 1;
r9864r9865
201228            }
202229            else
203230            {
204                if (mode == 0)
231                if (mode == ARM7_TLB_ABORT_D)
205232                {
206233                    LOG( ( "domain %d permission = %d\n", domain, permission ) );
207234                   LOG( ( "ARM7: Section Table, Section Domain fault on virtual address, vaddr = %08x, domain = %08x, PC = %08x\n", vaddr, domain, R15 ) );
r9864r9865
209236                   COPRO_FAULT_ADDRESS = vaddr;
210237                   cpustate->pendingAbtD = 1;
211238               }
212               else if (mode == 1)
239               else if (mode == ARM7_TLB_ABORT_P)
213240               {
214241                    LOG( ( "domain %d permission = %d\n", domain, permission ) );
215242                   LOG( ( "ARM7: Section Table, Section Domain fault on virtual address, vaddr = %08x, domain = %08x, PC = %08x\n", vaddr, domain, R15 ) );
r9864r9865
232259        {
233260            case COPRO_TLB_UNMAPPED:
234261                // Unmapped, generate a translation fault
235                if (mode == 0)
262                if (mode == ARM7_TLB_ABORT_D)
236263                {
237264                   LOG( ( "ARM7: Not Yet Implemented: Translation fault on unmapped virtual address, vaddr = %08x, PC %08X\n", vaddr, R15 ) );
238265                   COPRO_FAULT_STATUS = (7 << 0);
239266                   COPRO_FAULT_ADDRESS = vaddr;
240267                  cpustate->pendingAbtD = 1;
241268               }
242               else if (mode == 1)
269               else if (mode == ARM7_TLB_ABORT_P)
243270               {
244271                   LOG( ( "ARM7: Not Yet Implemented: Translation fault on unmapped virtual address, vaddr = %08x, PC %08X\n", vaddr, R15 ) );
245272                  cpustate->pendingAbtP = 1;
r9864r9865
274301   /* only applies to the program address space and only does something if the MMU's enabled */
275302   if( space == ADDRESS_SPACE_PROGRAM && ( COPRO_CTRL & COPRO_CTRL_MMU_EN ) )
276303   {
277      *address = arm7_tlb_translate(cpustate, *address, 2);
304      *address = arm7_tlb_translate(cpustate, *address, ARM7_TLB_NO_ABORT);
278305   }
279306   return TRUE;
280307}
r9864r9865
325352   cpustate->endian = ENDIANNESS_BIG;
326353}
327354
355static CPU_RESET( arm7500 )
356{
357   arm_state *cpustate = get_safe_token(device);
358
359   // must call core reset
360   arm7_core_reset(device);
361
362   cpustate->archRev = 3;   // ARMv3
363   cpustate->archFlags = 0;
364}
365
328366static CPU_RESET( arm9 )
329367{
330368   arm_state *cpustate = get_safe_token(device);
r9864r9865
551589
552590        case CPUINFO_INT_PREVIOUSPC:            info->i = 0;    /* not implemented */           break;
553591        case CPUINFO_INT_PC:
554        case CPUINFO_INT_REGISTER + ARM7_PC:    info->i = R15;                                  break;
592        case CPUINFO_INT_REGISTER + ARM7_PC:    info->i = GET_PC;                                  break;
555593        case CPUINFO_INT_SP:                    info->i = GetRegister(cpustate, 13);            break;
556594
557595        /* FIRQ Mode Shadowed Registers */
r9864r9865
616654        break;
617655
618656        /* registers shared by all operating modes */
619        case CPUINFO_STR_REGISTER + ARM7_PC:    sprintf(info->s, "PC  :%08x", R15);            break;
657        case CPUINFO_STR_REGISTER + ARM7_PC:    sprintf(info->s, "PC  :%08x", GET_PC);            break;
620658        case CPUINFO_STR_REGISTER + ARM7_R0:    sprintf(info->s, "R0  :%08x", ARM7REG( 0));    break;
621659        case CPUINFO_STR_REGISTER + ARM7_R1:    sprintf(info->s, "R1  :%08x", ARM7REG( 1));    break;
622660        case CPUINFO_STR_REGISTER + ARM7_R2:    sprintf(info->s, "R2  :%08x", ARM7REG( 2));    break;
r9864r9865
679717   }
680718}
681719
720CPU_GET_INFO( arm7500 )
721{
722    switch (state)
723    {
724        case CPUINFO_FCT_RESET:      info->reset = CPU_RESET_NAME(arm7500);      break;
725        case DEVINFO_STR_NAME:      strcpy(info->s, "ARM7500");            break;
726      default:               CPU_GET_INFO_CALL(arm7);
727      break;
728    }
729}
730
682731CPU_GET_INFO( arm9 )
683732{
684733    switch (state)
r9864r9865
808857            {
809858               data = 0x41 | (1 << 23) | (7 << 12);
810859               //data = (0x41 << 24) | (1 << 20) | (2 << 16) | (0x920 << 4) | (0 << 0); // ARM920T (S3C24xx)
860               //data = (0x41 << 24) | (0 << 20) | (1 << 16) | (0x710 << 4) | (0 << 0); // ARM7500
811861            }
812862            break;
813863
r9864r9865
935985                   ( data & COPRO_CTRL_ROM ) >> COPRO_CTRL_ROM_SHIFT,
936986                   ( data & COPRO_CTRL_ICACHE_EN ) >> COPRO_CTRL_ICACHE_EN_SHIFT ) );
937987            LOG( ( "    Int Vector Adjust:%d\n", ( data & COPRO_CTRL_INTVEC_ADJUST ) >> COPRO_CTRL_INTVEC_ADJUST_SHIFT ) );
988#if ARM7_MMU_ENABLE_HACK
938989            if (((data & COPRO_CTRL_MMU_EN) != 0) && ((COPRO_CTRL & COPRO_CTRL_MMU_EN) == 0))
939990            {
940               r15_mmu_enable_addr = R15;
991               cpustate->mmu_enable_addr = R15;
941992            }
942993            if (((data & COPRO_CTRL_MMU_EN) == 0) && ((COPRO_CTRL & COPRO_CTRL_MMU_EN) != 0))
943994            {
944               R15 = arm7_tlb_translate( cpustate, R15, 0);
995               R15 = arm7_tlb_translate( cpustate, R15, ARM7_TLB_NO_ABORT);
945996            }
997#endif
946998            COPRO_CTRL = data & COPRO_CTRL_MASK;
947999            break;
9481000        case 2:             // Translation Table Base
r9864r9865
9951047
9961048DEFINE_LEGACY_CPU_DEVICE(ARM7, arm7);
9971049DEFINE_LEGACY_CPU_DEVICE(ARM7_BE, arm7_be);
1050DEFINE_LEGACY_CPU_DEVICE(ARM7500, arm7500);
9981051DEFINE_LEGACY_CPU_DEVICE(ARM9, arm9);
9991052DEFINE_LEGACY_CPU_DEVICE(ARM920T, arm920t);
10001053DEFINE_LEGACY_CPU_DEVICE(PXA255, pxa255);
src/emu/cpu/arm7/arm7.h
r9864r9865
4040
4141DECLARE_LEGACY_CPU_DEVICE(ARM7, arm7);
4242DECLARE_LEGACY_CPU_DEVICE(ARM7_BE, arm7_be);
43DECLARE_LEGACY_CPU_DEVICE(ARM7500, arm7500);
4344DECLARE_LEGACY_CPU_DEVICE(ARM9, arm9);
4445DECLARE_LEGACY_CPU_DEVICE(ARM920T, arm920t);
4546DECLARE_LEGACY_CPU_DEVICE(PXA255, pxa255);
src/emu/cpu/arm7/arm7exec.c
r9864r9865
4747
4848    do
4949    {
50        debugger_instruction_hook(cpustate->device, R15);
50        debugger_instruction_hook(cpustate->device, GET_PC);
5151
5252        /* handle Thumb instructions if active */
5353        if (T_IS_SET(GET_CPSR))
r9864r9865
6060       raddr = pc & (~1);
6161       if ( COPRO_CTRL & COPRO_CTRL_MMU_EN )
6262       {
63          raddr = arm7_tlb_translate(cpustate, raddr, 1);
63          raddr = arm7_tlb_translate(cpustate, raddr, ARM7_TLB_ABORT_P);
6464          if (cpustate->pendingAbtP != 0)
6565          {
6666             goto skip_exec;
r9864r9865
11711171        {
11721172
11731173            /* load 32 bit instruction */
1174            pc = R15;
1174            pc = GET_PC;
11751175       if ( COPRO_CTRL & COPRO_CTRL_MMU_EN )
11761176       {
1177          pc = arm7_tlb_translate(cpustate, pc, 1);
1177          pc = arm7_tlb_translate(cpustate, pc, ARM7_TLB_ABORT_P);
11781178          if (cpustate->pendingAbtP != 0)
11791179          {
11801180             goto skip_exec;
11811181          }
11821182       }
1183
1184#if 0
1185         if (MODE26)
1186         {
1187            UINT32 temp1, temp2;
1188            temp1 = GET_CPSR & 0xF00000C3;
1189            temp2 = (R15 & 0xF0000000) | ((R15 & 0x0C000000) >> (26 - 6)) | (R15 & 0x00000003);
1190            if (temp1 != temp2) fatalerror( "%08X: 32-bit and 26-bit modes are out of sync (%08X %08X)", pc, temp1, temp2);
1191         }
1192#endif
1193
11831194            insn = cpustate->direct->read_decrypted_dword(pc);
11841195
11851196            /* process condition codes for this instruction */

Previous 15994 Revisions Next


© 1998-2018 The MESS Team