/// <summary> /// Creates a machine view model with the currently loaded Spectrum model /// </summary> /// <returns>The view model that represents the machine</returns> private MachineViewModel CreateProjectMachine() { var machine = SpectrumMachine.CreateMachine( CodeDiscoverySolution.CurrentProject.ModelName, CodeDiscoverySolution.CurrentProject.EditionName); machine.ExecuteOnMainThread = ExecuteOnMainThreadAsync; // --- Set up diagnostics machine.VmStoppedWithException += MachineOnVmStoppedWithException; if (Options.LogIoAccess && machine.SpectrumVm.PortDevice is GenericPortDeviceBase genPort) { genPort.PortAccessLogger = new PortAccessLogger(); } if (Options.LogNextRegAccess && machine.SpectrumVm.NextDevice is NextFeatureSetDevice nextDev) { nextDev.RegisterAccessLogger = new NextRegisterAccessLogger(); } if (Options.LogFloppyCommands && machine.SpectrumVm.FloppyDevice is FloppyDevice floppy) { floppy.FloppyLogger = new FloppyDeviceLogger(); } var vm = new MachineViewModel(machine) { AllowKeyboardScan = true, StackDebugSupport = new SimpleStackDebugSupport(), DisplayMode = SpectrumDisplayMode.Fit, }; return(vm); }
public async Task StartWorksAfterPause() { // --- Arrange var sm = SpectrumMachine.CreateMachine(SpectrumModels.ZX_SPECTRUM_48, SpectrumModels.PAL); sm.Start(new ExecuteCycleOptions()); await sm.Pause(); var stateBefore = sm.VmState; var eventCounter = 0; var goesToRunning = false; sm.VmStateChanged += (s, e) => { eventCounter++; if (eventCounter == 1) { goesToRunning = e.OldState == VmState.Paused && e.NewState == VmState.Running; } }; // --- Act sm.Start(new ExecuteCycleOptions()); var stateAfter = sm.VmState; // --- Assert stateBefore.ShouldBe(VmState.Paused); stateAfter.ShouldBe(VmState.Running); sm.IsFirstStart.ShouldBeFalse(); goesToRunning.ShouldBeTrue(); }
/// <summary> /// Hides the constructor from external actors /// </summary> private AppViewModel() { var machine = SpectrumMachine.CreateMachine(SpectrumModels.ZX_SPECTRUM_48, SpectrumModels.PAL); var vm = MachineViewModel = new MachineViewModel(machine); vm.AllowKeyboardScan = true; vm.DisplayMode = SpectrumDisplayMode.Fit; vm.TapeSetName = "Pac-Man.tzx"; }
/// <summary> /// Resets the app's singleton view model at any time /// </summary> public static void Reset() { SpectrumMachine.Reset(); SpectrumMachine.RegisterProvider <IRomProvider>(() => new ResourceRomProvider()); SpectrumMachine.RegisterProvider <IKeyboardProvider>(() => new KeyboardProvider()); SpectrumMachine.RegisterProvider <IBeeperProvider>(() => new AudioWaveProvider()); SpectrumMachine.RegisterProvider <ITapeProvider>(() => new DefaultTapeProvider(typeof(AppViewModel).Assembly)); Default = new AppViewModel(); }
public void CreatingSpectrum48Works() { // --- Act var sm = SpectrumMachine.CreateMachine(SpectrumModels.ZX_SPECTRUM_48, SpectrumModels.PAL); // --- Assert sm.ShouldNotBeNull(); sm.SpectrumVm.ShouldNotBeNull(); sm.SpectrumVm.MemoryDevice.ShouldBeOfType <Spectrum48MemoryDevice>(); sm.SpectrumVm.PortDevice.ShouldBeOfType <Spectrum48PortDevice>(); sm.SpectrumVm.BeeperDevice.ShouldBeOfType <BeeperDevice>(); }
/// <summary> /// Creates a machine for the specified project /// </summary> /// <param name="project">Project to create a machine for</param> /// <param name="modelKey">ZX Spectrum model key</param> /// <param name="editionKey">ZX Spectrum edition key</param> /// <returns>ZX Spectrum virtual machine of the project</returns> public SpectrumMachine GetOrCreateMachine(Project project, string modelKey, string editionKey) { var machine = GetMachine(project); if (machine != null) { return(machine); } machine = SpectrumMachine.CreateMachine(modelKey, editionKey) as SpectrumMachine; _machines[project] = machine; return(machine); }
public async Task PauseKeepsNonStartedState() { // --- Arrange var sm = SpectrumMachine.CreateMachine(SpectrumModels.ZX_SPECTRUM_48, SpectrumModels.PAL); // --- Act var stateBefore = sm.VmState; await sm.Pause(); var stateAfter = sm.VmState; // --- Assert stateBefore.ShouldBe(VmState.None); stateAfter.ShouldBe(VmState.None); }
/// <summary> /// Creates a machine view model with the currently loaded Spectrum model /// </summary> /// <returns>The view model that represents the machine</returns> private MachineViewModel CreateProjectMachine() { var machine = SpectrumMachine.CreateMachine( CodeDiscoverySolution.CurrentProject.ModelName, CodeDiscoverySolution.CurrentProject.EditionName); machine.ExecuteOnMainThread = ExecuteOnMainThread; var vm = new MachineViewModel(machine) { AllowKeyboardScan = true, StackDebugSupport = new SimpleStackDebugSupport(), DisplayMode = SpectrumDisplayMode.Fit, }; return(vm); }
/// <summary> /// Initialization of the package; this method is called right after the package is sited, so this is the place /// where you can put all the initialization code that rely on services provided by VisualStudio. /// </summary> protected override async Task OnInitializeAsync() { // --- We are going to use this singleton instance Default = this; // --- Prepare project system extension files CheckCpsFiles(); await JoinableTaskFactory.SwitchToMainThreadAsync(); RegisterEditorFactory(new RomEditorFactory()); RegisterEditorFactory(new TzxEditorFactory()); RegisterEditorFactory(new TapEditorFactory()); RegisterEditorFactory(new DisAnnEditorFactory()); RegisterEditorFactory(new SpConfEditorFactory()); RegisterEditorFactory(new VfddEditorFactory()); // --- Register providers SpectrumMachine.Reset(); SpectrumMachine.RegisterProvider <IRomProvider>(() => new PackageRomProvider()); SpectrumMachine.RegisterProvider <IKeyboardProvider>(() => new KeyboardProvider()); SpectrumMachine.RegisterProvider <IKempstonProvider>(() => new KempstonProvider()); SpectrumMachine.RegisterProvider <IBeeperProvider>(() => new AudioWaveProvider()); SpectrumMachine.RegisterProvider <ITapeProvider>(() => new VsIntegratedTapeProvider()); SpectrumMachine.RegisterProvider <ISoundProvider>(() => new AudioWaveProvider(AudioProviderType.Psg)); DebugInfoProvider = new VsIntegratedSpectrumDebugInfoProvider(); SpectrumMachine.RegisterProvider <ISpectrumDebugInfoProvider>(() => DebugInfoProvider); // --- Prepare for package shutdown _packageDteEvents = ApplicationObject.Events.DTEEvents; _packageDteEvents.OnBeginShutdown += () => { PackageClosing?.Invoke(this, EventArgs.Empty); }; _solutionEvents = ApplicationObject.Events.SolutionEvents; _solutionEvents.Opened += OnSolutionOpened; _solutionEvents.AfterClosing += OnSolutionClosed; // --- Create other helper objects CodeManager = new Z80CodeManager(); TestManager = new Z80TestManager(); StateFileManager = new VmStateFileManager(); ErrorList = new ErrorListWindow(); TaskList = new TaskListWindow(); }
public async Task StopKeepsStoppedState() { // --- Arrange var sm = SpectrumMachine.CreateMachine(SpectrumModels.ZX_SPECTRUM_48, SpectrumModels.PAL); sm.Start(new ExecuteCycleOptions()); await sm.Stop(); // --- Act var stateBefore = sm.VmState; await sm.Stop(); var stateAfter = sm.VmState; // --- Assert stateBefore.ShouldBe(VmState.Stopped); stateAfter.ShouldBe(VmState.Stopped); }
public void FirstStartWorks() { // --- Arrange var sm = SpectrumMachine.CreateMachine(SpectrumModels.ZX_SPECTRUM_48, SpectrumModels.PAL); var stateBefore = sm.VmState; var goesToRunning = false; sm.VmStateChanged += (s, e) => { goesToRunning = e.OldState == VmState.None && e.NewState == VmState.Running; }; // --- Act sm.Start(new ExecuteCycleOptions()); var stateAfter = sm.VmState; // --- Assert stateBefore.ShouldBe(VmState.None); stateAfter.ShouldBe(VmState.Running); sm.IsFirstStart.ShouldBeTrue(); goesToRunning.ShouldBeTrue(); }
public void TestInitialize() { SpectrumMachine.Reset(); SpectrumMachine.RegisterProvider <IRomProvider>(() => new ResourceRomProvider(typeof(RomResourcesPlaceHolder).Assembly)); }
/// <summary> /// Initialization of the package; this method is called right after the package is sited, so this is the place /// where you can put all the initialization code that rely on services provided by VisualStudio. /// </summary> /// <param name="cancellationToken">A cancellation token to monitor for initialization cancellation, which can occur when VS is shutting down.</param> /// <param name="progress">A provider for progress updates.</param> /// <returns>A task representing the async work of package initialization, or an already completed task if there is none. Do not return null from this method.</returns> protected override async Task InitializeAsync(CancellationToken cancellationToken, IProgress <ServiceProgressData> progress) { await base.InitializeAsync(cancellationToken, progress); // --- Background initialization part Default = this; // --- Prepare project system extension files CheckCpsFiles(); Z80AsmLanguage = new Z80AsmLanguageService(this); // --- Special providers for the ZX Spectrum virtual machine DebugInfoProvider = new VsIntegratedSpectrumDebugInfoProvider(); SpectrumMachine.Reset(); SpectrumMachine.RegisterDefaultProviders(); SpectrumMachine.RegisterProvider <IRomProvider>(() => new PackageRomProvider()); SpectrumMachine.RegisterProvider <IBeeperProvider>(() => new AudioWaveProvider()); SpectrumMachine.RegisterProvider <ISoundProvider>(() => new AudioWaveProvider(AudioProviderType.Psg)); SpectrumMachine.RegisterProvider <ITapeLoadProvider>(() => new VsIntegratedTapeLoadProvider()); SpectrumMachine.RegisterProvider <ITapeSaveProvider>(() => new VsIntegratedTapeSaveProvider()); SpectrumMachine.RegisterProvider <IKempstonProvider>(() => new KempstonProvider()); SpectrumMachine.RegisterProvider <ISpectrumDebugInfoProvider>(() => DebugInfoProvider); SpectrumMachine.RegisterStackDebugSupport(new SimpleStackDebugSupport()); // --- Initialize other services BreakpointChangeWatcher = new BreakpointChangeWatcher(); BreakpointChangeWatcher.Start(); // --- Main thread initialization part await JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken); // --- Initialize the package here InitializeCommands(); // --- Register custom editors RegisterEditorFactory(new RomEditorFactory()); RegisterEditorFactory(new TzxEditorFactory()); RegisterEditorFactory(new TapEditorFactory()); // --- Manage the solution and its events Solution = new SolutionStructure(); Solution.ActiveProjectChanged += OnActiveProjectChanged; ErrorList = new ErrorListWindow(); TaskList = new TaskListWindow(); // --- Create view models EmulatorViewModel = new EmulatorViewModel(); SpectrumViewModel = new SpectrumEmulatorToolWindowViewModel(); KeyboardToolModel = new KeyboardToolWindowViewModel(); RegistersViewModel = new RegistersToolWindowViewModel(); MemoryViewModel = new MemoryToolWindowViewModel(); DisassemblyViewModel = new DisassemblyToolWindowViewModel(); StackViewModel = new StackToolWindowViewModel(); BasicListViewModel = new BasicListToolWindowViewModel(); WatchViewModel = new WatchToolWindowViewModel(); // --- Prepare the provider for debugging DebugInfoProvider.Prepare(); // --- Prepare language services Z80AsmClassifierProvider.AttachToPackage(); Z80AsmViewTaggerProvider.AttachToPackage(); Log("SpectNetIdePackage initialized."); }
public MachineInstanceChangedEventArgs(SpectrumMachine oldMachine, SpectrumMachine newMachine) { OldMachine = oldMachine; NewMachine = newMachine; }