Add GBP model to the core (disables bouncing)

This commit is contained in:
Lior Halphon 2022-07-24 14:22:49 +03:00
parent 03f4f03661
commit 6f9da353bd
5 changed files with 18 additions and 5 deletions

View File

@ -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;
}

View File

@ -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 {

View File

@ -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)

View File

@ -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;
}
}

View File

@ -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);