diff --git a/src/core/gba/gba.cpp b/src/core/gba/gba.cpp index 483dcfc8..24771a47 100644 --- a/src/core/gba/gba.cpp +++ b/src/core/gba/gba.cpp @@ -3637,9 +3637,6 @@ void applyTimer() timerOnOffDelay = 0; } -uint8_t cpuBitsSet[256]; -uint8_t cpuLowestBitSet[256]; - void CPUInit(const char* biosFileName, bool useBiosFile) { #ifdef WORDS_BIGENDIAN @@ -3677,7 +3674,7 @@ void CPUInit(const char* biosFileName, bool useBiosFile) biosProtected[2] = 0x29; biosProtected[3] = 0xe1; - for (i = 0; i < 256; i++) { + /*for (i = 0; i < 256; i++) { int count = 0; int j; for (j = 0; j < 8; j++) @@ -3689,7 +3686,7 @@ void CPUInit(const char* biosFileName, bool useBiosFile) if (i & (1 << j)) break; cpuLowestBitSet[i] = DowncastU8(j); - } + }*/ for (i = 0; i < 0x400; i++) ioReadable[i] = true; diff --git a/src/core/gba/gbaCpu.h b/src/core/gba/gbaCpu.h index 670b6cac..2eeee48b 100644 --- a/src/core/gba/gbaCpu.h +++ b/src/core/gba/gbaCpu.h @@ -45,6 +45,26 @@ extern int thumbExecute(); #define THUMB_PREFETCH_NEXT cpuPrefetch[1] = CPUReadHalfWordQuick(armNextPC + 2); +constexpr uint8_t cpuBitsSet[256] = +{ + 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 +}; + extern int SWITicks; extern uint32_t mastercode; extern bool busPrefetch; @@ -58,8 +78,6 @@ extern uint8_t memoryWait[16]; extern uint8_t memoryWait32[16]; extern uint8_t memoryWaitSeq[16]; extern uint8_t memoryWaitSeq32[16]; -extern uint8_t cpuBitsSet[256]; -extern uint8_t cpuLowestBitSet[256]; extern void CPUSwitchMode(int mode, bool saveState, bool breakLoop); extern void CPUSwitchMode(int mode, bool saveState); extern void CPUUpdateCPSR(); diff --git a/src/core/gba/gbaCpuArm.cpp b/src/core/gba/gbaCpuArm.cpp index 23cf2102..54de2c90 100644 --- a/src/core/gba/gbaCpuArm.cpp +++ b/src/core/gba/gbaCpuArm.cpp @@ -1063,7 +1063,7 @@ static void count(uint32_t opcode, int cond_res) #ifndef SETCOND_MULL #define SETCOND_MULL \ N_FLAG = (reg[dest].I & 0x80000000) ? true : false; \ - Z_FLAG = reg[dest].I || reg[acc].I ? false : true; + Z_FLAG = (reg[dest].I | reg[acc].I) ? false : true; #endif #ifndef ALU_FINISH diff --git a/src/core/gba/gbaCpuThumb.cpp b/src/core/gba/gbaCpuThumb.cpp index 6e53d1ef..e50de091 100644 --- a/src/core/gba/gbaCpuThumb.cpp +++ b/src/core/gba/gbaCpuThumb.cpp @@ -1317,7 +1317,7 @@ static INSN_REGPARM void thumb48(uint32_t opcode) if (busPrefetchCount == 0) busPrefetch = busPrefetchEnable; uint32_t address = (reg[15].I & 0xFFFFFFFC) + ((opcode & 0xFF) << 2); - reg[regist].I = CPUReadMemoryQuick(address); + reg[regist].I = CPUReadMemory(address); busPrefetchCount = 0; clockTicks = 3 + dataTicksAccess32(address) + codeTicksAccess16(armNextPC); } @@ -1480,7 +1480,7 @@ static INSN_REGPARM void thumb98(uint32_t opcode) if (busPrefetchCount == 0) busPrefetch = busPrefetchEnable; uint32_t address = reg[13].I + ((opcode & 255) << 2); - reg[regist].I = CPUReadMemoryQuick(address); + reg[regist].I = CPUReadMemory(address); clockTicks = 3 + dataTicksAccess32(address) + codeTicksAccess16(armNextPC); }