diff --git a/src/Manager.cpp b/src/Manager.cpp index d53b7ad..be8d787 100644 --- a/src/Manager.cpp +++ b/src/Manager.cpp @@ -20,7 +20,7 @@ Manager &Manager::getInstance() { return instance; } -int Manager::run() { +[[noreturn]] void Manager::run() { if (!m_programFile.is_open()) { std::cerr << "Bitte zuerst die init() Methode aufrufen!" << "\n" << std::flush; } @@ -29,6 +29,8 @@ int Manager::run() { m_programFile.clear(); m_programFile.seekg(0); + bool runAll = false; + // Bearbeite jede Zeile des Quellcodes in der ALU std::string line; while (std::getline(m_programFile, line)) { @@ -36,8 +38,18 @@ int Manager::run() { // Sollte die aktuelle Zeile leer sein, überspringe die ALU if (lineVector.empty()) continue; Alu::calculate(lineVector); + + // Frage nach und reagiere auf Nutzereingaben + if (!runAll) { + std::cout << "\n" << "Bearbeitete Codezeile: \033[34m" << line << "\033[0m"; + runAll = handleUserInput(); + } } - return 0; + + // Beende das Program erst, wenn der Nutzer das tut + std::cout << + "\nDer Quellcode ist nun \033[33mfertig\033[0m bearbeitet. Sie können noch auf den RAM und die Register zugreifen."; + while (true) handleExitInput(); } void Manager::setStreamPosition(const std::streampos pos) { @@ -66,6 +78,12 @@ void Manager::init(const std::string &program_path) { std::cerr << "bad (schwerwiegender Fehler): " << m_programFile.bad() << "\n" << std::flush; return; } + + std::cout << "\033[32m=== Herzlich willkommen beim RISC-V Emulator! ===\033[0m\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"; } std::streampos Manager::getNextStreamLineOffset() { @@ -86,3 +104,52 @@ std::string Manager::gotoNextStreamLine() { getline(m_programFile, line); return line; } + +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"; + char input = '\0'; + while (true) { + std::cout << "Eingabe: "; + std::cin >> input; + input = std::tolower(input); + + if (input == 's') { + return true; // runAll = true + } else if (input == 'l') { + return false; // nur nächste Zeile + } else if (input == 'e') { + std::cout << "Programm wird beendet.\n"; + exit(0); // oder andere Beendigung + } else if (input == 'm') { + //Memory::dump(); + } else if (input == 'r') { + //Register::getInstance().dump(); + } else { + std::cout << "Ungültige Eingabe. Bitte erneut versuchen.\n"; + } + } +} + +void Manager::handleExitInput() { + std::cout << + "\nOptionen: (\033[32me\033[0m) beenden, (\033[32mm\033[0m) Memory Dump, (\033[32mr\033[0m) Register Dump\n"; + char input = '\0'; + while (true) { + std::cout << "Eingabe: "; + std::cin >> input; + input = std::tolower(input); + + if (input == 'e') { + std::cout << "Programm wird beendet.\n"; + exit(0); // oder andere Beendigung + } else if (input == 'm') { + //Memory::dump(); + } else if (input == 'r') { + //Register::getInstance().dump(); + } else { + std::cout << "Ungültige Eingabe. Bitte erneut versuchen.\n"; + } + } +} diff --git a/src/Manager.h b/src/Manager.h index 3ffee1e..f87597f 100644 --- a/src/Manager.h +++ b/src/Manager.h @@ -45,7 +45,7 @@ public: * * @return Der Exitcode des Emulators */ - int run(); + [[noreturn]] void run(); /** * Setzt die Position des Streams (virtuellen Lesekopfes) auf die angegebene Position @@ -79,6 +79,18 @@ public: * Bewegt das offset (Zeilennummer/"program counter") um 1 Zeile nach vorne */ std::string gotoNextStreamLine(); + + /** + * Behandelt die verschiedenen Nutzereingaben + * + * @return Ob das restliche Program im Sprint ausgeführt werden soll + */ + static bool handleUserInput(); + + /** + * Behandelt die Nutzereingaben am Ende des Programmes + */ + static void handleExitInput(); };