int QConsoleView::printDisassemble(WORD address, BOOL okOneInstr, BOOL okShort) { CProcessor* pProc = g_pBoard->GetCPU(); BOOL okHaltMode = pProc->IsHaltMode(); const int nWindowSize = 30; WORD memory[nWindowSize + 2]; int addrtype; for (int i = 0; i < nWindowSize + 2; i++) memory[i] = g_pBoard->GetWordView(address + i*2, okHaltMode, TRUE, &addrtype); TCHAR bufaddr[7]; TCHAR bufvalue[7]; TCHAR buffer[64]; int lastLength = 0; int length = 0; for (int index = 0; index < nWindowSize; index++) { // –исуем строки PrintOctalValue(bufaddr, address); WORD value = memory[index]; PrintOctalValue(bufvalue, value); if (length > 0) { if (!okShort) { _sntprintf(buffer, 64, _T(" %s %s\r\n"), bufaddr, bufvalue); this->print(buffer); } } else { if (okOneInstr && index > 0) break; TCHAR instr[8]; TCHAR args[32]; length = DisassembleInstruction(memory + index, address, instr, args); lastLength = length; if (index + length > nWindowSize) break; if (okShort) _sntprintf(buffer, 64, _T(" %s %-7s %s\r\n"), bufaddr, instr, args); else _sntprintf(buffer, 64, _T(" %s %s %-7s %s\r\n"), bufaddr, bufvalue, instr, args); this->print(buffer); } length--; address += 2; } return lastLength; }
void QConsoleView::printMemoryDump(WORD address, int lines) { CProcessor* pProc = g_pBoard->GetCPU(); 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; this->print(buffer); address += 16; } }
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; }