Ajout visualisateur de mémoire
This commit is contained in:
parent
d52a76a88e
commit
7c57e86f81
39
ia86.cpp
39
ia86.cpp
|
@ -676,12 +676,41 @@ uint32_t VMEngine::getNextInstr()
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string VMEngine::getRam(int segment, int address,int lines, int linesize)
|
||||||
|
{
|
||||||
|
int reallinesize=(int)((linesize-16)/4);
|
||||||
|
int size=reallinesize*(lines-3);
|
||||||
|
uint32_t realaddress=segment*16+address;
|
||||||
|
uint8_t *code=new uint8_t[512];
|
||||||
|
std::string result="";
|
||||||
|
std::string line;
|
||||||
|
err = uc_mem_read(uc, realaddress, code, 500);
|
||||||
|
if (err)
|
||||||
|
throw Error("VM IA86 - voir mémoire............................[ERREUR]");
|
||||||
|
for(size_t i=0;i<size;i++)
|
||||||
|
{
|
||||||
|
if ((i%reallinesize)==0)
|
||||||
|
{
|
||||||
|
if (i!=0)
|
||||||
|
result+=" | "+line+"\n";
|
||||||
|
result+=intToHexString(address+i,8)+" | ";
|
||||||
|
line="";
|
||||||
|
}
|
||||||
|
result+=intToHexString(code[i],2)+" ";
|
||||||
|
if (std::isprint(code[i]))
|
||||||
|
line+=(char)code[i];
|
||||||
|
else
|
||||||
|
line+='.';
|
||||||
|
}
|
||||||
|
result+=" | "+line+"\n";
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
std::vector<std::array<std::string, 5>> VMEngine::getInstr(int segment, int address,int size)
|
std::vector<std::array<std::string, 5>> VMEngine::getInstr(int segment, int address,int size)
|
||||||
{
|
{
|
||||||
uint32_t realaddress=segment*16+address;
|
uint32_t realaddress=segment*16+address;
|
||||||
if (realaddress<bufferaddress || realaddress+(size*7)>bufferaddress+500)
|
if (realaddress<bufferaddress || realaddress+(size*7)>bufferaddress+500)
|
||||||
{
|
{
|
||||||
log->append("read");
|
|
||||||
bufferaddress=realaddress-30;
|
bufferaddress=realaddress-30;
|
||||||
if (bufferaddress<0)
|
if (bufferaddress<0)
|
||||||
bufferaddress=0x00000000;
|
bufferaddress=0x00000000;
|
||||||
|
@ -695,7 +724,6 @@ std::vector<std::array<std::string, 5>> VMEngine::getInstr(int segment, int addr
|
||||||
crc = crc32(0, code, 500);
|
crc = crc32(0, code, 500);
|
||||||
if (crc != crc_old)
|
if (crc != crc_old)
|
||||||
{
|
{
|
||||||
log->append("unasm");
|
|
||||||
unasmer.Desassemble(code, address_old, 500, &unasm);
|
unasmer.Desassemble(code, address_old, 500, &unasm);
|
||||||
if (unasm.src.size()==0)
|
if (unasm.src.size()==0)
|
||||||
throw Error("VM IA86 - cache instructions......................[ERREUR]");
|
throw Error("VM IA86 - cache instructions......................[ERREUR]");
|
||||||
|
@ -945,10 +973,7 @@ void VMEngine::Run(uint32_t end,uint64_t timeout)
|
||||||
{
|
{
|
||||||
err=uc_emu_start(uc, this->getCurrent(), end, timeout, 0);
|
err=uc_emu_start(uc, this->getCurrent(), end, timeout, 0);
|
||||||
if (err)
|
if (err)
|
||||||
{
|
|
||||||
this->Halt();
|
|
||||||
throw Error("VM IA86 - execution...............................[ERREUR]");
|
throw Error("VM IA86 - execution...............................[ERREUR]");
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!this->executed)
|
if (!this->executed)
|
||||||
|
@ -959,6 +984,7 @@ void VMEngine::Run(uint32_t end,uint64_t timeout)
|
||||||
}
|
}
|
||||||
catch(exception const& e)
|
catch(exception const& e)
|
||||||
{
|
{
|
||||||
|
this->Halt();
|
||||||
log->append(e.what());
|
log->append(e.what());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1288,6 +1314,7 @@ void Menu::showInstr()
|
||||||
{
|
{
|
||||||
debug.set(vm.getInstr(vm.getCS(),vm.getEIP(),debug.getHeight()-3));
|
debug.set(vm.getInstr(vm.getCS(),vm.getEIP(),debug.getHeight()-3));
|
||||||
debug.setmark(vm.getLine());
|
debug.setmark(vm.getLine());
|
||||||
|
mem.set(vm.getRam(vm.getDS(), 0x0000, mem.getHeight(),mem.getWidth()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch(exception const& e)
|
catch(exception const& e)
|
||||||
|
@ -1303,6 +1330,8 @@ void Menu::refresh()
|
||||||
{
|
{
|
||||||
regs.set("En attente d'initialisation...");
|
regs.set("En attente d'initialisation...");
|
||||||
flags.set("Attente...");
|
flags.set("Attente...");
|
||||||
|
stack.set("Attente...");
|
||||||
|
mem.set("En attente d'initialisation...");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
6
ia86.h
6
ia86.h
|
@ -309,6 +309,7 @@ class VMEngine
|
||||||
std::vector<std::array<std::string, 5>> getInstr(int segment, int address,int size);
|
std::vector<std::array<std::string, 5>> getInstr(int segment, int address,int size);
|
||||||
void SetMem(Code *code);
|
void SetMem(Code *code);
|
||||||
void SetRegs(State *init);
|
void SetRegs(State *init);
|
||||||
|
std::string getRam(int segment, int address,int lines, int linesize);
|
||||||
int verify();
|
int verify();
|
||||||
bool isExecuted();
|
bool isExecuted();
|
||||||
bool isInitialized();
|
bool isInitialized();
|
||||||
|
@ -385,6 +386,11 @@ class Menu final : public finalcut::FDialog
|
||||||
finalcut::FMenuItem Line2{&Game};
|
finalcut::FMenuItem Line2{&Game};
|
||||||
finalcut::FMenuItem Quit{"&Quitter", &Game};
|
finalcut::FMenuItem Quit{"&Quitter", &Game};
|
||||||
finalcut::FMenu Options{"&Options", &Menubar};
|
finalcut::FMenu Options{"&Options", &Menubar};
|
||||||
|
//finalcut::FMenu Memory{"&Mémoire", &Options};
|
||||||
|
//finalcut::FRadioMenuItem Ds_esi{"DS:ESI", &Memory};
|
||||||
|
//finalcut::FRadioMenuItem Es_edi{"ES:EDI", &Memory};
|
||||||
|
//finalcut::FRadioMenuItem Cs_eip{"CS:EIP", &Memory};
|
||||||
|
//finalcut::FRadioMenuItem Ss_sp{"SS:SP", &Memory};
|
||||||
finalcut::FMenu Tools{"&Outils", &Menubar};
|
finalcut::FMenu Tools{"&Outils", &Menubar};
|
||||||
finalcut::FMenuItem Assemble{"&Compilation", &Tools};
|
finalcut::FMenuItem Assemble{"&Compilation", &Tools};
|
||||||
finalcut::FMenuItem Rearange{"&Ordonne les fenêtres", &Tools};
|
finalcut::FMenuItem Rearange{"&Ordonne les fenêtres", &Tools};
|
||||||
|
|
|
@ -56,14 +56,14 @@ mov es,ax
|
||||||
"niveau_description" : "Il faut connaitre...",
|
"niveau_description" : "Il faut connaitre...",
|
||||||
"niveau_tutoriel" : "Ceci vous...",
|
"niveau_tutoriel" : "Ceci vous...",
|
||||||
"niveau_code" : "mov ax,0x545
|
"niveau_code" : "mov ax,0x545
|
||||||
pop:
|
_pour:
|
||||||
inc dx
|
inc dx
|
||||||
lea ebx,[pop]
|
lea ebx,[_pour]
|
||||||
db 'c','e','c','i',' ','e','s','t',' ','u','n',' ','t','e','s','t',0
|
db 'c','e','c','i',' ','e','s','t',' ','u','n',' ','t','e','s','t',0
|
||||||
.org 0x9000
|
.org 0x9000
|
||||||
pop:
|
_pour:
|
||||||
db 0x00
|
db 0x00
|
||||||
lea eax,[pop]
|
lea eax,[_pour]
|
||||||
mov esi,0x44441234
|
mov esi,0x44441234
|
||||||
.org 0x3002
|
.org 0x3002
|
||||||
hlt",
|
hlt",
|
||||||
|
|
Loading…
Reference in New Issue