Fixes. Debugger improved.
This commit is contained in:
30
vm.cpp
30
vm.cpp
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user