diff --git a/Source/Core/Core/Src/Boot/Boot_BIOSEmu.cpp b/Source/Core/Core/Src/Boot/Boot_BIOSEmu.cpp index ef781448a8..204bc6c562 100644 --- a/Source/Core/Core/Src/Boot/Boot_BIOSEmu.cpp +++ b/Source/Core/Core/Src/Boot/Boot_BIOSEmu.cpp @@ -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 diff --git a/Source/Plugins/Plugin_DSP_HLE/Plugin_DSP_HLE.vcproj b/Source/Plugins/Plugin_DSP_HLE/Plugin_DSP_HLE.vcproj index d0d26c9c7d..fe88de2a92 100644 --- a/Source/Plugins/Plugin_DSP_HLE/Plugin_DSP_HLE.vcproj +++ b/Source/Plugins/Plugin_DSP_HLE/Plugin_DSP_HLE.vcproj @@ -735,6 +735,14 @@ + + + + diff --git a/Source/Plugins/Plugin_DSP_HLE/Src/Debugger/Debugger.cpp b/Source/Plugins/Plugin_DSP_HLE/Src/Debugger/Debugger.cpp index cd6d838c8b..7aba8938e0 100644 --- a/Source/Plugins/Plugin_DSP_HLE/Src/Debugger/Debugger.cpp +++ b/Source/Plugins/Plugin_DSP_HLE/Src/Debugger/Debugger.cpp @@ -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) diff --git a/Source/Plugins/Plugin_DSP_HLE/Src/Debugger/Debugger.h b/Source/Plugins/Plugin_DSP_HLE/Src/Debugger/Debugger.h index 82039b4731..8e048d3383 100644 --- a/Source/Plugins/Plugin_DSP_HLE/Src/Debugger/Debugger.h +++ b/Source/Plugins/Plugin_DSP_HLE/Src/Debugger/Debugger.h @@ -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, diff --git a/Source/Plugins/Plugin_DSP_HLE/Src/Logging/Console.cpp b/Source/Plugins/Plugin_DSP_HLE/Src/Logging/Console.cpp new file mode 100644 index 0000000000..6859abef6e --- /dev/null +++ b/Source/Plugins/Plugin_DSP_HLE/Src/Logging/Console.cpp @@ -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 +#include +#ifdef _WIN32 + #include +#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 \ No newline at end of file diff --git a/Source/Plugins/Plugin_DSP_HLE/Src/Logging/Console.h b/Source/Plugins/Plugin_DSP_HLE/Src/Logging/Console.h new file mode 100644 index 0000000000..4d8416e147 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_HLE/Src/Logging/Console.h @@ -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 diff --git a/Source/Plugins/Plugin_DSP_HLE/Src/Logging/Logging.cpp b/Source/Plugins/Plugin_DSP_HLE/Src/Logging/Logging.cpp index 9e58912008..58985ced11 100644 --- a/Source/Plugins/Plugin_DSP_HLE/Src/Logging/Logging.cpp +++ b/Source/Plugins/Plugin_DSP_HLE/Src/Logging/Logging.cpp @@ -28,7 +28,7 @@ #include #include // so that we can test std::string == abc #ifdef _WIN32 -#include + #include #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 gis_stream(64); int j = 0; int k = 0; long int l = 0; - - +int iupd = 0; +bool iupdonce = false; +std::vector 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 > vector1(64, std::vector(100,0)); -int vectorLength = 8; +std::vector numberRunning(64); std::vector vector62(vectorLength); std::vector 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. diff --git a/Source/Plugins/Plugin_DSP_HLE/Src/UCodes/UCode_AX.cpp b/Source/Plugins/Plugin_DSP_HLE/Src/UCodes/UCode_AX.cpp index 2da9bf0d13..7ce32e6d0a 100644 --- a/Source/Plugins/Plugin_DSP_HLE/Src/UCodes/UCode_AX.cpp +++ b/Source/Plugins/Plugin_DSP_HLE/Src/UCodes/UCode_AX.cpp @@ -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; diff --git a/Source/Plugins/Plugin_DSP_HLE/Src/main.cpp b/Source/Plugins/Plugin_DSP_HLE/Src/main.cpp index 0b06d4f7f3..6d5585d9a6 100644 --- a/Source/Plugins/Plugin_DSP_HLE/Src/main.cpp +++ b/Source/Plugins/Plugin_DSP_HLE/Src/main.cpp @@ -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 diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/Logging/AXTask.cpp b/Source/Plugins/Plugin_DSP_LLE/Src/Logging/AXTask.cpp index dbd39f30fb..e058dc44cb 100644 --- a/Source/Plugins/Plugin_DSP_LLE/Src/Logging/AXTask.cpp +++ b/Source/Plugins/Plugin_DSP_LLE/Src/Logging/AXTask.cpp @@ -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" diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/Logging/Console.cpp b/Source/Plugins/Plugin_DSP_LLE/Src/Logging/Console.cpp index fbdcfd4199..ae4c9ea520 100644 --- a/Source/Plugins/Plugin_DSP_LLE/Src/Logging/Console.cpp +++ b/Source/Plugins/Plugin_DSP_LLE/Src/Logging/Console.cpp @@ -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 diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/Logging/Console.h b/Source/Plugins/Plugin_DSP_LLE/Src/Logging/Console.h index 0b7577dd78..4c405dafae 100644 --- a/Source/Plugins/Plugin_DSP_LLE/Src/Logging/Console.h +++ b/Source/Plugins/Plugin_DSP_LLE/Src/Logging/Console.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 void startConsoleWin(int width, int height, char* fname); diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/Logging/Logging.cpp b/Source/Plugins/Plugin_DSP_LLE/Src/Logging/Logging.cpp index 85a0b79843..3888ecd33d 100644 --- a/Source/Plugins/Plugin_DSP_LLE/Src/Logging/Logging.cpp +++ b/Source/Plugins/Plugin_DSP_LLE/Src/Logging/Logging.cpp @@ -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 diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/Logging/Logging.h b/Source/Plugins/Plugin_DSP_LLE/Src/Logging/Logging.h index a8fda99be5..a6b3fec1a8 100644 --- a/Source/Plugins/Plugin_DSP_LLE/Src/Logging/Logging.h +++ b/Source/Plugins/Plugin_DSP_LLE/Src/Logging/Logging.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 void Logging(); diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/Logging/ReadPBs.cpp b/Source/Plugins/Plugin_DSP_LLE/Src/Logging/ReadPBs.cpp index b638aa1c14..6bd3ccd351 100644 --- a/Source/Plugins/Plugin_DSP_LLE/Src/Logging/ReadPBs.cpp +++ b/Source/Plugins/Plugin_DSP_LLE/Src/Logging/ReadPBs.cpp @@ -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 // =======================================================================================