예제 #1
0
        /// <summary>
        /// Creates an instance of the virtual machine
        /// </summary>
        /// <param name="modelKey">The model key of the virtual machine</param>
        /// <param name="editionKey">The edition key of the virtual machine</param>
        /// <param name="devices">Devices to create the machine</param>
        private SpectrumMachine(string modelKey, string editionKey, DeviceInfoCollection devices)
        {
            // --- Store model information
            ModelKey   = modelKey;
            EditionKey = editionKey;

            // --- Create the engine and set up properties
            SpectrumVm = new SpectrumEngine(devices);

            Cpu = new CpuZ80(SpectrumVm.Cpu);

            var roms = new List <ReadOnlyMemorySlice>();

            for (var i = 0; i < SpectrumVm.RomConfiguration.NumberOfRoms; i++)
            {
                roms.Add(new ReadOnlyMemorySlice(SpectrumVm.RomDevice.GetRomBytes(i)));
            }
            Roms = new ReadOnlyCollection <ReadOnlyMemorySlice>(roms);

            PagingInfo = new MemoryPagingInfo(SpectrumVm.MemoryDevice);
            Memory     = new SpectrumMemoryContents(SpectrumVm.MemoryDevice, SpectrumVm.Cpu);

            var ramBanks = new List <MemorySlice>();

            if (SpectrumVm.MemoryConfiguration.RamBanks != null)
            {
                for (var i = 0; i < SpectrumVm.MemoryConfiguration.RamBanks; i++)
                {
                    ramBanks.Add(new MemorySlice(SpectrumVm.MemoryDevice.GetRamBank(i)));
                }
            }
            RamBanks = new ReadOnlyCollection <MemorySlice>(ramBanks);

            Keyboard              = new KeyboardEmulator(SpectrumVm);
            ScreenConfiguration   = SpectrumVm.ScreenConfiguration;
            ScreenRenderingTable  = new ScreenRenderingTable(SpectrumVm.ScreenDevice);
            ScreenBitmap          = new ScreenBitmap(SpectrumVm.ScreenDevice);
            ScreenRenderingStatus = new ScreenRenderingStatus(SpectrumVm);
            BeeperConfiguration   = SpectrumVm.AudioConfiguration;
            BeeperSamples         = new AudioSamples(SpectrumVm.BeeperDevice);
            BeeperProvider        = SpectrumVm.BeeperProvider;
            SoundConfiguration    = SpectrumVm.SoundConfiguration;
            SoundProvider         = SpectrumVm.SoundProvider;
            AudioSamples          = new AudioSamples(SpectrumVm.SoundDevice);
            Breakpoints           = new CodeBreakpoints(SpectrumVm.DebugInfoProvider);

            // --- Hook device events
            SpectrumVm.TapeLoadDevice.LoadCompleted += (s, e) => FastLoadCompleted?.Invoke(s, e);
            SpectrumVm.TapeSaveDevice.LeftSaveMode  += (s, e) => LeftSaveMode?.Invoke(s, e);

            // --- Initialize machine state
            _clockProvider           = GetProvider <IClockProvider>();
            _physicalFrameClockCount = _clockProvider.GetFrequency() / (double)SpectrumVm.BaseClockFrequency *
                                       ScreenConfiguration.ScreenRenderingFrameTactCount;
            MachineState = VmState.None;
            ExecutionCompletionReason = ExecutionCompletionReason.None;
        }
예제 #2
0
 /// <summary>
 /// Allow the device to react to the start of a new frame
 /// </summary>
 public void OnCpuOperationCompleted()
 {
     SetTapeMode();
     if (CurrentMode == TapeOperationMode.Load &&
         HostVm.ExecuteCycleOptions.FastTapeMode &&
         TapeFilePlayer != null &&
         TapeFilePlayer.PlayPhase != PlayPhase.Completed &&
         _cpu.Registers.PC == HostVm.RomInfo.LoadBytesRoutineAddress)
     {
         if (FastLoadFromTzx())
         {
             FastLoadCompleted?.Invoke(this, EventArgs.Empty);
         }
     }
 }