diff --git a/bizhawk-make-install.sh b/bizhawk-make-install.sh new file mode 100755 index 00000000000..3638bc91f19 --- /dev/null +++ b/bizhawk-make-install.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +BASEDIR=$(dirname $0) +if [ "$(uname -s)" = "Linux" ]; then + cd "$BASEDIR/src/platform/bizhawk/linux" +else + cd "$BASEDIR/src/platform/bizhawk/mingw" +fi +make clean +make -j4 +make install diff --git a/cinema/gb/mooneye-gb/misc/boot_hwio-C/xbaseline_0000.png b/cinema/gb/mooneye-gb/misc/boot_hwio-C/xbaseline_0000.png new file mode 100644 index 00000000000..cb37cb619c5 Binary files /dev/null and b/cinema/gb/mooneye-gb/misc/boot_hwio-C/xbaseline_0000.png differ diff --git a/src/platform/bizhawk/.gitignore b/src/platform/bizhawk/.gitignore new file mode 100644 index 00000000000..2179e3a19e0 --- /dev/null +++ b/src/platform/bizhawk/.gitignore @@ -0,0 +1,2 @@ +codeblocks/* +mingw/obj/* \ No newline at end of file diff --git a/src/platform/bizhawk/base.mak b/src/platform/bizhawk/base.mak new file mode 100644 index 00000000000..8d3a201cb24 --- /dev/null +++ b/src/platform/bizhawk/base.mak @@ -0,0 +1,131 @@ +CCFLAGS = \ + -O3 -fomit-frame-pointer -fexpensive-optimizations -flto \ + -I../../../../include -I../../.. -std=gnu11 \ + -Wall -Wno-stringop-overflow -Wno-lto-type-mismatch \ + -Wno-ignored-optimization-argument -Wno-unknown-warning-option \ + -DMINIMAL_CORE=2 -DDISABLE_THREADING -DM_CORE_GBA \ + -DCOLOR_16_BIT -DMGBA_STANDALONE -DENABLE_DEBUGGERS \ + $(PLAT_FLAGS) + +DEST_64 = ../../../../../../Assets/dll +DESTCOPY_64 = ../../../../../../output/dll + +SRCS = \ + $(ROOT_DIR)/core/bitmap-cache.c \ + $(ROOT_DIR)/core/cache-set.c \ + $(ROOT_DIR)/core/cheats.c \ + $(ROOT_DIR)/core/config.c \ + $(ROOT_DIR)/core/core.c \ + $(ROOT_DIR)/core/directories.c \ + $(ROOT_DIR)/core/input.c \ + $(ROOT_DIR)/core/interface.c \ + $(ROOT_DIR)/core/library.c \ + $(ROOT_DIR)/core/lockstep.c \ + $(ROOT_DIR)/core/log.c \ + $(ROOT_DIR)/core/map-cache.c \ + $(ROOT_DIR)/core/mem-search.c \ + $(ROOT_DIR)/core/rewind.c \ + $(ROOT_DIR)/core/serialize.c \ + $(ROOT_DIR)/core/sync.c \ + $(ROOT_DIR)/core/thread.c \ + $(ROOT_DIR)/core/tile-cache.c \ + $(ROOT_DIR)/core/timing.c \ + $(ROOT_DIR)/arm/arm.c \ + $(ROOT_DIR)/arm/decoder-arm.c \ + $(ROOT_DIR)/arm/decoder-thumb.c \ + $(ROOT_DIR)/arm/decoder.c \ + $(ROOT_DIR)/arm/isa-arm.c \ + $(ROOT_DIR)/arm/isa-thumb.c \ + $(ROOT_DIR)/arm/debugger/cli-debugger.c \ + $(ROOT_DIR)/arm/debugger/memory-debugger.c \ + $(ROOT_DIR)/arm/debugger/debugger.c \ + $(ROOT_DIR)/gb/audio.c \ + $(ROOT_DIR)/gba/audio.c \ + $(ROOT_DIR)/gba/bios.c \ + $(ROOT_DIR)/gba/cheats.c \ + $(ROOT_DIR)/gba/core.c \ + $(ROOT_DIR)/gba/dma.c \ + $(ROOT_DIR)/gba/gba.c \ + $(ROOT_DIR)/gba/hle-bios.c \ + $(ROOT_DIR)/gba/input.c \ + $(ROOT_DIR)/gba/io.c \ + $(ROOT_DIR)/gba/memory.c \ + $(ROOT_DIR)/gba/overrides.c \ + $(ROOT_DIR)/gba/savedata.c \ + $(ROOT_DIR)/gba/serialize.c \ + $(ROOT_DIR)/gba/sharkport.c \ + $(ROOT_DIR)/gba/sio.c \ + $(ROOT_DIR)/gba/timer.c \ + $(ROOT_DIR)/gba/video.c \ + $(ROOT_DIR)/gba/cart/ereader.c \ + $(ROOT_DIR)/gba/cart/gpio.c \ + $(ROOT_DIR)/gba/cart/matrix.c \ + $(ROOT_DIR)/gba/cart/vfame.c \ + $(ROOT_DIR)/gba/cheats/codebreaker.c \ + $(ROOT_DIR)/gba/cheats/gameshark.c \ + $(ROOT_DIR)/gba/cheats/parv3.c \ + $(ROOT_DIR)/gba/debugger/cli.c \ + $(ROOT_DIR)/gba/renderers/cache-set.c \ + $(ROOT_DIR)/gba/renderers/common.c \ + $(ROOT_DIR)/gba/renderers/software-bg.c \ + $(ROOT_DIR)/gba/renderers/software-mode0.c \ + $(ROOT_DIR)/gba/renderers/software-obj.c \ + $(ROOT_DIR)/gba/renderers/video-software.c \ + $(ROOT_DIR)/gba/sio/gbp.c \ + $(ROOT_DIR)/gba/sio/joybus.c \ + $(ROOT_DIR)/gba/sio/lockstep.c \ + $(ROOT_DIR)/debugger/debugger.c \ + $(ROOT_DIR)/debugger/stack-trace.c \ + $(ROOT_DIR)/debugger/cli-debugger.c \ + $(ROOT_DIR)/debugger/symbols.c \ + $(ROOT_DIR)/debugger/parser.c \ + $(ROOT_DIR)/third-party/blip_buf/blip_buf.c \ + $(ROOT_DIR)/third-party/inih/ini.c \ + $(ROOT_DIR)/util/circle-buffer.c \ + $(ROOT_DIR)/util/configuration.c \ + $(ROOT_DIR)/util/crc32.c \ + $(ROOT_DIR)/util/elf-read.c \ + $(ROOT_DIR)/util/formatting.c \ + $(ROOT_DIR)/util/gbk-table.c \ + $(ROOT_DIR)/util/gui.c \ + $(ROOT_DIR)/util/hash.c \ + $(ROOT_DIR)/util/image/png-io.c \ + $(ROOT_DIR)/util/patch-fast.c \ + $(ROOT_DIR)/util/patch-ips.c \ + $(ROOT_DIR)/util/patch-ups.c \ + $(ROOT_DIR)/util/patch.c \ + $(ROOT_DIR)/util/ring-fifo.c \ + $(ROOT_DIR)/util/string.c \ + $(ROOT_DIR)/util/table.c \ + $(ROOT_DIR)/util/text-codec.c \ + $(ROOT_DIR)/util/vector.c \ + $(ROOT_DIR)/util/vfs.c \ + $(ROOT_DIR)/util/vfs/vfs-mem.c \ + $(ROOT_DIR)/platform/bizhawk/bizinterface.c \ + $(ROOT_DIR)/platform/bizhawk/localtime_r.c \ + $(PLAT_SRCS) + +_OBJS:=$(SRCS:.c=.o) +OBJS:=$(patsubst $(ROOT_DIR)%,$(OBJ_DIR)%,$(_OBJS)) + +all: $(TARGET) + +$(OBJ_DIR)/%.o: $(ROOT_DIR)/%.c + @mkdir -p $(@D) + @$(CC) -c -o $@ $< $(CCFLAGS) + +$(TARGET): $(OBJS) + @$(CC) -o $@ $(OBJS) $(LDFLAGS) + +clean: + @$(RM) -rf $(OBJ_DIR) + @$(RM) -f $(TARGET) + +install: $(TARGET) + $(CP) $(TARGET) $(DEST_$(ARCH)) +ifneq ("$(wildcard $(DESTCOPY_$(ARCH)))", "") + $(CP) $(TARGET) $(DESTCOPY_$(ARCH)) +endif + +print-%: + @echo $* = $($*) diff --git a/src/platform/bizhawk/bizinterface.c b/src/platform/bizhawk/bizinterface.c new file mode 100644 index 00000000000..933f277c7ae --- /dev/null +++ b/src/platform/bizhawk/bizinterface.c @@ -0,0 +1,623 @@ +#include +#include +#include "mgba/core/core.h" +#include "mgba/core/log.h" +#include "mgba/core/timing.h" +#include "mgba/core/serialize.h" +#include "mgba/core/blip_buf.h" +#include "mgba/gba/core.h" +#include "mgba/gba/interface.h" +#include "mgba/internal/gba/gba.h" +#include "mgba/internal/gba/video.h" +#include "mgba/internal/gba/overrides.h" +#include "mgba/internal/arm/isa-inlines.h" +#include "mgba/debugger/debugger.h" +#include "mgba-util/common.h" +#include "mgba-util/vfs.h" + +// interop sanity checks +static_assert(sizeof(bool) == 1, "Wrong bool size!"); +static_assert(sizeof(color_t) == 2, "Wrong color_t size!"); +static_assert(sizeof(enum mWatchpointType) == 4, "Wrong mWatchpointType size!"); +static_assert(sizeof(enum GBASavedataType) == 4, "Wrong GBASavedataType size!"); +static_assert(sizeof(enum GBAHardwareDevice) == 4, "Wrong GBAHardwareDevice size!"); +static_assert(sizeof(ssize_t) == 8, "Wrong ssize_t size!"); +static_assert(sizeof(void*) == 8, "Wrong pointer size!"); + +const char* const binaryName = "mgba"; +const char* const projectName = "mGBA BizHawk"; +const char* const projectVersion = "(unknown)"; + +#ifdef _WIN32 +#define EXP __declspec(dllexport) +#else +#define EXP __attribute__((visibility("default"))) +#endif + +/** + * container_of - cast a member of a structure out to the containing structure + * @ptr: the pointer to the member. + * @type: the type of the container struct this is embedded in. + * @member: the name of the member within the struct. + * + */ +#define container_of(ptr, type, member) ({ \ + const typeof( ((type *)0)->member ) *__mptr = (ptr); \ + (type *)( (char *)__mptr - offsetof(type,member) );}) +struct VFile* VFileOpenFD(const char* path, int flags) { return NULL; } + +typedef struct +{ + struct mCore* core; + struct mLogger logger; + struct GBA* gba; // anything that uses this will be deprecated eventually + color_t vbuff[GBA_VIDEO_HORIZONTAL_PIXELS * GBA_VIDEO_VERTICAL_PIXELS]; + void* rom; + struct VFile* romvf; + uint8_t bios[0x4000]; + struct VFile* biosvf; + uint8_t sram[0x20000 + 16]; + struct VFile* sramvf; + struct mKeyCallback keysource; + struct mRotationSource rotsource; + struct mRTCSource rtcsource; + struct GBALuminanceSource lumasource; + struct mDebugger debugger; + struct mDebuggerModule module; + bool attached; + struct GBACartridgeOverride override; + int16_t tiltx; + int16_t tilty; + int16_t tiltz; + int64_t time; + uint8_t light; + uint16_t keys; + bool lagged; + bool skipbios; + uint32_t palette[0x10000]; + void (*input_callback)(void); + void (*trace_callback)(const char *buffer); + void (*exec_callback)(uint32_t pc); + void (*mem_callback)(uint32_t addr, enum mWatchpointType type, uint32_t oldValue, uint32_t newValue); +} bizctx; + +static int32_t GetX(struct mRotationSource* rotationSource) +{ + return container_of(rotationSource, bizctx, rotsource)->tiltx << 16; +} +static int32_t GetY(struct mRotationSource* rotationSource) +{ + return container_of(rotationSource, bizctx, rotsource)->tilty << 16; +} +static int32_t GetZ(struct mRotationSource* rotationSource) +{ + return container_of(rotationSource, bizctx, rotsource)->tiltz << 16; +} +static uint8_t GetLight(struct GBALuminanceSource* luminanceSource) +{ + return container_of(luminanceSource, bizctx, lumasource)->light; +} +static time_t GetTime(struct mRTCSource* rtcSource) +{ + return container_of(rtcSource, bizctx, rtcsource)->time; +} +static uint16_t GetKeys(struct mKeyCallback* keypadSource) +{ + bizctx *ctx = container_of(keypadSource, bizctx, keysource); + ctx->input_callback(); + ctx->lagged = false; + return ctx->keys; +} +static void RotationCB(struct mRotationSource* rotationSource) +{ + bizctx* ctx = container_of(rotationSource, bizctx, rotsource); + ctx->input_callback(); + ctx->lagged = false; +} +static void LightCB(struct GBALuminanceSource* luminanceSource) +{ + bizctx* ctx = container_of(luminanceSource, bizctx, lumasource); + ctx->input_callback(); + ctx->lagged = false; +} +static void TimeCB(struct mRTCSource* rtcSource) +{ + // no, reading the rtc registers should not unset the lagged flag + // bizctx* ctx = container_of(rtcSource, bizctx, rtcsource); + // ctx->lagged = false; +} +static void logdebug(struct mLogger* logger, int category, enum mLogLevel level, const char* format, va_list args) +{ + +} + +static void resetinternal(bizctx* ctx) +{ + // RTC will be reinit on GBAOverrideApply + // The RTC data contents in the sramvf are also read back + // This is done so RTC data is up to date + // note reset internally calls GBAOverrideApply potentially, so we do this now + GBASavedataRTCWrite(&ctx->gba->memory.savedata); + + ctx->core->reset(ctx->core); + if (ctx->skipbios) + GBASkipBIOS(ctx->gba); + + if (ctx->gba->memory.rom) + { + GBASavedataRTCWrite(&ctx->gba->memory.savedata); // again to be safe (not sure if needed?) + GBAOverrideApply(ctx->gba, &ctx->override); + } +} + +EXP void BizDestroy(bizctx* ctx) +{ + if (ctx->attached) + { + ctx->core->detachDebugger(ctx->core); + mDebuggerDetachModule(&ctx->debugger, &ctx->module); + mDebuggerDeinit(&ctx->debugger); + } + + ctx->core->deinit(ctx->core); + free(ctx->rom); + free(ctx); +} + +typedef struct +{ + enum GBASavedataType savetype; + enum GBAHardwareDevice hardware; + uint32_t idleLoop; + bool vbaBugCompat; + bool detectPokemonRomHacks; +} overrideinfo; + +void exec_hook(struct mDebuggerModule* module) +{ + bizctx* ctx = container_of(module, bizctx, module); + if (ctx->trace_callback) + { + char trace[1024]; + trace[sizeof(trace) - 1] = '\0'; + size_t traceSize = sizeof(trace) - 2; + ctx->debugger.platform->trace(ctx->debugger.platform, trace, &traceSize); + if (traceSize + 1 <= sizeof(trace)) { + trace[traceSize] = '\n'; + trace[traceSize + 1] = '\0'; + } + ctx->trace_callback(trace); + } + if (ctx->exec_callback) + ctx->exec_callback(_ARMPCAddress(ctx->core->cpu)); +} + +EXP void BizSetInputCallback(bizctx* ctx, void(*callback)(void)) +{ + ctx->input_callback = callback; +} + +EXP void BizSetTraceCallback(bizctx* ctx, void(*callback)(const char *buffer)) +{ + ctx->trace_callback = callback; +} + +EXP void BizSetExecCallback(bizctx* ctx, void(*callback)(uint32_t pc)) +{ + ctx->exec_callback = callback; +} + +EXP void BizSetMemCallback(bizctx* ctx, void(*callback)(uint32_t addr, enum mWatchpointType type, uint32_t oldValue, uint32_t newValue)) +{ + ctx->mem_callback = callback; +} + +static void watchpoint_entry(struct mDebuggerModule* module, enum mDebuggerEntryReason reason, struct mDebuggerEntryInfo* info) +{ + bizctx* ctx = container_of(module, bizctx, module); + if (reason == DEBUGGER_ENTER_WATCHPOINT && info && ctx->mem_callback) + { + module->entered = NULL; // don't allow this callback to be re-entered + ctx->mem_callback(info->address, info->type.wp.accessType, info->type.wp.oldValue, info->type.wp.newValue); + module->entered = watchpoint_entry; + } + + module->isPaused = false; + module->needsCallback = ctx->trace_callback || ctx->exec_callback; +} + +EXP ssize_t BizSetWatchpoint(bizctx* ctx, uint32_t addr, enum mWatchpointType type) +{ + struct mWatchpoint watchpoint = { + .minAddress = addr, + .maxAddress = addr + 1, + .segment = -1, + .type = type + }; + return ctx->debugger.platform->setWatchpoint(ctx->debugger.platform, &ctx->module, &watchpoint); +} + +EXP bool BizClearWatchpoint(bizctx* ctx, ssize_t id) +{ + return ctx->debugger.platform->clearBreakpoint(ctx->debugger.platform, id); +} + +EXP bizctx* BizCreate(const void* bios, const void* data, uint32_t length, const overrideinfo* overrides, bool skipbios) +{ + bizctx* ctx = calloc(1, sizeof(*ctx)); + if (!ctx) + { + return NULL; + } + + ctx->rom = malloc(length); + if (!ctx->rom) + { + free(ctx); + return NULL; + } + + ctx->logger.log = logdebug; + mLogSetDefaultLogger(&ctx->logger); + ctx->skipbios = skipbios; + + memcpy(ctx->rom, data, length); + ctx->romvf = VFileFromMemory(ctx->rom, length); + if (!ctx->romvf) + { + free(ctx->rom); + free(ctx); + return NULL; + } + + ctx->core = GBACoreCreate(); + if (!ctx->core) + { + ctx->romvf->close(ctx->romvf); + free(ctx->rom); + free(ctx); + return NULL; + } + + mCoreInitConfig(ctx->core, NULL); + + if (!ctx->core->init(ctx->core)) + { + BizDestroy(ctx); + return NULL; + } + + ctx->gba = ctx->core->board; + + ctx->core->setVideoBuffer(ctx->core, ctx->vbuff, GBA_VIDEO_HORIZONTAL_PIXELS); + ctx->core->setAudioBufferSize(ctx->core, 1024); + + blip_set_rates(ctx->core->getAudioChannel(ctx->core, 0), ctx->core->frequency(ctx->core), 44100); + blip_set_rates(ctx->core->getAudioChannel(ctx->core, 1), ctx->core->frequency(ctx->core), 44100); + + if (!ctx->core->loadROM(ctx->core, ctx->romvf)) + { + BizDestroy(ctx); + return NULL; + } + + memset(ctx->sram, 0xff, sizeof(ctx->sram)); + ctx->sramvf = VFileFromMemory(ctx->sram, sizeof(ctx->sram)); + if (!ctx->sramvf) + { + BizDestroy(ctx); + return NULL; + } + + ctx->core->loadSave(ctx->core, ctx->sramvf); + + mCoreSetRTC(ctx->core, &ctx->rtcsource); + + ctx->gba->idleOptimization = IDLE_LOOP_IGNORE; // Don't do "idle skipping" + ctx->gba->keyCallback = &ctx->keysource; // Callback for key reading + + ctx->keysource.readKeys = GetKeys; + ctx->rotsource.sample = RotationCB; + ctx->rotsource.readTiltX = GetX; + ctx->rotsource.readTiltY = GetY; + ctx->rotsource.readGyroZ = GetZ; + ctx->lumasource.sample = LightCB; + ctx->lumasource.readLuminance = GetLight; + ctx->rtcsource.sample = TimeCB; + ctx->rtcsource.unixTime = GetTime; + + ctx->core->setPeripheral(ctx->core, mPERIPH_ROTATION, &ctx->rotsource); + ctx->core->setPeripheral(ctx->core, mPERIPH_GBA_LUMINANCE, &ctx->lumasource); + + if (bios) + { + memcpy(ctx->bios, bios, sizeof(ctx->bios)); + ctx->biosvf = VFileFromMemory(ctx->bios, sizeof(ctx->bios)); + /*if (!GBAIsBIOS(ctx->biosvf)) + { + ctx->biosvf->close(ctx->biosvf); + GBADestroy(&ctx->gba); + free(ctx); + return NULL; + }*/ + ctx->core->loadBIOS(ctx->core, ctx->biosvf, 0); + } + + // setup overrides (largely copy paste from GBAOverrideApplyDefaults, with minor changes for our wants) + const struct GBACartridge* cart = (const struct GBACartridge*) ctx->gba->memory.rom; + if (cart) + { + memcpy(ctx->override.id, &cart->id, sizeof(ctx->override.id)); + bool isPokemon = false, isKnownPokemon = false; + + if (overrides->detectPokemonRomHacks) + { + static const uint32_t pokemonTable[] = + { + // Emerald + 0x4881F3F8, // BPEJ + 0x8C4D3108, // BPES + 0x1F1C08FB, // BPEE + 0x34C9DF89, // BPED + 0xA3FDCCB1, // BPEF + 0xA0AEC80A, // BPEI + + // FireRed + 0x1A81EEDF, // BPRD + 0x3B2056E9, // BPRJ + 0x5DC668F6, // BPRF + 0x73A72167, // BPRI + 0x84EE4776, // BPRE rev 1 + 0x9F08064E, // BPRS + 0xBB640DF7, // BPRJ rev 1 + 0xDD88761C, // BPRE + + // Ruby + 0x61641576, // AXVE rev 1 + 0xAEAC73E6, // AXVE rev 2 + 0xF0815EE7, // AXVE + }; + + isPokemon = isPokemon || !strncmp("pokemon red version", &((const char*) ctx->gba->memory.rom)[0x108], 20); + isPokemon = isPokemon || !strncmp("pokemon emerald version", &((const char*) ctx->gba->memory.rom)[0x108], 24); + isPokemon = isPokemon || !strncmp("AXVE", &((const char*) ctx->gba->memory.rom)[0xAC], 4); + + if (isPokemon) + { + size_t i; + for (i = 0; !isKnownPokemon && i < sizeof(pokemonTable) / sizeof(*pokemonTable); ++i) + { + isKnownPokemon = ctx->gba->romCrc32 == pokemonTable[i]; + } + } + } + + if (isPokemon && !isKnownPokemon) + { + ctx->override.savetype = GBA_SAVEDATA_FLASH1M; + ctx->override.hardware = HW_RTC; + ctx->override.vbaBugCompat = true; + } + else + { + GBAOverrideFind(NULL, &ctx->override); // apply defaults + if (overrides->savetype != GBA_SAVEDATA_AUTODETECT) + { + ctx->override.savetype = overrides->savetype; + } + for (int i = 0; i < 5; i++) + { + if (!(overrides->hardware & (128 << i))) + { + if (overrides->hardware & (1 << i)) + { + ctx->override.hardware |= (1 << i); + } + else + { + ctx->override.hardware &= ~(1 << i); + } + } + } + ctx->override.hardware |= overrides->hardware & 64; // gb player detect + ctx->override.vbaBugCompat = overrides->vbaBugCompat; + } + + ctx->override.idleLoop = overrides->idleLoop; + } + + mDebuggerInit(&ctx->debugger); + ctx->module.type = DEBUGGER_CUSTOM; + ctx->module.custom = exec_hook; + ctx->module.entered = watchpoint_entry; + mDebuggerAttachModule(&ctx->debugger, &ctx->module); + mDebuggerAttach(&ctx->debugger, ctx->core); + ctx->attached = true; + + resetinternal(ctx); + + // proper init RTC, our buffer would have trashed it + if (ctx->override.hardware & HW_RTC) + { + GBAHardwareInitRTC(&ctx->gba->memory.hw); + } + + return ctx; +} + +EXP void BizReset(bizctx* ctx) +{ + resetinternal(ctx); +} + +static void blit(uint32_t* dst, const color_t* src, const uint32_t* palette) +{ + uint32_t* dst_end = dst + GBA_VIDEO_HORIZONTAL_PIXELS * GBA_VIDEO_VERTICAL_PIXELS; + + while (dst < dst_end) + { + *dst++ = palette[*src++]; + } +} + +EXP bool BizAdvance(bizctx* ctx, uint16_t keys, uint32_t* vbuff, uint32_t* nsamp, int16_t* sbuff, + int64_t time, int16_t gyrox, int16_t gyroy, int16_t gyroz, uint8_t luma) +{ + ctx->core->setKeys(ctx->core, keys); + ctx->keys = keys; + ctx->light = luma; + ctx->time = time; + ctx->tiltx = gyrox; + ctx->tilty = gyroy; + ctx->tiltz = gyroz; + ctx->lagged = true; + + ctx->module.needsCallback = ctx->trace_callback || ctx->exec_callback; + ctx->debugger.state = ctx->module.needsCallback ? DEBUGGER_CALLBACK : DEBUGGER_RUNNING; + mDebuggerRunFrame(&ctx->debugger); + + blit(vbuff, ctx->vbuff, ctx->palette); + *nsamp = blip_samples_avail(ctx->core->getAudioChannel(ctx->core, 0)); + if (*nsamp > 1024) + *nsamp = 1024; + blip_read_samples(ctx->core->getAudioChannel(ctx->core, 0), sbuff, 1024, true); + blip_read_samples(ctx->core->getAudioChannel(ctx->core, 1), sbuff + 1, 1024, true); + return ctx->lagged; +} + +EXP void BizSetPalette(bizctx* ctx, const uint32_t* palette) +{ + memcpy(ctx->palette, palette, sizeof(ctx->palette)); +} + +struct MemoryAreas +{ + const void* bios; + const void* wram; + const void* iwram; + const void* mmio; + const void* palram; + const void* vram; + const void* oam; + const void* rom; + const void* sram; +}; + +EXP void BizGetMemoryAreas(bizctx* ctx, struct MemoryAreas* dst) +{ + size_t sizeOut; + dst->bios = ctx->core->getMemoryBlock(ctx->core, GBA_REGION_BIOS, &sizeOut); + dst->wram = ctx->core->getMemoryBlock(ctx->core, GBA_REGION_EWRAM, &sizeOut); + dst->iwram = ctx->core->getMemoryBlock(ctx->core, GBA_REGION_IWRAM, &sizeOut); + dst->mmio = ctx->gba->memory.io; + dst->palram = ctx->core->getMemoryBlock(ctx->core, GBA_REGION_PALETTE_RAM, &sizeOut); + dst->vram = ctx->core->getMemoryBlock(ctx->core, GBA_REGION_VRAM, &sizeOut); + dst->oam = ctx->core->getMemoryBlock(ctx->core, GBA_REGION_OAM, &sizeOut); + dst->rom = ctx->core->getMemoryBlock(ctx->core, GBA_REGION_ROM0, &sizeOut); + // Return the buffer that BizHawk hands to mGBA for storing savedata. + // getMemoryBlock is avoided because mGBA doesn't always know save type at startup, + // so getMemoryBlock may return nothing until the save type is detected. + // (returning the buffer directly avoids 0-size and variable-size savedata) + dst->sram = ctx->sram; + // If ROM is not present (due to multiboot), send our raw buffer over + if (!dst->rom) + { + dst->rom = ctx->rom; + } +} + +EXP uint32_t BizGetSaveRam(bizctx* ctx, void* data, uint32_t size) +{ + GBASavedataRTCWrite(&ctx->gba->memory.savedata); // make sure RTC data is up to date + ctx->sramvf->seek(ctx->sramvf, 0, SEEK_SET); + return ctx->sramvf->read(ctx->sramvf, data, size); +} + +EXP void BizPutSaveRam(bizctx* ctx, const void* data, uint32_t size) +{ + ctx->sramvf->seek(ctx->sramvf, 0, SEEK_SET); + ctx->sramvf->write(ctx->sramvf, data, size); + if ((ctx->override.hardware & HW_RTC) && (size & 0xff)) // RTC data is in the save, read it out + { + GBASavedataRTCRead(&ctx->gba->memory.savedata); + } +} + +// state sizes can vary! +EXP bool BizStartGetState(bizctx* ctx, struct VFile** file, uint32_t* size) +{ + struct VFile* vf = VFileMemChunk(NULL, 0); + if (!mCoreSaveStateNamed(ctx->core, vf, SAVESTATE_SAVEDATA)) + { + vf->close(vf); + return false; + } + *file = vf; + *size = vf->seek(vf, 0, SEEK_END); + return true; +} + +EXP void BizFinishGetState(struct VFile* file, void* data, uint32_t size) +{ + file->seek(file, 0, SEEK_SET); + file->read(file, data, size); + file->close(file); +} + +EXP bool BizPutState(bizctx* ctx, const void* data, uint32_t size) +{ + struct VFile* vf = VFileFromConstMemory(data, size); + bool ret = mCoreLoadStateNamed(ctx->core, vf, SAVESTATE_SAVEDATA); + vf->close(vf); + return ret; +} + +EXP void BizSetLayerMask(bizctx *ctx, uint32_t mask) +{ + for (int i = 0; i < 5; i++) + ctx->core->enableVideoLayer(ctx->core, i, mask & 1 << i); +} + +EXP void BizSetSoundMask(bizctx* ctx, uint32_t mask) +{ + for (int i = 0; i < 6; i++) + ctx->core->enableAudioChannel(ctx->core, i, mask & 1 << i); +} + +EXP void BizGetRegisters(bizctx* ctx, int32_t* dest) +{ + memcpy(dest, ctx->gba->cpu, 18 * sizeof(int32_t)); +} + +EXP void BizSetRegister(bizctx* ctx, int32_t index, int32_t value) +{ + if (index >= 0 && index < 16) + { + ctx->gba->cpu->gprs[index] = value; + } + + if (index == 16) + { + memcpy(&ctx->gba->cpu->cpsr, &value, sizeof(int32_t)); + } + + if (index == 17) + { + memcpy(&ctx->gba->cpu->spsr, &value, sizeof(int32_t)); + } +} + +EXP uint64_t BizGetGlobalTime(bizctx* ctx) +{ + return mTimingGlobalTime(ctx->debugger.core->timing); +} + +EXP void BizWriteBus(bizctx* ctx, uint32_t addr, uint8_t val) +{ + ctx->core->rawWrite8(ctx->core, addr, -1, val); +} + +EXP uint8_t BizReadBus(bizctx* ctx, uint32_t addr) +{ + return ctx->core->busRead8(ctx->core, addr); +} diff --git a/src/platform/bizhawk/linux/Makefile b/src/platform/bizhawk/linux/Makefile new file mode 100644 index 00000000000..ffa357e3341 --- /dev/null +++ b/src/platform/bizhawk/linux/Makefile @@ -0,0 +1,30 @@ +CC ?= gcc +RM ?= rm +CP ?= cp + +MACHINE = $(shell $(CC) -dumpmachine) + +ifneq (,$(findstring i686,$(MACHINE))) + $(error 32 bit build no longer supported) +else ifneq (,$(findstring x86_64,$(MACHINE))) + ARCH = 64 +else + $(error Unknown arch) +endif + +MAKEFILE_DIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))) +ROOT_DIR := $(MAKEFILE_DIR)/../../.. +OBJ_DIR := $(MAKEFILE_DIR)/obj + +LDFLAGS_64 = +LDFLAGS = -shared -s $(LDFLAGS_$(ARCH)) $(CCFLAGS) + +PLAT_SRCS += \ + $(ROOT_DIR)/platform/posix/memory.c + +PLAT_FLAGS += \ + -DHAVE_LOCALE -DHAVE_LOCALTIME_R -fvisibility=hidden -fPIC + +TARGET = libmgba.dll.so + +include ../base.mak diff --git a/src/platform/bizhawk/localtime_r.c b/src/platform/bizhawk/localtime_r.c new file mode 100644 index 00000000000..3dd28f48978 --- /dev/null +++ b/src/platform/bizhawk/localtime_r.c @@ -0,0 +1,179 @@ + +// +// time.c +// +// Time routines +// +// Copyright (C) 2002 Michael Ringgaard. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// 3. Neither the name of the project nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +// SUCH DAMAGE. +// +#include + +#define YEAR0 1900 +#define EPOCH_YR 1970 +#define SECS_DAY (24L * 60L * 60L) +#define LEAPYEAR(year) (!((year) % 4) && (((year) % 100) || !((year) % 400))) +#define YEARSIZE(year) (LEAPYEAR(year) ? 366 : 365) +#define FIRSTSUNDAY(timp) (((timp)->tm_yday - (timp)->tm_wday + 420) % 7) +#define FIRSTDAYOF(timp) (((timp)->tm_wday - (timp)->tm_yday + 420) % 7) + +#define TIME_MAX 2147483647L + +static const int _ytab[2][12] = { + {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, + {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} +}; + +#ifdef _WIN32 +errno_t _localtime64_s(struct tm *tmbuf, const time_t *timer) { +#else +struct tm *localtime_r(const time_t *timer, struct tm *tmbuf) { +#endif + time_t time = *timer; + unsigned long dayclock, dayno; + int year = EPOCH_YR; + + dayclock = (unsigned long) time % SECS_DAY; + dayno = (unsigned long) time / SECS_DAY; + + tmbuf->tm_sec = dayclock % 60; + tmbuf->tm_min = (dayclock % 3600) / 60; + tmbuf->tm_hour = dayclock / 3600; + tmbuf->tm_wday = (dayno + 4) % 7; // Day 0 was a thursday + while (dayno >= (unsigned long) YEARSIZE(year)) { + dayno -= YEARSIZE(year); + year++; + } + tmbuf->tm_year = year - YEAR0; + tmbuf->tm_yday = dayno; + tmbuf->tm_mon = 0; + while (dayno >= (unsigned long) _ytab[LEAPYEAR(year)][tmbuf->tm_mon]) { + dayno -= _ytab[LEAPYEAR(year)][tmbuf->tm_mon]; + tmbuf->tm_mon++; + } + tmbuf->tm_mday = dayno + 1; + tmbuf->tm_isdst = 0; +#ifdef _WIN32 + return 0; +#else + return tmbuf; +#endif +} + +#ifdef _WIN32 +time_t _mktime64(struct tm *tmbuf) { +#else +time_t mktime(struct tm *tmbuf) { +#endif + long day, year; + int tm_year; + int yday, month; + /*unsigned*/ long seconds; + int overflow; + + tmbuf->tm_min += tmbuf->tm_sec / 60; + tmbuf->tm_sec %= 60; + if (tmbuf->tm_sec < 0) { + tmbuf->tm_sec += 60; + tmbuf->tm_min--; + } + tmbuf->tm_hour += tmbuf->tm_min / 60; + tmbuf->tm_min = tmbuf->tm_min % 60; + if (tmbuf->tm_min < 0) { + tmbuf->tm_min += 60; + tmbuf->tm_hour--; + } + day = tmbuf->tm_hour / 24; + tmbuf->tm_hour= tmbuf->tm_hour % 24; + if (tmbuf->tm_hour < 0) { + tmbuf->tm_hour += 24; + day--; + } + tmbuf->tm_year += tmbuf->tm_mon / 12; + tmbuf->tm_mon %= 12; + if (tmbuf->tm_mon < 0) { + tmbuf->tm_mon += 12; + tmbuf->tm_year--; + } + day += (tmbuf->tm_mday - 1); + while (day < 0) { + if(--tmbuf->tm_mon < 0) { + tmbuf->tm_year--; + tmbuf->tm_mon = 11; + } + day += _ytab[LEAPYEAR(YEAR0 + tmbuf->tm_year)][tmbuf->tm_mon]; + } + while (day >= _ytab[LEAPYEAR(YEAR0 + tmbuf->tm_year)][tmbuf->tm_mon]) { + day -= _ytab[LEAPYEAR(YEAR0 + tmbuf->tm_year)][tmbuf->tm_mon]; + if (++(tmbuf->tm_mon) == 12) { + tmbuf->tm_mon = 0; + tmbuf->tm_year++; + } + } + tmbuf->tm_mday = day + 1; + year = EPOCH_YR; + if (tmbuf->tm_year < year - YEAR0) return (time_t) -1; + seconds = 0; + day = 0; // Means days since day 0 now + overflow = 0; + + // Assume that when day becomes negative, there will certainly + // be overflow on seconds. + // The check for overflow needs not to be done for leapyears + // divisible by 400. + // The code only works when year (1970) is not a leapyear. + tm_year = tmbuf->tm_year + YEAR0; + + if (TIME_MAX / 365 < tm_year - year) overflow++; + day = (tm_year - year) * 365; + if (TIME_MAX - day < (tm_year - year) / 4 + 1) overflow++; + day += (tm_year - year) / 4 + ((tm_year % 4) && tm_year % 4 < year % 4); + day -= (tm_year - year) / 100 + ((tm_year % 100) && tm_year % 100 < year % 100); + day += (tm_year - year) / 400 + ((tm_year % 400) && tm_year % 400 < year % 400); + + yday = month = 0; + while (month < tmbuf->tm_mon) { + yday += _ytab[LEAPYEAR(tm_year)][month]; + month++; + } + yday += (tmbuf->tm_mday - 1); + if (day + yday < 0) overflow++; + day += yday; + + tmbuf->tm_yday = yday; + tmbuf->tm_wday = (day + 4) % 7; // Day 0 was thursday (4) + + seconds = ((tmbuf->tm_hour * 60L) + tmbuf->tm_min) * 60L + tmbuf->tm_sec; + + if ((TIME_MAX - seconds) / SECS_DAY < day) overflow++; + seconds += day * SECS_DAY; + + if (overflow) return (time_t) -1; + + if ((time_t) seconds != seconds) return (time_t) -1; + return (time_t) seconds; +} diff --git a/src/platform/bizhawk/mingw/Makefile b/src/platform/bizhawk/mingw/Makefile new file mode 100644 index 00000000000..2671449758b --- /dev/null +++ b/src/platform/bizhawk/mingw/Makefile @@ -0,0 +1,31 @@ +CC ?= gcc +RM ?= rm +CP ?= cp + +MACHINE = $(shell $(CC) -dumpmachine) + +ifneq (,$(findstring i686,$(MACHINE))) + $(error 32 bit build no longer supported) +else ifneq (,$(findstring x86_64,$(MACHINE))) + ARCH = 64 +else + $(error Unknown arch) +endif + +MAKEFILE_DIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))) +ROOT_DIR := $(MAKEFILE_DIR)/../../.. +OBJ_DIR := $(MAKEFILE_DIR)/obj + +LDFLAGS_32 = -static-libgcc +LDFLAGS_64 = +LDFLAGS = -shared -s $(LDFLAGS_$(ARCH)) $(CCFLAGS) -lshlwapi + +PLAT_SRCS += \ + $(ROOT_DIR)/platform/windows/memory.c + +PLAT_FLAGS += \ + -Wno-format -Wno-inconsistent-dllimport -D_mktime64=biz_mktime64 -D_localtime64_s=biz_localtime64_s + +TARGET = mgba.dll + +include ../base.mak diff --git a/src/platform/bizhawk/xcode/mgba.xcodeproj/project.pbxproj b/src/platform/bizhawk/xcode/mgba.xcodeproj/project.pbxproj new file mode 100644 index 00000000000..b2a52e08b93 --- /dev/null +++ b/src/platform/bizhawk/xcode/mgba.xcodeproj/project.pbxproj @@ -0,0 +1,785 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 9E6F8AFA1C910BB400A3B82E /* cheats-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E6F8AE81C910BB400A3B82E /* cheats-private.h */; }; + 9E6F8AFB1C910BB400A3B82E /* codebreaker.c in Sources */ = {isa = PBXBuildFile; fileRef = 9E6F8AE91C910BB400A3B82E /* codebreaker.c */; }; + 9E6F8AFC1C910BB400A3B82E /* gameshark.c in Sources */ = {isa = PBXBuildFile; fileRef = 9E6F8AEA1C910BB400A3B82E /* gameshark.c */; }; + 9E6F8AFD1C910BB400A3B82E /* gameshark.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E6F8AEB1C910BB400A3B82E /* gameshark.h */; }; + 9E6F8AFE1C910BB400A3B82E /* parv3.c in Sources */ = {isa = PBXBuildFile; fileRef = 9E6F8AEC1C910BB400A3B82E /* parv3.c */; }; + 9E6F8AFF1C910BB400A3B82E /* parv3.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E6F8AED1C910BB400A3B82E /* parv3.h */; }; + 9E6F8B001C910BB400A3B82E /* cheats.c in Sources */ = {isa = PBXBuildFile; fileRef = 9E6F8AEE1C910BB400A3B82E /* cheats.c */; }; + 9E6F8B011C910BB400A3B82E /* config.c in Sources */ = {isa = PBXBuildFile; fileRef = 9E6F8AF01C910BB400A3B82E /* config.c */; }; + 9E6F8B021C910BB400A3B82E /* config.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E6F8AF11C910BB400A3B82E /* config.h */; }; + 9E6F8B041C910BB400A3B82E /* context.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E6F8AF31C910BB400A3B82E /* context.h */; }; + 9E6F8B061C910BB400A3B82E /* directories.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E6F8AF51C910BB400A3B82E /* directories.h */; }; + 9E6F8B071C910BB400A3B82E /* overrides.c in Sources */ = {isa = PBXBuildFile; fileRef = 9E6F8AF61C910BB400A3B82E /* overrides.c */; }; + 9E6F8B081C910BB400A3B82E /* overrides.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E6F8AF71C910BB400A3B82E /* overrides.h */; }; + 9E6F8B091C910BB400A3B82E /* sync.c in Sources */ = {isa = PBXBuildFile; fileRef = 9E6F8AF81C910BB400A3B82E /* sync.c */; }; + 9E6F8B0A1C910BB400A3B82E /* sync.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E6F8AF91C910BB400A3B82E /* sync.h */; }; + 9E6F8B0F1C910BF300A3B82E /* software-bg.c in Sources */ = {isa = PBXBuildFile; fileRef = 9E6F8B0B1C910BF300A3B82E /* software-bg.c */; }; + 9E6F8B101C910BF300A3B82E /* software-mode0.c in Sources */ = {isa = PBXBuildFile; fileRef = 9E6F8B0C1C910BF300A3B82E /* software-mode0.c */; }; + 9E6F8B111C910BF300A3B82E /* software-obj.c in Sources */ = {isa = PBXBuildFile; fileRef = 9E6F8B0D1C910BF300A3B82E /* software-obj.c */; }; + 9E6F8B121C910BF300A3B82E /* software-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E6F8B0E1C910BF300A3B82E /* software-private.h */; }; + 9E6F8B141C910C9400A3B82E /* configuration.c in Sources */ = {isa = PBXBuildFile; fileRef = 9E6F8B131C910C9400A3B82E /* configuration.c */; }; + 9E6F8B1C1C910D3100A3B82E /* ini.c in Sources */ = {isa = PBXBuildFile; fileRef = 9E6F8B181C910D3100A3B82E /* ini.c */; }; + 9E6F8B1D1C910D3100A3B82E /* ini.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E6F8B191C910D3100A3B82E /* ini.h */; }; + 9E6F8B1E1C910D3100A3B82E /* README.md in Sources */ = {isa = PBXBuildFile; fileRef = 9E6F8B1B1C910D3100A3B82E /* README.md */; }; + 9E8AD15E1B37A90800627671 /* arm.c in Sources */ = {isa = PBXBuildFile; fileRef = 9E8AD14E1B37A90800627671 /* arm.c */; }; + 9E8AD15F1B37A90800627671 /* arm.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E8AD14F1B37A90800627671 /* arm.h */; }; + 9E8AD1601B37A90800627671 /* decoder-arm.c in Sources */ = {isa = PBXBuildFile; fileRef = 9E8AD1501B37A90800627671 /* decoder-arm.c */; }; + 9E8AD1611B37A90800627671 /* decoder-inlines.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E8AD1511B37A90800627671 /* decoder-inlines.h */; }; + 9E8AD1621B37A90800627671 /* decoder-thumb.c in Sources */ = {isa = PBXBuildFile; fileRef = 9E8AD1521B37A90800627671 /* decoder-thumb.c */; }; + 9E8AD1631B37A90800627671 /* decoder.c in Sources */ = {isa = PBXBuildFile; fileRef = 9E8AD1531B37A90800627671 /* decoder.c */; }; + 9E8AD1641B37A90800627671 /* decoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E8AD1541B37A90800627671 /* decoder.h */; }; + 9E8AD1651B37A90800627671 /* emitter-arm.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E8AD1551B37A90800627671 /* emitter-arm.h */; }; + 9E8AD1661B37A90800627671 /* emitter-inlines.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E8AD1561B37A90800627671 /* emitter-inlines.h */; }; + 9E8AD1671B37A90800627671 /* emitter-thumb.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E8AD1571B37A90800627671 /* emitter-thumb.h */; }; + 9E8AD1681B37A90800627671 /* isa-arm.c in Sources */ = {isa = PBXBuildFile; fileRef = 9E8AD1581B37A90800627671 /* isa-arm.c */; }; + 9E8AD1691B37A90800627671 /* isa-arm.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E8AD1591B37A90800627671 /* isa-arm.h */; }; + 9E8AD16A1B37A90800627671 /* isa-inlines.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E8AD15A1B37A90800627671 /* isa-inlines.h */; }; + 9E8AD16B1B37A90800627671 /* isa-thumb.c in Sources */ = {isa = PBXBuildFile; fileRef = 9E8AD15B1B37A90800627671 /* isa-thumb.c */; }; + 9E8AD16C1B37A90800627671 /* isa-thumb.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E8AD15C1B37A90800627671 /* isa-thumb.h */; }; + 9E8AD16D1B37A90800627671 /* macros.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E8AD15D1B37A90800627671 /* macros.h */; }; + 9E8AD1AC1B37A91800627671 /* audio.c in Sources */ = {isa = PBXBuildFile; fileRef = 9E8AD16F1B37A91800627671 /* audio.c */; }; + 9E8AD1AD1B37A91800627671 /* audio.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E8AD1701B37A91800627671 /* audio.h */; }; + 9E8AD1AE1B37A91800627671 /* bios.c in Sources */ = {isa = PBXBuildFile; fileRef = 9E8AD1711B37A91800627671 /* bios.c */; }; + 9E8AD1AF1B37A91800627671 /* bios.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E8AD1721B37A91800627671 /* bios.h */; }; + 9E8AD1B71B37A91800627671 /* cheats.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E8AD17B1B37A91800627671 /* cheats.h */; }; + 9E8AD1B81B37A91800627671 /* gba.c in Sources */ = {isa = PBXBuildFile; fileRef = 9E8AD17C1B37A91800627671 /* gba.c */; }; + 9E8AD1B91B37A91800627671 /* gba.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E8AD17D1B37A91800627671 /* gba.h */; }; + 9E8AD1BA1B37A91800627671 /* hardware.c in Sources */ = {isa = PBXBuildFile; fileRef = 9E8AD17E1B37A91800627671 /* hardware.c */; }; + 9E8AD1BB1B37A91800627671 /* hardware.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E8AD17F1B37A91800627671 /* hardware.h */; }; + 9E8AD1BC1B37A91800627671 /* hle-bios.c in Sources */ = {isa = PBXBuildFile; fileRef = 9E8AD1801B37A91800627671 /* hle-bios.c */; }; + 9E8AD1BD1B37A91800627671 /* hle-bios.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E8AD1811B37A91800627671 /* hle-bios.h */; }; + 9E8AD1C01B37A91800627671 /* input.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E8AD1851B37A91800627671 /* input.h */; }; + 9E8AD1C11B37A91800627671 /* io.c in Sources */ = {isa = PBXBuildFile; fileRef = 9E8AD1861B37A91800627671 /* io.c */; }; + 9E8AD1C21B37A91800627671 /* io.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E8AD1871B37A91800627671 /* io.h */; }; + 9E8AD1C31B37A91800627671 /* memory.c in Sources */ = {isa = PBXBuildFile; fileRef = 9E8AD1881B37A91800627671 /* memory.c */; }; + 9E8AD1C41B37A91800627671 /* memory.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E8AD1891B37A91800627671 /* memory.h */; }; + 9E8AD1C51B37A91800627671 /* video-software.c in Sources */ = {isa = PBXBuildFile; fileRef = 9E8AD18B1B37A91800627671 /* video-software.c */; }; + 9E8AD1C61B37A91800627671 /* video-software.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E8AD18C1B37A91800627671 /* video-software.h */; }; + 9E8AD1CB1B37A91800627671 /* savedata.c in Sources */ = {isa = PBXBuildFile; fileRef = 9E8AD1921B37A91800627671 /* savedata.c */; }; + 9E8AD1CC1B37A91800627671 /* savedata.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E8AD1931B37A91800627671 /* savedata.h */; }; + 9E8AD1CD1B37A91800627671 /* serialize.c in Sources */ = {isa = PBXBuildFile; fileRef = 9E8AD1941B37A91800627671 /* serialize.c */; }; + 9E8AD1CE1B37A91800627671 /* serialize.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E8AD1951B37A91800627671 /* serialize.h */; }; + 9E8AD1CF1B37A91800627671 /* sharkport.c in Sources */ = {isa = PBXBuildFile; fileRef = 9E8AD1961B37A91800627671 /* sharkport.c */; }; + 9E8AD1D01B37A91800627671 /* sharkport.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E8AD1971B37A91800627671 /* sharkport.h */; }; + 9E8AD1D11B37A91800627671 /* lockstep.c in Sources */ = {isa = PBXBuildFile; fileRef = 9E8AD1991B37A91800627671 /* lockstep.c */; }; + 9E8AD1D21B37A91800627671 /* lockstep.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E8AD19A1B37A91800627671 /* lockstep.h */; }; + 9E8AD1D31B37A91800627671 /* sio.c in Sources */ = {isa = PBXBuildFile; fileRef = 9E8AD19B1B37A91800627671 /* sio.c */; }; + 9E8AD1D41B37A91800627671 /* sio.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E8AD19C1B37A91800627671 /* sio.h */; }; + 9E8AD1E11B37A91800627671 /* video.c in Sources */ = {isa = PBXBuildFile; fileRef = 9E8AD1AA1B37A91800627671 /* video.c */; }; + 9E8AD1E21B37A91800627671 /* video.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E8AD1AB1B37A91800627671 /* video.h */; }; + 9E8AD2811B37A93600627671 /* blip_buf.c in Sources */ = {isa = PBXBuildFile; fileRef = 9E8AD1E51B37A93600627671 /* blip_buf.c */; }; + 9E8AD2821B37A93600627671 /* blip_buf.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E8AD1E61B37A93600627671 /* blip_buf.h */; }; + 9E8AD2DB1B37A93600627671 /* arm-algo.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E8AD25A1B37A93600627671 /* arm-algo.h */; }; + 9E8AD2DD1B37A93600627671 /* circle-buffer.c in Sources */ = {isa = PBXBuildFile; fileRef = 9E8AD25C1B37A93600627671 /* circle-buffer.c */; }; + 9E8AD2DE1B37A93600627671 /* circle-buffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E8AD25D1B37A93600627671 /* circle-buffer.h */; }; + 9E8AD2DF1B37A93600627671 /* common.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E8AD25E1B37A93600627671 /* common.h */; }; + 9E8AD2E11B37A93600627671 /* configuration.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E8AD2601B37A93600627671 /* configuration.h */; }; + 9E8AD2E21B37A93600627671 /* crc32.c in Sources */ = {isa = PBXBuildFile; fileRef = 9E8AD2611B37A93600627671 /* crc32.c */; }; + 9E8AD2E31B37A93600627671 /* crc32.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E8AD2621B37A93600627671 /* crc32.h */; }; + 9E8AD2E41B37A93600627671 /* formatting.c in Sources */ = {isa = PBXBuildFile; fileRef = 9E8AD2631B37A93600627671 /* formatting.c */; }; + 9E8AD2E51B37A93600627671 /* formatting.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E8AD2641B37A93600627671 /* formatting.h */; }; + 9E8AD2E61B37A93600627671 /* hash.c in Sources */ = {isa = PBXBuildFile; fileRef = 9E8AD2651B37A93600627671 /* hash.c */; }; + 9E8AD2E71B37A93600627671 /* hash.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E8AD2661B37A93600627671 /* hash.h */; }; + 9E8AD2E81B37A93600627671 /* memory.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E8AD2671B37A93600627671 /* memory.h */; }; + 9E8AD2EA1B37A93600627671 /* patch-ips.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E8AD2691B37A93600627671 /* patch-ips.h */; }; + 9E8AD2EC1B37A93600627671 /* patch-ups.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E8AD26B1B37A93600627671 /* patch-ups.h */; }; + 9E8AD2EE1B37A93600627671 /* patch.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E8AD26D1B37A93600627671 /* patch.h */; }; + 9E8AD2F01B37A93600627671 /* png-io.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E8AD26F1B37A93600627671 /* png-io.h */; }; + 9E8AD2F11B37A93600627671 /* socket.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E8AD2701B37A93600627671 /* socket.h */; }; + 9E8AD2F21B37A93600627671 /* string.c in Sources */ = {isa = PBXBuildFile; fileRef = 9E8AD2711B37A93600627671 /* string.c */; }; + 9E8AD2F31B37A93600627671 /* string.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E8AD2721B37A93600627671 /* string.h */; }; + 9E8AD2F41B37A93600627671 /* table.c in Sources */ = {isa = PBXBuildFile; fileRef = 9E8AD2731B37A93600627671 /* table.c */; }; + 9E8AD2F51B37A93600627671 /* table.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E8AD2741B37A93600627671 /* table.h */; }; + 9E8AD2F61B37A93600627671 /* threading.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E8AD2751B37A93600627671 /* threading.h */; }; + 9E8AD2F71B37A93600627671 /* vector.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E8AD2761B37A93600627671 /* vector.h */; }; + 9E8AD2F81B37A93600627671 /* version.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E8AD2781B37A93600627671 /* version.h */; }; + 9E8AD2FE1B37A93600627671 /* vfs.c in Sources */ = {isa = PBXBuildFile; fileRef = 9E8AD27F1B37A93600627671 /* vfs.c */; }; + 9E8AD2FF1B37A93600627671 /* vfs.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E8AD2801B37A93600627671 /* vfs.h */; }; + 9E8AD3011B37A94400627671 /* bizinterface.c in Sources */ = {isa = PBXBuildFile; fileRef = 9E8AD3001B37A94400627671 /* bizinterface.c */; }; + 9E8AD30B1B37AAB500627671 /* vfs-mem.c in Sources */ = {isa = PBXBuildFile; fileRef = 9E8AD3061B37AAB500627671 /* vfs-mem.c */; }; + 9E8AD3101B37B14C00627671 /* memory.c in Sources */ = {isa = PBXBuildFile; fileRef = 9E8AD30F1B37B14C00627671 /* memory.c */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 9E6F8AE81C910BB400A3B82E /* cheats-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "cheats-private.h"; sourceTree = ""; }; + 9E6F8AE91C910BB400A3B82E /* codebreaker.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = codebreaker.c; sourceTree = ""; }; + 9E6F8AEA1C910BB400A3B82E /* gameshark.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = gameshark.c; sourceTree = ""; }; + 9E6F8AEB1C910BB400A3B82E /* gameshark.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gameshark.h; sourceTree = ""; }; + 9E6F8AEC1C910BB400A3B82E /* parv3.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = parv3.c; sourceTree = ""; }; + 9E6F8AED1C910BB400A3B82E /* parv3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = parv3.h; sourceTree = ""; }; + 9E6F8AEE1C910BB400A3B82E /* cheats.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = cheats.c; sourceTree = ""; }; + 9E6F8AF01C910BB400A3B82E /* config.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = config.c; sourceTree = ""; }; + 9E6F8AF11C910BB400A3B82E /* config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = ""; }; + 9E6F8AF21C910BB400A3B82E /* context.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = context.c; sourceTree = ""; }; + 9E6F8AF31C910BB400A3B82E /* context.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = context.h; sourceTree = ""; }; + 9E6F8AF41C910BB400A3B82E /* directories.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = directories.c; sourceTree = ""; }; + 9E6F8AF51C910BB400A3B82E /* directories.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = directories.h; sourceTree = ""; }; + 9E6F8AF61C910BB400A3B82E /* overrides.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = overrides.c; sourceTree = ""; }; + 9E6F8AF71C910BB400A3B82E /* overrides.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = overrides.h; sourceTree = ""; }; + 9E6F8AF81C910BB400A3B82E /* sync.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sync.c; sourceTree = ""; }; + 9E6F8AF91C910BB400A3B82E /* sync.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sync.h; sourceTree = ""; }; + 9E6F8B0B1C910BF300A3B82E /* software-bg.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "software-bg.c"; sourceTree = ""; }; + 9E6F8B0C1C910BF300A3B82E /* software-mode0.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "software-mode0.c"; sourceTree = ""; }; + 9E6F8B0D1C910BF300A3B82E /* software-obj.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "software-obj.c"; sourceTree = ""; }; + 9E6F8B0E1C910BF300A3B82E /* software-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "software-private.h"; sourceTree = ""; }; + 9E6F8B131C910C9400A3B82E /* configuration.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = configuration.c; sourceTree = ""; }; + 9E6F8B151C910CD800A3B82E /* localtime_r.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = localtime_r.c; path = ../localtime_r.c; sourceTree = ""; }; + 9E6F8B181C910D3100A3B82E /* ini.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ini.c; sourceTree = ""; }; + 9E6F8B191C910D3100A3B82E /* ini.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ini.h; sourceTree = ""; }; + 9E6F8B1A1C910D3100A3B82E /* LICENSE.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE.txt; sourceTree = ""; }; + 9E6F8B1B1C910D3100A3B82E /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; + 9E8AD1261B37A78F00627671 /* libmgba.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libmgba.dylib; sourceTree = BUILT_PRODUCTS_DIR; }; + 9E8AD14E1B37A90800627671 /* arm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = arm.c; sourceTree = ""; }; + 9E8AD14F1B37A90800627671 /* arm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = arm.h; sourceTree = ""; }; + 9E8AD1501B37A90800627671 /* decoder-arm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "decoder-arm.c"; sourceTree = ""; }; + 9E8AD1511B37A90800627671 /* decoder-inlines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "decoder-inlines.h"; sourceTree = ""; }; + 9E8AD1521B37A90800627671 /* decoder-thumb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "decoder-thumb.c"; sourceTree = ""; }; + 9E8AD1531B37A90800627671 /* decoder.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = decoder.c; sourceTree = ""; }; + 9E8AD1541B37A90800627671 /* decoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = decoder.h; sourceTree = ""; }; + 9E8AD1551B37A90800627671 /* emitter-arm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "emitter-arm.h"; sourceTree = ""; }; + 9E8AD1561B37A90800627671 /* emitter-inlines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "emitter-inlines.h"; sourceTree = ""; }; + 9E8AD1571B37A90800627671 /* emitter-thumb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "emitter-thumb.h"; sourceTree = ""; }; + 9E8AD1581B37A90800627671 /* isa-arm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "isa-arm.c"; sourceTree = ""; }; + 9E8AD1591B37A90800627671 /* isa-arm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "isa-arm.h"; sourceTree = ""; }; + 9E8AD15A1B37A90800627671 /* isa-inlines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "isa-inlines.h"; sourceTree = ""; }; + 9E8AD15B1B37A90800627671 /* isa-thumb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "isa-thumb.c"; sourceTree = ""; }; + 9E8AD15C1B37A90800627671 /* isa-thumb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "isa-thumb.h"; sourceTree = ""; }; + 9E8AD15D1B37A90800627671 /* macros.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = macros.h; sourceTree = ""; }; + 9E8AD16F1B37A91800627671 /* audio.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = audio.c; sourceTree = ""; }; + 9E8AD1701B37A91800627671 /* audio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audio.h; sourceTree = ""; }; + 9E8AD1711B37A91800627671 /* bios.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bios.c; sourceTree = ""; }; + 9E8AD1721B37A91800627671 /* bios.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bios.h; sourceTree = ""; }; + 9E8AD17B1B37A91800627671 /* cheats.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cheats.h; sourceTree = ""; }; + 9E8AD17C1B37A91800627671 /* gba.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = gba.c; sourceTree = ""; }; + 9E8AD17D1B37A91800627671 /* gba.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gba.h; sourceTree = ""; }; + 9E8AD17E1B37A91800627671 /* hardware.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = hardware.c; sourceTree = ""; }; + 9E8AD17F1B37A91800627671 /* hardware.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hardware.h; sourceTree = ""; }; + 9E8AD1801B37A91800627671 /* hle-bios.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "hle-bios.c"; sourceTree = ""; }; + 9E8AD1811B37A91800627671 /* hle-bios.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "hle-bios.h"; sourceTree = ""; }; + 9E8AD1851B37A91800627671 /* input.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = input.h; sourceTree = ""; }; + 9E8AD1861B37A91800627671 /* io.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = io.c; sourceTree = ""; }; + 9E8AD1871B37A91800627671 /* io.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = io.h; sourceTree = ""; }; + 9E8AD1881B37A91800627671 /* memory.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = memory.c; sourceTree = ""; }; + 9E8AD1891B37A91800627671 /* memory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = memory.h; sourceTree = ""; }; + 9E8AD18B1B37A91800627671 /* video-software.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "video-software.c"; sourceTree = ""; }; + 9E8AD18C1B37A91800627671 /* video-software.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "video-software.h"; sourceTree = ""; }; + 9E8AD1921B37A91800627671 /* savedata.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = savedata.c; sourceTree = ""; }; + 9E8AD1931B37A91800627671 /* savedata.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = savedata.h; sourceTree = ""; }; + 9E8AD1941B37A91800627671 /* serialize.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = serialize.c; sourceTree = ""; }; + 9E8AD1951B37A91800627671 /* serialize.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = serialize.h; sourceTree = ""; }; + 9E8AD1961B37A91800627671 /* sharkport.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sharkport.c; sourceTree = ""; }; + 9E8AD1971B37A91800627671 /* sharkport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sharkport.h; sourceTree = ""; }; + 9E8AD1991B37A91800627671 /* lockstep.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lockstep.c; sourceTree = ""; }; + 9E8AD19A1B37A91800627671 /* lockstep.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lockstep.h; sourceTree = ""; }; + 9E8AD19B1B37A91800627671 /* sio.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sio.c; sourceTree = ""; }; + 9E8AD19C1B37A91800627671 /* sio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sio.h; sourceTree = ""; }; + 9E8AD1AA1B37A91800627671 /* video.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = video.c; sourceTree = ""; }; + 9E8AD1AB1B37A91800627671 /* video.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = video.h; sourceTree = ""; }; + 9E8AD1E51B37A93600627671 /* blip_buf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = blip_buf.c; sourceTree = ""; }; + 9E8AD1E61B37A93600627671 /* blip_buf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blip_buf.h; sourceTree = ""; }; + 9E8AD25A1B37A93600627671 /* arm-algo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "arm-algo.h"; sourceTree = ""; }; + 9E8AD25C1B37A93600627671 /* circle-buffer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "circle-buffer.c"; sourceTree = ""; }; + 9E8AD25D1B37A93600627671 /* circle-buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "circle-buffer.h"; sourceTree = ""; }; + 9E8AD25E1B37A93600627671 /* common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = common.h; sourceTree = ""; }; + 9E8AD2601B37A93600627671 /* configuration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = configuration.h; sourceTree = ""; }; + 9E8AD2611B37A93600627671 /* crc32.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = crc32.c; sourceTree = ""; }; + 9E8AD2621B37A93600627671 /* crc32.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = crc32.h; sourceTree = ""; }; + 9E8AD2631B37A93600627671 /* formatting.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = formatting.c; sourceTree = ""; }; + 9E8AD2641B37A93600627671 /* formatting.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = formatting.h; sourceTree = ""; }; + 9E8AD2651B37A93600627671 /* hash.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = hash.c; sourceTree = ""; }; + 9E8AD2661B37A93600627671 /* hash.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hash.h; sourceTree = ""; }; + 9E8AD2671B37A93600627671 /* memory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = memory.h; sourceTree = ""; }; + 9E8AD2691B37A93600627671 /* patch-ips.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "patch-ips.h"; sourceTree = ""; }; + 9E8AD26B1B37A93600627671 /* patch-ups.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "patch-ups.h"; sourceTree = ""; }; + 9E8AD26D1B37A93600627671 /* patch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = patch.h; sourceTree = ""; }; + 9E8AD26F1B37A93600627671 /* png-io.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "png-io.h"; sourceTree = ""; }; + 9E8AD2701B37A93600627671 /* socket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = socket.h; sourceTree = ""; }; + 9E8AD2711B37A93600627671 /* string.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = string.c; sourceTree = ""; }; + 9E8AD2721B37A93600627671 /* string.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = string.h; sourceTree = ""; }; + 9E8AD2731B37A93600627671 /* table.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = table.c; sourceTree = ""; }; + 9E8AD2741B37A93600627671 /* table.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = table.h; sourceTree = ""; }; + 9E8AD2751B37A93600627671 /* threading.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = threading.h; sourceTree = ""; }; + 9E8AD2761B37A93600627671 /* vector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vector.h; sourceTree = ""; }; + 9E8AD2781B37A93600627671 /* version.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = version.h; sourceTree = ""; }; + 9E8AD27F1B37A93600627671 /* vfs.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = vfs.c; sourceTree = ""; }; + 9E8AD2801B37A93600627671 /* vfs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vfs.h; sourceTree = ""; }; + 9E8AD3001B37A94400627671 /* bizinterface.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = bizinterface.c; path = ../bizinterface.c; sourceTree = ""; }; + 9E8AD3061B37AAB500627671 /* vfs-mem.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "vfs-mem.c"; sourceTree = ""; }; + 9E8AD30F1B37B14C00627671 /* memory.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = memory.c; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 9E8AD1231B37A78F00627671 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 9E6F8AE71C910BB400A3B82E /* cheats */ = { + isa = PBXGroup; + children = ( + 9E6F8AE81C910BB400A3B82E /* cheats-private.h */, + 9E6F8AE91C910BB400A3B82E /* codebreaker.c */, + 9E6F8AEA1C910BB400A3B82E /* gameshark.c */, + 9E6F8AEB1C910BB400A3B82E /* gameshark.h */, + 9E6F8AEC1C910BB400A3B82E /* parv3.c */, + 9E6F8AED1C910BB400A3B82E /* parv3.h */, + ); + path = cheats; + sourceTree = ""; + }; + 9E6F8AEF1C910BB400A3B82E /* context */ = { + isa = PBXGroup; + children = ( + 9E6F8AF01C910BB400A3B82E /* config.c */, + 9E6F8AF11C910BB400A3B82E /* config.h */, + 9E6F8AF21C910BB400A3B82E /* context.c */, + 9E6F8AF31C910BB400A3B82E /* context.h */, + 9E6F8AF41C910BB400A3B82E /* directories.c */, + 9E6F8AF51C910BB400A3B82E /* directories.h */, + 9E6F8AF61C910BB400A3B82E /* overrides.c */, + 9E6F8AF71C910BB400A3B82E /* overrides.h */, + 9E6F8AF81C910BB400A3B82E /* sync.c */, + 9E6F8AF91C910BB400A3B82E /* sync.h */, + ); + path = context; + sourceTree = ""; + }; + 9E6F8B171C910D3100A3B82E /* inih */ = { + isa = PBXGroup; + children = ( + 9E6F8B181C910D3100A3B82E /* ini.c */, + 9E6F8B191C910D3100A3B82E /* ini.h */, + 9E6F8B1A1C910D3100A3B82E /* LICENSE.txt */, + 9E6F8B1B1C910D3100A3B82E /* README.md */, + ); + path = inih; + sourceTree = ""; + }; + 9E8AD11D1B37A78F00627671 = { + isa = PBXGroup; + children = ( + 9E6F8B151C910CD800A3B82E /* localtime_r.c */, + 9E8AD30D1B37B13E00627671 /* platform */, + 9E8AD3001B37A94400627671 /* bizinterface.c */, + 9E8AD1E31B37A93600627671 /* third-party */, + 9E8AD2591B37A93600627671 /* util */, + 9E8AD16E1B37A91800627671 /* gba */, + 9E8AD14D1B37A90800627671 /* arm */, + 9E8AD1271B37A78F00627671 /* Products */, + ); + sourceTree = ""; + }; + 9E8AD1271B37A78F00627671 /* Products */ = { + isa = PBXGroup; + children = ( + 9E8AD1261B37A78F00627671 /* libmgba.dylib */, + ); + name = Products; + sourceTree = ""; + }; + 9E8AD14D1B37A90800627671 /* arm */ = { + isa = PBXGroup; + children = ( + 9E8AD14E1B37A90800627671 /* arm.c */, + 9E8AD14F1B37A90800627671 /* arm.h */, + 9E8AD1501B37A90800627671 /* decoder-arm.c */, + 9E8AD1511B37A90800627671 /* decoder-inlines.h */, + 9E8AD1521B37A90800627671 /* decoder-thumb.c */, + 9E8AD1531B37A90800627671 /* decoder.c */, + 9E8AD1541B37A90800627671 /* decoder.h */, + 9E8AD1551B37A90800627671 /* emitter-arm.h */, + 9E8AD1561B37A90800627671 /* emitter-inlines.h */, + 9E8AD1571B37A90800627671 /* emitter-thumb.h */, + 9E8AD1581B37A90800627671 /* isa-arm.c */, + 9E8AD1591B37A90800627671 /* isa-arm.h */, + 9E8AD15A1B37A90800627671 /* isa-inlines.h */, + 9E8AD15B1B37A90800627671 /* isa-thumb.c */, + 9E8AD15C1B37A90800627671 /* isa-thumb.h */, + 9E8AD15D1B37A90800627671 /* macros.h */, + ); + name = arm; + path = ../../../arm; + sourceTree = ""; + }; + 9E8AD16E1B37A91800627671 /* gba */ = { + isa = PBXGroup; + children = ( + 9E6F8AE71C910BB400A3B82E /* cheats */, + 9E6F8AEE1C910BB400A3B82E /* cheats.c */, + 9E6F8AEF1C910BB400A3B82E /* context */, + 9E8AD16F1B37A91800627671 /* audio.c */, + 9E8AD1701B37A91800627671 /* audio.h */, + 9E8AD1711B37A91800627671 /* bios.c */, + 9E8AD1721B37A91800627671 /* bios.h */, + 9E8AD17B1B37A91800627671 /* cheats.h */, + 9E8AD17C1B37A91800627671 /* gba.c */, + 9E8AD17D1B37A91800627671 /* gba.h */, + 9E8AD17E1B37A91800627671 /* hardware.c */, + 9E8AD17F1B37A91800627671 /* hardware.h */, + 9E8AD1801B37A91800627671 /* hle-bios.c */, + 9E8AD1811B37A91800627671 /* hle-bios.h */, + 9E8AD1851B37A91800627671 /* input.h */, + 9E8AD1861B37A91800627671 /* io.c */, + 9E8AD1871B37A91800627671 /* io.h */, + 9E8AD1881B37A91800627671 /* memory.c */, + 9E8AD1891B37A91800627671 /* memory.h */, + 9E8AD18A1B37A91800627671 /* renderers */, + 9E8AD1921B37A91800627671 /* savedata.c */, + 9E8AD1931B37A91800627671 /* savedata.h */, + 9E8AD1941B37A91800627671 /* serialize.c */, + 9E8AD1951B37A91800627671 /* serialize.h */, + 9E8AD1961B37A91800627671 /* sharkport.c */, + 9E8AD1971B37A91800627671 /* sharkport.h */, + 9E8AD1981B37A91800627671 /* sio */, + 9E8AD19B1B37A91800627671 /* sio.c */, + 9E8AD19C1B37A91800627671 /* sio.h */, + 9E8AD1AA1B37A91800627671 /* video.c */, + 9E8AD1AB1B37A91800627671 /* video.h */, + ); + name = gba; + path = ../../../gba; + sourceTree = ""; + }; + 9E8AD18A1B37A91800627671 /* renderers */ = { + isa = PBXGroup; + children = ( + 9E6F8B0B1C910BF300A3B82E /* software-bg.c */, + 9E6F8B0C1C910BF300A3B82E /* software-mode0.c */, + 9E6F8B0D1C910BF300A3B82E /* software-obj.c */, + 9E6F8B0E1C910BF300A3B82E /* software-private.h */, + 9E8AD18B1B37A91800627671 /* video-software.c */, + 9E8AD18C1B37A91800627671 /* video-software.h */, + ); + path = renderers; + sourceTree = ""; + }; + 9E8AD1981B37A91800627671 /* sio */ = { + isa = PBXGroup; + children = ( + 9E8AD1991B37A91800627671 /* lockstep.c */, + 9E8AD19A1B37A91800627671 /* lockstep.h */, + ); + path = sio; + sourceTree = ""; + }; + 9E8AD1E31B37A93600627671 /* third-party */ = { + isa = PBXGroup; + children = ( + 9E6F8B171C910D3100A3B82E /* inih */, + 9E8AD1E41B37A93600627671 /* blip_buf */, + ); + name = "third-party"; + path = "../../../third-party"; + sourceTree = ""; + }; + 9E8AD1E41B37A93600627671 /* blip_buf */ = { + isa = PBXGroup; + children = ( + 9E8AD1E51B37A93600627671 /* blip_buf.c */, + 9E8AD1E61B37A93600627671 /* blip_buf.h */, + ); + path = blip_buf; + sourceTree = ""; + }; + 9E8AD2591B37A93600627671 /* util */ = { + isa = PBXGroup; + children = ( + 9E6F8B131C910C9400A3B82E /* configuration.c */, + 9E8AD3021B37AAB500627671 /* vfs */, + 9E8AD25A1B37A93600627671 /* arm-algo.h */, + 9E8AD25C1B37A93600627671 /* circle-buffer.c */, + 9E8AD25D1B37A93600627671 /* circle-buffer.h */, + 9E8AD25E1B37A93600627671 /* common.h */, + 9E8AD2601B37A93600627671 /* configuration.h */, + 9E8AD2611B37A93600627671 /* crc32.c */, + 9E8AD2621B37A93600627671 /* crc32.h */, + 9E8AD2631B37A93600627671 /* formatting.c */, + 9E8AD2641B37A93600627671 /* formatting.h */, + 9E8AD2651B37A93600627671 /* hash.c */, + 9E8AD2661B37A93600627671 /* hash.h */, + 9E8AD2671B37A93600627671 /* memory.h */, + 9E8AD2691B37A93600627671 /* patch-ips.h */, + 9E8AD26B1B37A93600627671 /* patch-ups.h */, + 9E8AD26D1B37A93600627671 /* patch.h */, + 9E8AD26F1B37A93600627671 /* png-io.h */, + 9E8AD2701B37A93600627671 /* socket.h */, + 9E8AD2711B37A93600627671 /* string.c */, + 9E8AD2721B37A93600627671 /* string.h */, + 9E8AD2731B37A93600627671 /* table.c */, + 9E8AD2741B37A93600627671 /* table.h */, + 9E8AD2751B37A93600627671 /* threading.h */, + 9E8AD2761B37A93600627671 /* vector.h */, + 9E8AD2781B37A93600627671 /* version.h */, + 9E8AD27F1B37A93600627671 /* vfs.c */, + 9E8AD2801B37A93600627671 /* vfs.h */, + ); + name = util; + path = ../../../util; + sourceTree = ""; + }; + 9E8AD3021B37AAB500627671 /* vfs */ = { + isa = PBXGroup; + children = ( + 9E8AD3061B37AAB500627671 /* vfs-mem.c */, + ); + path = vfs; + sourceTree = ""; + }; + 9E8AD30D1B37B13E00627671 /* platform */ = { + isa = PBXGroup; + children = ( + 9E8AD30E1B37B14C00627671 /* posix */, + ); + name = platform; + sourceTree = ""; + }; + 9E8AD30E1B37B14C00627671 /* posix */ = { + isa = PBXGroup; + children = ( + 9E8AD30F1B37B14C00627671 /* memory.c */, + ); + name = posix; + path = ../../posix; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 9E8AD1241B37A78F00627671 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 9E8AD1D41B37A91800627671 /* sio.h in Headers */, + 9E8AD2F01B37A93600627671 /* png-io.h in Headers */, + 9E8AD2F81B37A93600627671 /* version.h in Headers */, + 9E8AD1AD1B37A91800627671 /* audio.h in Headers */, + 9E8AD1C61B37A91800627671 /* video-software.h in Headers */, + 9E8AD2E51B37A93600627671 /* formatting.h in Headers */, + 9E8AD2DE1B37A93600627671 /* circle-buffer.h in Headers */, + 9E8AD16C1B37A90800627671 /* isa-thumb.h in Headers */, + 9E6F8B041C910BB400A3B82E /* context.h in Headers */, + 9E6F8AFD1C910BB400A3B82E /* gameshark.h in Headers */, + 9E8AD2821B37A93600627671 /* blip_buf.h in Headers */, + 9E8AD16D1B37A90800627671 /* macros.h in Headers */, + 9E8AD1CC1B37A91800627671 /* savedata.h in Headers */, + 9E8AD1671B37A90800627671 /* emitter-thumb.h in Headers */, + 9E8AD1611B37A90800627671 /* decoder-inlines.h in Headers */, + 9E8AD2F11B37A93600627671 /* socket.h in Headers */, + 9E6F8AFF1C910BB400A3B82E /* parv3.h in Headers */, + 9E8AD1B71B37A91800627671 /* cheats.h in Headers */, + 9E6F8B081C910BB400A3B82E /* overrides.h in Headers */, + 9E8AD1D21B37A91800627671 /* lockstep.h in Headers */, + 9E8AD1E21B37A91800627671 /* video.h in Headers */, + 9E8AD1641B37A90800627671 /* decoder.h in Headers */, + 9E8AD2F31B37A93600627671 /* string.h in Headers */, + 9E8AD1691B37A90800627671 /* isa-arm.h in Headers */, + 9E6F8B1D1C910D3100A3B82E /* ini.h in Headers */, + 9E8AD1651B37A90800627671 /* emitter-arm.h in Headers */, + 9E8AD2F61B37A93600627671 /* threading.h in Headers */, + 9E6F8AFA1C910BB400A3B82E /* cheats-private.h in Headers */, + 9E6F8B121C910BF300A3B82E /* software-private.h in Headers */, + 9E8AD2E11B37A93600627671 /* configuration.h in Headers */, + 9E8AD1CE1B37A91800627671 /* serialize.h in Headers */, + 9E8AD2DF1B37A93600627671 /* common.h in Headers */, + 9E8AD2FF1B37A93600627671 /* vfs.h in Headers */, + 9E8AD1D01B37A91800627671 /* sharkport.h in Headers */, + 9E8AD2F51B37A93600627671 /* table.h in Headers */, + 9E8AD2EE1B37A93600627671 /* patch.h in Headers */, + 9E8AD15F1B37A90800627671 /* arm.h in Headers */, + 9E8AD1B91B37A91800627671 /* gba.h in Headers */, + 9E8AD2F71B37A93600627671 /* vector.h in Headers */, + 9E8AD2EA1B37A93600627671 /* patch-ips.h in Headers */, + 9E8AD1C21B37A91800627671 /* io.h in Headers */, + 9E8AD2E31B37A93600627671 /* crc32.h in Headers */, + 9E8AD2DB1B37A93600627671 /* arm-algo.h in Headers */, + 9E8AD1BB1B37A91800627671 /* hardware.h in Headers */, + 9E6F8B021C910BB400A3B82E /* config.h in Headers */, + 9E8AD2E81B37A93600627671 /* memory.h in Headers */, + 9E6F8B0A1C910BB400A3B82E /* sync.h in Headers */, + 9E8AD2EC1B37A93600627671 /* patch-ups.h in Headers */, + 9E8AD1AF1B37A91800627671 /* bios.h in Headers */, + 9E8AD1C41B37A91800627671 /* memory.h in Headers */, + 9E8AD1BD1B37A91800627671 /* hle-bios.h in Headers */, + 9E8AD1C01B37A91800627671 /* input.h in Headers */, + 9E8AD1661B37A90800627671 /* emitter-inlines.h in Headers */, + 9E6F8B061C910BB400A3B82E /* directories.h in Headers */, + 9E8AD2E71B37A93600627671 /* hash.h in Headers */, + 9E8AD16A1B37A90800627671 /* isa-inlines.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 9E8AD1251B37A78F00627671 /* mgba */ = { + isa = PBXNativeTarget; + buildConfigurationList = 9E8AD12A1B37A78F00627671 /* Build configuration list for PBXNativeTarget "mgba" */; + buildPhases = ( + 9E8AD1221B37A78F00627671 /* Sources */, + 9E8AD1231B37A78F00627671 /* Frameworks */, + 9E8AD1241B37A78F00627671 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = mgba; + productName = mgba; + productReference = 9E8AD1261B37A78F00627671 /* libmgba.dylib */; + productType = "com.apple.product-type.library.dynamic"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 9E8AD11E1B37A78F00627671 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0630; + ORGANIZATIONNAME = bizhawk; + TargetAttributes = { + 9E8AD1251B37A78F00627671 = { + CreatedOnToolsVersion = 6.3.2; + }; + }; + }; + buildConfigurationList = 9E8AD1211B37A78F00627671 /* Build configuration list for PBXProject "mgba" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 9E8AD11D1B37A78F00627671; + productRefGroup = 9E8AD1271B37A78F00627671 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 9E8AD1251B37A78F00627671 /* mgba */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 9E8AD1221B37A78F00627671 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 9E8AD1AC1B37A91800627671 /* audio.c in Sources */, + 9E8AD2E21B37A93600627671 /* crc32.c in Sources */, + 9E8AD16B1B37A90800627671 /* isa-thumb.c in Sources */, + 9E8AD1CF1B37A91800627671 /* sharkport.c in Sources */, + 9E8AD2DD1B37A93600627671 /* circle-buffer.c in Sources */, + 9E8AD1B81B37A91800627671 /* gba.c in Sources */, + 9E8AD1631B37A90800627671 /* decoder.c in Sources */, + 9E6F8B1E1C910D3100A3B82E /* README.md in Sources */, + 9E6F8B0F1C910BF300A3B82E /* software-bg.c in Sources */, + 9E8AD15E1B37A90800627671 /* arm.c in Sources */, + 9E8AD3011B37A94400627671 /* bizinterface.c in Sources */, + 9E6F8B001C910BB400A3B82E /* cheats.c in Sources */, + 9E6F8B141C910C9400A3B82E /* configuration.c in Sources */, + 9E8AD1C11B37A91800627671 /* io.c in Sources */, + 9E8AD2E61B37A93600627671 /* hash.c in Sources */, + 9E8AD1CB1B37A91800627671 /* savedata.c in Sources */, + 9E8AD1C51B37A91800627671 /* video-software.c in Sources */, + 9E6F8AFC1C910BB400A3B82E /* gameshark.c in Sources */, + 9E6F8B1C1C910D3100A3B82E /* ini.c in Sources */, + 9E6F8B111C910BF300A3B82E /* software-obj.c in Sources */, + 9E8AD1D11B37A91800627671 /* lockstep.c in Sources */, + 9E8AD2FE1B37A93600627671 /* vfs.c in Sources */, + 9E8AD1AE1B37A91800627671 /* bios.c in Sources */, + 9E8AD1CD1B37A91800627671 /* serialize.c in Sources */, + 9E8AD1681B37A90800627671 /* isa-arm.c in Sources */, + 9E8AD1621B37A90800627671 /* decoder-thumb.c in Sources */, + 9E6F8B101C910BF300A3B82E /* software-mode0.c in Sources */, + 9E8AD3101B37B14C00627671 /* memory.c in Sources */, + 9E8AD2811B37A93600627671 /* blip_buf.c in Sources */, + 9E8AD30B1B37AAB500627671 /* vfs-mem.c in Sources */, + 9E8AD2E41B37A93600627671 /* formatting.c in Sources */, + 9E8AD1D31B37A91800627671 /* sio.c in Sources */, + 9E8AD2F41B37A93600627671 /* table.c in Sources */, + 9E8AD1601B37A90800627671 /* decoder-arm.c in Sources */, + 9E8AD1BC1B37A91800627671 /* hle-bios.c in Sources */, + 9E6F8B091C910BB400A3B82E /* sync.c in Sources */, + 9E6F8B071C910BB400A3B82E /* overrides.c in Sources */, + 9E6F8B011C910BB400A3B82E /* config.c in Sources */, + 9E8AD1C31B37A91800627671 /* memory.c in Sources */, + 9E8AD2F21B37A93600627671 /* string.c in Sources */, + 9E6F8AFE1C910BB400A3B82E /* parv3.c in Sources */, + 9E8AD1BA1B37A91800627671 /* hardware.c in Sources */, + 9E8AD1E11B37A91800627671 /* video.c in Sources */, + 9E6F8AFB1C910BB400A3B82E /* codebreaker.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 9E8AD1281B37A78F00627671 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Debug; + }; + 9E8AD1291B37A78F00627671 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + }; + name = Release; + }; + 9E8AD12B1B37A78F00627671 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + EXECUTABLE_PREFIX = lib; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + "RESAMPLE_LIBRARY=RESAMPLE_BLIP_BUF", + "DISABLE_THREADING=1", + "FALSE=0", + "TRUE=1", + "GBA_LOG_ABORT=GBA_LOG_DEBUG", + "MINIMAL_CORE=2", + HAVE_LOCALTIME_R, + ); + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "$(SRCROOT)/../../../", + ); + MACOSX_DEPLOYMENT_TARGET = 10.7; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 9E8AD12C1B37A78F00627671 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + EXECUTABLE_PREFIX = lib; + GCC_PREPROCESSOR_DEFINITIONS = ( + "RESAMPLE_LIBRARY=RESAMPLE_BLIP_BUF", + "DISABLE_THREADING=1", + "FALSE=0", + "TRUE=1", + "MINIMAL_CORE=2", + HAVE_LOCALTIME_R, + ); + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "$(SRCROOT)/../../../", + ); + MACOSX_DEPLOYMENT_TARGET = 10.7; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 9E8AD1211B37A78F00627671 /* Build configuration list for PBXProject "mgba" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 9E8AD1281B37A78F00627671 /* Debug */, + 9E8AD1291B37A78F00627671 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 9E8AD12A1B37A78F00627671 /* Build configuration list for PBXNativeTarget "mgba" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 9E8AD12B1B37A78F00627671 /* Debug */, + 9E8AD12C1B37A78F00627671 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 9E8AD11E1B37A78F00627671 /* Project object */; +} diff --git a/src/platform/bizhawk/xcode/mgba.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/src/platform/bizhawk/xcode/mgba.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000000..c9d5608fe7f --- /dev/null +++ b/src/platform/bizhawk/xcode/mgba.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/src/platform/bizhawk/xcode/mgba.xcodeproj/project.xcworkspace/xcshareddata/mgba.xccheckout b/src/platform/bizhawk/xcode/mgba.xcodeproj/project.xcworkspace/xcshareddata/mgba.xccheckout new file mode 100644 index 00000000000..04c2d75ea2b --- /dev/null +++ b/src/platform/bizhawk/xcode/mgba.xcodeproj/project.xcworkspace/xcshareddata/mgba.xccheckout @@ -0,0 +1,41 @@ + + + + + IDESourceControlProjectFavoriteDictionaryKey + + IDESourceControlProjectIdentifier + 771A19DA-B2B0-4F5F-8E7E-CE95DB5FF956 + IDESourceControlProjectName + mgba + IDESourceControlProjectOriginsDictionary + + E8A8BC68B807061741C520ADCEFE0BE66B80D001 + https://github.com/nattthebear/mgba.git + + IDESourceControlProjectPath + src/platform/bizhawk/xcode/mgba.xcodeproj + IDESourceControlProjectRelativeInstallPathDictionary + + E8A8BC68B807061741C520ADCEFE0BE66B80D001 + ../../../../../.. + + IDESourceControlProjectURL + https://github.com/nattthebear/mgba.git + IDESourceControlProjectVersion + 111 + IDESourceControlProjectWCCIdentifier + E8A8BC68B807061741C520ADCEFE0BE66B80D001 + IDESourceControlProjectWCConfigurations + + + IDESourceControlRepositoryExtensionIdentifierKey + public.vcs.git + IDESourceControlWCCIdentifierKey + E8A8BC68B807061741C520ADCEFE0BE66B80D001 + IDESourceControlWCCName + mgba + + + +