diff --git a/src/Manager.cpp b/src/Manager.cpp index be8d787..c53d3c2 100644 --- a/src/Manager.cpp +++ b/src/Manager.cpp @@ -8,6 +8,7 @@ #include #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::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::max(), '\n'); + } + Memory::getInstance().dump(dumpSize); } else if (input == 'r') { //Register::getInstance().dump(); } else { diff --git a/src/components/Memory.cpp b/src/components/Memory.cpp index c2e1938..5bc41b8 100644 --- a/src/components/Memory.cpp +++ b/src/components/Memory.cpp @@ -4,6 +4,9 @@ #include "Memory.h" +#include +#include + 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(' '); +} diff --git a/src/components/Memory.h b/src/components/Memory.h index 94d743b..f6699ea 100644 --- a/src/components/Memory.h +++ b/src/components/Memory.h @@ -52,6 +52,12 @@ public: * @return Der Wert aus der Adresse */ [[nodiscard]] int load(int address) const; + + /** + * + * @param size + */ + void dump(int size) const; };