Skip to content

Commit

Permalink
Merge pull request #37 from stevehjohn/locked-timing
Browse files Browse the repository at this point in the history
Locked timing
  • Loading branch information
stevehjohn authored Aug 16, 2024
2 parents 2ad71b2 + c8ef4c6 commit 6564386
Show file tree
Hide file tree
Showing 11 changed files with 132 additions and 122 deletions.
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

0 comments on commit 6564386

Please sign in to comment.