puae: fix region change

This commit is contained in:
feos 2024-12-10 19:31:46 +03:00
parent dad929fd9f
commit aca5ccae50
1 changed files with 44 additions and 40 deletions

View File

@ -17,25 +17,26 @@ namespace BizHawk.Emulation.Cores.Computers.Amiga
{ {
private static readonly Configuration ConfigPAL = new Configuration private static readonly Configuration ConfigPAL = new Configuration
{ {
SystemId = VSystemID.Raw.Amiga, SystemId = VSystemID.Raw.Amiga,
MaxSamples = 2 * 1024, MaxSamples = 2 * 1024,
DefaultWidth = LibPUAE.PAL_WIDTH, DefaultWidth = LibPUAE.PAL_WIDTH,
DefaultHeight = LibPUAE.PAL_HEIGHT, DefaultHeight = LibPUAE.PAL_HEIGHT,
MaxWidth = LibPUAE.PAL_WIDTH, MaxWidth = LibPUAE.PAL_WIDTH,
MaxHeight = LibPUAE.PAL_HEIGHT, MaxHeight = LibPUAE.PAL_HEIGHT,
DefaultFpsNumerator = LibPUAE.PUAE_VIDEO_NUMERATOR_PAL, DefaultFpsNumerator = LibPUAE.PUAE_VIDEO_NUMERATOR_PAL,
DefaultFpsDenominator = LibPUAE.PUAE_VIDEO_DENOMINATOR_PAL DefaultFpsDenominator = LibPUAE.PUAE_VIDEO_DENOMINATOR_PAL
}; };
private static readonly Configuration ConfigNTSC = new Configuration private static readonly Configuration ConfigNTSC = new Configuration
{ {
SystemId = VSystemID.Raw.Amiga, SystemId = VSystemID.Raw.Amiga,
MaxSamples = 2 * 1024, MaxSamples = 2 * 1024,
DefaultWidth = LibPUAE.NTSC_WIDTH, DefaultWidth = LibPUAE.NTSC_WIDTH,
DefaultHeight = LibPUAE.NTSC_HEIGHT, DefaultHeight = LibPUAE.NTSC_HEIGHT,
MaxWidth = LibPUAE.NTSC_WIDTH, // games never switch region, and video dumping won't be happy, but amiga can still do it
MaxHeight = LibPUAE.NTSC_HEIGHT, MaxWidth = LibPUAE.PAL_WIDTH,
DefaultFpsNumerator = LibPUAE.PUAE_VIDEO_NUMERATOR_NTSC, MaxHeight = LibPUAE.PAL_HEIGHT,
DefaultFpsNumerator = LibPUAE.PUAE_VIDEO_NUMERATOR_NTSC,
DefaultFpsDenominator = LibPUAE.PUAE_VIDEO_DENOMINATOR_NTSC DefaultFpsDenominator = LibPUAE.PUAE_VIDEO_DENOMINATOR_NTSC
}; };
@ -77,20 +78,20 @@ namespace BizHawk.Emulation.Cores.Computers.Amiga
_drives = new(_syncSettings.FloppyDrives); _drives = new(_syncSettings.FloppyDrives);
DriveLightEnabled = _syncSettings.FloppyDrives > 0; DriveLightEnabled = _syncSettings.FloppyDrives > 0;
UpdateAspectRatio(_syncSettings); UpdateVideoStandard(true);
CreateArguments(_syncSettings); CreateArguments(_syncSettings);
ControllerDefinition = CreateControllerDefinition(_syncSettings); ControllerDefinition = CreateControllerDefinition(_syncSettings);
_ledCallback = LEDCallback; _ledCallback = LEDCallback;
var puae = PreInit<LibPUAE>(new WaterboxOptions var puae = PreInit<LibPUAE>(new WaterboxOptions
{ {
Filename = "puae.wbx", Filename = "puae.wbx",
SbrkHeapSizeKB = 1024, SbrkHeapSizeKB = 1024,
SealedHeapSizeKB = 512, SealedHeapSizeKB = 512,
InvisibleHeapSizeKB = 512, InvisibleHeapSizeKB = 512,
PlainHeapSizeKB = 512, PlainHeapSizeKB = 512,
MmapHeapSizeKB = 20 * 1024, MmapHeapSizeKB = 20 * 1024,
SkipCoreConsistencyCheck = lp.Comm.CorePreferences.HasFlag(CoreComm.CorePreferencesFlags.WaterboxCoreConsistencyCheck), SkipCoreConsistencyCheck = lp.Comm.CorePreferences.HasFlag(CoreComm.CorePreferencesFlags.WaterboxCoreConsistencyCheck),
SkipMemoryConsistencyCheck = lp.Comm.CorePreferences.HasFlag(CoreComm.CorePreferencesFlags.WaterboxMemoryConsistencyCheck), SkipMemoryConsistencyCheck = lp.Comm.CorePreferences.HasFlag(CoreComm.CorePreferencesFlags.WaterboxMemoryConsistencyCheck),
}, new Delegate[] { _ledCallback }); }, new Delegate[] { _ledCallback });
@ -255,9 +256,9 @@ namespace BizHawk.Emulation.Cores.Computers.Amiga
} }
} }
_ejectPressed = controller.IsPressed(Inputs.EjectDisk); _ejectPressed = controller.IsPressed(Inputs.EjectDisk);
_insertPressed = controller.IsPressed(Inputs.InsertDisk); _insertPressed = controller.IsPressed(Inputs.InsertDisk);
_nextSlotPressed = controller.IsPressed(Inputs.NextSlot); _nextSlotPressed = controller.IsPressed(Inputs.NextSlot);
_nextDrivePressed = controller.IsPressed(Inputs.NextDrive); _nextDrivePressed = controller.IsPressed(Inputs.NextDrive);
fi.CurrentDrive = _currentDrive; fi.CurrentDrive = _currentDrive;
@ -277,17 +278,7 @@ namespace BizHawk.Emulation.Cores.Computers.Amiga
protected override void FrameAdvancePost() protected override void FrameAdvancePost()
{ {
if (BufferHeight == LibPUAE.NTSC_HEIGHT) UpdateVideoStandard(false);
{
VsyncNumerator = LibPUAE.PUAE_VIDEO_NUMERATOR_NTSC;
VsyncDenominator = LibPUAE.PUAE_VIDEO_DENOMINATOR_NTSC;
}
else
{
VsyncNumerator = LibPUAE.PUAE_VIDEO_NUMERATOR_PAL;
VsyncDenominator = LibPUAE.PUAE_VIDEO_DENOMINATOR_PAL;
}
UpdateAspectRatio(_syncSettings);
} }
protected override void SaveStateBinaryInternal(BinaryWriter writer) protected override void SaveStateBinaryInternal(BinaryWriter writer)
@ -310,11 +301,24 @@ namespace BizHawk.Emulation.Cores.Computers.Amiga
_currentSlot = reader.ReadInt32(); _currentSlot = reader.ReadInt32();
} }
private void UpdateAspectRatio(PUAESyncSettings settings) private void UpdateVideoStandard(bool initial)
{ {
_correctedWidth = settings.Region is VideoStandard.PAL var ntsc = initial
? LibPUAE.PAL_WIDTH ? _syncSettings.Region is VideoStandard.NTSC
: LibPUAE.PAL_WIDTH * 6 / 7; : BufferHeight == LibPUAE.NTSC_HEIGHT;
if (ntsc)
{
_correctedWidth = LibPUAE.PAL_WIDTH * 6 / 7;
VsyncNumerator = LibPUAE.PUAE_VIDEO_NUMERATOR_NTSC;
VsyncDenominator = LibPUAE.PUAE_VIDEO_DENOMINATOR_NTSC;
}
else
{
_correctedWidth = LibPUAE.PAL_WIDTH;
VsyncNumerator = LibPUAE.PUAE_VIDEO_NUMERATOR_PAL;
VsyncDenominator = LibPUAE.PUAE_VIDEO_DENOMINATOR_PAL;
}
} }
private static class FileNames private static class FileNames