int cN2Prov0501::ProcessBx(unsigned char *data, int len, int pos) { if(data[pos-1]!=0xBC) { PRINTF(L_SYS_EMU,"%04X: bad nano %02X for ROM 120",id,data[pos-1]); return -1; } if(pos!=(0x93-0x80)) { // maybe exploitable PRINTF(L_SYS_EMU,"%04X: refuse to execute from %04x",id,0x80+pos); return -1; } if(Init(id,120)) { SetMem(0x80,data,len); SetPc(0x80+pos); SetSp(0x0FFF,0x0FE0); Set(0x0001,0xFF); Set(0x000E,0xFF); Set(0x0000,0x04); ClearBreakpoints(); AddBreakpoint(0x821f); AddBreakpoint(0x0000); AddRomCallbacks(); while(!Run(hasMaprom ? 20000:5000)) { if(GetPc()==0x821f) { GetMem(0x80,data,len); return a; } else if(GetPc()==0x0000) break; else if(!RomCallbacks()) break; } } return -1; }
int cN2Prov0501::RunEmu(unsigned char *data, int len, unsigned short load, unsigned short run, unsigned short stop, unsigned short fetch, int fetch_len) { if(Init(id,120)) { SetSp(0x0FFF,0x0EF8); SetMem(load,data,len); SetPc(run); ClearBreakpoints(); AddBreakpoint(stop); if(stop!=0x0000) AddBreakpoint(0x0000); AddRomCallbacks(); while(!Run(100000)) { if(GetPc()==0x0000 || GetPc()==stop) { GetMem(fetch,data,fetch_len); return 1; } else if(!RomCallbacks()) break; } } return -1; }
void Ide::DebugClearBreakpoints() { const Workspace& wspc = IdeWorkspace(); for(int i = 0; i < wspc.GetCount(); i++) { const Package& pk = wspc.GetPackage(i); String n = wspc[i]; for(int i = 0; i < pk.file.GetCount(); i++) { String file = SourcePath(n, pk.file[i]); LineInfo& ln = Filedata(file).lineinfo; if(debugger) for(int i = 0; i < ln.GetCount(); i++) { const LineInfoRecord& lr = ln[i]; if(!lr.breakpoint.IsEmpty()) debugger->SetBreakpoint(file, lr.lineno, ""); } ClearBreakpoints(ln); } } editor.ClearBreakpoints(); }
/* ================ rvDebuggerServer::ProcessMessages Process all incoming network messages from the debugger client ================ */ bool rvDebuggerServer::ProcessMessages ( void ) { netadr_t adrFrom; msg_t msg; byte buffer[MAX_MSGLEN]; MSG_Init( &msg, buffer, sizeof( buffer ) ); // Check for pending udp packets on the debugger port while ( mPort.GetPacket ( adrFrom, msg.data, msg.cursize, msg.maxsize ) ) { unsigned short command; // Only accept packets from the debugger server for security reasons if ( !Sys_CompareNetAdrBase ( adrFrom, mClientAdr ) ) { continue; } command = (unsigned short) MSG_ReadShort ( &msg ); switch ( command ) { case DBMSG_CONNECT: mConnected = true; SendMessage ( DBMSG_CONNECTED ); break; case DBMSG_CONNECTED: mConnected = true; break; case DBMSG_DISCONNECT: ClearBreakpoints ( ); Resume ( ); mConnected = false; break; case DBMSG_ADDBREAKPOINT: HandleAddBreakpoint ( &msg ); break; case DBMSG_REMOVEBREAKPOINT: HandleRemoveBreakpoint ( &msg ); break; case DBMSG_RESUME: Resume ( ); break; case DBMSG_BREAK: mBreakNext = true; break; case DBMSG_STEPOVER: mBreakStepOver = true; mBreakStepOverDepth = mBreakInterpreter->GetCallstackDepth ( ); mBreakStepOverFunc1 = mBreakInterpreter->GetCallstack()[mBreakInterpreter->GetCallstackDepth()].f; if ( mBreakInterpreter->GetCallstackDepth() > 0 ) { mBreakStepOverFunc2 = mBreakInterpreter->GetCallstack()[mBreakInterpreter->GetCallstackDepth()-1].f; } else { mBreakStepOverFunc2 = NULL; } Resume ( ); break; case DBMSG_STEPINTO: mBreakStepInto = true; Resume ( ); break; case DBMSG_INSPECTVARIABLE: HandleInspectVariable ( &msg ); break; case DBMSG_INSPECTCALLSTACK: HandleInspectCallstack ( &msg ); break; case DBMSG_INSPECTTHREADS: HandleInspectThreads ( &msg ); break; } } return true; }
/* ================ rvDebuggerClient::~rvDebuggerClient ================ */ rvDebuggerClient::~rvDebuggerClient ( ) { ClearBreakpoints ( ); ClearCallstack ( ); ClearThreads ( ); }