From 2e9e3424ecd6b2701ef8f479c939bbd4297ed77b Mon Sep 17 00:00:00 2001 From: Lior Halphon Date: Sat, 14 Jul 2018 21:52:54 +0300 Subject: [PATCH] Document some revision differences --- Core/apu.c | 5 ++++- Core/gb.c | 2 +- Core/gb.h | 16 +++++++--------- Core/memory.c | 34 +++++++++++++++++++++++++++++++--- 4 files changed, 43 insertions(+), 14 deletions(-) diff --git a/Core/apu.c b/Core/apu.c index 2da4346..260947d 100644 --- a/Core/apu.c +++ b/Core/apu.c @@ -381,7 +381,10 @@ void GB_apu_run(GB_gameboy_t *gb) if (gb->model == GB_MODEL_CGB_C) { /* Todo: This was confirmed to happen on a CGB-C. This may or may not happen on pre-CGB models. Because this degrades audio quality, and testing this on a pre-CGB device requires audio records, - I'll assume these devices are innocent until proven guilty. */ + I'll assume these devices are innocent until proven guilty. + + Also happens on CGB-B, but not on CGB-D. + */ gb->apu.current_lfsr_sample &= gb->apu.previous_lfsr_sample; } gb->apu.previous_lfsr_sample = gb->apu.noise_channel.lfsr & 1; diff --git a/Core/gb.c b/Core/gb.c index c3fa4cc..5f7b4f4 100644 --- a/Core/gb.c +++ b/Core/gb.c @@ -447,7 +447,7 @@ static void reset_ram(GB_gameboy_t *gb) { switch (gb->model) { case GB_MODEL_CGB_E: - default: + case GB_MODEL_AGB: /* Unverified */ for (unsigned i = 0; i < gb->ram_size; i++) { gb->ram[i] = (random() & 0xFF); } diff --git a/Core/gb.h b/Core/gb.h index 3254624..8cf487d 100644 --- a/Core/gb.h +++ b/Core/gb.h @@ -22,24 +22,22 @@ #define GB_STRUCT_VERSION 13 -typedef enum { #ifdef GB_INTERNAL - GB_MODEL_FAMILY_MASK = 0xF00, - GB_MODEL_DMG_FAMILY = 0x000, +#define GB_MODEL_FAMILY_MASK 0xF00 +#define GB_MODEL_DMG_FAMILY 0x000 +#define GB_MODEL_MGB_FAMILY 0x100 +#define GB_MODEL_CGB_FAMILY 0x200 #endif + +typedef enum { + // GB_MODEL_DMG_0 = 0x000, // GB_MODEL_DMG_A = 0x001, GB_MODEL_DMG_B = 0x002, // GB_MODEL_DMG_C = 0x003, // GB_MODEL_SGB = 0x004, -#ifdef GB_INTERNAL - GB_MODEL_MGB_FAMILY = 0x100, -#endif // GB_MODEL_MGB = 0x100, // GB_MODEL_SGB2 = 0x101, -#ifdef GB_INTERNAL - GB_MODEL_CGB_FAMILY = 0x200, -#endif // GB_MODEL_CGB_0 = 0x200, // GB_MODEL_CGB_A = 0x201, // GB_MODEL_CGB_B = 0x202, diff --git a/Core/memory.c b/Core/memory.c index 5f6a89a..b658fd5 100644 --- a/Core/memory.c +++ b/Core/memory.c @@ -252,12 +252,25 @@ static uint8_t read_high_memory(GB_gameboy_t *gb, uint16_t addr) case GB_MODEL_CGB_E: case GB_MODEL_AGB: return (addr & 0xF0) | ((addr >> 4) & 0xF); - + + /* + case GB_MODEL_CGB_D: + if (addr > 0xfec0) { + addr |= 0xf0; + } + return gb->extra_oam[addr - 0xfea0]; + */ + case GB_MODEL_CGB_C: + /* + case GB_MODEL_CGB_B: + case GB_MODEL_CGB_A: + case GB_MODEL_CGB_0: + */ addr &= ~0x18; return gb->extra_oam[addr - 0xfea0]; - default: + case GB_MODEL_DMG_B: ; } } @@ -544,11 +557,26 @@ static void write_high_memory(GB_gameboy_t *gb, uint16_t addr, uint8_t value) gb->oam[addr & 0xFF] = value; } switch (gb->model) { + /* + case GB_MODEL_CGB_D: + if (addr > 0xfec0) { + addr |= 0xf0; + } + gb->extra_oam[addr - 0xfea0] = value; + break; + */ case GB_MODEL_CGB_C: + /* + case GB_MODEL_CGB_B: + case GB_MODEL_CGB_A: + case GB_MODEL_CGB_0: + */ addr &= ~0x18; gb->extra_oam[addr - 0xfea0] = value; break; - default: + case GB_MODEL_DMG_B: + case GB_MODEL_CGB_E: + case GB_MODEL_AGB: break; } return;