2017-05-14 13:06:17 +01:00
|
|
|
#include "vm.h"
|
2017-05-13 18:36:46 +01:00
|
|
|
#include "debug.h"
|
2017-05-14 13:06:17 +01:00
|
|
|
#include "vmas.h"
|
|
|
|
#include <string.h>
|
2017-05-13 18:36:46 +01:00
|
|
|
|
2017-05-14 13:06:17 +01:00
|
|
|
VM::VM() {
|
|
|
|
DBG_INFO(("Creating VM without code.\n"));
|
|
|
|
init_regs();
|
2017-05-13 18:36:46 +01:00
|
|
|
}
|
|
|
|
|
2017-05-14 13:06:17 +01:00
|
|
|
VM::VM(uint8_t *code, uint32_t codesize) {
|
|
|
|
DBG_INFO(("Creating VM with code.\n"));
|
|
|
|
init_regs();
|
|
|
|
as.insCode(code, codesize);
|
2017-05-13 18:36:46 +01:00
|
|
|
}
|
|
|
|
|
2017-05-14 13:06:17 +01:00
|
|
|
void VM::init_regs(void) {
|
|
|
|
uint8_t i;
|
|
|
|
|
|
|
|
for (i = R0; i <= SP; i++) {
|
|
|
|
this->regs[i] = 0;
|
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
void VM::status(void) {
|
|
|
|
uint8_t i;
|
|
|
|
DBG_INFO(("VM Status:\n"));
|
|
|
|
DBG_INFO(("~~~~~~~~~~\n"));
|
|
|
|
for (i = R0; i <= SP; i++) {
|
|
|
|
switch (i) {
|
|
|
|
case R0:
|
|
|
|
DBG_INFO(("R0:\t0x%x\n", this->regs[i]));
|
|
|
|
break;
|
|
|
|
case R1:
|
|
|
|
DBG_INFO(("R1:\t0x%x\n", this->regs[i]));
|
|
|
|
break;
|
|
|
|
case R2:
|
|
|
|
DBG_INFO(("R2:\t0x%x\n", this->regs[i]));
|
|
|
|
break;
|
|
|
|
case R3:
|
|
|
|
DBG_INFO(("R3:\t0x%x\n", this->regs[i]));
|
|
|
|
break;
|
|
|
|
case S0:
|
|
|
|
DBG_INFO(("S0:\t0x%x\n", this->regs[i]));
|
|
|
|
break;
|
|
|
|
case S1:
|
|
|
|
DBG_INFO(("S1:\t0x%x\n", this->regs[i]));
|
|
|
|
break;
|
|
|
|
case S2:
|
|
|
|
DBG_INFO(("S2:\t0x%x\n", this->regs[i]));
|
|
|
|
break;
|
|
|
|
case S3:
|
|
|
|
DBG_INFO(("S3:\t0x%x\n", this->regs[i]));
|
|
|
|
break;
|
|
|
|
case IP:
|
|
|
|
DBG_INFO(("IP:\t0x%x\n", this->regs[i]));
|
|
|
|
break;
|
|
|
|
case BP:
|
|
|
|
DBG_INFO(("BP:\t0x%x\n", this->regs[i]));
|
|
|
|
break;
|
|
|
|
case SP:
|
|
|
|
DBG_INFO(("SP:\t0x%x\n", this->regs[i]));
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
DBG_INFO(("~~~~~~~~~~\n"));
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
void VM::run(uint8_t *code) { return; }
|