-
Notifications
You must be signed in to change notification settings - Fork 0
/
AssemblyMenu.cpp
116 lines (99 loc) · 2.52 KB
/
AssemblyMenu.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include "AssemblyMenu.hpp"
#include "Cpu.hpp"
#include "Bus.hpp"
#include "MipsToString.hpp"
#include <sstream>
#include <iomanip>
#include <fstream>
AssemblyMenu::AssemblyMenu()
{
std::ifstream comment_log("comment_file.txt");
if (comment_log.is_open())
{
std::string pc_value;
std::string comment_value;
while (std::getline(comment_log, pc_value) && std::getline(comment_log, comment_value))
{
char * buffer = new char[256];
memset(buffer, 0, 256);
// 254 to ensure we don't overrun the null termination
strncat(buffer, comment_value.c_str(), 254);
assembly_comment_buffer[std::stoul(pc_value)] = buffer;
}
comment_log.close();
}
}
AssemblyMenu::~AssemblyMenu()
{
std::ofstream comment_log("comment_file.txt");
for (auto iter : assembly_comment_buffer)
{
if (comment_log.is_open() && strlen(iter.second) > 0)
{
comment_log << iter.first << std::endl;
comment_log << iter.second << std::endl;
}
delete[] iter.second;
}
comment_log.close();
assembly_comment_buffer.clear();
}
void AssemblyMenu::draw_in_category(DebugMenu::menubar_category category)
{
if (category == DebugMenu::menubar_category::VIEW)
{
ImGui::Checkbox("Show Assembly", &is_visible);
}
}
void AssemblyMenu::draw_menu()
{
if (is_visible == false) return;
Bus * bus = Bus::get_instance();
Cpu * cpu = Cpu::get_instance();
ImGui::Begin("Assembly");
unsigned int pc = cpu->current_pc;
for (int idx = -10; idx < 10; idx++)
{
std::stringstream asm_text;
unsigned int pc = cpu->current_pc + static_cast<unsigned int>(idx * 4);
instruction_union instruction = bus->get_word(pc);
// current instruction
if (pc == cpu->current_pc)
{
asm_text << ">>";
}
// next instruction
else if (pc == cpu->next_pc)
{
asm_text << "->";
}
else
{
asm_text << " ";
}
asm_text << "0x" << std::hex << std::setfill('0') << std::setw(8) << instruction.raw << "; " << MipsToString::instruction_to_string(instruction) << "\n";
if (MipsToString::is_branch_or_jump(instruction))
{
static ImVec4 red = { 1, 0, 0, 1 };
ImGui::TextColored(red, asm_text.str().c_str());
}
else
{
static ImVec4 yellow = { 1, 1, 0, 1 };
ImGui::TextColored(yellow, asm_text.str().c_str());
}
ImGui::SameLine();
char * buffer = assembly_comment_buffer[pc];
if (buffer == nullptr)
{
buffer = new char[256];
memset(buffer, 0, 256);
assembly_comment_buffer[pc] = buffer;
}
ImGui::InputText((std::string("##") + std::to_string(idx)).c_str(), buffer, 256);
}
ImGui::End();
}
void AssemblyMenu::tick()
{
}