added memory dump

This commit is contained in:
black
2025-07-08 22:17:06 +02:00
parent 0c9abcd7e4
commit e3608da3a0
3 changed files with 89 additions and 14 deletions

View File

@@ -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 {

View File

@@ -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(' ');
}

View File

@@ -52,6 +52,12 @@ public:
* @return Der Wert aus der Adresse
*/
[[nodiscard]] int load(int address) const;
/**
*
* @param size
*/
void dump(int size) const;
};