246 lines
7.4 KiB
C++
246 lines
7.4 KiB
C++
// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator.
|
|
// Copyright (C) 1999-2003 Forgotten
|
|
// Copyright (C) 2005 Forgotten and the VBA development team
|
|
|
|
// 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; either version 2, or(at your option)
|
|
// any later version.
|
|
//
|
|
// 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 for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with this program; if not, write to the Free Software Foundation,
|
|
// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
// BugReport.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "vba.h"
|
|
#include "BugReport.h"
|
|
|
|
#include "../agbprint.h"
|
|
#include "../AutoBuild.h"
|
|
#include "../GBA.h"
|
|
#include "../Globals.h"
|
|
#include "../Port.h"
|
|
#include "../RTC.h"
|
|
#include "../Sound.h"
|
|
#include "../gb/gbCheats.h"
|
|
#include "../gb/gbGlobals.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// BugReport dialog
|
|
|
|
|
|
BugReport::BugReport(CWnd* pParent /*=NULL*/)
|
|
: CDialog(BugReport::IDD, pParent)
|
|
{
|
|
//{{AFX_DATA_INIT(BugReport)
|
|
// NOTE: the ClassWizard will add member initialization here
|
|
//}}AFX_DATA_INIT
|
|
}
|
|
|
|
|
|
void BugReport::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(BugReport)
|
|
DDX_Control(pDX, IDC_BUG_REPORT, m_report);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(BugReport, CDialog)
|
|
//{{AFX_MSG_MAP(BugReport)
|
|
ON_BN_CLICKED(IDC_COPY, OnCopy)
|
|
ON_BN_CLICKED(ID_OK, OnOk)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// BugReport message handlers
|
|
|
|
void BugReport::OnCopy()
|
|
{
|
|
OpenClipboard();
|
|
|
|
EmptyClipboard();
|
|
CString report;
|
|
m_report.GetWindowText(report);
|
|
|
|
HGLOBAL hglbCopy = GlobalAlloc(GMEM_MOVEABLE,
|
|
(report.GetLength() + 1) * sizeof(CHAR));
|
|
if (hglbCopy == NULL) {
|
|
CloseClipboard();
|
|
return;
|
|
}
|
|
|
|
// Lock the handle and copy the text to the buffer.
|
|
|
|
LPSTR lptstrCopy = (LPSTR)GlobalLock(hglbCopy);
|
|
memcpy(lptstrCopy, (const char *)report,
|
|
report.GetLength() * sizeof(CHAR));
|
|
lptstrCopy[report.GetLength()] = (TCHAR) 0; // null character
|
|
GlobalUnlock(hglbCopy);
|
|
|
|
// Place the handle on the clipboard.
|
|
|
|
SetClipboardData(CF_TEXT, hglbCopy);
|
|
CloseClipboard();
|
|
|
|
systemMessage(IDS_BUG_REPORT, "Bug report has been copied to the Clipboard");
|
|
}
|
|
|
|
void BugReport::OnOk()
|
|
{
|
|
EndDialog(TRUE);
|
|
}
|
|
|
|
BOOL BugReport::OnInitDialog()
|
|
{
|
|
CDialog::OnInitDialog();
|
|
|
|
CenterWindow();
|
|
|
|
CString report = createReport();
|
|
|
|
m_report.SetFont(CFont::FromHandle((HFONT)GetStockObject(SYSTEM_FIXED_FONT)));
|
|
|
|
m_report.SetWindowText(report);
|
|
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
// EXCEPTION: OCX Property Pages should return FALSE
|
|
}
|
|
|
|
|
|
static void AppendFormat(CString& report, const char *format, ...)
|
|
{
|
|
CString buffer;
|
|
va_list valist;
|
|
|
|
va_start(valist, format);
|
|
buffer.FormatV(format, valist);
|
|
va_end(valist);
|
|
report += buffer;
|
|
}
|
|
|
|
CString BugReport::createReport()
|
|
{
|
|
theApp.winCheckFullscreen();
|
|
|
|
CString report = "";
|
|
AppendFormat(report, "Emu version : %s\r\n", VERSION);
|
|
AppendFormat(report, "Emu Type : %s\r\n",
|
|
#ifdef DEBUG
|
|
"Debug Version"
|
|
#else
|
|
"Release Version"
|
|
#endif
|
|
);
|
|
|
|
if(emulating) {
|
|
AppendFormat(report, "File : %s\r\n", theApp.szFile);
|
|
|
|
char buffer[20];
|
|
if(theApp.cartridgeType == 0) {
|
|
u32 check = 0;
|
|
for(int i = 0; i < 0x4000; i += 4) {
|
|
check += *((u32 *)&bios[i]);
|
|
}
|
|
AppendFormat(report, "BIOS Checksum: %08X\r\n", check);
|
|
|
|
strncpy(buffer, (const char *)&rom[0xa0], 12);
|
|
buffer[12] = 0;
|
|
AppendFormat(report, "Internal name: %s\r\n", buffer);
|
|
|
|
strncpy(buffer, (const char *)&rom[0xac], 4);
|
|
buffer[4] = 0;
|
|
AppendFormat(report, "Game code : %s\r\n", buffer);
|
|
|
|
CString res = "";
|
|
u32 *p = (u32 *)rom;
|
|
u32 *end = (u32 *)((char *)rom+theApp.romSize);
|
|
while(p < end) {
|
|
u32 d = READ32LE(p);
|
|
|
|
if(d == 0x52504545) {
|
|
if(memcmp(p, "EEPROM_", 7) == 0) {
|
|
res += (const char *)p;
|
|
res += ' ';
|
|
}
|
|
} else if (d == 0x4D415253) {
|
|
if(memcmp(p, "SRAM_", 5) == 0) {
|
|
res += (const char *)p;
|
|
res += ' ';
|
|
}
|
|
} else if (d == 0x53414C46) {
|
|
if(memcmp(p, "FLASH1M_", 8) == 0) {
|
|
res += (const char *)p;
|
|
res += ' ';
|
|
}
|
|
} else if(memcmp(p, "FLASH", 5) == 0) {
|
|
res += (const char *)p;
|
|
res += ' ';
|
|
} else if (d == 0x52494953) {
|
|
if(memcmp(p, "SIIRTC_V", 8) == 0) {
|
|
res += (const char *)p;
|
|
res += ' ';
|
|
}
|
|
}
|
|
p++;
|
|
}
|
|
if(res.GetLength() > 0)
|
|
AppendFormat(report, "Cart Save : %s\r\n", res);
|
|
} else if(theApp.cartridgeType == 1) {
|
|
strncpy(buffer, (const char *)&gbRom[0x134], 15);
|
|
buffer[15] = 0;
|
|
AppendFormat(report, "Game title : %s\r\n", buffer);
|
|
}
|
|
}
|
|
|
|
AppendFormat(report, "Using BIOS : %d\r\n", theApp.useBiosFile);
|
|
AppendFormat(report, "Skip BIOS : %d\r\n", theApp.skipBiosFile);
|
|
AppendFormat(report, "Disable SFX : %d\r\n", cpuDisableSfx);
|
|
AppendFormat(report, "Throttle : %d\r\n", theApp.throttle);
|
|
AppendFormat(report, "Rewind : %d\r\n", theApp.rewindTimer);
|
|
AppendFormat(report, "Auto frame : %d\r\n", theApp.autoFrameSkip);
|
|
AppendFormat(report, "Video option : %d\r\n", theApp.videoOption);
|
|
AppendFormat(report, "Render type : %d\r\n", theApp.renderMethod);
|
|
AppendFormat(report, "Color depth : %d\r\n", systemColorDepth);
|
|
AppendFormat(report, "Red shift : %08x\r\n", systemRedShift);
|
|
AppendFormat(report, "Green shift : %08x\r\n", systemGreenShift);
|
|
AppendFormat(report, "Blue shift : %08x\r\n", systemBlueShift);
|
|
AppendFormat(report, "Layer setting: %04X\r\n", layerSettings);
|
|
AppendFormat(report, "Mirroring : %d\r\n", mirroringEnable);
|
|
AppendFormat(report, "Save type : %d (%d)\r\n",
|
|
theApp.winSaveType, cpuSaveType);
|
|
AppendFormat(report, "Flash size : %08X (%08x)\r\n",
|
|
theApp.winFlashSize, flashSize);
|
|
AppendFormat(report, "RTC : %d (%d)\r\n", theApp.winRtcEnable,
|
|
rtcIsEnabled());
|
|
AppendFormat(report, "AGBPrint : %d\r\n", agbPrintIsEnabled());
|
|
AppendFormat(report, "Speed toggle : %d\r\n", theApp.speedupToggle);
|
|
AppendFormat(report, "Synchronize : %d\r\n", synchronize);
|
|
AppendFormat(report, "Sound OFF : %d\r\n", soundOffFlag);
|
|
AppendFormat(report, "Channels : %04x\r\n", soundGetEnable() & 0x30f);
|
|
AppendFormat(report, "Old Sync : %d\r\n", theApp.useOldSync);
|
|
AppendFormat(report, "Priority : %d\r\n", theApp.threadPriority);
|
|
AppendFormat(report, "Filters : %d (%d)\r\n", theApp.filterType, theApp.ifbType);
|
|
AppendFormat(report, "Cheats : %d\r\n", cheatsNumber);
|
|
AppendFormat(report, "GB Cheats : %d\r\n", gbCheatNumber);
|
|
AppendFormat(report, "GB Emu Type : %d\r\n", gbEmulatorType);
|
|
|
|
return report;
|
|
}
|