// Print memory dump void PrintMemoryDump(CProcessor* pProc, WORD address, int lines) { address &= ~1; // Line up to even address BOOL okHaltMode = pProc->IsHaltMode(); for (int line = 0; line < lines; line++) { WORD dump[8]; for (int i = 0; i < 8; i++) dump[i] = g_pBoard->GetWord(address + i * 2, okHaltMode); TCHAR buffer[2 + 6 + 2 + 7 * 8 + 1 + 16 + 1 + 2]; TCHAR* pBuf = buffer; *pBuf = _T(' '); pBuf++; *pBuf = _T(' '); pBuf++; PrintOctalValue(pBuf, address); pBuf += 6; *pBuf = _T(' '); pBuf++; *pBuf = _T(' '); pBuf++; for (int i = 0; i < 8; i++) { PrintOctalValue(pBuf, dump[i]); pBuf += 6; *pBuf = _T(' '); pBuf++; } *pBuf = _T(' '); pBuf++; for (int i = 0; i < 8; i++) { WORD word = dump[i]; BYTE ch1 = LOBYTE(word); TCHAR wch1 = Translate_BK_Unicode(ch1); if (ch1 < 32) wch1 = _T('Ј'); *pBuf = wch1; pBuf++; BYTE ch2 = HIBYTE(word); TCHAR wch2 = Translate_BK_Unicode(ch2); if (ch2 < 32) wch2 = _T('Ј'); *pBuf = wch2; pBuf++; } *pBuf++ = _T('\r'); *pBuf++ = _T('\n'); *pBuf = 0; ConsoleView_Print(buffer); address += 16; } }
void MemoryView_OnDraw(HDC hdc) { ASSERT(g_pBoard != NULL); // Create and select font HFONT hFont = CreateMonospacedFont(); HGDIOBJ hOldFont = SelectObject(hdc, hFont); int cxChar, cyLine; GetFontWidthAndHeight(hdc, &cxChar, &cyLine); COLORREF colorText = GetSysColor(COLOR_WINDOWTEXT); COLORREF colorOld = SetTextColor(hdc, colorText); COLORREF colorBkOld = SetBkColor(hdc, GetSysColor(COLOR_WINDOW)); m_cyLineMemory = cyLine; const TCHAR* ADDRESS_LINE = _T("address 0 2 4 6 10 12 14 16"); TextOut(hdc, cxChar * 4, 0, ADDRESS_LINE, (int) _tcslen(ADDRESS_LINE)); RECT rcClip; GetClipBox(hdc, &rcClip); RECT rcClient; GetClientRect(m_hwndMemoryViewer, &rcClient); m_nPageSize = rcClient.bottom / cyLine - 1; WORD address = m_wBaseAddress; int y = 1 * cyLine; for (;;) // Draw lines { DrawOctalValue(hdc, 5 * cxChar, y, address); int x = 13 * cxChar; TCHAR wchars[16]; for (int j = 0; j < 8; j++) // Draw words as octal value { // Get word from memory WORD word = 0; int addrtype; BOOL okHalt = FALSE; WORD wChanged = 0; //switch (m_Mode) { // case MEMMODE_RAM0: // case MEMMODE_RAM1: // case MEMMODE_RAM2: // word = g_pBoard->GetRAMWord(m_Mode, address); // wChanged = Emulator_GetChangeRamStatus(m_Mode, address); // break; // case MEMMODE_ROM: // ROM - only 32 Kbytes // if (address < 0100000) // okValid = FALSE; // else // word = g_pBoard->GetROMWord(address - 0100000); // break; // case MEMMODE_CPU: okHalt = g_pBoard->GetCPU()->IsHaltMode(); word = g_pBoard->GetWordView(address, okHalt, FALSE, &addrtype); wChanged = Emulator_GetChangeRamStatus(address); // break; //} if ((addrtype & (ADDRTYPE_IO | ADDRTYPE_DENY)) == 0) { ::SetTextColor(hdc, (wChanged != 0) ? RGB(255, 0, 0) : colorText); DrawOctalValue(hdc, x, y, word); } // Prepare characters to draw at right BYTE ch1 = LOBYTE(word); TCHAR wch1 = Translate_BK_Unicode(ch1); if (ch1 < 32) wch1 = _T('·'); wchars[j * 2] = wch1; BYTE ch2 = HIBYTE(word); TCHAR wch2 = Translate_BK_Unicode(ch2); if (ch2 < 32) wch2 = _T('·'); wchars[j * 2 + 1] = wch2; address += 2; x += 7 * cxChar; } ::SetTextColor(hdc, colorText); // Draw characters at right int xch = x + cxChar; TextOut(hdc, xch, y, wchars, 16); y += cyLine; if (y > rcClip.bottom) break; } SetTextColor(hdc, colorOld); SetBkColor(hdc, colorBkOld); SelectObject(hdc, hOldFont); DeleteObject(hFont); if (::GetFocus() == m_hwndMemoryViewer) { RECT rcFocus = rcClient; rcFocus.left += cxChar * 4; rcFocus.top += cyLine; rcFocus.right = cxChar * (63 + 24); DrawFocusRect(hdc, &rcFocus); } }
void QMemoryView::paintEvent(QPaintEvent * /*event*/) { if (g_pBoard == NULL) return; QPainter painter(this); painter.fillRect(0,0, this->width(), this->height(), Qt::white); QFont font = Common_GetMonospacedFont(); painter.setFont(font); QFontMetrics fontmetrics(font); int cxChar = fontmetrics.averageCharWidth(); int cyLine = fontmetrics.height(); CProcessor* pDebugPU = g_pBoard->GetCPU(); ASSERT(pDebugPU != NULL); QColor colorText = painter.pen().color(); m_cyLineMemory = cyLine; TCHAR buffer[7]; const TCHAR* ADDRESS_LINE = _T(" address 0 2 4 6 10 12 14 16"); painter.drawText(0, cyLine, ADDRESS_LINE); // Calculate m_nPageSize m_nPageSize = this->height() / cyLine - 1; quint16 address = m_wBaseAddress; int y = 2 * cyLine; for (;;) { // Draw lines DrawOctalValue(painter, 2 * cxChar, y, address); int x = 10 * cxChar; ushort wchars[16]; for (int j = 0; j < 8; j++) { // Draw words as octal value // Get word from memory quint16 word = 0; int addrtype; bool okHalt = false; quint16 wChanged = 0; okHalt = pDebugPU->IsHaltMode(); word = g_pBoard->GetWordView(address, okHalt, false, &addrtype); wChanged = Emulator_GetChangeRamStatus(address); if ((addrtype & (ADDRTYPE_IO | ADDRTYPE_DENY)) == 0) { painter.setPen(wChanged != 0 ? Qt::red : colorText); if (m_ByteMode) { PrintOctalValue(buffer, (word & 0xff)); painter.drawText(x, y, buffer + 3); PrintOctalValue(buffer, (word >> 8)); painter.drawText(x + 3 * cxChar + cxChar / 2, y, buffer + 3); } else DrawOctalValue(painter, x, y, word); } // Prepare characters to draw at right quint8 ch1 = (quint8)(word & 0xff); // LOBYTE ushort wch1 = Translate_BK_Unicode(ch1); if (ch1 < 32) wch1 = 0x00b7; wchars[j * 2] = wch1; quint8 ch2 = (quint8)((word >> 8) & 0xff); // HIBYTE ushort wch2 = Translate_BK_Unicode(ch2); if (ch2 < 32) wch2 = 0x00b7; wchars[j * 2 + 1] = wch2; address += 2; x += 7 * cxChar; }