void CMemoryView::OnPaint(wxPaintEvent& event) { wxPaintDC dc(this); wxRect rc = GetClientRect(); wxFont hFont("Courier"); hFont.SetFamily(wxFONTFAMILY_TELETYPE); wxCoord w,h; dc.GetTextExtent("0WJyq", &w, &h, nullptr, nullptr, &hFont); if (h > rowHeight) rowHeight = h; dc.GetTextExtent("0WJyq", &w, &h, nullptr, nullptr, &DebuggerFont); if (h > rowHeight) rowHeight = h; if (viewAsType==VIEWAS_HEX) dc.SetFont(hFont); else dc.SetFont(DebuggerFont); dc.GetTextExtent("W", &w, &h); int fontSize = w; int textPlacement = 17 + 9 * fontSize; // TODO: Add any drawing code here... int width = rc.width; int numRows = (rc.height / rowHeight) / 2 + 2; dc.SetBackgroundMode(wxTRANSPARENT); const wxColour bgColor = *wxWHITE; wxPen nullPen(bgColor); wxPen currentPen(*wxBLACK_PEN); wxPen selPen(*wxGREY_PEN); nullPen.SetStyle(wxTRANSPARENT); wxBrush currentBrush(*wxLIGHT_GREY_BRUSH); wxBrush pcBrush(*wxGREEN_BRUSH); wxBrush mcBrush(*wxBLUE_BRUSH); wxBrush bgBrush(bgColor); wxBrush nullBrush(bgColor); nullBrush.SetStyle(wxTRANSPARENT); dc.SetPen(nullPen); dc.SetBrush(bgBrush); dc.DrawRectangle(0, 0, 16, rc.height); dc.DrawRectangle(0, 0, rc.width, 5+8); // TODO - clean up this freaking mess!!!!! for (int row = -numRows; row <= numRows; row++) { unsigned int address = curAddress + row * align; int rowY1 = rc.height / 2 + rowHeight * row - rowHeight / 2; int rowY2 = rc.height / 2 + rowHeight * row + rowHeight / 2; wxString temp = wxString::Format("%08x", address); u32 col = debugger->GetColor(address); wxBrush rowBrush(wxColour(col >> 16, col >> 8, col)); dc.SetBrush(nullBrush); dc.SetPen(nullPen); dc.DrawRectangle(0, rowY1, 16, rowY2); if (selecting && (address == selection)) dc.SetPen(selPen); else dc.SetPen(row == 0 ? currentPen : nullPen); if (address == debugger->GetPC()) dc.SetBrush(pcBrush); else dc.SetBrush(rowBrush); dc.DrawRectangle(16, rowY1, width, rowY2 - 1); dc.SetBrush(currentBrush); dc.SetTextForeground("#600000"); // Dark red dc.DrawText(temp, 17, rowY1); if (viewAsType != VIEWAS_HEX) { char mem[256]; debugger->GetRawMemoryString(memory, address, mem, 256); dc.SetTextForeground(wxTheColourDatabase->Find("NAVY")); dc.DrawText(StrToWxStr(mem), 17+fontSize*(8), rowY1); dc.SetTextForeground(*wxBLACK); } if (!PowerPC::HostIsRAMAddress(address)) continue; if (debugger->IsAlive()) { std::string dis; u32 mem_data = debugger->ReadExtraMemory(memory, address); if (viewAsType == VIEWAS_FP) { float flt = *(float *)(&mem_data); dis = StringFromFormat("f: %f", flt); } else if (viewAsType == VIEWAS_ASCII) { u32 a[4] = { (mem_data & 0xff000000) >> 24, (mem_data & 0xff0000) >> 16, (mem_data & 0xff00) >> 8, (mem_data & 0xff) }; for (auto& word : a) { if (word == '\0') word = ' '; } dis = StringFromFormat("%c%c%c%c", a[0], a[1], a[2], a[3]); } else if (viewAsType == VIEWAS_HEX)
void CCodeView::OnPaint(wxPaintEvent& event) { // ------------------------- // General settings // ------------------------- std::unique_ptr<wxGraphicsContext> ctx(wxGraphicsContext::Create(wxPaintDC(this))); wxRect rc = GetClientRect(); ctx->SetFont(DebuggerFont, *wxBLACK); wxDouble w, h; ctx->GetTextExtent("0WJyq", &w, &h); if (h > m_rowHeight) m_rowHeight = h; ctx->GetTextExtent("W", &w, &h); int charWidth = w; struct branch { int src, dst, srcAddr; }; branch branches[256]; int numBranches = 0; // TODO: Add any drawing code here... int width = rc.width; int numRows = ((rc.height / m_rowHeight) / 2) + 2; // ------------ // ------------------------- // Colors and brushes // ------------------------- const wxColour bgColor = *wxWHITE; wxPen nullPen(bgColor); wxPen currentPen(*wxBLACK_PEN); wxPen selPen(*wxGREY_PEN); nullPen.SetStyle(wxPENSTYLE_TRANSPARENT); currentPen.SetStyle(wxPENSTYLE_SOLID); wxBrush currentBrush(*wxLIGHT_GREY_BRUSH); wxBrush pcBrush(*wxGREEN_BRUSH); wxBrush bpBrush(*wxRED_BRUSH); wxBrush bgBrush(bgColor); wxBrush nullBrush(bgColor); nullBrush.SetStyle(wxBRUSHSTYLE_TRANSPARENT); ctx->SetPen(nullPen); ctx->SetBrush(bgBrush); ctx->DrawRectangle(0, 0, 16, rc.height); ctx->DrawRectangle(0, 0, rc.width, 5); // ------------ // ----------------------------- // Walk through all visible rows // ----------------------------- for (int i = -numRows; i <= numRows; i++) { unsigned int address = m_curAddress + (i * m_align); int rowY1 = (rc.height / 2) + (m_rowHeight * i) - (m_rowHeight / 2); int rowY2 = (rc.height / 2) + (m_rowHeight * i) + (m_rowHeight / 2); wxString temp = wxString::Format("%08x", address); u32 color = m_debugger->GetColor(address); wxBrush rowBrush(wxColour(color >> 16, color >> 8, color)); ctx->SetBrush(nullBrush); ctx->SetPen(nullPen); ctx->DrawRectangle(0, rowY1, 16, rowY2 - rowY1 + 2); if (m_selecting && (address == m_selection)) ctx->SetPen(selPen); else ctx->SetPen(i == 0 ? currentPen : nullPen); if (address == m_debugger->GetPC()) ctx->SetBrush(pcBrush); else ctx->SetBrush(rowBrush); ctx->DrawRectangle(16, rowY1, width, rowY2 - rowY1 + 1); ctx->SetBrush(currentBrush); if (!m_plain) { // the address text is dark red ctx->SetFont(DebuggerFont, wxColour("#600000")); ctx->DrawText(temp, 17, rowY1); ctx->SetFont(DebuggerFont, *wxBLACK); } // If running if (m_debugger->IsAlive()) { std::vector<std::string> dis; SplitString(m_debugger->Disassemble(address), '\t', dis); dis.resize(2); static const size_t VALID_BRANCH_LENGTH = 10; const std::string& opcode = dis[0]; const std::string& operands = dis[1]; std::string desc; // look for hex strings to decode branches std::string hex_str; size_t pos = operands.find("0x8"); if (pos != std::string::npos) { hex_str = operands.substr(pos); } if (hex_str.length() == VALID_BRANCH_LENGTH) { u32 offs = std::stoul(hex_str, nullptr, 16); branches[numBranches].src = rowY1 + (m_rowHeight / 2); branches[numBranches].srcAddr = (address / m_align); branches[numBranches++].dst = (int)(rowY1 + ((s64)(u32)offs - (s64)(u32)address) * m_rowHeight / m_align + m_rowHeight / 2); desc = StringFromFormat("-->%s", m_debugger->GetDescription(offs).c_str()); // the -> arrow illustrations are purple ctx->SetFont(DebuggerFont, wxTheColourDatabase->Find("PURPLE")); } else { ctx->SetFont(DebuggerFont, *wxBLACK); } ctx->DrawText(StrToWxStr(operands), 17 + 17 * charWidth, rowY1); // ------------ // Show blr as its' own color if (opcode == "blr") ctx->SetFont(DebuggerFont, wxTheColourDatabase->Find("DARK GREEN")); else ctx->SetFont(DebuggerFont, wxTheColourDatabase->Find("VIOLET")); ctx->DrawText(StrToWxStr(opcode), 17 + (m_plain ? 1 * charWidth : 9 * charWidth), rowY1); if (desc.empty()) { desc = m_debugger->GetDescription(address); } if (!m_plain) { ctx->SetFont(DebuggerFont, *wxBLUE); // char temp[256]; // UnDecorateSymbolName(desc,temp,255,UNDNAME_COMPLETE); if (!desc.empty()) { ctx->DrawText(StrToWxStr(desc), 17 + 35 * charWidth, rowY1); } } // Show red breakpoint dot if (m_debugger->IsBreakpoint(address)) { ctx->SetBrush(bpBrush); ctx->DrawRectangle(2, rowY1 + 1, 11, 11); } } } // end of for // ------------ // ------------------------- // Colors and brushes // ------------------------- ctx->SetPen(currentPen); for (int i = 0; i < numBranches; i++) { int x = 17 + 49 * charWidth + (branches[i].srcAddr % 9) * 8; MoveTo(x - 2, branches[i].src); if (branches[i].dst < rc.height + 400 && branches[i].dst > -400) { LineTo(ctx, x + 2, branches[i].src); LineTo(ctx, x + 2, branches[i].dst); LineTo(ctx, x - 4, branches[i].dst); MoveTo(x, branches[i].dst - 4); LineTo(ctx, x - 4, branches[i].dst); LineTo(ctx, x + 1, branches[i].dst + 5); } // else //{ // This can be re-enabled when there is a scrollbar or // something on the codeview (the lines are too long) // LineTo(ctx, x+4, branches[i].src); // MoveTo(x+2, branches[i].dst-4); // LineTo(ctx, x+6, branches[i].dst); // LineTo(ctx, x+1, branches[i].dst+5); //} // LineTo(ctx, x, branches[i].dst+4); // LineTo(ctx, x-2, branches[i].dst); } // ------------ }
void CCodeView::OnPaint(wxPaintEvent& event) { // -------------------------------------------------------------------- // General settings // ------------------------- wxPaintDC dc(this); wxRect rc = GetClientRect(); dc.SetFont(DebuggerFont); wxCoord w,h; dc.GetTextExtent(_T("0WJyq"),&w,&h); if (h > rowHeight) rowHeight = h; dc.GetTextExtent(_T("W"),&w,&h); int charWidth = w; struct branch { int src, dst, srcAddr; }; branch branches[256]; int numBranches = 0; // TODO: Add any drawing code here... int width = rc.width; int numRows = (rc.height / rowHeight) / 2 + 2; // ------------ // -------------------------------------------------------------------- // Colors and brushes // ------------------------- dc.SetBackgroundMode(wxTRANSPARENT); // the text background const wxChar* bgColor = _T("#ffffff"); wxPen nullPen(bgColor); wxPen currentPen(_T("#000000")); wxPen selPen(_T("#808080")); // gray nullPen.SetStyle(wxTRANSPARENT); currentPen.SetStyle(wxSOLID); wxBrush currentBrush(_T("#FFEfE8")); // light gray wxBrush pcBrush(_T("#70FF70")); // green wxBrush bpBrush(_T("#FF3311")); // red wxBrush bgBrush(bgColor); wxBrush nullBrush(bgColor); nullBrush.SetStyle(wxTRANSPARENT); dc.SetPen(nullPen); dc.SetBrush(bgBrush); dc.DrawRectangle(0, 0, 16, rc.height); dc.DrawRectangle(0, 0, rc.width, 5); // ------------ // -------------------------------------------------------------------- // Walk through all visible rows // ------------------------- for (int i = -numRows; i <= numRows; i++) { unsigned int address = curAddress + i * align; int rowY1 = rc.height / 2 + rowHeight * i - rowHeight / 2; int rowY2 = rc.height / 2 + rowHeight * i + rowHeight / 2; wxString temp = wxString::Format(_T("%08x"), address); u32 col = debugger->GetColor(address); wxBrush rowBrush(wxColor(col >> 16, col >> 8, col)); dc.SetBrush(nullBrush); dc.SetPen(nullPen); dc.DrawRectangle(0, rowY1, 16, rowY2 - rowY1 + 2); if (selecting && (address == selection)) dc.SetPen(selPen); else dc.SetPen(i == 0 ? currentPen : nullPen); if (address == debugger->GetPC()) dc.SetBrush(pcBrush); else dc.SetBrush(rowBrush); dc.DrawRectangle(16, rowY1, width, rowY2 - rowY1 + 1); dc.SetBrush(currentBrush); if (!plain) { dc.SetTextForeground(_T("#600000")); // the address text is dark red dc.DrawText(temp, 17, rowY1); dc.SetTextForeground(_T("#000000")); } // If running if (debugger->IsAlive()) { char dis[256]; debugger->Disassemble(address, dis, 256); char* dis2 = strchr(dis, '\t'); char desc[256] = ""; // If we have a code if (dis2) { *dis2 = 0; dis2++; // look for hex strings to decode branches const char* mojs = strstr(dis2, "0x8"); if (mojs) { for (int k = 0; k < 8; k++) { bool found = false; for (int j = 0; j < 22; j++) { if (mojs[k + 2] == "0123456789ABCDEFabcdef"[j]) found = true; } if (!found) { mojs = nullptr; break; } } } if (mojs) { int offs; sscanf(mojs + 2, "%08x", &offs); branches[numBranches].src = rowY1 + rowHeight / 2; branches[numBranches].srcAddr = address / align; branches[numBranches++].dst = (int)(rowY1 + ((s64)(u32)offs - (s64)(u32)address) * rowHeight / align + rowHeight / 2); sprintf(desc, "-->%s", debugger->GetDescription(offs).c_str()); dc.SetTextForeground(_T("#600060")); // the -> arrow illustrations are purple } else { dc.SetTextForeground(_T("#000000")); } dc.DrawText(StrToWxStr(dis2), 17 + 17*charWidth, rowY1); // ------------ } // Show blr as its' own color if (strcmp(dis, "blr")) dc.SetTextForeground(_T("#007000")); // dark green else dc.SetTextForeground(_T("#8000FF")); // purple dc.DrawText(StrToWxStr(dis), 17 + (plain ? 1*charWidth : 9*charWidth), rowY1); if (desc[0] == 0) { strcpy(desc, debugger->GetDescription(address).c_str()); } if (!plain) { dc.SetTextForeground(_T("#0000FF")); // blue //char temp[256]; //UnDecorateSymbolName(desc,temp,255,UNDNAME_COMPLETE); if (strlen(desc)) { dc.DrawText(StrToWxStr(desc), 17 + 35 * charWidth, rowY1); } } // Show red breakpoint dot if (debugger->IsBreakpoint(address)) { dc.SetBrush(bpBrush); dc.DrawRectangle(2, rowY1 + 1, 11, 11); } } } // end of for // ------------ // -------------------------------------------------------------------- // Colors and brushes // ------------------------- dc.SetPen(currentPen); for (int i = 0; i < numBranches; i++) { int x = 17 + 49 * charWidth + (branches[i].srcAddr % 9) * 8; _MoveTo(x-2, branches[i].src); if (branches[i].dst < rc.height + 400 && branches[i].dst > -400) { _LineTo(dc, x+2, branches[i].src); _LineTo(dc, x+2, branches[i].dst); _LineTo(dc, x-4, branches[i].dst); _MoveTo(x, branches[i].dst - 4); _LineTo(dc, x-4, branches[i].dst); _LineTo(dc, x+1, branches[i].dst+5); } //else //{ // This can be re-enabled when there is a scrollbar or // something on the codeview (the lines are too long) //_LineTo(dc, x+4, branches[i].src); //_MoveTo(x+2, branches[i].dst-4); //_LineTo(dc, x+6, branches[i].dst); //_LineTo(dc, x+1, branches[i].dst+5); //} //_LineTo(dc, x, branches[i].dst+4); //_LineTo(dc, x-2, branches[i].dst); } // ------------ }
void CtrlDisAsmView::paintEvent(QPaintEvent *) { QPainter painter(this); painter.setBrush(Qt::white); painter.setPen(Qt::white); painter.drawRect(rect()); struct branch { int src,dst,srcAddr; bool conditional; }; branch branches[256]; int numBranches=0; int width = rect().width(); int numRows=(rect().height()/rowHeight); QColor bgColor(0xFFFFFFFF); QPen nullPen(bgColor); QPen currentPen(QColor(0,0,0)); QPen selPen(QColor(0xFF808080)); QPen condPen(QColor(0xFFFF3020)); QBrush lbr; lbr.setColor(bgColor); QBrush currentBrush(QColor(0xFFFFEfE8)); QBrush pcBrush(QColor(0xFF70FF70)); QFont normalFont("Arial", 10); QFont boldFont("Arial", 10); QFont alignedFont("Monospace", 10); alignedFont.setStyleHint(QFont::Monospace); boldFont.setBold(true); painter.setFont(normalFont); QImage breakPoint(":/resources/breakpoint.ico"); int i; curAddress&=~(align-1); align=(debugger->getInstructionSize(0)); for (i=0; i<=numRows; i++) { unsigned int address=curAddress + (i-(numRows/2))*align; int rowY1 = rect().top() + rowHeight*i; int rowY2 = rect().top() + rowHeight*i + rowHeight - 1; lbr.setColor((unsigned int)marker == address ? QColor(0xFFFFEEE0) : QColor(debugger->getColor(address))); QColor bg = lbr.color(); painter.setBrush(currentBrush); painter.setPen(nullPen); painter.drawRect(0,rowY1,16-1,rowY2-rowY1); if (selecting && address == (unsigned int)selection) painter.setPen(selPen); else { if(i==numRows/2) painter.setPen(currentPen); else painter.setPen(bg); } painter.setBrush(QBrush(bg)); if (address == debugger->getPC()) { painter.setBrush(pcBrush); } painter.drawRect(16,rowY1,width-16-1,rowY2-rowY1); painter.setBrush(currentBrush); QPen textPen(QColor(halfAndHalf(bg.rgba(),0))); painter.setPen(textPen); painter.setFont(alignedFont); painter.drawText(17,rowY1-3+rowHeight,QString("%1").arg(address,8,16,QChar('0'))); painter.setFont(normalFont); textPen.setColor(QColor(0xFF000000)); painter.setPen(textPen); if (debugger->isAlive()) { const char *dizz = debugger->disasm(address, align); char dis[512]; strcpy(dis, dizz); char *dis2 = strchr(dis,'\t'); char desc[256]=""; if (dis2) { *dis2=0; dis2++; const char *mojs=strstr(dis2,"->$"); if (mojs) { for (int i=0; i<8; i++) { bool found=false; for (int j=0; j<22; j++) { if (mojs[i+3]=="0123456789ABCDEFabcdef"[j]) found=true; } if (!found) { mojs=0; break; } } } if (mojs) { int offs; sscanf(mojs+3,"%08x",&offs); branches[numBranches].src=rowY1 + rowHeight/2; branches[numBranches].srcAddr=address/align; branches[numBranches].dst=(int)(rowY1+((s64)offs-(s64)address)*rowHeight/align + rowHeight/2); branches[numBranches].conditional = (dis[1]!=0); //unconditional 'b' branch numBranches++; const char *t = debugger->getDescription(offs).c_str(); if (memcmp(t,"z_",2)==0) t+=2; if (memcmp(t,"zz_",3)==0) t+=3; sprintf(desc,"-->%s", t); textPen.setColor(QColor(0xFF600060)); painter.setPen(textPen); } else { textPen.setColor(QColor(0xFF000000)); painter.setPen(textPen); } painter.drawText(149,rowY1-3+rowHeight,QString(dis2)); } textPen.setColor(QColor(0xFF007000)); painter.setPen(textPen); painter.setFont(boldFont); painter.drawText(84,rowY1-3+rowHeight,QString(dis)); painter.setFont(normalFont); if (desc[0]==0) { const char *t = debugger->getDescription(address).c_str(); if (memcmp(t,"z_",2)==0) t+=2; if (memcmp(t,"zz_",3)==0) t+=3; strcpy(desc,t); } if (memcmp(desc,"-->",3) == 0) { textPen.setColor(QColor(0xFF0000FF)); painter.setPen(textPen); } else { textPen.setColor(halfAndHalf(halfAndHalf(bg.rgba(),0),bg.rgba())); painter.setPen(textPen); } if (strlen(desc)) painter.drawText(std::max(280,width/3+190),rowY1-3+rowHeight,QString(desc)); if (debugger->isBreakpoint(address)) { painter.drawImage(2,rowY1+2,breakPoint); } } } for (i=0; i<numBranches; i++) { painter.setPen(branches[i].conditional ? condPen : currentPen); int x=280+(branches[i].srcAddr%9)*8; QPoint curPos(x-2,branches[i].src); if (branches[i].dst<rect().bottom()+200 && branches[i].dst>-200) { painter.drawLine(curPos, QPoint(x+2,branches[i].src)); curPos = QPoint(x+2,branches[i].src); painter.drawLine(curPos, QPoint(x+2,branches[i].dst)); curPos = QPoint(x+2,branches[i].dst); painter.drawLine(curPos, QPoint(x-4,branches[i].dst)); curPos = QPoint(x,branches[i].dst-4); painter.drawLine(curPos, QPoint(x-4,branches[i].dst)); curPos = QPoint(x-4,branches[i].dst); painter.drawLine(curPos, QPoint(x+1,branches[i].dst+5)); } else { painter.drawLine(curPos, QPoint(x+4,branches[i].src)); } } }
void CMemoryView::OnPaint(wxPaintEvent& event) { wxPaintDC dc(this); wxRect rc = GetClientRect(); wxFont hFont(_T("Courier")); hFont.SetFamily(wxFONTFAMILY_TELETYPE); wxCoord w,h; dc.GetTextExtent(_T("0WJyq"),&w,&h,nullptr,nullptr,&hFont); if (h > rowHeight) rowHeight = h; dc.GetTextExtent(_T("0WJyq"),&w,&h,nullptr,nullptr,&DebuggerFont); if (h > rowHeight) rowHeight = h; if (viewAsType==VIEWAS_HEX) dc.SetFont(hFont); else dc.SetFont(DebuggerFont); dc.GetTextExtent(_T("W"),&w,&h); int fontSize = w; int textPlacement = 17 + 9 * fontSize; // TODO: Add any drawing code here... int width = rc.width; int numRows = (rc.height / rowHeight) / 2 + 2; dc.SetBackgroundMode(wxTRANSPARENT); const wxChar* bgColor = _T("#ffffff"); wxPen nullPen(bgColor); wxPen currentPen(_T("#000000")); wxPen selPen(_T("#808080")); // gray nullPen.SetStyle(wxTRANSPARENT); wxBrush currentBrush(_T("#FFEfE8")); // light gray wxBrush pcBrush(_T("#70FF70")); // green wxBrush mcBrush(_T("#1133FF")); // blue wxBrush bgBrush(bgColor); wxBrush nullBrush(bgColor); nullBrush.SetStyle(wxTRANSPARENT); dc.SetPen(nullPen); dc.SetBrush(bgBrush); dc.DrawRectangle(0, 0, 16, rc.height); dc.DrawRectangle(0, 0, rc.width, 5+8); // TODO - clean up this freaking mess!!!!! for (int row = -numRows; row <= numRows; row++) { unsigned int address = curAddress + row * align; int rowY1 = rc.height / 2 + rowHeight * row - rowHeight / 2; int rowY2 = rc.height / 2 + rowHeight * row + rowHeight / 2; wxString temp = wxString::Format(_T("%08x"), address); u32 col = debugger->GetColor(address); wxBrush rowBrush(wxColor(col >> 16, col >> 8, col)); dc.SetBrush(nullBrush); dc.SetPen(nullPen); dc.DrawRectangle(0, rowY1, 16, rowY2); if (selecting && (address == selection)) dc.SetPen(selPen); else dc.SetPen(row == 0 ? currentPen : nullPen); if (address == debugger->GetPC()) dc.SetBrush(pcBrush); else dc.SetBrush(rowBrush); dc.DrawRectangle(16, rowY1, width, rowY2 - 1); dc.SetBrush(currentBrush); dc.SetTextForeground(_T("#600000")); dc.DrawText(temp, 17, rowY1); if (viewAsType != VIEWAS_HEX) { char mem[256]; debugger->GetRawMemoryString(memory, address, mem, 256); dc.SetTextForeground(_T("#000080")); dc.DrawText(StrToWxStr(mem), 17+fontSize*(8), rowY1); dc.SetTextForeground(_T("#000000")); } if (debugger->IsAlive()) { char dis[256] = {0}; u32 mem_data = debugger->ReadExtraMemory(memory, address); if (viewAsType == VIEWAS_FP) { float flt = *(float *)(&mem_data); sprintf(dis, "f: %f", flt); } else if (viewAsType == VIEWAS_ASCII) { u32 a[4] = {(mem_data&0xff000000)>>24, (mem_data&0xff0000)>>16, (mem_data&0xff00)>>8, mem_data&0xff}; for (auto& word : a) if (word == '\0') word = ' '; sprintf(dis, "%c%c%c%c", a[0], a[1], a[2], a[3]); } else if (viewAsType == VIEWAS_HEX)
void CtrlMemView::paintEvent(QPaintEvent *) { QPainter painter(this); painter.setBrush(Qt::white); painter.setPen(Qt::white); painter.drawRect(rect()); if (!debugger) return; int width = rect().width(); int numRows=(rect().bottom()/rowHeight)/2+1; QPen nullPen(0xFFFFFF); QPen currentPen(0xFF000000); QPen selPen(0x808080); QBrush lbr(0xFFFFFF); QBrush nullBrush(0xFFFFFF); QBrush currentBrush(0xFFEFE8); QBrush pcBrush(0x70FF70); QPen textPen; QFont normalFont("Arial", 10); QFont alignedFont("Monospace", 10); alignedFont.setStyleHint(QFont::Monospace); painter.setFont(normalFont); int i; curAddress&=~(align-1); for (i=-numRows; i<=numRows; i++) { unsigned int address=curAddress + i*align*alignMul; int rowY1 = rect().bottom()/2 + rowHeight*i - rowHeight/2; int rowY2 = rect().bottom()/2 + rowHeight*i + rowHeight/2; char temp[256]; painter.setBrush(currentBrush); if (selecting && address == (unsigned int)selection) painter.setPen(selPen); else painter.setPen(i==0 ? currentPen : nullPen); painter.drawRect(0, rowY1, 16-1, rowY2 - rowY1 - 1); painter.drawRect(16, rowY1, width - 16 -1, rowY2 - rowY1 - 1); painter.setBrush(nullBrush); textPen.setColor(0x600000); painter.setPen(textPen); painter.setFont(alignedFont); painter.drawText(17,rowY1-2+rowHeight, QString("%1").arg(address,8,16,QChar('0'))); textPen.setColor(0xFF000000); painter.setPen(textPen); if (debugger->isAlive()) { switch(mode) { case MV_NORMAL: { const char *m = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; if (Memory::IsValidAddress(address)) { u32 memory[4] = { debugger->readMemory(address), debugger->readMemory(address+4), debugger->readMemory(address+8), debugger->readMemory(address+12) }; m = (const char*)memory; sprintf(temp, "%08x %08x %08x %08x ................", memory[0],memory[1],memory[2],memory[3]); } for (int i=0; i<16; i++) { int c = (unsigned char)m[i]; if (c>=32 && c<255) temp[i+37]=c; } } painter.setFont(alignedFont); painter.drawText(85,rowY1 - 2 + rowHeight, temp); break; case MV_SYMBOLS: { /* textPen.setColor(0x0000FF); painter.setPen(textPen); int fn = g_symbolMap->GetSymbolNum(address); if (fn==-1) { sprintf(temp, "%s (ns)", Memory::GetAddressName(address)); } else sprintf(temp, "%s (0x%x b)", g_symbolMap->GetSymbolName(fn),g_symbolMap->GetSymbolSize(fn)); painter.drawText(205,rowY1 - 2 + rowHeight, temp); textPen.setColor(0xFF000000); painter.setPen(textPen); if (align==4) { u32 value = Memory::ReadUnchecked_U32(address); int symbolnum = g_symbolMap->GetSymbolNum(value); if(symbolnum>=0) sprintf(temp, "%08x [%s]", value, g_symbolMap->GetSymbolName(symbolnum)); } else if (align==2) { u16 value = Memory::ReadUnchecked_U16(address); int symbolnum = g_symbolMap->GetSymbolNum(value); if(symbolnum>=0) sprintf(temp, "%04x [%s]", value, g_symbolMap->GetSymbolName(symbolnum)); } painter.drawText(85,rowY1 - 2 + rowHeight, temp);*/ break; } case MV_MAX: break; } } } }
void CtrlRegisterList::paintEvent(QPaintEvent *) { int numRowsTotal = cpu->GetNumRegsInCategory(category); int maxRowsDisplay =rect().bottom()/rowHeight - 1; selection = std::min(std::max(selection,0),numRowsTotal); curVertOffset = std::max(std::min(curVertOffset,numRowsTotal - maxRowsDisplay),0); QScrollBar *bar = findChild<QScrollBar*>("RegListScroll"); if(bar) { bar->setMinimum(0); bar->setMaximum(numRowsTotal - maxRowsDisplay); bar->setPageStep(1); bar->setValue(curVertOffset); } QPainter painter(this); painter.setBrush(Qt::white); painter.setPen(Qt::white); painter.drawRect(rect()); if (!cpu) return; QFont normalFont = QFont("Arial", 10); painter.setFont(normalFont); int width = rect().width(); QColor bgColor(0xffffff); QPen nullPen(bgColor); QPen currentPen(QColor(0xFF000000)); QPen selPen(0x808080); QPen textPen; QBrush lbr; lbr.setColor(bgColor); QBrush nullBrush(bgColor); QBrush currentBrush(0xFFEfE8); QBrush pcBrush(0x70FF70); int nc = cpu->GetNumCategories(); for (int i=0; i<nc; i++) { painter.setPen(i==category?currentPen:nullPen); painter.setBrush(i==category?pcBrush:nullBrush); painter.drawRect(width*i/nc,0,width*(i+1)/nc - width*i/nc -1,rowHeight-1); QString name = cpu->GetCategoryName(i); painter.setPen(currentPen); painter.drawText(width*i/nc+1,-3+rowHeight,name); } int numRows=rect().bottom()/rowHeight; for (int i=curVertOffset; i<curVertOffset+numRows; i++) { int rowY1 = rowHeight*(i-curVertOffset+1); int rowY2 = rowHeight*(i-curVertOffset+2)-1; lbr.setColor(i==selection?0xffeee0:0xffffff); painter.setBrush(currentBrush); painter.setPen(nullPen); painter.drawRect(0,rowY1,16-1,rowY2-rowY1); if (selecting && i == selection) painter.setPen(selPen); else painter.setPen(nullPen); QBrush mojsBrush(lbr.color()); painter.setBrush(mojsBrush); painter.drawRect(16,rowY1,width-16-1,rowY2-rowY1); // Check for any changes in the registers. if (lastPC != cpu->GetPC()) { for (int i = 0, n = cpu->GetNumRegsInCategory(0); i < n; ++i) { u32 v = cpu->GetRegValue(0, i); changedCat0Regs[i] = v != lastCat0Values[i]; lastCat0Values[i] = v; } lastPC = cpu->GetPC(); } painter.setBrush(currentBrush); if (i<cpu->GetNumRegsInCategory(category)) { QString regName = cpu->GetRegName(category,i); textPen.setColor(0x600000); painter.setPen(textPen); painter.drawText(17,rowY1-3+rowHeight,regName); textPen.setColor(0xFF000000); painter.setPen(textPen); char temp[256]; cpu->PrintRegValue(category,i,temp); if (category == 0 && changedCat0Regs[i]) { textPen.setColor(0x0000FF); painter.setPen(textPen); } else { textPen.setColor(0x004000); painter.setPen(textPen); } painter.drawText(77,rowY1-3+rowHeight,temp); } } }