From bd5ae4a45a8b7b07149a4770963bd94946a637e6 Mon Sep 17 00:00:00 2001 From: Maxim Poliakovski Date: Mon, 6 Jan 2020 03:46:23 +0100 Subject: [PATCH] More memreadwrite macros usage. --- cpu/ppc/ppcmmu.cpp | 31 +++++++++++++------------------ main.cpp | 3 ++- memreadwrite.h | 9 ++++++--- 3 files changed, 21 insertions(+), 22 deletions(-) diff --git a/cpu/ppc/ppcmmu.cpp b/cpu/ppc/ppcmmu.cpp index e95575a..5d8a6e8 100644 --- a/cpu/ppc/ppcmmu.cpp +++ b/cpu/ppc/ppcmmu.cpp @@ -38,33 +38,28 @@ void ppc_set_cur_instruction(const uint8_t *ptr) ppc_cur_instruction = READ_DWORD_BE(ptr); } -static inline void ppc_set_return_val(unsigned char *ptr, uint32_t offset, - int num_size) +static inline void ppc_set_return_val(const uint8_t *ptr, int num_size) { //Put the final result in return_value here //This is what gets put back into the register + if (num_size == 1) { // BYTE + return_value = ptr[0]; + } + if (ppc_state.ppc_msr & 1) { /* little-endian byte ordering */ - if (num_size == 1) { // BYTE - return_value = ptr[offset]; - } - else if (num_size == 2) { // WORD - return_value = ptr[offset] | (ptr[offset+1] << 8); + if (num_size == 2) { // WORD + return_value = READ_WORD_LE(ptr); } else if (num_size == 4) { // DWORD - return_value = ptr[offset] | (ptr[offset+1] << 8) | - (ptr[offset+2] << 16) | (ptr[offset+3] << 24); + return_value = READ_DWORD_LE(ptr); } } else { /* big-endian byte ordering */ - if (num_size == 1) { // BYTE - return_value = ptr[offset]; - } - else if (num_size == 2) { // WORD - return_value = (ptr[offset] << 8) | ptr[offset+1]; + if (num_size == 2) { // WORD + return_value = READ_WORD_BE(ptr); } else if (num_size == 4) { // DWORD - return_value = (ptr[offset] << 24) | (ptr[offset+1] << 16) | - (ptr[offset+2] << 8) | ptr[offset+3]; + return_value = READ_DWORD_BE(ptr); } } } @@ -392,7 +387,7 @@ void address_quickgrab_translate(uint32_t addr, uint8_t num_bytes) } if (addr >= read_last_pa_start && addr <= read_last_pa_end) { - ppc_set_return_val(read_last_ptr, addr - read_last_pa_start, num_bytes); + ppc_set_return_val(read_last_ptr + (addr - read_last_pa_start), num_bytes); } else { AddressMapEntry *entry = mem_ctrl_instance->find_range(addr); if (entry) { @@ -400,7 +395,7 @@ void address_quickgrab_translate(uint32_t addr, uint8_t num_bytes) read_last_pa_start = entry->start; read_last_pa_end = entry->end; read_last_ptr = entry->mem_ptr; - ppc_set_return_val(read_last_ptr, addr - entry->start, num_bytes); + ppc_set_return_val(read_last_ptr + (addr - entry->start), num_bytes); } else if (entry->type & RT_MMIO) { return_value = entry->devobj->read(addr - entry->start, num_bytes); } else { diff --git a/main.cpp b/main.cpp index c726c49..3b9c14c 100644 --- a/main.cpp +++ b/main.cpp @@ -19,6 +19,7 @@ #include #include "ppcemu.h" #include "ppcmmu.h" +#include "memreadwrite.h" #include "devices/mpc106.h" #include "debugger/debugger.h" #include "devices/machineid.h" @@ -403,7 +404,7 @@ int main(int argc, char **argv) romFile.seekg (configInfoAddr, ios::beg); romFile.read(memPPCBlock, 4); memPPCBlock[4] = 0; - uint32_t rom_id = (memPPCBlock[0] << 24) | (memPPCBlock[1] << 16) | (memPPCBlock[2] << 8) | memPPCBlock[3]; + uint32_t rom_id = READ_DWORD_BE(memPPCBlock); std::string string_test = std::string(memPPCBlock); diff --git a/memreadwrite.h b/memreadwrite.h index f6357df..e7dc136 100644 --- a/memreadwrite.h +++ b/memreadwrite.h @@ -6,14 +6,17 @@ */ /* read a unaligned big-endian WORD (16bit) */ -#define READ_WORD_BE(addr) (((addr)[0] << 16) | (addr)[1]) +#define READ_WORD_BE(addr) (((addr)[0] << 8) | (addr)[1]) /* read a unaligned big-endian DWORD (32bit) */ #define READ_DWORD_BE(addr) (((addr)[0] << 24) | ((addr)[1] << 16) | \ - ((addr)[2] << 8) | (addr)[3]) + ((addr)[2] << 8) | (addr)[3]) + +/* read a unaligned little-endian WORD (16bit) */ +#define READ_WORD_LE(addr) (((addr)[1] << 8) | (ptr)[0]) /* read a unaligned little-endian DWORD (32bit) */ #define READ_DWORD_LE(addr) (((addr)[3] << 24) | ((addr)[2] << 16) | \ - ((addr)[1] << 8) | (addr)[0]) + ((addr)[1] << 8) | (addr)[0]) #endif /* MEM_READ_WRITE_H */