diff options
author | 2019-09-24 23:23:06 -0700 | |
---|---|---|
committer | 2019-09-24 23:23:06 -0700 | |
commit | 6e63799772be68fac407f9e99ddc6fe5163a87bd (patch) | |
tree | 471a3a8b863142485f39be7e57c75eb3a135bdbd | |
parent | 4af1e389702b338888f442324944227ba6d97b24 (diff) |
sh2.cpp/sh4.cpp: Don't emit fast RAM accesses when the debugger is enabled [Phil Bennett]
-rw-r--r-- | src/devices/cpu/sh/sh2.cpp | 89 | ||||
-rw-r--r-- | src/devices/cpu/sh/sh4.cpp | 93 |
2 files changed, 94 insertions, 88 deletions
diff --git a/src/devices/cpu/sh/sh2.cpp b/src/devices/cpu/sh/sh2.cpp index a489291ae51..c0fab41f9b0 100644 --- a/src/devices/cpu/sh/sh2.cpp +++ b/src/devices/cpu/sh/sh2.cpp @@ -1058,61 +1058,64 @@ void sh2_device::static_generate_memory_accessor(int size, int iswrite, const ch UML_LABEL(block, label++); // label: - for (auto & elem : m_fastram) + if ((machine().debug_flags & DEBUG_FLAG_ENABLED) == 0) { - if (elem.base != nullptr && (!iswrite || !elem.readonly)) + for (auto & elem : m_fastram) { - void *fastbase = (uint8_t *)elem.base - elem.start; - uint32_t skip = label++; - if (elem.end != 0xffffffff) + if (elem.base != nullptr && (!iswrite || !elem.readonly)) { - UML_CMP(block, I0, elem.end); // cmp i0,end - UML_JMPc(block, COND_A, skip); // ja skip - } - if (elem.start != 0x00000000) - { - UML_CMP(block, I0, elem.start);// cmp i0,fastram_start - UML_JMPc(block, COND_B, skip); // jb skip - } - - if (!iswrite) - { - if (size == 1) - { - UML_XOR(block, I0, I0, BYTE4_XOR_BE(0)); - UML_LOAD(block, I0, fastbase, I0, SIZE_BYTE, SCALE_x1); // load i0,fastbase,i0,byte - } - else if (size == 2) - { - UML_XOR(block, I0, I0, WORD_XOR_BE(0)); - UML_LOAD(block, I0, fastbase, I0, SIZE_WORD, SCALE_x1); // load i0,fastbase,i0,word_x1 - } - else if (size == 4) + void *fastbase = (uint8_t *)elem.base - elem.start; + uint32_t skip = label++; + if (elem.end != 0xffffffff) { - UML_LOAD(block, I0, fastbase, I0, SIZE_DWORD, SCALE_x1); // load i0,fastbase,i0,dword_x1 + UML_CMP(block, I0, elem.end); // cmp i0,end + UML_JMPc(block, COND_A, skip); // ja skip } - UML_RET(block); // ret - } - else - { - if (size == 1) + if (elem.start != 0x00000000) { - UML_XOR(block, I0, I0, BYTE4_XOR_BE(0)); - UML_STORE(block, fastbase, I0, I1, SIZE_BYTE, SCALE_x1);// store fastbase,i0,i1,byte + UML_CMP(block, I0, elem.start);// cmp i0,fastram_start + UML_JMPc(block, COND_B, skip); // jb skip } - else if (size == 2) + + if (!iswrite) { - UML_XOR(block, I0, I0, WORD_XOR_BE(0)); - UML_STORE(block, fastbase, I0, I1, SIZE_WORD, SCALE_x1);// store fastbase,i0,i1,word_x1 + if (size == 1) + { + UML_XOR(block, I0, I0, BYTE4_XOR_BE(0)); + UML_LOAD(block, I0, fastbase, I0, SIZE_BYTE, SCALE_x1); // load i0,fastbase,i0,byte + } + else if (size == 2) + { + UML_XOR(block, I0, I0, WORD_XOR_BE(0)); + UML_LOAD(block, I0, fastbase, I0, SIZE_WORD, SCALE_x1); // load i0,fastbase,i0,word_x1 + } + else if (size == 4) + { + UML_LOAD(block, I0, fastbase, I0, SIZE_DWORD, SCALE_x1); // load i0,fastbase,i0,dword_x1 + } + UML_RET(block); // ret } - else if (size == 4) + else { - UML_STORE(block, fastbase, I0, I1, SIZE_DWORD, SCALE_x1); // store fastbase,i0,i1,dword_x1 + if (size == 1) + { + UML_XOR(block, I0, I0, BYTE4_XOR_BE(0)); + UML_STORE(block, fastbase, I0, I1, SIZE_BYTE, SCALE_x1);// store fastbase,i0,i1,byte + } + else if (size == 2) + { + UML_XOR(block, I0, I0, WORD_XOR_BE(0)); + UML_STORE(block, fastbase, I0, I1, SIZE_WORD, SCALE_x1);// store fastbase,i0,i1,word_x1 + } + else if (size == 4) + { + UML_STORE(block, fastbase, I0, I1, SIZE_DWORD, SCALE_x1); // store fastbase,i0,i1,dword_x1 + } + UML_RET(block); // ret } - UML_RET(block); // ret - } - UML_LABEL(block, skip); // skip: + UML_LABEL(block, skip); // skip: + } } } diff --git a/src/devices/cpu/sh/sh4.cpp b/src/devices/cpu/sh/sh4.cpp index 47ed74df421..636bcd05ddb 100644 --- a/src/devices/cpu/sh/sh4.cpp +++ b/src/devices/cpu/sh/sh4.cpp @@ -2713,64 +2713,67 @@ void sh34_base_device::static_generate_memory_accessor(int size, int iswrite, co UML_LABEL(block, label++); // label: - for (auto & elem : m_fastram) + if ((machine().debug_flags & DEBUG_FLAG_ENABLED) == 0) { - if (elem.base != nullptr && (!iswrite || !elem.readonly)) + for (auto & elem : m_fastram) { - void *fastbase = (uint8_t *)elem.base - elem.start; - uint32_t skip = label++; - if (elem.end != 0xffffffff) + if (elem.base != nullptr && (!iswrite || !elem.readonly)) { - UML_CMP(block, I0, elem.end); // cmp i0,end - UML_JMPc(block, COND_A, skip); // ja skip - } - if (elem.start != 0x00000000) - { - UML_CMP(block, I0, elem.start);// cmp i0,fastram_start - UML_JMPc(block, COND_B, skip); // jb skip - } - - if (!iswrite) - { - if (size == 1) + void *fastbase = (uint8_t *)elem.base - elem.start; + uint32_t skip = label++; + if (elem.end != 0xffffffff) { - UML_XOR(block, I0, I0, m_bigendian ? BYTE8_XOR_BE(0) : BYTE8_XOR_LE(0)); - UML_LOAD(block, I0, fastbase, I0, SIZE_BYTE, SCALE_x1); // load i0,fastbase,i0,byte + UML_CMP(block, I0, elem.end); // cmp i0,end + UML_JMPc(block, COND_A, skip); // ja skip } - else if (size == 2) + if (elem.start != 0x00000000) { - UML_XOR(block, I0, I0, m_bigendian ? WORD2_XOR_BE(0) : WORD2_XOR_LE(0)); - UML_LOAD(block, I0, fastbase, I0, SIZE_WORD, SCALE_x1); // load i0,fastbase,i0,word_x1 + UML_CMP(block, I0, elem.start);// cmp i0,fastram_start + UML_JMPc(block, COND_B, skip); // jb skip } - else if (size == 4) - { - UML_XOR(block, I0, I0, m_bigendian ? DWORD_XOR_BE(0) : DWORD_XOR_LE(0)); - UML_LOAD(block, I0, fastbase, I0, SIZE_DWORD, SCALE_x1); // load i0,fastbase,i0,dword_x1 - } - UML_RET(block); // ret - } - else - { - if (size == 1) - { - UML_XOR(block, I0, I0, m_bigendian ? BYTE8_XOR_BE(0) : BYTE8_XOR_LE(0)); - UML_STORE(block, fastbase, I0, I1, SIZE_BYTE, SCALE_x1);// store fastbase,i0,i1,byte - } - else if (size == 2) + if (!iswrite) { - UML_XOR(block, I0, I0, m_bigendian ? WORD2_XOR_BE(0) : WORD2_XOR_LE(0)); - UML_STORE(block, fastbase, I0, I1, SIZE_WORD, SCALE_x1);// store fastbase,i0,i1,word_x1 + if (size == 1) + { + UML_XOR(block, I0, I0, m_bigendian ? BYTE8_XOR_BE(0) : BYTE8_XOR_LE(0)); + UML_LOAD(block, I0, fastbase, I0, SIZE_BYTE, SCALE_x1); // load i0,fastbase,i0,byte + } + else if (size == 2) + { + UML_XOR(block, I0, I0, m_bigendian ? WORD2_XOR_BE(0) : WORD2_XOR_LE(0)); + UML_LOAD(block, I0, fastbase, I0, SIZE_WORD, SCALE_x1); // load i0,fastbase,i0,word_x1 + } + else if (size == 4) + { + + UML_XOR(block, I0, I0, m_bigendian ? DWORD_XOR_BE(0) : DWORD_XOR_LE(0)); + UML_LOAD(block, I0, fastbase, I0, SIZE_DWORD, SCALE_x1); // load i0,fastbase,i0,dword_x1 + } + UML_RET(block); // ret } - else if (size == 4) + else { - UML_XOR(block, I0, I0, m_bigendian ? DWORD_XOR_BE(0) : DWORD_XOR_LE(0)); - UML_STORE(block, fastbase, I0, I1, SIZE_DWORD, SCALE_x1); // store fastbase,i0,i1,dword_x1 + if (size == 1) + { + UML_XOR(block, I0, I0, m_bigendian ? BYTE8_XOR_BE(0) : BYTE8_XOR_LE(0)); + UML_STORE(block, fastbase, I0, I1, SIZE_BYTE, SCALE_x1);// store fastbase,i0,i1,byte + } + else if (size == 2) + { + UML_XOR(block, I0, I0, m_bigendian ? WORD2_XOR_BE(0) : WORD2_XOR_LE(0)); + UML_STORE(block, fastbase, I0, I1, SIZE_WORD, SCALE_x1);// store fastbase,i0,i1,word_x1 + } + else if (size == 4) + { + UML_XOR(block, I0, I0, m_bigendian ? DWORD_XOR_BE(0) : DWORD_XOR_LE(0)); + UML_STORE(block, fastbase, I0, I1, SIZE_DWORD, SCALE_x1); // store fastbase,i0,i1,dword_x1 + } + UML_RET(block); // ret } - UML_RET(block); // ret - } - UML_LABEL(block, skip); // skip: + UML_LABEL(block, skip); // skip: + } } } |