From bc3cab7dfac247c9dff9f460ade2afeeee4b274d Mon Sep 17 00:00:00 2001 From: Lior Halphon Date: Wed, 21 Sep 2016 02:15:02 +0300 Subject: [PATCH 1/4] Forbid pressing two opposing direction keys. Fixes Pocket Bomberman (U). --- Core/joypad.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Core/joypad.c b/Core/joypad.c index 89bcba8..bf3e120 100644 --- a/Core/joypad.c +++ b/Core/joypad.c @@ -22,6 +22,13 @@ void GB_update_joyp(GB_gameboy_t *gb) for (uint8_t i = 0; i < 4; i++) { gb->io_registers[GB_IO_JOYP] |= (!gb->keys[i]) << i; } + /* Forbid pressing two opposing keys, this breaks a lot of games; even if it's somewhat possible. */ + if (!(gb->io_registers[GB_IO_JOYP] & 1)) { + gb->io_registers[GB_IO_JOYP] |= 2; + } + if (!(gb->io_registers[GB_IO_JOYP] & 4)) { + gb->io_registers[GB_IO_JOYP] |= 8; + } break; case 1: From 09917053798839a251acbd91a4fb097d74aa2a30 Mon Sep 17 00:00:00 2001 From: Lior Halphon Date: Thu, 22 Sep 2016 01:51:09 +0300 Subject: [PATCH 2/4] Refined HALT bug behavior, fixed Robocop --- Core/gb.h | 1 + Core/z80_cpu.c | 15 +++++++++------ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/Core/gb.h b/Core/gb.h index b1326f8..e8d929f 100644 --- a/Core/gb.h +++ b/Core/gb.h @@ -226,6 +226,7 @@ typedef struct GB_gameboy_s { bool stopped; bool boot_rom_finished; bool ime_toggle; /* ei (and di in CGB) have delayed effects.*/ + bool halt_bug; /* Misc state*/ /* IR */ diff --git a/Core/z80_cpu.c b/Core/z80_cpu.c index b664ace..c5a3528 100644 --- a/Core/z80_cpu.c +++ b/Core/z80_cpu.c @@ -684,6 +684,11 @@ static void halt(GB_gameboy_t *gb, uint8_t opcode) { GB_advance_cycles(gb, 4); gb->halted = true; + /* Despite what some online documentations say, the HALT bug also happens on a CGB, in both CGB and DMG modes. */ + if (!gb->ime && (gb->interrupt_enable & gb->io_registers[GB_IO_IF] & 0x1F) != 0) { + gb->halted = false; + gb->halt_bug = true; + } } static void ret_cc(GB_gameboy_t *gb, uint8_t opcode) @@ -1332,12 +1337,9 @@ static GB_opcode_t *opcodes[256] = { void GB_cpu_run(GB_gameboy_t *gb) { gb->vblank_just_occured = false; - bool interrupt = gb->interrupt_enable & gb->io_registers[GB_IO_IF]; - bool halt_bug = false; + bool interrupt = gb->interrupt_enable & gb->io_registers[GB_IO_IF] & 0x1F; if (interrupt) { - /* Despite what some online documentations say, the HALT bug also happens on a CGB, in both CGB and DMG modes. */ - halt_bug = gb->halted; gb->halted = false; } @@ -1354,7 +1356,7 @@ void GB_cpu_run(GB_gameboy_t *gb) if (effecitve_ime && interrupt) { uint8_t interrupt_bit = 0; - uint8_t interrupt_queue = gb->interrupt_enable & gb->io_registers[GB_IO_IF]; + uint8_t interrupt_queue = gb->interrupt_enable & gb->io_registers[GB_IO_IF] & 0x1F; while (!(interrupt_queue & 1)) { interrupt_queue >>= 1; interrupt_bit++; @@ -1367,8 +1369,9 @@ void GB_cpu_run(GB_gameboy_t *gb) } else if(!gb->halted && !gb->stopped) { uint8_t opcode = GB_read_memory(gb, gb->pc++); - if (halt_bug) { + if (gb->halt_bug) { gb->pc--; + gb->halt_bug = false; } opcodes[opcode](gb, opcode); } From 42c01a21b21a4c8984e2cfe7922348739e7f33bf Mon Sep 17 00:00:00 2001 From: Lior Halphon Date: Thu, 22 Sep 2016 01:52:40 +0300 Subject: [PATCH 3/4] Fixed crash when accessing MBC RAM on a cartridge that "has RAM", but it's 0-sized. --- Core/memory.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Core/memory.c b/Core/memory.c index 8faa0df..cef9559 100644 --- a/Core/memory.c +++ b/Core/memory.c @@ -74,7 +74,7 @@ static uint8_t read_vram(GB_gameboy_t *gb, uint16_t addr) static uint8_t read_mbc_ram(GB_gameboy_t *gb, uint16_t addr) { - if (!gb->mbc_ram_enable) return 0xFF; + if (!gb->mbc_ram_enable || !gb->mbc_ram_size) return 0xFF; if (gb->cartridge_type->has_rtc && gb->mbc_ram_bank >= 8 && gb->mbc_ram_bank <= 0xC) { /* RTC read */ @@ -314,7 +314,7 @@ static void write_vram(GB_gameboy_t *gb, uint16_t addr, uint8_t value) static void write_mbc_ram(GB_gameboy_t *gb, uint16_t addr, uint8_t value) { - if (!gb->mbc_ram_enable) return; + if (!gb->mbc_ram_enable || !gb->mbc_ram_size) return; if (gb->cartridge_type->has_rtc && gb->mbc_ram_bank >= 8 && gb->mbc_ram_bank <= 0xC) { /* RTC read */ From 52ed2ca55e02cf3e7386d849d900e6ab0a3c5307 Mon Sep 17 00:00:00 2001 From: Lior Halphon Date: Fri, 23 Sep 2016 18:30:07 +0300 Subject: [PATCH 4/4] Corrected BG enable's behavior (Fixes visual glitch with Krusty's Funhouse) --- Core/display.c | 38 ++++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/Core/display.c b/Core/display.c index 8f12f23..580ea90 100755 --- a/Core/display.c +++ b/Core/display.c @@ -144,31 +144,29 @@ static uint32_t get_pixel(GB_gameboy_t *gb, uint8_t x, uint8_t y) return gb->sprite_palletes_rgb[sprite_palette * 4 + sprite_pixel]; } - if (!bg_enabled) { - return gb->background_palletes_rgb[0]; - } + if (bg_enabled) { + if (gb->io_registers[GB_IO_LCDC] & 0x10) { + tile_address = tile * 0x10; + } + else { + tile_address = (int8_t) tile * 0x10 + 0x1000; + } + if (attributes & 0x8) { + tile_address += 0x2000; + } - if (gb->io_registers[GB_IO_LCDC] & 0x10) { - tile_address = tile * 0x10; - } - else { - tile_address = (int8_t) tile * 0x10 + 0x1000; - } - if (attributes & 0x8) { - tile_address += 0x2000; - } + if (attributes & 0x20) { + x = ~x; + } - if (attributes & 0x20) { - x = ~x; - } + if (attributes & 0x40) { + y = ~y; + } - if (attributes & 0x40) { - y = ~y; + background_pixel = (((gb->vram[tile_address + (y & 7) * 2 ] >> ((~x)&7)) & 1 ) | + ((gb->vram[tile_address + (y & 7) * 2 + 1] >> ((~x)&7)) & 1) << 1 ); } - background_pixel = (((gb->vram[tile_address + (y & 7) * 2 ] >> ((~x)&7)) & 1 ) | - ((gb->vram[tile_address + (y & 7) * 2 + 1] >> ((~x)&7)) & 1) << 1 ); - if (priority && sprite_pixel && !background_pixel) { if (!gb->cgb_mode) { sprite_pixel = (gb->io_registers[use_obp1? GB_IO_OBP1:GB_IO_OBP0] >> (sprite_pixel << 1)) & 3;