Made vm_pop_* routines more uniform by returning a data_t

This commit is contained in:
2023-10-15 21:12:53 +01:00
parent 00517fddd6
commit 6927557d3f

View File

@@ -71,7 +71,6 @@ void vm_push_word(vm_t *vm, data_t w)
{
const word mask = ((word)0b11111111) << (i - 8);
byte b = (w.as_word & mask) >> (i - 8);
printf("PUSH(%lu): pushed byte %X\n", i, b);
vm_push_byte(vm, DBYTE(b));
}
}
@@ -111,40 +110,39 @@ void vm_mov_float(vm_t *vm, data_t f, word reg)
vm->registers.f[reg] = f.as_float;
}
byte vm_pop_byte(vm_t *vm)
data_t vm_pop_byte(vm_t *vm)
{
if (vm->stack.ptr == 0)
// TODO: Error STACK_UNDERFLOW
return 0;
return vm->stack.data[--vm->stack.ptr];
return DBYTE(0);
return DBYTE(vm->stack.data[--vm->stack.ptr]);
}
word vm_pop_word(vm_t *vm)
data_t vm_pop_word(vm_t *vm)
{
if (vm->stack.ptr < WORD_SIZE)
// TODO: Error STACK_UNDERFLOW
return 0;
return DWORD(0);
word w = 0;
for (size_t i = 0; i < WORD_SIZE; ++i)
{
byte b = vm_pop_byte(vm);
printf("POP(%lu): popped byte %X\n", i, b);
w = w | ((word)b << (i * 8));
data_t b = vm_pop_byte(vm);
w = w | ((word)(b.as_byte) << (i * 8));
}
return w;
return DWORD(w);
}
f64 vm_pop_float(vm_t *vm)
data_t vm_pop_float(vm_t *vm)
{
if (vm->stack.ptr < FLOAT_SIZE)
// TODO: Error STACK_UNDERFLOW
return 0;
return DFLOAT(0);
f64 f = 0;
// TODO: Make this machine independent (encode IEEE754 floats
// yourself?)
memcpy(&f, vm->stack.data + vm->stack.ptr - FLOAT_SIZE, FLOAT_SIZE);
vm->stack.ptr -= FLOAT_SIZE;
return f;
return DFLOAT(f);
}
typedef void (*push_f)(vm_t *, data_t);