private static void DoEmulation(LaunchDialogResult launchOptions) { var emulator = new EmulationEngine(launchOptions.BootromFile, launchOptions.RomFile) { Running = true }; Task.Run(() => emulator.Run()); var emuWindow = new OpenGLEmulationWindow(); emulator.FrameSource.NewFrame += (s, a) => emuWindow.SetNextFrame(a.Frame); emuWindow.KeyUp += (s, a) => { switch (a.Key) { case Key.Up: emulator.Buttons.Up = false; break; case Key.Down: emulator.Buttons.Down = false; break; case Key.Left: emulator.Buttons.Left = false; break; case Key.Right: emulator.Buttons.Right = false; break; case Key.X: emulator.Buttons.A = false; break; case Key.C: emulator.Buttons.B = false; break; case Key.V: emulator.Buttons.Start = false; break; case Key.B: emulator.Buttons.Select = false; break; } }; emuWindow.KeyDown += (s, a) => { switch (a.Key) { case Key.Up: emulator.Buttons.Up = true; break; case Key.Down: emulator.Buttons.Down = true; break; case Key.Left: emulator.Buttons.Left = true; break; case Key.Right: emulator.Buttons.Right = true; break; case Key.X: emulator.Buttons.A = true; break; case Key.C: emulator.Buttons.B = true; break; case Key.V: emulator.Buttons.Start = true; break; case Key.B: emulator.Buttons.Select = true; break; // Window scaling case Key.Number1: emuWindow.WindowScaleFactor = 1; break; case Key.Number2: emuWindow.WindowScaleFactor = 2; break; case Key.Number3: emuWindow.WindowScaleFactor = 3; break; case Key.Number4: emuWindow.WindowScaleFactor = 4; break; case Key.Number5: emuWindow.WindowScaleFactor = 5; break; } }; var debugViewModel = new DebugWindowViewModel(emulator.State, emulator); var debugWindow = new DebugWindow(debugViewModel); debugWindow.Show(); var frameCount = 0; emulator.FrameSource.NewFrame += (s, a) => frameCount++; Task.Run(async() => { long last = emulator.ElapsedCycles; while (!emuWindow.IsExiting) { await Task.Delay(1000); var elapsed = emulator.ElapsedCycles - last; if (emulator.Running) { var newTitle = $"Debugger ({(float)elapsed / 1000000} MHz, {frameCount} fps)"; Application.Instance.AsyncInvoke(() => { debugWindow.Title = newTitle; }); } last = emulator.ElapsedCycles; frameCount = 0; } }); using (emuWindow) { emuWindow.Run(60); } }
public EmulationWindow(LaunchDialogResult launchOptions) { var emulator = new EmulationEngine(launchOptions.BootromFile, launchOptions.RomFile) { Running = true }; Task.Run(() => emulator.Run()); // Debug window var debugViewModel = new DebugWindowViewModel(emulator.State, emulator); var debugWindow = new DebugWindow(debugViewModel); debugWindow.Show(); // Very basic key input handling KeyDown += (s, e) => { switch (e.Key) { case Keys.Up: emulator.Buttons.Up = true; break; case Keys.Down: emulator.Buttons.Down = true; break; case Keys.Left: emulator.Buttons.Left = true; break; case Keys.Right: emulator.Buttons.Right = true; break; case Keys.X: emulator.Buttons.A = true; break; case Keys.C: emulator.Buttons.B = true; break; case Keys.V: emulator.Buttons.Start = true; break; case Keys.B: emulator.Buttons.Select = true; break; } }; KeyUp += (s, e) => { switch (e.Key) { case Keys.Up: emulator.Buttons.Up = false; break; case Keys.Down: emulator.Buttons.Down = false; break; case Keys.Left: emulator.Buttons.Left = false; break; case Keys.Right: emulator.Buttons.Right = false; break; case Keys.X: emulator.Buttons.A = false; break; case Keys.C: emulator.Buttons.B = false; break; case Keys.V: emulator.Buttons.Start = false; break; case Keys.B: emulator.Buttons.Select = false; break; } }; var frameCount = 0; Task.Run(async() => { long last = emulator.ElapsedCycles; while (true) { await Task.Delay(1000); var elapsed = emulator.ElapsedCycles - last; if (emulator.Running) { var newTitle = $"Debugger ({(float)elapsed / 1000000} MHz, {frameCount} fps)"; Application.Instance.AsyncInvoke(() => { debugWindow.Title = newTitle; }); } last = emulator.ElapsedCycles; frameCount = 0; } }); var imageView = new ImageView(); emulator.FrameSource.NewFrame += (sender, args) => { frameCount++; Application.Instance.AsyncInvoke(() => { imageView.Image = args.Frame.ToEtoBitmap(); debugViewModel.Refresh(); }); }; Content = new Panel { Content = imageView, Size = new Size(160, 144) }; Resizable = false; }