Refactor usage of the memory access functions.

Memory access function have better names now.
Global variable return_value has been removed.
lhbrx emulation has been fixed.
This commit is contained in:
Maxim Poliakovski 2020-01-27 01:36:22 +01:00
parent cdd7f228a4
commit 7ae87e39c1
7 changed files with 134 additions and 202 deletions

View File

@ -202,6 +202,7 @@ void power_lscbx() {
uint32_t bytes_copied = 0; uint32_t bytes_copied = 0;
bool match_found = false; bool match_found = false;
uint32_t shift_amount = 0; uint32_t shift_amount = 0;
uint8_t return_value;
uint8_t byte_compared = (uint8_t)((ppc_state.ppc_spr[1] & 0xFF00) >> 8); uint8_t byte_compared = (uint8_t)((ppc_state.ppc_spr[1] & 0xFF00) >> 8);
if ((ppc_state.ppc_spr[1] & 0x7f) == 0) { if ((ppc_state.ppc_spr[1] & 0x7f) == 0) {
return; return;
@ -214,35 +215,33 @@ void power_lscbx() {
if (match_found == false) { if (match_found == false) {
switch (shift_amount) { switch (shift_amount) {
case 0: case 0:
address_grab8bit_translate(ppc_effective_address); return_value = mem_grab_byte(ppc_effective_address);
ppc_result_d = (ppc_result_d & 0x00FFFFFF) | ((uint32_t)return_value << 24); ppc_result_d = (ppc_result_d & 0x00FFFFFF) | (return_value << 24);
ppc_store_result_regd(); ppc_store_result_regd();
break; break;
case 1: case 1:
address_grab8bit_translate(ppc_effective_address); return_value = mem_grab_byte(ppc_effective_address);
ppc_result_d = (ppc_result_d & 0xFF00FFFF) | ((uint32_t)return_value << 16); ppc_result_d = (ppc_result_d & 0xFF00FFFF) | (return_value << 16);
ppc_store_result_regd(); ppc_store_result_regd();
break; break;
case 2: case 2:
address_grab8bit_translate(ppc_effective_address); return_value = mem_grab_byte(ppc_effective_address);
ppc_result_d = (ppc_result_d & 0xFFFF00FF) | ((uint32_t)return_value << 8); ppc_result_d = (ppc_result_d & 0xFFFF00FF) | (return_value << 8);
ppc_store_result_regd(); ppc_store_result_regd();
break; break;
case 3: case 3:
address_grab8bit_translate(ppc_effective_address); return_value = mem_grab_byte(ppc_effective_address);
ppc_result_d = (ppc_result_d & 0xFFFFFF00) | (uint32_t)return_value; ppc_result_d = (ppc_result_d & 0xFFFFFF00) | return_value;
ppc_store_result_regd(); ppc_store_result_regd();
break; break;
} }
bytes_copied++; bytes_copied++;
} }
if (((uint8_t)return_value) == byte_compared) { if (return_value == byte_compared) {
break; break;
} }
return_value = 0;
if (shift_amount == 3) { if (shift_amount == 3) {
shift_amount = 0; shift_amount = 0;
reg_d = (reg_d + 1) & 0x1F; reg_d = (reg_d + 1) & 0x1F;
@ -792,4 +791,4 @@ void power_srq() {
void power_srqdot() { void power_srqdot() {
printf("OOPS! Placeholder!!! \n"); printf("OOPS! Placeholder!!! \n");
} }

View File

@ -101,8 +101,6 @@ SUPERVISOR MODEL
536 - 543 are the Data BAT registers 536 - 543 are the Data BAT registers
**/ **/
extern uint64_t return_value; //used for loading from memory
extern uint32_t opcode_value; //used for interpreting opcodes extern uint32_t opcode_value; //used for interpreting opcodes
extern uint32_t ram_size_set; extern uint32_t ram_size_set;

View File

@ -879,8 +879,7 @@ void ppc_lfs() {
ppc_grab_regsfpdia(true); ppc_grab_regsfpdia(true);
ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF)); ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF));
ppc_effective_address += (reg_a > 0) ? ppc_result_a : 0; ppc_effective_address += (reg_a > 0) ? ppc_result_a : 0;
address_grab32bit_translate(ppc_effective_address); ppc_result64_d = mem_grab_dword(ppc_effective_address);
ppc_result64_d = (uint64_t)return_value;
ppc_store_dfpresult(true); ppc_store_dfpresult(true);
} }
@ -890,8 +889,7 @@ void ppc_lfsu() {
if (reg_a == 0) { if (reg_a == 0) {
ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF)); ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF));
ppc_effective_address += (reg_a > 0) ? ppc_result_a : 0; ppc_effective_address += (reg_a > 0) ? ppc_result_a : 0;
address_grab32bit_translate(ppc_effective_address); ppc_result64_d = mem_grab_dword(ppc_effective_address);
ppc_result64_d = (uint64_t)return_value;
ppc_result_a = ppc_effective_address; ppc_result_a = ppc_effective_address;
ppc_store_dfpresult(true); ppc_store_dfpresult(true);
ppc_store_result_rega(); ppc_store_result_rega();
@ -904,8 +902,7 @@ void ppc_lfsu() {
void ppc_lfsx() { void ppc_lfsx() {
ppc_grab_regsfpdiab(true); ppc_grab_regsfpdiab(true);
ppc_effective_address = (reg_a == 0) ? ppc_result_b : ppc_result_a + ppc_result_b; ppc_effective_address = (reg_a == 0) ? ppc_result_b : ppc_result_a + ppc_result_b;
address_grab32bit_translate(ppc_effective_address); ppc_result64_d = mem_grab_dword(ppc_effective_address);
ppc_result64_d = (uint64_t)return_value;
ppc_store_dfpresult(true); ppc_store_dfpresult(true);
} }
@ -913,8 +910,7 @@ void ppc_lfsux() {
ppc_grab_regsfpdiab(true); ppc_grab_regsfpdiab(true);
if (reg_a == 0) { if (reg_a == 0) {
ppc_effective_address = ppc_result_a + ppc_result_b; ppc_effective_address = ppc_result_a + ppc_result_b;
address_grab32bit_translate(ppc_effective_address); ppc_result64_d = mem_grab_dword(ppc_effective_address);
ppc_result64_d = (uint64_t)return_value;
ppc_result_a = ppc_effective_address; ppc_result_a = ppc_effective_address;
ppc_store_dfpresult(true); ppc_store_dfpresult(true);
ppc_store_result_rega(); ppc_store_result_rega();
@ -928,8 +924,7 @@ void ppc_lfd() {
ppc_grab_regsfpdia(true); ppc_grab_regsfpdia(true);
ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF)); ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF));
ppc_effective_address += (reg_a > 0) ? ppc_result_a : 0; ppc_effective_address += (reg_a > 0) ? ppc_result_a : 0;
address_grab64bit_translate(ppc_effective_address); ppc_result64_d = mem_grab_qword(ppc_effective_address);
ppc_result64_d = return_value;
ppc_store_dfpresult(true); ppc_store_dfpresult(true);
} }
@ -938,8 +933,7 @@ void ppc_lfdu() {
if (reg_a == 0) { if (reg_a == 0) {
ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF)); ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF));
ppc_effective_address += ppc_result_a; ppc_effective_address += ppc_result_a;
address_grab64bit_translate(ppc_effective_address); ppc_result64_d = mem_grab_qword(ppc_effective_address);
ppc_result64_d = return_value;
ppc_store_dfpresult(true); ppc_store_dfpresult(true);
ppc_result_a = ppc_effective_address; ppc_result_a = ppc_effective_address;
ppc_store_result_rega(); ppc_store_result_rega();
@ -952,8 +946,7 @@ void ppc_lfdu() {
void ppc_lfdx() { void ppc_lfdx() {
ppc_grab_regsfpdia(true); ppc_grab_regsfpdia(true);
ppc_effective_address += (reg_a > 0) ? ppc_result_a + ppc_result_b : ppc_result_b; ppc_effective_address += (reg_a > 0) ? ppc_result_a + ppc_result_b : ppc_result_b;
address_grab64bit_translate(ppc_effective_address); ppc_result64_d = mem_grab_qword(ppc_effective_address);
ppc_result64_d = return_value;
ppc_store_dfpresult(true); ppc_store_dfpresult(true);
} }
@ -961,8 +954,7 @@ void ppc_lfdux() {
ppc_grab_regsfpdiab(true); ppc_grab_regsfpdiab(true);
if (reg_a == 0) { if (reg_a == 0) {
ppc_effective_address = ppc_result_a + ppc_result_b; ppc_effective_address = ppc_result_a + ppc_result_b;
address_grab64bit_translate(ppc_effective_address); ppc_result64_d = mem_grab_qword(ppc_effective_address);
ppc_result64_d = return_value;
ppc_store_dfpresult(true); ppc_store_dfpresult(true);
ppc_result_a = ppc_effective_address; ppc_result_a = ppc_effective_address;
ppc_store_result_rega(); ppc_store_result_rega();
@ -976,7 +968,7 @@ void ppc_stfs() {
ppc_grab_regsfpsia(true); ppc_grab_regsfpsia(true);
ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF)); ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF));
ppc_effective_address += (reg_a > 0) ? ppc_result_a : 0; ppc_effective_address += (reg_a > 0) ? ppc_result_a : 0;
address_insert32bit_translate(uint32_t(ppc_state.ppc_fpr[reg_s].int64_r), ppc_effective_address); mem_write_dword(ppc_effective_address, uint32_t(ppc_state.ppc_fpr[reg_s].int64_r));
} }
void ppc_stfsu() { void ppc_stfsu() {
@ -984,7 +976,7 @@ void ppc_stfsu() {
if (reg_a == 0) { if (reg_a == 0) {
ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF)); ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF));
ppc_effective_address += ppc_result_a; ppc_effective_address += ppc_result_a;
address_insert32bit_translate(uint32_t(ppc_state.ppc_fpr[reg_s].int64_r), ppc_effective_address); mem_write_dword(ppc_effective_address, uint32_t(ppc_state.ppc_fpr[reg_s].int64_r));
ppc_result_a = ppc_effective_address; ppc_result_a = ppc_effective_address;
ppc_store_result_rega(); ppc_store_result_rega();
} }
@ -996,14 +988,14 @@ void ppc_stfsu() {
void ppc_stfsx() { void ppc_stfsx() {
ppc_grab_regsfpsiab(true); ppc_grab_regsfpsiab(true);
ppc_effective_address = (reg_a == 0) ? ppc_result_b : ppc_result_a + ppc_result_b; ppc_effective_address = (reg_a == 0) ? ppc_result_b : ppc_result_a + ppc_result_b;
address_insert32bit_translate(uint32_t(ppc_state.ppc_fpr[reg_s].int64_r), ppc_effective_address); mem_write_dword(ppc_effective_address, uint32_t(ppc_state.ppc_fpr[reg_s].int64_r));
} }
void ppc_stfsux() { void ppc_stfsux() {
ppc_grab_regsfpsiab(true); ppc_grab_regsfpsiab(true);
if (reg_a == 0) { if (reg_a == 0) {
ppc_effective_address = ppc_result_a + ppc_result_b; ppc_effective_address = ppc_result_a + ppc_result_b;
address_insert32bit_translate(uint32_t(ppc_state.ppc_fpr[reg_s].int64_r), ppc_effective_address); mem_write_dword(ppc_effective_address, uint32_t(ppc_state.ppc_fpr[reg_s].int64_r));
ppc_result_a = ppc_effective_address; ppc_result_a = ppc_effective_address;
ppc_store_result_rega(); ppc_store_result_rega();
} }
@ -1016,7 +1008,7 @@ void ppc_stfd() {
ppc_grab_regsfpsia(true); ppc_grab_regsfpsia(true);
ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF)); ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF));
ppc_effective_address += (reg_a > 0) ? ppc_result_a : 0; ppc_effective_address += (reg_a > 0) ? ppc_result_a : 0;
address_insert64bit_translate(ppc_state.ppc_fpr[reg_s].int64_r, ppc_effective_address); mem_write_qword(ppc_effective_address, ppc_state.ppc_fpr[reg_s].int64_r);
} }
void ppc_stfdu() { void ppc_stfdu() {
@ -1024,7 +1016,7 @@ void ppc_stfdu() {
if (reg_a == 0) { if (reg_a == 0) {
ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF)); ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF));
ppc_effective_address += ppc_result_a; ppc_effective_address += ppc_result_a;
address_insert64bit_translate(ppc_state.ppc_fpr[reg_s].int64_r, ppc_effective_address); mem_write_qword(ppc_effective_address, ppc_state.ppc_fpr[reg_s].int64_r);
ppc_result_a = ppc_effective_address; ppc_result_a = ppc_effective_address;
ppc_store_result_rega(); ppc_store_result_rega();
} }
@ -1036,14 +1028,14 @@ void ppc_stfdu() {
void ppc_stfdx() { void ppc_stfdx() {
ppc_grab_regsfpsiab(true); ppc_grab_regsfpsiab(true);
ppc_effective_address = (reg_a == 0) ? ppc_result_b : ppc_result_a + ppc_result_b; ppc_effective_address = (reg_a == 0) ? ppc_result_b : ppc_result_a + ppc_result_b;
address_insert64bit_translate(ppc_state.ppc_fpr[reg_s].int64_r, ppc_effective_address); mem_write_qword(ppc_effective_address, ppc_state.ppc_fpr[reg_s].int64_r);
} }
void ppc_stfdux() { void ppc_stfdux() {
ppc_grab_regsfpsiab(true); ppc_grab_regsfpsiab(true);
if (reg_a == 0) { if (reg_a == 0) {
ppc_effective_address = ppc_result_a + ppc_result_b; ppc_effective_address = ppc_result_a + ppc_result_b;
address_insert64bit_translate(ppc_state.ppc_fpr[reg_s].int64_r, ppc_effective_address); mem_write_qword(ppc_effective_address, ppc_state.ppc_fpr[reg_s].int64_r);
ppc_result_a = ppc_effective_address; ppc_result_a = ppc_effective_address;
ppc_store_result_rega(); ppc_store_result_rega();
} }
@ -1055,7 +1047,7 @@ void ppc_stfdux() {
void ppc_stfiwx() { void ppc_stfiwx() {
ppc_grab_regsfpsiab(true); ppc_grab_regsfpsiab(true);
ppc_effective_address = (reg_a == 0) ? ppc_result_b : ppc_result_a + ppc_result_b; ppc_effective_address = (reg_a == 0) ? ppc_result_b : ppc_result_a + ppc_result_b;
address_insert32bit_translate((uint32_t)(ppc_state.ppc_fpr[reg_s].int64_r), ppc_effective_address); mem_write_dword(ppc_effective_address, (uint32_t)(ppc_state.ppc_fpr[reg_s].int64_r));
} }
//Floating Point Register Transfer //Floating Point Register Transfer
@ -1239,4 +1231,4 @@ void ppc_fcmpu() {
if ((db_test_a == snan) || (db_test_b == snan)) { if ((db_test_a == snan) || (db_test_b == snan)) {
ppc_state.ppc_fpscr |= 0x1000000; ppc_state.ppc_fpscr |= 0x1000000;
} }
} }

View File

@ -404,7 +404,7 @@ static uint32_t ppc_mmu_addr_translate(uint32_t la, int is_write)
return pa; return pa;
} }
void address_insert8bit_translate(uint8_t value, uint32_t addr) void mem_write_byte(uint32_t addr, uint8_t value)
{ {
/* data address translation if enabled */ /* data address translation if enabled */
if (ppc_state.ppc_msr & 0x10) { if (ppc_state.ppc_msr & 0x10) {
@ -416,7 +416,7 @@ void address_insert8bit_translate(uint8_t value, uint32_t addr)
WRITE_PHYS_MEM(last_write_area, addr, WRITE_BYTE, value, 1); WRITE_PHYS_MEM(last_write_area, addr, WRITE_BYTE, value, 1);
} }
void address_insert16bit_translate(uint16_t value, uint32_t addr) void mem_write_word(uint32_t addr, uint16_t value)
{ {
/* data address translation if enabled */ /* data address translation if enabled */
if (ppc_state.ppc_msr & 0x10) { if (ppc_state.ppc_msr & 0x10) {
@ -426,7 +426,7 @@ void address_insert16bit_translate(uint16_t value, uint32_t addr)
WRITE_PHYS_MEM(last_write_area, addr, WRITE_WORD_BE_A, value, 2); WRITE_PHYS_MEM(last_write_area, addr, WRITE_WORD_BE_A, value, 2);
} }
void address_insert32bit_translate(uint32_t value, uint32_t addr) void mem_write_dword(uint32_t addr, uint32_t value)
{ {
/* data address translation if enabled */ /* data address translation if enabled */
if (ppc_state.ppc_msr & 0x10) { if (ppc_state.ppc_msr & 0x10) {
@ -436,7 +436,7 @@ void address_insert32bit_translate(uint32_t value, uint32_t addr)
WRITE_PHYS_MEM(last_write_area, addr, WRITE_DWORD_BE_A, value, 4); WRITE_PHYS_MEM(last_write_area, addr, WRITE_DWORD_BE_A, value, 4);
} }
void address_insert64bit_translate(uint64_t value, uint32_t addr) void mem_write_qword(uint32_t addr, uint64_t value)
{ {
/* data address translation if enabled */ /* data address translation if enabled */
if (ppc_state.ppc_msr & 0x10) { if (ppc_state.ppc_msr & 0x10) {
@ -447,7 +447,7 @@ void address_insert64bit_translate(uint64_t value, uint32_t addr)
} }
/** Grab a value from memory into a register */ /** Grab a value from memory into a register */
void address_grab8bit_translate(uint32_t addr) uint8_t mem_grab_byte(uint32_t addr)
{ {
uint8_t ret; uint8_t ret;
@ -457,10 +457,10 @@ void address_grab8bit_translate(uint32_t addr)
} }
READ_PHYS_MEM(last_read_area, addr, *, 1, 0xFFU); READ_PHYS_MEM(last_read_area, addr, *, 1, 0xFFU);
return_value = ret; return ret;
} }
void address_grab16bit_translate(uint32_t addr) uint16_t mem_grab_word(uint32_t addr)
{ {
uint16_t ret; uint16_t ret;
@ -470,10 +470,10 @@ void address_grab16bit_translate(uint32_t addr)
} }
READ_PHYS_MEM(last_read_area, addr, READ_WORD_BE_A, 2, 0xFFFFU); READ_PHYS_MEM(last_read_area, addr, READ_WORD_BE_A, 2, 0xFFFFU);
return_value = ret; return ret;
} }
void address_grab32bit_translate(uint32_t addr) uint32_t mem_grab_dword(uint32_t addr)
{ {
uint32_t ret; uint32_t ret;
@ -483,10 +483,10 @@ void address_grab32bit_translate(uint32_t addr)
} }
READ_PHYS_MEM(last_read_area, addr, READ_DWORD_BE_A, 4, 0xFFFFFFFFUL); READ_PHYS_MEM(last_read_area, addr, READ_DWORD_BE_A, 4, 0xFFFFFFFFUL);
return_value = ret; return ret;
} }
void address_grab64bit_translate(uint32_t addr) uint64_t mem_grab_qword(uint32_t addr)
{ {
uint64_t ret; uint64_t ret;
@ -496,7 +496,7 @@ void address_grab64bit_translate(uint32_t addr)
} }
READ_PHYS_MEM(last_read_area, addr, READ_QWORD_BE_A, 8, 0xFFFFFFFFFFFFFFFFULL); READ_PHYS_MEM(last_read_area, addr, READ_QWORD_BE_A, 8, 0xFFFFFFFFFFFFFFFFULL);
return_value = ret; return ret;
} }
uint8_t* quickinstruction_translate(uint32_t addr) uint8_t* quickinstruction_translate(uint32_t addr)

View File

@ -10,6 +10,7 @@
#ifndef PPCMEMORY_H #ifndef PPCMEMORY_H
#define PPCMEMORY_H #define PPCMEMORY_H
#include <cinttypes>
#include <vector> #include <vector>
#include <array> #include <array>
@ -30,14 +31,14 @@ extern void ibat_update(uint32_t bat_reg);
extern void dbat_update(uint32_t bat_reg); extern void dbat_update(uint32_t bat_reg);
extern void ppc_set_cur_instruction(const uint8_t* ptr); extern void ppc_set_cur_instruction(const uint8_t* ptr);
extern void address_insert8bit_translate(uint8_t value, uint32_t addr); extern void mem_write_byte(uint32_t addr, uint8_t value);
extern void address_insert16bit_translate(uint16_t value, uint32_t addr); extern void mem_write_word(uint32_t addr, uint16_t value);
extern void address_insert32bit_translate(uint32_t value, uint32_t addr); extern void mem_write_dword(uint32_t addr, uint32_t value);
extern void address_insert64bit_translate(uint64_t value, uint32_t addr); extern void mem_write_qword(uint32_t addr, uint64_t value);
extern void address_grab8bit_translate(uint32_t addr); extern uint8_t mem_grab_byte(uint32_t addr);
extern void address_grab16bit_translate(uint32_t addr); extern uint16_t mem_grab_word(uint32_t addr);
extern void address_grab32bit_translate(uint32_t addr); extern uint32_t mem_grab_dword(uint32_t addr);
extern void address_grab64bit_translate(uint32_t addr); extern uint64_t mem_grab_qword(uint32_t addr);
extern uint8_t* quickinstruction_translate(uint32_t address_grab); extern uint8_t* quickinstruction_translate(uint32_t address_grab);
#endif // PPCMEMORY_H #endif // PPCMEMORY_H

View File

@ -1308,7 +1308,7 @@ void ppc_mtmsr() {
void ppc_mfspr() { void ppc_mfspr() {
uint32_t ref_spr = (((ppc_cur_instruction >> 11) & 31) << 5) | ((ppc_cur_instruction >> 16) & 31); uint32_t ref_spr = (((ppc_cur_instruction >> 11) & 31) << 5) | ((ppc_cur_instruction >> 16) & 31);
#ifdef PROFILER #ifdef PROFILER
if (ref_spr > 31) { if (ref_spr > 31) {
supervisor_inst_num++; supervisor_inst_num++;
} }
@ -1321,7 +1321,7 @@ void ppc_mtspr() {
uint32_t ref_spr = (((ppc_cur_instruction >> 11) & 31) << 5) | ((ppc_cur_instruction >> 16) & 31); uint32_t ref_spr = (((ppc_cur_instruction >> 11) & 31) << 5) | ((ppc_cur_instruction >> 16) & 31);
reg_s = (ppc_cur_instruction >> 21) & 31; reg_s = (ppc_cur_instruction >> 21) & 31;
#ifdef PROFILER #ifdef PROFILER
if (ref_spr > 31) { if (ref_spr > 31) {
supervisor_inst_num++; supervisor_inst_num++;
} }
@ -1852,10 +1852,10 @@ void ppc_dcbz() {
if (!(ppc_state.ppc_pc & 32) && (ppc_state.ppc_pc < 0xFFFFFFE0UL)) { if (!(ppc_state.ppc_pc & 32) && (ppc_state.ppc_pc < 0xFFFFFFE0UL)) {
ppc_grab_regsdab(); ppc_grab_regsdab();
ppc_effective_address = (reg_a == 0) ? ppc_result_b : (ppc_result_a + ppc_result_b); ppc_effective_address = (reg_a == 0) ? ppc_result_b : (ppc_result_a + ppc_result_b);
address_insert64bit_translate(0, ppc_effective_address); mem_write_qword(ppc_effective_address, 0);
address_insert64bit_translate(0, (ppc_effective_address + 8)); mem_write_qword((ppc_effective_address + 8), 0);
address_insert64bit_translate(0, (ppc_effective_address + 16)); mem_write_qword((ppc_effective_address + 16), 0);
address_insert64bit_translate(0, (ppc_effective_address + 24)); mem_write_qword((ppc_effective_address + 24), 0);
} }
else { else {
ppc_exception_handler(Except_Type::EXC_ALIGNMENT, 0x00000); ppc_exception_handler(Except_Type::EXC_ALIGNMENT, 0x00000);
@ -1869,13 +1869,13 @@ void ppc_stb() {
ppc_grab_regssa(); ppc_grab_regssa();
ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF)); ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF));
ppc_effective_address += (reg_a > 0) ? ppc_result_a : 0; ppc_effective_address += (reg_a > 0) ? ppc_result_a : 0;
address_insert8bit_translate(ppc_result_d, ppc_effective_address); mem_write_byte(ppc_effective_address, ppc_result_d);
} }
void ppc_stbx() { void ppc_stbx() {
ppc_grab_regssab(); ppc_grab_regssab();
ppc_effective_address = (reg_a == 0) ? ppc_result_b : (ppc_result_a + ppc_result_b); ppc_effective_address = (reg_a == 0) ? ppc_result_b : (ppc_result_a + ppc_result_b);
address_insert8bit_translate(ppc_result_d, ppc_effective_address); mem_write_byte(ppc_effective_address, ppc_result_d);
} }
void ppc_stbu() { void ppc_stbu() {
@ -1883,7 +1883,7 @@ void ppc_stbu() {
if (reg_a != 0) { if (reg_a != 0) {
ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF)); ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF));
ppc_effective_address += ppc_result_a; ppc_effective_address += ppc_result_a;
address_insert8bit_translate(ppc_result_d, ppc_effective_address); mem_write_byte(ppc_effective_address, ppc_result_d);
ppc_state.ppc_gpr[reg_a] = ppc_effective_address; ppc_state.ppc_gpr[reg_a] = ppc_effective_address;
} }
else { else {
@ -1895,7 +1895,7 @@ void ppc_stbux() {
ppc_grab_regssab(); ppc_grab_regssab();
if (reg_a != 0) { if (reg_a != 0) {
ppc_effective_address = ppc_result_a + ppc_result_b; ppc_effective_address = ppc_result_a + ppc_result_b;
address_insert8bit_translate(ppc_result_d, ppc_effective_address); mem_write_byte(ppc_effective_address, ppc_result_d);
ppc_state.ppc_gpr[reg_a] = ppc_effective_address; ppc_state.ppc_gpr[reg_a] = ppc_effective_address;
} }
else { else {
@ -1907,7 +1907,7 @@ void ppc_sth() {
ppc_grab_regssa(); ppc_grab_regssa();
ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF)); ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF));
ppc_effective_address += (reg_a > 0) ? ppc_result_a : 0; ppc_effective_address += (reg_a > 0) ? ppc_result_a : 0;
address_insert16bit_translate(ppc_result_d, ppc_effective_address); mem_write_word(ppc_effective_address, ppc_result_d);
} }
void ppc_sthu() { void ppc_sthu() {
@ -1915,7 +1915,7 @@ void ppc_sthu() {
if (reg_a != 0) { if (reg_a != 0) {
ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF)); ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF));
ppc_effective_address += ppc_result_a; ppc_effective_address += ppc_result_a;
address_insert16bit_translate(ppc_result_d, ppc_effective_address); mem_write_word(ppc_effective_address, ppc_result_d);
ppc_state.ppc_gpr[reg_a] = ppc_effective_address; ppc_state.ppc_gpr[reg_a] = ppc_effective_address;
} }
else { else {
@ -1927,7 +1927,7 @@ void ppc_sthux() {
ppc_grab_regssab(); ppc_grab_regssab();
if (reg_a != 0) { if (reg_a != 0) {
ppc_effective_address = ppc_result_a + ppc_result_b; ppc_effective_address = ppc_result_a + ppc_result_b;
address_insert16bit_translate(ppc_result_d, ppc_effective_address); mem_write_word(ppc_effective_address, ppc_result_d);
ppc_state.ppc_gpr[reg_a] = ppc_effective_address; ppc_state.ppc_gpr[reg_a] = ppc_effective_address;
} }
else { else {
@ -1938,27 +1938,27 @@ void ppc_sthux() {
void ppc_sthx() { void ppc_sthx() {
ppc_grab_regssab(); ppc_grab_regssab();
ppc_effective_address = (reg_a == 0) ? ppc_result_b : (ppc_result_a + ppc_result_b); ppc_effective_address = (reg_a == 0) ? ppc_result_b : (ppc_result_a + ppc_result_b);
address_insert16bit_translate(ppc_result_d, ppc_effective_address); mem_write_word(ppc_effective_address, ppc_result_d);
} }
void ppc_sthbrx() { void ppc_sthbrx() {
ppc_grab_regssab(); ppc_grab_regssab();
ppc_effective_address = (reg_a == 0) ? ppc_result_b : (ppc_result_a + ppc_result_b); ppc_effective_address = (reg_a == 0) ? ppc_result_b : (ppc_result_a + ppc_result_b);
ppc_result_d = (uint32_t)(BYTESWAP_16((uint16_t)ppc_result_d)); ppc_result_d = (uint32_t)(BYTESWAP_16((uint16_t)ppc_result_d));
address_insert16bit_translate(ppc_result_d, ppc_effective_address); mem_write_word(ppc_effective_address, ppc_result_d);
} }
void ppc_stw() { void ppc_stw() {
ppc_grab_regssa(); ppc_grab_regssa();
ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF)); ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF));
ppc_effective_address += (reg_a > 0) ? ppc_result_a : 0; ppc_effective_address += (reg_a > 0) ? ppc_result_a : 0;
address_insert32bit_translate(ppc_result_d, ppc_effective_address); mem_write_dword(ppc_effective_address, ppc_result_d);
} }
void ppc_stwx() { void ppc_stwx() {
ppc_grab_regssab(); ppc_grab_regssab();
ppc_effective_address = (reg_a == 0) ? ppc_result_b : (ppc_result_a + ppc_result_b); ppc_effective_address = (reg_a == 0) ? ppc_result_b : (ppc_result_a + ppc_result_b);
address_insert32bit_translate(ppc_result_d, ppc_effective_address); mem_write_dword(ppc_effective_address, ppc_result_d);
} }
void ppc_stwcx() { void ppc_stwcx() {
@ -1966,7 +1966,7 @@ void ppc_stwcx() {
ppc_grab_regssab(); ppc_grab_regssab();
ppc_effective_address = (reg_a == 0) ? ppc_result_b : (ppc_result_a + ppc_result_b); ppc_effective_address = (reg_a == 0) ? ppc_result_b : (ppc_result_a + ppc_result_b);
if (ppc_state.ppc_reserve) { if (ppc_state.ppc_reserve) {
address_insert32bit_translate(ppc_result_d, ppc_effective_address); mem_write_dword(ppc_effective_address, ppc_result_d);
ppc_state.ppc_cr |= (ppc_state.ppc_spr[1] & 0x80000000) ? 0x30000000 : 0x20000000; ppc_state.ppc_cr |= (ppc_state.ppc_spr[1] & 0x80000000) ? 0x30000000 : 0x20000000;
ppc_state.ppc_reserve = false; ppc_state.ppc_reserve = false;
} }
@ -1980,7 +1980,7 @@ void ppc_stwu() {
if (reg_a != 0) { if (reg_a != 0) {
ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF)); ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF));
ppc_effective_address += ppc_result_a; ppc_effective_address += ppc_result_a;
address_insert32bit_translate(ppc_result_d, ppc_effective_address); mem_write_dword(ppc_effective_address, ppc_result_d);
ppc_state.ppc_gpr[reg_a] = ppc_effective_address; ppc_state.ppc_gpr[reg_a] = ppc_effective_address;
} }
else { else {
@ -1992,7 +1992,7 @@ void ppc_stwux() {
ppc_grab_regssab(); ppc_grab_regssab();
if (reg_a != 0) { if (reg_a != 0) {
ppc_effective_address = ppc_result_a + ppc_result_b; ppc_effective_address = ppc_result_a + ppc_result_b;
address_insert32bit_translate(ppc_result_d, ppc_effective_address); mem_write_dword(ppc_effective_address, ppc_result_d);
ppc_state.ppc_gpr[reg_a] = ppc_effective_address; ppc_state.ppc_gpr[reg_a] = ppc_effective_address;
} }
else { else {
@ -2004,7 +2004,7 @@ void ppc_stwbrx() {
ppc_grab_regssab(); ppc_grab_regssab();
ppc_effective_address = (reg_a == 0) ? ppc_result_b : (ppc_result_a + ppc_result_b); ppc_effective_address = (reg_a == 0) ? ppc_result_b : (ppc_result_a + ppc_result_b);
ppc_result_d = BYTESWAP_32(ppc_result_d); ppc_result_d = BYTESWAP_32(ppc_result_d);
address_insert32bit_translate(ppc_result_d, ppc_effective_address); mem_write_dword(ppc_effective_address, ppc_result_d);
} }
void ppc_stmw() { void ppc_stmw() {
@ -2013,7 +2013,7 @@ void ppc_stmw() {
ppc_effective_address += (reg_a > 0) ? ppc_result_a : 0; ppc_effective_address += (reg_a > 0) ? ppc_result_a : 0;
//How many words to store in memory - using a do-while for this //How many words to store in memory - using a do-while for this
do { do {
address_insert32bit_translate(ppc_result_d, ppc_effective_address); mem_write_dword(ppc_effective_address, ppc_result_d);
ppc_effective_address += 4; ppc_effective_address += 4;
reg_d++; reg_d++;
} while (reg_d < 32); } while (reg_d < 32);
@ -2023,9 +2023,7 @@ void ppc_lbz() {
ppc_grab_regsda(); ppc_grab_regsda();
ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF)); ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF));
ppc_effective_address += (reg_a > 0) ? ppc_result_a : 0; ppc_effective_address += (reg_a > 0) ? ppc_result_a : 0;
address_grab8bit_translate(ppc_effective_address); ppc_result_d = mem_grab_byte(ppc_effective_address);
ppc_result_d = (uint32_t)return_value;
return_value = 0;
ppc_store_result_regd(); ppc_store_result_regd();
} }
@ -2034,9 +2032,7 @@ void ppc_lbzu() {
ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF)); ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF));
if ((reg_a != reg_d) || reg_a != 0) { if ((reg_a != reg_d) || reg_a != 0) {
ppc_effective_address += ppc_result_a; ppc_effective_address += ppc_result_a;
address_grab8bit_translate(ppc_effective_address); ppc_result_d = mem_grab_byte(ppc_effective_address);
ppc_result_d = (uint32_t)return_value;
return_value = 0;
ppc_result_a = ppc_effective_address; ppc_result_a = ppc_effective_address;
ppc_store_result_regd(); ppc_store_result_regd();
ppc_store_result_rega(); ppc_store_result_rega();
@ -2049,9 +2045,7 @@ void ppc_lbzu() {
void ppc_lbzx() { void ppc_lbzx() {
ppc_grab_regsdab(); ppc_grab_regsdab();
ppc_effective_address = (reg_a == 0) ? ppc_result_b : (ppc_result_a + ppc_result_b); ppc_effective_address = (reg_a == 0) ? ppc_result_b : (ppc_result_a + ppc_result_b);
address_grab8bit_translate(ppc_effective_address); ppc_result_d = mem_grab_byte(ppc_effective_address);
ppc_result_d = (uint32_t)return_value;
return_value = 0;
ppc_store_result_regd(); ppc_store_result_regd();
} }
@ -2059,9 +2053,7 @@ void ppc_lbzux() {
ppc_grab_regsdab(); ppc_grab_regsdab();
if ((reg_a != reg_d) || reg_a != 0) { if ((reg_a != reg_d) || reg_a != 0) {
ppc_effective_address = ppc_result_a + ppc_result_b; ppc_effective_address = ppc_result_a + ppc_result_b;
address_grab8bit_translate(ppc_effective_address); ppc_result_d = mem_grab_byte(ppc_effective_address);
ppc_result_d = (uint32_t)return_value;
return_value = 0;
ppc_result_a = ppc_effective_address; ppc_result_a = ppc_effective_address;
ppc_store_result_regd(); ppc_store_result_regd();
ppc_store_result_rega(); ppc_store_result_rega();
@ -2076,9 +2068,7 @@ void ppc_lhz() {
ppc_grab_regsda(); ppc_grab_regsda();
ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF)); ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF));
ppc_effective_address += (reg_a > 0) ? ppc_result_a : 0; ppc_effective_address += (reg_a > 0) ? ppc_result_a : 0;
address_grab16bit_translate(ppc_effective_address); ppc_result_d = mem_grab_word(ppc_effective_address);
ppc_result_d = (uint32_t)return_value;
return_value = 0;
ppc_store_result_regd(); ppc_store_result_regd();
} }
@ -2087,9 +2077,7 @@ void ppc_lhzu() {
if ((reg_a != reg_d) || reg_a != 0) { if ((reg_a != reg_d) || reg_a != 0) {
ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF)); ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF));
ppc_effective_address += ppc_result_a; ppc_effective_address += ppc_result_a;
address_grab16bit_translate(ppc_effective_address); ppc_result_d = mem_grab_word(ppc_effective_address);
ppc_result_d = (uint32_t)return_value;
return_value = 0;
ppc_result_a = ppc_effective_address; ppc_result_a = ppc_effective_address;
ppc_store_result_regd(); ppc_store_result_regd();
ppc_store_result_rega(); ppc_store_result_rega();
@ -2102,9 +2090,7 @@ void ppc_lhzu() {
void ppc_lhzx() { void ppc_lhzx() {
ppc_grab_regsdab(); ppc_grab_regsdab();
ppc_effective_address = (reg_a == 0) ? ppc_result_b : (ppc_result_a + ppc_result_b); ppc_effective_address = (reg_a == 0) ? ppc_result_b : (ppc_result_a + ppc_result_b);
address_grab16bit_translate(ppc_effective_address); ppc_result_d = mem_grab_word(ppc_effective_address);
ppc_result_d = (uint32_t)return_value;
return_value = 0;
ppc_store_result_regd(); ppc_store_result_regd();
} }
@ -2112,9 +2098,7 @@ void ppc_lhzux() {
ppc_grab_regsdab(); ppc_grab_regsdab();
if ((reg_a != reg_d) || reg_a != 0) { if ((reg_a != reg_d) || reg_a != 0) {
ppc_effective_address = ppc_result_a + ppc_result_b; ppc_effective_address = ppc_result_a + ppc_result_b;
address_grab16bit_translate(ppc_effective_address); ppc_result_d = mem_grab_word(ppc_effective_address);
ppc_result_d = (uint32_t)return_value;
return_value = 0;
ppc_result_a = ppc_effective_address; ppc_result_a = ppc_effective_address;
ppc_store_result_regd(); ppc_store_result_regd();
ppc_store_result_rega(); ppc_store_result_rega();
@ -2128,17 +2112,14 @@ void ppc_lha() {
ppc_grab_regsda(); ppc_grab_regsda();
ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF)); ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF));
ppc_effective_address += (reg_a > 0) ? ppc_result_a : 0; ppc_effective_address += (reg_a > 0) ? ppc_result_a : 0;
address_grab16bit_translate(ppc_effective_address); uint16_t val = mem_grab_word(ppc_effective_address);
uint16_t go_this = (uint16_t)return_value; if (val & 0x8000) {
if (go_this & 0x8000) { ppc_result_d = 0xFFFF0000UL | (uint32_t)val;
ppc_result_d = 0xFFFF0000UL | (uint32_t)return_value;
ppc_store_result_regd();
} }
else { else {
ppc_result_d = (uint32_t)return_value; ppc_result_d = (uint32_t)val;
ppc_store_result_regd();
} }
return_value = 0; ppc_store_result_regd();
} }
void ppc_lhau() { void ppc_lhau() {
@ -2146,17 +2127,14 @@ void ppc_lhau() {
if ((reg_a != reg_d) || reg_a != 0) { if ((reg_a != reg_d) || reg_a != 0) {
ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF)); ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF));
ppc_effective_address += ppc_result_a; ppc_effective_address += ppc_result_a;
address_grab16bit_translate(ppc_effective_address); uint16_t val = mem_grab_word(ppc_effective_address);
uint16_t go_this = (uint16_t)return_value; if (val & 0x8000) {
if (go_this & 0x8000) { ppc_result_d = 0xFFFF0000UL | (uint32_t)val;
ppc_result_d = 0xFFFF0000UL | (uint32_t)return_value;
ppc_store_result_regd();
} }
else { else {
ppc_result_d = (uint32_t)return_value; ppc_result_d = (uint32_t)val;
ppc_store_result_regd();
} }
return_value = 0; ppc_store_result_regd();
ppc_result_a = ppc_effective_address; ppc_result_a = ppc_effective_address;
ppc_store_result_rega(); ppc_store_result_rega();
} }
@ -2168,17 +2146,14 @@ void ppc_lhau() {
void ppc_lhaux() { void ppc_lhaux() {
ppc_grab_regsdab(); ppc_grab_regsdab();
ppc_effective_address = (reg_a == 0) ? ppc_result_b : (ppc_result_a + ppc_result_b); ppc_effective_address = (reg_a == 0) ? ppc_result_b : (ppc_result_a + ppc_result_b);
address_grab16bit_translate(ppc_effective_address); uint16_t val = mem_grab_word(ppc_effective_address);
uint16_t go_this = (uint16_t)return_value; if (val & 0x8000) {
if (go_this & 0x8000) { ppc_result_d = 0xFFFF0000UL | (uint32_t)val;
ppc_result_d = 0xFFFF0000UL | (uint32_t)return_value;
ppc_store_result_regd();
} }
else { else {
ppc_result_d = (uint32_t)return_value; ppc_result_d = (uint32_t)val;
ppc_store_result_regd();
} }
return_value = 0; ppc_store_result_regd();
ppc_result_a = ppc_effective_address; ppc_result_a = ppc_effective_address;
ppc_store_result_rega(); ppc_store_result_rega();
} }
@ -2186,25 +2161,20 @@ void ppc_lhaux() {
void ppc_lhax() { void ppc_lhax() {
ppc_grab_regsdab(); ppc_grab_regsdab();
ppc_effective_address = (reg_a == 0) ? ppc_result_b : (ppc_result_a + ppc_result_b); ppc_effective_address = (reg_a == 0) ? ppc_result_b : (ppc_result_a + ppc_result_b);
address_grab16bit_translate(ppc_effective_address); uint16_t val = mem_grab_word(ppc_effective_address);
uint16_t go_this = (uint16_t)return_value; if (val & 0x8000) {
if (go_this & 0x8000) { ppc_result_d = 0xFFFF0000UL | (uint32_t)val;
ppc_result_d = 0xFFFF0000UL | (uint32_t)return_value;
ppc_store_result_regd();
} }
else { else {
ppc_result_d = (uint32_t)return_value; ppc_result_d = (uint32_t)val;
ppc_store_result_regd();
} }
return_value = 0; ppc_store_result_regd();
} }
void ppc_lhbrx() { void ppc_lhbrx() {
ppc_grab_regsdab(); ppc_grab_regsdab();
ppc_effective_address = (reg_a == 0) ? ppc_result_b : (ppc_result_a + ppc_result_b); ppc_effective_address = (reg_a == 0) ? ppc_result_b : (ppc_result_a + ppc_result_b);
address_grab16bit_translate(ppc_effective_address); ppc_result_d = (uint32_t)(BYTESWAP_16(mem_grab_word(ppc_effective_address)));
ppc_result_d = (uint32_t)(BYTESWAP_16((uint16_t)ppc_result_d));
return_value = 0;
ppc_store_result_regd(); ppc_store_result_regd();
} }
@ -2212,18 +2182,14 @@ void ppc_lwz() {
ppc_grab_regsda(); ppc_grab_regsda();
ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF)); ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF));
ppc_effective_address += (reg_a > 0) ? ppc_result_a : 0; ppc_effective_address += (reg_a > 0) ? ppc_result_a : 0;
address_grab32bit_translate(ppc_effective_address); ppc_result_d = mem_grab_dword(ppc_effective_address);
ppc_result_d = (uint32_t)return_value;
return_value = 0;
ppc_store_result_regd(); ppc_store_result_regd();
} }
void ppc_lwbrx() { void ppc_lwbrx() {
ppc_grab_regsdab(); ppc_grab_regsdab();
ppc_effective_address = (reg_a == 0) ? ppc_result_b : (ppc_result_a + ppc_result_b); ppc_effective_address = (reg_a == 0) ? ppc_result_b : (ppc_result_a + ppc_result_b);
address_grab32bit_translate(ppc_effective_address); ppc_result_d = BYTESWAP_32(mem_grab_dword(ppc_effective_address));
ppc_result_d = BYTESWAP_32((uint32_t)return_value);
return_value = 0;
ppc_store_result_regd(); ppc_store_result_regd();
} }
@ -2232,9 +2198,7 @@ void ppc_lwzu() {
ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF)); ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF));
if ((reg_a != reg_d) || reg_a != 0) { if ((reg_a != reg_d) || reg_a != 0) {
ppc_effective_address += ppc_result_a; ppc_effective_address += ppc_result_a;
address_grab32bit_translate(ppc_effective_address); ppc_result_d = mem_grab_dword(ppc_effective_address);
ppc_result_d = (uint32_t)return_value;
return_value = 0;
ppc_store_result_regd(); ppc_store_result_regd();
ppc_result_a = ppc_effective_address; ppc_result_a = ppc_effective_address;
ppc_store_result_rega(); ppc_store_result_rega();
@ -2247,9 +2211,7 @@ void ppc_lwzu() {
void ppc_lwzx() { void ppc_lwzx() {
ppc_grab_regsdab(); ppc_grab_regsdab();
ppc_effective_address = (reg_a == 0) ? ppc_result_b : (ppc_result_a + ppc_result_b); ppc_effective_address = (reg_a == 0) ? ppc_result_b : (ppc_result_a + ppc_result_b);
address_grab32bit_translate(ppc_effective_address); ppc_result_d = mem_grab_dword(ppc_effective_address);
ppc_result_d = (uint32_t)return_value;
return_value = 0;
ppc_store_result_regd(); ppc_store_result_regd();
} }
@ -2261,9 +2223,7 @@ void ppc_lwzux() {
else { else {
ppc_exception_handler(Except_Type::EXC_PROGRAM, 0x20000); ppc_exception_handler(Except_Type::EXC_PROGRAM, 0x20000);
} }
address_grab32bit_translate(ppc_effective_address); ppc_result_d = mem_grab_dword(ppc_effective_address);
ppc_result_d = (uint32_t)return_value;
return_value = 0;
ppc_result_a = ppc_effective_address; ppc_result_a = ppc_effective_address;
ppc_store_result_regd(); ppc_store_result_regd();
ppc_store_result_rega(); ppc_store_result_rega();
@ -2274,9 +2234,7 @@ void ppc_lwarx() {
ppc_grab_regsdab(); ppc_grab_regsdab();
ppc_effective_address = (reg_a == 0) ? ppc_result_b : (ppc_result_a + ppc_result_b); ppc_effective_address = (reg_a == 0) ? ppc_result_b : (ppc_result_a + ppc_result_b);
ppc_state.ppc_reserve = true; ppc_state.ppc_reserve = true;
address_grab32bit_translate(ppc_effective_address); ppc_result_d = mem_grab_dword(ppc_effective_address);
ppc_result_d = (uint32_t)return_value;
return_value = 0;
ppc_store_result_regd(); ppc_store_result_regd();
} }
@ -2286,9 +2244,7 @@ void ppc_lmw() {
ppc_effective_address += (reg_a > 0) ? ppc_result_a : 0; ppc_effective_address += (reg_a > 0) ? ppc_result_a : 0;
//How many words to load in memory - using a do-while for this //How many words to load in memory - using a do-while for this
do { do {
address_grab32bit_translate(ppc_effective_address); ppc_state.ppc_gpr[reg_d] = mem_grab_dword(ppc_effective_address);
ppc_state.ppc_gpr[reg_d] = (uint32_t)return_value;
return_value = 0;
ppc_effective_address += 4; ppc_effective_address += 4;
reg_d++; reg_d++;
} while (reg_d < 32); } while (reg_d < 32);
@ -2305,28 +2261,24 @@ void ppc_lswi() {
while (grab_inb > 0) { while (grab_inb > 0) {
switch (shift_times) { switch (shift_times) {
case 0: case 0:
address_grab8bit_translate(ppc_effective_address);; ppc_state.ppc_gpr[reg_d] = (ppc_result_d & 0x00FFFFFFUL) |
ppc_state.ppc_gpr[reg_d] = (ppc_result_d & 0x00FFFFFFUL) | ((uint32_t)return_value << 24); (mem_grab_byte(ppc_effective_address) << 24);
ppc_store_result_regd(); ppc_store_result_regd();
return_value = 0;
break; break;
case 1: case 1:
address_grab8bit_translate(ppc_effective_address);; ppc_result_d = (ppc_result_d & 0xFF00FFFFUL) |
ppc_result_d = (ppc_result_d & 0xFF00FFFFUL) | ((uint32_t)return_value << 16); (mem_grab_byte(ppc_effective_address) << 16);
ppc_store_result_regd(); ppc_store_result_regd();
return_value = 0;
break; break;
case 2: case 2:
address_grab8bit_translate(ppc_effective_address);; ppc_result_d = (ppc_result_d & 0xFFFF00FFUL) |
ppc_result_d = (ppc_result_d & 0xFFFF00FFUL) | ((uint32_t)return_value << 8); (mem_grab_byte(ppc_effective_address) << 8);
ppc_store_result_regd(); ppc_store_result_regd();
return_value = 0;
break; break;
case 3: case 3:
address_grab8bit_translate(ppc_effective_address);; ppc_result_d = (ppc_result_d & 0xFFFFFF00UL) |
ppc_result_d = (ppc_result_d & 0xFFFFFF00UL) | (uint32_t)return_value; mem_grab_byte(ppc_effective_address);
ppc_store_result_regd(); ppc_store_result_regd();
return_value = 0;
break; break;
default: default:
printf("Something really horrible happened with lswi."); printf("Something really horrible happened with lswi.");
@ -2338,7 +2290,6 @@ void ppc_lswi() {
else { else {
shift_times++; shift_times++;
} }
return_value = 0;
ppc_effective_address++; ppc_effective_address++;
grab_inb--; grab_inb--;
} }
@ -2359,28 +2310,24 @@ void ppc_lswx() {
while (grab_inb > 0) { while (grab_inb > 0) {
switch (shift_times) { switch (shift_times) {
case 0: case 0:
address_grab8bit_translate(ppc_effective_address);; ppc_result_d = (ppc_result_d & 0x00FFFFFFUL) |
ppc_result_d = (ppc_result_d & 0x00FFFFFFUL) | ((uint32_t)return_value << 24); (mem_grab_byte(ppc_effective_address) << 24);
ppc_store_result_regd(); ppc_store_result_regd();
return_value = 0;
break; break;
case 1: case 1:
address_grab8bit_translate(ppc_effective_address);; ppc_result_d = (ppc_result_d & 0xFF00FFFFUL) |
ppc_result_d = (ppc_result_d & 0xFF00FFFFUL) | ((uint32_t)return_value << 16); (mem_grab_byte(ppc_effective_address) << 16);
ppc_store_result_regd(); ppc_store_result_regd();
return_value = 0;
break; break;
case 2: case 2:
address_grab8bit_translate(ppc_effective_address);; ppc_result_d = (ppc_result_d & 0xFFFF00FFUL) |
ppc_result_d = (ppc_result_d & 0xFFFF00FFUL) | ((uint32_t)return_value << 8); (mem_grab_byte(ppc_effective_address) << 8);
ppc_store_result_regd(); ppc_store_result_regd();
return_value = 0;
break; break;
case 3: case 3:
address_grab8bit_translate(ppc_effective_address);; ppc_result_d = (ppc_result_d & 0xFFFFFF00UL) |
ppc_result_d = (ppc_result_d & 0xFFFFFF00UL) | (uint32_t)return_value; mem_grab_byte(ppc_effective_address);
ppc_store_result_regd(); ppc_store_result_regd();
return_value = 0;
break; break;
default: default:
printf("Something really horrible happened with lswx."); printf("Something really horrible happened with lswx.");
@ -2392,7 +2339,6 @@ void ppc_lswx() {
else { else {
shift_times++; shift_times++;
} }
return_value = 0;
ppc_effective_address++; ppc_effective_address++;
grab_inb--; grab_inb--;
} }
@ -2409,19 +2355,19 @@ void ppc_stswi() {
switch (shift_times) { switch (shift_times) {
case 0: case 0:
strwrd_replace_value = (ppc_result_d >> 24); strwrd_replace_value = (ppc_result_d >> 24);
address_insert8bit_translate(strwrd_replace_value, ppc_effective_address); mem_write_byte(ppc_effective_address, strwrd_replace_value);
break; break;
case 1: case 1:
strwrd_replace_value = (ppc_result_d >> 16); strwrd_replace_value = (ppc_result_d >> 16);
address_insert8bit_translate(strwrd_replace_value, ppc_effective_address); mem_write_byte(ppc_effective_address, strwrd_replace_value);
break; break;
case 2: case 2:
strwrd_replace_value = (ppc_result_d >> 8); strwrd_replace_value = (ppc_result_d >> 8);
address_insert8bit_translate(strwrd_replace_value, ppc_effective_address); mem_write_byte(ppc_effective_address, strwrd_replace_value);
break; break;
case 3: case 3:
strwrd_replace_value = (ppc_result_d); strwrd_replace_value = (ppc_result_d);
address_insert8bit_translate(strwrd_replace_value, ppc_effective_address); mem_write_byte(ppc_effective_address, strwrd_replace_value);
break; break;
default: default:
printf("Something really horrible happened with stswi."); printf("Something really horrible happened with stswi.");
@ -2433,7 +2379,6 @@ void ppc_stswi() {
else { else {
shift_times++; shift_times++;
} }
return_value = 0;
ppc_effective_address++; ppc_effective_address++;
grab_inb--; grab_inb--;
} }
@ -2448,19 +2393,19 @@ void ppc_stswx() {
switch (shift_times) { switch (shift_times) {
case 0: case 0:
strwrd_replace_value = (ppc_result_d >> 24); strwrd_replace_value = (ppc_result_d >> 24);
address_insert8bit_translate(strwrd_replace_value, ppc_effective_address); mem_write_byte(ppc_effective_address, strwrd_replace_value);
break; break;
case 1: case 1:
strwrd_replace_value = (ppc_result_d >> 16); strwrd_replace_value = (ppc_result_d >> 16);
address_insert8bit_translate(strwrd_replace_value, ppc_effective_address); mem_write_byte(ppc_effective_address, strwrd_replace_value);
break; break;
case 2: case 2:
strwrd_replace_value = (ppc_result_d >> 8); strwrd_replace_value = (ppc_result_d >> 8);
address_insert8bit_translate(strwrd_replace_value, ppc_effective_address); mem_write_byte(ppc_effective_address, strwrd_replace_value);
break; break;
case 3: case 3:
strwrd_replace_value = (ppc_result_d); strwrd_replace_value = (ppc_result_d);
address_insert8bit_translate(strwrd_replace_value, ppc_effective_address); mem_write_byte(ppc_effective_address, strwrd_replace_value);
break; break;
default: default:
printf("Something really horrible happened with stswx."); printf("Something really horrible happened with stswx.");
@ -2472,7 +2417,6 @@ void ppc_stswx() {
else { else {
shift_times++; shift_times++;
} }
return_value = 0;
ppc_effective_address++; ppc_effective_address++;
grab_inb--; grab_inb--;
} }
@ -2517,4 +2461,4 @@ void ppc_tlbsync() {
supervisor_inst_num++; supervisor_inst_num++;
#endif #endif
printf("Placeholder for tlbsync \n"); printf("Placeholder for tlbsync \n");
} }

View File

@ -68,8 +68,6 @@ uint32_t ppc_effective_address;
uint32_t ppc_real_address; uint32_t ppc_real_address;
uint32_t ppc_next_instruction_address; //Used for branching, setting up the NIA uint32_t ppc_next_instruction_address; //Used for branching, setting up the NIA
uint64_t return_value;
MemCtrlBase *mem_ctrl_instance = 0; MemCtrlBase *mem_ctrl_instance = 0;
HeathrowIC *heathrow = 0; HeathrowIC *heathrow = 0;
GossamerID *machine_id; GossamerID *machine_id;