Steelbreeze/Core/CPU/Interpreter/Interpreter.cpp
2012-06-21 08:43:54 -04:00

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;
}