Skip to content

Commit 81c4b3f

Browse files
committed
Add safe VDC defaults option for homebrew compatibility. #101
1 parent 7878b6f commit 81c4b3f

File tree

10 files changed

+58
-2
lines changed

10 files changed

+58
-2
lines changed

platforms/libretro/libretro.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -666,6 +666,7 @@ static void set_variabless(void)
666666
{ "geargrafx_lowpass_speed_716", "Video LPF HuC6270 7.16 MHz; Enabled|Disabled" },
667667
{ "geargrafx_lowpass_speed_108", "Video LPF HuC6270 10.8 MHz; Enabled|Disabled" },
668668
{ "geargrafx_no_sprite_limit", "No Sprite Limit; Disabled|Enabled" },
669+
{ "geargrafx_safe_vdc_defaults", "Safe VDC Defaults (Homebrew); Disabled|Enabled" },
669670
{ "geargrafx_backup_ram", "Backup RAM (restart); Enabled|Disabled" },
670671
{ "geargrafx_deterministic_netplay", "Deterministic Netplay; Disabled|Enabled" },
671672
{ "geargrafx_cdrom_type", "CD-ROM (restart); Auto|Standard|Super CD-ROM|Arcade CD-ROM" },
@@ -990,6 +991,15 @@ static void check_variables(void)
990991
core->GetHuC6270_2()->SetNoSpriteLimit(strcmp(var.value, "Enabled") == 0);
991992
}
992993

994+
var.key = "geargrafx_safe_vdc_defaults";
995+
var.value = NULL;
996+
997+
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
998+
{
999+
core->GetHuC6270_1()->SetSafeDefaults(strcmp(var.value, "Enabled") == 0);
1000+
core->GetHuC6270_2()->SetSafeDefaults(strcmp(var.value, "Enabled") == 0);
1001+
}
1002+
9931003
var.key = "geargrafx_avenue_pad_3_switch";
9941004
var.value = NULL;
9951005

platforms/shared/desktop/config.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,7 @@ void config_read(void)
351351
config_video.fps = read_bool("Video", "FPS", false);
352352
config_video.bilinear = read_bool("Video", "Bilinear", false);
353353
config_video.sprite_limit = read_bool("Video", "SpriteLimit", false);
354+
config_video.safe_vdc_defaults = read_bool("Video", "SafeVdcDefaults", false);
354355
config_video.mix_frames = read_bool("Video", "MixFrames", true);
355356
config_video.mix_frames_intensity = read_float("Video", "MixFramesIntensity", 0.50f);
356357
config_video.scanlines = read_bool("Video", "Scanlines", true);
@@ -619,6 +620,7 @@ void config_write(void)
619620
write_bool("Video", "FPS", config_video.fps);
620621
write_bool("Video", "Bilinear", config_video.bilinear);
621622
write_bool("Video", "SpriteLimit", config_video.sprite_limit);
623+
write_bool("Video", "SafeVdcDefaults", config_video.safe_vdc_defaults);
622624
write_bool("Video", "MixFrames", config_video.mix_frames);
623625
write_float("Video", "MixFramesIntensity", config_video.mix_frames_intensity);
624626
write_bool("Video", "Scanlines", config_video.scanlines);

platforms/shared/desktop/config.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ struct config_Video
8686
bool fps = false;
8787
bool bilinear = false;
8888
bool sprite_limit = false;
89+
bool safe_vdc_defaults = false;
8990
bool mix_frames = true;
9091
float mix_frames_intensity = 0.50f;
9192
bool scanlines = true;

platforms/shared/desktop/emu.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -514,6 +514,12 @@ void emu_video_no_sprite_limit(bool enabled)
514514
geargrafx->GetHuC6270_2()->SetNoSpriteLimit(enabled);
515515
}
516516

517+
void emu_set_safe_vdc_defaults(bool enabled)
518+
{
519+
geargrafx->GetHuC6270_1()->SetSafeDefaults(enabled);
520+
geargrafx->GetHuC6270_2()->SetSafeDefaults(enabled);
521+
}
522+
517523
void emu_set_overscan(int overscan)
518524
{
519525
geargrafx->GetHuC6260()->SetOverscan(overscan == 0 ? false : true);

platforms/shared/desktop/emu.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ EXTERN void emu_debug_set_callback(GeargrafxCore::GG_Debug_Callback callback);
104104
EXTERN void emu_set_palette(int palette);
105105
EXTERN void emu_set_custom_palette(const u8* data);
106106
EXTERN void emu_video_no_sprite_limit(bool enabled);
107+
EXTERN void emu_set_safe_vdc_defaults(bool enabled);
107108
EXTERN void emu_set_overscan(int overscan);
108109
EXTERN void emu_set_scanline_start_end(int start, int end);
109110
EXTERN void emu_set_lowpass_filter(bool enabled, float intensity, float cutoff_mhz, bool speed_5_36, bool speed_7_16, bool speed_10_8);

platforms/shared/desktop/gui.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ bool gui_init(void)
115115
emu_audio_adpcm_volume(config_audio.adpcm_volume);
116116
emu_set_palette(config_video.palette);
117117
emu_video_no_sprite_limit(config_video.sprite_limit);
118+
emu_set_safe_vdc_defaults(config_video.safe_vdc_defaults);
118119
emu_set_overscan(config_debug.debug ? 0 : config_video.overscan);
119120
emu_set_scanline_start_end(
120121
config_debug.debug ? 0 : config_video.scanline_start,

platforms/shared/desktop/gui_menus.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -808,6 +808,21 @@ static void menu_video(void)
808808
emu_video_no_sprite_limit(config_video.sprite_limit);
809809
}
810810

811+
if (ImGui::MenuItem("Safe VDC Defaults", "", &config_video.safe_vdc_defaults))
812+
{
813+
emu_set_safe_vdc_defaults(config_video.safe_vdc_defaults);
814+
}
815+
if (ImGui::IsItemHovered())
816+
{
817+
ImGui::BeginTooltip();
818+
ImGui::Text("Enable safe VDC register defaults on reset.");
819+
ImGui::Text("Useful for homebrew games that don't initialize");
820+
ImGui::Text("their own display timing registers.");
821+
ImGui::EndTooltip();
822+
}
823+
824+
ImGui::Separator();
825+
811826
ImGui::MenuItem("Bilinear Filtering", "", &config_video.bilinear);
812827

813828
if (ImGui::BeginMenu("Screen Ghosting"))

src/huc6270.cpp

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ HuC6270::HuC6270(HuC6280* huC6280)
3434
m_state.VPOS = &m_vpos;
3535
m_state.V_STATE = &m_v_state;
3636
m_state.H_STATE = &m_h_state;
37+
m_no_sprite_limit = false;
38+
m_safe_defaults = false;
3739
}
3840

3941
HuC6270::~HuC6270()
@@ -51,8 +53,19 @@ void HuC6270::Init(HuC6260* huC6260, HuC6202* huC6202, GG_Input_Pump_Fn input_pu
5153
void HuC6270::Reset()
5254
{
5355
memset(m_register, 0, sizeof(m_register));
54-
m_register[HUC6270_REG_HDR] = 0x1F;
55-
m_register[HUC6270_REG_VDR] = 239;
56+
if (m_safe_defaults)
57+
{
58+
m_register[HUC6270_REG_HSR] = 0x0202;
59+
m_register[HUC6270_REG_HDR] = 0x041F;
60+
m_register[HUC6270_REG_VSR] = 0x0F02;
61+
m_register[HUC6270_REG_VDR] = 0x00EF;
62+
m_register[HUC6270_REG_VCR] = 0x0004;
63+
}
64+
else
65+
{
66+
m_register[HUC6270_REG_HDR] = 0x1F;
67+
m_register[HUC6270_REG_VDR] = 239;
68+
}
5669

5770
m_address_register = 0;
5871
m_status_register = 0;

src/huc6270.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ class HuC6270
8585
u16* GetVRAM();
8686
u16* GetSAT();
8787
void SetNoSpriteLimit(bool no_sprite_limit);
88+
void SetSafeDefaults(bool safe_defaults);
8889
void SaveState(std::ostream& stream);
8990
void LoadState(std::istream& stream);
9091

@@ -146,6 +147,7 @@ class HuC6270
146147
u16 m_line_buffer_sprites[HUC6270_MAX_BACKGROUND_WIDTH] = {};
147148
s32 m_line_buffer_index;
148149
bool m_no_sprite_limit;
150+
bool m_safe_defaults;
149151
s32 m_sprite_count;
150152
bool m_sprite_overflow;
151153
HuC6270_Sprite_Data m_sprites[HUC6270_SPRITES * 2] = {};

src/huc6270_inline.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,11 @@ INLINE void HuC6270::SetNoSpriteLimit(bool no_sprite_limit)
7575
m_no_sprite_limit = no_sprite_limit;
7676
}
7777

78+
INLINE void HuC6270::SetSafeDefaults(bool safe_defaults)
79+
{
80+
m_safe_defaults = safe_defaults;
81+
}
82+
7883
INLINE u16 HuC6270::ReadVRAM(u16 address)
7984
{
8085
if (address < HUC6270_VRAM_SIZE)

0 commit comments

Comments
 (0)