From e1591e9810c3696879c2bd39b7a8af700ff3b13d Mon Sep 17 00:00:00 2001 From: SpookyDervish Date: Thu, 16 Jul 2026 12:04:17 +1000 Subject: [PATCH] add file loading --- meson.build | 8 ++------ src/emu.c | 4 +++- src/main.c | 17 +++++++++-------- src/util.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ src/util.h | 20 ++++++++++++++++++++ 5 files changed, 79 insertions(+), 15 deletions(-) create mode 100644 src/util.c create mode 100644 src/util.h diff --git a/meson.build b/meson.build index 91b511b..c5cfb5d 100644 --- a/meson.build +++ b/meson.build @@ -4,14 +4,10 @@ sources = [ 'src/main.c', 'src/emu.c', 'src/memory.c', - 'src/instruction.c' + 'src/instruction.c', + 'src/util.c' ] args = ['-Wall', '-Wextra', '-O3'] -if get_option('buildtype') == 'debug' - args = ['-Wall', '-Wextra', '-O3', '-ggdb', '-fsanitize=address'] - add_project_arguments('-fsanitize=address', language : 'c') - add_project_link_arguments('-fsanitize=address', language : 'c') -endif executable('emu', sources, c_args: args) \ No newline at end of file diff --git a/src/emu.c b/src/emu.c index 64ca695..8560b59 100644 --- a/src/emu.c +++ b/src/emu.c @@ -1,7 +1,9 @@ #include "emu.h" inline Instruction fetchInst(Emulator* emu) { - return decodeInstruction(emu->mem, &emu->pc); + Instruction inst = decodeInstruction(emu->mem, &emu->pc); + printf("%s\n", instructionToCStr(inst)); + return inst; } inline void updateFlagsRegister(Emulator* emu, int32_t value) { diff --git a/src/main.c b/src/main.c index 7c0379a..61c27b1 100644 --- a/src/main.c +++ b/src/main.c @@ -1,5 +1,6 @@ #include #include "emu.h" +#include "util.h" int main() { Emulator* emu = initEmulator(0x00010FFF); @@ -8,19 +9,19 @@ int main() { return 1; } - Instruction program[] = { + RomFile* romFile = readProgramFromFile("../test.bin"); + + /*Instruction program[] = { {INST_MVI, {REG_A, 0, 0}, 5, true}, {INST_MVI, {REG_B, 0, 0}, 3, true}, {INST_ADD, {REG_A, REG_B, 0}, 0, false}, {INST_HLT, {}, 0, false} - }; - memoryLoadProgram(emu->mem, program, sizeof(program)/sizeof(program[0])); - - printf("%s\n", instructionToCStr(decodeInstruction(emu->mem, &emu->pc))); - printf("%s\n", instructionToCStr(decodeInstruction(emu->mem, &emu->pc))); - printf("%s\n", instructionToCStr(decodeInstruction(emu->mem, &emu->pc))); - printf("%s\n", instructionToCStr(decodeInstruction(emu->mem, &emu->pc))); + };*/ + printf("%d\n", romFile->header.numInstructions); + memoryLoadProgram(emu->mem, romFile->instructions, romFile->header.numInstructions); + + //startEmulator(emu); freeEmulator(emu); return 0; diff --git a/src/util.c b/src/util.c new file mode 100644 index 0000000..1243288 --- /dev/null +++ b/src/util.c @@ -0,0 +1,45 @@ +#include "util.h" + +RomFile* readProgramFromFile(char* path) { + FILE* f = fopen(path, "rb"); + if (!f) { + perror("failed to open file"); + return NULL; + } + + fseek(f, 0, SEEK_END); + long length = ftell(f); + rewind(f); + + char* buffer = malloc(length); + if (!buffer) { + fclose(f); + return NULL; + } + + fread(buffer, length, 1, f); + fclose(f); + + ROMFileHeader* header = (ROMFileHeader*)buffer; + Instruction* instructions = calloc(header->numInstructions, sizeof(SerializedInst)); + if (!instructions) { + free(buffer); + return NULL; + } + + RomFile* romFile = malloc(sizeof(RomFile)); + if (!romFile) { + free(buffer); + free(instructions); + return NULL; + } + + romFile->header = *header; + romFile->instructions = instructions; + + char* cursor = buffer + sizeof(ROMFileHeader); + + memcpy(instructions, cursor, sizeof(SerializedInst) * header->numInstructions); + + return romFile; +} \ No newline at end of file diff --git a/src/util.h b/src/util.h new file mode 100644 index 0000000..76c4d32 --- /dev/null +++ b/src/util.h @@ -0,0 +1,20 @@ +#pragma once + +#include "instruction.h" +#include +#include + +// -- TYPES -- // +typedef struct { + char magic[4]; + uint8_t version; + uint32_t numInstructions; +} ROMFileHeader; + +typedef struct { + ROMFileHeader header; + Instruction* instructions; +} RomFile; + +// -- FUNCTIONS -- // +RomFile* readProgramFromFile(char* path); \ No newline at end of file