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); const word mask = ((word)0b11111111) << (i - 8);
byte b = (w.as_word & mask) >> (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)); 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; 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) if (vm->stack.ptr == 0)
// TODO: Error STACK_UNDERFLOW // TODO: Error STACK_UNDERFLOW
return 0; return DBYTE(0);
return vm->stack.data[--vm->stack.ptr]; 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) if (vm->stack.ptr < WORD_SIZE)
// TODO: Error STACK_UNDERFLOW // TODO: Error STACK_UNDERFLOW
return 0; return DWORD(0);
word w = 0; word w = 0;
for (size_t i = 0; i < WORD_SIZE; ++i) for (size_t i = 0; i < WORD_SIZE; ++i)
{ {
byte b = vm_pop_byte(vm); data_t b = vm_pop_byte(vm);
printf("POP(%lu): popped byte %X\n", i, b); w = w | ((word)(b.as_byte) << (i * 8));
w = w | ((word)b << (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) if (vm->stack.ptr < FLOAT_SIZE)
// TODO: Error STACK_UNDERFLOW // TODO: Error STACK_UNDERFLOW
return 0; return DFLOAT(0);
f64 f = 0; f64 f = 0;
// TODO: Make this machine independent (encode IEEE754 floats // TODO: Make this machine independent (encode IEEE754 floats
// yourself?) // yourself?)
memcpy(&f, vm->stack.data + vm->stack.ptr - FLOAT_SIZE, FLOAT_SIZE); memcpy(&f, vm->stack.data + vm->stack.ptr - FLOAT_SIZE, FLOAT_SIZE);
vm->stack.ptr -= FLOAT_SIZE; vm->stack.ptr -= FLOAT_SIZE;
return f; return DFLOAT(f);
} }
typedef void (*push_f)(vm_t *, data_t); typedef void (*push_f)(vm_t *, data_t);