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