added memory dump
This commit is contained in:
@@ -8,6 +8,7 @@
|
||||
#include <filesystem>
|
||||
|
||||
#include "components/Alu.h"
|
||||
#include "components/Memory.h"
|
||||
namespace fs = std::filesystem;
|
||||
|
||||
Manager::~Manager() {
|
||||
@@ -79,11 +80,19 @@ void Manager::init(const std::string &program_path) {
|
||||
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"
|
||||
"\033[33mNach\033[0m jeder bearbeiteten Codezeile wird \033[34mdiese\033[0m ausgegeben und Sie werden "
|
||||
"nach dem \033[32mnächsten Schritt\033[0m gefragt. Tätigen Sie Ihre Eingabe und bestätigen Sie mit "
|
||||
"\033[32mENTER\033[0m.\nAnforderungen und Hinweise entnehmen Sie bitte der README.\n\n";
|
||||
<< COLOR_YELLOW << "Nach" << COLOR_RESET << " jeder bearbeiteten Codezeile wird "
|
||||
<< COLOR_BLUE << "diese" << COLOR_RESET << " ausgegeben und Sie werden "
|
||||
<< "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() {
|
||||
@@ -106,9 +115,15 @@ std::string Manager::gotoNextStreamLine() {
|
||||
}
|
||||
|
||||
bool Manager::handleUserInput() {
|
||||
std::cout <<
|
||||
"\nOptionen: (\033[32ms\033[0m) Programm durchlaufen lassen, (\033[32ml\033[0m) nächste Zeile, (\033[32me\033[0m) beenden, "
|
||||
"(\033[32mm\033[0m) Memory Dump, (\033[32mr\033[0m) Register Dump\n";
|
||||
constexpr const char *COLOR_GREEN = "\033[32m";
|
||||
constexpr const char *COLOR_RESET = "\033[0m";
|
||||
|
||||
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';
|
||||
while (true) {
|
||||
std::cout << "Eingabe: ";
|
||||
@@ -116,14 +131,21 @@ bool Manager::handleUserInput() {
|
||||
input = std::tolower(input);
|
||||
|
||||
if (input == 's') {
|
||||
return true; // runAll = true
|
||||
return true;
|
||||
} else if (input == 'l') {
|
||||
return false; // nur nächste Zeile
|
||||
return false;
|
||||
} else if (input == 'e') {
|
||||
std::cout << "Programm wird beendet.\n";
|
||||
exit(0); // oder andere Beendigung
|
||||
exit(0);
|
||||
} 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') {
|
||||
//Register::getInstance().dump();
|
||||
} else {
|
||||
@@ -133,8 +155,12 @@ bool Manager::handleUserInput() {
|
||||
}
|
||||
|
||||
void Manager::handleExitInput() {
|
||||
std::cout <<
|
||||
"\nOptionen: (\033[32me\033[0m) beenden, (\033[32mm\033[0m) Memory Dump, (\033[32mr\033[0m) Register Dump\n";
|
||||
constexpr auto COLOR_GREEN = "\033[32m";
|
||||
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';
|
||||
while (true) {
|
||||
std::cout << "Eingabe: ";
|
||||
@@ -145,7 +171,14 @@ void Manager::handleExitInput() {
|
||||
std::cout << "Programm wird beendet.\n";
|
||||
exit(0); // oder andere Beendigung
|
||||
} 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') {
|
||||
//Register::getInstance().dump();
|
||||
} else {
|
||||
|
||||
@@ -4,6 +4,9 @@
|
||||
|
||||
#include "Memory.h"
|
||||
|
||||
#include <iomanip>
|
||||
#include <iostream>
|
||||
|
||||
Memory::Memory() {
|
||||
m_memory = {0};
|
||||
}
|
||||
@@ -20,3 +23,36 @@ void Memory::store(const int address, const int value) {
|
||||
int Memory::load(const int address) const {
|
||||
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
|
||||
*/
|
||||
[[nodiscard]] int load(int address) const;
|
||||
|
||||
/**
|
||||
*
|
||||
* @param size
|
||||
*/
|
||||
void dump(int size) const;
|
||||
};
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user