make all disassembler calls threadsafe .. hopefully.

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@1462 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
hrydgard 2008-12-09 21:24:12 +00:00
parent 6bf333c893
commit d01e05b7b5
12 changed files with 297 additions and 277 deletions

View File

@ -1247,61 +1247,61 @@ namespace PPCDisasm
case 19: case 19:
switch (PPCGETIDX2(in)) { switch (PPCGETIDX2(in)) {
case 0: case 0:
mcrf(dp,in,'\0'); /* mcrf */ mcrf(dp,in,'\0'); /* mcrf */
break; break;
case 16: case 16:
branch(dp,in,"lr",0,0); /* bclr */ branch(dp,in,"lr",0,0); /* bclr */
break; break;
case 33: case 33:
crop(dp,in,"nor","not"); /* crnor */ crop(dp,in,"nor","not"); /* crnor */
break; break;
case 50: case 50:
nooper(dp,in,"rfi",PPCF_SUPER); nooper(dp,in,"rfi",PPCF_SUPER);
break; break;
case 129: case 129:
crop(dp,in,"andc",NULL); /* crandc */ crop(dp,in,"andc",NULL); /* crandc */
break; break;
case 150: case 150:
nooper(dp,in,"isync",0); nooper(dp,in,"isync",0);
break; break;
case 193: case 193:
crop(dp,in,"xor","clr"); /* crxor */ crop(dp,in,"xor","clr"); /* crxor */
break; break;
case 225: case 225:
crop(dp,in,"nand",NULL); /* crnand */ crop(dp,in,"nand",NULL); /* crnand */
break; break;
case 257: case 257:
crop(dp,in,"and",NULL); /* crand */ crop(dp,in,"and",NULL); /* crand */
break; break;
case 289: case 289:
crop(dp,in,"eqv","set"); /* creqv */ crop(dp,in,"eqv","set"); /* creqv */
break; break;
case 417: case 417:
crop(dp,in,"orc",NULL); /* crorc */ crop(dp,in,"orc",NULL); /* crorc */
break; break;
case 449: case 449:
crop(dp,in,"or","move"); /* cror */ crop(dp,in,"or","move"); /* cror */
break; break;
case 528: case 528:
branch(dp,in,"ctr",0,0); /* bcctr */ branch(dp,in,"ctr",0,0); /* bcctr */
break; break;
default: default:
ill(dp,in); ill(dp,in);
break; break;
} }
break; break;
@ -1346,24 +1346,24 @@ namespace PPCDisasm
case 30: case 30:
switch (in & 0x1c) { switch (in & 0x1c) {
case 0: case 0:
rld(dp,in,"icl",0); /* rldicl */ rld(dp,in,"icl",0); /* rldicl */
break; break;
case 1: case 1:
rld(dp,in,"icr",0); /* rldicr */ rld(dp,in,"icr",0); /* rldicr */
break; break;
case 2: case 2:
rld(dp,in,"ic",0); /* rldic */ rld(dp,in,"ic",0); /* rldic */
break; break;
case 3: case 3:
rld(dp,in,"imi",0); /* rldimi */ rld(dp,in,"imi",0); /* rldimi */
break; break;
case 4: case 4:
rld(dp,in,in&2?"cl":"cr",1); /* rldcl, rldcr */ rld(dp,in,in&2?"cl":"cr",1); /* rldcl, rldcr */
break; break;
default: default:
ill(dp,in); ill(dp,in);
break; break;
} }
break; break;
@ -1970,228 +1970,228 @@ namespace PPCDisasm
case 58: case 58:
switch (in & 3) { switch (in & 3) {
case 0: case 0:
ldst(dp,in&~3,"ld",'r',PPCF_64); ldst(dp,in&~3,"ld",'r',PPCF_64);
break; break;
case 1: case 1:
ldst(dp,in&~3,"ldu",'r',PPCF_64); ldst(dp,in&~3,"ldu",'r',PPCF_64);
break; break;
case 2: case 2:
ldst(dp,in&~3,"lwa",'r',PPCF_64); ldst(dp,in&~3,"lwa",'r',PPCF_64);
break; break;
default: default:
ill(dp,in); ill(dp,in);
break; break;
} }
break; break;
case 59: case 59:
switch (in & 0x3e) { switch (in & 0x3e) {
case 36: case 36:
fdabc(dp,in,"divs",6,0); fdabc(dp,in,"divs",6,0);
break; break;
case 40: case 40:
fdabc(dp,in,"subs",6,0); fdabc(dp,in,"subs",6,0);
break; break;
case 42: case 42:
fdabc(dp,in,"adds",6,0); fdabc(dp,in,"adds",6,0);
break; break;
case 44: case 44:
fdabc(dp,in,"sqrts",2,0); fdabc(dp,in,"sqrts",2,0);
break; break;
case 48: case 48:
fdabc(dp,in,"res",2,0); fdabc(dp,in,"res",2,0);
break; break;
case 50: case 50:
fdabc(dp,in,"muls",5,0); fdabc(dp,in,"muls",5,0);
break; break;
case 56: case 56:
fdabc(dp,in,"msubs",7,0); fdabc(dp,in,"msubs",7,0);
break; break;
case 58: case 58:
fdabc(dp,in,"madds",7,0); fdabc(dp,in,"madds",7,0);
break; break;
case 60: case 60:
fdabc(dp,in,"nmsubs",7,0); fdabc(dp,in,"nmsubs",7,0);
break; break;
case 62: case 62:
fdabc(dp,in,"nmadds",7,0); fdabc(dp,in,"nmadds",7,0);
break; break;
default: default:
ill(dp,in); ill(dp,in);
break; break;
} }
break; break;
case 62: case 62:
switch (in & 3) { switch (in & 3) {
case 0: case 0:
ldst(dp,in&~3,"std",'r',PPCF_64); ldst(dp,in&~3,"std",'r',PPCF_64);
break; break;
case 1: case 1:
ldst(dp,in&~3,"stdu",'r',PPCF_64); ldst(dp,in&~3,"stdu",'r',PPCF_64);
break; break;
default: default:
ill(dp,in); ill(dp,in);
break; break;
} }
break; break;
case 63: case 63:
if (in & 32) { if (in & 32) {
switch (in & 0x1e) { switch (in & 0x1e) {
case 4: case 4:
fdabc(dp,in,"div",6,0); fdabc(dp,in,"div",6,0);
break; break;
case 8: case 8:
fdabc(dp,in,"sub",6,0); fdabc(dp,in,"sub",6,0);
break; break;
case 10: case 10:
fdabc(dp,in,"add",6,0); fdabc(dp,in,"add",6,0);
break; break;
case 12: case 12:
fdabc(dp,in,"sqrt",2,0); fdabc(dp,in,"sqrt",2,0);
break; break;
case 14: case 14:
fdabc(dp,in,"sel",7,0); fdabc(dp,in,"sel",7,0);
break; break;
case 18: case 18:
fdabc(dp,in,"mul",5,0); fdabc(dp,in,"mul",5,0);
break; break;
case 20: case 20:
fdabc(dp,in,"rsqrte",2,0); fdabc(dp,in,"rsqrte",2,0);
break; break;
case 24: case 24:
fdabc(dp,in,"msub",7,0); fdabc(dp,in,"msub",7,0);
break; break;
case 26: case 26:
fdabc(dp,in,"madd",7,0); fdabc(dp,in,"madd",7,0);
break; break;
case 28: case 28:
fdabc(dp,in,"nmsub",7,0); fdabc(dp,in,"nmsub",7,0);
break; break;
case 30: case 30:
fdabc(dp,in,"nmadd",7,0); fdabc(dp,in,"nmadd",7,0);
break; break;
default: default:
ill(dp,in); ill(dp,in);
break; break;
} }
} }
else { else {
switch (PPCGETIDX2(in)) { switch (PPCGETIDX2(in)) {
case 0: case 0:
fcmp(dp,in,'u'); fcmp(dp,in,'u');
break; break;
case 12: case 12:
fdabc(dp,in,"rsp",10,0); fdabc(dp,in,"rsp",10,0);
break; break;
case 14: case 14:
fdabc(dp,in,"ctiw",10,0); fdabc(dp,in,"ctiw",10,0);
break; break;
case 15: case 15:
fdabc(dp,in,"ctiwz",10,0); fdabc(dp,in,"ctiwz",10,0);
break; break;
case 32: case 32:
fcmp(dp,in,'o'); fcmp(dp,in,'o');
break; break;
case 38: case 38:
mtfsb(dp,in,1); mtfsb(dp,in,1);
break; break;
case 40: case 40:
fdabc(dp,in,"neg",10,0); fdabc(dp,in,"neg",10,0);
break; break;
case 64: case 64:
mcrf(dp,in,'s'); /* mcrfs */ mcrf(dp,in,'s'); /* mcrfs */
break; break;
case 70: case 70:
mtfsb(dp,in,0); mtfsb(dp,in,0);
break; break;
case 72: case 72:
fdabc(dp,in,"mr",10,0); fdabc(dp,in,"mr",10,0);
break; break;
case 134: case 134:
if (!(in & 0x006f0800)) { if (!(in & 0x006f0800)) {
sprintf(dp->opcode,"mtfsfi%s",rcsel[in&1]); sprintf(dp->opcode,"mtfsfi%s",rcsel[in&1]);
sprintf(dp->operands,"cr%d,%d",(int)PPCGETCRD(in), sprintf(dp->operands,"cr%d,%d",(int)PPCGETCRD(in),
(int)(in & 0xf000)>>12); (int)(in & 0xf000)>>12);
} }
else else
ill(dp,in); ill(dp,in);
break; break;
case 136: case 136:
fdabc(dp,in,"nabs",10,0); fdabc(dp,in,"nabs",10,0);
break; break;
case 264: case 264:
fdabc(dp,in,"abs",10,0); fdabc(dp,in,"abs",10,0);
break; break;
case 583: case 583:
if (in & (PPCAMASK|PPCBMASK)) if (in & (PPCAMASK|PPCBMASK))
ill(dp,in); ill(dp,in);
else else
dab(dp,in,"mffs",4,0,0,-1,0); dab(dp,in,"mffs",4,0,0,-1,0);
break; break;
case 711: case 711:
if (!(in & 0x02010000)) { if (!(in & 0x02010000)) {
sprintf(dp->opcode,"mtfsf%s",rcsel[in&1]); sprintf(dp->opcode,"mtfsf%s",rcsel[in&1]);
sprintf(dp->operands,"0x%x,%d", sprintf(dp->operands,"0x%x,%d",
(unsigned)(in & 0x01fe)>>17,(int)PPCGETB(in)); (unsigned)(in & 0x01fe)>>17,(int)PPCGETB(in));
} }
else else
ill(dp,in); ill(dp,in);
break; break;
case 814: case 814:
fdabc(dp,in,"fctid",10,PPCF_64); fdabc(dp,in,"fctid",10,PPCF_64);
break; break;
case 815: case 815:
fdabc(dp,in,"fctidz",10,PPCF_64); fdabc(dp,in,"fctidz",10,PPCF_64);
break; break;
case 846: case 846:
fdabc(dp,in,"fcfid",10,PPCF_64); fdabc(dp,in,"fcfid",10,PPCF_64);
break; break;
default: default:
ill(dp,in); ill(dp,in);
break; break;
} }
} }
break; break;
@ -2204,16 +2204,17 @@ namespace PPCDisasm
} }
} }
// --------------------------------------------------------------------------- // What were MS thinking?
#ifdef _WIN32
#define snprintf _snprintf
#endif
// simplified interface // simplified interface
void DisassembleGekko(unsigned int opcode, unsigned int curInstAddr, char *dest, int max_size)
const char *DisassembleGekko(unsigned int opcode, unsigned int curInstAddr)
{ {
char opcodeStr[64], operandStr[64]; char opcodeStr[64], operandStr[64];
PPCDisasm::DisasmPara_PPC dp; PPCDisasm::DisasmPara_PPC dp;
static char buf[128]; unsigned int opc, adr;
static unsigned int opc, adr;
opc = opcode; opc = opcode;
adr = curInstAddr; adr = curInstAddr;
@ -2225,9 +2226,7 @@ const char *DisassembleGekko(unsigned int opcode, unsigned int curInstAddr)
PPCDisasm::PPC_Disassemble(&dp); PPCDisasm::PPC_Disassemble(&dp);
//sprintf(buf, "%-10s %s", opcodeStr, operandStr); snprintf(dest, max_size, "%s\t%s", opcodeStr, operandStr);
sprintf(buf, "%s\t%s", opcodeStr, operandStr);
return buf;
} }

View File

@ -22,7 +22,7 @@
#ifndef _POWERPC_DISASM #ifndef _POWERPC_DISASM
#define _POWERPC_DISASM #define _POWERPC_DISASM
const char *DisassembleGekko(unsigned int opcode, unsigned int curInstAddr); void DisassembleGekko(unsigned int opcode, unsigned int curInstAddr, char *dest, int max_size);
const char *GetGRPName(unsigned int index); const char *GetGRPName(unsigned int index);
#endif #endif

View File

@ -60,6 +60,7 @@
#ifdef _WIN32 #ifdef _WIN32
#define strcasecmp _stricmp #define strcasecmp _stricmp
#define unlink _unlink #define unlink _unlink
#define snprintf _snprintf
#else #else
#define _stricmp strcasecmp #define _stricmp strcasecmp
#define _unlink unlink #define _unlink unlink

View File

@ -125,9 +125,11 @@ void Console_Submit(const char *cmd)
u32 end; u32 end;
TCHAR temp[256]; TCHAR temp[256];
sscanf(cmd, "%s %08x %08x", temp, &start, &end); sscanf(cmd, "%s %08x %08x", temp, &start, &end);
char disasm[256];
for (u32 addr = start; addr <= end; addr += 4) { for (u32 addr = start; addr <= end; addr += 4) {
u32 data = Memory::ReadUnchecked_U32(addr); u32 data = Memory::ReadUnchecked_U32(addr);
printf("%08x: %08x: %s\n", addr, data, DisassembleGekko(data, addr)); DisassembleGekko(data, addr, disasm, 256);
printf("%08x: %08x: %s\n", addr, data, disasm);
} }
} }
CASE("help") CASE("help")

View File

@ -8,8 +8,8 @@ class DebugInterface
protected: protected:
virtual ~DebugInterface() {} virtual ~DebugInterface() {}
public: public:
virtual const char *disasm(unsigned int /*address*/) {return "NODEBUGGER";} virtual void disasm(unsigned int /*address*/, char *dest, int max_size) {strcpy(dest, "NODEBUGGER");}
virtual const char *getRawMemoryString(unsigned int /*address*/){return "NODEBUGGER";} virtual void getRawMemoryString(unsigned int /*address*/, char *dest, int max_size) {strcpy(dest, "NODEBUGGER");}
virtual int getInstructionSize(int /*instruction*/) {return 1;} virtual int getInstructionSize(int /*instruction*/) {return 1;}
virtual bool isAlive() {return true;} virtual bool isAlive() {return true;}

View File

@ -26,39 +26,43 @@
#include "../PowerPC/SymbolDB.h" #include "../PowerPC/SymbolDB.h"
// Not thread safe. // Not thread safe.
const char *PPCDebugInterface::disasm(unsigned int address) void PPCDebugInterface::disasm(unsigned int address, char *dest, int max_size)
{ {
if (Core::GetState() != Core::CORE_UNINITIALIZED) if (Core::GetState() != Core::CORE_UNINITIALIZED)
{ {
if (Memory::IsRAMAddress(address)) if (Memory::IsRAMAddress(address))
{ {
u32 op = Memory::Read_Instruction(address); u32 op = Memory::Read_Instruction(address);
return DisassembleGekko(op, address); DisassembleGekko(op, address, dest, max_size);
}
else
{
strcpy(dest, "No RAM here - invalid");
} }
return "No RAM here - invalid";
} }
else
static const char tmp[] = "<unknown>"; {
return tmp; strcpy(dest, "<unknown>");
}
} }
const char *PPCDebugInterface::getRawMemoryString(unsigned int address) void PPCDebugInterface::getRawMemoryString(unsigned int address, char *dest, int max_size)
{ {
if (Core::GetState() != Core::CORE_UNINITIALIZED) if (Core::GetState() != Core::CORE_UNINITIALIZED)
{ {
if (address < 0xE0000000) if (address < 0xE0000000)
{ {
static char str[256] ={0}; snprintf(dest, max_size, "%08X", readMemory(address));
if (sprintf(str,"%08X",readMemory(address))!=8) { }
PanicAlert("getRawMemoryString -> WTF! ( as read somewhere;) )"); else
return ":("; {
} strcpy(dest, "--------");
return str;
} }
return "No RAM";
} }
static const char tmp[] = "<unknown>"; else
return tmp; {
strcpy(dest, "<unknwn>"); // bad spelling - 8 chars
}
} }
unsigned int PPCDebugInterface::readMemory(unsigned int address) unsigned int PPCDebugInterface::readMemory(unsigned int address)

View File

@ -11,8 +11,8 @@ class PPCDebugInterface : public DebugInterface
{ {
public: public:
PPCDebugInterface(){} PPCDebugInterface(){}
virtual const char *disasm(unsigned int address); virtual void disasm(unsigned int address, char *dest, int max_size);
virtual const char *getRawMemoryString(unsigned int address); virtual void getRawMemoryString(unsigned int address, char *dest, int max_size);
virtual int getInstructionSize(int instruction) {return 4;} virtual int getInstructionSize(int instruction) {return 4;}
virtual bool isAlive(); virtual bool isAlive();
virtual bool isBreakpoint(unsigned int address); virtual bool isBreakpoint(unsigned int address);

View File

@ -158,7 +158,9 @@ void Run()
void unknown_instruction(UGeckoInstruction _inst) void unknown_instruction(UGeckoInstruction _inst)
{ {
CCPU::Break(); CCPU::Break();
printf("Last PC = %08x : %s\n", last_pc, DisassembleGekko(Memory::ReadUnchecked_U32(last_pc), last_pc)); char disasm[256];
DisassembleGekko(Memory::ReadUnchecked_U32(last_pc), last_pc, disasm, 256);
printf("Last PC = %08x : %s\n", last_pc, disasm);
Debugger::PrintCallstack(); Debugger::PrintCallstack();
_dbg_assert_msg_(GEKKO, 0, "\nIntCPU: Unknown instr %08x at PC = %08x last_PC = %08x LR = %08x\n", _inst.hex, PC, last_pc, LR); _dbg_assert_msg_(GEKKO, 0, "\nIntCPU: Unknown instr %08x at PC = %08x last_PC = %08x LR = %08x\n", _inst.hex, PC, last_pc, LR);
} }

View File

@ -327,7 +327,7 @@ bool SymbolDB::SaveMap(const char *filename, bool WithCodes) const
{ {
// Save a map file // Save a map file
const Symbol &rSymbol = itr->second; const Symbol &rSymbol = itr->second;
if(!WithCodes) if (!WithCodes)
{ {
fprintf(f,"%08x %08x %08x %i %s\n", rSymbol.address, rSymbol.size, rSymbol.address, fprintf(f,"%08x %08x %08x %i %s\n", rSymbol.address, rSymbol.size, rSymbol.address,
0, rSymbol.name.c_str()); 0, rSymbol.name.c_str());
@ -345,9 +345,9 @@ bool SymbolDB::SaveMap(const char *filename, bool WithCodes) const
/* To make nice straight lines we fill out the name with spaces, we also cut off /* To make nice straight lines we fill out the name with spaces, we also cut off
all names longer than 25 letters */ all names longer than 25 letters */
std::string TempSym; std::string TempSym;
for(u32 i = 0; i < 25; i++) for (u32 i = 0; i < 25; i++)
{ {
if(i < LastSymbolName.size()) if (i < LastSymbolName.size())
TempSym += LastSymbolName[i]; TempSym += LastSymbolName[i];
else else
TempSym += " "; TempSym += " ";
@ -355,16 +355,17 @@ bool SymbolDB::SaveMap(const char *filename, bool WithCodes) const
// We currently skip the last block because we don't know how long it goes // We currently skip the last block because we don't know how long it goes
int space; int space;
if(itr != functions.end()) if (itr != functions.end())
space = itr->second.address - LastAddress; space = itr->second.address - LastAddress;
else else
space = 0; space = 0;
for(int i = 0; i < space; i+=4) for (int i = 0; i < space; i += 4)
{ {
int Address = LastAddress + i; int Address = LastAddress + i;
fprintf(f,"%08x %i %20s %s\n", Address, char disasm[256];
0, TempSym.c_str(), debugger->disasm(Address)); debugger->disasm(Address, disasm, 256);
fprintf(f,"%08x %i %20s %s\n", Address, 0, TempSym.c_str(), disasm);
} }
fprintf(f, "\n"); // Write a blank line after each block fprintf(f, "\n"); // Write a blank line after each block
} }

View File

@ -176,8 +176,9 @@ void CCodeView::OnMouseUpL(wxMouseEvent& event)
u32 CCodeView::AddrToBranch(u32 addr) u32 CCodeView::AddrToBranch(u32 addr)
{ {
const char *temp = debugger->disasm(addr); char disasm[256];
const char *mojs = strstr(temp, "->0x"); debugger->disasm(addr, disasm, 256);
const char *mojs = strstr(disasm, "->0x");
if (mojs) if (mojs)
{ {
u32 dest; u32 dest;
@ -204,8 +205,12 @@ void CCodeView::OnPopupMenu(wxCommandEvent& event)
wxTheClipboard->SetData(new wxTextDataObject(wxString::Format(_T("%08x"), selection))); wxTheClipboard->SetData(new wxTextDataObject(wxString::Format(_T("%08x"), selection)));
break; break;
case IDM_COPYCODE: case IDM_COPYCODE:
wxTheClipboard->SetData(new wxTextDataObject(wxString::FromAscii(debugger->disasm(selection)))); //Have to manually convert from char* to wxString, don't have to in Windows? {
char disasm[256];
debugger->disasm(selection, disasm, 256);
wxTheClipboard->SetData(new wxTextDataObject(wxString::FromAscii(disasm))); //Have to manually convert from char* to wxString, don't have to in Windows?
}
break; break;
case IDM_COPYHEX: case IDM_COPYHEX:
@ -225,7 +230,9 @@ void CCodeView::OnPopupMenu(wxCommandEvent& event)
u32 start = symbol->address; u32 start = symbol->address;
u32 end = start + symbol->size; u32 end = start + symbol->size;
for (u32 addr = start; addr != end; addr += 4) { for (u32 addr = start; addr != end; addr += 4) {
text = text + StringFromFormat("%08x: ", addr) + debugger->disasm(addr) + "\r\n"; char disasm[256];
debugger->disasm(addr, disasm, 256);
text = text + StringFromFormat("%08x: ", addr) + disasm + "\r\n";
} }
wxTheClipboard->SetData(new wxTextDataObject(wxString::FromAscii(text.c_str()))); wxTheClipboard->SetData(new wxTextDataObject(wxString::FromAscii(text.c_str())));
} }
@ -423,8 +430,8 @@ void CCodeView::OnPaint(wxPaintEvent& event)
if (debugger->isAlive()) if (debugger->isAlive())
{ {
char dis[256] = {0}; char dis[256];
strcpy(dis, debugger->disasm(address)); debugger->disasm(address, dis, 256);
char* dis2 = strchr(dis, '\t'); char* dis2 = strchr(dis, '\t');
char desc[256] = ""; char desc[256] = "";

View File

@ -301,25 +301,25 @@ void CCodeWindow::CreateGUIControls(const SCoreStartupParameter& _LocalCoreStart
m_RegisterWindow->Show(true); m_RegisterWindow->Show(true);
} }
if(bBreakpointWindow) if (bBreakpointWindow)
{ {
m_BreakpointWindow = new CBreakPointWindow(this, this); m_BreakpointWindow = new CBreakPointWindow(this, this);
m_BreakpointWindow->Show(true); m_BreakpointWindow->Show(true);
} }
if(bMemoryWindow) if (bMemoryWindow)
{ {
m_MemoryWindow = new CMemoryWindow(this); m_MemoryWindow = new CMemoryWindow(this);
m_MemoryWindow->Show(true); m_MemoryWindow->Show(true);
} }
if(bJitWindow) if (bJitWindow)
{ {
m_JitWindow = new CJitWindow(this); m_JitWindow = new CJitWindow(this);
m_JitWindow->Show(true); m_JitWindow->Show(true);
} }
if(bSoundWindow) if (bSoundWindow)
{ {
// possible todo: add some kind of if here to? can it fail? // possible todo: add some kind of if here to? can it fail?
CPluginManager::GetInstance().OpenDebug( CPluginManager::GetInstance().OpenDebug(
@ -329,7 +329,7 @@ void CCodeWindow::CreateGUIControls(const SCoreStartupParameter& _LocalCoreStart
); );
} // don't have any else, just ignore it } // don't have any else, just ignore it
if(bVideoWindow) if (bVideoWindow)
{ {
// possible todo: add some kind of if here to? can it fail? // possible todo: add some kind of if here to? can it fail?
CPluginManager::GetInstance().OpenDebug( CPluginManager::GetInstance().OpenDebug(

View File

@ -170,9 +170,13 @@ void CMemoryView::OnPopupMenu(wxCommandEvent& event)
} }
break; break;
case IDM_COPYCODE: case IDM_COPYCODE:
wxTheClipboard->SetData(new wxTextDataObject(wxString::FromAscii(debugger->disasm(selection)))); //Have to manually convert from char* to wxString, don't have to in Windows? {
char disasm[256];
debugger->disasm(selection, disasm, 256);
wxTheClipboard->SetData(new wxTextDataObject(wxString::FromAscii(disasm))); //Have to manually convert from char* to wxString, don't have to in Windows?
break; break;
}
case IDM_COPYHEX: case IDM_COPYHEX:
{ {
@ -303,8 +307,8 @@ void CMemoryView::OnPaint(wxPaintEvent& event)
dc.SetBrush(currentBrush); dc.SetBrush(currentBrush);
dc.SetTextForeground(_T("#600000")); dc.SetTextForeground(_T("#600000"));
dc.DrawText(temp, 17, rowY1); dc.DrawText(temp, 17, rowY1);
char mem[256] = {0}; char mem[256];
strcpy(mem, debugger->getRawMemoryString(address)); debugger->getRawMemoryString(address, mem, 256);
dc.SetTextForeground(_T("#000080")); dc.SetTextForeground(_T("#000080"));
dc.DrawText(wxString::FromAscii(mem), 17+fontSize*(8), rowY1); dc.DrawText(wxString::FromAscii(mem), 17+fontSize*(8), rowY1);
dc.SetTextForeground(_T("#000000")); dc.SetTextForeground(_T("#000000"));
@ -312,7 +316,7 @@ void CMemoryView::OnPaint(wxPaintEvent& event)
if (debugger->isAlive()) if (debugger->isAlive())
{ {
char dis[256] = {0}; char dis[256] = {0};
strcpy(dis, debugger->disasm(address)); debugger->disasm(address, dis, 256);
char* dis2 = strchr(dis, '\t'); char* dis2 = strchr(dis, '\t');
char desc[256] = ""; char desc[256] = "";