diff --git a/ia86.cpp b/ia86.cpp index 9e1fa5b..3549bfc 100644 --- a/ia86.cpp +++ b/ia86.cpp @@ -107,6 +107,7 @@ void ScenarioWindow::click() void ScenarioWindow::Load(std::vector levels) { vector items; + listview.clear(); for(size_t i=0; i < levels.size(); i++) { //((Menu*)this->getParent())->tolog("."); @@ -204,6 +205,72 @@ void InstructionWindow::initLayout() } void InstructionWindow::adjustSize() +{ + finalcut::FDialog::adjustSize(); + listview.setGeometry (FPoint{1, 2}, FSize(getWidth(), getHeight() - 1)); +} + +//---------------------------------------------------------------------- +// Classe CodeWindow +//---------------------------------------------------------------------- + +CodeWindow::CodeWindow (finalcut::FWidget* parent) + : finalcut::FDialog{parent} +{ + + listview.ignorePadding(); + listview.addColumn ("Num"); + listview.addColumn ("Titre"); + listview.addColumn ("Adresse"); + listview.addColumn ("Taille"); + listview.addColumn ("Source"); + listview.addColumn ("Assemblé"); + listview.addColumn ("Chargé"); + listview.hideSortIndicator(true); + listview.setFocus(); +} + +std::vector> CodeWindow::get() +{ + return content; +} + +void CodeWindow::clear() +{ + listview.clear(); + listview.redraw(); +} + +int CodeWindow::getindex() +{ + return listview.getindex(); +} + +int CodeWindow::getsize() +{ + return listview.getCount(); +} + +void CodeWindow::set(std::vector> src) +{ + content=src; + listview.clear(); + for (const auto& place : content) + { + const finalcut::FStringList line (place.begin(), place.end()); + listview.insert (line); + } + listview.redraw(); +} + +void CodeWindow::initLayout() +{ + listview.setGeometry (FPoint{1, 2}, FSize{getWidth(), getHeight() - 1}); + setMinimumSize (FSize{51, 6}); + FDialog::initLayout(); +} + +void CodeWindow::adjustSize() { finalcut::FDialog::adjustSize(); listview.setGeometry (FPoint{1, 2}, FSize(getWidth(), getHeight() - 1)); @@ -412,7 +479,6 @@ std::vector Assembler::MultiAssemble(std::string source,uint32_t address) Code *code=new Code; bool begin=true; int org=address; - std::string name="/"; code->address=org; while (std::getline(stream, line)) { @@ -428,8 +494,6 @@ std::vector Assembler::MultiAssemble(std::string source,uint32_t address) mcode.push_back(*code); code=new Code; code->address=org; - code->name=name; - name="/"; } } else if (line.find(".title") != std::string::npos) @@ -437,7 +501,7 @@ std::vector Assembler::MultiAssemble(std::string source,uint32_t address) std::smatch match; if(std::regex_search(line, match, regex_name)) { - name=match.str(1); + code->name=match.str(1); } } else @@ -703,7 +767,7 @@ void VMEngine::Close() void VMEngine::Halt() { - if (executed) + if (executed && debugnow) widget->tolog("VM IA86 - arret...................................[ INFO ]"); executed=false; } @@ -1211,8 +1275,8 @@ void VMEngine::Run(bool astep, bool acall, uint64_t timeout) throw Error("VM IA86 - execution...............................[ERREUR]"); else { - if (!executed) - widget->tolog("VM IA86 - execution...............................[ INFO ]"); + if (!executed && debugnow) + widget->tolog("VM IA86 - execution...............................[ INFO ]"); executed="true"; } } @@ -1286,7 +1350,8 @@ void Menu::initWindows() void Menu::AdjustWindows() { - //this->setGeometry ( FPoint { 63, 45 }, FSize{60, 11} ); + this->setGeometry ( FPoint { 63, 45 }, FSize{60, 11} ); + codes.setGeometry ( FPoint { 63, 45 }, FSize{60, 11} ); edit.setGeometry ( FPoint { 01, 17 }, FSize{39, 27} ); view.setGeometry ( FPoint { 01, 45 }, FSize{60, 11} ); regs.setGeometry ( FPoint { 01, 01 }, FSize{40, 15} ); @@ -1298,7 +1363,7 @@ void Menu::AdjustWindows() debug.setGeometry ( FPoint { 42, 17 }, FSize{60, 27} ); scenar.setGeometry ( FPoint { 187, 01 }, FSize{25, 55} ); info.setGeometry (FPoint { 55, 25 }, FSize{50, 14}); - //this->show(); + this->show(); info.hide(); flags.hide(); stack.hide(); @@ -1306,6 +1371,7 @@ void Menu::AdjustWindows() screen.hide(); if (scenario.loaded) { + codes.show(); info.show(); edit.show(); view.show(); @@ -1321,11 +1387,18 @@ void Menu::AdjustWindows() mem.show(); if (level.rights > 6) screen.show(); - /*Options.setEnable(); - Tools.setEnable(); - Window.setEnable(); - Debug.setEnable(); - Breakpoint.setEnable(); */ + New.setEnable(); + Open.setEnable(); + Save.setEnable(); + Close.setEnable(); + Assemble.setEnable(); + Run.setEnable(); + End.setEnable(); + TraceInto.setEnable(); + StepOver.setEnable(); + AddBp.setEnable(); + ClearBp.setEnable(); + ClearAllBp.setEnable(); } else { @@ -1335,11 +1408,18 @@ void Menu::AdjustWindows() tuto.hide(); debug.hide(); scenar.hide(); - /*Options.setDisable(); - Tools.setDisable(); - Window.setDisable(); - Debug.setDisable(); - Breakpoint.setDisable(); */ + New.setDisable(); + Open.setDisable(); + Save.setDisable(); + Close.setDisable(); + Assemble.setDisable(); + Run.setDisable(); + End.setDisable(); + TraceInto.setDisable(); + StepOver.setDisable(); + AddBp.setDisable(); + ClearBp.setDisable(); + ClearAllBp.setDisable(); } } @@ -1352,6 +1432,7 @@ void Menu::initMenus() Window.setStatusbarMessage ("Fenêtres en cours d'exécution"); Help.setStatusbarMessage ("Aide et informations IA86"); Line2.setSeparator(); + Line3.setSeparator(); New.addAccelerator (FKey::Meta_n); New.setStatusbarMessage ("Debuter une nouvelle partie"); Quit.addAccelerator (FKey::Meta_x); @@ -1408,6 +1489,12 @@ void Menu::initMenusCallBack() &finalcut::FApplication::cb_exitApp, this ); + About.addCallback + ( + "clicked", + this, + &Menu::about + ); Assemble.addCallback ( "clicked", @@ -1498,6 +1585,18 @@ void Menu::initMenusCallBack() this, &Menu::showInstr ); + OpenScenar.addCallback + ( + "clicked", + this, + &Menu::openscenar + ); + CloseScenar.addCallback + ( + "clicked", + this, + &Menu::closescenar + ); } void Menu::initMisc() @@ -1558,6 +1657,7 @@ void Menu::loadScenario(std::string file) strStream << inFile.rdbuf(); std::string json=strStream.str(); std::istringstream json_data(json); + scenario.levels.clear(); struct_mapping::map_json_to_struct(scenario, json_data); if (scenario.levels.size()>0) { @@ -1605,6 +1705,7 @@ void Menu::end() void Menu::compile() { vm.Configure(&level.init,edit.get()); + codes.set(vm.getCode()); ClearScreen(); showInstr(); } @@ -1615,6 +1716,24 @@ void Menu::tolog(std::string str) this->Log.scrollBy (0, 10); } +void Menu::openscenar() +{ + finalcut::FString file{}; + file = finalcut::FFileDialog::fileOpenChooser (this); + if ( file.isEmpty() ) + return; + else + loadScenario(file.c_str()); +} + +void Menu::closescenar() +{ + scenario.loaded=false; + + level.title=""; + closeLevel(); +} + void Menu::about() { this->hide(); @@ -1629,9 +1748,9 @@ void Menu::about() debug.hide(); scenar.hide(); info.show(); - info.redraw(); - //((finalcut::FApplication*)this->getParent())->sendQueuedEvents(); - sleep(3); + finalcut::FFocusEvent event (finalcut::Event::ChildFocusIn); + ((finalcut::FApplication*)this->getParent())->queueEvent(&info, &event); + usleep(5000000); AdjustWindows(); } diff --git a/ia86.h b/ia86.h index c3905ca..7e4014a 100644 --- a/ia86.h +++ b/ia86.h @@ -187,6 +187,32 @@ class ScenarioWindow final : public finalcut::FDialog finalcut::FListView listview{this}; }; +class CodeWindow final : public finalcut::FDialog +{ + public: + // Constructor + explicit CodeWindow (finalcut::FWidget* = nullptr); + // Disable copy constructor + CodeWindow (const CodeWindow&) = delete; + // Destructor + ~CodeWindow() override = default; + // Disable copy assignment operator (=) + CodeWindow& operator = (const CodeWindow&) = delete; + // Method + std::vector> get(); + void set(std::vector> src); + void clear(); + int getindex(); + int getsize(); + private: + // Method + std::vector> content; + void initLayout() override; + void adjustSize() override; + // Data members + finalcut::FListView listview{this}; +}; + class InstructionWindow final : public finalcut::FDialog { public: @@ -390,6 +416,8 @@ class Menu final : public finalcut::FDialog void ClearScreen(); void AdjustWindows(); void initWindows(); + void openscenar(); + void closescenar(); void initLayout() override; // Event handler void onClose (finalcut::FCloseEvent*) override; @@ -400,8 +428,30 @@ class Menu final : public finalcut::FDialog finalcut::FMenuBar Menubar{this}; finalcut::FMenu Game{"&Partie", &Menubar}; finalcut::FMenuItem New{"&Nouvelle partie", &Game}; + finalcut::FMenuItem Open{"&Ouvrir une partie", &Game}; + finalcut::FMenuItem Save{"&Sauver la partie", &Game}; + finalcut::FMenuItem Close{"&Fermer une partie", &Game}; finalcut::FMenuItem Line2{&Game}; + finalcut::FMenuItem OpenScenar{"&Ouvrir un scénario", &Game}; + finalcut::FMenuItem CloseScenar{"&Fermer un scénario", &Game}; + finalcut::FMenuItem Line3{&Game}; finalcut::FMenuItem Quit{"&Quitter", &Game}; + finalcut::FMenu Views{"&vues", &Menubar}; + finalcut::FRadioMenuItem Rearange1{"&Scénarios", &Views}; + finalcut::FRadioMenuItem Rearange3{"&Objectifs", &Views}; + finalcut::FRadioMenuItem Rearange{"&Deboguage", &Views}; + finalcut::FRadioMenuItem Rearange2{"&Données", &Views}; + finalcut::FMenu Tools{"&Outils", &Menubar}; + finalcut::FMenuItem Assemble{"&Assembler", &Tools}; + finalcut::FMenu Debug{"&Exécution", &Menubar}; + finalcut::FMenuItem Run{"&Exécuter", &Debug}; + finalcut::FMenuItem End{"&Terminer", &Debug}; + finalcut::FMenuItem TraceInto{"Pas à pas &détaillé", &Debug}; + finalcut::FMenuItem StepOver{"&Pas à pas", &Debug}; + finalcut::FMenu Breakpoint{"&Point d'arrêt", &Menubar}; + finalcut::FMenuItem AddBp{"&Ajouter", &Breakpoint}; + finalcut::FMenuItem ClearBp{"&Supprimer", &Breakpoint}; + finalcut::FMenuItem ClearAllBp{"&Tout supprimer", &Breakpoint}; finalcut::FMenu Options{"&Options", &Menubar}; finalcut::FMenu Memory{"&Visualisateur Mémoire", &Options}; finalcut::FRadioMenuItem Ds_000{"DS:0000", &Memory}; @@ -414,17 +464,6 @@ class Menu final : public finalcut::FDialog finalcut::FMenu Code{"&Syntaxe", &Options}; finalcut::FCheckMenuItem AsmAtt{"Assembleur AT&T", &Code}; finalcut::FCheckMenuItem UnasmAtt{"Désassembleur AT&T", &Code}; - finalcut::FMenu Tools{"&Outils", &Menubar}; - finalcut::FMenuItem Assemble{"&Assembler", &Tools}; - finalcut::FMenuItem Rearange{"&Ordonne les fenêtres", &Tools}; - finalcut::FMenu Debug{"&Déboguage", &Menubar}; - finalcut::FMenuItem Run{"&Exécuter", &Debug}; - finalcut::FMenuItem End{"&Terminer", &Debug}; - finalcut::FMenuItem TraceInto{"Pas à pas &détaillé", &Debug}; - finalcut::FMenuItem StepOver{"&Pas à pas", &Debug}; - finalcut::FMenu Breakpoint{"&Point d'arrêt", &Menubar}; - finalcut::FMenuItem AddBp{"&Ajouter", &Breakpoint}; - finalcut::FMenuItem ClearBp{"&Tout supprimer", &Breakpoint}; finalcut::FDialogListMenu Window{"&Fenêtres", &Menubar}; finalcut::FMenu Help{"&Aide", &Menubar}; finalcut::FMenuItem About{"&A propos", &Help}; @@ -433,6 +472,7 @@ class Menu final : public finalcut::FDialog TextWindow info{this}; TextWindow view{this}; InstructionWindow debug{this}; + CodeWindow codes{this}; TextWindow regs{this}; TextWindow flags{this}; TextWindow stack{this}; diff --git a/scenarios.json b/scenarios.json index 643ce26..cf0c36e 100644 --- a/scenarios.json +++ b/scenarios.json @@ -8,6 +8,7 @@ "niveau_tutoriel" : "Ceci vous...", "niveau_code" : "mov ax,0x545 inc dx +.title test mov esi,0x44440234 syscall mov ax,0x9000 @@ -23,6 +24,7 @@ jnz go hlt jmp 0x14D .org 0x8D +.title next mov es,ax .org 0x14D mov es,ax diff --git a/start.sh b/start.sh index 67fa231..898a027 100755 --- a/start.sh +++ b/start.sh @@ -3,7 +3,7 @@ X=$(xrandr --current | grep '*' | uniq | awk '{print $1}' | cut -d 'x' -f1) Y=$(xrandr --current | grep '*' | uniq | awk '{print $1}' | cut -d 'x' -f2) KITTY=$(kitty -v|grep created) if [ "${KITTY}" != "" ]; then - echo "Kitty installé" + echo "Utilisation de Kitty..." if [ ${X} -ge 1920 ]; then kitty --start-as fullscreen ./ia86 $1 exit @@ -22,4 +22,5 @@ elif [ ${X} -ge 1280 ]; then else SIZE=6 fi +echo "Utilisation de xTerm..." xterm -fullscreen -fa monaco -fs ${SIZE} -bg black -fg green -e "sleep 0.4;./ia86 $1"