From 112f2265d686959a567fbf1eb1b074fa8976df9e Mon Sep 17 00:00:00 2001 From: Maxim Poliakovski Date: Fri, 19 Jul 2019 19:00:18 +0200 Subject: [PATCH 1/3] ppcopcodes: fix mfsr, mfsrin, mtsrin and mtmsr emulation. --- ppcopcodes.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/ppcopcodes.cpp b/ppcopcodes.cpp index e4cb034..522be92 100644 --- a/ppcopcodes.cpp +++ b/ppcopcodes.cpp @@ -129,7 +129,7 @@ void ppc_grab_regssa(){ void ppc_grab_regssb(){ reg_s = (ppc_cur_instruction >> 21) & 31; - reg_b = (ppc_cur_instruction >> 16) & 31; + reg_b = (ppc_cur_instruction >> 11) & 31; ppc_result_d = ppc_state.ppc_gpr[reg_s]; ppc_result_b = ppc_state.ppc_gpr[reg_b]; } @@ -1358,7 +1358,7 @@ void ppc_mtsr(){ void ppc_mtsrin(){ if ((ppc_state.ppc_msr & 0x4000) == 0){ ppc_grab_regssb(); - grab_sr = ppc_result_b & 15; + grab_sr = ppc_result_b >> 28; ppc_state.ppc_sr[grab_sr] = ppc_result_d; } } @@ -1368,16 +1368,14 @@ void ppc_mfsr(){ reg_d = (ppc_cur_instruction >> 21) & 31; grab_sr = (ppc_cur_instruction >> 16) & 15; ppc_state.ppc_gpr[reg_d] = ppc_state.ppc_sr[grab_sr]; - ppc_store_result_regd(); } } void ppc_mfsrin(){ if ((ppc_state.ppc_msr & 0x4000) == 0){ ppc_grab_regssb(); - grab_sr = ppc_result_b & 15; + grab_sr = ppc_result_b >> 28; ppc_state.ppc_gpr[reg_d] = ppc_state.ppc_sr[grab_sr]; - ppc_store_result_regd(); } } @@ -1391,7 +1389,7 @@ void ppc_mfmsr(){ void ppc_mtmsr(){ //if ((ppc_state.ppc_msr && 0x4000) == 0){ reg_s = (ppc_cur_instruction >> 21) & 31; - ppc_state.ppc_msr = ppc_state.ppc_spr[reg_s]; + ppc_state.ppc_msr = ppc_state.ppc_gpr[reg_s]; msr_status_update(); //} } From 2417204b5f46b843dcc32ce666ac30a54d218edf Mon Sep 17 00:00:00 2001 From: Maxim Poliakovski Date: Fri, 19 Jul 2019 20:52:59 +0200 Subject: [PATCH 2/3] main: use correct variable for PC updates. --- main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main.cpp b/main.cpp index 3e9e2a6..cb0d302 100644 --- a/main.cpp +++ b/main.cpp @@ -790,7 +790,7 @@ int main(int argc, char **argv) quickinstruction_translate(ppc_state.ppc_pc); ppc_main_opcode(); if (grab_branch & !grab_exception){ - ppc_state.ppc_pc = ppc_effective_address; + ppc_state.ppc_pc = ppc_next_instruction_address; grab_branch = 0; ppc_tbr_update(); } @@ -833,7 +833,7 @@ int main(int argc, char **argv) quickinstruction_translate(ppc_state.ppc_pc); ppc_main_opcode(); if (grab_branch & !grab_exception){ - ppc_state.ppc_pc = ppc_effective_address; + ppc_state.ppc_pc = ppc_next_instruction_address; grab_branch = 0; ppc_tbr_update(); } From c89d3545cd18cea4d665eff433c1f96857a17d7b Mon Sep 17 00:00:00 2001 From: Maxim Poliakovski Date: Fri, 19 Jul 2019 22:33:28 +0200 Subject: [PATCH 3/3] Simplify initialization of ppc_cur_instruction. --- debugger.cpp | 1 - main.cpp | 4 ---- ppcmemory.cpp | 2 +- 3 files changed, 1 insertion(+), 6 deletions(-) diff --git a/debugger.cpp b/debugger.cpp index 3010aeb..9fd916c 100644 --- a/debugger.cpp +++ b/debugger.cpp @@ -54,7 +54,6 @@ void execute_single_instr() ppc_state.ppc_pc += 4; ppc_tbr_update(); } - ppc_cur_instruction = 0; } void execute_until(uint32_t goal_addr) diff --git a/main.cpp b/main.cpp index cb0d302..727c51f 100644 --- a/main.cpp +++ b/main.cpp @@ -358,7 +358,6 @@ void execute_interpreter(){ ppc_state.ppc_pc += 4; ppc_tbr_update(); } - ppc_cur_instruction = 0; } } @@ -775,7 +774,6 @@ int main(int argc, char **argv) ppc_state.ppc_pc += 4; ppc_tbr_update(); } - ppc_cur_instruction = 0; } } else if ((checker=="stepp")|(checker=="/stepp")|(checker=="-stepp")){ @@ -804,7 +802,6 @@ int main(int argc, char **argv) ppc_state.ppc_pc += 4; ppc_tbr_update(); } - ppc_cur_instruction = 0; } } } @@ -847,7 +844,6 @@ int main(int argc, char **argv) ppc_state.ppc_pc += 4; ppc_tbr_update(); } - ppc_cur_instruction = 0; } } } else if (checker == "debugger") { diff --git a/ppcmemory.cpp b/ppcmemory.cpp index 347a847..ec92a22 100644 --- a/ppcmemory.cpp +++ b/ppcmemory.cpp @@ -109,7 +109,7 @@ void msr_status_update(){ } void ppc_set_cur_instruction(uint32_t mem_index){ - ppc_cur_instruction += (grab_macmem_ptr[mem_index]) << 24; + ppc_cur_instruction = (grab_macmem_ptr[mem_index]) << 24; ++mem_index; ppc_cur_instruction += (grab_macmem_ptr[mem_index]) << 16; ++mem_index;