MainMemoryViewer.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. #include "MainMemoryViewer.h"
  2. #include "HexViewer.h"
  3. #include "CPURegs.h"
  4. #include "CPURegsViewer.h"
  5. #include "SymbolTable.h"
  6. #include "Convert.h"
  7. #include <QComboBox>
  8. #include <QVBoxLayout>
  9. #include <QHBoxLayout>
  10. #include <QLineEdit>
  11. #include <iostream>
  12. const int MainMemoryViewer::linkRegisters[] = {
  13. CpuRegs::REG_BC, CpuRegs::REG_DE, CpuRegs::REG_HL,
  14. CpuRegs::REG_IX, CpuRegs::REG_IY,
  15. CpuRegs::REG_BC2, CpuRegs::REG_DE2, CpuRegs::REG_HL2,
  16. CpuRegs::REG_PC, CpuRegs::REG_SP
  17. };
  18. MainMemoryViewer::MainMemoryViewer(QWidget* parent)
  19. : QWidget(parent)
  20. {
  21. // create selection list, address edit line and viewer
  22. addressSourceList = new QComboBox();
  23. addressSourceList->setEditable(false);
  24. addressSourceList->addItem("Address:");
  25. for (int i = 0; i < 10; ++i) {
  26. QString txt = QString("Linked to ");
  27. txt.append(CpuRegs::regNames[linkRegisters[i]]);
  28. addressSourceList->addItem(txt);
  29. }
  30. addressValue = new QLineEdit();
  31. addressValue->setText(hexValue(0, 4));
  32. //addressValue->setEditable(false);
  33. hexView = new HexViewer();
  34. hexView->setUseMarker(true);
  35. hexView->setIsEditable(true);
  36. hexView->setIsInteractive(true);
  37. hexView->setDisplayMode(HexViewer::FILL_WIDTH_POWEROF2);
  38. QHBoxLayout* hbox = new QHBoxLayout();
  39. hbox->setMargin(0);
  40. hbox->addWidget(addressSourceList);
  41. hbox->addWidget(addressValue);
  42. QVBoxLayout* vbox = new QVBoxLayout();
  43. vbox->setMargin(0);
  44. vbox->addLayout(hbox);
  45. vbox->addWidget(hexView);
  46. setLayout(vbox);
  47. isLinked = false;
  48. linkedId = 0;
  49. regsViewer = NULL;
  50. symTable = 0;
  51. connect(hexView, SIGNAL(locationChanged(int)),
  52. this, SLOT(hexViewChanged(int)));
  53. connect(addressValue, SIGNAL(returnPressed()),
  54. this, SLOT(addressValueChanged()));
  55. connect(addressSourceList, SIGNAL(currentIndexChanged(int)),
  56. this, SLOT(addressSourceListChanged(int)));
  57. }
  58. void MainMemoryViewer::settingsChanged()
  59. {
  60. hexView->settingsChanged();
  61. }
  62. void MainMemoryViewer::setLocation(int addr)
  63. {
  64. addressValue->setText(hexValue(addr, 4).toUpper());
  65. hexView->setLocation(addr);
  66. }
  67. void MainMemoryViewer::setDebuggable(const QString& name, int size)
  68. {
  69. hexView->setDebuggable(name, size);
  70. }
  71. void MainMemoryViewer::setRegsView(CPURegsViewer* viewer)
  72. {
  73. regsViewer = viewer;
  74. }
  75. void MainMemoryViewer::setSymbolTable(SymbolTable* symtable)
  76. {
  77. symTable = symtable;
  78. }
  79. void MainMemoryViewer::refresh()
  80. {
  81. hexView->refresh();
  82. }
  83. void MainMemoryViewer::hexViewChanged(int addr)
  84. {
  85. addressValue->setText(hexValue(addr, 4).toUpper());
  86. }
  87. void MainMemoryViewer::addressValueChanged()
  88. {
  89. int addr = stringToValue(addressValue->text());
  90. if (addr == -1 && symTable) {
  91. // try finding a label
  92. Symbol *s = symTable->getAddressSymbol(addressValue->text());
  93. if (!s) s = symTable->getAddressSymbol(addressValue->text(), Qt::CaseInsensitive);
  94. if (s) addr = s->value();
  95. }
  96. if(addr >= 0)
  97. hexView->setLocation(addr);
  98. }
  99. void MainMemoryViewer::registerChanged(int id, int value)
  100. {
  101. if (!isLinked || (id != linkedId)) {
  102. return;
  103. }
  104. addressValue->setText(hexValue(value, 4).toUpper());
  105. hexView->setLocation(value);
  106. //hexView->refresh();
  107. }
  108. void MainMemoryViewer::addressSourceListChanged(int index)
  109. {
  110. if (index == 0) {
  111. isLinked = false;
  112. addressValue->setReadOnly(false);
  113. hexView->setIsInteractive(true);
  114. } else {
  115. isLinked = true;
  116. linkedId = linkRegisters[index - 1];
  117. addressValue->setReadOnly(true);
  118. hexView->setIsInteractive(false);
  119. if (regsViewer) {
  120. setLocation(regsViewer->readRegister(linkedId));
  121. }
  122. }
  123. }