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);
|
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);
|
||||||
|
|||||||
Reference in New Issue
Block a user