Added a console window to the DSP HLE plugin to more easily see the current parameter block status. TODO: add more presets to show different parameters and add more file logging options.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@755 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
parent
a8f484a668
commit
2c78946797
|
@ -68,17 +68,9 @@ void CBoot::EmulatedBIOS(bool _bDebug)
|
||||||
// Write necessary values
|
// Write necessary values
|
||||||
// ---------------------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------------------
|
||||||
/*
|
/*
|
||||||
"TODO: Game iso info to 0x80000000 according to yagcd - or does apploader do this?" - Answer, no
|
Here we write values to memory that the apploader does not take care of. Game iso info goes
|
||||||
apparently it doesn't, at least not in some games (by Namco). In these cases we need to set these
|
to 0x80000000 according to yagcd 4.2. I'm not sure what bytes 8-10 does (version and streaming),
|
||||||
manually. But I guess there's no reason that the Apploader couldn't do this by itself. So I guess we
|
but I include them anyway because it seems like they are supposed to be there.
|
||||||
could do this for only these Namco games that need this by detecting GetUniqueID, but that wouldn't
|
|
||||||
look pretty, and I think it's likely that this is actually how the GameCube works, it reads these values
|
|
||||||
by itself. So this is very unlikely to break anything. However, if somebody find a game that has an
|
|
||||||
apploader that automatically copies the first bytes of the disc to memory that could indicate that
|
|
||||||
the apploader procedure to load the first bytes fails for some reason in some games... I hope I'm not
|
|
||||||
being long-winded here :). The yagcd page for this is http://hitmen.c02.at/files/yagcd/yagcd/chap4.ht
|
|
||||||
ml#sec4.2 by the way. I'm not sure what the bytes 8-10 does (version and streaming), but I include
|
|
||||||
those to.
|
|
||||||
*/
|
*/
|
||||||
// ---------------------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------------------
|
||||||
DVDInterface::DVDRead(0x00000000, 0x80000000, 10); // write boot info needed for multidisc games
|
DVDInterface::DVDRead(0x00000000, 0x80000000, 10); // write boot info needed for multidisc games
|
||||||
|
@ -99,11 +91,11 @@ void CBoot::EmulatedBIOS(bool _bDebug)
|
||||||
|
|
||||||
|
|
||||||
// =======================================================================================
|
// =======================================================================================
|
||||||
// Load Apploader to Memory - The apploader is hardcoded to begin at 9 280 on the disc, but
|
// Load Apploader to Memory - The apploader is hardcoded to begin at byte 9 280 on the disc,
|
||||||
// it seems like the size can be variable.
|
// but it seems like the size can be variable. Compare with yagcd chap 13.
|
||||||
// ---------------------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------------------
|
||||||
PowerPC::ppcState.gpr[1] = 0x816ffff0; // StackPointer
|
PowerPC::ppcState.gpr[1] = 0x816ffff0; // StackPointer
|
||||||
u32 iAppLoaderOffset = 0x2440; // 0x1c40 (old value perhaps?, I don't know why it's here)
|
u32 iAppLoaderOffset = 0x2440; // 0x1c40 (what is 0x1c40?)
|
||||||
// ---------------------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------------------
|
||||||
u32 iAppLoaderEntry = VolumeHandler::Read32(iAppLoaderOffset + 0x10);
|
u32 iAppLoaderEntry = VolumeHandler::Read32(iAppLoaderOffset + 0x10);
|
||||||
u32 iAppLoaderSize = VolumeHandler::Read32(iAppLoaderOffset + 0x14);
|
u32 iAppLoaderSize = VolumeHandler::Read32(iAppLoaderOffset + 0x14);
|
||||||
|
@ -132,20 +124,10 @@ void CBoot::EmulatedBIOS(bool _bDebug)
|
||||||
|
|
||||||
|
|
||||||
// =======================================================================================
|
// =======================================================================================
|
||||||
// iAppLoaderMain - This let's the apploader load the DOL (the exe) and the TOC (filesystem)
|
/*
|
||||||
// and I guess anything else it wishes. To give you an idea about where the stuff is on the disc
|
iAppLoaderMain - Here we load the apploader, the DOL (the exe) and the FST (filesystem).
|
||||||
// here's an example of the disc structure of these things from Baten Kaitos - Wings. The values
|
To give you an idea about where the stuff is located on the disc take a look at yagcd chap 13.
|
||||||
// are given as non hexadecimal (ie normal numbers with base 10 instead of base 16) and they
|
*/
|
||||||
// are only approximately right. I don't know what's in the gaps or why there are gaps between
|
|
||||||
// the different things.
|
|
||||||
// Data From To Size
|
|
||||||
// Header 0 1 072 1 072
|
|
||||||
// AppLoader 9 280 121 408 112 128
|
|
||||||
// DOL (exe) 128 768 2 204 416 2 075 648
|
|
||||||
// TOC 2 204 160 2 309 120 104 960
|
|
||||||
// For some reason this game loaded these things in 16 rounds in the loop below. The third and
|
|
||||||
// last of these were double reads of things it had already copied to memory. But hey, we're
|
|
||||||
// all human :)
|
|
||||||
// ---------------------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------------------
|
||||||
LOG(MASTER_LOG, "Call iAppLoaderMain");
|
LOG(MASTER_LOG, "Call iAppLoaderMain");
|
||||||
do
|
do
|
||||||
|
|
|
@ -735,6 +735,14 @@
|
||||||
<Filter
|
<Filter
|
||||||
Name="Logging"
|
Name="Logging"
|
||||||
>
|
>
|
||||||
|
<File
|
||||||
|
RelativePath=".\Src\Logging\Console.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\Src\Logging\Console.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath=".\Src\Logging\Logging.cpp"
|
RelativePath=".\Src\Logging\Logging.cpp"
|
||||||
>
|
>
|
||||||
|
|
|
@ -22,14 +22,18 @@
|
||||||
#include "Debugger.h"
|
#include "Debugger.h"
|
||||||
#include "PBView.h"
|
#include "PBView.h"
|
||||||
#include "IniFile.h"
|
#include "IniFile.h"
|
||||||
|
#include "../Logging/Console.h" // open and close console
|
||||||
|
|
||||||
|
// externals
|
||||||
|
extern int gUpdFreq;
|
||||||
|
|
||||||
// =======================================================================================
|
// =======================================================================================
|
||||||
// Declare events
|
// Declare events
|
||||||
BEGIN_EVENT_TABLE(CDebugger,wxDialog)
|
BEGIN_EVENT_TABLE(CDebugger,wxDialog)
|
||||||
EVT_CLOSE(CDebugger::OnClose)
|
EVT_CLOSE(CDebugger::OnClose)
|
||||||
EVT_BUTTON(ID_UPD,CDebugger::OnUpdate)
|
EVT_BUTTON(ID_UPD,CDebugger::OnUpdate)
|
||||||
|
EVT_CHECKBOX(IDC_CHECK2,CDebugger::ShowHideConsole)
|
||||||
|
EVT_RADIOBOX(IDC_RADIO1,CDebugger::ChangeFrequency)
|
||||||
END_EVENT_TABLE()
|
END_EVENT_TABLE()
|
||||||
// =======================================================================================
|
// =======================================================================================
|
||||||
|
|
||||||
|
@ -63,6 +67,8 @@ void CDebugger::Save(IniFile& _IniFile) const
|
||||||
_IniFile.Set("SoundWindow", "y", GetPosition().y);
|
_IniFile.Set("SoundWindow", "y", GetPosition().y);
|
||||||
_IniFile.Set("SoundWindow", "w", GetSize().GetWidth());
|
_IniFile.Set("SoundWindow", "w", GetSize().GetWidth());
|
||||||
_IniFile.Set("SoundWindow", "h", GetSize().GetHeight());
|
_IniFile.Set("SoundWindow", "h", GetSize().GetHeight());
|
||||||
|
_IniFile.Set("SoundWindow", "Console", m_Check[2]->IsChecked()); // save settings
|
||||||
|
_IniFile.Set("SoundWindow", "UpdateFrequency", m_RadioBox[1]->GetSelection());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -74,51 +80,73 @@ void CDebugger::Load(IniFile& _IniFile)
|
||||||
_IniFile.Get("SoundWindow", "w", &w, GetSize().GetWidth());
|
_IniFile.Get("SoundWindow", "w", &w, GetSize().GetWidth());
|
||||||
_IniFile.Get("SoundWindow", "h", &h, GetSize().GetHeight());
|
_IniFile.Get("SoundWindow", "h", &h, GetSize().GetHeight());
|
||||||
SetSize(x, y, w, h);
|
SetSize(x, y, w, h);
|
||||||
|
|
||||||
|
// saved settings
|
||||||
|
bool Console;
|
||||||
|
_IniFile.Get("SoundWindow", "Console", &Console, m_Check[2]->IsChecked());
|
||||||
|
m_Check[2]->SetValue(Console);
|
||||||
|
DoShowHideConsole();
|
||||||
|
|
||||||
|
int UpdateFrequency;
|
||||||
|
_IniFile.Get("SoundWindow", "UpdateFrequency", &UpdateFrequency, m_RadioBox[1]->GetSelection());
|
||||||
|
m_RadioBox[1]->SetSelection(UpdateFrequency);
|
||||||
|
DoChangeFrequency();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDebugger::CreateGUIControls()
|
void CDebugger::CreateGUIControls()
|
||||||
{
|
{
|
||||||
SetTitle(wxT("Sound Debugging"));
|
SetTitle(wxT("Sound Debugging"));
|
||||||
|
|
||||||
|
// basic settings
|
||||||
SetIcon(wxNullIcon);
|
SetIcon(wxNullIcon);
|
||||||
SetSize(8, 8, 400, 370);
|
SetSize(8, 8, 200, 100); // these will become the minimin sizes allowed by resizing
|
||||||
Center();
|
Center();
|
||||||
|
|
||||||
|
// the big window
|
||||||
m_GPRListView = new CPBView(this, ID_GPR, wxDefaultPosition, GetSize(),
|
m_GPRListView = new CPBView(this, ID_GPR, wxDefaultPosition, GetSize(),
|
||||||
wxLC_REPORT | wxSUNKEN_BORDER | wxLC_ALIGN_LEFT | wxLC_SINGLE_SEL | wxLC_SORT_ASCENDING);
|
wxLC_REPORT | wxSUNKEN_BORDER | wxLC_ALIGN_LEFT | wxLC_SINGLE_SEL | wxLC_SORT_ASCENDING);
|
||||||
|
|
||||||
wxBoxSizer* sMain;
|
|
||||||
wxButton* m_Upd;
|
|
||||||
wxButton* m_SelC;
|
|
||||||
wxButton* m_Presets;
|
|
||||||
|
|
||||||
wxStaticBoxSizer* sLeft;
|
|
||||||
|
|
||||||
|
|
||||||
// declarations
|
// declarations
|
||||||
wxCheckBox *m_Check[2];
|
wxBoxSizer* sMain;
|
||||||
wxRadioButton *m_Radio[6];
|
wxButton* m_Upd;
|
||||||
|
wxButton* m_SelC;
|
||||||
|
wxButton* m_Presets;
|
||||||
|
|
||||||
|
wxStaticBoxSizer* sLeft;
|
||||||
|
|
||||||
|
// checkboxes and labels -----------------------------------------------------
|
||||||
|
m_Label[0] = new wxStaticBox(this, IDG_LABEL1, wxT("Options"),
|
||||||
|
wxDefaultPosition, wxDefaultSize, 0);
|
||||||
|
wxStaticBoxSizer * m_checkSizer = new wxStaticBoxSizer (m_Label[0], wxVERTICAL);
|
||||||
|
|
||||||
// checkboxes
|
// checkboxes
|
||||||
m_Check[0] = new wxCheckBox(this, IDC_CHECK0, wxT("Save to file"),
|
m_Check[0] = new wxCheckBox(this, IDC_CHECK0, wxT("Save to file"),
|
||||||
wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
||||||
m_Check[1] = new wxCheckBox(this, IDC_CHECK1, wxT("Show updated"),
|
m_Check[1] = new wxCheckBox(this, IDC_CHECK1, wxT("Show updated"),
|
||||||
wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
||||||
|
m_Check[2] = new wxCheckBox(this, IDC_CHECK2, wxT("Show console"),
|
||||||
|
wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
||||||
|
|
||||||
|
m_checkSizer->Add(m_Check[0], 0, 0, 5);
|
||||||
|
m_checkSizer->Add(m_Check[1], 0, 0, 5);
|
||||||
|
m_checkSizer->Add(m_Check[2], 0, 0, 5);
|
||||||
|
// ------------------------
|
||||||
|
|
||||||
|
// radio boxes -----------------------------------------------------
|
||||||
|
int m_radioBoxNChoices[2];
|
||||||
|
|
||||||
m_Radio[0] = new wxRadioButton(this, IDC_RADIO0, wxT("Show base 10"),
|
wxString m_radioBoxChoices0[] = { wxT("Show base 10"), wxT("Show base 16") };
|
||||||
wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
m_radioBoxNChoices[0] = sizeof( m_radioBoxChoices0 ) / sizeof( wxString );
|
||||||
m_Radio[1] = new wxRadioButton(this, IDC_RADIO1, wxT("Show base 16"),
|
m_RadioBox[0] = new wxRadioBox( this, IDC_RADIO0, wxT("Show base"),
|
||||||
wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
wxDefaultPosition, wxDefaultSize, m_radioBoxNChoices[0], m_radioBoxChoices0, 1, wxRA_SPECIFY_COLS);
|
||||||
|
|
||||||
|
|
||||||
m_Radio[2] = new wxRadioButton(this, IDC_RADIO2, wxT("Never"),
|
|
||||||
wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
|
||||||
m_Radio[3] = new wxRadioButton(this, IDC_RADIO3, wxT("5 times/s"),
|
|
||||||
wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
|
||||||
m_Radio[4] = new wxRadioButton(this, IDC_RADIO4, wxT("10 times/s"),
|
|
||||||
wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
|
||||||
|
|
||||||
|
wxString m_radioBoxChoices1[] = { wxT("5 times/s"), wxT("15 times/s"), wxT("30 times/s") };
|
||||||
|
m_radioBoxNChoices[1] = sizeof( m_radioBoxChoices1 ) / sizeof( wxString );
|
||||||
|
m_RadioBox[1] = new wxRadioBox( this, IDC_RADIO1, wxT("Update freq."),
|
||||||
|
wxDefaultPosition, wxDefaultSize, m_radioBoxNChoices[1], m_radioBoxChoices1, 1, wxRA_SPECIFY_COLS);
|
||||||
|
// ------------------------
|
||||||
|
|
||||||
|
// buttons
|
||||||
m_Upd = new wxButton(this, ID_UPD, wxT("Update"),
|
m_Upd = new wxButton(this, ID_UPD, wxT("Update"),
|
||||||
wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
|
||||||
m_SelC = new wxButton(this, ID_SELC, wxT("Select Columns"),
|
m_SelC = new wxButton(this, ID_SELC, wxT("Select Columns"),
|
||||||
|
@ -128,10 +156,10 @@ SetTitle(wxT("Sound Debugging"));
|
||||||
|
|
||||||
sLeft = new wxStaticBoxSizer(wxVERTICAL, this, wxT("Current Status"));
|
sLeft = new wxStaticBoxSizer(wxVERTICAL, this, wxT("Current Status"));
|
||||||
|
|
||||||
|
|
||||||
wxBoxSizer* sButtons;
|
wxBoxSizer* sButtons;
|
||||||
sButtons = new wxBoxSizer(wxVERTICAL);
|
sButtons = new wxBoxSizer(wxVERTICAL);
|
||||||
|
|
||||||
|
|
||||||
sButtons->AddStretchSpacer(1);
|
sButtons->AddStretchSpacer(1);
|
||||||
|
|
||||||
sButtons->Add(m_Upd, 0, 0, 5);
|
sButtons->Add(m_Upd, 0, 0, 5);
|
||||||
|
@ -140,20 +168,16 @@ SetTitle(wxT("Sound Debugging"));
|
||||||
|
|
||||||
sButtons->AddStretchSpacer(1);
|
sButtons->AddStretchSpacer(1);
|
||||||
|
|
||||||
sButtons->Add(m_Check[0], 0, 0, 5);
|
sButtons->Add(m_checkSizer, 0, 2, 5);
|
||||||
sButtons->Add(m_Check[1], 0, 0, 5);
|
|
||||||
|
|
||||||
sButtons->AddStretchSpacer(1);
|
sButtons->AddStretchSpacer(1);
|
||||||
|
|
||||||
sButtons->Add(m_Radio[0], 0, 0, 5);
|
sButtons->Add(m_RadioBox[0], 0, 0, 5);
|
||||||
sButtons->Add(m_Radio[1], 0, 0, 5);
|
|
||||||
|
|
||||||
sButtons->AddStretchSpacer(1);
|
sButtons->AddStretchSpacer(1);
|
||||||
|
|
||||||
sButtons->Add(m_Radio[2], 0, 0, 5);
|
sButtons->Add(m_RadioBox[1], 0, 0, 5);
|
||||||
sButtons->Add(m_Radio[3], 0, 0, 5);
|
|
||||||
sButtons->Add(m_Radio[4], 0, 0, 5);
|
|
||||||
|
|
||||||
sButtons->AddStretchSpacer(1);
|
sButtons->AddStretchSpacer(1);
|
||||||
|
|
||||||
|
|
||||||
|
@ -173,6 +197,10 @@ SetTitle(wxT("Sound Debugging"));
|
||||||
void CDebugger::OnClose(wxCloseEvent& /*event*/)
|
void CDebugger::OnClose(wxCloseEvent& /*event*/)
|
||||||
{
|
{
|
||||||
EndModal(0);
|
EndModal(0);
|
||||||
|
|
||||||
|
// I turned this off for now because of the ShowModal() problem and because I wanted
|
||||||
|
// to look at the logs at the same time as the console window.
|
||||||
|
//CloseConsole();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDebugger::OnUpdate(wxCommandEvent& /*event*/)
|
void CDebugger::OnUpdate(wxCommandEvent& /*event*/)
|
||||||
|
@ -180,6 +208,46 @@ void CDebugger::OnUpdate(wxCommandEvent& /*event*/)
|
||||||
this->NotifyUpdate();
|
this->NotifyUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CDebugger::ChangeFrequency(wxCommandEvent& event)
|
||||||
|
{
|
||||||
|
DoChangeFrequency();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDebugger::DoChangeFrequency()
|
||||||
|
{
|
||||||
|
if(m_RadioBox[1]->GetSelection() == 0)
|
||||||
|
{
|
||||||
|
gUpdFreq = 5;
|
||||||
|
}
|
||||||
|
else if(m_RadioBox[1]->GetSelection() == 1)
|
||||||
|
{
|
||||||
|
gUpdFreq = 15;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gUpdFreq = 30;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDebugger::ShowHideConsole(wxCommandEvent& event)
|
||||||
|
{
|
||||||
|
DoShowHideConsole();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDebugger::DoShowHideConsole()
|
||||||
|
{
|
||||||
|
|
||||||
|
if(m_Check[2]->IsChecked())
|
||||||
|
{
|
||||||
|
OpenConsole();
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CloseConsole();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void CDebugger::NotifyUpdate()
|
void CDebugger::NotifyUpdate()
|
||||||
{
|
{
|
||||||
if (m_GPRListView != NULL)
|
if (m_GPRListView != NULL)
|
||||||
|
|
|
@ -52,22 +52,35 @@ class CDebugger : public wxDialog
|
||||||
|
|
||||||
void NotifyUpdate();
|
void NotifyUpdate();
|
||||||
void OnUpdate(wxCommandEvent& event);
|
void OnUpdate(wxCommandEvent& event);
|
||||||
|
void ShowHideConsole(wxCommandEvent& event);
|
||||||
|
void DoShowHideConsole();
|
||||||
|
void ChangeFrequency(wxCommandEvent& event);
|
||||||
|
void DoChangeFrequency();
|
||||||
|
|
||||||
CPBView* m_GPRListView;
|
CPBView* m_GPRListView;
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
// declarations
|
||||||
|
wxCheckBox *m_Check[3];
|
||||||
|
wxRadioButton *m_Radio[5];
|
||||||
|
wxRadioBox *m_RadioBox[2];
|
||||||
|
wxStaticBox *m_Label[1];
|
||||||
|
wxPanel *m_Controller;
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------------------
|
||||||
// WARNING: Make sure these are not also elsewhere, for example in resource.h.
|
// WARNING: Make sure these are not also elsewhere, for example in resource.h.
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
IDC_CHECK0 = 2000,
|
IDC_CHECK0 = 2000,
|
||||||
IDC_CHECK1,
|
IDC_CHECK1,
|
||||||
|
IDC_CHECK2,
|
||||||
IDC_RADIO0,
|
IDC_RADIO0,
|
||||||
IDC_RADIO1,
|
IDC_RADIO1,
|
||||||
IDC_RADIO2,
|
IDC_RADIO2,
|
||||||
IDC_RADIO3,
|
IDC_RADIO3,
|
||||||
IDC_RADIO4,
|
IDG_LABEL1,
|
||||||
ID_UPD,
|
ID_UPD,
|
||||||
ID_SELC,
|
ID_SELC,
|
||||||
ID_PRESETS,
|
ID_PRESETS,
|
||||||
|
|
|
@ -0,0 +1,196 @@
|
||||||
|
// Copyright (C) 2003-2008 Dolphin Project.
|
||||||
|
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, version 2.0.
|
||||||
|
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License 2.0 for more details.
|
||||||
|
|
||||||
|
// A copy of the GPL 2.0 should have been included with the program.
|
||||||
|
// If not, see http://www.gnu.org/licenses/
|
||||||
|
|
||||||
|
// Official SVN repository and contact information can be found at
|
||||||
|
// http://code.google.com/p/dolphin-emu/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------------------
|
||||||
|
// Includes
|
||||||
|
// --------------------
|
||||||
|
#include <string>
|
||||||
|
#include <stdio.h>
|
||||||
|
#ifdef _WIN32
|
||||||
|
#include <windows.h>
|
||||||
|
#endif
|
||||||
|
// --------------------
|
||||||
|
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------------------
|
||||||
|
// On and off
|
||||||
|
// --------------------
|
||||||
|
bool g_consoleEnable = true;
|
||||||
|
#define DEBUGG
|
||||||
|
//#define DEBUGG_FILEONLY
|
||||||
|
//#define DEBUGG_NOFILE
|
||||||
|
// --------------------
|
||||||
|
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------------------
|
||||||
|
// Create handles
|
||||||
|
// --------------------
|
||||||
|
#ifdef DEBUGG
|
||||||
|
FILE* __fStdOut = NULL;
|
||||||
|
#endif
|
||||||
|
#ifndef DEBUGG_FILEONLY
|
||||||
|
HANDLE __hStdOut = NULL;
|
||||||
|
#endif
|
||||||
|
// --------------------
|
||||||
|
|
||||||
|
|
||||||
|
// =======================================================================================
|
||||||
|
/* Start console window - width and height is the size of console window, if you specify
|
||||||
|
fname, the output will also be writton to this file. The file pointer is automatically
|
||||||
|
closed when you close the app */
|
||||||
|
// ---------------------------------------------------------------------------------------
|
||||||
|
void startConsoleWin(int width, int height, char* fname)
|
||||||
|
{
|
||||||
|
|
||||||
|
#if defined(DEBUGG) && defined(_WIN32)
|
||||||
|
|
||||||
|
#ifndef DEBUGG_FILEONLY
|
||||||
|
|
||||||
|
AllocConsole();
|
||||||
|
|
||||||
|
SetConsoleTitle(fname);
|
||||||
|
__hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
|
||||||
|
|
||||||
|
COORD co = {width,height};
|
||||||
|
SetConsoleScreenBufferSize(__hStdOut, co);
|
||||||
|
|
||||||
|
SMALL_RECT coo = {0,0,(width - 1),70}; // top, left, right, bottom
|
||||||
|
SetConsoleWindowInfo(__hStdOut, TRUE, &coo);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#ifndef DEBUGG_NOFILE
|
||||||
|
// ---------------------------------------------------------------------------------------
|
||||||
|
// Write to a file
|
||||||
|
if(fname)
|
||||||
|
{
|
||||||
|
// Edit the log file name
|
||||||
|
std::string FileEnding = ".log";
|
||||||
|
std::string FileName = fname;
|
||||||
|
std::string FullFilename = (FileName + FileEnding);
|
||||||
|
__fStdOut = fopen(FullFilename.c_str(), "w");
|
||||||
|
}
|
||||||
|
// ---------------------------------------------------------------------------------------
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------------------
|
||||||
|
// Printf function
|
||||||
|
int wprintf(char *fmt, ...)
|
||||||
|
{
|
||||||
|
#if defined(DEBUGG) && defined(_WIN32)
|
||||||
|
char s[3000]; // WARNING: Mind this value
|
||||||
|
va_list argptr;
|
||||||
|
int cnt;
|
||||||
|
|
||||||
|
va_start(argptr, fmt);
|
||||||
|
cnt = vsnprintf(s, 3000, fmt, argptr);
|
||||||
|
va_end(argptr);
|
||||||
|
|
||||||
|
DWORD cCharsWritten;
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------------------
|
||||||
|
#ifndef DEBUGG_FILEONLY
|
||||||
|
if(__hStdOut)
|
||||||
|
{
|
||||||
|
WriteConsole(__hStdOut, s, strlen(s), &cCharsWritten, NULL);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifndef DEBUGG_NOFILE
|
||||||
|
// ---------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if(__fStdOut)
|
||||||
|
fprintf(__fStdOut, s);
|
||||||
|
// ---------------------------------------------------------------------------------------
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return(cnt);
|
||||||
|
#else
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ClearScreen()
|
||||||
|
{
|
||||||
|
#if defined(DEBUGG) && defined(_WIN32)
|
||||||
|
if(g_consoleEnable)
|
||||||
|
{
|
||||||
|
COORD coordScreen = { 0, 0 };
|
||||||
|
DWORD cCharsWritten;
|
||||||
|
CONSOLE_SCREEN_BUFFER_INFO csbi;
|
||||||
|
DWORD dwConSize;
|
||||||
|
|
||||||
|
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
|
||||||
|
|
||||||
|
GetConsoleScreenBufferInfo(hConsole, &csbi);
|
||||||
|
dwConSize = csbi.dwSize.X * csbi.dwSize.Y;
|
||||||
|
FillConsoleOutputCharacter(hConsole, TEXT(' '), dwConSize,
|
||||||
|
coordScreen, &cCharsWritten);
|
||||||
|
GetConsoleScreenBufferInfo(hConsole, &csbi);
|
||||||
|
FillConsoleOutputAttribute(hConsole, csbi.wAttributes, dwConSize,
|
||||||
|
coordScreen, &cCharsWritten);
|
||||||
|
SetConsoleCursorPosition(hConsole, coordScreen);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(DEBUGG) && defined(_WIN32)
|
||||||
|
HWND GetConsoleHwnd(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
#define MY_BUFSIZE 1024 // Buffer size for console window titles.
|
||||||
|
HWND hwndFound; // This is what is returned to the caller.
|
||||||
|
char pszNewWindowTitle[MY_BUFSIZE]; // Contains fabricated
|
||||||
|
// WindowTitle.
|
||||||
|
char pszOldWindowTitle[MY_BUFSIZE]; // Contains original
|
||||||
|
// WindowTitle.
|
||||||
|
|
||||||
|
// Fetch current window title.
|
||||||
|
|
||||||
|
GetConsoleTitle(pszOldWindowTitle, MY_BUFSIZE);
|
||||||
|
|
||||||
|
// Format a "unique" NewWindowTitle.
|
||||||
|
|
||||||
|
wsprintf(pszNewWindowTitle,"%d/%d",
|
||||||
|
GetTickCount(),
|
||||||
|
GetCurrentProcessId());
|
||||||
|
|
||||||
|
// Change current window title.
|
||||||
|
|
||||||
|
SetConsoleTitle(pszNewWindowTitle);
|
||||||
|
|
||||||
|
// Ensure window title has been updated.
|
||||||
|
|
||||||
|
Sleep(40);
|
||||||
|
|
||||||
|
// Look for NewWindowTitle.
|
||||||
|
|
||||||
|
hwndFound = FindWindow(NULL, pszNewWindowTitle);
|
||||||
|
|
||||||
|
// Restore original window title.
|
||||||
|
|
||||||
|
SetConsoleTitle(pszOldWindowTitle);
|
||||||
|
|
||||||
|
return(hwndFound);
|
||||||
|
|
||||||
|
}
|
||||||
|
#endif // win32
|
|
@ -0,0 +1,26 @@
|
||||||
|
// Copyright (C) 2003-2008 Dolphin Project.
|
||||||
|
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, version 2.0.
|
||||||
|
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License 2.0 for more details.
|
||||||
|
|
||||||
|
// A copy of the GPL 2.0 should have been included with the program.
|
||||||
|
// If not, see http://www.gnu.org/licenses/
|
||||||
|
|
||||||
|
// Official SVN repository and contact information can be found at
|
||||||
|
// http://code.google.com/p/dolphin-emu/
|
||||||
|
|
||||||
|
|
||||||
|
int wprintf(char *fmt, ...);
|
||||||
|
void ClearScreen();
|
||||||
|
void OpenConsole();
|
||||||
|
void CloseConsole();
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
HWND GetConsoleHwnd(void);
|
||||||
|
#endif
|
|
@ -28,7 +28,7 @@
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <string> // so that we can test std::string == abc
|
#include <string> // so that we can test std::string == abc
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "../UCodes/UCodes.h"
|
#include "../UCodes/UCodes.h"
|
||||||
|
@ -37,9 +37,15 @@
|
||||||
|
|
||||||
#include "../Debugger/PBView.h"
|
#include "../Debugger/PBView.h"
|
||||||
#include "../Debugger/Debugger.h"
|
#include "../Debugger/Debugger.h"
|
||||||
|
#include "Console.h" // open and close console, clear console window
|
||||||
|
|
||||||
|
|
||||||
// Externals
|
// Externals
|
||||||
|
|
||||||
float ratioFactor; // a global to get the ratio factor from MixAdd
|
float ratioFactor; // a global to get the ratio factor from MixAdd
|
||||||
|
int gUpdFreq = 5;
|
||||||
|
u32 gLastBlock;
|
||||||
|
|
||||||
|
|
||||||
// Parameter blocks
|
// Parameter blocks
|
||||||
|
|
||||||
|
@ -85,14 +91,17 @@ std::vector<u16> gis_stream(64);
|
||||||
int j = 0;
|
int j = 0;
|
||||||
int k = 0;
|
int k = 0;
|
||||||
long int l = 0;
|
long int l = 0;
|
||||||
|
int iupd = 0;
|
||||||
|
bool iupdonce = false;
|
||||||
|
std::vector<u16> viupd(15); // the length of the update frequency bar
|
||||||
|
int vectorLengthGUI = 8; // length of playback history bar for the GUI version
|
||||||
|
int vectorLength = 15; // for console version
|
||||||
|
|
||||||
|
|
||||||
// More stuff
|
// More stuff
|
||||||
|
|
||||||
std::vector< std::vector<int> > vector1(64, std::vector<int>(100,0));
|
std::vector< std::vector<int> > vector1(64, std::vector<int>(100,0));
|
||||||
int vectorLength = 8;
|
std::vector<int> numberRunning(64);
|
||||||
std::vector<u16> vector62(vectorLength);
|
std::vector<u16> vector62(vectorLength);
|
||||||
std::vector<u16> vector63(vectorLength);
|
std::vector<u16> vector63(vectorLength);
|
||||||
|
|
||||||
|
@ -118,16 +127,16 @@ void CUCode_AX::Logging(short* _pBuffer, int _iSize, int a)
|
||||||
// Control how often the screen is updated
|
// Control how often the screen is updated
|
||||||
j++;
|
j++;
|
||||||
l++;
|
l++;
|
||||||
if (j>20)
|
if (j > (200/gUpdFreq))
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
// Move all items back - vector1 is a vector1[64][100] vector, I think
|
// Move all items back - vector1 is a vector1[64][100] vector, I think
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Move all items back like this:
|
||||||
1 to 2
|
1 to 2
|
||||||
2 3
|
2 3
|
||||||
3
|
3 ...
|
||||||
*/
|
*/
|
||||||
for (int i = 0; i < 64; i++)
|
for (int i = 0; i < 64; i++)
|
||||||
{
|
{
|
||||||
|
@ -137,8 +146,6 @@ void CUCode_AX::Logging(short* _pBuffer, int _iSize, int a)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Save the latest value
|
// Save the latest value
|
||||||
|
|
||||||
|
@ -147,37 +154,86 @@ void CUCode_AX::Logging(short* _pBuffer, int _iSize, int a)
|
||||||
vector1.at(i).at(vectorLength-1) = PBs[i].running;
|
vector1.at(i).at(vectorLength-1) = PBs[i].running;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// =======================================================================================
|
||||||
|
// Count how many we have running now
|
||||||
|
// --------------
|
||||||
|
int jj = 0;
|
||||||
|
for (int i = 0; i < 64; i++)
|
||||||
|
{
|
||||||
|
for (int j = 0; j < vectorLength-1; j++)
|
||||||
|
{
|
||||||
|
if (vector1.at(i).at(j) == 1)
|
||||||
|
{
|
||||||
|
jj++;
|
||||||
|
}
|
||||||
|
numberRunning.at(i) = jj;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ==============
|
||||||
|
|
||||||
|
|
||||||
// go through all blocks, or only some
|
// =======================================================================================
|
||||||
|
// Write header
|
||||||
|
// --------------
|
||||||
|
char buffer [1000] = "";
|
||||||
|
std::string sbuff;
|
||||||
|
sbuff = sbuff + " Nr pos / end lpos | voll volr | isl[pre yn1 yn2] iss | frac ratio[hi lo] | 1 2 3 4 5\n";
|
||||||
|
// ==============
|
||||||
|
|
||||||
|
|
||||||
|
// go through all running blocks
|
||||||
for (int i = 0; i < numberOfPBs; i++)
|
for (int i = 0; i < numberOfPBs; i++)
|
||||||
{
|
{
|
||||||
//if (PBs[i].running)
|
if (numberRunning.at(i) > 0)
|
||||||
//if (PBs[i].running && PBs[i].adpcm_loop_info.yn1 && PBs[i].mixer.volume_left)
|
|
||||||
if(true)
|
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
// Playback history for the GUI debugger
|
// Playback history for the GUI debugger --------------------------
|
||||||
|
if(m_frame)
|
||||||
std::string sbuff;
|
{
|
||||||
|
std::string guipr; // gui progress
|
||||||
|
|
||||||
|
for (int j = 0; j < vectorLengthGUI; j++)
|
||||||
|
{
|
||||||
|
if(vector1.at(i).at(j) == 0)
|
||||||
|
{
|
||||||
|
guipr = guipr + "0";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
guipr = guipr + "1";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
u32 run = atoi( guipr.c_str());
|
||||||
|
m_frame->m_GPRListView->m_CachedRegs[1][i] = run;
|
||||||
|
guipr.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Playback history for the console debugger --------------------------
|
||||||
for (int j = 0; j < vectorLength; j++)
|
for (int j = 0; j < vectorLength; j++)
|
||||||
{
|
{
|
||||||
if(vector1.at(i).at(j) == 0)
|
if(vector1.at(i).at(j) == 0)
|
||||||
{
|
{
|
||||||
sbuff = sbuff + "0";
|
//strcat(buffer, " ");
|
||||||
|
sbuff = sbuff + " ";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
sbuff = sbuff + "1";
|
//sprintf(buffer, "%s%c", buffer, 177); // this will add strange letters if buffer has
|
||||||
|
// not been given any string yet
|
||||||
|
|
||||||
|
sprintf(buffer, "%c", 177);
|
||||||
|
//strcat(buffer, tmpbuff);
|
||||||
|
|
||||||
|
//strcpy(buffer, "");
|
||||||
|
//sprintf(buffer, "%c", 177);
|
||||||
|
sbuff = sbuff + buffer; strcpy(buffer, "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// ---------
|
||||||
|
|
||||||
u32 run = atoi( sbuff.c_str());
|
|
||||||
m_frame->m_GPRListView->m_CachedRegs[1][i] = run;
|
|
||||||
sbuff.clear();
|
|
||||||
|
|
||||||
// We could chose to update these only if a block is currently running - Later I'll add options
|
// We could chose to update these only if a block is currently running - Later I'll add options
|
||||||
// to see both the current and the lastets active value.
|
// to see both the current and the lastets active value.
|
||||||
|
@ -185,89 +241,178 @@ void CUCode_AX::Logging(short* _pBuffer, int _iSize, int a)
|
||||||
if (true)
|
if (true)
|
||||||
{
|
{
|
||||||
|
|
||||||
// AXPB base
|
// AXPB base
|
||||||
gcoef[i] = PBs[i].unknown1;
|
gcoef[i] = PBs[i].unknown1;
|
||||||
|
|
||||||
gloopPos[i] = (PBs[i].audio_addr.loop_addr_hi << 16) | PBs[i].audio_addr.loop_addr_lo;
|
gloopPos[i] = (PBs[i].audio_addr.loop_addr_hi << 16) | PBs[i].audio_addr.loop_addr_lo;
|
||||||
gsampleEnd[i] = (PBs[i].audio_addr.end_addr_hi << 16) | PBs[i].audio_addr.end_addr_lo;
|
gsampleEnd[i] = (PBs[i].audio_addr.end_addr_hi << 16) | PBs[i].audio_addr.end_addr_lo;
|
||||||
gsamplePos[i] = (PBs[i].audio_addr.cur_addr_hi << 16) | PBs[i].audio_addr.cur_addr_lo;
|
gsamplePos[i] = (PBs[i].audio_addr.cur_addr_hi << 16) | PBs[i].audio_addr.cur_addr_lo;
|
||||||
|
|
||||||
// PBSampleRateConverter src
|
// PBSampleRateConverter src
|
||||||
|
|
||||||
gratio[i] = (u32)(((PBs[i].src.ratio_hi << 16) + PBs[i].src.ratio_lo) * ratioFactor);
|
gratio[i] = (u32)(((PBs[i].src.ratio_hi << 16) + PBs[i].src.ratio_lo) * ratioFactor);
|
||||||
gratiohi[i] = PBs[i].src.ratio_hi;
|
gratiohi[i] = PBs[i].src.ratio_hi;
|
||||||
gratiolo[i] = PBs[i].src.ratio_lo;
|
gratiolo[i] = PBs[i].src.ratio_lo;
|
||||||
gfrac[i] = PBs[i].src.cur_addr_frac;
|
gfrac[i] = PBs[i].src.cur_addr_frac;
|
||||||
|
|
||||||
// adpcm_loop_info
|
// adpcm_loop_info
|
||||||
gadloop1[i] = PBs[i].adpcm.pred_scale;
|
gadloop1[i] = PBs[i].adpcm.pred_scale;
|
||||||
gadloop2[i] = PBs[i].adpcm.yn1;
|
gadloop2[i] = PBs[i].adpcm.yn1;
|
||||||
gadloop3[i] = PBs[i].adpcm.yn2;
|
gadloop3[i] = PBs[i].adpcm.yn2;
|
||||||
|
|
||||||
gloop1[i] = PBs[i].adpcm_loop_info.pred_scale;
|
gloop1[i] = PBs[i].adpcm_loop_info.pred_scale;
|
||||||
gloop2[i] = PBs[i].adpcm_loop_info.yn1;
|
gloop2[i] = PBs[i].adpcm_loop_info.yn1;
|
||||||
gloop3[i] = PBs[i].adpcm_loop_info.yn2;
|
gloop3[i] = PBs[i].adpcm_loop_info.yn2;
|
||||||
|
|
||||||
// updates
|
// updates
|
||||||
gupdates1[i] = PBs[i].updates.num_updates[0];
|
gupdates1[i] = PBs[i].updates.num_updates[0];
|
||||||
gupdates2[i] = PBs[i].updates.num_updates[1];
|
gupdates2[i] = PBs[i].updates.num_updates[1];
|
||||||
gupdates3[i] = PBs[i].updates.num_updates[2];
|
gupdates3[i] = PBs[i].updates.num_updates[2];
|
||||||
gupdates4[i] = PBs[i].updates.num_updates[3];
|
gupdates4[i] = PBs[i].updates.num_updates[3];
|
||||||
gupdates5[i] = PBs[i].updates.num_updates[4];
|
gupdates5[i] = PBs[i].updates.num_updates[4];
|
||||||
|
|
||||||
gupdates_addr[i] = (PBs[i].updates.data_hi << 16) | PBs[i].updates.data_lo;
|
gupdates_addr[i] = (PBs[i].updates.data_hi << 16) | PBs[i].updates.data_lo;
|
||||||
|
|
||||||
gaudioFormat[i] = PBs[i].audio_addr.sample_format;
|
gaudioFormat[i] = PBs[i].audio_addr.sample_format;
|
||||||
glooping[i] = PBs[i].audio_addr.looping;
|
glooping[i] = PBs[i].audio_addr.looping;
|
||||||
gsrc_type[i] = PBs[i].src_type;
|
gsrc_type[i] = PBs[i].src_type;
|
||||||
gis_stream[i] = PBs[i].is_stream;
|
gis_stream[i] = PBs[i].is_stream;
|
||||||
|
|
||||||
// mixer
|
// mixer
|
||||||
gvolume_left[i] = PBs[i].mixer.volume_left;
|
gvolume_left[i] = PBs[i].mixer.volume_left;
|
||||||
gvolume_right[i] = PBs[i].mixer.volume_right;
|
gvolume_right[i] = PBs[i].mixer.volume_right;
|
||||||
}
|
}
|
||||||
|
|
||||||
// hopefully this is false if we don't have a debugging window and so it doesn't cause a crash
|
// hopefully this is false if we don't have a debugging window and so it doesn't cause a crash
|
||||||
if(m_frame)
|
if(m_frame)
|
||||||
{
|
{
|
||||||
m_frame->m_GPRListView->m_CachedRegs[2][i] = gsamplePos[i];
|
m_frame->m_GPRListView->m_CachedRegs[2][i] = gsamplePos[i];
|
||||||
m_frame->m_GPRListView->m_CachedRegs[2][i] = gsampleEnd[i];
|
m_frame->m_GPRListView->m_CachedRegs[2][i] = gsampleEnd[i];
|
||||||
m_frame->m_GPRListView->m_CachedRegs[3][i] = gloopPos[i];
|
m_frame->m_GPRListView->m_CachedRegs[3][i] = gloopPos[i];
|
||||||
|
|
||||||
m_frame->m_GPRListView->m_CachedRegs[4][i] = gvolume_left[i];
|
m_frame->m_GPRListView->m_CachedRegs[4][i] = gvolume_left[i];
|
||||||
m_frame->m_GPRListView->m_CachedRegs[5][i] = gvolume_right[i];
|
m_frame->m_GPRListView->m_CachedRegs[5][i] = gvolume_right[i];
|
||||||
|
|
||||||
m_frame->m_GPRListView->m_CachedRegs[6][i] = glooping[i];
|
m_frame->m_GPRListView->m_CachedRegs[6][i] = glooping[i];
|
||||||
m_frame->m_GPRListView->m_CachedRegs[7][i] = gloop1[i];
|
m_frame->m_GPRListView->m_CachedRegs[7][i] = gloop1[i];
|
||||||
m_frame->m_GPRListView->m_CachedRegs[8][i] = gloop2[i];
|
m_frame->m_GPRListView->m_CachedRegs[8][i] = gloop2[i];
|
||||||
m_frame->m_GPRListView->m_CachedRegs[9][i] = gloop3[i];
|
m_frame->m_GPRListView->m_CachedRegs[9][i] = gloop3[i];
|
||||||
|
|
||||||
m_frame->m_GPRListView->m_CachedRegs[10][i] = gis_stream[i];
|
m_frame->m_GPRListView->m_CachedRegs[10][i] = gis_stream[i];
|
||||||
|
|
||||||
m_frame->m_GPRListView->m_CachedRegs[11][i] = gaudioFormat[i];
|
m_frame->m_GPRListView->m_CachedRegs[11][i] = gaudioFormat[i];
|
||||||
m_frame->m_GPRListView->m_CachedRegs[12][i] = gsrc_type[i];
|
m_frame->m_GPRListView->m_CachedRegs[12][i] = gsrc_type[i];
|
||||||
m_frame->m_GPRListView->m_CachedRegs[13][i] = gcoef[i];
|
m_frame->m_GPRListView->m_CachedRegs[13][i] = gcoef[i];
|
||||||
|
|
||||||
m_frame->m_GPRListView->m_CachedRegs[14][i] = gfrac[i];
|
m_frame->m_GPRListView->m_CachedRegs[14][i] = gfrac[i];
|
||||||
|
|
||||||
m_frame->m_GPRListView->m_CachedRegs[15][i] = gratio[i];
|
m_frame->m_GPRListView->m_CachedRegs[15][i] = gratio[i];
|
||||||
m_frame->m_GPRListView->m_CachedRegs[16][i] = gratiohi[i];
|
m_frame->m_GPRListView->m_CachedRegs[16][i] = gratiohi[i];
|
||||||
m_frame->m_GPRListView->m_CachedRegs[17][i] = gratiolo[i];
|
m_frame->m_GPRListView->m_CachedRegs[17][i] = gratiolo[i];
|
||||||
|
|
||||||
m_frame->m_GPRListView->m_CachedRegs[18][i] = gupdates1[i];
|
m_frame->m_GPRListView->m_CachedRegs[18][i] = gupdates1[i];
|
||||||
m_frame->m_GPRListView->m_CachedRegs[19][i] = gupdates2[i];
|
m_frame->m_GPRListView->m_CachedRegs[19][i] = gupdates2[i];
|
||||||
m_frame->m_GPRListView->m_CachedRegs[20][i] = gupdates3[i];
|
m_frame->m_GPRListView->m_CachedRegs[20][i] = gupdates3[i];
|
||||||
m_frame->m_GPRListView->m_CachedRegs[21][i] = gupdates4[i];
|
m_frame->m_GPRListView->m_CachedRegs[21][i] = gupdates4[i];
|
||||||
m_frame->m_GPRListView->m_CachedRegs[22][i] = gupdates5[i];
|
m_frame->m_GPRListView->m_CachedRegs[22][i] = gupdates5[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
} // end of if (PBs[i].running)
|
|
||||||
|
// =======================================================================================
|
||||||
|
// PRESETS
|
||||||
|
// ---------------------------------------------------------------------------------------
|
||||||
|
/*
|
||||||
|
/" Nr pos / end lpos | voll volr | isl[pre yn1 yn2] iss | frac ratio[hi lo] | 1 2 3 4 5\n";
|
||||||
|
"---------------|00 12341234/12341234 12341234 | 00000 00000 | 0[000 00000 00000] 0 | 00000 00000[0 00000] |
|
||||||
|
*/
|
||||||
|
sprintf(buffer,"%c%i %08i/%08i %08i | %05i %05i | %i[%03i %05i %05i] %i | %05i %05i[%i %05i] | %i %i %i %i %i",
|
||||||
|
223, i, gsamplePos[i], gsampleEnd[i], gloopPos[i],
|
||||||
|
gvolume_left[i], gvolume_right[i],
|
||||||
|
glooping[i], gloop1[i], gloop2[i], gloop3[i], gis_stream[i],
|
||||||
|
gfrac[i], gratio[i], gratiohi[i], gratiolo[i],
|
||||||
|
gupdates1[i], gupdates2[i], gupdates3[i], gupdates4[i], gupdates5[i]
|
||||||
|
);
|
||||||
|
|
||||||
|
// add new line
|
||||||
|
sbuff = sbuff + buffer; strcpy(buffer, "");
|
||||||
|
sbuff = sbuff + "\n";
|
||||||
|
|
||||||
|
|
||||||
|
} // end of if (PBs[i].running)
|
||||||
|
|
||||||
} // end of big loop - for (int i = 0; i < numberOfPBs; i++)
|
} // end of big loop - for (int i = 0; i < numberOfPBs; i++)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// =======================================================================================
|
||||||
|
// Write global values
|
||||||
|
// ---------------
|
||||||
|
sprintf(buffer, "\nThe parameter blocks span from %08x to %08x | distance %i %i\n", m_addressPBs, gLastBlock, (gLastBlock-m_addressPBs), (gLastBlock-m_addressPBs) / 192);
|
||||||
|
sbuff = sbuff + buffer; strcpy(buffer, "");
|
||||||
|
// ===============
|
||||||
|
|
||||||
|
|
||||||
|
// =======================================================================================
|
||||||
|
// Show update frequency
|
||||||
|
// ---------------
|
||||||
|
sbuff = sbuff + "\n";
|
||||||
|
if(!iupdonce)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
for (int i = 0; i < 10; i++)
|
||||||
|
{
|
||||||
|
viupd.at(i) == 0;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
viupd.at(0) = 1;
|
||||||
|
viupd.at(1) = 1;
|
||||||
|
viupd.at(2) = 1;
|
||||||
|
iupdonce = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < viupd.size(); i++) // 0, 1,..., 9
|
||||||
|
{
|
||||||
|
if (i < viupd.size()-1)
|
||||||
|
{
|
||||||
|
viupd.at(viupd.size()-i-1) = viupd.at(viupd.size()-i-2); // move all forward
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
viupd.at(0) = viupd.at(viupd.size()-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Correction
|
||||||
|
if (viupd.at(viupd.size()-3) == 1 && viupd.at(viupd.size()-2) == 1 && viupd.at(viupd.size()-1) == 1)
|
||||||
|
{
|
||||||
|
viupd.at(0) = 0;
|
||||||
|
}
|
||||||
|
if(viupd.at(0) == 0 && viupd.at(1) == 1 && viupd.at(2) == 1 && viupd.at(3) == 0)
|
||||||
|
{
|
||||||
|
viupd.at(0) = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < viupd.size(); i++)
|
||||||
|
{
|
||||||
|
if(viupd.at(i) == 0)
|
||||||
|
sbuff = sbuff + " ";
|
||||||
|
else
|
||||||
|
sbuff = sbuff + ".";
|
||||||
|
}
|
||||||
|
// ================
|
||||||
|
|
||||||
|
|
||||||
|
// =======================================================================================
|
||||||
|
// Print
|
||||||
|
// ---------------------------------------------------------------------------------------
|
||||||
|
ClearScreen();
|
||||||
|
// we'll always have one to many \n at the end, remove it
|
||||||
|
//wprintf("%s", sbuff.substr(0, sbuff.length()-1).c_str());
|
||||||
|
wprintf("%s", sbuff.c_str());
|
||||||
|
|
||||||
|
sbuff.clear(); strcpy(buffer, "");
|
||||||
|
|
||||||
|
|
||||||
// New values are written so update - DISABLED - It flickered a lot, even worse than a
|
// New values are written so update - DISABLED - It flickered a lot, even worse than a
|
||||||
// console window. I'll add a console window later to show the current status.
|
// console window. I'll add a console window later to show the current status.
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
// Externals
|
// Externals
|
||||||
// -----------
|
// -----------
|
||||||
extern float ratioFactor;
|
extern float ratioFactor;
|
||||||
|
extern u32 gLastBlock;
|
||||||
extern CDebugger* m_frame;
|
extern CDebugger* m_frame;
|
||||||
// -----------
|
// -----------
|
||||||
|
|
||||||
|
@ -617,9 +618,12 @@ int CUCode_AX::ReadOutPBs(AXParamBlock* _pPBs, int _num)
|
||||||
for (size_t p = 0; p < sizeof(AXParamBlock) / 2; p++)
|
for (size_t p = 0; p < sizeof(AXParamBlock) / 2; p++)
|
||||||
{
|
{
|
||||||
pDest[p] = Common::swap16(pSrc[p]);
|
pDest[p] = Common::swap16(pSrc[p]);
|
||||||
|
#if defined(_DEBUG) || defined(DEBUGFAST)
|
||||||
|
gLastBlock = blockAddr + p*2 + 2; // save last block location
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
blockAddr = (_pPBs[i].next_pb_hi << 16) | _pPBs[i].next_pb_lo;
|
blockAddr = (_pPBs[i].next_pb_hi << 16) | _pPBs[i].next_pb_lo;
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -123,6 +123,32 @@ BOOL APIENTRY DllMain(HINSTANCE hinstDLL, // DLL module handle
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
// =======================================================================================
|
||||||
|
// Open close console
|
||||||
|
HWND GetConsoleHwnd(void);
|
||||||
|
void startConsoleWin(int width, int height, char* fname);
|
||||||
|
int wprintf(char *fmt, ...);
|
||||||
|
// ---------------------------------------------------------------------------------------
|
||||||
|
void OpenConsole()
|
||||||
|
{
|
||||||
|
#if defined (_WIN32)
|
||||||
|
startConsoleWin(155, 100, "Sound Debugging"); // give room for 100 rows
|
||||||
|
wprintf("OpenConsole > Console opened\n");
|
||||||
|
MoveWindow(GetConsoleHwnd(), 0,400, 1280,500, true); // move window, TODO: make this
|
||||||
|
// adjustable from the debugging window
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void CloseConsole()
|
||||||
|
{
|
||||||
|
#if defined (_WIN32)
|
||||||
|
FreeConsole();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
// =======================================================================================
|
||||||
|
|
||||||
|
|
||||||
// =======================================================================================
|
// =======================================================================================
|
||||||
// Create debugging window - We could use use wxWindow win; new CDebugger(win) like nJoy but I don't
|
// Create debugging window - We could use use wxWindow win; new CDebugger(win) like nJoy but I don't
|
||||||
// know why it would be better. - There's a lockup problem with ShowModal(), but Show() doesn't work
|
// know why it would be better. - There's a lockup problem with ShowModal(), but Show() doesn't work
|
||||||
|
|
|
@ -1,3 +1,21 @@
|
||||||
|
// Copyright (C) 2003-2008 Dolphin Project.
|
||||||
|
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, version 2.0.
|
||||||
|
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License 2.0 for more details.
|
||||||
|
|
||||||
|
// A copy of the GPL 2.0 should have been included with the program.
|
||||||
|
// If not, see http://www.gnu.org/licenses/
|
||||||
|
|
||||||
|
// Official SVN repository and contact information can be found at
|
||||||
|
// http://code.google.com/p/dolphin-emu/
|
||||||
|
|
||||||
|
|
||||||
#include "../Globals.h"
|
#include "../Globals.h"
|
||||||
#include "Common.h"
|
#include "Common.h"
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,21 @@
|
||||||
|
// Copyright (C) 2003-2008 Dolphin Project.
|
||||||
|
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, version 2.0.
|
||||||
|
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License 2.0 for more details.
|
||||||
|
|
||||||
|
// A copy of the GPL 2.0 should have been included with the program.
|
||||||
|
// If not, see http://www.gnu.org/licenses/
|
||||||
|
|
||||||
|
// Official SVN repository and contact information can be found at
|
||||||
|
// http://code.google.com/p/dolphin-emu/
|
||||||
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,21 @@
|
||||||
|
// Copyright (C) 2003-2008 Dolphin Project.
|
||||||
|
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, version 2.0.
|
||||||
|
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License 2.0 for more details.
|
||||||
|
|
||||||
|
// A copy of the GPL 2.0 should have been included with the program.
|
||||||
|
// If not, see http://www.gnu.org/licenses/
|
||||||
|
|
||||||
|
// Official SVN repository and contact information can be found at
|
||||||
|
// http://code.google.com/p/dolphin-emu/
|
||||||
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
|
||||||
void startConsoleWin(int width, int height, char* fname);
|
void startConsoleWin(int width, int height, char* fname);
|
||||||
|
|
|
@ -1,3 +1,21 @@
|
||||||
|
// Copyright (C) 2003-2008 Dolphin Project.
|
||||||
|
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, version 2.0.
|
||||||
|
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License 2.0 for more details.
|
||||||
|
|
||||||
|
// A copy of the GPL 2.0 should have been included with the program.
|
||||||
|
// If not, see http://www.gnu.org/licenses/
|
||||||
|
|
||||||
|
// Official SVN repository and contact information can be found at
|
||||||
|
// http://code.google.com/p/dolphin-emu/
|
||||||
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,21 @@
|
||||||
|
// Copyright (C) 2003-2008 Dolphin Project.
|
||||||
|
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, version 2.0.
|
||||||
|
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License 2.0 for more details.
|
||||||
|
|
||||||
|
// A copy of the GPL 2.0 should have been included with the program.
|
||||||
|
// If not, see http://www.gnu.org/licenses/
|
||||||
|
|
||||||
|
// Official SVN repository and contact information can be found at
|
||||||
|
// http://code.google.com/p/dolphin-emu/
|
||||||
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
|
||||||
void Logging();
|
void Logging();
|
||||||
|
|
|
@ -1,3 +1,21 @@
|
||||||
|
// Copyright (C) 2003-2008 Dolphin Project.
|
||||||
|
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, version 2.0.
|
||||||
|
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License 2.0 for more details.
|
||||||
|
|
||||||
|
// A copy of the GPL 2.0 should have been included with the program.
|
||||||
|
// If not, see http://www.gnu.org/licenses/
|
||||||
|
|
||||||
|
// Official SVN repository and contact information can be found at
|
||||||
|
// http://code.google.com/p/dolphin-emu/
|
||||||
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
|
||||||
// =======================================================================================
|
// =======================================================================================
|
||||||
|
|
Loading…
Reference in New Issue