SameBoy | Accurate GB/GBC emulator |
| download: https://git.y1.nz/archives/sameboy.tar.gz | |
| README | Files | Log | Refs | LICENSE |
commit 6f9da353bd06221332007cdeeffbe87216103834 parent 03f4f03661d10a366c2302a4299362878d1aea91 Author: Lior Halphon <LIJI32@gmail.com> Date: Sun, 24 Jul 2022 14:22:49 +0300 Add GBP model to the core (disables bouncing) Diffstat:
| M | Core/gb.c | 4 | ++++ |
| M | Core/gb.h | 4 | ++++ |
| M | Core/joypad.c | 2 | +- |
| M | Core/memory.c | 8 | +++++--- |
| M | Core/save_state.c | 5 | ++++- |
5 files changed, 18 insertions(+), 5 deletions(-)
diff --git a/Core/gb.c b/Core/gb.c @@ -1392,6 +1392,7 @@ static void reset_ram(GB_gameboy_t *gb) case GB_MODEL_MGB: case GB_MODEL_CGB_E: case GB_MODEL_AGB_A: /* Unverified */ + case GB_MODEL_GBP_A: for (unsigned i = 0; i < gb->ram_size; i++) { gb->ram[i] = GB_random(); } @@ -1456,6 +1457,7 @@ static void reset_ram(GB_gameboy_t *gb) case GB_MODEL_CGB_D: case GB_MODEL_CGB_E: case GB_MODEL_AGB_A: + case GB_MODEL_GBP_A: for (unsigned i = 0; i < sizeof(gb->hram); i++) { gb->hram[i] = GB_random(); } @@ -1489,6 +1491,7 @@ static void reset_ram(GB_gameboy_t *gb) case GB_MODEL_CGB_D: case GB_MODEL_CGB_E: case GB_MODEL_AGB_A: + case GB_MODEL_GBP_A: /* Zero'd out by boot ROM anyway */ break; @@ -1603,6 +1606,7 @@ static void request_boot_rom(GB_gameboy_t *gb) type = GB_BOOT_ROM_CGB; break; case GB_MODEL_AGB_A: + case GB_MODEL_GBP_A: type = GB_BOOT_ROM_AGB; break; } diff --git a/Core/gb.h b/Core/gb.h @@ -33,6 +33,7 @@ #define GB_MODEL_DMG_FAMILY 0x000 #define GB_MODEL_MGB_FAMILY 0x100 #define GB_MODEL_CGB_FAMILY 0x200 +#define GB_MODEL_GBP_BIT 0x20 #define GB_MODEL_PAL_BIT 0x40 #define GB_MODEL_NO_SFC_BIT 0x80 @@ -117,9 +118,12 @@ typedef enum { GB_MODEL_CGB_E = 0x205, // GB_MODEL_AGB_0 = 0x206, GB_MODEL_AGB_A = 0x207, + GB_MODEL_GBP_A = GB_MODEL_AGB_A | GB_MODEL_GBP_BIT, // AGB-A inside a Game Boy Player GB_MODEL_AGB = GB_MODEL_AGB_A, + GB_MODEL_GBP = GB_MODEL_GBP_A, //GB_MODEL_AGB_B = 0x208 //GB_MODEL_AGB_E = 0x209 + //GB_MODEL_GBP_E = GB_MODEL_AGB_E | GB_MODEL_GBP_BIT, // AGB-E inside a Game Boy Player } GB_model_t; enum { diff --git a/Core/joypad.c b/Core/joypad.c @@ -4,7 +4,7 @@ static inline bool should_bounce(GB_gameboy_t *gb) { // Bouncing is super rare on an AGS, so don't emulate it on GB_MODEL_AGB_B (when addeed) - return !GB_is_sgb(gb) && !gb-> no_bouncing_emulation /*&& gb->model != GB_MODEL_AGB_B*/; + return !GB_is_sgb(gb) && !gb-> no_bouncing_emulation && !(gb->model & GB_MODEL_GBP_BIT) /*&& gb->model != GB_MODEL_AGB_B*/; } static inline uint16_t bounce_for_key(GB_gameboy_t *gb, GB_key_t key) diff --git a/Core/memory.c b/Core/memory.c @@ -489,6 +489,7 @@ internal uint8_t GB_read_oam(GB_gameboy_t *gb, uint8_t addr) switch (gb->model) { case GB_MODEL_CGB_E: case GB_MODEL_AGB_A: + case GB_MODEL_GBP_A: return (addr & 0xF0) | (addr >> 4); case GB_MODEL_CGB_D: @@ -1279,6 +1280,7 @@ static void write_oam(GB_gameboy_t *gb, uint8_t addr, uint8_t value) break; case GB_MODEL_CGB_E: case GB_MODEL_AGB_A: + case GB_MODEL_GBP_A: case GB_MODEL_DMG_B: case GB_MODEL_MGB: case GB_MODEL_SGB_NTSC: @@ -1819,11 +1821,11 @@ void GB_hdma_run(GB_gameboy_t *gb) } gb->hdma_current_src++; GB_advance_cycles(gb, cycles); - if (gb->addr_for_hdma_conflict == 0xFFFF /* || (gb->model >= GB_MODEL_AGB_B && gb->cgb_double_speed) */) { + if (gb->addr_for_hdma_conflict == 0xFFFF /* || ((gb->model & ~GB_MODEL_GBP_BIT) >= GB_MODEL_AGB_B && gb->cgb_double_speed) */) { uint16_t addr = (gb->hdma_current_dest++ & 0x1FFF); gb->vram[vram_base + addr] = byte; // TODO: vram_write_blocked might not be the correct timing - if (gb->vram_write_blocked /* && gb->model < GB_MODEL_AGB_B */) { + if (gb->vram_write_blocked /* && (gb->model & ~GB_MODEL_GBP_BIT) < GB_MODEL_AGB_B */) { gb->vram[(vram_base ^ 0x2000) + addr] = byte; } } @@ -1837,7 +1839,7 @@ void GB_hdma_run(GB_gameboy_t *gb) uint16_t addr = (gb->hdma_current_dest & gb->addr_for_hdma_conflict & 0x1FFF); gb->vram[vram_base + addr] = byte; // TODO: vram_write_blocked might not be the correct timing - if (gb->vram_write_blocked /* && gb->model < GB_MODEL_AGB_B */) { + if (gb->vram_write_blocked /* && (gb->model & ~GB_MODEL_GBP_BIT) < GB_MODEL_AGB_B */) { gb->vram[(vram_base ^ 0x2000) + addr] = byte; } } diff --git a/Core/save_state.c b/Core/save_state.c @@ -352,6 +352,7 @@ static bool verify_and_update_state_compatibility(GB_gameboy_t *gb, GB_gameboy_t case GB_MODEL_CGB_D: return true; case GB_MODEL_CGB_E: return true; case GB_MODEL_AGB_A: return true; + case GB_MODEL_GBP_A: return true; } if ((gb->model & GB_MODEL_FAMILY_MASK) == (save->model & GB_MODEL_FAMILY_MASK)) { save->model = gb->model; @@ -633,7 +634,9 @@ static int save_state_internal(GB_gameboy_t *gb, virtual_file_t *file, bool appe case GB_MODEL_CGB_C: bess_core.full_model = BE32('CCC '); break; case GB_MODEL_CGB_D: bess_core.full_model = BE32('CCD '); break; case GB_MODEL_CGB_E: bess_core.full_model = BE32('CCE '); break; - case GB_MODEL_AGB_A: bess_core.full_model = BE32('CAA '); break; + case GB_MODEL_AGB_A: + case GB_MODEL_GBP_A: + bess_core.full_model = BE32('CAA '); break; } bess_core.pc = LE16(gb->pc);
This webpage is intended to be an accessible preview of this repository. To get a fuller picture, clone it and use the git CLI.