More memreadwrite macros usage.

This commit is contained in:
Maxim Poliakovski 2020-01-06 03:46:23 +01:00
parent f51e479e5c
commit bd5ae4a45a
3 changed files with 21 additions and 22 deletions

View File

@ -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 {

View File

@ -19,6 +19,7 @@
#include <stdexcept>
#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);

View File

@ -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 */