Segfault stabilisé, ajout de breakpoints

This commit is contained in:
Horde Nicolas 2021-07-14 01:15:38 +02:00
parent 0f4754939f
commit 751f9ea3a6
2 changed files with 77 additions and 31 deletions

View File

@ -158,11 +158,26 @@ void InstructionWindow::clear()
listview.redraw();
}
string InstructionWindow::getaddress()
{
return listview.getCurrentItem()->getText(0).c_str();
}
void InstructionWindow::setmark(int index)
{
listview.setmark(index);
}
int InstructionWindow::getindex()
{
return listview.getindex();
}
void InstructionWindow::setmultimark(std::vector<int> mark)
{
listview.setmultimark(mark);
}
int InstructionWindow::getsize()
{
return listview.getCount();
@ -643,6 +658,7 @@ void VMEngine::Halt()
void VMEngine::Unconfigure()
{
this->clearbreakpoints();
this->Halt();
if (initialized)
widget->tolog("VM IA86 - déconfiguration.........................[ INFO ]");
@ -735,17 +751,17 @@ void VMEngine::clearbreakpoints()
breakpoints.clear();
}
void VMEngine::addbreakpoint(int address)
void VMEngine::addbreakpoint(std::string address)
{
for(int item: breakpoints)
for(std::string item: breakpoints)
if (item==address) return;
breakpoints.push_back(address);
}
void VMEngine::removebreakpoint(int address)
void VMEngine::removebreakpoint(std::string address)
{
int i=0;
for(int item: breakpoints)
for(std::string item: breakpoints)
if (item==address)
{
breakpoints.erase(breakpoints.begin()+i);
@ -756,8 +772,21 @@ void VMEngine::removebreakpoint(int address)
std::vector<int> VMEngine::getBreapoints()
{
std::vector<int> list;
for(int item: breakpoints)
widget->tolog(to_string(item));
std::vector<std::array<std::string, 4>> items=((Menu*)widget)->getsrc();
for(std::string bpaddress: breakpoints)
{
int line=0;
for(std::array<std::string, 4> item: items)
{
if (item[0]==bpaddress)
{
((Menu*)widget)->tolog(to_string(line));
list.push_back(line++);
break;
}
}
}
return list;
}
@ -1124,7 +1153,7 @@ void Menu::initWindows()
void Menu::AdjustWindows()
{
this->setGeometry ( FPoint { 63, 45 }, FSize{60, 11} );
//this->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} );
@ -1136,7 +1165,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();
@ -1159,11 +1188,11 @@ void Menu::AdjustWindows()
mem.show();
if (level.rights > 6)
screen.show();
Options.setEnable();
/*Options.setEnable();
Tools.setEnable();
Window.setEnable();
Debug.setEnable();
Breakpoint.setEnable();
Breakpoint.setEnable();*/
}
else
{
@ -1173,11 +1202,11 @@ void Menu::AdjustWindows()
tuto.hide();
debug.hide();
scenar.hide();
Options.setDisable();
/*Options.setDisable();
Tools.setDisable();
Window.setDisable();
Debug.setDisable();
Breakpoint.setDisable();
Breakpoint.setDisable();*/
}
}
@ -1281,11 +1310,11 @@ void Menu::initMenusCallBack()
this,
&Menu::end
);
About.addCallback
AddBp.addCallback
(
"clicked",
this,
&Menu::about
&Menu::addbreakpoint
);
}
@ -1308,16 +1337,15 @@ Episode 1 : Apprendre l'assembleur X86");
void Menu::initLayout()
{
Log.setGeometry (FPoint{1, 2}, FSize{getWidth(), getHeight() - 1});
this->setGeometry ( FPoint { 63, 45 }, FSize{60, 11}, false);
this->setTopPadding(1);
this->setLeftPadding(0);
this->setRightPadding(0);
this->setBottomPadding(0);
Log.setGeometry (FPoint{0, 0}, FSize{getWidth(), getHeight()},false);
FDialog::initLayout();
}
void Menu::adjustSize()
{
finalcut::FDialog::adjustSize();
Log.setGeometry (FPoint{1, 2}, FSize(getWidth(), getHeight() - 1));
}
void Menu::onClose (finalcut::FCloseEvent* ev)
{
finalcut::FApplication::closeConfirmationDialog (this, ev);
@ -1386,6 +1414,7 @@ void Menu::compile()
void Menu::tolog(std::string str)
{
this->Log.append(str);
this->Log.scrollBy (0, 10);
}
void Menu::about()
@ -1408,6 +1437,11 @@ void Menu::about()
AdjustWindows();
}
std::vector<std::array<std::string, 4>> Menu::getsrc()
{
return debug.get();
}
void Menu::showInstr()
{
try
@ -1416,6 +1450,7 @@ void Menu::showInstr()
{
debug.set(vm.getInstr(vm.getCS(),vm.getEIP(),debug.getHeight()-3));
debug.setmark(vm.getLine());
debug.setmultimark(vm.getBreapoints());
mem.set(vm.getRam(vm.getDS(), 0x0000, mem.getHeight(),mem.getWidth()));
}
}
@ -1487,6 +1522,12 @@ void Menu::step()
showInstr();
}
void Menu::addbreakpoint()
{
vm.addbreakpoint(debug.getaddress());
showInstr();
}
//----------------------------------------------------------------------
// Fonction Main
//----------------------------------------------------------------------
@ -1495,9 +1536,6 @@ int main (int argc, char* argv[])
mapping();
finalcut::FApplication app {argc, argv};
Menu main_dlg {&app};
/*main_dlg.setText ("Journaux");
main_dlg.setGeometry ( FPoint { 63, 45 }, FSize{60, 11} );
main_dlg.show();*/
finalcut::FWidget::setMainWidget (&main_dlg);
return app.exec();
}

22
ia86.h
View File

@ -201,8 +201,11 @@ class InstructionWindow final : public finalcut::FDialog
std::vector<std::array<std::string, 4>> get();
void set(std::vector<std::array<std::string, 4>> src);
void clear();
int getindex();
void setmultimark(std::vector<int> mark);
void setmark(int index);
int getsize();
string getaddress();
private:
// Method
std::vector<std::array<std::string, 4>> content;
@ -315,8 +318,8 @@ class VMEngine
bool isInitialized();
void setRights(int rights);
void clearbreakpoints();
void addbreakpoint(int address);
void removebreakpoint(int address);
void addbreakpoint(std::string address);
void removebreakpoint(std::string address);
std::vector<int> getBreapoints();
int getLine();
uint32_t getEIP();
@ -325,7 +328,7 @@ class VMEngine
uint16_t getES();
uint16_t getSS();
private:
std::vector<int> breakpoints;
std::vector<std::string> breakpoints;
int rights;
void Init();
void Close();
@ -356,6 +359,7 @@ class Menu final : public finalcut::FDialog
void loadLevel(int alevel);
void closeLevel();
void tolog(std::string str);
std::vector<std::array<std::string, 4>> getsrc();
void SetScreen(uint16_t x, uint16_t y, char value);
private:
void onTimer (finalcut::FTimerEvent*) override;
@ -368,6 +372,7 @@ class Menu final : public finalcut::FDialog
void end();
void loadScenario(std::string file);
void showInstr();
void addbreakpoint();
void exec();
void trace();
void step();
@ -376,13 +381,12 @@ class Menu final : public finalcut::FDialog
void AdjustWindows();
void initWindows();
void initLayout() override;
void adjustSize() override;
// Event handler
void onClose (finalcut::FCloseEvent*) override;
// Callback method
void cb_message (const finalcut::FMenuItem*);
// Data members
finalcut::FString line{13, finalcut::UniChar::BoxDrawingsHorizontal};
//finalcut::FString line{13, finalcut::UniChar::BoxDrawingsHorizontal};
finalcut::FMenuBar Menubar{this};
finalcut::FMenu Game{"&Partie", &Menubar};
finalcut::FMenuItem New{"&Nouvelle partie", &Game};
@ -394,8 +398,13 @@ class Menu final : public finalcut::FDialog
finalcut::FRadioMenuItem Es_edi{"ES:EDI", &Memory};
finalcut::FRadioMenuItem Cs_eip{"CS:EIP", &Memory};
finalcut::FRadioMenuItem Ss_sp{"SS:SP", &Memory};
finalcut::FRadioMenuItem Value{"Valeur...", &Memory};
finalcut::FMenu Code{"&Code", &Options};
finalcut::FRadioMenuItem Cs_eip2{"CS:EIP", &Code};
finalcut::FRadioMenuItem Value2{"Valeur...", &Code};
finalcut::FRadioMenuItem Att{"Syntaxe AT&T", &Code};
finalcut::FMenu Tools{"&Outils", &Menubar};
finalcut::FMenuItem Assemble{"&Compilation", &Tools};
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};
@ -404,7 +413,6 @@ class Menu final : public finalcut::FDialog
finalcut::FMenuItem StepOver{"&Pas à pas", &Debug};
finalcut::FMenu Breakpoint{"&Point d'arrêt", &Menubar};
finalcut::FMenuItem AddBp{"&Ajouter", &Breakpoint};
finalcut::FMenuItem DelBp{"&Supprimer", &Breakpoint};
finalcut::FMenuItem ClearBp{"&Tout supprimer", &Breakpoint};
finalcut::FDialogListMenu Window{"&Fenêtres", &Menubar};
finalcut::FMenu Help{"&Aide", &Menubar};