diff options
author | Aryadev Chavali <aryadev@aryadevchavali.com> | 2023-10-15 21:41:16 +0100 |
---|---|---|
committer | Aryadev Chavali <aryadev@aryadevchavali.com> | 2023-10-15 21:41:16 +0100 |
commit | 639808a092001cf621921311c6665554b9235bb6 (patch) | |
tree | 2a2e58e989a210b57418a760b9fa5cd9112eafe6 /src/runtime.h | |
parent | 14e9192996749208da8acbad44545dc991dd4ef8 (diff) | |
download | ovm-639808a092001cf621921311c6665554b9235bb6.tar.gz ovm-639808a092001cf621921311c6665554b9235bb6.tar.bz2 ovm-639808a092001cf621921311c6665554b9235bb6.zip |
Moved vm_* code to its own file (runtime.(h|c))
Diffstat (limited to 'src/runtime.h')
-rw-r--r-- | src/runtime.h | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/src/runtime.h b/src/runtime.h new file mode 100644 index 0000000..4efe074 --- /dev/null +++ b/src/runtime.h @@ -0,0 +1,94 @@ +/* Copyright (C) 2023 Aryadev Chavali + + * You may distribute and modify this code under the terms of the + * GPLv2 license. You should have received a copy of the GPLv2 + * license with this file. If not, please write to: + * aryadev@aryadevchavali.com. + + * Created: 2023-10-15 + * Author: Aryadev Chavali + * Description: Virtual machine implementation + */ + +#ifndef RUNTIME_H +#define RUNTIME_H + +#include <stdlib.h> + +#include "./base.h" +#include "./inst.h" + +#define VM_BYTE_REGISTERS 8 +#define VM_WORD_REGISTERS 8 +#define VM_FLOAT_REGISTERS 8 +typedef struct +{ + struct Registers + { + word ret; + byte b[VM_BYTE_REGISTERS]; + word w[VM_WORD_REGISTERS]; + f64 f[VM_FLOAT_REGISTERS]; + } registers; + struct Stack + { + byte *data; + word ptr, max; + } stack; + struct Program + { + inst_t *instructions; + word ptr, max; + } program; +} vm_t; + +void vm_load_stack(vm_t *, byte *, size_t); +void vm_load_program(vm_t *, inst_t *, size_t); + +void vm_execute(vm_t *); + +void vm_push_byte(vm_t *, data_t); +void vm_push_word(vm_t *, data_t); +void vm_push_float(vm_t *, data_t); + +typedef void (*push_f)(vm_t *, data_t); +static const push_f PUSH_ROUTINES[] = { + [OP_PUSH_BYTE] = vm_push_byte, + [OP_PUSH_WORD] = vm_push_word, + [OP_PUSH_FLOAT] = vm_push_float, +}; + +void vm_push_byte_register(vm_t *, word); +void vm_push_word_register(vm_t *, word); +void vm_push_float_register(vm_t *, word); + +typedef void (*push_reg_f)(vm_t *, word); +static const push_reg_f PUSH_REG_ROUTINES[] = { + [OP_PUSH_BYTE_REGISTER] = vm_push_byte_register, + [OP_PUSH_WORD_REGISTER] = vm_push_word_register, + [OP_PUSH_FLOAT_REGISTER] = vm_push_float_register, +}; + +void vm_mov_byte(vm_t *, data_t, word); +void vm_mov_word(vm_t *, data_t, word); +void vm_mov_float(vm_t *, data_t, word); + +typedef void (*mov_f)(vm_t *, data_t, word); +static const mov_f MOV_ROUTINES[] = { + [OP_MOV_BYTE] = vm_mov_byte, + [OP_MOV_WORD] = vm_mov_word, + [OP_MOV_FLOAT] = vm_mov_float, +}; + +data_t vm_pop_byte(vm_t *); +data_t vm_pop_word(vm_t *); +data_t vm_pop_float(vm_t *); + +typedef data_t (*pop_f)(vm_t *); +static const pop_f POP_ROUTINES[] = { + [OP_POP_BYTE] = vm_pop_byte, + [OP_POP_WORD] = vm_pop_word, + [OP_POP_FLOAT] = vm_pop_float, +}; + +#endif |