added memory dump
This commit is contained in:
@@ -8,6 +8,7 @@
|
|||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
|
|
||||||
#include "components/Alu.h"
|
#include "components/Alu.h"
|
||||||
|
#include "components/Memory.h"
|
||||||
namespace fs = std::filesystem;
|
namespace fs = std::filesystem;
|
||||||
|
|
||||||
Manager::~Manager() {
|
Manager::~Manager() {
|
||||||
@@ -79,11 +80,19 @@ void Manager::init(const std::string &program_path) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::cout << "\033[32m=== Herzlich willkommen beim RISC-V Emulator! ===\033[0m\n";
|
constexpr auto COLOR_GREEN = "\033[32m";
|
||||||
|
constexpr auto COLOR_YELLOW = "\033[33m";
|
||||||
|
constexpr auto COLOR_BLUE = "\033[34m";
|
||||||
|
constexpr auto COLOR_RESET = "\033[0m";
|
||||||
|
|
||||||
|
std::cout << COLOR_GREEN << "=== Herzlich willkommen beim RISC-V Emulator! ===" << COLOR_RESET << "\n";
|
||||||
std::cout << "Nachfolgend wird nun die angegebene Quellcodedatei eingelesen und von der ALU bearbeitet.\n"
|
std::cout << "Nachfolgend wird nun die angegebene Quellcodedatei eingelesen und von der ALU bearbeitet.\n"
|
||||||
"\033[33mNach\033[0m jeder bearbeiteten Codezeile wird \033[34mdiese\033[0m ausgegeben und Sie werden "
|
<< COLOR_YELLOW << "Nach" << COLOR_RESET << " jeder bearbeiteten Codezeile wird "
|
||||||
"nach dem \033[32mnächsten Schritt\033[0m gefragt. Tätigen Sie Ihre Eingabe und bestätigen Sie mit "
|
<< COLOR_BLUE << "diese" << COLOR_RESET << " ausgegeben und Sie werden "
|
||||||
"\033[32mENTER\033[0m.\nAnforderungen und Hinweise entnehmen Sie bitte der README.\n\n";
|
<< "nach dem " << COLOR_GREEN << "nächsten Schritt" << COLOR_RESET <<
|
||||||
|
" gefragt. Tätigen Sie Ihre Eingabe und bestätigen Sie mit "
|
||||||
|
<< COLOR_GREEN << "ENTER" << COLOR_RESET <<
|
||||||
|
".\nAnforderungen und Hinweise entnehmen Sie bitte der README.\n\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
std::streampos Manager::getNextStreamLineOffset() {
|
std::streampos Manager::getNextStreamLineOffset() {
|
||||||
@@ -106,9 +115,15 @@ std::string Manager::gotoNextStreamLine() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool Manager::handleUserInput() {
|
bool Manager::handleUserInput() {
|
||||||
std::cout <<
|
constexpr const char *COLOR_GREEN = "\033[32m";
|
||||||
"\nOptionen: (\033[32ms\033[0m) Programm durchlaufen lassen, (\033[32ml\033[0m) nächste Zeile, (\033[32me\033[0m) beenden, "
|
constexpr const char *COLOR_RESET = "\033[0m";
|
||||||
"(\033[32mm\033[0m) Memory Dump, (\033[32mr\033[0m) Register Dump\n";
|
|
||||||
|
std::cout << "\nOptionen: ("
|
||||||
|
<< COLOR_GREEN << "s" << COLOR_RESET << ") Programm durchlaufen lassen, ("
|
||||||
|
<< COLOR_GREEN << "l" << COLOR_RESET << ") nächste Zeile, ("
|
||||||
|
<< COLOR_GREEN << "e" << COLOR_RESET << ") beenden, ("
|
||||||
|
<< COLOR_GREEN << "m" << COLOR_RESET << ") Memory Dump, ("
|
||||||
|
<< COLOR_GREEN << "r" << COLOR_RESET << ") Register Dump\n";
|
||||||
char input = '\0';
|
char input = '\0';
|
||||||
while (true) {
|
while (true) {
|
||||||
std::cout << "Eingabe: ";
|
std::cout << "Eingabe: ";
|
||||||
@@ -116,14 +131,21 @@ bool Manager::handleUserInput() {
|
|||||||
input = std::tolower(input);
|
input = std::tolower(input);
|
||||||
|
|
||||||
if (input == 's') {
|
if (input == 's') {
|
||||||
return true; // runAll = true
|
return true;
|
||||||
} else if (input == 'l') {
|
} else if (input == 'l') {
|
||||||
return false; // nur nächste Zeile
|
return false;
|
||||||
} else if (input == 'e') {
|
} else if (input == 'e') {
|
||||||
std::cout << "Programm wird beendet.\n";
|
std::cout << "Programm wird beendet.\n";
|
||||||
exit(0); // oder andere Beendigung
|
exit(0);
|
||||||
} else if (input == 'm') {
|
} else if (input == 'm') {
|
||||||
//Memory::dump();
|
std::cout << "Wie viele Speicherzellen sollen gedumpt werden? ";
|
||||||
|
int dumpSize = 0;
|
||||||
|
while (!(std::cin >> dumpSize) || dumpSize == 0) {
|
||||||
|
std::cout << "Ungültige Eingabe. Bitte eine positive Zahl eingeben: ";
|
||||||
|
std::cin.clear();
|
||||||
|
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
|
||||||
|
}
|
||||||
|
Memory::getInstance().dump(dumpSize);
|
||||||
} else if (input == 'r') {
|
} else if (input == 'r') {
|
||||||
//Register::getInstance().dump();
|
//Register::getInstance().dump();
|
||||||
} else {
|
} else {
|
||||||
@@ -133,8 +155,12 @@ bool Manager::handleUserInput() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Manager::handleExitInput() {
|
void Manager::handleExitInput() {
|
||||||
std::cout <<
|
constexpr auto COLOR_GREEN = "\033[32m";
|
||||||
"\nOptionen: (\033[32me\033[0m) beenden, (\033[32mm\033[0m) Memory Dump, (\033[32mr\033[0m) Register Dump\n";
|
constexpr auto COLOR_RESET = "\033[0m";
|
||||||
|
std::cout << "\nOptionen: ("
|
||||||
|
<< COLOR_GREEN << "e" << COLOR_RESET << ") beenden, ("
|
||||||
|
<< COLOR_GREEN << "m" << COLOR_RESET << ") Memory Dump, ("
|
||||||
|
<< COLOR_GREEN << "r" << COLOR_RESET << ") Register Dump\n";
|
||||||
char input = '\0';
|
char input = '\0';
|
||||||
while (true) {
|
while (true) {
|
||||||
std::cout << "Eingabe: ";
|
std::cout << "Eingabe: ";
|
||||||
@@ -145,7 +171,14 @@ void Manager::handleExitInput() {
|
|||||||
std::cout << "Programm wird beendet.\n";
|
std::cout << "Programm wird beendet.\n";
|
||||||
exit(0); // oder andere Beendigung
|
exit(0); // oder andere Beendigung
|
||||||
} else if (input == 'm') {
|
} else if (input == 'm') {
|
||||||
//Memory::dump();
|
std::cout << "Wie viele Speicherzellen sollen gedumpt werden? ";
|
||||||
|
int dumpSize = 0;
|
||||||
|
while (!(std::cin >> dumpSize) || dumpSize == 0) {
|
||||||
|
std::cout << "Ungültige Eingabe. Bitte eine positive Zahl eingeben: ";
|
||||||
|
std::cin.clear();
|
||||||
|
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
|
||||||
|
}
|
||||||
|
Memory::getInstance().dump(dumpSize);
|
||||||
} else if (input == 'r') {
|
} else if (input == 'r') {
|
||||||
//Register::getInstance().dump();
|
//Register::getInstance().dump();
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -4,6 +4,9 @@
|
|||||||
|
|
||||||
#include "Memory.h"
|
#include "Memory.h"
|
||||||
|
|
||||||
|
#include <iomanip>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
Memory::Memory() {
|
Memory::Memory() {
|
||||||
m_memory = {0};
|
m_memory = {0};
|
||||||
}
|
}
|
||||||
@@ -20,3 +23,36 @@ void Memory::store(const int address, const int value) {
|
|||||||
int Memory::load(const int address) const {
|
int Memory::load(const int address) const {
|
||||||
return m_memory.at(address);
|
return m_memory.at(address);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Memory::dump(const int size) const {
|
||||||
|
// Speichere die Farbcodes für eine einfachere Verwendung
|
||||||
|
constexpr auto COLOR_ADDRESS = "\033[1;34m";
|
||||||
|
constexpr auto COLOR_HEX = "\033[0;37m";
|
||||||
|
constexpr auto COLOR_RESET = "\033[0m";
|
||||||
|
|
||||||
|
constexpr int valuesPerLine = 10;
|
||||||
|
|
||||||
|
// Gib die Kopfzeile mit den Überschriften aus
|
||||||
|
std::cout << COLOR_ADDRESS << "Adresse " << COLOR_HEX;
|
||||||
|
for (int i = 0; i < valuesPerLine; ++i) {
|
||||||
|
std::cout << " +" << std::setw(2) << std::setfill('0') << std::hex << i * sizeof(int) << " ";
|
||||||
|
}
|
||||||
|
std::cout << COLOR_RESET << "\n";
|
||||||
|
|
||||||
|
for (int i = 0; i < size; i += valuesPerLine) {
|
||||||
|
// Gibe die Überschrift für die einzelnen Blöcke mit dem entsprechenden Offset aus
|
||||||
|
std::cout << COLOR_ADDRESS
|
||||||
|
<< std::setw(8) << std::setfill('0') << std::hex << (i * sizeof(int))
|
||||||
|
<< ": " << COLOR_HEX;
|
||||||
|
|
||||||
|
// Gib die jeweiligen Werte der einzelnen Blöcke aus
|
||||||
|
for (int j = 0; j < valuesPerLine && (i + j) < size; ++j) {
|
||||||
|
std::cout << std::setw(8) << std::setfill('0') << std::hex << m_memory[i + j] << " ";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cout << COLOR_RESET << "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Setze die Konsole wieder auf dezimal und standard fill zurück
|
||||||
|
std::cout << std::dec << std::setfill(' ');
|
||||||
|
}
|
||||||
|
|||||||
@@ -52,6 +52,12 @@ public:
|
|||||||
* @return Der Wert aus der Adresse
|
* @return Der Wert aus der Adresse
|
||||||
*/
|
*/
|
||||||
[[nodiscard]] int load(int address) const;
|
[[nodiscard]] int load(int address) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param size
|
||||||
|
*/
|
||||||
|
void dump(int size) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user