diff options
author | Aryadev Chavali <aryadev@aryadevchavali.com> | 2024-04-14 02:35:09 +0630 |
---|---|---|
committer | Aryadev Chavali <aryadev@aryadevchavali.com> | 2024-04-14 02:35:09 +0630 |
commit | 1cd31a270207d5dfefbfe5f712d850d83e29093f (patch) | |
tree | 3ecc196fa156c294e67eec2565d0debaf531b1e5 /lib | |
parent | 99a81ce95d8d507e0b73959a180727e05573e6c9 (diff) | |
download | ovm-1cd31a270207d5dfefbfe5f712d850d83e29093f.tar.gz ovm-1cd31a270207d5dfefbfe5f712d850d83e29093f.tar.bz2 ovm-1cd31a270207d5dfefbfe5f712d850d83e29093f.zip |
Moved struct definitions lib/inst.h -> lib/prog.h
This means if I write the new assembler in another language I only
need to FFI this header rather than all the functions as well which
may not be as useful.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/inst.h | 159 | ||||
-rw-r--r-- | lib/prog.h | 176 |
2 files changed, 177 insertions, 158 deletions
@@ -13,151 +13,12 @@ #ifndef INST_H #define INST_H -#include <lib/base.h> #include <lib/darr.h> +#include <lib/prog.h> #include <stdio.h> #include <stdlib.h> -typedef enum -{ - OP_NOOP = 0, - - // Dealing with data and registers - OP_PUSH_BYTE, - OP_PUSH_HWORD, - OP_PUSH_WORD, - - OP_POP_BYTE, - OP_POP_HWORD, - OP_POP_WORD, - - OP_PUSH_REGISTER_BYTE, - OP_PUSH_REGISTER_HWORD, - OP_PUSH_REGISTER_WORD, - - OP_MOV_BYTE, - OP_MOV_HWORD, - OP_MOV_WORD, - - OP_DUP_BYTE, - OP_DUP_HWORD, - OP_DUP_WORD, - - // Dealing with the heap - OP_MALLOC_BYTE, - OP_MALLOC_HWORD, - OP_MALLOC_WORD, - - OP_MALLOC_STACK_BYTE, - OP_MALLOC_STACK_HWORD, - OP_MALLOC_STACK_WORD, - - OP_MSET_BYTE, - OP_MSET_HWORD, - OP_MSET_WORD, - - OP_MSET_STACK_BYTE, - OP_MSET_STACK_HWORD, - OP_MSET_STACK_WORD, - - OP_MGET_BYTE, - OP_MGET_HWORD, - OP_MGET_WORD, - - OP_MGET_STACK_BYTE, - OP_MGET_STACK_HWORD, - OP_MGET_STACK_WORD, - - OP_MDELETE, - OP_MSIZE, - - // Boolean operations - OP_NOT_BYTE, - OP_NOT_HWORD, - OP_NOT_WORD, - - OP_OR_BYTE, - OP_OR_HWORD, - OP_OR_WORD, - - OP_AND_BYTE, - OP_AND_HWORD, - OP_AND_WORD, - - OP_XOR_BYTE, - OP_XOR_HWORD, - OP_XOR_WORD, - - OP_EQ_BYTE, - OP_EQ_HWORD, - OP_EQ_WORD, - - // Mathematical operations - OP_LT_BYTE, - OP_LT_CHAR, - OP_LT_HWORD, - OP_LT_INT, - OP_LT_LONG, - OP_LT_WORD, - - OP_LTE_BYTE, - OP_LTE_CHAR, - OP_LTE_HWORD, - OP_LTE_INT, - OP_LTE_LONG, - OP_LTE_WORD, - - OP_GT_BYTE, - OP_GT_CHAR, - OP_GT_HWORD, - OP_GT_INT, - OP_GT_LONG, - OP_GT_WORD, - - OP_GTE_BYTE, - OP_GTE_CHAR, - OP_GTE_HWORD, - OP_GTE_INT, - OP_GTE_LONG, - OP_GTE_WORD, - - OP_PLUS_BYTE, - OP_PLUS_HWORD, - OP_PLUS_WORD, - - OP_SUB_BYTE, - OP_SUB_HWORD, - OP_SUB_WORD, - - OP_MULT_BYTE, - OP_MULT_HWORD, - OP_MULT_WORD, - - // Simple I/O - OP_PRINT_BYTE, - OP_PRINT_CHAR, - OP_PRINT_HWORD, - OP_PRINT_INT, - OP_PRINT_LONG, - OP_PRINT_WORD, - - // Program control flow - OP_JUMP_ABS, - OP_JUMP_STACK, - OP_JUMP_IF_BYTE, - OP_JUMP_IF_HWORD, - OP_JUMP_IF_WORD, - // Subroutines - OP_CALL, - OP_CALL_STACK, - OP_RET, - - // Should not be an opcode - NUMBER_OF_OPCODES, - OP_HALT = 0b11111111, // top of the byte is a HALT -} opcode_t; - const char *opcode_as_cstr(opcode_t); #define OPCODE_IS_TYPE(OPCODE, OP_TYPE) \ @@ -168,12 +29,6 @@ const char *opcode_as_cstr(opcode_t); : ((OPCODE) == OP_TYPE##_HWORD) ? DATA_TYPE_HWORD \ : DATA_TYPE_WORD) -typedef struct -{ - opcode_t opcode; - data_t operand; -} inst_t; - void inst_print(inst_t, FILE *); size_t inst_bytecode_size(inst_t); @@ -188,18 +43,6 @@ inst_t *insts_read_bytecode(darr_t *, size_t *); void insts_write_bytecode_file(inst_t *, size_t, FILE *); inst_t *insts_read_bytecode_file(FILE *, size_t *); -typedef struct -{ - word start_address; -} prog_header_t; - -typedef struct -{ - prog_header_t header; - word count; - inst_t instructions[]; -} prog_t; - // Write the entire program as bytecode void prog_write_bytecode(prog_t *, darr_t *); // Only append the instructions as bytecode diff --git a/lib/prog.h b/lib/prog.h new file mode 100644 index 0000000..4548f08 --- /dev/null +++ b/lib/prog.h @@ -0,0 +1,176 @@ +/* Copyright (C) 2024 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: 2024-04-14 + * Author: Aryadev Chavali + * Description: Structures for both instructions and programs for the + * virtual machine + */ + +#ifndef PROG_H +#define PROG_H + +#include <lib/base.h> + +typedef enum +{ + OP_NOOP = 0, + + // Dealing with data and registers + OP_PUSH_BYTE, + OP_PUSH_HWORD, + OP_PUSH_WORD, + + OP_POP_BYTE, + OP_POP_HWORD, + OP_POP_WORD, + + OP_PUSH_REGISTER_BYTE, + OP_PUSH_REGISTER_HWORD, + OP_PUSH_REGISTER_WORD, + + OP_MOV_BYTE, + OP_MOV_HWORD, + OP_MOV_WORD, + + OP_DUP_BYTE, + OP_DUP_HWORD, + OP_DUP_WORD, + + // Dealing with the heap + OP_MALLOC_BYTE, + OP_MALLOC_HWORD, + OP_MALLOC_WORD, + + OP_MALLOC_STACK_BYTE, + OP_MALLOC_STACK_HWORD, + OP_MALLOC_STACK_WORD, + + OP_MSET_BYTE, + OP_MSET_HWORD, + OP_MSET_WORD, + + OP_MSET_STACK_BYTE, + OP_MSET_STACK_HWORD, + OP_MSET_STACK_WORD, + + OP_MGET_BYTE, + OP_MGET_HWORD, + OP_MGET_WORD, + + OP_MGET_STACK_BYTE, + OP_MGET_STACK_HWORD, + OP_MGET_STACK_WORD, + + OP_MDELETE, + OP_MSIZE, + + // Boolean operations + OP_NOT_BYTE, + OP_NOT_HWORD, + OP_NOT_WORD, + + OP_OR_BYTE, + OP_OR_HWORD, + OP_OR_WORD, + + OP_AND_BYTE, + OP_AND_HWORD, + OP_AND_WORD, + + OP_XOR_BYTE, + OP_XOR_HWORD, + OP_XOR_WORD, + + OP_EQ_BYTE, + OP_EQ_HWORD, + OP_EQ_WORD, + + // Mathematical operations + OP_LT_BYTE, + OP_LT_CHAR, + OP_LT_HWORD, + OP_LT_INT, + OP_LT_LONG, + OP_LT_WORD, + + OP_LTE_BYTE, + OP_LTE_CHAR, + OP_LTE_HWORD, + OP_LTE_INT, + OP_LTE_LONG, + OP_LTE_WORD, + + OP_GT_BYTE, + OP_GT_CHAR, + OP_GT_HWORD, + OP_GT_INT, + OP_GT_LONG, + OP_GT_WORD, + + OP_GTE_BYTE, + OP_GTE_CHAR, + OP_GTE_HWORD, + OP_GTE_INT, + OP_GTE_LONG, + OP_GTE_WORD, + + OP_PLUS_BYTE, + OP_PLUS_HWORD, + OP_PLUS_WORD, + + OP_SUB_BYTE, + OP_SUB_HWORD, + OP_SUB_WORD, + + OP_MULT_BYTE, + OP_MULT_HWORD, + OP_MULT_WORD, + + // Simple I/O + OP_PRINT_BYTE, + OP_PRINT_CHAR, + OP_PRINT_HWORD, + OP_PRINT_INT, + OP_PRINT_LONG, + OP_PRINT_WORD, + + // Program control flow + OP_JUMP_ABS, + OP_JUMP_STACK, + OP_JUMP_IF_BYTE, + OP_JUMP_IF_HWORD, + OP_JUMP_IF_WORD, + // Subroutines + OP_CALL, + OP_CALL_STACK, + OP_RET, + + // Should not be an opcode + NUMBER_OF_OPCODES, + OP_HALT = 0b11111111, // top of the byte is a HALT +} opcode_t; + +typedef struct +{ + opcode_t opcode; + data_t operand; +} inst_t; + +typedef struct +{ + word start_address; +} prog_header_t; + +typedef struct +{ + prog_header_t header; + word count; + inst_t instructions[]; +} prog_t; + +#endif |