Allow emulating an SGB without SFC HLE
This commit is contained in:
parent
9f7255cd23
commit
2bfe922650
@ -123,8 +123,8 @@ static void display_vblank(GB_gameboy_t *gb)
|
|||||||
{
|
{
|
||||||
gb->vblank_just_occured = true;
|
gb->vblank_just_occured = true;
|
||||||
|
|
||||||
/* TODO: Slow in trubo mode! */
|
/* TODO: Slow in turbo mode! */
|
||||||
if (GB_is_sgb(gb)) {
|
if (GB_is_hle_sgb(gb)) {
|
||||||
GB_sgb_render(gb);
|
GB_sgb_render(gb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
13
Core/gb.c
13
Core/gb.c
@ -533,6 +533,11 @@ bool GB_is_cgb(GB_gameboy_t *gb)
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool GB_is_sgb(GB_gameboy_t *gb)
|
bool GB_is_sgb(GB_gameboy_t *gb)
|
||||||
|
{
|
||||||
|
return (gb->model & ~GB_MODEL_PAL_BIT & ~GB_MODEL_NO_SFC_BIT) == GB_MODEL_SGB || (gb->model & ~GB_MODEL_NO_SFC_BIT) == GB_MODEL_SGB2;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool GB_is_hle_sgb(GB_gameboy_t *gb)
|
||||||
{
|
{
|
||||||
return (gb->model & ~GB_MODEL_PAL_BIT) == GB_MODEL_SGB || gb->model == GB_MODEL_SGB2;
|
return (gb->model & ~GB_MODEL_PAL_BIT) == GB_MODEL_SGB || gb->model == GB_MODEL_SGB2;
|
||||||
}
|
}
|
||||||
@ -745,7 +750,7 @@ void GB_reset(GB_gameboy_t *gb)
|
|||||||
gb->accessed_oam_row = -1;
|
gb->accessed_oam_row = -1;
|
||||||
|
|
||||||
|
|
||||||
if (GB_is_sgb(gb)) {
|
if (GB_is_hle_sgb(gb)) {
|
||||||
if (!gb->sgb) {
|
if (!gb->sgb) {
|
||||||
gb->sgb = malloc(sizeof(*gb->sgb));
|
gb->sgb = malloc(sizeof(*gb->sgb));
|
||||||
}
|
}
|
||||||
@ -879,17 +884,17 @@ uint32_t GB_get_clock_rate(GB_gameboy_t *gb)
|
|||||||
|
|
||||||
unsigned GB_get_screen_width(GB_gameboy_t *gb)
|
unsigned GB_get_screen_width(GB_gameboy_t *gb)
|
||||||
{
|
{
|
||||||
return GB_is_sgb(gb)? 256 : 160;
|
return GB_is_hle_sgb(gb)? 256 : 160;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned GB_get_screen_height(GB_gameboy_t *gb)
|
unsigned GB_get_screen_height(GB_gameboy_t *gb)
|
||||||
{
|
{
|
||||||
return GB_is_sgb(gb)? 224 : 144;
|
return GB_is_hle_sgb(gb)? 224 : 144;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned GB_get_player_count(GB_gameboy_t *gb)
|
unsigned GB_get_player_count(GB_gameboy_t *gb)
|
||||||
{
|
{
|
||||||
return GB_is_sgb(gb)? gb->sgb->player_count : 1;
|
return GB_is_hle_sgb(gb)? gb->sgb->player_count : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GB_set_update_input_hint_callback(GB_gameboy_t *gb, GB_update_input_hint_callback_t callback)
|
void GB_set_update_input_hint_callback(GB_gameboy_t *gb, GB_update_input_hint_callback_t callback)
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
#define GB_MODEL_MGB_FAMILY 0x100
|
#define GB_MODEL_MGB_FAMILY 0x100
|
||||||
#define GB_MODEL_CGB_FAMILY 0x200
|
#define GB_MODEL_CGB_FAMILY 0x200
|
||||||
#define GB_MODEL_PAL_BIT 0x1000
|
#define GB_MODEL_PAL_BIT 0x1000
|
||||||
|
#define GB_MODEL_NO_SFC_BIT 0x2000
|
||||||
|
|
||||||
#if __clang__
|
#if __clang__
|
||||||
#define UNROLL _Pragma("unroll")
|
#define UNROLL _Pragma("unroll")
|
||||||
@ -67,9 +68,11 @@ typedef enum {
|
|||||||
// GB_MODEL_DMG_C = 0x003,
|
// GB_MODEL_DMG_C = 0x003,
|
||||||
GB_MODEL_SGB = 0x004,
|
GB_MODEL_SGB = 0x004,
|
||||||
GB_MODEL_SGB_NTSC = GB_MODEL_SGB,
|
GB_MODEL_SGB_NTSC = GB_MODEL_SGB,
|
||||||
GB_MODEL_SGB_PAL = 0x1004,
|
GB_MODEL_SGB_PAL = GB_MODEL_SGB | GB_MODEL_PAL_BIT,
|
||||||
|
GB_MODEL_SGB_NO_SFC = GB_MODEL_SGB | GB_MODEL_NO_SFC_BIT,
|
||||||
// GB_MODEL_MGB = 0x100,
|
// GB_MODEL_MGB = 0x100,
|
||||||
GB_MODEL_SGB2 = 0x101,
|
GB_MODEL_SGB2 = 0x101,
|
||||||
|
GB_MODEL_SGB2_NO_SFC = GB_MODEL_SGB2 | GB_MODEL_NO_SFC_BIT,
|
||||||
// GB_MODEL_CGB_0 = 0x200,
|
// GB_MODEL_CGB_0 = 0x200,
|
||||||
// GB_MODEL_CGB_A = 0x201,
|
// GB_MODEL_CGB_A = 0x201,
|
||||||
// GB_MODEL_CGB_B = 0x202,
|
// GB_MODEL_CGB_B = 0x202,
|
||||||
@ -617,7 +620,8 @@ __attribute__((__format__ (__printf__, fmtarg, firstvararg)))
|
|||||||
void GB_init(GB_gameboy_t *gb, GB_model_t model);
|
void GB_init(GB_gameboy_t *gb, GB_model_t model);
|
||||||
bool GB_is_inited(GB_gameboy_t *gb);
|
bool GB_is_inited(GB_gameboy_t *gb);
|
||||||
bool GB_is_cgb(GB_gameboy_t *gb);
|
bool GB_is_cgb(GB_gameboy_t *gb);
|
||||||
bool GB_is_sgb(GB_gameboy_t *gb);
|
bool GB_is_sgb(GB_gameboy_t *gb); // Returns true if the model is SGB or SGB2
|
||||||
|
bool GB_is_hle_sgb(GB_gameboy_t *gb); // Returns true if the model is SGB or SGB2 and the SFC/SNES side is HLE'd
|
||||||
GB_model_t GB_get_model(GB_gameboy_t *gb);
|
GB_model_t GB_get_model(GB_gameboy_t *gb);
|
||||||
void GB_free(GB_gameboy_t *gb);
|
void GB_free(GB_gameboy_t *gb);
|
||||||
void GB_reset(GB_gameboy_t *gb);
|
void GB_reset(GB_gameboy_t *gb);
|
||||||
|
@ -36,7 +36,7 @@ int GB_save_state(GB_gameboy_t *gb, const char *path)
|
|||||||
if (!DUMP_SECTION(gb, f, rtc )) goto error;
|
if (!DUMP_SECTION(gb, f, rtc )) goto error;
|
||||||
if (!DUMP_SECTION(gb, f, video )) goto error;
|
if (!DUMP_SECTION(gb, f, video )) goto error;
|
||||||
|
|
||||||
if (GB_is_sgb(gb)) {
|
if (GB_is_hle_sgb(gb)) {
|
||||||
if (!dump_section(f, gb->sgb, sizeof(*gb->sgb))) goto error;
|
if (!dump_section(f, gb->sgb, sizeof(*gb->sgb))) goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -73,7 +73,7 @@ size_t GB_get_save_state_size(GB_gameboy_t *gb)
|
|||||||
+ GB_SECTION_SIZE(apu ) + sizeof(uint32_t)
|
+ GB_SECTION_SIZE(apu ) + sizeof(uint32_t)
|
||||||
+ GB_SECTION_SIZE(rtc ) + sizeof(uint32_t)
|
+ GB_SECTION_SIZE(rtc ) + sizeof(uint32_t)
|
||||||
+ GB_SECTION_SIZE(video ) + sizeof(uint32_t)
|
+ GB_SECTION_SIZE(video ) + sizeof(uint32_t)
|
||||||
+ (GB_is_sgb(gb)? sizeof(*gb->sgb) + sizeof(uint32_t) : 0)
|
+ (GB_is_hle_sgb(gb)? sizeof(*gb->sgb) + sizeof(uint32_t) : 0)
|
||||||
+ gb->mbc_ram_size
|
+ gb->mbc_ram_size
|
||||||
+ gb->ram_size
|
+ gb->ram_size
|
||||||
+ gb->vram_size;
|
+ gb->vram_size;
|
||||||
@ -105,7 +105,7 @@ void GB_save_state_to_buffer(GB_gameboy_t *gb, uint8_t *buffer)
|
|||||||
DUMP_SECTION(gb, buffer, rtc );
|
DUMP_SECTION(gb, buffer, rtc );
|
||||||
DUMP_SECTION(gb, buffer, video );
|
DUMP_SECTION(gb, buffer, video );
|
||||||
|
|
||||||
if (GB_is_sgb(gb)) {
|
if (GB_is_hle_sgb(gb)) {
|
||||||
buffer_dump_section(&buffer, gb->sgb, sizeof(*gb->sgb));
|
buffer_dump_section(&buffer, gb->sgb, sizeof(*gb->sgb));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -161,8 +161,8 @@ static bool verify_state_compatibility(GB_gameboy_t *gb, GB_gameboy_t *save)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GB_is_sgb(gb) != GB_is_sgb(save)) {
|
if (GB_is_hle_sgb(gb) != GB_is_hle_sgb(save)) {
|
||||||
GB_log(gb, "The save state is %sfor a Super Game Boy. Try changing the emulated model.\n", GB_is_sgb(save)? "" : "not ");
|
GB_log(gb, "The save state is %sfor a Super Game Boy. Try changing the emulated model.\n", GB_is_hle_sgb(save)? "" : "not ");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -223,7 +223,7 @@ int GB_load_state(GB_gameboy_t *gb, const char *path)
|
|||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GB_is_sgb(gb)) {
|
if (GB_is_hle_sgb(gb)) {
|
||||||
if (!read_section(f, gb->sgb, sizeof(*gb->sgb))) goto error;
|
if (!read_section(f, gb->sgb, sizeof(*gb->sgb))) goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -334,7 +334,7 @@ int GB_load_state_from_buffer(GB_gameboy_t *gb, const uint8_t *buffer, size_t le
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GB_is_sgb(gb)) {
|
if (GB_is_hle_sgb(gb)) {
|
||||||
if (!buffer_read_section(&buffer, &length, gb->sgb, sizeof(*gb->sgb))) return -1;
|
if (!buffer_read_section(&buffer, &length, gb->sgb, sizeof(*gb->sgb))) return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -296,6 +296,10 @@ static void command_ready(GB_gameboy_t *gb)
|
|||||||
void GB_sgb_write(GB_gameboy_t *gb, uint8_t value)
|
void GB_sgb_write(GB_gameboy_t *gb, uint8_t value)
|
||||||
{
|
{
|
||||||
if (!GB_is_sgb(gb)) return;
|
if (!GB_is_sgb(gb)) return;
|
||||||
|
if (!GB_is_hle_sgb(gb)) {
|
||||||
|
/* Notify via callback */
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (gb->sgb->disable_commands) return;
|
if (gb->sgb->disable_commands) return;
|
||||||
if (gb->sgb->command_write_index >= sizeof(gb->sgb->command) * 8) return;
|
if (gb->sgb->command_write_index >= sizeof(gb->sgb->command) * 8) return;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user