diff options
-rw-r--r-- | src/inst.h | 16 | ||||
-rw-r--r-- | src/main.c | 7 |
2 files changed, 14 insertions, 9 deletions
@@ -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; @@ -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, |