Implemented OP_MSIZE in the VM runtime
This commit is contained in:
14
vm/runtime.c
14
vm/runtime.c
@@ -60,7 +60,7 @@ const char *err_as_cstr(err_t err)
|
|||||||
|
|
||||||
err_t vm_execute(vm_t *vm)
|
err_t vm_execute(vm_t *vm)
|
||||||
{
|
{
|
||||||
static_assert(NUMBER_OF_OPCODES == 83, "vm_execute: Out of date");
|
static_assert(NUMBER_OF_OPCODES == 84, "vm_execute: Out of date");
|
||||||
struct Program *prog = &vm->program;
|
struct Program *prog = &vm->program;
|
||||||
if (prog->ptr >= prog->max)
|
if (prog->ptr >= prog->max)
|
||||||
return ERR_END_OF_PROGRAM;
|
return ERR_END_OF_PROGRAM;
|
||||||
@@ -113,7 +113,7 @@ err_t vm_execute(vm_t *vm)
|
|||||||
OPCODE_IS_TYPE(instruction.opcode, OP_GTE) ||
|
OPCODE_IS_TYPE(instruction.opcode, OP_GTE) ||
|
||||||
OPCODE_IS_TYPE(instruction.opcode, OP_PLUS) ||
|
OPCODE_IS_TYPE(instruction.opcode, OP_PLUS) ||
|
||||||
OPCODE_IS_TYPE(instruction.opcode, OP_MULT) ||
|
OPCODE_IS_TYPE(instruction.opcode, OP_MULT) ||
|
||||||
instruction.opcode == OP_MDELETE)
|
instruction.opcode == OP_MDELETE || instruction.opcode == OP_MSIZE)
|
||||||
{
|
{
|
||||||
prog->ptr++;
|
prog->ptr++;
|
||||||
return STACK_ROUTINES[instruction.opcode](vm);
|
return STACK_ROUTINES[instruction.opcode](vm);
|
||||||
@@ -817,6 +817,16 @@ err_t vm_mdelete(vm_t *vm)
|
|||||||
return ERR_OK;
|
return ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
err_t vm_msize(vm_t *vm)
|
||||||
|
{
|
||||||
|
data_t ptr = {0};
|
||||||
|
err_t err = vm_pop_word(vm, &ptr);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
page_t *page = (page_t *)ptr.as_word;
|
||||||
|
return vm_push_word(vm, DWORD(page->available));
|
||||||
|
}
|
||||||
|
|
||||||
#define VM_NOT_TYPE(TYPEL, TYPEU) \
|
#define VM_NOT_TYPE(TYPEL, TYPEU) \
|
||||||
err_t vm_not_##TYPEL(vm_t *vm) \
|
err_t vm_not_##TYPEL(vm_t *vm) \
|
||||||
{ \
|
{ \
|
||||||
|
|||||||
@@ -138,6 +138,7 @@ static const word_f WORD_ROUTINES[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
err_t vm_mdelete(vm_t *);
|
err_t vm_mdelete(vm_t *);
|
||||||
|
err_t vm_msize(vm_t *);
|
||||||
|
|
||||||
err_t vm_not_byte(vm_t *);
|
err_t vm_not_byte(vm_t *);
|
||||||
err_t vm_not_hword(vm_t *);
|
err_t vm_not_hword(vm_t *);
|
||||||
@@ -200,8 +201,10 @@ err_t vm_mult_word(vm_t *);
|
|||||||
|
|
||||||
typedef err_t (*stack_f)(vm_t *);
|
typedef err_t (*stack_f)(vm_t *);
|
||||||
static const stack_f STACK_ROUTINES[] = {
|
static const stack_f STACK_ROUTINES[] = {
|
||||||
[OP_MDELETE] = vm_mdelete, [OP_NOT_BYTE] = vm_not_byte,
|
[OP_MDELETE] = vm_mdelete, [OP_MSIZE] = vm_msize,
|
||||||
[OP_NOT_HWORD] = vm_not_hword, [OP_NOT_WORD] = vm_not_word,
|
|
||||||
|
[OP_NOT_BYTE] = vm_not_byte, [OP_NOT_HWORD] = vm_not_hword,
|
||||||
|
[OP_NOT_WORD] = vm_not_word,
|
||||||
|
|
||||||
[OP_OR_BYTE] = vm_or_byte, [OP_OR_HWORD] = vm_or_hword,
|
[OP_OR_BYTE] = vm_or_byte, [OP_OR_HWORD] = vm_or_hword,
|
||||||
[OP_OR_WORD] = vm_or_word,
|
[OP_OR_WORD] = vm_or_word,
|
||||||
|
|||||||
Reference in New Issue
Block a user