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:
John Peterson 2008-10-03 10:59:56 +00:00
parent a8f484a668
commit 2c78946797
15 changed files with 717 additions and 141 deletions

View File

@ -68,17 +68,9 @@ void CBoot::EmulatedBIOS(bool _bDebug)
// Write necessary values
// ---------------------------------------------------------------------------------------
/*
"TODO: Game iso info to 0x80000000 according to yagcd - or does apploader do this?" - Answer, no
apparently it doesn't, at least not in some games (by Namco). In these cases we need to set these
manually. But I guess there's no reason that the Apploader couldn't do this by itself. So I guess we
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.
Here we write values to memory that the apploader does not take care of. Game iso info goes
to 0x80000000 according to yagcd 4.2. I'm not sure what bytes 8-10 does (version and streaming),
but I include them anyway because it seems like they are supposed to be there.
*/
// ---------------------------------------------------------------------------------------
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
// it seems like the size can be variable.
// Load Apploader to Memory - The apploader is hardcoded to begin at byte 9 280 on the disc,
// but it seems like the size can be variable. Compare with yagcd chap 13.
// ---------------------------------------------------------------------------------------
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 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
// here's an example of the disc structure of these things from Baten Kaitos - Wings. The values
// 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 :)
/*
iAppLoaderMain - Here we load the apploader, the DOL (the exe) and the FST (filesystem).
To give you an idea about where the stuff is located on the disc take a look at yagcd chap 13.
*/
// ---------------------------------------------------------------------------------------
LOG(MASTER_LOG, "Call iAppLoaderMain");
do

View File

@ -735,6 +735,14 @@
<Filter
Name="Logging"
>
<File
RelativePath=".\Src\Logging\Console.cpp"
>
</File>
<File
RelativePath=".\Src\Logging\Console.h"
>
</File>
<File
RelativePath=".\Src\Logging\Logging.cpp"
>

View File

@ -22,14 +22,18 @@
#include "Debugger.h"
#include "PBView.h"
#include "IniFile.h"
#include "../Logging/Console.h" // open and close console
// externals
extern int gUpdFreq;
// =======================================================================================
// Declare events
BEGIN_EVENT_TABLE(CDebugger,wxDialog)
EVT_CLOSE(CDebugger::OnClose)
EVT_BUTTON(ID_UPD,CDebugger::OnUpdate)
EVT_CHECKBOX(IDC_CHECK2,CDebugger::ShowHideConsole)
EVT_RADIOBOX(IDC_RADIO1,CDebugger::ChangeFrequency)
END_EVENT_TABLE()
// =======================================================================================
@ -63,6 +67,8 @@ void CDebugger::Save(IniFile& _IniFile) const
_IniFile.Set("SoundWindow", "y", GetPosition().y);
_IniFile.Set("SoundWindow", "w", GetSize().GetWidth());
_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", "h", &h, GetSize().GetHeight());
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()
{
SetTitle(wxT("Sound Debugging"));
// basic settings
SetIcon(wxNullIcon);
SetSize(8, 8, 400, 370);
SetSize(8, 8, 200, 100); // these will become the minimin sizes allowed by resizing
Center();
// the big window
m_GPRListView = new CPBView(this, ID_GPR, wxDefaultPosition, GetSize(),
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
wxCheckBox *m_Check[2];
wxRadioButton *m_Radio[6];
wxBoxSizer* sMain;
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
m_Check[0] = new wxCheckBox(this, IDC_CHECK0, wxT("Save to file"),
wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
m_Check[1] = new wxCheckBox(this, IDC_CHECK1, wxT("Show updated"),
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"),
wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
m_Radio[1] = new wxRadioButton(this, IDC_RADIO1, wxT("Show base 16"),
wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
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_radioBoxChoices0[] = { wxT("Show base 10"), wxT("Show base 16") };
m_radioBoxNChoices[0] = sizeof( m_radioBoxChoices0 ) / sizeof( wxString );
m_RadioBox[0] = new wxRadioBox( this, IDC_RADIO0, wxT("Show base"),
wxDefaultPosition, wxDefaultSize, m_radioBoxNChoices[0], m_radioBoxChoices0, 1, wxRA_SPECIFY_COLS);
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"),
wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
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"));
wxBoxSizer* sButtons;
sButtons = new wxBoxSizer(wxVERTICAL);
sButtons->AddStretchSpacer(1);
sButtons->Add(m_Upd, 0, 0, 5);
@ -140,20 +168,16 @@ SetTitle(wxT("Sound Debugging"));
sButtons->AddStretchSpacer(1);
sButtons->Add(m_Check[0], 0, 0, 5);
sButtons->Add(m_Check[1], 0, 0, 5);
sButtons->Add(m_checkSizer, 0, 2, 5);
sButtons->AddStretchSpacer(1);
sButtons->Add(m_Radio[0], 0, 0, 5);
sButtons->Add(m_Radio[1], 0, 0, 5);
sButtons->Add(m_RadioBox[0], 0, 0, 5);
sButtons->AddStretchSpacer(1);
sButtons->Add(m_Radio[2], 0, 0, 5);
sButtons->Add(m_Radio[3], 0, 0, 5);
sButtons->Add(m_Radio[4], 0, 0, 5);
sButtons->Add(m_RadioBox[1], 0, 0, 5);
sButtons->AddStretchSpacer(1);
@ -173,6 +197,10 @@ SetTitle(wxT("Sound Debugging"));
void CDebugger::OnClose(wxCloseEvent& /*event*/)
{
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*/)
@ -180,6 +208,46 @@ void CDebugger::OnUpdate(wxCommandEvent& /*event*/)
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()
{
if (m_GPRListView != NULL)

View File

@ -52,22 +52,35 @@ class CDebugger : public wxDialog
void NotifyUpdate();
void OnUpdate(wxCommandEvent& event);
void ShowHideConsole(wxCommandEvent& event);
void DoShowHideConsole();
void ChangeFrequency(wxCommandEvent& event);
void DoChangeFrequency();
CPBView* m_GPRListView;
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.
enum
{
IDC_CHECK0 = 2000,
IDC_CHECK1,
IDC_CHECK2,
IDC_RADIO0,
IDC_RADIO1,
IDC_RADIO2,
IDC_RADIO3,
IDC_RADIO4,
IDG_LABEL1,
ID_UPD,
ID_SELC,
ID_PRESETS,

View File

@ -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

View File

@ -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

View File

@ -28,7 +28,7 @@
#include <vector>
#include <string> // so that we can test std::string == abc
#ifdef _WIN32
#include <windows.h>
#include <windows.h>
#endif
#include "../UCodes/UCodes.h"
@ -37,9 +37,15 @@
#include "../Debugger/PBView.h"
#include "../Debugger/Debugger.h"
#include "Console.h" // open and close console, clear console window
// Externals
float ratioFactor; // a global to get the ratio factor from MixAdd
int gUpdFreq = 5;
u32 gLastBlock;
// Parameter blocks
@ -85,14 +91,17 @@ std::vector<u16> gis_stream(64);
int j = 0;
int k = 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
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> vector63(vectorLength);
@ -118,16 +127,16 @@ void CUCode_AX::Logging(short* _pBuffer, int _iSize, int a)
// Control how often the screen is updated
j++;
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 like this:
1 to 2
2 3
3
3 ...
*/
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
@ -147,37 +154,86 @@ void CUCode_AX::Logging(short* _pBuffer, int _iSize, int a)
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++)
{
//if (PBs[i].running)
//if (PBs[i].running && PBs[i].adpcm_loop_info.yn1 && PBs[i].mixer.volume_left)
if(true)
if (numberRunning.at(i) > 0)
{
// Playback history for the GUI debugger
std::string sbuff;
// Playback history for the GUI debugger --------------------------
if(m_frame)
{
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++)
{
if(vector1.at(i).at(j) == 0)
{
sbuff = sbuff + "0";
//strcat(buffer, " ");
sbuff = sbuff + " ";
}
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
// 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)
{
// AXPB base
gcoef[i] = PBs[i].unknown1;
// AXPB base
gcoef[i] = PBs[i].unknown1;
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;
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);
gratiohi[i] = PBs[i].src.ratio_hi;
gratiolo[i] = PBs[i].src.ratio_lo;
gfrac[i] = PBs[i].src.cur_addr_frac;
gratio[i] = (u32)(((PBs[i].src.ratio_hi << 16) + PBs[i].src.ratio_lo) * ratioFactor);
gratiohi[i] = PBs[i].src.ratio_hi;
gratiolo[i] = PBs[i].src.ratio_lo;
gfrac[i] = PBs[i].src.cur_addr_frac;
// adpcm_loop_info
gadloop1[i] = PBs[i].adpcm.pred_scale;
gadloop2[i] = PBs[i].adpcm.yn1;
gadloop3[i] = PBs[i].adpcm.yn2;
// adpcm_loop_info
gadloop1[i] = PBs[i].adpcm.pred_scale;
gadloop2[i] = PBs[i].adpcm.yn1;
gadloop3[i] = PBs[i].adpcm.yn2;
gloop1[i] = PBs[i].adpcm_loop_info.pred_scale;
gloop2[i] = PBs[i].adpcm_loop_info.yn1;
gloop3[i] = PBs[i].adpcm_loop_info.yn2;
gloop1[i] = PBs[i].adpcm_loop_info.pred_scale;
gloop2[i] = PBs[i].adpcm_loop_info.yn1;
gloop3[i] = PBs[i].adpcm_loop_info.yn2;
// updates
gupdates1[i] = PBs[i].updates.num_updates[0];
gupdates2[i] = PBs[i].updates.num_updates[1];
gupdates3[i] = PBs[i].updates.num_updates[2];
gupdates4[i] = PBs[i].updates.num_updates[3];
gupdates5[i] = PBs[i].updates.num_updates[4];
// updates
gupdates1[i] = PBs[i].updates.num_updates[0];
gupdates2[i] = PBs[i].updates.num_updates[1];
gupdates3[i] = PBs[i].updates.num_updates[2];
gupdates4[i] = PBs[i].updates.num_updates[3];
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;
glooping[i] = PBs[i].audio_addr.looping;
gsrc_type[i] = PBs[i].src_type;
gis_stream[i] = PBs[i].is_stream;
gaudioFormat[i] = PBs[i].audio_addr.sample_format;
glooping[i] = PBs[i].audio_addr.looping;
gsrc_type[i] = PBs[i].src_type;
gis_stream[i] = PBs[i].is_stream;
// mixer
gvolume_left[i] = PBs[i].mixer.volume_left;
gvolume_right[i] = PBs[i].mixer.volume_right;
// mixer
gvolume_left[i] = PBs[i].mixer.volume_left;
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
if(m_frame)
{
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[3][i] = gloopPos[i];
// hopefully this is false if we don't have a debugging window and so it doesn't cause a crash
if(m_frame)
{
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[3][i] = gloopPos[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[4][i] = gvolume_left[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[7][i] = gloop1[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[6][i] = glooping[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[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[12][i] = gsrc_type[i];
m_frame->m_GPRListView->m_CachedRegs[13][i] = gcoef[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[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[16][i] = gratiohi[i];
m_frame->m_GPRListView->m_CachedRegs[17][i] = gratiolo[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[17][i] = gratiolo[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[20][i] = gupdates3[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[18][i] = gupdates1[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[21][i] = gupdates4[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++)
// =======================================================================================
// 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
// console window. I'll add a console window later to show the current status.

View File

@ -32,6 +32,7 @@
// Externals
// -----------
extern float ratioFactor;
extern u32 gLastBlock;
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++)
{
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;
count++;
count++;
}
else
break;

View File

@ -123,6 +123,32 @@ BOOL APIENTRY DllMain(HINSTANCE hinstDLL, // DLL module handle
#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
// know why it would be better. - There's a lockup problem with ShowModal(), but Show() doesn't work

View File

@ -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 "Common.h"

View File

@ -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

View File

@ -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
void startConsoleWin(int width, int height, char* fname);

View File

@ -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

View File

@ -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
void Logging();

View File

@ -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
// =======================================================================================