mirror of
https://github.com/daeken/SteelBreeze.git
synced 2024-06-11 09:07:06 -04:00
70 lines
1.3 KiB
C++
70 lines
1.3 KiB
C++
#include "Interpreter.hpp"
|
|
#include "Instructions.hpp"
|
|
|
|
void Interpreter::Run() {
|
|
while(true) {
|
|
uint8_t *eip = (uint8_t *) MemoryBase + Eip;
|
|
// Prefixes
|
|
bool foundPrefix = true;
|
|
bool opsize = false, adsize = false;
|
|
while(foundPrefix)
|
|
switch(*eip++) {
|
|
case 0x66: {// OPSIZE
|
|
opsize = true;
|
|
break;
|
|
}
|
|
case 0x67: {// ADSIZE
|
|
adsize = true;
|
|
break;
|
|
}
|
|
default: {
|
|
foundPrefix = false;
|
|
eip--;
|
|
}
|
|
}
|
|
|
|
uint8_t op = *eip++;
|
|
Eip++;
|
|
printf("Op %02x\n", op);
|
|
printf("Eax %08x\n", Eax);
|
|
// Instructions
|
|
switch(op) {
|
|
#include "Interpreter_inst.cgen"
|
|
default: {
|
|
printf("Undefined opcode %02x @ %08X\n", op, Eip);
|
|
exit(1);
|
|
}
|
|
}
|
|
Eip = (uint32_t) (eip - (uint8_t *) MemoryBase);
|
|
}
|
|
}
|
|
|
|
void *Interpreter::RmAddr(uint8_t mod, uint8_t rm, int size) {
|
|
return null;
|
|
}
|
|
|
|
void *Interpreter::Reg(int reg, int size) {
|
|
uint32_t *regaddr;
|
|
size_t off = 0;
|
|
if(reg > 4 && size == 1) {
|
|
reg -= 4;
|
|
off = 1;
|
|
}
|
|
switch(reg) {
|
|
case 0: regaddr = &Eax; break;
|
|
case 1: regaddr = &Ecx; break;
|
|
case 2: regaddr = &Edx; break;
|
|
case 3: regaddr = &Ebx; break;
|
|
case 4: regaddr = &Esp; break;
|
|
case 5: regaddr = &Ebp; break;
|
|
case 6: regaddr = &Esi; break;
|
|
case 7: regaddr = &Edi; break;
|
|
}
|
|
|
|
return ((uint8_t *) regaddr) + off;
|
|
}
|
|
|
|
uint16_t *Interpreter::SegReg(int reg) {
|
|
return null;
|
|
}
|