diff --git a/src/gba/GBA-arm.cpp b/src/gba/GBA-arm.cpp index a0c8033e..533cfd37 100644 --- a/src/gba/GBA-arm.cpp +++ b/src/gba/GBA-arm.cpp @@ -1533,7 +1533,7 @@ static INSN_REGPARM void arm121(u32 opcode) #define OP_LDR reg[dest].I = CPUReadMemory(address) #define OP_LDRH reg[dest].I = CPUReadHalfWord(address) #define OP_LDRB reg[dest].I = CPUReadByte(address) -#define OP_LDRSH reg[dest].I = (s16)CPUReadHalfWordSigned(address) +#define OP_LDRSH reg[dest].I = (u32)CPUReadHalfWordSigned(address) #define OP_LDRSB reg[dest].I = (s8)CPUReadByte(address) #define WRITEBACK_NONE /*nothing*/ @@ -2608,8 +2608,7 @@ static INSN_REGPARM void armA00(u32 opcode) reg[15].I += 4; ARM_PREFETCH; clockTicks = codeTicksAccessSeq32(armNextPC) + 1; - clockTicks += 2 + codeTicksAccess32(armNextPC) - + codeTicksAccessSeq32(armNextPC); + clockTicks = (clockTicks * 2) + codeTicksAccess32(armNextPC) + 1; busPrefetchCount = 0; } @@ -2625,8 +2624,7 @@ static INSN_REGPARM void armB00(u32 opcode) reg[15].I += 4; ARM_PREFETCH; clockTicks = codeTicksAccessSeq32(armNextPC) + 1; - clockTicks += 2 + codeTicksAccess32(armNextPC) - + codeTicksAccessSeq32(armNextPC); + clockTicks = (clockTicks * 2) + codeTicksAccess32(armNextPC) + 1; busPrefetchCount = 0; } @@ -2644,9 +2642,8 @@ static INSN_REGPARM void armE01(u32 opcode) // SWI static INSN_REGPARM void armF00(u32 opcode) { - clockTicks = codeTicksAccessSeq32(armNextPC) + 1; - clockTicks += 2 + codeTicksAccess32(armNextPC) - + codeTicksAccessSeq32(armNextPC); + clockTicks = codeTicksAccessSeq32(armNextPC) + 1; + clockTicks = (clockTicks * 2) + codeTicksAccess32(armNextPC) + 1; busPrefetchCount = 0; CPUSoftwareInterrupt(opcode & 0x00FFFFFF); } @@ -2700,7 +2697,7 @@ static insnfunc_t armInsnTable[4096] = { arm0E0,arm0E1,arm0E2,arm0E3,arm0E4,arm0E5,arm0E6,arm0E7, // 0E0 arm0E0,arm0E9,arm0E2,arm0CB,arm0E4,arm_UI,arm0E6,arm_UI, // 0E8 arm0F0,arm0F1,arm0F2,arm0F3,arm0F4,arm0F5,arm0F6,arm0F7, // 0F0 - arm0F0,arm0F9,arm0F2,arm_UI,arm0F4,arm0DD,arm0F6,arm0DF, // 0F8 + arm0F0,arm0F9,arm0F2,arm0DB,arm0F4,arm0DD,arm0F6,arm0DF, // 0F8 arm100,arm_UI,arm_UI,arm_UI,arm_UI,arm_UI,arm_UI,arm_UI, // 100 arm_UI,arm109,arm_UI,arm10B,arm_UI,arm_UI,arm_UI,arm_UI, // 108 diff --git a/src/gba/GBA-thumb.cpp b/src/gba/GBA-thumb.cpp index 400ebde6..4cec05c1 100644 --- a/src/gba/GBA-thumb.cpp +++ b/src/gba/GBA-thumb.cpp @@ -1421,12 +1421,14 @@ static INSN_REGPARM void thumb45_3(u32 opcode) static INSN_REGPARM void thumb46_0(u32 opcode) { reg[opcode&7].I = reg[((opcode>>3)&7)].I; + clockTicks = codeTicksAccessSeq16(armNextPC) + 1; } // MOV Rd, Hs static INSN_REGPARM void thumb46_1(u32 opcode) { reg[opcode&7].I = reg[((opcode>>3)&7)+8].I; + clockTicks = codeTicksAccessSeq16(armNextPC) + 1; } // MOV Hd, Rs @@ -1473,16 +1475,14 @@ static INSN_REGPARM void thumb47(u32 opcode) armNextPC = reg[15].I; reg[15].I += 2; THUMB_PREFETCH; - clockTicks = codeTicksAccessSeq16(armNextPC) - + codeTicksAccessSeq16(armNextPC) + codeTicksAccess16(armNextPC) + 3; + clockTicks = codeTicksAccessSeq16(armNextPC)*2 + codeTicksAccess16(armNextPC) + 3; } else { armState = true; reg[15].I &= 0xFFFFFFFC; armNextPC = reg[15].I; reg[15].I += 4; ARM_PREFETCH; - clockTicks = codeTicksAccessSeq32(armNextPC) - + codeTicksAccessSeq32(armNextPC) + codeTicksAccess32(armNextPC) + 3; + clockTicks = codeTicksAccessSeq32(armNextPC)*2 + codeTicksAccess32(armNextPC) + 3; } } @@ -1576,7 +1576,7 @@ static INSN_REGPARM void thumb5E(u32 opcode) if (busPrefetchCount == 0) busPrefetch = busPrefetchEnable; u32 address = reg[(opcode>>3)&7].I + reg[(opcode>>6)&7].I; - reg[opcode&7].I = (s16)CPUReadHalfWordSigned(address); + reg[opcode&7].I = (u32)CPUReadHalfWordSigned(address); clockTicks = 3 + dataTicksAccess16(address) + codeTicksAccess16(armNextPC); } @@ -1669,6 +1669,7 @@ static INSN_REGPARM void thumbA0(u32 opcode) { u8 regist = (opcode >> 8) & 7; reg[regist].I = (reg[15].I & 0xFFFFFFFC) + ((opcode&255)<<2); + clockTicks = 1 + codeTicksAccess16(armNextPC); } // ADD R0~R7, SP, Imm @@ -1676,6 +1677,7 @@ static INSN_REGPARM void thumbA8(u32 opcode) { u8 regist = (opcode >> 8) & 7; reg[regist].I = reg[13].I + ((opcode&255)<<2); + clockTicks = 1 + codeTicksAccess16(armNextPC); } // ADD SP, Imm @@ -1685,6 +1687,7 @@ static INSN_REGPARM void thumbB0(u32 opcode) if(opcode & 0x80) offset = -offset; reg[13].I += offset; + clockTicks = 1 + codeTicksAccess16(armNextPC); } // Push and pop /////////////////////////////////////////////////////////// @@ -1882,13 +1885,13 @@ static INSN_REGPARM void thumbC8(u32 opcode) static INSN_REGPARM void thumbD0(u32 opcode) { UPDATE_OLDREG; + clockTicks = codeTicksAccessSeq16(armNextPC) + 1; if(Z_FLAG) { reg[15].I += ((s8)(opcode & 0xFF)) << 1; armNextPC = reg[15].I; reg[15].I += 2; THUMB_PREFETCH; - clockTicks = codeTicksAccessSeq16(armNextPC) + codeTicksAccessSeq16(armNextPC) + - codeTicksAccess16(armNextPC)+3; + clockTicks += codeTicksAccessSeq16(armNextPC) + codeTicksAccess16(armNextPC) + 2; busPrefetchCount=0; } } @@ -1897,13 +1900,13 @@ static INSN_REGPARM void thumbD0(u32 opcode) static INSN_REGPARM void thumbD1(u32 opcode) { UPDATE_OLDREG; + clockTicks = codeTicksAccessSeq16(armNextPC) + 1; if(!Z_FLAG) { reg[15].I += ((s8)(opcode & 0xFF)) << 1; armNextPC = reg[15].I; reg[15].I += 2; THUMB_PREFETCH; - clockTicks = codeTicksAccessSeq16(armNextPC) + codeTicksAccessSeq16(armNextPC) + - codeTicksAccess16(armNextPC)+3; + clockTicks += codeTicksAccessSeq16(armNextPC) + codeTicksAccess16(armNextPC) + 2; busPrefetchCount=0; } } @@ -1912,13 +1915,13 @@ static INSN_REGPARM void thumbD1(u32 opcode) static INSN_REGPARM void thumbD2(u32 opcode) { UPDATE_OLDREG; + clockTicks = codeTicksAccessSeq16(armNextPC) + 1; if(C_FLAG) { reg[15].I += ((s8)(opcode & 0xFF)) << 1; armNextPC = reg[15].I; reg[15].I += 2; THUMB_PREFETCH; - clockTicks = codeTicksAccessSeq16(armNextPC) + codeTicksAccessSeq16(armNextPC) + - codeTicksAccess16(armNextPC)+3; + clockTicks += codeTicksAccessSeq16(armNextPC) + codeTicksAccess16(armNextPC) + 2; busPrefetchCount=0; } } @@ -1927,13 +1930,13 @@ static INSN_REGPARM void thumbD2(u32 opcode) static INSN_REGPARM void thumbD3(u32 opcode) { UPDATE_OLDREG; + clockTicks = codeTicksAccessSeq16(armNextPC) + 1; if(!C_FLAG) { reg[15].I += ((s8)(opcode & 0xFF)) << 1; armNextPC = reg[15].I; reg[15].I += 2; THUMB_PREFETCH; - clockTicks = codeTicksAccessSeq16(armNextPC) + codeTicksAccessSeq16(armNextPC) + - codeTicksAccess16(armNextPC)+3; + clockTicks += codeTicksAccessSeq16(armNextPC) + codeTicksAccess16(armNextPC) + 2; busPrefetchCount=0; } } @@ -1942,13 +1945,13 @@ static INSN_REGPARM void thumbD3(u32 opcode) static INSN_REGPARM void thumbD4(u32 opcode) { UPDATE_OLDREG; + clockTicks = codeTicksAccessSeq16(armNextPC) + 1; if(N_FLAG) { reg[15].I += ((s8)(opcode & 0xFF)) << 1; armNextPC = reg[15].I; reg[15].I += 2; THUMB_PREFETCH; - clockTicks = codeTicksAccessSeq16(armNextPC) + codeTicksAccessSeq16(armNextPC) + - codeTicksAccess16(armNextPC)+3; + clockTicks += codeTicksAccessSeq16(armNextPC) + codeTicksAccess16(armNextPC) + 2; busPrefetchCount=0; } } @@ -1957,13 +1960,13 @@ static INSN_REGPARM void thumbD4(u32 opcode) static INSN_REGPARM void thumbD5(u32 opcode) { UPDATE_OLDREG; + clockTicks = codeTicksAccessSeq16(armNextPC) + 1; if(!N_FLAG) { reg[15].I += ((s8)(opcode & 0xFF)) << 1; armNextPC = reg[15].I; reg[15].I += 2; THUMB_PREFETCH; - clockTicks = codeTicksAccessSeq16(armNextPC) + codeTicksAccessSeq16(armNextPC) + - codeTicksAccess16(armNextPC)+3; + clockTicks += codeTicksAccessSeq16(armNextPC) + codeTicksAccess16(armNextPC) + 2; busPrefetchCount=0; } } @@ -1972,13 +1975,13 @@ static INSN_REGPARM void thumbD5(u32 opcode) static INSN_REGPARM void thumbD6(u32 opcode) { UPDATE_OLDREG; + clockTicks = codeTicksAccessSeq16(armNextPC) + 1; if(V_FLAG) { reg[15].I += ((s8)(opcode & 0xFF)) << 1; armNextPC = reg[15].I; reg[15].I += 2; THUMB_PREFETCH; - clockTicks = codeTicksAccessSeq16(armNextPC) + codeTicksAccessSeq16(armNextPC) + - codeTicksAccess16(armNextPC)+3; + clockTicks += codeTicksAccessSeq16(armNextPC) + codeTicksAccess16(armNextPC) + 2; busPrefetchCount=0; } } @@ -1987,13 +1990,13 @@ static INSN_REGPARM void thumbD6(u32 opcode) static INSN_REGPARM void thumbD7(u32 opcode) { UPDATE_OLDREG; + clockTicks = codeTicksAccessSeq16(armNextPC) + 1; if(!V_FLAG) { reg[15].I += ((s8)(opcode & 0xFF)) << 1; armNextPC = reg[15].I; reg[15].I += 2; THUMB_PREFETCH; - clockTicks = codeTicksAccessSeq16(armNextPC) + codeTicksAccessSeq16(armNextPC) + - codeTicksAccess16(armNextPC)+3; + clockTicks += codeTicksAccessSeq16(armNextPC) + codeTicksAccess16(armNextPC) + 2; busPrefetchCount=0; } } @@ -2002,13 +2005,13 @@ static INSN_REGPARM void thumbD7(u32 opcode) static INSN_REGPARM void thumbD8(u32 opcode) { UPDATE_OLDREG; + clockTicks = codeTicksAccessSeq16(armNextPC) + 1; if(C_FLAG && !Z_FLAG) { reg[15].I += ((s8)(opcode & 0xFF)) << 1; armNextPC = reg[15].I; reg[15].I += 2; THUMB_PREFETCH; - clockTicks = codeTicksAccessSeq16(armNextPC) + codeTicksAccessSeq16(armNextPC) + - codeTicksAccess16(armNextPC)+3; + clockTicks += codeTicksAccessSeq16(armNextPC) + codeTicksAccess16(armNextPC) + 2; busPrefetchCount=0; } } @@ -2017,13 +2020,13 @@ static INSN_REGPARM void thumbD8(u32 opcode) static INSN_REGPARM void thumbD9(u32 opcode) { UPDATE_OLDREG; + clockTicks = codeTicksAccessSeq16(armNextPC) + 1; if(!C_FLAG || Z_FLAG) { reg[15].I += ((s8)(opcode & 0xFF)) << 1; armNextPC = reg[15].I; reg[15].I += 2; THUMB_PREFETCH; - clockTicks = codeTicksAccessSeq16(armNextPC) + codeTicksAccessSeq16(armNextPC) + - codeTicksAccess16(armNextPC)+3; + clockTicks += codeTicksAccessSeq16(armNextPC) + codeTicksAccess16(armNextPC) + 2; busPrefetchCount=0; } } @@ -2032,13 +2035,13 @@ static INSN_REGPARM void thumbD9(u32 opcode) static INSN_REGPARM void thumbDA(u32 opcode) { UPDATE_OLDREG; + clockTicks = codeTicksAccessSeq16(armNextPC) + 1; if(N_FLAG == V_FLAG) { reg[15].I += ((s8)(opcode & 0xFF)) << 1; armNextPC = reg[15].I; reg[15].I += 2; THUMB_PREFETCH; - clockTicks = codeTicksAccessSeq16(armNextPC) + codeTicksAccessSeq16(armNextPC) + - codeTicksAccess16(armNextPC)+3; + clockTicks += codeTicksAccessSeq16(armNextPC) + codeTicksAccess16(armNextPC) + 2; busPrefetchCount=0; } } @@ -2047,13 +2050,13 @@ static INSN_REGPARM void thumbDA(u32 opcode) static INSN_REGPARM void thumbDB(u32 opcode) { UPDATE_OLDREG; + clockTicks = codeTicksAccessSeq16(armNextPC) + 1; if(N_FLAG != V_FLAG) { reg[15].I += ((s8)(opcode & 0xFF)) << 1; armNextPC = reg[15].I; reg[15].I += 2; THUMB_PREFETCH; - clockTicks = codeTicksAccessSeq16(armNextPC) + codeTicksAccessSeq16(armNextPC) + - codeTicksAccess16(armNextPC)+3; + clockTicks += codeTicksAccessSeq16(armNextPC) + codeTicksAccess16(armNextPC) + 2; busPrefetchCount=0; } } @@ -2062,13 +2065,13 @@ static INSN_REGPARM void thumbDB(u32 opcode) static INSN_REGPARM void thumbDC(u32 opcode) { UPDATE_OLDREG; + clockTicks = codeTicksAccessSeq16(armNextPC) + 1; if(!Z_FLAG && (N_FLAG == V_FLAG)) { reg[15].I += ((s8)(opcode & 0xFF)) << 1; armNextPC = reg[15].I; reg[15].I += 2; THUMB_PREFETCH; - clockTicks = codeTicksAccessSeq16(armNextPC) + codeTicksAccessSeq16(armNextPC) + - codeTicksAccess16(armNextPC)+3; + clockTicks += codeTicksAccessSeq16(armNextPC) + codeTicksAccess16(armNextPC) + 2; busPrefetchCount=0; } } @@ -2077,13 +2080,13 @@ static INSN_REGPARM void thumbDC(u32 opcode) static INSN_REGPARM void thumbDD(u32 opcode) { UPDATE_OLDREG; + clockTicks = codeTicksAccessSeq16(armNextPC); if(Z_FLAG || (N_FLAG != V_FLAG)) { reg[15].I += ((s8)(opcode & 0xFF)) << 1; armNextPC = reg[15].I; reg[15].I += 2; THUMB_PREFETCH; - clockTicks = codeTicksAccessSeq16(armNextPC) + codeTicksAccessSeq16(armNextPC) + - codeTicksAccess16(armNextPC)+3; + clockTicks += codeTicksAccessSeq16(armNextPC) + codeTicksAccess16(armNextPC) + 2; busPrefetchCount=0; } } @@ -2094,8 +2097,8 @@ static INSN_REGPARM void thumbDD(u32 opcode) static INSN_REGPARM void thumbDF(u32 opcode) { u32 address = 0; - clockTicks = codeTicksAccessSeq16(address) + codeTicksAccessSeq16(address) + - codeTicksAccess16(address)+3; + //clockTicks = codeTicksAccessSeq16(address)*2 + codeTicksAccess16(address)+3; + clockTicks = 3; busPrefetchCount=0; CPUSoftwareInterrupt(opcode & 0xFF); } @@ -2110,8 +2113,7 @@ static INSN_REGPARM void thumbE0(u32 opcode) armNextPC = reg[15].I; reg[15].I += 2; THUMB_PREFETCH; - clockTicks = codeTicksAccessSeq16(armNextPC) + codeTicksAccessSeq16(armNextPC) + - codeTicksAccess16(armNextPC) + 3; + clockTicks = codeTicksAccessSeq16(armNextPC)*2 + codeTicksAccess16(armNextPC)+3; busPrefetchCount=0; } @@ -2141,8 +2143,7 @@ static INSN_REGPARM void thumbF8(u32 opcode) reg[15].I += 2; reg[14].I = temp|1; THUMB_PREFETCH; - clockTicks = codeTicksAccessSeq16(armNextPC) + - codeTicksAccess16(armNextPC) + codeTicksAccessSeq16(armNextPC) + 3; + clockTicks = codeTicksAccessSeq16(armNextPC)*2 + codeTicksAccess16(armNextPC) + 3; busPrefetchCount = 0; } diff --git a/src/gba/GBA.cpp b/src/gba/GBA.cpp index e1d1a0c7..c796d9d4 100644 --- a/src/gba/GBA.cpp +++ b/src/gba/GBA.cpp @@ -42,7 +42,6 @@ bool busPrefetchEnable = false; u32 busPrefetchCount = 0; int cpuDmaTicksToUpdate = 0; int cpuDmaCount = 0; -bool cpuDmaHack = false; u32 cpuDmaLast = 0; int dummyAddress = 0; @@ -934,7 +933,7 @@ bool CPUReadGSASnapshot(const char *fileName) fseek(file, 0x0, SEEK_SET); fread(&i, 1, 4, file); fseek(file, i, SEEK_CUR); // Skip SharkPortSave - fseek(file, 4, SEEK_CUR); // skip some sort of flag +// fseek(file, 4, SEEK_CUR); // skip some sort of flag fread(&i, 1, 4, file); // name length fseek(file, i, SEEK_CUR); // skip name fread(&i, 1, 4, file); // desc length @@ -1806,8 +1805,8 @@ void CPUSoftwareInterrupt(int comment) case 0x02: #ifdef GBA_LOGGING if(systemVerbose & VERBOSE_SWI) { - log("Halt: (VCOUNT = %2d)\n", - VCOUNT); + /*log("Halt: (VCOUNT = %2d)\n", + VCOUNT);*/ } #endif holdState = true; @@ -1817,8 +1816,8 @@ void CPUSoftwareInterrupt(int comment) case 0x03: #ifdef GBA_LOGGING if(systemVerbose & VERBOSE_SWI) { - log("Stop: (VCOUNT = %2d)\n", - VCOUNT); + /*log("Stop: (VCOUNT = %2d)\n", + VCOUNT);*/ } #endif holdState = true; @@ -2184,7 +2183,6 @@ void CPUCheckDMA(int reason, int dmamask) doDMA(dma0Source, dma0Dest, sourceIncrement, destIncrement, DM0CNT_L ? DM0CNT_L : 0x4000, DM0CNT_H & 0x0400); - cpuDmaHack = true; if(DM0CNT_H & 0x4000) { IF |= 0x0100; @@ -2253,7 +2251,6 @@ void CPUCheckDMA(int reason, int dmamask) DM1CNT_L ? DM1CNT_L : 0x4000, DM1CNT_H & 0x0400); } - cpuDmaHack = true; if(DM1CNT_H & 0x4000) { IF |= 0x0200; @@ -2323,7 +2320,6 @@ void CPUCheckDMA(int reason, int dmamask) DM2CNT_L ? DM2CNT_L : 0x4000, DM2CNT_H & 0x0400); } - cpuDmaHack = true; if(DM2CNT_H & 0x4000) { IF |= 0x0400; @@ -3404,8 +3400,6 @@ void CPUReset() systemSaveUpdateCounter = SYSTEM_SAVE_NOT_UPDATED; - cpuDmaHack = false; - lastTime = systemGetClock(); SWITicks = 0; @@ -3504,7 +3498,6 @@ void CPULoop(int ticks) clockTicks = cpuNextEvent; cpuTotalTicks = 0; - cpuDmaHack = false; updateLoop: @@ -3906,7 +3899,6 @@ void CPULoop(int ticks) cpuDmaTicksToUpdate -= clockTicks; if(cpuDmaTicksToUpdate < 0) cpuDmaTicksToUpdate = 0; - cpuDmaHack = true; goto updateLoop; } diff --git a/src/gba/GBAinline.h b/src/gba/GBAinline.h index aec55aae..6da82a47 100644 --- a/src/gba/GBAinline.h +++ b/src/gba/GBAinline.h @@ -19,7 +19,6 @@ extern bool cpuSramEnabled; extern bool cpuFlashEnabled; extern bool cpuEEPROMEnabled; extern bool cpuEEPROMSensorEnabled; -extern bool cpuDmaHack; extern u32 cpuDmaLast; extern bool timer0On; extern int timer0Ticks; @@ -49,11 +48,9 @@ static inline u32 CPUReadMemory(u32 address) u32 value; u32 oldAddress = address; -#ifdef C_CORE if(address & 3) { address &= ~0x03; } -#endif switch(address >> 24) { case 0: @@ -133,18 +130,12 @@ unreadable: armNextPC - 4 : armNextPC - 2); } #endif - - if(cpuDmaHack) { - value = cpuDmaLast; + if(armState) { + return CPUReadMemoryQuick(reg[15].I); } else { - if(armState) { - value = CPUReadMemoryQuick(reg[15].I); - } else { - value = CPUReadHalfWordQuick(reg[15].I) | - CPUReadHalfWordQuick(reg[15].I) << 16; - } + return CPUReadHalfWordQuick(reg[15].I) | + CPUReadHalfWordQuick(reg[15].I) << 16; } - return value; } if(oldAddress & 3) { @@ -187,11 +178,9 @@ static inline u32 CPUReadHalfWord(u32 address) u32 value; u32 oldAddress = address; -//#ifdef C_CORE if(address & 1) { address &= ~0x01; } -//#endif switch(address >> 24) { case 0: @@ -280,17 +269,12 @@ unreadable: armNextPC - 4 : armNextPC - 2); } #endif - if(cpuDmaHack) { - value = cpuDmaLast & 0xFFFF; - } else { - if(armState) { - value = CPUReadMemoryQuick(reg[15].I); - } else { - value = CPUReadHalfWordQuick(reg[15].I) | - CPUReadHalfWordQuick(reg[15].I) << 16; - } - } - return value; + if(armState) { + return CPUReadMemoryQuick(reg[15].I); + } else { + return CPUReadHalfWordQuick(reg[15].I) | + CPUReadHalfWordQuick(reg[15].I) << 16; + } } if(oldAddress & 1) { @@ -306,13 +290,13 @@ unreadable: return value; } -static inline u16 CPUReadHalfWordSigned(u32 address) +static inline s16 CPUReadHalfWordSigned(u32 address) { u32 oldAddress = address; if(address & 1) { address &= ~0x01; } - u16 value = CPUReadHalfWord(address); + s16 value = (s16)CPUReadHalfWord(address); if((oldAddress & 1)) { value = (s8)value; @@ -395,17 +379,12 @@ unreadable: armNextPC - 4 : armNextPC - 2); } #endif - if(cpuDmaHack) { - return cpuDmaLast & 0xFF; - } else { - if(armState) { - return CPUReadMemoryQuick(reg[15].I); - } else { - return CPUReadHalfWordQuick(reg[15].I) | - CPUReadHalfWordQuick(reg[15].I) << 16; - } - } - break; + if(armState) { + return CPUReadMemoryQuick(reg[15].I); + } else { + return CPUReadHalfWordQuick(reg[15].I) | + CPUReadHalfWordQuick(reg[15].I) << 16; + } } } @@ -423,6 +402,8 @@ static inline void CPUWriteMemory(u32 address, u32 value) } #endif + address &= 0xFFFFFFFC; + switch(address >> 24) { case 0x02: #ifdef BKPT_SUPPORT @@ -520,6 +501,8 @@ static inline void CPUWriteHalfWord(u32 address, u16 value) } #endif + address &= 0xFFFFFFFE; + switch(address >> 24) { case 2: #ifdef BKPT_SUPPORT