From 88e36ebd13b7fe6b02ce04789dc9dedadbb45fa6 Mon Sep 17 00:00:00 2001 From: Ben Kurtovic Date: Wed, 25 Mar 2015 01:03:33 -0400 Subject: [PATCH] Add IOManager, which manages emulation rather than the GG itself. --- crater.c | 3 ++- src/gamegear.c | 20 +++++++++++++++----- src/gamegear.h | 5 ++++- src/iomanager.c | 21 +++++++++++++++++++++ src/iomanager.h | 10 ++++++++++ 5 files changed, 52 insertions(+), 7 deletions(-) create mode 100644 src/iomanager.c create mode 100644 src/iomanager.h diff --git a/crater.c b/crater.c index 95e3334..2783c86 100644 --- a/crater.c +++ b/crater.c @@ -8,6 +8,7 @@ #include "src/config.h" #include "src/disassembler.h" #include "src/gamegear.h" +#include "src/iomanager.h" #include "src/logging.h" #include "src/rom.h" @@ -48,7 +49,7 @@ int main(int argc, char *argv[]) printf("crater: emulating: %s\n", rom->name); gamegear_load(gg, rom); - gamegear_power(gg); + iomanager_emulate(gg); gamegear_destroy(gg); rom_close(rom); diff --git a/src/gamegear.c b/src/gamegear.c index e484967..a587015 100644 --- a/src/gamegear.c +++ b/src/gamegear.c @@ -1,6 +1,8 @@ /* Copyright (C) 2014-2015 Ben Kurtovic Released under the terms of the MIT License. See LICENSE for details. */ +#include + #include "gamegear.h" #include "logging.h" @@ -24,7 +26,7 @@ GameGear* gamegear_create() Does *not* destroy any loaded ROM objects. */ -void gamegear_destroy(GameGear* gg) +void gamegear_destroy(GameGear *gg) { free(gg); } @@ -34,17 +36,25 @@ void gamegear_destroy(GameGear* gg) Does *not* steal the reference to the ROM object. */ -void gamegear_load(GameGear* gg, ROM* rom) +void gamegear_load(GameGear *gg, ROM *rom) { gg->rom = rom; } /* - Powers a GameGear object, beginning emulation. + Set the GameGear object's power state (true = on; false = off). + + Powering on the GameGear executes boot code (e.g. clearing memory and + setting initial register values) and starts the clock. Powering it off + stops the clock. - This function call blocks until the GameGear is powered off. + Setting the power state to its current value has no effect. */ -void gamegear_power(GameGear* gg) +void gamegear_power(GameGear *gg, bool state) { + if (gg->state == state) + return; + // TODO + gg->state = state; } diff --git a/src/gamegear.h b/src/gamegear.h index 056e274..3e5be71 100644 --- a/src/gamegear.h +++ b/src/gamegear.h @@ -3,12 +3,15 @@ #pragma once +#include + #include "rom.h" /* Structs */ typedef struct { ROM *rom; + bool state; } GameGear; /* Functions */ @@ -16,4 +19,4 @@ typedef struct { GameGear* gamegear_create(); void gamegear_destroy(GameGear*); void gamegear_load(GameGear*, ROM*); -void gamegear_power(GameGear*); +void gamegear_power(GameGear*, bool); diff --git a/src/iomanager.c b/src/iomanager.c new file mode 100644 index 0000000..88e68a7 --- /dev/null +++ b/src/iomanager.c @@ -0,0 +1,21 @@ +/* Copyright (C) 2014-2015 Ben Kurtovic + Released under the terms of the MIT License. See LICENSE for details. */ + +#include "iomanager.h" +#include "logging.h" + +/* + Emulate a Game Gear. Handle I/O with the host computer. + + Block until emulation is finished. +*/ +void iomanager_emulate(GameGear *gg) +{ + DEBUG("IOManager powering GameGear") + gamegear_power(gg, true); + + // TODO + + DEBUG("IOManager unpowering GameGear") + gamegear_power(gg, false); +} diff --git a/src/iomanager.h b/src/iomanager.h new file mode 100644 index 0000000..cd71556 --- /dev/null +++ b/src/iomanager.h @@ -0,0 +1,10 @@ +/* Copyright (C) 2014-2015 Ben Kurtovic + Released under the terms of the MIT License. See LICENSE for details. */ + +#pragma once + +#include "gamegear.h" + +/* Functions */ + +void iomanager_emulate(GameGear*);