puae: fix framerate and resolutions, cleanup
todo: av dumper dies in ntsc mode on frame 11...
This commit is contained in:
parent
2a0870234e
commit
118e2876a4
Binary file not shown.
|
@ -451,7 +451,7 @@ namespace BizHawk.Emulation.Common
|
||||||
|
|
||||||
case ".ADF":
|
case ".ADF":
|
||||||
case ".ADZ":
|
case ".ADZ":
|
||||||
case ".DMS":
|
case ".DMS":
|
||||||
case ".FDI":
|
case ".FDI":
|
||||||
// case ".HDF":
|
// case ".HDF":
|
||||||
// case ".LHA":
|
// case ".LHA":
|
||||||
|
|
|
@ -9,9 +9,21 @@ namespace BizHawk.Emulation.Cores.Computers.Amiga
|
||||||
public abstract class LibPUAE : LibWaterboxCore
|
public abstract class LibPUAE : LibWaterboxCore
|
||||||
{
|
{
|
||||||
public const int PAL_WIDTH = 720;
|
public const int PAL_WIDTH = 720;
|
||||||
public const int PAL_HEIGHT = 576;
|
public const int NTSC_WIDTH = PAL_WIDTH;
|
||||||
public const int NTSC_WIDTH = 720;
|
// the core renders 576 which is what libretro displays
|
||||||
public const int NTSC_HEIGHT = 480;
|
// but default window height is 568 in original PUAE and WinUAE
|
||||||
|
// this lets us hide a black line and a weird artifact that our A600 config has there
|
||||||
|
public const int PAL_HEIGHT = 568;
|
||||||
|
// WinUAE displays 484 lines for NTSC
|
||||||
|
// but libretro port only renders 482 and then only displays 480
|
||||||
|
public const int NTSC_HEIGHT = 482;
|
||||||
|
// libretro defines PUAE_VIDEO_HZ_PAL as 49.9204101562500000f
|
||||||
|
public const int PUAE_VIDEO_NUMERATOR_PAL = 102237;
|
||||||
|
public const int PUAE_VIDEO_DENOMINATOR_PAL = 2048;
|
||||||
|
// libretro defines PUAE_VIDEO_HZ_NTSC as 59.8260993957519531f
|
||||||
|
public const int PUAE_VIDEO_NUMERATOR_NTSC = 299130497;
|
||||||
|
public const int PUAE_VIDEO_DENOMINATOR_NTSC = 5000000;
|
||||||
|
|
||||||
public const int FASTMEM_AUTO = -1;
|
public const int FASTMEM_AUTO = -1;
|
||||||
public const int MAX_FLOPPIES = 4;
|
public const int MAX_FLOPPIES = 4;
|
||||||
public const int FILENAME_MAXLENGTH = 64;
|
public const int FILENAME_MAXLENGTH = 64;
|
||||||
|
|
|
@ -15,35 +15,48 @@ namespace BizHawk.Emulation.Cores.Computers.Amiga
|
||||||
isReleased: false)]
|
isReleased: false)]
|
||||||
public partial class PUAE : WaterboxCore
|
public partial class PUAE : WaterboxCore
|
||||||
{
|
{
|
||||||
private readonly List<IRomAsset> _roms;
|
private static readonly Configuration ConfigPAL = new Configuration
|
||||||
//private readonly List<IDiscAsset> _discs;
|
{
|
||||||
private List<string> _args;
|
SystemId = VSystemID.Raw.Amiga,
|
||||||
private string _chipsetCompatible = "";
|
MaxSamples = 2 * 1024,
|
||||||
|
DefaultWidth = LibPUAE.PAL_WIDTH,
|
||||||
|
DefaultHeight = LibPUAE.PAL_HEIGHT,
|
||||||
|
MaxWidth = LibPUAE.PAL_WIDTH,
|
||||||
|
MaxHeight = LibPUAE.PAL_HEIGHT,
|
||||||
|
DefaultFpsNumerator = LibPUAE.PUAE_VIDEO_NUMERATOR_PAL,
|
||||||
|
DefaultFpsDenominator = LibPUAE.PUAE_VIDEO_DENOMINATOR_PAL
|
||||||
|
};
|
||||||
|
|
||||||
|
private static readonly Configuration ConfigNTSC = new Configuration
|
||||||
|
{
|
||||||
|
SystemId = VSystemID.Raw.Amiga,
|
||||||
|
MaxSamples = 2 * 1024,
|
||||||
|
DefaultWidth = LibPUAE.NTSC_WIDTH,
|
||||||
|
DefaultHeight = LibPUAE.NTSC_HEIGHT,
|
||||||
|
MaxWidth = LibPUAE.NTSC_WIDTH,
|
||||||
|
MaxHeight = LibPUAE.NTSC_HEIGHT,
|
||||||
|
DefaultFpsNumerator = LibPUAE.PUAE_VIDEO_NUMERATOR_NTSC,
|
||||||
|
DefaultFpsDenominator = LibPUAE.PUAE_VIDEO_DENOMINATOR_NTSC
|
||||||
|
};
|
||||||
|
|
||||||
|
private string _chipsetCompatible = "";
|
||||||
|
private readonly List<IRomAsset> _roms;
|
||||||
|
private List<string> _args;
|
||||||
private int _currentDrive;
|
private int _currentDrive;
|
||||||
private int _currentSlot;
|
private int _currentSlot;
|
||||||
|
|
||||||
private bool _ejectPressed;
|
private bool _ejectPressed;
|
||||||
private bool _insertPressed;
|
private bool _insertPressed;
|
||||||
private bool _nextSlotPressed;
|
private bool _nextSlotPressed;
|
||||||
private bool _nextDrivePressed;
|
private bool _nextDrivePressed;
|
||||||
|
private int _correctedWidth;
|
||||||
|
|
||||||
|
public override int VirtualWidth => _correctedWidth;
|
||||||
|
|
||||||
[CoreConstructor(VSystemID.Raw.Amiga)]
|
[CoreConstructor(VSystemID.Raw.Amiga)]
|
||||||
public PUAE(CoreLoadParameters<object, PUAESyncSettings> lp)
|
public PUAE(CoreLoadParameters<object, PUAESyncSettings> lp)
|
||||||
: base(lp.Comm, new Configuration
|
: base(lp.Comm, lp.SyncSettings.Region is VideoStandard.PAL ? ConfigPAL : ConfigNTSC)
|
||||||
{
|
|
||||||
DefaultWidth = LibPUAE.PAL_WIDTH,
|
|
||||||
DefaultHeight = LibPUAE.PAL_HEIGHT,
|
|
||||||
MaxWidth = LibPUAE.PAL_WIDTH,
|
|
||||||
MaxHeight = LibPUAE.PAL_HEIGHT,
|
|
||||||
MaxSamples = 2 * 1024,
|
|
||||||
SystemId = VSystemID.Raw.Amiga,
|
|
||||||
DefaultFpsNumerator = 50,
|
|
||||||
DefaultFpsDenominator = 1
|
|
||||||
})
|
|
||||||
{
|
{
|
||||||
_roms = lp.Roms;
|
_roms = lp.Roms;
|
||||||
//_discs = lp.Discs;
|
|
||||||
_syncSettings = lp.SyncSettings ?? new();
|
_syncSettings = lp.SyncSettings ?? new();
|
||||||
_syncSettings.FloppyDrives = Math.Min(LibPUAE.MAX_FLOPPIES, _syncSettings.FloppyDrives);
|
_syncSettings.FloppyDrives = Math.Min(LibPUAE.MAX_FLOPPIES, _syncSettings.FloppyDrives);
|
||||||
DeterministicEmulation = lp.DeterministicEmulationRequested || _syncSettings.FloppySpeed is FloppySpeed._100;
|
DeterministicEmulation = lp.DeterministicEmulationRequested || _syncSettings.FloppySpeed is FloppySpeed._100;
|
||||||
|
@ -54,6 +67,7 @@ namespace BizHawk.Emulation.Cores.Computers.Amiga
|
||||||
_syncSettings.ControllerPort2
|
_syncSettings.ControllerPort2
|
||||||
];
|
];
|
||||||
|
|
||||||
|
UpdateAspectRatio(_syncSettings);
|
||||||
CreateArguments(_syncSettings);
|
CreateArguments(_syncSettings);
|
||||||
ControllerDefinition = CreateControllerDefinition(_syncSettings);
|
ControllerDefinition = CreateControllerDefinition(_syncSettings);
|
||||||
|
|
||||||
|
@ -71,53 +85,15 @@ namespace BizHawk.Emulation.Cores.Computers.Amiga
|
||||||
|
|
||||||
for (var index = 0; index < lp.Roms.Count; index++)
|
for (var index = 0; index < lp.Roms.Count; index++)
|
||||||
{
|
{
|
||||||
if (lp.Roms[index].Extension.ToLowerInvariant() == ".hdf") // doesn't work yet
|
_exe.AddReadonlyFile(lp.Roms[index].FileData, FileNames.FD + index);
|
||||||
|
if (index < _syncSettings.FloppyDrives)
|
||||||
{
|
{
|
||||||
var access = "ro";
|
AppendSetting($"floppy{index}={FileNames.FD}{index}");
|
||||||
var device_name = "DH0";
|
AppendSetting($"floppy{index}type={(int)DriveType.DRV_35_DD}");
|
||||||
var volume_name = FileNames.HD + index;
|
AppendSetting("floppy_write_protect=true");
|
||||||
var blocks_per_track = 32;
|
|
||||||
var surfaces = 1;
|
|
||||||
var reserved = 2;
|
|
||||||
var block_size = 512;
|
|
||||||
var boot_priority = 0;
|
|
||||||
var filesys_path = "";
|
|
||||||
var controller_unit = "uae0";
|
|
||||||
|
|
||||||
if (Encoding.ASCII.GetString(lp.Roms[index].FileData, 0, 3) == "RDS")
|
|
||||||
{
|
|
||||||
blocks_per_track = 0;
|
|
||||||
surfaces = 0;
|
|
||||||
reserved = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
_exe.AddReadonlyFile(lp.Roms[index].FileData, volume_name);
|
|
||||||
AppendSetting($"hardfile2=" +
|
|
||||||
$"{access}," +
|
|
||||||
$"{device_name}:" +
|
|
||||||
$"\"{volume_name}\"," +
|
|
||||||
$"{blocks_per_track}," +
|
|
||||||
$"{surfaces}," +
|
|
||||||
$"{reserved}," +
|
|
||||||
$"{block_size}," +
|
|
||||||
$"{boot_priority}," +
|
|
||||||
$"{filesys_path}," +
|
|
||||||
$"{controller_unit}");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_exe.AddReadonlyFile(lp.Roms[index].FileData, FileNames.FD + index);
|
|
||||||
if (index < _syncSettings.FloppyDrives)
|
|
||||||
{
|
|
||||||
AppendSetting($"floppy{index}={FileNames.FD}{index}");
|
|
||||||
AppendSetting($"floppy{index}type={(int)DriveType.DRV_35_DD}");
|
|
||||||
AppendSetting("floppy_write_protect=true");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//AppendSetting("filesystem2=ro,DH0:data:Floppy/,0");
|
|
||||||
|
|
||||||
var (kickstartData, kickstartInfo) = CoreComm.CoreFileProvider.GetFirmwareWithGameInfoOrThrow(
|
var (kickstartData, kickstartInfo) = CoreComm.CoreFileProvider.GetFirmwareWithGameInfoOrThrow(
|
||||||
new(VSystemID.Raw.Amiga, _chipsetCompatible),
|
new(VSystemID.Raw.Amiga, _chipsetCompatible),
|
||||||
"Firmware files are required!");
|
"Firmware files are required!");
|
||||||
|
@ -128,9 +104,8 @@ namespace BizHawk.Emulation.Cores.Computers.Amiga
|
||||||
"-r", kickstartInfo.Name
|
"-r", kickstartInfo.Name
|
||||||
]);
|
]);
|
||||||
|
|
||||||
var s = string.Join(" ", _args);
|
|
||||||
Console.WriteLine();
|
Console.WriteLine();
|
||||||
Console.WriteLine(s);
|
Console.WriteLine(string.Join(" ", _args));
|
||||||
Console.WriteLine();
|
Console.WriteLine();
|
||||||
|
|
||||||
if (!paue.Init(_args.Count, _args.ToArray()))
|
if (!paue.Init(_args.Count, _args.ToArray()))
|
||||||
|
@ -282,7 +257,17 @@ namespace BizHawk.Emulation.Cores.Computers.Amiga
|
||||||
|
|
||||||
protected override void FrameAdvancePost()
|
protected override void FrameAdvancePost()
|
||||||
{
|
{
|
||||||
VsyncNumerator = BufferHeight == LibPUAE.NTSC_HEIGHT ? 60 : 50;
|
if (BufferHeight == LibPUAE.NTSC_HEIGHT)
|
||||||
|
{
|
||||||
|
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)
|
||||||
|
@ -305,6 +290,13 @@ namespace BizHawk.Emulation.Cores.Computers.Amiga
|
||||||
_currentSlot = reader.ReadInt32();
|
_currentSlot = reader.ReadInt32();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void UpdateAspectRatio(PUAESyncSettings settings)
|
||||||
|
{
|
||||||
|
_correctedWidth = settings.Region is VideoStandard.PAL
|
||||||
|
? LibPUAE.PAL_WIDTH
|
||||||
|
: LibPUAE.PAL_WIDTH * 6 / 7;
|
||||||
|
}
|
||||||
|
|
||||||
private static class FileNames
|
private static class FileNames
|
||||||
{
|
{
|
||||||
public const string FD = "FloppyDisk";
|
public const string FD = "FloppyDisk";
|
||||||
|
|
|
@ -7,10 +7,9 @@ ECL_EXPORT bool Init(int argc, char **argv)
|
||||||
|
|
||||||
pix_bytes = 4;
|
pix_bytes = 4;
|
||||||
defaultw = PUAE_VIDEO_WIDTH;
|
defaultw = PUAE_VIDEO_WIDTH;
|
||||||
defaulth = PUAE_VIDEO_HEIGHT_PAL;
|
defaulth = PUAE_WINDOW_HEIGHT_PAL;
|
||||||
retrow = PUAE_VIDEO_WIDTH;
|
retrow_crop = retrow = PUAE_VIDEO_WIDTH;
|
||||||
retrow_crop = retrow;
|
retroh_crop = retroh = PUAE_WINDOW_HEIGHT_PAL;
|
||||||
retroh_crop = retroh;
|
|
||||||
|
|
||||||
retro_set_audio_sample_batch(biz_audio_cb);
|
retro_set_audio_sample_batch(biz_audio_cb);
|
||||||
init_output_audio_buffer(2048);
|
init_output_audio_buffer(2048);
|
||||||
|
@ -40,7 +39,7 @@ ECL_EXPORT void FrameAdvance(MyFrameInfo* f)
|
||||||
{
|
{
|
||||||
bool is_ntsc = minfirstline == VBLANK_ENDLINE_NTSC;
|
bool is_ntsc = minfirstline == VBLANK_ENDLINE_NTSC;
|
||||||
f->base.Width = PUAE_VIDEO_WIDTH;
|
f->base.Width = PUAE_VIDEO_WIDTH;
|
||||||
f->base.Height = is_ntsc ? PUAE_VIDEO_HEIGHT_NTSC : PUAE_VIDEO_HEIGHT_PAL;
|
f->base.Height = is_ntsc ? PUAE_WINDOW_HEIGHT_NTSC : PUAE_WINDOW_HEIGHT_PAL;
|
||||||
thisframe_y_adjust = minfirstline;
|
thisframe_y_adjust = minfirstline;
|
||||||
visible_left_border = retro_max_diwlastword - retrow;
|
visible_left_border = retro_max_diwlastword - retrow;
|
||||||
|
|
||||||
|
@ -103,7 +102,7 @@ ECL_EXPORT void FrameAdvance(MyFrameInfo* f)
|
||||||
m68k_go(1, 1);
|
m68k_go(1, 1);
|
||||||
upload_output_audio_buffer();
|
upload_output_audio_buffer();
|
||||||
f->base.Samples = sound_sample_count;
|
f->base.Samples = sound_sample_count;
|
||||||
memcpy(f->base.VideoBuffer, retro_bmp, sizeof(retro_bmp) / sizeof(retro_bmp[0]));
|
memcpy(f->base.VideoBuffer, retro_bmp, f->base.Width * f->base.Height * pix_bytes);
|
||||||
sound_buffer = NULL;
|
sound_buffer = NULL;
|
||||||
|
|
||||||
for (int port = 0; port <= 1; port++)
|
for (int port = 0; port <= 1; port++)
|
||||||
|
|
|
@ -22,6 +22,8 @@
|
||||||
// libretro
|
// libretro
|
||||||
#include "libretro/libretro-core.h"
|
#include "libretro/libretro-core.h"
|
||||||
|
|
||||||
|
static const int PUAE_WINDOW_HEIGHT_NTSC = 482;
|
||||||
|
static const int PUAE_WINDOW_HEIGHT_PAL = 568;
|
||||||
static const int FILENAME_MAXLENGTH = 4;
|
static const int FILENAME_MAXLENGTH = 4;
|
||||||
static const int KEY_COUNT = 0x68;
|
static const int KEY_COUNT = 0x68;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue