registers.cpp 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. // Copyright 2014 Citra Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #include <QTreeWidgetItem>
  5. #include "core/arm/arm_interface.h"
  6. #include "core/core.h"
  7. #include "yuzu/debugger/registers.h"
  8. #include "yuzu/util/util.h"
  9. RegistersWidget::RegistersWidget(QWidget* parent) : QDockWidget(parent) {
  10. cpu_regs_ui.setupUi(this);
  11. tree = cpu_regs_ui.treeWidget;
  12. tree->addTopLevelItem(core_registers = new QTreeWidgetItem(QStringList(tr("Registers"))));
  13. tree->addTopLevelItem(vfp_registers = new QTreeWidgetItem(QStringList(tr("VFP Registers"))));
  14. tree->addTopLevelItem(vfp_system_registers =
  15. new QTreeWidgetItem(QStringList(tr("VFP System Registers"))));
  16. tree->addTopLevelItem(cpsr = new QTreeWidgetItem(QStringList("CPSR")));
  17. for (int i = 0; i < 16; ++i) {
  18. QTreeWidgetItem* child = new QTreeWidgetItem(QStringList(QString("R[%1]").arg(i)));
  19. core_registers->addChild(child);
  20. }
  21. for (int i = 0; i < 32; ++i) {
  22. QTreeWidgetItem* child = new QTreeWidgetItem(QStringList(QString("S[%1]").arg(i)));
  23. vfp_registers->addChild(child);
  24. }
  25. QFont font = GetMonospaceFont();
  26. CreateCPSRChildren();
  27. CreateVFPSystemRegisterChildren();
  28. // Set Registers to display in monospace font
  29. for (int i = 0; i < core_registers->childCount(); ++i)
  30. core_registers->child(i)->setFont(1, font);
  31. for (int i = 0; i < vfp_registers->childCount(); ++i)
  32. vfp_registers->child(i)->setFont(1, font);
  33. for (int i = 0; i < vfp_system_registers->childCount(); ++i) {
  34. vfp_system_registers->child(i)->setFont(1, font);
  35. for (int x = 0; x < vfp_system_registers->child(i)->childCount(); ++x) {
  36. vfp_system_registers->child(i)->child(x)->setFont(1, font);
  37. }
  38. }
  39. // Set CSPR to display in monospace font
  40. cpsr->setFont(1, font);
  41. for (int i = 0; i < cpsr->childCount(); ++i) {
  42. cpsr->child(i)->setFont(1, font);
  43. for (int x = 0; x < cpsr->child(i)->childCount(); ++x) {
  44. cpsr->child(i)->child(x)->setFont(1, font);
  45. }
  46. }
  47. setEnabled(false);
  48. }
  49. void RegistersWidget::OnDebugModeEntered() {
  50. if (!Core::System::GetInstance().IsPoweredOn())
  51. return;
  52. for (int i = 0; i < core_registers->childCount(); ++i)
  53. core_registers->child(i)->setText(
  54. 1, QString("0x%1").arg(Core::CPU().GetReg(i), 8, 16, QLatin1Char('0')));
  55. UpdateCPSRValues();
  56. }
  57. void RegistersWidget::OnDebugModeLeft() {}
  58. void RegistersWidget::OnEmulationStarting(EmuThread* emu_thread) {
  59. setEnabled(true);
  60. }
  61. void RegistersWidget::OnEmulationStopping() {
  62. // Reset widget text
  63. for (int i = 0; i < core_registers->childCount(); ++i)
  64. core_registers->child(i)->setText(1, QString(""));
  65. for (int i = 0; i < vfp_registers->childCount(); ++i)
  66. vfp_registers->child(i)->setText(1, QString(""));
  67. for (int i = 0; i < cpsr->childCount(); ++i)
  68. cpsr->child(i)->setText(1, QString(""));
  69. cpsr->setText(1, QString(""));
  70. // FPSCR
  71. for (int i = 0; i < vfp_system_registers->child(0)->childCount(); ++i)
  72. vfp_system_registers->child(0)->child(i)->setText(1, QString(""));
  73. // FPEXC
  74. for (int i = 0; i < vfp_system_registers->child(1)->childCount(); ++i)
  75. vfp_system_registers->child(1)->child(i)->setText(1, QString(""));
  76. vfp_system_registers->child(0)->setText(1, QString(""));
  77. vfp_system_registers->child(1)->setText(1, QString(""));
  78. vfp_system_registers->child(2)->setText(1, QString(""));
  79. vfp_system_registers->child(3)->setText(1, QString(""));
  80. setEnabled(false);
  81. }
  82. void RegistersWidget::CreateCPSRChildren() {
  83. cpsr->addChild(new QTreeWidgetItem(QStringList("M")));
  84. cpsr->addChild(new QTreeWidgetItem(QStringList("T")));
  85. cpsr->addChild(new QTreeWidgetItem(QStringList("F")));
  86. cpsr->addChild(new QTreeWidgetItem(QStringList("I")));
  87. cpsr->addChild(new QTreeWidgetItem(QStringList("A")));
  88. cpsr->addChild(new QTreeWidgetItem(QStringList("E")));
  89. cpsr->addChild(new QTreeWidgetItem(QStringList("IT")));
  90. cpsr->addChild(new QTreeWidgetItem(QStringList("GE")));
  91. cpsr->addChild(new QTreeWidgetItem(QStringList("DNM")));
  92. cpsr->addChild(new QTreeWidgetItem(QStringList("J")));
  93. cpsr->addChild(new QTreeWidgetItem(QStringList("Q")));
  94. cpsr->addChild(new QTreeWidgetItem(QStringList("V")));
  95. cpsr->addChild(new QTreeWidgetItem(QStringList("C")));
  96. cpsr->addChild(new QTreeWidgetItem(QStringList("Z")));
  97. cpsr->addChild(new QTreeWidgetItem(QStringList("N")));
  98. }
  99. void RegistersWidget::UpdateCPSRValues() {
  100. const u32 cpsr_val = Core::CPU().GetCPSR();
  101. cpsr->setText(1, QString("0x%1").arg(cpsr_val, 8, 16, QLatin1Char('0')));
  102. cpsr->child(0)->setText(
  103. 1, QString("b%1").arg(cpsr_val & 0x1F, 5, 2, QLatin1Char('0'))); // M - Mode
  104. cpsr->child(1)->setText(1, QString::number((cpsr_val >> 5) & 1)); // T - State
  105. cpsr->child(2)->setText(1, QString::number((cpsr_val >> 6) & 1)); // F - FIQ disable
  106. cpsr->child(3)->setText(1, QString::number((cpsr_val >> 7) & 1)); // I - IRQ disable
  107. cpsr->child(4)->setText(1, QString::number((cpsr_val >> 8) & 1)); // A - Imprecise abort
  108. cpsr->child(5)->setText(1, QString::number((cpsr_val >> 9) & 1)); // E - Data endianness
  109. cpsr->child(6)->setText(1,
  110. QString::number((cpsr_val >> 10) & 0x3F)); // IT - If-Then state (DNM)
  111. cpsr->child(7)->setText(1,
  112. QString::number((cpsr_val >> 16) & 0xF)); // GE - Greater-than-or-Equal
  113. cpsr->child(8)->setText(1, QString::number((cpsr_val >> 20) & 0xF)); // DNM - Do not modify
  114. cpsr->child(9)->setText(1, QString::number((cpsr_val >> 24) & 1)); // J - Jazelle
  115. cpsr->child(10)->setText(1, QString::number((cpsr_val >> 27) & 1)); // Q - Saturation
  116. cpsr->child(11)->setText(1, QString::number((cpsr_val >> 28) & 1)); // V - Overflow
  117. cpsr->child(12)->setText(1, QString::number((cpsr_val >> 29) & 1)); // C - Carry/Borrow/Extend
  118. cpsr->child(13)->setText(1, QString::number((cpsr_val >> 30) & 1)); // Z - Zero
  119. cpsr->child(14)->setText(1, QString::number((cpsr_val >> 31) & 1)); // N - Negative/Less than
  120. }
  121. void RegistersWidget::CreateVFPSystemRegisterChildren() {
  122. QTreeWidgetItem* const fpscr = new QTreeWidgetItem(QStringList("FPSCR"));
  123. fpscr->addChild(new QTreeWidgetItem(QStringList("IOC")));
  124. fpscr->addChild(new QTreeWidgetItem(QStringList("DZC")));
  125. fpscr->addChild(new QTreeWidgetItem(QStringList("OFC")));
  126. fpscr->addChild(new QTreeWidgetItem(QStringList("UFC")));
  127. fpscr->addChild(new QTreeWidgetItem(QStringList("IXC")));
  128. fpscr->addChild(new QTreeWidgetItem(QStringList("IDC")));
  129. fpscr->addChild(new QTreeWidgetItem(QStringList("IOE")));
  130. fpscr->addChild(new QTreeWidgetItem(QStringList("DZE")));
  131. fpscr->addChild(new QTreeWidgetItem(QStringList("OFE")));
  132. fpscr->addChild(new QTreeWidgetItem(QStringList("UFE")));
  133. fpscr->addChild(new QTreeWidgetItem(QStringList("IXE")));
  134. fpscr->addChild(new QTreeWidgetItem(QStringList("IDE")));
  135. fpscr->addChild(new QTreeWidgetItem(QStringList(tr("Vector Length"))));
  136. fpscr->addChild(new QTreeWidgetItem(QStringList(tr("Vector Stride"))));
  137. fpscr->addChild(new QTreeWidgetItem(QStringList(tr("Rounding Mode"))));
  138. fpscr->addChild(new QTreeWidgetItem(QStringList("FZ")));
  139. fpscr->addChild(new QTreeWidgetItem(QStringList("DN")));
  140. fpscr->addChild(new QTreeWidgetItem(QStringList("V")));
  141. fpscr->addChild(new QTreeWidgetItem(QStringList("C")));
  142. fpscr->addChild(new QTreeWidgetItem(QStringList("Z")));
  143. fpscr->addChild(new QTreeWidgetItem(QStringList("N")));
  144. QTreeWidgetItem* const fpexc = new QTreeWidgetItem(QStringList("FPEXC"));
  145. fpexc->addChild(new QTreeWidgetItem(QStringList("IOC")));
  146. fpexc->addChild(new QTreeWidgetItem(QStringList("OFC")));
  147. fpexc->addChild(new QTreeWidgetItem(QStringList("UFC")));
  148. fpexc->addChild(new QTreeWidgetItem(QStringList("INV")));
  149. fpexc->addChild(new QTreeWidgetItem(QStringList(tr("Vector Iteration Count"))));
  150. fpexc->addChild(new QTreeWidgetItem(QStringList("FP2V")));
  151. fpexc->addChild(new QTreeWidgetItem(QStringList("EN")));
  152. fpexc->addChild(new QTreeWidgetItem(QStringList("EX")));
  153. vfp_system_registers->addChild(fpscr);
  154. vfp_system_registers->addChild(fpexc);
  155. vfp_system_registers->addChild(new QTreeWidgetItem(QStringList("FPINST")));
  156. vfp_system_registers->addChild(new QTreeWidgetItem(QStringList("FPINST2")));
  157. }
  158. void RegistersWidget::UpdateVFPSystemRegisterValues() {
  159. UNIMPLEMENTED();
  160. }