Add macro for size of a word

Smaller number of changes necessary to change types.
This commit is contained in:
2023-10-15 05:03:09 +01:00
parent cfc9edebba
commit 54b836ba64

View File

@@ -24,6 +24,17 @@ typedef double f64;
typedef uint8_t byte; typedef uint8_t byte;
typedef u64 word; typedef u64 word;
#define WORD_SIZE sizeof(word)
typedef union
{
byte as_byte;
word as_word;
} data_t;
#define DBYTE(BYTE) ((data_t){.as_byte = (BYTE)})
#define DWORD(WORD) ((data_t){.as_word = (WORD)})
#define VM_STACK_MAX 1024 #define VM_STACK_MAX 1024
typedef struct typedef struct
@@ -35,15 +46,6 @@ typedef struct
} stack; } stack;
} vm_t; } vm_t;
typedef union
{
byte as_byte;
word as_word;
} data_t;
#define DBYTE(BYTE) ((data_t){.as_byte = (BYTE)})
#define DWORD(WORD) ((data_t){.as_word = (WORD)})
void vm_push_byte(vm_t *vm, data_t b) void vm_push_byte(vm_t *vm, data_t b)
{ {
if (vm->stack.pointer >= VM_STACK_MAX) if (vm->stack.pointer >= VM_STACK_MAX)
@@ -55,11 +57,11 @@ void vm_push_byte(vm_t *vm, data_t b)
void vm_push_word(vm_t *vm, data_t w) void vm_push_word(vm_t *vm, data_t w)
{ {
// NOTE: Relies on sizeof measuring in bytes // NOTE: Relies on sizeof measuring in bytes
if (vm->stack.pointer + sizeof(w) >= VM_STACK_MAX) if (vm->stack.pointer + WORD_SIZE >= VM_STACK_MAX)
// TODO: Error STACK_OVERFLOW // TODO: Error STACK_OVERFLOW
return; return;
memcpy(vm->stack.data + vm->stack.pointer, &w.as_word, sizeof(w.as_word)); memcpy(vm->stack.data + vm->stack.pointer, &w.as_word, WORD_SIZE);
vm->stack.pointer += sizeof(w.as_word); vm->stack.pointer += WORD_SIZE;
} }
byte vm_pop_byte(vm_t *vm) byte vm_pop_byte(vm_t *vm)
@@ -72,12 +74,12 @@ byte vm_pop_byte(vm_t *vm)
word vm_pop_word(vm_t *vm) word vm_pop_word(vm_t *vm)
{ {
if (vm->stack.pointer < sizeof(word)) if (vm->stack.pointer < WORD_SIZE)
// TODO: Error STACK_UNDERFLOW // TODO: Error STACK_UNDERFLOW
return 0; return 0;
word w = 0; word w = 0;
memcpy(&w, vm->stack.data + vm->stack.pointer - sizeof(w), sizeof(w)); memcpy(&w, vm->stack.data + vm->stack.pointer - WORD_SIZE, WORD_SIZE);
vm->stack.pointer -= sizeof(w); vm->stack.pointer -= WORD_SIZE;
return w; return w;
} }