Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Locked timing #37

Merged
merged 28 commits into from
Aug 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions clean.sh
Original file line number Diff line number Diff line change
@@ -1 +1,9 @@
rm *.zip
rm -rf src/Zen.Common/bin
rm -rf src/Zen.System/bin
rm -rf src/Zen.Z80/bin
rm -rf src/Zen.Z80.Tests/bin
rm -rf src/Zen.Desktop.Host/bin
rm -rf src/Zen.Utilities/bin
rm -rf src/Zen.Z80.Test.JSMoo/bin
rm -rf src/Zen.Z80.Tests.Fuse/bin
65 changes: 32 additions & 33 deletions src/Zen.Desktop.Host/Infrastructure/Host.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,6 @@ namespace Zen.Desktop.Host.Infrastructure;

public class Host : Game
{
private const int StartPause = 30;

// ReSharper disable once PrivateFieldCanBeConvertedToLocalVariable
private readonly GraphicsDeviceManager _graphicsDeviceManager;

Expand All @@ -41,8 +39,6 @@ public class Host : Game

private MenuSystem _menuSystem;

private int? _pause = StartPause;

private bool _soundState;

private WaveVisualiser _waveVisualiser;
Expand Down Expand Up @@ -122,6 +118,14 @@ private void SetMotherboard(Model model)
_motherboard.Fast = AppSettings.Instance.Speed == Speed.Fast;
_motherboard.Slow = AppSettings.Instance.Speed == Speed.Slow;

if (AppSettings.Instance.Speed == Speed.Locked)
{
_motherboard.Worker.Locked = true;
_motherboard.AyAudio.Locked = true;

TargetElapsedTime = TimeSpan.FromMilliseconds(20);
}

_imageName = $"Standard {model} ROM";

AppSettings.Instance.SystemModel = model;
Expand Down Expand Up @@ -152,8 +156,6 @@ protected override void OnActivated(object sender, EventArgs args)
{
_motherboard.Start();

_motherboard.Pause();

_hostStarted = true;

_motherboard.Fast = AppSettings.Instance.Speed == Speed.Fast;
Expand Down Expand Up @@ -216,16 +218,9 @@ private void ScanComplete()

protected override void Update(GameTime gameTime)
{
if (_pause != null)
if (AppSettings.Instance.Speed == Speed.Locked)
{
_pause--;
}

if (_pause == 0)
{
_pause = null;

_motherboard.Resume();
_motherboard.Worker.RunFrame();
}

if (Keyboard.GetState().IsKeyDown(Keys.Tab) && _menuSystem == null)
Expand Down Expand Up @@ -261,7 +256,6 @@ private void MenuFinished(MenuResult result, object arguments)
SetMotherboard((Model) arguments);
_motherboard.Fast = false;
_motherboard.Slow = false;
_motherboard.AyAudio.BufferSize = System.Modules.Audio.Constants.DefaultBufferSize;
AppSettings.Instance.Speed = Speed.Normal;

_motherboard.Start();
Expand All @@ -278,35 +272,40 @@ private void MenuFinished(MenuResult result, object arguments)
case MenuResult.SpeedNormal:
_motherboard.Fast = false;
_motherboard.Slow = false;
_motherboard.AyAudio.BufferSize = System.Modules.Audio.Constants.DefaultBufferSize;
_motherboard.Worker.Locked = false;
_motherboard.AyAudio.Locked = false;

TargetElapsedTime = TimeSpan.FromTicks(166667L);

break;

case MenuResult.SpeedLocked:
_motherboard.Fast = false;
_motherboard.Slow = false;
_motherboard.Worker.Locked = true;
_motherboard.AyAudio.Locked = true;

TargetElapsedTime = TimeSpan.FromMilliseconds(20);

break;

case MenuResult.SpeedFast:
_motherboard.Fast = true;
_motherboard.Slow = false;
_motherboard.AyAudio.BufferSize = System.Modules.Audio.Constants.DefaultBufferSize;
_motherboard.Worker.Locked = false;
_motherboard.AyAudio.Locked = false;

TargetElapsedTime = TimeSpan.FromTicks(166667L);

break;

case MenuResult.SpeedSlow:
_motherboard.Fast = false;
_motherboard.Slow = true;
_motherboard.AyAudio.BufferSize = System.Modules.Audio.Constants.DefaultBufferSize;

break;

case MenuResult.SpeedHalf:
_motherboard.Fast = false;
_motherboard.Slow = false;
_motherboard.AyAudio.BufferSize = System.Modules.Audio.Constants.DefaultBufferSize * 2;

break;

case MenuResult.SpeedQuarter:
_motherboard.Fast = false;
_motherboard.Slow = false;
_motherboard.AyAudio.BufferSize = System.Modules.Audio.Constants.DefaultBufferSize * 4;
_motherboard.Worker.Locked = false;
_motherboard.AyAudio.Locked = false;

TargetElapsedTime = TimeSpan.FromTicks(166667L);

break;

Expand Down
3 changes: 1 addition & 2 deletions src/Zen.Desktop.Host/Infrastructure/Menu/MenuResult.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,7 @@ public enum MenuResult
SpeedNormal,
SpeedFast,
SpeedSlow,
SpeedQuarter,
SpeedHalf,
SpeedLocked,
SaveState,
LoadState,
ChangeScale,
Expand Down
21 changes: 8 additions & 13 deletions src/Zen.Desktop.Host/Infrastructure/Menu/SpeedMenu.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,13 @@ public override List<Label> GetMenu()
{
new(0, true, "Zen - Emulator Speed", Color.White, 0, 0, null),
new(1, false, $"[1] {(AppSettings.Instance.Speed == Speed.Slow ? ">" : " ")} Scanline {(AppSettings.Instance.Speed == Speed.Slow ? "<" : " ")}", Color.Yellow, 1, 3, Keys.D1, Color.LightGreen),
new(2, false, $"[2] {(AppSettings.Instance.Speed == Speed.Quarter ? ">" : " ")} Quarter {(AppSettings.Instance.Speed == Speed.Quarter ? "<" : " ")}", Color.Yellow, 1, 5, Keys.D2, Color.LightGreen),
new(3, false, $"[3] {(AppSettings.Instance.Speed == Speed.Half ? ">" : " ")} Half {(AppSettings.Instance.Speed == Speed.Half ? "<" : " ")}", Color.Yellow, 1, 7, Keys.D3, Color.LightGreen),
new(4, false, $"[4] {(AppSettings.Instance.Speed == Speed.Normal ? ">" : " ")} Normal {(AppSettings.Instance.Speed == Speed.Normal ? "<" : " ")}", Color.Yellow, 1, 9, Keys.D4, Color.LightGreen),
new(5, false, $"[5] {(AppSettings.Instance.Speed == Speed.Fast ? ">" : " ")} As Fast As Possible {(AppSettings.Instance.Speed == Speed.Fast ? "<" : " ")}", Color.Yellow, 1, 11, Keys.D5, Color.LightGreen),
new(2, false, $"[2] {(AppSettings.Instance.Speed == Speed.Locked ? ">" : " ")} Locked 50Hz {(AppSettings.Instance.Speed == Speed.Locked ? "<" : " ")}", Color.Yellow, 1, 5, Keys.D2, Color.LightGreen),
new(3, false, $"[3] {(AppSettings.Instance.Speed == Speed.Normal ? ">" : " ")} Normal {(AppSettings.Instance.Speed == Speed.Normal ? "<" : " ")}", Color.Yellow, 1, 7, Keys.D3, Color.LightGreen),
new(4, false, $"[4] {(AppSettings.Instance.Speed == Speed.Fast ? ">" : " ")} As Fast As Possible {(AppSettings.Instance.Speed == Speed.Fast ? "<" : " ")}", Color.Yellow, 1, 9, Keys.D4, Color.LightGreen),
new(96, true, "This setting is not saved", Color.Wheat, 0, 15, null),
new(97, true, "Zen always starts", Color.Wheat, 0, 17, null),
new(98, true, "at Normal speed", Color.Wheat, 0, 18, null),
new(98, true, "at Normal speed or", Color.Wheat, 0, 18, null),
new(98, true, "Locked 50Hz on Linux", Color.Wheat, 0, 19, null),
new(99, true, "[ESC] Close Menu", Color.FromNonPremultiplied(255, 64, 64, 255), 0, 21, Keys.Escape, Color.LightGreen)
};

Expand All @@ -36,21 +36,16 @@ public override (MenuResult Result, MenuBase NewMenu, object Arguments) ItemSele
return (MenuResult.SpeedSlow, null, null);

case 2:
AppSettings.Instance.Speed = Speed.Quarter;
AppSettings.Instance.Speed = Speed.Locked;

return (MenuResult.SpeedQuarter, null, null);
return (MenuResult.SpeedLocked, null, null);

case 3:
AppSettings.Instance.Speed = Speed.Half;

return (MenuResult.SpeedHalf, null, null);

case 4:
AppSettings.Instance.Speed = Speed.Normal;

return (MenuResult.SpeedNormal, null, null);

case 5:
case 4:
AppSettings.Instance.Speed = Speed.Fast;

return (MenuResult.SpeedFast, null, null);
Expand Down
4 changes: 3 additions & 1 deletion src/Zen.Desktop.Host/Infrastructure/Settings/AppSettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,9 @@ private static AppSettings GetAppSettings()
Logger.LogException(nameof(AppSettings), exception);
}

settings.Speed = Speed.Normal;
settings.Speed = RuntimeInformation.IsOSPlatform(OSPlatform.Linux)
? Speed.Locked
: Speed.Normal;

return settings;
}
Expand Down
3 changes: 1 addition & 2 deletions src/Zen.Desktop.Host/Infrastructure/Settings/Speed.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,7 @@ namespace Zen.Desktop.Host.Infrastructure.Settings;
public enum Speed
{
Slow,
Quarter,
Half,
Locked,
Normal,
Fast
}
30 changes: 13 additions & 17 deletions src/Zen.System/Modules/AyAudio.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public class AyAudio : IDisposable

private byte _registerNumber;

private float[] _buffer;
private readonly float[] _buffer;

private int _readQueue;

Expand All @@ -42,18 +42,6 @@ public class AyAudio : IDisposable

private ManualResetEvent? _workerResetEvent;

private int _bufferSize = Constants.DefaultBufferSize;

public int BufferSize
{
set
{
_bufferSize = value;

_buffer = new float[_bufferSize];
}
}

public IZenAudioEngine AudioEngine
{
set
Expand All @@ -65,6 +53,8 @@ public IZenAudioEngine AudioEngine
get => _engine;
}

public bool Locked { get; set; }

public bool Silent { get; set; }

public Action<float[]>? AySignalHook { get; set; }
Expand All @@ -75,7 +65,7 @@ public AyAudio(IZenAudioEngine engine)
{
_engine = engine;

_buffer = new float[_bufferSize];
_buffer = new float[Constants.DefaultBufferSize];

_cancellationTokenSource = new CancellationTokenSource();

Expand All @@ -90,7 +80,13 @@ public AyAudio(IZenAudioEngine engine)

public void Start()
{
_audioThread = Task.Run(RunFrame, _cancellationToken);
_audioThread = Task.Run(() =>
{
if (! Locked)
{
RunFrame();
}
}, _cancellationToken);
}

public void FrameReady(ManualResetEvent resetEvent)
Expand Down Expand Up @@ -283,7 +279,7 @@ private void RunFrame()
{
var signals = new float[3];

var bufferStep = (float) Common.Constants.FrameCycles / (_bufferSize - 1);
var bufferStep = (float) Common.Constants.FrameCycles / (Constants.DefaultBufferSize - 1);

while (! _cancellationToken.IsCancellationRequested)
{
Expand All @@ -293,7 +289,7 @@ private void RunFrame()

_resetEvent.Reset();

for (var i = 0; i < _bufferSize; i++)
for (var i = 0; i < Constants.DefaultBufferSize; i++)
{
if (Silent)
{
Expand Down
3 changes: 1 addition & 2 deletions src/Zen.System/Modules/Ram.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,11 @@ public class Ram

private byte _screenBank = 5;

public bool ProtectRom { get; set; }
public bool ProtectRom { get; init; }

public byte ScreenBank
{
set => _screenBank = (byte) (value == 1 ? 5 : 7);
get => _screenBank;
}

public byte[] WorkingScreenRam => _banks[_screenBank];
Expand Down
Loading