diff --git a/src/inst.h b/src/inst.h index 95baaf2..086696a 100644 --- a/src/inst.h +++ b/src/inst.h @@ -17,14 +17,20 @@ typedef enum { - OP_PUSH_BYTE = 1, - OP_PUSH_WORD, - OP_PUSH_FLOAT, -} op_t; + OP_NOOP = 0, + + OP_PUSH_BYTE = 0b0001, + OP_PUSH_WORD = 0b0101, + OP_PUSH_FLOAT = 0b1001, + + OP_HALT, +} opcode_t; + +#define OPCODE_IS_PUSH(OPCODE) (((OPCODE)&1) == 1) typedef struct { - op_t opcode; + opcode_t opcode; data_t operand; } inst_t; diff --git a/src/main.c b/src/main.c index 9b744b2..4ccb42a 100644 --- a/src/main.c +++ b/src/main.c @@ -121,11 +121,10 @@ void vm_execute(vm_t *vm) // TODO: Error (Went past end of program) return; inst_t instruction = prog->instructions[prog->ptr]; - // NOTE: This is ballsy; I'm essentially saying I will never use the - // last 2 bits unless it's a push routine - if ((instruction.opcode & 0b11) != 0) + + // Check if opcode is PUSH_LIKE + if (OPCODE_IS_PUSH(instruction.opcode)) { - // Possible push routines typedef void (*push_f)(vm_t *, data_t); const push_f routines[] = {[OP_PUSH_BYTE] = vm_push_byte, [OP_PUSH_WORD] = vm_push_word,