From b7426f93c0b1082be51e920a2db6a81fd139752d Mon Sep 17 00:00:00 2001 From: Lior Halphon Date: Fri, 20 Jul 2018 23:23:47 +0300 Subject: [PATCH] Randomize object palettes. Slightly more accurate emulation of FF4C. --- Core/gb.c | 17 +++++++++++++++++ Core/memory.c | 3 ++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/Core/gb.c b/Core/gb.c index 8ce8326..ff5851e 100644 --- a/Core/gb.c +++ b/Core/gb.c @@ -344,7 +344,13 @@ void GB_set_rgb_encode_callback(GB_gameboy_t *gb, GB_rgb_encode_callback_t callb gb->sprite_palettes_rgb[7] = gb->sprite_palettes_rgb[3] = gb->background_palettes_rgb[3] = callback(gb, 0, 0, 0); } + gb->rgb_encode_callback = callback; + + for (unsigned i = 0; i < 32; i++) { + GB_palette_changed(gb, true, i * 2); + GB_palette_changed(gb, false, i * 2); + } } void GB_set_infrared_callback(GB_gameboy_t *gb, GB_infrared_callback_t callback) @@ -489,6 +495,17 @@ static void reset_ram(GB_gameboy_t *gb) for (unsigned i = 0; i < sizeof(gb->extra_oam); i++) { gb->extra_oam[i] = (random() & 0xFF); } + + if (GB_is_cgb(gb)) { + for (unsigned i = 0; i < 64; i++) { + gb->background_palettes_data[i] = random() & 0xFF; /* Doesn't really matter as the boot ROM overrides it anyway*/ + gb->sprite_palettes_data[i] = random() & 0xFF; + } + for (unsigned i = 0; i < 32; i++) { + GB_palette_changed(gb, true, i * 2); + GB_palette_changed(gb, false, i * 2); + } + } } void GB_reset(GB_gameboy_t *gb) diff --git a/Core/memory.c b/Core/memory.c index b658fd5..412af34 100644 --- a/Core/memory.c +++ b/Core/memory.c @@ -734,8 +734,9 @@ static void write_high_memory(GB_gameboy_t *gb, uint16_t addr, uint8_t value) return; case GB_IO_DMG_EMULATION: + GB_log(gb, "4c = %x\n", value); if (GB_is_cgb(gb) && !gb->boot_rom_finished) { - gb->cgb_mode = value != 4; /* The real "contents" of this register aren't quite known yet. */ + gb->cgb_mode = !(value & 0xC); /* The real "contents" of this register aren't quite known yet. */ } return;