diff --git a/Cocoa/Preferences.xib b/Cocoa/Preferences.xib index dcaa161..706111e 100644 --- a/Cocoa/Preferences.xib +++ b/Cocoa/Preferences.xib @@ -326,11 +326,11 @@ - + - + @@ -339,7 +339,7 @@ - + @@ -348,7 +348,7 @@ - + @@ -357,7 +357,7 @@ - + @@ -366,7 +366,7 @@ - + @@ -385,7 +385,7 @@ - + @@ -394,19 +394,19 @@ - + - + - - - - - - + + + + + + @@ -415,7 +415,7 @@ - + @@ -424,11 +424,11 @@ - + - + @@ -446,7 +446,7 @@ - + @@ -465,7 +465,7 @@ - + @@ -489,7 +489,7 @@ - + @@ -512,8 +512,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + - + diff --git a/Core/apu.c b/Core/apu.c index 572969a..77f2da9 100644 --- a/Core/apu.c +++ b/Core/apu.c @@ -21,7 +21,7 @@ static void refresh_channel(GB_gameboy_t *gb, unsigned index, unsigned cycles_of bool GB_apu_is_DAC_enabled(GB_gameboy_t *gb, unsigned index) { - if (gb->model >= GB_MODEL_AGB) { + if (gb->model > GB_MODEL_CGB_E) { /* On the AGB, mixing is done digitally, so there are no per-channel DACs. Instead, all channels are summed digital regardless of whatever the DAC state would be on a CGB or earlier model. */ @@ -68,12 +68,12 @@ static uint8_t agb_bias_for_channel(GB_gameboy_t *gb, unsigned index) static void update_sample(GB_gameboy_t *gb, unsigned index, int8_t value, unsigned cycles_offset) { - if (gb->model >= GB_MODEL_AGB && index == GB_WAVE) { + if (gb->model > GB_MODEL_CGB_E && index == GB_WAVE) { /* For some reason, channel 3 is inverted on the AGB */ value ^= 0xF; } - if (gb->model >= GB_MODEL_AGB) { + if (gb->model > GB_MODEL_CGB_E) { /* On the AGB, because no analog mixing is done, the behavior of NR51 is a bit different. A channel that is not connected to a terminal is idenitcal to a connected channel playing PCM sample 0. */ @@ -145,7 +145,7 @@ static signed interference(GB_gameboy_t *gb) /* These aren't scientifically measured, but based on ear based on several recordings */ signed ret = 0; if (gb->halted) { - if (gb->model != GB_MODEL_AGB) { + if (gb->model <= GB_MODEL_CGB_E) { ret -= MAX_CH_AMP / 5; } else { @@ -154,7 +154,7 @@ static signed interference(GB_gameboy_t *gb) } if (gb->io_registers[GB_IO_LCDC] & 0x80) { ret += MAX_CH_AMP / 7; - if ((gb->io_registers[GB_IO_STAT] & 3) == 3 && gb->model != GB_MODEL_AGB) { + if ((gb->io_registers[GB_IO_STAT] & 3) == 3 && gb->model <= GB_MODEL_CGB_E) { ret += MAX_CH_AMP / 14; } else if ((gb->io_registers[GB_IO_STAT] & 3) == 1) { @@ -166,7 +166,7 @@ static signed interference(GB_gameboy_t *gb) ret += MAX_CH_AMP / 10; } - if (GB_is_cgb(gb) && gb->model < GB_MODEL_AGB && (gb->io_registers[GB_IO_RP] & 1)) { + if (GB_is_cgb(gb) && gb->model <= GB_MODEL_CGB_E && (gb->io_registers[GB_IO_RP] & 1)) { ret += MAX_CH_AMP / 10; } @@ -186,7 +186,7 @@ static void render(GB_gameboy_t *gb) unrolled for (unsigned i = 0; i < GB_N_CHANNELS; i++) { double multiplier = CH_STEP; - if (gb->model < GB_MODEL_AGB) { + if (gb->model <= GB_MODEL_CGB_E) { if (!GB_apu_is_DAC_enabled(gb, i)) { gb->apu_output.dac_discharge[i] -= ((double) DAC_DECAY_SPEED) / gb->apu_output.sample_rate; if (gb->apu_output.dac_discharge[i] < 0) { @@ -284,7 +284,7 @@ static void render(GB_gameboy_t *gb) static void update_square_sample(GB_gameboy_t *gb, unsigned index) { if (gb->apu.square_channels[index].sample_surpressed) { - if (gb->model >= GB_MODEL_AGB) { + if (gb->model > GB_MODEL_CGB_E) { update_sample(gb, index, gb->apu.samples[index], 0); } return; @@ -533,7 +533,7 @@ void GB_apu_div_event(GB_gameboy_t *gb) if (gb->apu.wave_channel.length_enabled) { if (gb->apu.wave_channel.pulse_length) { if (!--gb->apu.wave_channel.pulse_length) { - if (gb->apu.is_active[GB_WAVE] && gb->model == GB_MODEL_AGB) { + if (gb->apu.is_active[GB_WAVE] && gb->model > GB_MODEL_CGB_E) { if (gb->apu.wave_channel.sample_countdown == 0) { gb->apu.wave_channel.current_sample_byte = gb->io_registers[GB_IO_WAV_START + (((gb->apu.wave_channel.current_sample_index + 1) & 0xF) >> 1)]; @@ -612,7 +612,7 @@ void GB_apu_run(GB_gameboy_t *gb, bool force) (gb->apu.apu_cycles > 0x1000) || (gb->apu_output.sample_cycles >= clock_rate) || (gb->apu.square_sweep_calculate_countdown || gb->apu.channel_1_restart_hold) || - (gb->model < GB_MODEL_AGB && (gb->apu.wave_channel.bugged_read_countdown || (gb->apu.wave_channel.enable && gb->apu.wave_channel.pulsed)))) { + (gb->model <= GB_MODEL_CGB_E && (gb->apu.wave_channel.bugged_read_countdown || (gb->apu.wave_channel.enable && gb->apu.wave_channel.pulsed)))) { force = true; } if (!force) { @@ -731,7 +731,7 @@ void GB_apu_run(GB_gameboy_t *gb, bool force) gb->apu.wave_channel.wave_form_just_read = false; } } - else if (gb->apu.wave_channel.enable && gb->apu.wave_channel.pulsed && gb->model < GB_MODEL_AGB) { + else if (gb->apu.wave_channel.enable && gb->apu.wave_channel.pulsed && gb->model <= GB_MODEL_CGB_E) { uint16_t cycles_left = cycles; while (unlikely(cycles_left > gb->apu.wave_channel.sample_countdown)) { cycles_left -= gb->apu.wave_channel.sample_countdown + 1; @@ -849,7 +849,7 @@ uint8_t GB_apu_read(GB_gameboy_t *gb, uint8_t reg) if (!GB_is_cgb(gb) && !gb->apu.wave_channel.wave_form_just_read) { return 0xFF; } - if (gb->model == GB_MODEL_AGB) { + if (gb->model > GB_MODEL_CGB_E) { return 0xFF; } reg = GB_IO_WAV_START + gb->apu.wave_channel.current_sample_index / 2; @@ -964,7 +964,7 @@ static inline uint16_t effective_channel4_counter(GB_gameboy_t *gb) effective_counter |= 0x10; } break; - case GB_MODEL_AGB: + case GB_MODEL_AGB_A: /* TODO: AGBs are not affected, but AGSes are. They don't seem to follow a simple pattern like the other revisions. */ /* For the most part, AGS seems to do: @@ -992,7 +992,7 @@ void GB_apu_write(GB_gameboy_t *gb, uint8_t reg, uint8_t value) } if (reg >= GB_IO_WAV_START && reg <= GB_IO_WAV_END && gb->apu.is_active[GB_WAVE]) { - if ((!GB_is_cgb(gb) && !gb->apu.wave_channel.wave_form_just_read) || gb->model == GB_MODEL_AGB) { + if ((!GB_is_cgb(gb) && !gb->apu.wave_channel.wave_form_just_read) || gb->model > GB_MODEL_CGB_E) { return; } reg = GB_IO_WAV_START + gb->apu.wave_channel.current_sample_index / 2; @@ -1226,7 +1226,7 @@ void GB_apu_write(GB_gameboy_t *gb, uint8_t reg, uint8_t value) gb->apu.wave_channel.pulsed = false; if (gb->apu.is_active[GB_WAVE]) { // Todo: I assume this happens on pre-CGB models; test this with an audible test - if (gb->apu.wave_channel.sample_countdown == 0 && gb->model < GB_MODEL_AGB) { + if (gb->apu.wave_channel.sample_countdown == 0 && gb->model <= GB_MODEL_CGB_E) { gb->apu.wave_channel.current_sample_byte = gb->io_registers[GB_IO_WAV_START + (gb->pc & 0xF)]; } else if (gb->apu.wave_channel.wave_form_just_read && gb->model <= GB_MODEL_CGB_C) { diff --git a/Core/display.c b/Core/display.c index cd17b31..fa92a10 100644 --- a/Core/display.c +++ b/Core/display.c @@ -159,7 +159,7 @@ void GB_display_vblank(GB_gameboy_t *gb) GB_borrow_sgb_border(gb); uint32_t border_colors[16 * 4]; - if (!gb->has_sgb_border && GB_is_cgb(gb) && gb->model != GB_MODEL_AGB) { + if (!gb->has_sgb_border && GB_is_cgb(gb) && gb->model <= GB_MODEL_CGB_E) { uint16_t colors[] = { 0x2095, 0x5129, 0x1EAF, 0x1EBA, 0x4648, 0x30DA, 0x69AD, 0x2B57, 0x2B5D, 0x632C, @@ -277,7 +277,7 @@ uint32_t GB_convert_rgb15(GB_gameboy_t *gb, uint16_t color, bool for_border) b = scale_channel_with_curve_sgb(b); } else { - bool agb = gb->model == GB_MODEL_AGB; + bool agb = gb->model > GB_MODEL_CGB_E; r = agb? scale_channel_with_curve_agb(r) : scale_channel_with_curve(r); g = agb? scale_channel_with_curve_agb(g) : scale_channel_with_curve(g); b = agb? scale_channel_with_curve_agb(b) : scale_channel_with_curve(b); diff --git a/Core/gb.c b/Core/gb.c index adeed1e..a73d870 100644 --- a/Core/gb.c +++ b/Core/gb.c @@ -121,7 +121,7 @@ static void load_default_border(GB_gameboy_t *gb) } #endif - if (gb->model == GB_MODEL_AGB) { + if (gb->model > GB_MODEL_CGB_E) { #include "graphics/agb_border.inc" LOAD_BORDER(); } @@ -1378,7 +1378,7 @@ static void reset_ram(GB_gameboy_t *gb) switch (gb->model) { case GB_MODEL_MGB: case GB_MODEL_CGB_E: - case GB_MODEL_AGB: /* Unverified */ + case GB_MODEL_AGB_A: /* Unverified */ for (unsigned i = 0; i < gb->ram_size; i++) { gb->ram[i] = GB_random(); } @@ -1442,7 +1442,7 @@ static void reset_ram(GB_gameboy_t *gb) case GB_MODEL_CGB_C: case GB_MODEL_CGB_D: case GB_MODEL_CGB_E: - case GB_MODEL_AGB: + case GB_MODEL_AGB_A: for (unsigned i = 0; i < sizeof(gb->hram); i++) { gb->hram[i] = GB_random(); } @@ -1475,8 +1475,8 @@ static void reset_ram(GB_gameboy_t *gb) case GB_MODEL_CGB_C: case GB_MODEL_CGB_D: case GB_MODEL_CGB_E: - case GB_MODEL_AGB: - /* Zero'd out by boot ROM anyway, extra OAM no accessible */ + case GB_MODEL_AGB_A: + /* Zero'd out by boot ROM anyway */ break; case GB_MODEL_DMG_B: @@ -1509,7 +1509,7 @@ static void reset_ram(GB_gameboy_t *gb) case GB_MODEL_CGB_C: case GB_MODEL_CGB_D: case GB_MODEL_CGB_E: - case GB_MODEL_AGB: + case GB_MODEL_AGB_A: /* Initialized by CGB-A and newer, 0s in CGB-0 */ break; case GB_MODEL_MGB: { @@ -1589,7 +1589,7 @@ static void request_boot_rom(GB_gameboy_t *gb) case GB_MODEL_CGB_E: type = GB_BOOT_ROM_CGB; break; - case GB_MODEL_AGB: + case GB_MODEL_AGB_A: type = GB_BOOT_ROM_AGB; break; } diff --git a/Core/gb.h b/Core/gb.h index 09ebb77..6ef3a6c 100644 --- a/Core/gb.h +++ b/Core/gb.h @@ -115,7 +115,10 @@ typedef enum { GB_MODEL_CGB_C = 0x203, GB_MODEL_CGB_D = 0x204, GB_MODEL_CGB_E = 0x205, - GB_MODEL_AGB = 0x206, + // GB_MODEL_AGB_0 = 0x206, + GB_MODEL_AGB_A = 0x207, + GB_MODEL_AGB = GB_MODEL_AGB_A, + //GB_MODEL_AGB_B = 0x208 } GB_model_t; enum { diff --git a/Core/memory.c b/Core/memory.c index 3a9f8fd..a5646b6 100644 --- a/Core/memory.c +++ b/Core/memory.c @@ -562,7 +562,7 @@ static uint8_t read_high_memory(GB_gameboy_t *gb, uint16_t addr) switch (gb->model) { case GB_MODEL_CGB_E: - case GB_MODEL_AGB: + case GB_MODEL_AGB_A: return (addr & 0xF0) | ((addr >> 4) & 0xF); case GB_MODEL_CGB_D: @@ -694,7 +694,7 @@ static uint8_t read_high_memory(GB_gameboy_t *gb, uint16_t addr) if (gb->model != GB_MODEL_CGB_E) { ret |= 0x10; } - if (((gb->io_registers[GB_IO_RP] & 0xC0) == 0xC0 && gb->effective_ir_input) && gb->model != GB_MODEL_AGB) { + if (((gb->io_registers[GB_IO_RP] & 0xC0) == 0xC0 && gb->effective_ir_input) && gb->model <= GB_MODEL_CGB_E) { ret &= ~2; } return ret; @@ -1240,7 +1240,7 @@ static void write_high_memory(GB_gameboy_t *gb, uint16_t addr, uint8_t value) gb->extra_oam[addr - 0xfea0] = value; break; case GB_MODEL_CGB_E: - case GB_MODEL_AGB: + case GB_MODEL_AGB_A: break; case GB_MODEL_DMG_B: case GB_MODEL_MGB: diff --git a/Core/save_state.c b/Core/save_state.c index 3695edb..55f334d 100644 --- a/Core/save_state.c +++ b/Core/save_state.c @@ -323,7 +323,7 @@ static bool verify_and_update_state_compatibility(GB_gameboy_t *gb, GB_gameboy_t case GB_MODEL_CGB_C: return true; case GB_MODEL_CGB_D: return true; case GB_MODEL_CGB_E: return true; - case GB_MODEL_AGB: return true; + case GB_MODEL_AGB_A: return true; } if ((gb->model & GB_MODEL_FAMILY_MASK) == (save->model & GB_MODEL_FAMILY_MASK)) { save->model = gb->model; @@ -576,7 +576,7 @@ 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: bess_core.full_model = BE32('CA '); break; // SameBoy doesn't emulate a specific AGB revision yet + case GB_MODEL_AGB_A: bess_core.full_model = BE32('CAA '); break; } bess_core.pc = LE16(gb->pc); diff --git a/Core/timing.c b/Core/timing.c index ec10526..ad875bc 100644 --- a/Core/timing.c +++ b/Core/timing.c @@ -113,7 +113,7 @@ void GB_timing_sync(GB_gameboy_t *gb) static void ir_run(GB_gameboy_t *gb, uint32_t cycles) { - if ((gb->model == GB_MODEL_AGB || !gb->cgb_mode) && gb->cartridge_type->mbc_type != GB_HUC1 && gb->cartridge_type->mbc_type != GB_HUC3) return; + if ((gb->model > GB_MODEL_CGB_E || !gb->cgb_mode) && gb->cartridge_type->mbc_type != GB_HUC1 && gb->cartridge_type->mbc_type != GB_HUC3) return; if (gb->infrared_input || gb->cart_ir || (gb->io_registers[GB_IO_RP] & 1)) { gb->ir_sensor += cycles; if (gb->ir_sensor > IR_MAX) { diff --git a/SDL/main.c b/SDL/main.c index 2467126..a3be18f 100644 --- a/SDL/main.c +++ b/SDL/main.c @@ -622,7 +622,7 @@ restart: { [MODEL_DMG] = GB_MODEL_DMG_B, [MODEL_CGB] = GB_MODEL_CGB_E, - [MODEL_AGB] = GB_MODEL_AGB, + [MODEL_AGB] = GB_MODEL_AGB_A, [MODEL_MGB] = GB_MODEL_MGB, [MODEL_SGB] = (GB_model_t []) { diff --git a/libretro/libretro.c b/libretro/libretro.c index 94b82a6..f793eb4 100644 --- a/libretro/libretro.c +++ b/libretro/libretro.c @@ -61,7 +61,7 @@ static const GB_model_t libretro_to_internal_model[] = [MODEL_DMG_B] = GB_MODEL_DMG_B, [MODEL_CGB_C] = GB_MODEL_CGB_C, [MODEL_CGB_E] = GB_MODEL_CGB_E, - [MODEL_AGB] = GB_MODEL_AGB, + [MODEL_AGB] = GB_MODEL_AGB_A, [MODEL_SGB_PAL] = GB_MODEL_SGB_PAL, [MODEL_SGB_NTSC] = GB_MODEL_SGB_NTSC, [MODEL_SGB2] = GB_MODEL_SGB2