From 4bf29638ca03b641015be0c5c99c7da34e454d20 Mon Sep 17 00:00:00 2001 From: Daniele Verducci Date: Thu, 30 Jan 2025 08:05:06 +0100 Subject: [PATCH] Emulator: load ROM into memory --- pat80-emulator/main.c | 50 ++++++++++++++++++++++++++++++++----------- 1 file changed, 37 insertions(+), 13 deletions(-) diff --git a/pat80-emulator/main.c b/pat80-emulator/main.c index 2674b04..828651c 100644 --- a/pat80-emulator/main.c +++ b/pat80-emulator/main.c @@ -1,12 +1,14 @@ #include /* Z_NULL */ #include #include +#include +#include #define CYCLES_PER_FRAME 69888 #define CYCLES_AT_INT 24 #define CYCLES_PER_INT 32 #define ROM_SIZE 0x8000 /* 32 KiB */ -#define MEMORY_SIZE 0x8000 /* 32 KiB */ +#define MEMORY_SIZE 0xFFFF /* 64 KiB */ typedef struct { void* context; @@ -108,29 +110,50 @@ void machine_reset(Machine *self) z80_instant_reset(&self->cpu); } +void machine_run(Machine *self) { + z80_run(&self->cpu, Z80_MAXIMUM_CYCLES); +} -void machine_run_frame(Machine *self) - { - /* CPU cycles before the INT signal */ - self->cycles += z80_execute(&self->cpu, CYCLES_AT_INT - self->cycles); - /* CPU cycles during the INT signal */ - z80_int(&self->cpu, Z_TRUE); - self->cycles += z80_run(&self->cpu, (CYCLES_AT_INT + CYCLES_PER_INT) - self->cycles); - z80_int(&self->cpu, Z_FALSE); +// void machine_run_frame(Machine *self) +// { +// /* CPU cycles before the INT signal */ +// self->cycles += z80_execute(&self->cpu, CYCLES_AT_INT - self->cycles); - /* CPU cycles after the INT signal */ - self->cycles += z80_execute(&self->cpu, CYCLES_PER_FRAME - self->cycles); +// /* CPU cycles during the INT signal */ +// z80_int(&self->cpu, Z_TRUE); +// self->cycles += z80_run(&self->cpu, (CYCLES_AT_INT + CYCLES_PER_INT) - self->cycles); +// z80_int(&self->cpu, Z_FALSE); - self->cycles -= CYCLES_PER_FRAME; +// /* CPU cycles after the INT signal */ +// self->cycles += z80_execute(&self->cpu, CYCLES_PER_FRAME - self->cycles); + +// self->cycles -= CYCLES_PER_FRAME; +// } + +int main(int argc, char *argv[]) { + // Parse arguments + if (argc < 2) { + printf("Usage: %s [romFile]\n", argv[0]); + exit(0); } + char* romFilePath = argv[1]; -int main() { // Setup virtual Pat80 computer Z80 pat80Cpu = {}; Device pat80Devices[] = {}; zuint8 pat80Memory[65536] = {0}; + // Load ROM into memory + FILE *romFile; + romFile = fopen(romFilePath,"rb"); + if (romFile == NULL) { + printf("Unable to open rom file at %s", romFilePath); + exit(1); + } + fread(pat80Memory,ROM_SIZE,1,romFile); // load rom from file into memory, up to ROM_SIZE + fclose(romFile); + Machine pat80 = { /*zusize*/ .cycles = 0, /*zuint8*/ .memory = *pat80Memory, @@ -142,4 +165,5 @@ int main() { machine_initialize(&pat80); machine_power(&pat80, Z_TRUE); machine_reset(&pat80); + machine_run(&pat80); } \ No newline at end of file