aboutsummaryrefslogtreecommitdiff
path: root/qtmips_machine/memory.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'qtmips_machine/memory.cpp')
-rw-r--r--qtmips_machine/memory.cpp8
1 files changed, 4 insertions, 4 deletions
diff --git a/qtmips_machine/memory.cpp b/qtmips_machine/memory.cpp
index 848669d..f7fdff9 100644
--- a/qtmips_machine/memory.cpp
+++ b/qtmips_machine/memory.cpp
@@ -39,10 +39,10 @@ using namespace machine;
#if __BYTE_ORDER == __LITTLE_ENDIAN
#define SH_NTH_8(OFFSET) ((3 - ((OFFSET) & 0b11)) * 8)
-#define SH_NTH_16(OFFSET) ((1 - ((OFFSET) & 0b10)) * 16)
+#define SH_NTH_16(OFFSET) ((2 - ((OFFSET) & 0b10)) * 8)
#else
#define SH_NTH_8(OFFSET) (((OFFSET) & 0b11) * 8)
-#define SH_NTH_16(OFFSET) (((OFFSET) & 0b10) * 16)
+#define SH_NTH_16(OFFSET) (((OFFSET) & 0b10) * 8)
#endif
bool MemoryAccess::write_byte(std::uint32_t offset, std::uint8_t value) {
@@ -102,12 +102,12 @@ std::uint32_t MemoryAccess::read_ctl(enum AccessControl ctl, std::uint32_t offse
case AC_BYTE:
{
std::uint8_t b = this->read_byte(offset);
- return (((std::uint32_t)b & 0x80) << 24) | ((std::uint32_t)b & 0x7F); // Sign extend
+ return ((std::uint32_t)b & 0xFF) - (((std::uint32_t)b & 0x80) << 1); // Sign extend
}
case AC_HALFWORD:
{
std::uint16_t h = this->read_hword(offset);
- return (((std::uint32_t)h & 0x8000) << 16) | ((std::uint32_t)h & 0x7FFF); // Sign extend
+ return ((std::uint32_t)h & 0xFFFF) - (((std::uint32_t)h & 0x8000) << 1); // Sign extend
}
case AC_WORD:
return this->read_word(offset);