Made vm_pop_* routines more uniform by returning a data_t
This commit is contained in:
24
src/main.c
24
src/main.c
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user