add file loading

This commit is contained in:
2026-07-16 12:04:17 +10:00
parent f84525fa3a
commit e1591e9810
5 changed files with 79 additions and 15 deletions

View File

@@ -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)

View File

@@ -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) {

View File

@@ -1,5 +1,6 @@
#include <stdio.h>
#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;

45
src/util.c Normal file
View File

@@ -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;
}

20
src/util.h Normal file
View File

@@ -0,0 +1,20 @@
#pragma once
#include "instruction.h"
#include <stdio.h>
#include <string.h>
// -- 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);