mirror of
https://github.com/CPunch/Laika.git
synced 2024-11-21 20:40:05 +00:00
VM: minor refacotring, added OP_TESTJMP & OP_DEBUG
This commit is contained in:
parent
9cea98c86a
commit
4333d03a51
@ -30,7 +30,7 @@ struct sLaikaV_vm {
|
|||||||
int pc;
|
int pc;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define LAIKA_MAKE_VM(consts, code) (struct sLaikaV_vm)({.constList = consts, .code = code, .pc = 0})
|
#define LAIKA_MAKE_VM(consts, code) (struct sLaikaV_vm)({.constList = consts, .code = code, .pc = 0, .stack = {}})
|
||||||
|
|
||||||
/* constants */
|
/* constants */
|
||||||
#define LAIKA_MAKE_VM_INT(i) (struct sLaikaV_vm_val)({.i = i})
|
#define LAIKA_MAKE_VM_INT(i) (struct sLaikaV_vm_val)({.i = i})
|
||||||
@ -56,7 +56,12 @@ enum {
|
|||||||
OP_XOR, /* stk_indx[uint8_t] = stk_indx[uint8_t] ^ stk_indx[uint8_t] */
|
OP_XOR, /* stk_indx[uint8_t] = stk_indx[uint8_t] ^ stk_indx[uint8_t] */
|
||||||
|
|
||||||
/* control-flow */
|
/* control-flow */
|
||||||
OP_TESTJMP, /* if stk_indx[uint8_t] != 0, pc += [uint8_t] */
|
OP_TESTJMP, /* if stk_indx[uint8_t] != 0, pc += [int8_t] */
|
||||||
|
|
||||||
|
/* misc. */
|
||||||
|
#ifdef DEBUG
|
||||||
|
OP_DEBUG
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
LAIKA_FORCEINLINE void laikaV_execute(struct sLaikaV_vm *vm) {
|
LAIKA_FORCEINLINE void laikaV_execute(struct sLaikaV_vm *vm) {
|
||||||
@ -97,8 +102,29 @@ LAIKA_FORCEINLINE void laikaV_execute(struct sLaikaV_vm *vm) {
|
|||||||
case OP_AND: BINOP(&);
|
case OP_AND: BINOP(&);
|
||||||
case OP_OR: BINOP(|);
|
case OP_OR: BINOP(|);
|
||||||
case OP_XOR: BINOP(^);
|
case OP_XOR: BINOP(^);
|
||||||
|
case OP_TESTJMP: {
|
||||||
|
uint8_t indx = READBYTE;
|
||||||
|
int8_t jmp = READBYTE;
|
||||||
|
|
||||||
|
/* if stack indx is true, jump by jmp (signed 8-bit int) */
|
||||||
|
if (vm->stack[indx].i)
|
||||||
|
vm->pc += jmp;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#ifdef DEBUG
|
||||||
|
case OP_DEBUG: {
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* print stack info */
|
||||||
|
for (i = 0; i < LAIKA_VM_STACKSIZE; i++)
|
||||||
|
printf("[%03d] - 0x%02x\n", i, vm->stack[i].i);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
default:
|
default:
|
||||||
LAIKA_ERROR("laikaV_execute: unknown opcode [%d]!", vm->code[vm->pc])
|
LAIKA_ERROR("laikaV_execute: unknown opcode [0x%02x]! pc: %d\n", vm->code[vm->pc], vm->pc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user