Fixes. Debugger improved.

This commit is contained in:
2017-02-01 19:49:26 +01:00
parent ad4b15514d
commit 0864cdcf89
9 changed files with 132 additions and 58 deletions

30
vm.cpp
View File

@@ -161,10 +161,10 @@ void vm_init(const char* filename) {
inline unsigned short WORD() { vm_pc += 2; return vm_program[vm_pc - 2] + (vm_program[vm_pc - 1] << 8); }
const bool vm_step() {
if (sleeping) return false;
const unsigned short vm_step() {
if (sleeping) return vm_pc;
char a, b, c;
unsigned char a, b, c;
OPS opcode = (OPS)vm_program[vm_pc++];
switch (opcode) {
@@ -214,8 +214,8 @@ const bool vm_step() {
case OP_ADD: GRAB(ds); PUSH(ds, a + b); vm_cycles++; break;
case OP_SUB: GRAB(ds); PUSH(ds, a - b); vm_cycles++; break;
case OP_MUL: GRAB(ds); PUSH(ds, a * b); vm_cycles++; break;
case OP_DIV: GRAB(ds); PUSH(ds, a / b); vm_cycles++; break;
case OP_MOD: GRAB(ds); PUSH(ds, a % b); vm_cycles++; break;
case OP_DIV: GRAB(ds); PUSH(ds, b / a); vm_cycles++; break;
case OP_MOD: GRAB(ds); PUSH(ds, b % a); vm_cycles++; break;
case OP_AND: GRAB(ds); PUSH(ds, a & b); vm_cycles++; break;
case OP_OR: GRAB(ds); PUSH(ds, a | b); vm_cycles++; break;
case OP_NOT: a = POP(ds); PUSH(ds, !a); vm_cycles++; break;
@@ -231,22 +231,24 @@ const bool vm_step() {
vm_cycles++; break;
case OP_EQ: GRAB(ds); PUSH(ds, a == b); vm_cycles++; break;
case OP_NEQ: GRAB(ds); PUSH(ds, a != b); vm_cycles++; break;
case OP_LT: GRAB(ds); PUSH(ds, a < b); vm_cycles++; break;
case OP_GT: GRAB(ds); PUSH(ds, a > b); vm_cycles++; break;
case OP_LEQ: GRAB(ds); PUSH(ds, a <= b); vm_cycles++; break;
case OP_GEQ: GRAB(ds); PUSH(ds, a >= b); vm_cycles++; break;
case OP_LT:
GRAB(ds);
PUSH(ds, b < a); vm_cycles++; break;
case OP_GT: GRAB(ds); PUSH(ds, b > a); vm_cycles++; break;
case OP_LEQ: GRAB(ds); PUSH(ds, b <= a); vm_cycles++; break;
case OP_GEQ: GRAB(ds); PUSH(ds, b >= a); vm_cycles++; break;
case OP_IN: PUSH(ds, in_ports[vm_program[vm_pc++]]()); vm_cycles++; break;
case OP_OUT: out_ports[vm_program[vm_pc++]](POP(ds)); vm_cycles++; break;
case OP_SLEEP: SDL_Delay(POP(ds) * 1000); vm_cycles++; break;
}
return false;
return vm_pc;
}
const int vm_big_step() {
const unsigned short vm_big_step() {
word* lines = parser_get_lines();
word current_line = lines[vm_pc]-1;
while ((vm_pc > 32768) || (lines[vm_pc]-1 == current_line)) { vm_step(); }
return false;
word current_line = lines[vm_pc];
while ((vm_pc >= 32768) || (lines[vm_pc] == current_line)) { vm_step(); }
return vm_pc;
}
/*void vm_register_call(void(*callback)(t_stack&)) {
external_calls[numcallbacks++] = callback;