GBHawk: more bug fixes and loading games

This commit is contained in:
alyosha-tas 2020-03-30 18:01:36 -04:00
parent 97beecc4c9
commit 68e69ff85b
6 changed files with 158 additions and 80 deletions

View File

@ -19,7 +19,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawkNew
ISettable<GBHawkNew.GBSettings, GBHawkNew.GBSyncSettings>
{
public IntPtr GB_Pntr { get; set; } = IntPtr.Zero;
byte[] GB_core = new byte[0x200000];
byte[] GB_core = new byte[0x80000];
private int _frame = 0;
public int _lagCount = 0;

View File

@ -136,16 +136,17 @@ namespace GBHawk
{
int temp_check = 0;
/*
if (cpu.TotalExecutedCycles < 23805935) {
if (cpu.TotalExecutedCycles < 25280600) {
temp_check = 70224;
}
else if (cpu.TotalExecutedCycles < 23853139) {
temp_check = 200;
else if (cpu.TotalExecutedCycles < 25347500) {
temp_check = 1000;
}
else {
temp_check = 5;
}
*/
temp_check = 70224;
for (int i = 0; i < temp_check; i++)
@ -580,9 +581,10 @@ namespace GBHawk
void SaveState(uint8_t* saver)
{
saver = MemMap.SaveState(saver);
saver = ppu->SaveState(saver);
saver = cpu.SaveState(saver);
saver = MemMap.SaveState(saver);
saver = psg.SaveState(saver);
saver = timer.SaveState(saver);
saver = serialport.SaveState(saver);
@ -591,9 +593,10 @@ namespace GBHawk
void LoadState(uint8_t* loader)
{
loader = MemMap.LoadState(loader);
loader = ppu->LoadState(loader);
loader = cpu.LoadState(loader);
loader = MemMap.LoadState(loader);
loader = psg.LoadState(loader);
loader = timer.LoadState(loader);
loader = serialport.LoadState(loader);

View File

@ -100,22 +100,22 @@ namespace GBHawk
uint32_t SQ1_output, SQ2_output, WAVE_output, NOISE_output;
// Contol Variables
bool AUD_CTRL_vin_L_en;
bool AUD_CTRL_vin_R_en;
bool AUD_CTRL_sq1_L_en;
bool AUD_CTRL_sq2_L_en;
bool AUD_CTRL_wave_L_en;
bool AUD_CTRL_noise_L_en;
bool AUD_CTRL_sq1_R_en;
bool AUD_CTRL_sq2_R_en;
bool AUD_CTRL_wave_R_en;
bool AUD_CTRL_noise_R_en;
bool AUD_CTRL_power;
bool AUD_CTRL_vin_L_en = false;
bool AUD_CTRL_vin_R_en = false;
bool AUD_CTRL_sq1_L_en = false;
bool AUD_CTRL_sq2_L_en = false;
bool AUD_CTRL_wave_L_en = false;
bool AUD_CTRL_noise_L_en = false;
bool AUD_CTRL_sq1_R_en = false;
bool AUD_CTRL_sq2_R_en = false;
bool AUD_CTRL_wave_R_en = false;
bool AUD_CTRL_noise_R_en = false;
bool AUD_CTRL_power = false;
uint8_t AUD_CTRL_vol_L;
uint8_t AUD_CTRL_vol_R;
uint32_t sequencer_len, sequencer_vol, sequencer_swp;
bool timer_bit_old;
bool timer_bit_old = false;
uint8_t sample;
@ -728,20 +728,20 @@ namespace GBHawk
if (L_final != latched_sample_L)
{
//samples_L[num_samples_L * 2] = master_audio_clock;
//samples_L[num_samples_L * 2 + 1] = L_final - latched_sample_L;
samples_L[num_samples_L * 2] = master_audio_clock;
samples_L[num_samples_L * 2 + 1] = L_final - latched_sample_L;
//num_samples_L++;
num_samples_L++;
latched_sample_L = L_final;
}
if (R_final != latched_sample_R)
{
//samples_R[num_samples_R * 2] = master_audio_clock;
//samples_R[num_samples_R * 2 + 1] = R_final - latched_sample_R;
samples_R[num_samples_R * 2] = master_audio_clock;
samples_R[num_samples_R * 2 + 1] = R_final - latched_sample_R;
//num_samples_R++;
num_samples_R++;
latched_sample_R = R_final;
}

View File

@ -2961,7 +2961,6 @@ namespace GBHawk
*saver = (uint8_t)(jammed ? 1 : 0); saver++;
*saver = (uint8_t)(was_FlagI ? 1 : 0); saver++;
*saver = (uint8_t)(FlagI ? 1 : 0); saver++;
*saver = (uint8_t)(halted ? 1 : 0); saver++;
*saver = opcode; saver++;
*saver = LY; saver++;
@ -2989,7 +2988,6 @@ namespace GBHawk
jammed = *loader == 1; loader++;
was_FlagI = *loader == 1; loader++;
FlagI = *loader == 1; loader++;
halted = *loader == 1; loader++;
opcode = *loader; loader++;
LY = *loader; loader++;

View File

@ -54,11 +54,11 @@ namespace GBHawk
bool in_vblank;
bool in_vblank_old;
bool vblank_rise;
bool GB_bios_register;
bool HDMA_transfer;
bool Use_MT;
bool has_bat;
uint8_t GB_bios_register;
uint8_t IR_reg, IR_mask, IR_signal, IR_receive, IR_self;
// several undocumented GBC Registers
@ -183,11 +183,11 @@ namespace GBHawk
saver = bool_saver(in_vblank, saver);
saver = bool_saver(in_vblank_old, saver);
saver = bool_saver(vblank_rise, saver);
saver = bool_saver(GB_bios_register, saver);
saver = bool_saver(HDMA_transfer, saver);
saver = bool_saver(Use_MT, saver);
saver = bool_saver(has_bat, saver);
saver = byte_saver(GB_bios_register, saver);
saver = byte_saver(IR_reg, saver);
saver = byte_saver(IR_mask, saver);
saver = byte_saver(IR_signal, saver);
@ -216,14 +216,14 @@ namespace GBHawk
saver = int_saver(Acc_X_state, saver);
saver = int_saver(Acc_Y_state, saver);
for (int i = 0; i < 0x80; i++) { saver = byte_saver(ZP_RAM[i], saver); }
for (int i = 0; i < 0x8000; i++) { saver = byte_saver(RAM[i], saver); }
for (int i = 0; i < 0x4000; i++) { saver = byte_saver(VRAM[i], saver); }
for (int i = 0; i < 0xA0; i++) { saver = byte_saver(OAM[i], saver); }
for (int i = 0; i < 0x50; i++) { saver = byte_saver(header[i], saver); }
saver = byte_array_saver(ZP_RAM, saver, 0x80);
saver = byte_array_saver(RAM, saver, 0x8000);
saver = byte_array_saver(VRAM, saver, 0x4000);
saver = byte_array_saver(OAM, saver, 0xA0);
saver = byte_array_saver(header, saver, 0x50);
for (int i = 0; i < (160 * 144); i++) { saver = int_saver(vidbuffer[i], saver); }
for (int i = 0; i < (160 * 144); i++) { saver = int_saver(frame_buffer[i], saver); }
saver = int_array_saver(vidbuffer, saver, 160 * 144);
saver = int_array_saver(frame_buffer, saver, 160 * 144);
return saver;
}
@ -238,11 +238,11 @@ namespace GBHawk
loader = bool_loader(&in_vblank, loader);
loader = bool_loader(&in_vblank_old, loader);
loader = bool_loader(&vblank_rise, loader);
loader = bool_loader(&GB_bios_register, loader);
loader = bool_loader(&HDMA_transfer, loader);
loader = bool_loader(&Use_MT, loader);
loader = bool_loader(&has_bat, loader);
loader = byte_loader(&GB_bios_register, loader);
loader = byte_loader(&IR_reg, loader);
loader = byte_loader(&IR_mask, loader);
loader = byte_loader(&IR_signal, loader);
@ -271,14 +271,14 @@ namespace GBHawk
loader = int_loader(&Acc_X_state, loader);
loader = int_loader(&Acc_Y_state, loader);
for (int i = 0; i < 0x80; i++) { loader = byte_loader(&ZP_RAM[i], loader); }
for (int i = 0; i < 0x8000; i++) { loader = byte_loader(&RAM[i], loader); }
for (int i = 0; i < 0x4000; i++) { loader = byte_loader(&VRAM[i], loader); }
for (int i = 0; i < 0xA0; i++) { loader = byte_loader(&OAM[i], loader); }
for (int i = 0; i < 0x50; i++) { loader = byte_loader(&header[i], loader); }
loader = byte_array_loader(ZP_RAM, loader, 0x80);
loader = byte_array_loader(RAM, loader, 0x8000);
loader = byte_array_loader(VRAM, loader, 0x4000);
loader = byte_array_loader(OAM, loader, 0xA0);
loader = byte_array_loader(header, loader, 0x50);
for (int i = 0; i < (160 * 144); i++) { loader = int_loader(&vidbuffer[i], loader); }
for (int i = 0; i < (160 * 144); i++) { loader = int_loader(&frame_buffer[i], loader); }
loader = int_array_loader(vidbuffer, loader, 160 * 144);
loader = int_array_loader(frame_buffer, loader, 160 * 144);
return loader;
}
@ -305,6 +305,24 @@ namespace GBHawk
return saver;
}
uint8_t* byte_array_saver(uint8_t* to_save, uint8_t* saver, int length)
{
for (int i = 0; i < length; i++) { *saver = to_save[i]; saver++; }
return saver;
}
uint8_t* int_array_saver(uint32_t* to_save, uint8_t* saver, int length)
{
for (int i = 0; i < length; i++)
{
*saver = (uint8_t)(to_save[i] & 0xFF); saver++; *saver = (uint8_t)((to_save[i] >> 8) & 0xFF); saver++;
*saver = (uint8_t)((to_save[i] >> 16) & 0xFF); saver++; *saver = (uint8_t)((to_save[i] >> 24) & 0xFF); saver++;
}
return saver;
}
uint8_t* bool_loader(bool* to_load, uint8_t* loader)
{
to_load[0] = *to_load == 1; loader++;
@ -335,6 +353,24 @@ namespace GBHawk
return loader;
}
uint8_t* byte_array_loader(uint8_t* to_load, uint8_t* loader, int length)
{
for (int i = 0; i < length; i++) { to_load[i] = *loader; loader++; }
return loader;
}
uint8_t* int_array_loader(uint32_t* to_load, uint8_t* loader, int length)
{
for (int i = 0; i < length; i++)
{
to_load[i] = *loader; loader++; to_load[i] |= (*loader << 8); loader++;
to_load[i] |= (*loader << 16); loader++; to_load[i] |= (*loader << 24); loader++;
}
return loader;
}
#pragma endregion
};
}

View File

@ -25,6 +25,9 @@ namespace GBHawk
MemoryManager* mem_ctrl;
// not stated
int temp_tile;
// pointers not stated
bool* FlagI = nullptr;
bool* in_vblank = nullptr;
@ -95,7 +98,7 @@ namespace GBHawk
uint32_t y_scroll_offset;
uint32_t x_tile;
uint32_t x_scroll_offset;
uint32_t tile_byte;
int32_t tile_byte;
uint32_t sprite_fetch_cycles;
bool fetch_sprite;
bool going_to_fetch;
@ -256,18 +259,18 @@ namespace GBHawk
uint8_t* SaveState(uint8_t* saver)
{
for (int i = 0; i < 32; i++) { saver = int_saver(BG_palette[i], saver); }
for (int i = 0; i < 32; i++) { saver = int_saver(OBJ_palette[i], saver); }
for (int i = 0; i < 40; i++) { saver = int_saver(SL_sprites[i], saver); }
saver = int_array_saver(BG_palette, saver, 32);
saver = int_array_saver(OBJ_palette, saver, 32);
saver = int_array_saver(SL_sprites, saver, 40);
for (int i = 0; i < 160; i++) { saver = byte_saver(sprite_attr_list[i], saver); }
for (int i = 0; i < 160; i++) { saver = byte_saver(sprite_pixel_list[i], saver); }
for (int i = 0; i < 160; i++) { saver = byte_saver(sprite_present_list[i], saver); }
for (int i = 0; i < 3; i++) { saver = byte_saver(tile_data[i], saver); }
for (int i = 0; i < 3; i++) { saver = byte_saver(tile_data_latch[i], saver); }
for (int i = 0; i < 2; i++) { saver = byte_saver(sprite_data[i], saver); }
for (int i = 0; i < 2; i++) { saver = byte_saver(sprite_sel[i], saver); }
for (int i = 0; i < 40; i++) { saver = int_saver(SL_sprites_ordered[i], saver); }
saver = byte_array_saver(sprite_attr_list, saver, 160);
saver = byte_array_saver(sprite_pixel_list, saver, 160);
saver = byte_array_saver(sprite_present_list, saver, 160);
saver = byte_array_saver(tile_data, saver, 3);
saver = byte_array_saver(tile_data_latch, saver, 3);
saver = byte_array_saver(sprite_data, saver, 2);
saver = byte_array_saver(sprite_sel, saver, 2);
saver = int_array_saver(SL_sprites_ordered, saver, 40);
saver = bool_saver(HDMA_active, saver);
saver = bool_saver(clear_screen, saver);
@ -356,8 +359,8 @@ namespace GBHawk
saver = int_saver(hbl_countdown, saver);
// The following are GBC specific variables
for (int i = 0; i < 64; i++) { saver = byte_saver(BG_bytes[i], saver); }
for (int i = 0; i < 64; i++) { saver = byte_saver(OBJ_bytes[i], saver); }
saver = byte_array_saver(BG_bytes, saver, 64);
saver = byte_array_saver(OBJ_bytes, saver, 64);
saver = byte_saver(BG_transfer_byte, saver);
saver = byte_saver(OBJ_transfer_byte, saver);
@ -394,18 +397,18 @@ namespace GBHawk
uint8_t* LoadState(uint8_t* loader)
{
for (int i = 0; i < 32; i++) { loader = int_loader(&BG_palette[i], loader); }
for (int i = 0; i < 32; i++) { loader = int_loader(&OBJ_palette[i], loader); }
for (int i = 0; i < 40; i++) { loader = int_loader(&SL_sprites[i], loader); }
loader = int_array_loader(BG_palette, loader, 32);
loader = int_array_loader(OBJ_palette, loader, 32);
loader = int_array_loader(SL_sprites, loader, 40);
for (int i = 0; i < 160; i++) { loader = byte_loader(&sprite_attr_list[i], loader); }
for (int i = 0; i < 160; i++) { loader = byte_loader(&sprite_pixel_list[i], loader); }
for (int i = 0; i < 160; i++) { loader = byte_loader(&sprite_present_list[i], loader); }
for (int i = 0; i < 3; i++) { loader = byte_loader(&tile_data[i], loader); }
for (int i = 0; i < 3; i++) { loader = byte_loader(&tile_data_latch[i], loader); }
for (int i = 0; i < 2; i++) { loader = byte_loader(&sprite_data[i], loader); }
for (int i = 0; i < 2; i++) { loader = byte_loader(&sprite_sel[i], loader); }
for (int i = 0; i < 40; i++) { loader = int_loader(&SL_sprites_ordered[i], loader); }
loader = byte_array_loader(sprite_attr_list, loader, 160);
loader = byte_array_loader(sprite_pixel_list, loader, 160);
loader = byte_array_loader(sprite_present_list, loader, 160);
loader = byte_array_loader(tile_data, loader, 3);
loader = byte_array_loader(tile_data_latch, loader, 3);
loader = byte_array_loader(sprite_data, loader, 2);
loader = byte_array_loader(sprite_sel, loader, 2);
loader = int_array_loader(SL_sprites_ordered, loader, 40);
loader = bool_loader(&HDMA_active, loader);
loader = bool_loader(&clear_screen, loader);
@ -454,7 +457,7 @@ namespace GBHawk
loader = int_loader(&y_scroll_offset, loader);
loader = int_loader(&x_tile, loader);
loader = int_loader(&x_scroll_offset, loader);
loader = int_loader(&tile_byte, loader);
loader = sint_loader(&tile_byte, loader);
loader = int_loader(&sprite_fetch_cycles, loader);
loader = bool_loader(&fetch_sprite, loader);
loader = bool_loader(&going_to_fetch, loader);
@ -494,8 +497,8 @@ namespace GBHawk
loader = int_loader(&hbl_countdown, loader);
// The following are GBC specific variables
for (int i = 0; i < 64; i++) { loader = byte_loader(&BG_bytes[i], loader); }
for (int i = 0; i < 64; i++) { loader = byte_loader(&OBJ_bytes[i], loader); }
loader = byte_array_loader(BG_bytes, loader, 64);
loader = byte_array_loader(OBJ_bytes, loader, 64);
loader = byte_loader(&BG_transfer_byte, loader);
loader = byte_loader(&OBJ_transfer_byte, loader);
@ -552,6 +555,24 @@ namespace GBHawk
return saver;
}
uint8_t* byte_array_saver(uint8_t* to_save, uint8_t* saver, int length)
{
for (int i = 0; i < length; i++) { *saver = to_save[i]; saver++; }
return saver;
}
uint8_t* int_array_saver(uint32_t* to_save, uint8_t* saver, int length)
{
for (int i = 0; i < length; i++)
{
*saver = (uint8_t)(to_save[i] & 0xFF); saver++; *saver = (uint8_t)((to_save[i] >> 8) & 0xFF); saver++;
*saver = (uint8_t)((to_save[i] >> 16) & 0xFF); saver++; *saver = (uint8_t)((to_save[i] >> 24) & 0xFF); saver++;
}
return saver;
}
uint8_t* bool_loader(bool* to_load, uint8_t* loader)
{
to_load[0] = *to_load == 1; loader++;
@ -582,6 +603,24 @@ namespace GBHawk
return loader;
}
uint8_t* byte_array_loader(uint8_t* to_load, uint8_t* loader, int length)
{
for (int i = 0; i < length; i++) { to_load[i] = *loader; loader++; }
return loader;
}
uint8_t* int_array_loader(uint32_t* to_load, uint8_t* loader, int length)
{
for (int i = 0; i < length; i++)
{
to_load[i] = *loader; loader++; to_load[i] |= (*loader << 8); loader++;
to_load[i] |= (*loader << 16); loader++; to_load[i] |= (*loader << 24); loader++;
}
return loader;
}
#pragma endregion
};
@ -1135,7 +1174,6 @@ namespace GBHawk
// start shifting data into the LCD
if (render_counter >= (render_offset + 8))
{
pixel = (tile_data_latch[0] & (1 << (7 - (render_counter % 8)))) > 0 ? 1 : 0;
pixel |= (tile_data_latch[1] & (1 << (7 - (render_counter % 8)))) > 0 ? 2 : 0;
@ -1199,6 +1237,7 @@ namespace GBHawk
// based on sprite priority and pixel values, pick a final pixel color
_vidbuffer[LY * 160 + pixel_counter] = (uint32_t)color_palette[pixel];
pixel_counter++;
if (pixel_counter == 160)
@ -1242,7 +1281,7 @@ namespace GBHawk
if ((internal_cycle % 2) == 1)
{
// calculate the row number of the tiles to be fetched
y_tile = ((uint32_t)floor((float)((uint32_t)scroll_y + LY) / 8.0)) % 32;
y_tile = ((uint32_t)floor(((float)((float)scroll_y + (float)LY)) / (float)8.0)) % 32;
temp_fetch = y_tile * 32 + (x_tile + tile_inc) % 32;
tile_byte = VRAM[0x1800 + (((LCDC & 0x8) > 0) ? 1 : 0) * 0x400 + temp_fetch];
@ -1488,6 +1527,7 @@ namespace GBHawk
// every in range sprite takes 6 cycles to process
// sprites located at x=0 still take 6 cycles to process even though they don't appear on screen
// sprites above x=168 do not take any cycles to process however
if (fetch_sprite)
{
if (going_to_fetch)
@ -1522,7 +1562,7 @@ namespace GBHawk
else if (((last_eval + render_offset) % 8) == 6) { sprite_fetch_counter += 0; }
else if (((last_eval + render_offset) % 8) == 7) { sprite_fetch_counter += 0; }
consecutive_sprite = (uint32_t)floor((double)((uint32_t)last_eval + render_offset) / 8.0) * 8 + 8 - render_offset;
consecutive_sprite = (uint32_t)floor((double)(last_eval + render_offset) / 8.0) * 8 + 8 - render_offset;
// special case exists here for sprites at zero with non-zero x-scroll. Not sure exactly the reason for it.
if (last_eval == 0 && render_offset != 0)
@ -1607,7 +1647,7 @@ namespace GBHawk
void DMA_tick()
{
// Note that DMA is halted when the CPU is halted
if (DMA_start && !cpu_halted[0])
if (DMA_start && !cpu_halted[0])
{
if (DMA_clock >= 4)
{
@ -3008,7 +3048,7 @@ namespace GBHawk
else if (((last_eval + render_offset) % 8) == 6) { sprite_fetch_counter += 0; }
else if (((last_eval + render_offset) % 8) == 7) { sprite_fetch_counter += 0; }
consecutive_sprite = (uint32_t)floor((double)(last_eval + render_offset) / 8.0) * 8 + 8 - render_offset;
consecutive_sprite = (uint32_t)floor(((double)last_eval + render_offset) / 8.0) * 8 + 8 - render_offset;
// special case exists here for sprites at zero with non-zero x-scroll. Not sure exactly the reason for it.
if (last_eval == 0 && render_offset != 0)
@ -4295,7 +4335,7 @@ namespace GBHawk
tile_data[2] = VRAM[0x3800 + (((LCDC & 0x4) > 0) ? 1 : 0) * 0x400 + temp_fetch];
VRAM_sel = ((tile_data[2] & 0x8) > 0) ? 1 : 0;
BG_V_flip = ((tile_data[2] & 0x40) > 0)& GBC_compat[0];
BG_V_flip = ((tile_data[2] & 0x40) > 0) & GBC_compat[0];
read_case = 1;
if (!pre_render)
@ -4397,7 +4437,7 @@ namespace GBHawk
tile_byte = VRAM[0x1800 + (((LCDC & 0x40) > 0) ? 1 : 0) * 0x400 + temp_fetch];
tile_data[2] = VRAM[0x3800 + (((LCDC & 0x40) > 0) ? 1 : 0) * 0x400 + temp_fetch];
VRAM_sel = ((tile_data[2] & 0x8) > 0) ? 1 : 0;
BG_V_flip = ((tile_data[2] & 0x40) > 0)& GBC_compat[0];
BG_V_flip = ((tile_data[2] & 0x40) > 0) & GBC_compat[0];
window_tile_inc++;
read_case = 5;
@ -4601,7 +4641,8 @@ namespace GBHawk
else if (((last_eval + render_offset) % 8) == 6) { sprite_fetch_counter += 0; }
else if (((last_eval + render_offset) % 8) == 7) { sprite_fetch_counter += 0; }
consecutive_sprite = (uint32_t)floor((double)(last_eval + render_offset) / 8.0) * 8 + 8 - render_offset;
consecutive_sprite = (uint32_t)floor((((float)last_eval + (float)render_offset) / (float)8.0)) * 8 + 8 - render_offset;
// special case exists here for sprites at zero with non-zero x-scroll. Not sure exactly the reason for it.
if (last_eval == 0 && render_offset != 0)
@ -4747,7 +4788,7 @@ namespace GBHawk
{
for (int i = 0; i < 256; i++)
{
for (int j = 0; j < SL_sprites_index; j++)
for (uint32_t j = 0; j < SL_sprites_index; j++)
{
if (SL_sprites[j * 4 + 1] == i)
{