Exemplo n.º 1
0
void InterpreterDisAsmFrame::Task()
{
	if(!CPU) return;
	wxGetApp().SendDbgCommand(DID_RESUME_THREAD, CPU);
	wxGetApp().SendDbgCommand(DID_RESUMED_THREAD, CPU);
	bool dump_status = dump_enable;

	//CPU.InitTls();

	try
	{
		do
		{
			CPU->ExecOnce();
		}
		while(CPU->IsRunning() && Emu.IsRunning() && !TestDestroy() && !IsBreakPoint(CPU->PC) && dump_status == dump_enable);
	}
	catch(const wxString& e)
	{
		ConLog.Error(e);
	}
	catch(...)
	{
		ConLog.Error("Unhandled exception.");
	}

	//CPU.FreeTls();

	wxGetApp().SendDbgCommand(DID_PAUSE_THREAD, CPU);
	wxGetApp().SendDbgCommand(DID_PAUSED_THREAD, CPU);
}
Exemplo n.º 2
0
void InterpreterDisAsmFrame::ShowAddr(u32 addr)
{
	m_pc = addr;
	m_list->Freeze();

	if (!cpu)
	{
		for (uint i = 0; i<m_item_count; ++i, m_pc += 4)
		{
			m_list->SetItem(i, 0, wxString::Format("[%08x] illegal address", m_pc));
		}
	}
	else
	{
		const u32 cpu_offset = cpu->type == cpu_type::spu ? static_cast<SPUThread&>(*cpu).offset : 0;
		m_disasm->offset = (u8*)vm::base(cpu_offset);
		for (uint i = 0, count = 4; i<m_item_count; ++i, m_pc += count)
		{
			if (!vm::check_addr(cpu_offset + m_pc, 4))
			{
				m_list->SetItem(i, 0, wxString(IsBreakPoint(m_pc) ? ">>> " : "    ") + wxString::Format("[%08x] illegal address", m_pc));
				count = 4;
				continue;
			}

			count = m_disasm->disasm(m_disasm->dump_pc = m_pc);

			m_list->SetItem(i, 0, wxString(IsBreakPoint(m_pc) ? ">>> " : "    ") + fmt::FromUTF8(m_disasm->last_opcode));

			wxColour colour;

			if (cpu->state.test(cpu_state_pause) && m_pc == GetPc())
			{
				colour = wxColour("Green");
			}
			else
			{
				colour = wxColour(IsBreakPoint(m_pc) ? "Wheat" : "White");
			}

			m_list->SetItemBackgroundColour(i, colour);
		}
	}

	m_list->SetColumnWidth(0, -1);
	m_list->Thaw();
}
Exemplo n.º 3
0
void InterpreterDisAsmFrame::DClick(wxListEvent& event)
{
	long i = m_list->GetFirstSelected();
	if (i < 0) return;

	const u32 start_pc = m_pc - m_item_count * 4;
	const u32 pc = start_pc + i * 4;
	//ConLog.Write("pc=0x%llx", pc);

	if (IsBreakPoint(pc))
	{
		RemoveBreakPoint(pc);
	}
	else
	{
		AddBreakPoint(pc);
	}

	ShowAddr(start_pc);
}
Exemplo n.º 4
0
void InterpreterDisAsmFrame::ShowAddr(const u64 addr)
{
	PC = addr;
	m_list->Freeze();

	if(!CPU)
	{
		for(uint i=0; i<m_item_count; ++i, PC += 4)
		{
			m_list->SetItem(i, 0, wxString::Format("[%08llx] illegal address", PC));
		}
	}
	else
	{
		disasm->offset = CPU->GetOffset();
		for(uint i=0; i<m_item_count; ++i, PC += 4)
		{
			if(!Memory.IsGoodAddr(CPU->GetOffset() + PC, 4))
			{
				m_list->SetItem(i, 0, wxString::Format("[%08llx] illegal address", PC));
				continue;
			}

			disasm->dump_pc = PC;
			decoder->Decode(Memory.Read32(CPU->GetOffset() + PC));

			if(IsBreakPoint(PC))
			{
				m_list->SetItem(i, 0, ">>> " + disasm->last_opcode);
			}
			else
			{
				m_list->SetItem(i, 0, "    " + disasm->last_opcode);
			}

			wxColour colour;

		if((!CPU->IsRunning() || !Emu.IsRunning()) && PC == CPU->PC)
		{
			colour = wxColour("Green");
		}
		else
		{
			colour = wxColour("White");

				for(u32 i=0; i<Emu.GetMarkedPoints().GetCount(); ++i)
				{
					if(Emu.GetMarkedPoints()[i] == PC)
					{
						colour = wxColour("Wheat");
						break;
					}
				}
			}

			m_list->SetItemBackgroundColour( i, colour );
		}
	}

	while(remove_markedPC.GetCount())
	{
		u32 mpc = remove_markedPC[0];

		for(u32 i=0; i<remove_markedPC.GetCount(); ++i)
		{
			if(remove_markedPC[i] == mpc)
			{
				remove_markedPC.RemoveAt(i--);
				continue;
			}

			if(remove_markedPC[i] > mpc) remove_markedPC[i]--;
		}

		Emu.GetMarkedPoints().RemoveAt(mpc);
	}

	m_list->SetColumnWidth(0, -1);
	m_list->Thaw();
}
Exemplo n.º 5
0
void InterpreterDisAsmFrame::ShowAddr(const u64 addr)
{
	PC = addr;
	m_list->Freeze();

	if(!CPU)
	{
		for(uint i=0; i<m_item_count; ++i, PC += 4)
		{
			m_list->SetItem(i, 0, wxString::Format("[%08llx] illegal address", PC));
		}
	}
	else
	{
		disasm->offset = vm::get_ptr<u8>(CPU->get_offset());
		for(uint i=0, count = 4; i<m_item_count; ++i, PC += count)
		{
			if(!vm::check_addr(CPU->get_offset() + PC, 4))
			{
				m_list->SetItem(i, 0, wxString(IsBreakPoint(PC) ? ">>> " : "    ") + wxString::Format("[%08llx] illegal address", PC));
				count = 4;
				continue;
			}

			disasm->dump_pc = PC;
			count = decoder->DecodeMemory(CPU->get_offset() + PC);

			if(IsBreakPoint(PC))
			{
				m_list->SetItem(i, 0, fmt::FromUTF8(">>> " + disasm->last_opcode));
			}
			else
			{
				m_list->SetItem(i, 0, fmt::FromUTF8("    " + disasm->last_opcode));
			}

			wxColour colour;

			if(CPU->is_paused() && PC == CPU->get_pc())
			{
				colour = wxColour("Green");
			}
			else
			{
				colour = wxColour("White");

				for(u32 i=0; i<Emu.GetMarkedPoints().size(); ++i)
				{
					if(Emu.GetMarkedPoints()[i] == PC)
					{
						colour = wxColour("Wheat");
						break;
					}
				}
			}

			m_list->SetItemBackgroundColour( i, colour );
		}
	}

	while(remove_markedPC.size())
	{
		u32 mpc = remove_markedPC[0];

		for(u32 i=0; i<remove_markedPC.size(); ++i)
		{
			if(remove_markedPC[i] == mpc)
			{
				remove_markedPC.erase( remove_markedPC.begin() + i--);
				continue;
			}

			if(remove_markedPC[i] > mpc) remove_markedPC[i]--;
		}

		Emu.GetMarkedPoints().erase(Emu.GetMarkedPoints().begin() + mpc);
	}

	m_list->SetColumnWidth(0, -1);
	m_list->Thaw();
}