diff options
Diffstat (limited to 'vm')
-rw-r--r-- | vm/base.h | 70 | ||||
-rw-r--r-- | vm/darr.c | 77 | ||||
-rw-r--r-- | vm/darr.h | 39 | ||||
-rw-r--r-- | vm/fib.c | 79 | ||||
-rw-r--r-- | vm/inst.h | 4 | ||||
-rw-r--r-- | vm/runtime.h | 2 |
6 files changed, 3 insertions, 268 deletions
diff --git a/vm/base.h b/vm/base.h deleted file mode 100644 index dbeec80..0000000 --- a/vm/base.h +++ /dev/null @@ -1,70 +0,0 @@ -/* 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: Basic types and routines - */ - -#ifndef BASE_H -#define BASE_H - -#include <stdint.h> - -#define ARR_SIZE(xs) (sizeof(xs) / sizeof(xs[0])) -#define MAX(a, b) ((a) > (b) ? (a) : (b)) -#define MIN(a, b) ((a) > (b) ? (b) : (a)) - -// Flags -#ifndef VERBOSE -#define VERBOSE 0 -#endif - -typedef uint64_t u64; -typedef uint32_t u32; -typedef int32_t i32; -typedef int64_t i64; -typedef float f32; -typedef double f64; - -typedef uint8_t byte; -typedef u32 hword; -typedef u64 word; - -typedef union -{ - byte as_byte; - hword as_hword; - word as_word; -} data_t; - -typedef enum -{ - DATA_TYPE_NIL = 0, - DATA_TYPE_BYTE, - DATA_TYPE_HWORD, - DATA_TYPE_WORD, -} data_type_t; - -#define DBYTE(BYTE) ((data_t){.as_byte = (BYTE)}) -#define DHWORD(HWORD) ((data_t){.as_hword = (HWORD)}) -#define DWORD(WORD) ((data_t){.as_word = (WORD)}) - -#define HWORD_SIZE sizeof(hword) -#define WORD_SIZE sizeof(word) - -// Macros to extract the nth byte or nth hword from a word -#define WORD_NTH_BYTE(WORD, N) (((WORD) >> ((N)*8)) & 0xff) -#define WORD_NTH_HWORD(WORD, N) (((WORD) >> ((N)*2)) & 0xFFFFFFFF) - -// Assume array contains 4 bytes. -hword convert_bytes_to_hword(byte *); -void convert_hword_to_bytes(hword, byte *); -// Assume array contains 8 bytes. -word convert_bytes_to_word(byte *); -void convert_word_to_bytes(word, byte *); - -#endif diff --git a/vm/darr.c b/vm/darr.c deleted file mode 100644 index 4393c4b..0000000 --- a/vm/darr.c +++ /dev/null @@ -1,77 +0,0 @@ -/* 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: Dynamically sized byte array - */ - -#include <assert.h> -#include <malloc.h> -#include <string.h> - -#include "./darr.h" - -void darr_init(darr_t *darr, size_t size) -{ - if (size == 0) - size = DARR_DEFAULT_SIZE; - *darr = (darr_t){ - .data = calloc(size, 1), - .used = 0, - .available = size, - }; -} - -void darr_ensure_capacity(darr_t *darr, size_t requested) -{ - if (darr->used + requested >= darr->available) - { - darr->available = - MAX(darr->used + requested, darr->available * DARR_REALLOC_MULT); - darr->data = realloc(darr->data, darr->available); - } -} - -void darr_append_byte(darr_t *darr, byte byte) -{ - darr_ensure_capacity(darr, 1); - darr->data[darr->used++] = byte; -} - -void darr_append_bytes(darr_t *darr, byte *bytes, size_t n) -{ - darr_ensure_capacity(darr, n); - memcpy(darr->data + darr->used, bytes, n); - darr->used += n; -} - -byte darr_at(darr_t *darr, size_t index) -{ - if (index >= darr->used) - // TODO: Error (index is out of bounds) - return 0; - return darr->data[index]; -} - -void darr_write_file(darr_t *bytes, FILE *fp) -{ - size_t size = fwrite(bytes->data, bytes->used, 1, fp); - assert(size == 1); -} - -darr_t darr_read_file(FILE *fp) -{ - darr_t darr = {0}; - fseek(fp, 0, SEEK_END); - long size = ftell(fp); - darr_init(&darr, size); - fseek(fp, 0, SEEK_SET); - size_t read = fread(darr.data, size, 1, fp); - assert(read == 1); - return darr; -} diff --git a/vm/darr.h b/vm/darr.h deleted file mode 100644 index 1d5820b..0000000 --- a/vm/darr.h +++ /dev/null @@ -1,39 +0,0 @@ -/* 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: Dynamically sized byte array - */ - -#ifndef DARR_H -#define DARR_H - -#include <stdio.h> -#include <stdlib.h> - -#include "./base.h" - -typedef struct -{ - byte *data; - size_t used, available; -} darr_t; - -#define DARR_DEFAULT_SIZE 8 -#define DARR_REALLOC_MULT 1.5 - -void darr_init(darr_t *, size_t); -void darr_ensure_capacity(darr_t *, size_t); -void darr_append_byte(darr_t *, byte); -void darr_append_bytes(darr_t *, byte *, size_t); -byte darr_at(darr_t *, size_t); - -void darr_write_file(darr_t *, FILE *); -darr_t darr_read_file(FILE *); - -#endif diff --git a/vm/fib.c b/vm/fib.c deleted file mode 100644 index 7107c3e..0000000 --- a/vm/fib.c +++ /dev/null @@ -1,79 +0,0 @@ -/* 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-23 - * Author: Aryadev Chavali - * Description: An example virtual machine program which computes and - * prints fibonacci numbers. Note that by default the virtual machine - * just rolls overflows over, so this program will never terminate. - */ - -#include <assert.h> -#include <stdio.h> -#include <string.h> - -#include "./inst.h" -#include "./runtime.h" - -int main(void) -{ - inst_t instructions[] = { - // MOV the values 1 and 1 to REG[0] and REG[1] respectively - INST_PUSH(WORD, 1), - INST_MOV(WORD, 0), - INST_PUSH(WORD, 1), - INST_MOV(WORD, 1), - - // Print value at register 0 with newline. - INST_PUSH_REG(WORD, 0), // <-- # - INST_PRINT(WORD), - INST_PUSH(BYTE, '\n'), - INST_PRINT(CHAR), - - // Print value at register 1 with newline - INST_PUSH_REG(WORD, 1), - INST_PRINT(WORD), - INST_PUSH(BYTE, '\n'), - INST_PRINT(CHAR), - - /* Compute the next pair of fibonacci numbers */ - // REG[0] + REG[1] - INST_PUSH_REG(WORD, 0), - INST_PUSH_REG(WORD, 1), - INST_PLUS(WORD), - - // Mov REG[0] + REG[1] to REG[0] - INST_MOV(WORD, 0), - - // REG[0] + REG[1] - INST_PUSH_REG(WORD, 0), - INST_PUSH_REG(WORD, 1), - INST_PLUS(WORD), - - // Mov REG[0] + REG[1] to REG[1] - INST_MOV(WORD, 1), - - // Jump to the point # - INST_JUMP_ABS(4), - INST_HALT, - }; - - byte stack[256]; - vm_t vm = {0}; - vm_load_stack(&vm, stack, ARR_SIZE(stack)); - vm_load_program(&vm, instructions, ARR_SIZE(instructions)); - err_t err = vm_execute_all(&vm); - - if (err) - { - const char *error_str = err_as_cstr(err); - fprintf(stderr, "[ERROR]: %s\n", error_str); - fprintf(stderr, "[ERROR]: VM Trace:\n"); - vm_print_all(&vm, stderr); - return 255 - err; - } - return 0; -} @@ -16,8 +16,8 @@ #include <stdio.h> #include <stdlib.h> -#include "./base.h" -#include "./darr.h" +#include "../lib/base.h" +#include "../lib/darr.h" typedef enum { diff --git a/vm/runtime.h b/vm/runtime.h index 83ffa17..03cd21f 100644 --- a/vm/runtime.h +++ b/vm/runtime.h @@ -16,7 +16,7 @@ #include <stdio.h> #include <stdlib.h> -#include "./base.h" +#include "../lib/base.h" #include "./inst.h" typedef enum |