aboutsummaryrefslogtreecommitdiff
path: root/src/main.c
diff options
context:
space:
mode:
authorAryadev Chavali <aryadev@aryadevchavali.com>2023-10-15 21:14:56 +0100
committerAryadev Chavali <aryadev@aryadevchavali.com>2023-10-15 21:14:56 +0100
commitf0e48a186d76623017758a96e60174412de78933 (patch)
tree1a52707ada86385ee6413301e2f2579e9007e828 /src/main.c
parent2490966554a378af4a48b51d5e7eb717a570285a (diff)
downloadovm-f0e48a186d76623017758a96e60174412de78933.tar.gz
ovm-f0e48a186d76623017758a96e60174412de78933.tar.bz2
ovm-f0e48a186d76623017758a96e60174412de78933.zip
Added a register `ret`, a word, which holds the result of any instruction
Allows inspection at runtime of any routines result.
Diffstat (limited to 'src/main.c')
-rw-r--r--src/main.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/src/main.c b/src/main.c
index f431dd7..c0a2e00 100644
--- a/src/main.c
+++ b/src/main.c
@@ -23,6 +23,7 @@ typedef struct
{
struct Registers
{
+ word ret;
byte b[VM_BYTE_REGISTERS];
word w[VM_WORD_REGISTERS];
f64 f[VM_FLOAT_REGISTERS];
@@ -177,18 +178,20 @@ void vm_execute(vm_t *vm)
if (OPCODE_IS_PUSH(instruction.opcode))
{
PUSH_ROUTINES[instruction.opcode](vm, instruction.operand);
+ vm->registers.ret = instruction.operand.as_word;
prog->ptr++;
}
else if (OPCODE_IS_MOV(instruction.opcode))
{
MOV_ROUTINES[instruction.opcode](vm, instruction.operand, instruction.reg);
+ vm->registers.ret = instruction.operand.as_word;
prog->ptr++;
}
else if (OPCODE_IS_POP(instruction.opcode))
{
- // TODO: Figure out what should happen to the result of this pop
- // routine
- POP_ROUTINES[instruction.opcode](vm);
+ // NOTE: We use the `ret` register for the result of this pop
+ data_t d = POP_ROUTINES[instruction.opcode](vm);
+ vm->registers.ret = d.as_word;
prog->ptr++;
}
else