GBHawk: bug fixes

This commit is contained in:
alyosha-tas 2020-03-29 22:30:19 -04:00
parent e45943c26a
commit 69409ff729
7 changed files with 86 additions and 33 deletions

View File

@ -109,7 +109,13 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawkNew
public void Dispose() public void Dispose()
{ {
DisposeSound();
if (GB_Pntr != IntPtr.Zero)
{
LibGBHawk.GB_destroy(GB_Pntr);
GB_Pntr = IntPtr.Zero;
}
} }
#region Video provider #region Video provider
@ -139,12 +145,15 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawkNew
#region Audio #region Audio
public BlipBuffer blip = new BlipBuffer(4500); public BlipBuffer blip_L = new BlipBuffer(9000);
public BlipBuffer blip_R = new BlipBuffer(9000);
public int[] Aud = new int[9000]; public int[] Aud_L = new int[9000];
public uint num_samp; public int[] Aud_R = new int[9000];
public uint num_samp_L;
public uint num_samp_R;
const int blipbuffsize = 4500; const int blipbuffsize = 9000;
public bool CanProvideAsync => false; public bool CanProvideAsync => false;
@ -165,24 +174,45 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawkNew
public void GetSamplesSync(out short[] samples, out int nsamp) public void GetSamplesSync(out short[] samples, out int nsamp)
{ {
uint f_clock = LibGBHawk.GB_get_audio(GB_Pntr, Aud, ref num_samp); uint f_clock = LibGBHawk.GB_get_audio(GB_Pntr, Aud_L, ref num_samp_L, Aud_R, ref num_samp_R);
for (int i = 0; i < num_samp; i++) for (int i = 0; i < num_samp_L; i++)
{ {
blip.AddDelta((uint)Aud[i * 2], Aud[i * 2 + 1]); blip_L.AddDelta((uint)Aud_L[i * 2], Aud_L[i * 2 + 1]);
} }
blip.EndFrame(f_clock); for (int i = 0; i < num_samp_R; i++)
{
blip_R.AddDelta((uint)Aud_R[i * 2], Aud_R[i * 2 + 1]);
}
nsamp = blip.SamplesAvailable(); blip_L.EndFrame(f_clock);
blip_R.EndFrame(f_clock);
nsamp = blip_L.SamplesAvailable();
samples = new short[nsamp * 2]; samples = new short[nsamp * 2];
blip.ReadSamples(samples, nsamp, true); if (nsamp != 0)
{
blip_L.ReadSamplesLeft(samples, nsamp);
blip_R.ReadSamplesRight(samples, nsamp);
}
} }
public void DiscardSamples() public void DiscardSamples()
{ {
blip.Clear(); blip_L.Clear();
blip_R.Clear();
}
public void DisposeSound()
{
blip_L.Clear();
blip_R.Clear();
blip_L.Dispose();
blip_R.Dispose();
blip_L = null;
blip_R = null;
} }
#endregion #endregion

View File

@ -77,7 +77,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawkNew
LibGBHawk.GB_load_bios(GB_Pntr, _bios, is_GBC, _syncSettings.GBACGB); LibGBHawk.GB_load_bios(GB_Pntr, _bios, is_GBC, _syncSettings.GBACGB);
LibGBHawk.GB_load(GB_Pntr, rom, (uint)rom.Length, MD5_temp, (uint)_syncSettings.RTCInitialTime, (uint)_syncSettings.RTCOffset); LibGBHawk.GB_load(GB_Pntr, rom, (uint)rom.Length, MD5_temp, (uint)_syncSettings.RTCInitialTime, (uint)_syncSettings.RTCOffset);
blip.SetRates(3579545, 44100); blip_L.SetRates(4194304, 44100);
blip_R.SetRates(4194304, 44100);
(ServiceProvider as BasicServiceProvider).Register<ISoundProvider>(this); (ServiceProvider as BasicServiceProvider).Register<ISoundProvider>(this);

View File

@ -83,7 +83,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawkNew
/// <param name="aud_buf">where to send left audio to</param> /// <param name="aud_buf">where to send left audio to</param>
/// <param name="n_samp">number of left samples</param> /// <param name="n_samp">number of left samples</param>
[DllImport("GBHawk.dll", CallingConvention = CallingConvention.Cdecl)] [DllImport("GBHawk.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern uint GB_get_audio(IntPtr core, int[] aud_buf, ref uint n_samp); public static extern uint GB_get_audio(IntPtr core, int[] aud_buf_L, ref uint n_samp_L, int[] aud_buf_R, ref uint n_samp_R);
#endregion #endregion
@ -102,7 +102,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBHawkNew
/// </summary> /// </summary>
/// <param name="core">opaque state pointer</param> /// <param name="core">opaque state pointer</param>
/// <param name="loader">load buffer</param> /// <param name="loader">load buffer</param>
[DllImport("MSXHAWK.dll", CallingConvention = CallingConvention.Cdecl)] [DllImport("GBHAWK.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void GB_load_state(IntPtr core, byte[] loader); public static extern void GB_load_state(IntPtr core, byte[] loader);
#endregion #endregion

View File

@ -62,6 +62,7 @@ namespace GBHawk
} }
MemMap.ppu_pntr = &ppu[0]; MemMap.ppu_pntr = &ppu[0];
ppu->mem_ctrl = &MemMap;
// initialize the proper mapper // initialize the proper mapper
Setup_Mapper(MD5, RTC_initial, RTC_offset); Setup_Mapper(MD5, RTC_initial, RTC_offset);
@ -133,7 +134,21 @@ namespace GBHawk
bool FrameAdvance(uint8_t new_controller_1, uint32_t new_accx, uint32_t new_accy, bool render, bool rendersound) bool FrameAdvance(uint8_t new_controller_1, uint32_t new_accx, uint32_t new_accy, bool render, bool rendersound)
{ {
for (int i = 0; i < 70224; i++) int temp_check = 0;
/*
if (cpu.TotalExecutedCycles < 23805935) {
temp_check = 70224;
}
else if (cpu.TotalExecutedCycles < 23853139) {
temp_check = 200;
}
else {
temp_check = 5;
}
*/
temp_check = 70224;
for (int i = 0; i < temp_check; i++)
{ {
// These things do not change speed in GBC double spped mode // These things do not change speed in GBC double spped mode
psg.tick(); psg.tick();
@ -337,7 +352,13 @@ namespace GBHawk
std::memcpy(dst, src, sizeof int32_t * psg.num_samples_R * 2); std::memcpy(dst, src, sizeof int32_t * psg.num_samples_R * 2);
n_samp_R[0] = psg.num_samples_R; n_samp_R[0] = psg.num_samples_R;
return psg.master_audio_clock; uint32_t temp_int = psg.master_audio_clock;
psg.master_audio_clock = 0;
psg.num_samples_L = 0;
psg.num_samples_R = 0;
return temp_int;
} }
void Setup_Mapper(string MD5, uint32_t RTC_initial, uint32_t RTC_offset) void Setup_Mapper(string MD5, uint32_t RTC_initial, uint32_t RTC_offset)
@ -561,8 +582,8 @@ namespace GBHawk
{ {
saver = ppu->SaveState(saver); saver = ppu->SaveState(saver);
saver = cpu.SaveState(saver); saver = cpu.SaveState(saver);
saver = psg.SaveState(saver); saver = MemMap.SaveState(saver);
saver = MemMap.SaveState(saver); saver = psg.SaveState(saver);
saver = timer.SaveState(saver); saver = timer.SaveState(saver);
saver = serialport.SaveState(saver); saver = serialport.SaveState(saver);
saver = mapper->SaveState(saver); saver = mapper->SaveState(saver);
@ -572,11 +593,11 @@ namespace GBHawk
{ {
loader = ppu->LoadState(loader); loader = ppu->LoadState(loader);
loader = cpu.LoadState(loader); loader = cpu.LoadState(loader);
loader = MemMap.LoadState(loader);
loader = psg.LoadState(loader); loader = psg.LoadState(loader);
loader = MemMap.LoadState(loader); loader = timer.LoadState(loader);
loader = timer.SaveState(loader); loader = serialport.LoadState(loader);
loader = serialport.SaveState(loader); loader = mapper->LoadState(loader);
loader = mapper->SaveState(loader);
} }
#pragma endregion #pragma endregion

View File

@ -728,20 +728,20 @@ namespace GBHawk
if (L_final != latched_sample_L) if (L_final != latched_sample_L)
{ {
samples_L[num_samples_L * 2] = master_audio_clock; //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 + 1] = L_final - latched_sample_L;
num_samples_L++; //num_samples_L++;
latched_sample_L = L_final; latched_sample_L = L_final;
} }
if (R_final != latched_sample_R) if (R_final != latched_sample_R)
{ {
samples_R[num_samples_R * 2] = master_audio_clock; //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 + 1] = R_final - latched_sample_R;
num_samples_R++; //num_samples_R++;
latched_sample_R = R_final; latched_sample_R = R_final;
} }

View File

@ -2974,8 +2974,8 @@ namespace GBHawk
*saver = (uint8_t)(TotalExecutedCycles & 0xFF); saver++; *saver = (uint8_t)((TotalExecutedCycles >> 8) & 0xFF); saver++; *saver = (uint8_t)(TotalExecutedCycles & 0xFF); saver++; *saver = (uint8_t)((TotalExecutedCycles >> 8) & 0xFF); saver++;
*saver = (uint8_t)((TotalExecutedCycles >> 16) & 0xFF); saver++; *saver = (uint8_t)((TotalExecutedCycles >> 24) & 0xFF); saver++; *saver = (uint8_t)((TotalExecutedCycles >> 16) & 0xFF); saver++; *saver = (uint8_t)((TotalExecutedCycles >> 24) & 0xFF); saver++;
*saver = (uint8_t)((TotalExecutedCycles >> 16) & 0x32); saver++; *saver = (uint8_t)((TotalExecutedCycles >> 40) & 0xFF); saver++; *saver = (uint8_t)((TotalExecutedCycles >> 32) & 0xFF); saver++; *saver = (uint8_t)((TotalExecutedCycles >> 40) & 0xFF); saver++;
*saver = (uint8_t)((TotalExecutedCycles >> 16) & 0x48); saver++; *saver = (uint8_t)((TotalExecutedCycles >> 56) & 0xFF); saver++; *saver = (uint8_t)((TotalExecutedCycles >> 48) & 0xFF); saver++; *saver = (uint8_t)((TotalExecutedCycles >> 56) & 0xFF); saver++;
return saver; return saver;
} }
@ -2989,6 +2989,7 @@ namespace GBHawk
jammed = *loader == 1; loader++; jammed = *loader == 1; loader++;
was_FlagI = *loader == 1; loader++; was_FlagI = *loader == 1; loader++;
FlagI = *loader == 1; loader++; FlagI = *loader == 1; loader++;
halted = *loader == 1; loader++;
opcode = *loader; loader++; opcode = *loader; loader++;
LY = *loader; loader++; LY = *loader; loader++;

View File

@ -1620,7 +1620,7 @@ namespace GBHawk
// So transfers nominally from higher memory areas are actually still from there (i.e. FF -> DF) // So transfers nominally from higher memory areas are actually still from there (i.e. FF -> DF)
uint8_t DMA_actual = DMA_addr; uint8_t DMA_actual = DMA_addr;
if (DMA_addr > 0xDF) { DMA_actual &= 0xDF; } if (DMA_addr > 0xDF) { DMA_actual &= 0xDF; }
DMA_byte = ReadMemory((uint32_t)((DMA_actual << 8) + DMA_inc)); DMA_byte = ReadMemory(((uint32_t)(DMA_actual << 8) + DMA_inc));
DMA_start = true; DMA_start = true;
} }
else if ((DMA_clock % 4) == 3) else if ((DMA_clock % 4) == 3)
@ -3095,7 +3095,7 @@ namespace GBHawk
void DMA_tick() void DMA_tick()
{ {
// Note that DMA is halted when the CPU is halted // Note that DMA is halted when the CPU is halted
if (DMA_start && !cpu_halted) if (DMA_start && !cpu_halted[0])
{ {
if (DMA_clock >= 4) if (DMA_clock >= 4)
{ {
@ -4688,7 +4688,7 @@ namespace GBHawk
void DMA_tick() void DMA_tick()
{ {
// Note that DMA is halted when the CPU is halted // Note that DMA is halted when the CPU is halted
if (DMA_start && !cpu_halted) if (DMA_start && !cpu_halted[0])
{ {
if (DMA_clock >= 4) if (DMA_clock >= 4)
{ {