- Improved sc function binder.

- Improved GLGSRender.
This commit is contained in:
DH 2013-06-30 11:46:29 +03:00
parent 3bb7a299ca
commit 5753edf6ef
133 changed files with 13624 additions and 3898 deletions

View file

@ -10,13 +10,11 @@ u32 FixPc(const u32 pc)
return pc - ((show_lines/2)*4);
}
InterpreterDisAsmFrame::InterpreterDisAsmFrame(const wxString& title, PPCThread* cpu)
: FrameBase(NULL, wxID_ANY, title, "InterpreterDisAsmFrame", wxSize(500, 700))
InterpreterDisAsmFrame::InterpreterDisAsmFrame(wxWindow* parent, PPCThread* cpu)
: wxPanel(parent, wxID_ANY, wxDefaultPosition, wxSize(500, 700), wxTAB_TRAVERSAL)
, ThreadBase(false, "DisAsmFrame Thread")
, m_main_panel(*new wxPanel(this))
, CPU(*cpu)
, PC(0)
, m_exec(false)
{
if(CPU.IsSPU())
{
@ -34,14 +32,14 @@ InterpreterDisAsmFrame::InterpreterDisAsmFrame(const wxString& title, PPCThread*
wxBoxSizer& s_p_main = *new wxBoxSizer(wxVERTICAL);
wxBoxSizer& s_b_main = *new wxBoxSizer(wxHORIZONTAL);
m_list = new wxListView(&m_main_panel);
m_list = new wxListView(this);
wxButton& b_go_to_addr = *new wxButton(&m_main_panel, wxID_ANY, "Go To Address");
wxButton& b_go_to_pc = *new wxButton(&m_main_panel, wxID_ANY, "Go To PC");
wxButton& b_go_to_addr = *new wxButton(this, wxID_ANY, "Go To Address");
wxButton& b_go_to_pc = *new wxButton(this, wxID_ANY, "Go To PC");
m_btn_step = new wxButton(&m_main_panel, wxID_ANY, "Step");
m_btn_run = new wxButton(&m_main_panel, wxID_ANY, "Run");
m_btn_pause = new wxButton(&m_main_panel, wxID_ANY, "Pause");
m_btn_step = new wxButton(this, wxID_ANY, "Step");
m_btn_run = new wxButton(this, wxID_ANY, "Run");
m_btn_pause = new wxButton(this, wxID_ANY, "Pause");
s_b_main.Add(&b_go_to_addr, wxSizerFlags().Border(wxALL, 5));
s_b_main.Add(&b_go_to_pc, wxSizerFlags().Border(wxALL, 5));
@ -49,7 +47,7 @@ InterpreterDisAsmFrame::InterpreterDisAsmFrame(const wxString& title, PPCThread*
s_b_main.Add(m_btn_run, wxSizerFlags().Border(wxALL, 5));
s_b_main.Add(m_btn_pause, wxSizerFlags().Border(wxALL, 5));
m_regs = new wxTextCtrl(&m_main_panel, wxID_ANY, wxEmptyString,
m_regs = new wxTextCtrl(this, wxID_ANY, wxEmptyString,
wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_DONTWRAP|wxNO_BORDER|wxTE_RICH2);
m_regs->SetMinSize(wxSize(495, 100));
m_regs->SetEditable(false);
@ -58,25 +56,14 @@ InterpreterDisAsmFrame::InterpreterDisAsmFrame(const wxString& title, PPCThread*
m_regs->SetFont(wxFont(8, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL));
wxBoxSizer& s_w_list = *new wxBoxSizer(wxHORIZONTAL);
s_w_list.Add(m_list);
s_w_list.AddSpacer(5);
s_w_list.Add(m_regs);
s_w_list.Add(m_list, 2, wxEXPAND | wxLEFT | wxDOWN, 5);
s_w_list.Add(m_regs, 1, wxEXPAND | wxRIGHT | wxDOWN, 5);
s_p_main.AddSpacer(5);
s_p_main.Add(&s_b_main);
s_p_main.AddSpacer(5);
s_p_main.Add(&s_w_list);
s_p_main.AddSpacer(5);
s_p_main.Add(&s_b_main, 0, wxEXPAND | wxLEFT | wxRIGHT, 5);
s_p_main.Add(&s_w_list, 1, wxEXPAND | wxDOWN, 5);
wxBoxSizer& s_p_main_h = *new wxBoxSizer(wxVERTICAL);
s_p_main_h.AddSpacer(5);
s_p_main_h.Add(&s_p_main);
s_p_main_h.AddSpacer(5);
m_main_panel.SetSizerAndFit(&s_p_main_h);
wxBoxSizer& s_main = *new wxBoxSizer(wxVERTICAL);
s_main.Add(&m_main_panel);
SetSizerAndFit(&s_main);
SetSizer(&s_p_main);
Layout();
m_list->InsertColumn(0, "ASM");
@ -92,14 +79,12 @@ InterpreterDisAsmFrame::InterpreterDisAsmFrame(const wxString& title, PPCThread*
Connect(m_btn_run->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(InterpreterDisAsmFrame::DoRun));
Connect(m_btn_pause->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(InterpreterDisAsmFrame::DoPause));
Connect(m_list->GetId(), wxEVT_COMMAND_LIST_ITEM_ACTIVATED, wxListEventHandler(InterpreterDisAsmFrame::DClick));
Connect(wxEVT_SIZE, wxSizeEventHandler(InterpreterDisAsmFrame::OnResize));
wxGetApp().Connect(m_list->GetId(), wxEVT_MOUSEWHEEL, wxMouseEventHandler(InterpreterDisAsmFrame::MouseWheel), (wxObject*)0, this);
wxGetApp().Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(InterpreterDisAsmFrame::OnKeyDown), (wxObject*)0, this);
//Connect(wxEVT_SIZE, wxSizeEventHandler(InterpreterDisAsmFrame::OnResize));
m_app_connector.Connect(m_list->GetId(), wxEVT_MOUSEWHEEL, wxMouseEventHandler(InterpreterDisAsmFrame::MouseWheel), (wxObject*)0, this);
m_app_connector.Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(InterpreterDisAsmFrame::OnKeyDown), (wxObject*)0, this);
m_btn_pause->Disable();
//ShowPc(Loader.entry);
m_app_connector.Connect(wxEVT_DBG_COMMAND, wxCommandEventHandler(InterpreterDisAsmFrame::HandleCommand), (wxObject*)0, this);
WriteRegs();
ThreadBase::Start();
Load(BreakPointsDBName);
}
@ -171,7 +156,7 @@ void InterpreterDisAsmFrame::Load(const wxString& path)
void InterpreterDisAsmFrame::OnKeyDown(wxKeyEvent& event)
{
if(wxGetActiveWindow() != this)
if(wxGetActiveWindow() != wxGetTopLevelParent(this))
{
event.Skip();
return;
@ -231,7 +216,7 @@ void InterpreterDisAsmFrame::ShowAddr(const u64 addr)
wxColour colour;
if(PC == CPU.PC)
if((!CPU.IsRunned() || !Emu.IsRunned()) && PC == CPU.PC)
{
colour = wxColour("Green");
}
@ -252,7 +237,6 @@ void InterpreterDisAsmFrame::ShowAddr(const u64 addr)
m_list->SetItemBackgroundColour( i, colour );
}
while(remove_markedPC.GetCount())
{
u32 mpc = remove_markedPC[0];
@ -271,6 +255,7 @@ void InterpreterDisAsmFrame::ShowAddr(const u64 addr)
markedPC.RemoveAt(mpc);
}
m_list->SetColumnWidth(0, -1);
m_list->Thaw();
}
@ -282,6 +267,41 @@ void InterpreterDisAsmFrame::WriteRegs()
m_regs->Thaw();
}
void InterpreterDisAsmFrame::HandleCommand(wxCommandEvent& event)
{
PPCThread* thr = (PPCThread*)event.GetClientData();
event.Skip();
if(!thr || thr->GetId() != CPU.GetId()) return;
switch(event.GetId())
{
case DID_EXEC_THREAD:
case DID_REMOVE_THREAD:
case DID_RESUME_THREAD:
m_btn_step->Disable();
m_btn_run->Disable();
m_btn_pause->Enable();
break;
case DID_START_THREAD:
case DID_CREATE_THREAD:
case DID_PAUSE_THREAD:
case DID_STOP_THREAD:
m_btn_step->Enable(!Emu.IsReady());
m_btn_run->Enable(!Emu.IsReady());
m_btn_pause->Disable();
DoUpdate();
break;
case DID_STOP_EMU:
case DID_PAUSE_EMU:
DoUpdate();
break;
}
}
void InterpreterDisAsmFrame::OnUpdate(wxCommandEvent& event)
{
//WriteRegs();
@ -324,29 +344,21 @@ void InterpreterDisAsmFrame::Show_PC(wxCommandEvent& WXUNUSED(event))
extern bool dump_enable;
void InterpreterDisAsmFrame::DoRun(wxCommandEvent& WXUNUSED(event))
{
m_exec = true;
/*
bool dump_status = dump_enable;
if(Emu.IsPaused()) Emu.Run();
while(Emu.IsRunned())
{
CPU.Exec();
if(IsBreakPoint(CPU.PC) || dump_status != dump_enable) break;
}
if(CPU.IsPaused()) CPU.Resume();
if(Emu.IsPaused()) Emu.Resume();
DoUpdate();
*/
CPU.Exec();
//ThreadBase::Start();
}
void InterpreterDisAsmFrame::DoPause(wxCommandEvent& WXUNUSED(event))
{
Emu.Pause();
CPU.Pause();
}
void InterpreterDisAsmFrame::DoStep(wxCommandEvent& WXUNUSED(event))
{
CPU.Exec();
DoUpdate();
ThreadBase::Start();
}
void InterpreterDisAsmFrame::DClick(wxListEvent& event)
@ -356,7 +368,7 @@ void InterpreterDisAsmFrame::DClick(wxListEvent& event)
const u64 start_pc = PC - show_lines*4;
const u64 pc = start_pc + i*4;
//ConLog.Write("pc=0x%x", pc);
//ConLog.Write("pc=0x%llx", pc);
if(!Memory.IsGoodAddr(pc, 4)) return;
@ -371,37 +383,12 @@ void InterpreterDisAsmFrame::DClick(wxListEvent& event)
ShowAddr(start_pc);
}
void InterpreterDisAsmFrame::OnResize(wxSizeEvent& event)
{
const wxSize& size( GetClientSize() );
wxTextCtrl& regs = *m_regs;
wxListView& list = *m_list;
const int list_size = size.GetWidth() * 0.75;
const int regs_size = size.GetWidth() * 0.25 - 5;
list.SetMinSize(wxSize(list_size, size.GetHeight()-55));
regs.SetMinSize(wxSize(regs_size, size.GetHeight()-55));
m_main_panel.SetSize( size );
m_main_panel.GetSizer()->RecalcSizes();
list.SetColumnWidth(0, list_size-8);
event.Skip();
}
void InterpreterDisAsmFrame::MouseWheel(wxMouseEvent& event)
{
const int value = (event.m_wheelRotation / event.m_wheelDelta);
if(event.ControlDown())
{
ShowAddr( PC - (show_lines * (value + 1)) * 4);
}
else
{
ShowAddr( PC - (show_lines + value) * 4 );
}
ShowAddr( PC - (event.ControlDown() ? show_lines * (value + 1) : show_lines + value) * 4);
event.Skip();
}
@ -440,31 +427,30 @@ bool InterpreterDisAsmFrame::RemoveBreakPoint(u64 pc)
void InterpreterDisAsmFrame::Task()
{
while(!TestDestroy())
wxGetApp().SendDbgCommand(DID_RESUME_THREAD, &CPU);
bool dump_status = dump_enable;
//CPU.InitTls();
try
{
Sleep(1);
if(!m_exec) continue;
m_btn_step->Disable();
m_btn_run->Disable();
m_btn_pause->Enable();
bool dump_status = dump_enable;
if(Emu.IsPaused()) Emu.Resume();
while(Emu.IsRunned() && !TestDestroy())
do
{
CPU.Exec();
if(IsBreakPoint(CPU.PC) || dump_status != dump_enable) break;
CPU.ExecOnce();
}
DoUpdate();
m_btn_step->Enable();
m_btn_run->Enable();
m_btn_pause->Disable();
m_exec = false;
while(CPU.IsRunned() && Emu.IsRunned() && !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);
}