Moving disasm to new tables.
Also adding useful CPU docs.
This commit is contained in:
@@ -19,11 +19,12 @@
|
||||
#include "xenia/base/debugging.h"
|
||||
#include "xenia/base/filesystem.h"
|
||||
#include "xenia/base/logging.h"
|
||||
#include "xenia/base/math.h"
|
||||
#include "xenia/base/string.h"
|
||||
#include "xenia/base/threading.h"
|
||||
#include "xenia/cpu/backend/code_cache.h"
|
||||
#include "xenia/cpu/function.h"
|
||||
#include "xenia/cpu/ppc/ppc_instr.h"
|
||||
#include "xenia/cpu/ppc/ppc_decode_data.h"
|
||||
#include "xenia/cpu/ppc/ppc_opcode_info.h"
|
||||
#include "xenia/cpu/processor.h"
|
||||
#include "xenia/cpu/stack_walker.h"
|
||||
@@ -691,11 +692,11 @@ bool TestPpcCondition(const xe::cpu::ppc::PPCContext* context, uint32_t bo,
|
||||
uint32_t bi, bool check_ctr, bool check_cond) {
|
||||
bool ctr_ok = true;
|
||||
if (check_ctr) {
|
||||
if (xe::cpu::ppc::select_bits(bo, 2, 2)) {
|
||||
if (select_bits(bo, 2, 2)) {
|
||||
ctr_ok = true;
|
||||
} else {
|
||||
uint32_t new_ctr_value = static_cast<uint32_t>(context->ctr - 1);
|
||||
if (xe::cpu::ppc::select_bits(bo, 1, 1)) {
|
||||
if (select_bits(bo, 1, 1)) {
|
||||
ctr_ok = new_ctr_value == 0;
|
||||
} else {
|
||||
ctr_ok = new_ctr_value != 0;
|
||||
@@ -704,12 +705,12 @@ bool TestPpcCondition(const xe::cpu::ppc::PPCContext* context, uint32_t bo,
|
||||
}
|
||||
bool cond_ok = true;
|
||||
if (check_cond) {
|
||||
if (xe::cpu::ppc::select_bits(bo, 4, 4)) {
|
||||
if (select_bits(bo, 4, 4)) {
|
||||
cond_ok = true;
|
||||
} else {
|
||||
uint8_t cr = *(reinterpret_cast<const uint8_t*>(&context->cr0) +
|
||||
(4 * (bi >> 2)) + (bi & 3));
|
||||
if (xe::cpu::ppc::select_bits(bo, 3, 3)) {
|
||||
if (select_bits(bo, 3, 3)) {
|
||||
cond_ok = cr != 0;
|
||||
} else {
|
||||
cond_ok = cr == 0;
|
||||
@@ -721,44 +722,40 @@ bool TestPpcCondition(const xe::cpu::ppc::PPCContext* context, uint32_t bo,
|
||||
|
||||
uint32_t Debugger::CalculateNextGuestInstruction(
|
||||
ThreadExecutionInfo* thread_info, uint32_t current_pc) {
|
||||
xe::cpu::ppc::InstrData i;
|
||||
i.address = current_pc;
|
||||
i.code = xe::load_and_swap<uint32_t>(
|
||||
emulator_->memory()->TranslateVirtual(i.address));
|
||||
auto opcode = xe::cpu::ppc::LookupOpcode(i.code);
|
||||
if (i.code == 0x4E800020) {
|
||||
xe::cpu::ppc::PPCDecodeData d;
|
||||
d.address = current_pc;
|
||||
d.code = xe::load_and_swap<uint32_t>(
|
||||
emulator_->memory()->TranslateVirtual(d.address));
|
||||
auto opcode = xe::cpu::ppc::LookupOpcode(d.code);
|
||||
if (d.code == 0x4E800020) {
|
||||
// blr -- unconditional branch to LR.
|
||||
uint32_t target_pc = static_cast<uint32_t>(thread_info->guest_context.lr);
|
||||
return target_pc;
|
||||
} else if (i.code == 0x4E800420) {
|
||||
} else if (d.code == 0x4E800420) {
|
||||
// bctr -- unconditional branch to CTR.
|
||||
uint32_t target_pc = static_cast<uint32_t>(thread_info->guest_context.ctr);
|
||||
return target_pc;
|
||||
} else if (opcode == PPCOpcode::bx) {
|
||||
// b/ba/bl/bla
|
||||
uint32_t target_pc =
|
||||
static_cast<uint32_t>(xe::cpu::ppc::XEEXTS26(i.I.LI << 2)) +
|
||||
(i.I.AA ? 0u : i.address);
|
||||
uint32_t target_pc = d.I.ADDR();
|
||||
return target_pc;
|
||||
} else if (opcode == PPCOpcode::bcx) {
|
||||
// bc/bca/bcl/bcla
|
||||
uint32_t target_pc =
|
||||
static_cast<uint32_t>(xe::cpu::ppc::XEEXTS16(i.B.BD << 2)) +
|
||||
(i.B.AA ? 0u : i.address);
|
||||
bool test_passed = TestPpcCondition(&thread_info->guest_context, i.B.BO,
|
||||
i.B.BI, true, true);
|
||||
uint32_t target_pc = d.B.ADDR();
|
||||
bool test_passed = TestPpcCondition(&thread_info->guest_context, d.B.BO(),
|
||||
d.B.BI(), true, true);
|
||||
return test_passed ? target_pc : current_pc + 4;
|
||||
} else if (opcode == PPCOpcode::bclrx) {
|
||||
// bclr/bclrl
|
||||
uint32_t target_pc = static_cast<uint32_t>(thread_info->guest_context.lr);
|
||||
bool test_passed = TestPpcCondition(&thread_info->guest_context, i.XL.BO,
|
||||
i.XL.BI, true, true);
|
||||
bool test_passed = TestPpcCondition(&thread_info->guest_context, d.XL.BO(),
|
||||
d.XL.BI(), true, true);
|
||||
return test_passed ? target_pc : current_pc + 4;
|
||||
} else if (opcode == PPCOpcode::bcctrx) {
|
||||
// bcctr/bcctrl
|
||||
uint32_t target_pc = static_cast<uint32_t>(thread_info->guest_context.ctr);
|
||||
bool test_passed = TestPpcCondition(&thread_info->guest_context, i.XL.BO,
|
||||
i.XL.BI, false, true);
|
||||
bool test_passed = TestPpcCondition(&thread_info->guest_context, d.XL.BO(),
|
||||
d.XL.BI(), false, true);
|
||||
return test_passed ? target_pc : current_pc + 4;
|
||||
} else {
|
||||
return current_pc + 4;
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
#include "xenia/base/platform.h"
|
||||
#include "xenia/base/string_util.h"
|
||||
#include "xenia/base/threading.h"
|
||||
#include "xenia/cpu/ppc/ppc_disasm.h"
|
||||
#include "xenia/cpu/ppc/ppc_opcode_info.h"
|
||||
#include "xenia/cpu/stack_walker.h"
|
||||
#include "xenia/gpu/graphics_system.h"
|
||||
#include "xenia/kernel/xmodule.h"
|
||||
@@ -571,7 +571,7 @@ void DebugWindow::DrawMachineCodeSource(const uint8_t* machine_code_ptr,
|
||||
|
||||
ImGui::Text(" %c ", is_current_instr ? '>' : ' ');
|
||||
ImGui::SameLine();
|
||||
ImGui::Text(" %.8X %-8s %s", uint32_t(insn.address), insn.mnemonic,
|
||||
ImGui::Text(" %.8X %-10s %s", uint32_t(insn.address), insn.mnemonic,
|
||||
insn.op_str);
|
||||
|
||||
if (is_current_instr) {
|
||||
|
||||
Reference in New Issue
Block a user