示例#1
0
 public DmcSoundChannel(Apu apu, Dma dma, Memory memory)
 {
     this.apu         = apu;
     this.dma         = dma;
     this.memory      = memory;
     this.dma.DmcDma += this.OnDmcDma;
 }
示例#2
0
        public PulseSoundChannel(Apu apu, int addressOffset)
        {
            if (addressOffset != 0x4000 && addressOffset != 0x4004)
            {
                throw new InvalidOperationException("Invalid address offset for Pulse channel.");
            }

            this.apu           = apu;
            this.addressOffset = addressOffset;
        }
示例#3
0
        public void Reset(bool inBios = false, Cartridge cartridge = null)
        {
            CyclesCount = 0;
            Cpu.Reset(inBios, cartridge);
            Mmu.Reset();
            Ppu.Reset();
            Apu.Reset();
            Input.Reset();
            Timer.Reset();
            Dma.Reset();
            LinkCable.Reset();
            IsAlive = true;

            frameQueue = new FrameQueue();
        }
示例#4
0
 public void ShutDown()
 {
     while (Apu.IsRendering)
     {
     }
     Apu.Pause();
     Apu.Shutdown();
     if (Apu.RECODER.IsRecording)
     {
         Apu.RECODER.Stop();
     }
     if (Memory.Map.Cartridge.IsSaveRam & AutoSaveSram)
     {
         SaveSram(Memory.Map.Cartridge.SaveFilename);
     }
     Cpu.ON = false;
 }
示例#5
0
        public Console()
        {
            // create main components
            Processor = new Mos6502();
            Video     = new RicohRP2C0X();
            Audio     = new Apu();
            ControllerMultiplexor1 = new ControllerMultiplexor();
            ControllerMultiplexor2 = new ControllerMultiplexor();
            Memory = new ConfigurableMemoryMap();

            allocatedCycles = 0;

            // configure hardware and connect components
            ConfigureMemoryMap();

            // connect processor to memory
            Processor.ReadByte  = (ushort address) => { return(Memory[address]); };
            Processor.WriteByte = (ushort address, byte value) => { Memory[address] = value; };

            // wire NMI between video and processor
            Video.TriggerNonMaskableInterupt = () => Processor.TriggerNonMaskableInterrupt();

            // connect video to memory for DMA operations
            Video.ReadByte = (ushort address) => { return(Memory[address]); };

            // connect APU DMC to memory
            Audio.Dmc.ReadMemorySample = (address) =>
            {
                Processor.State.StallCycles += 4;
                return(Memory[address]);
            };

            // wire IRQ between audio and processor
            Audio.TriggerInterruptRequest     = () => Processor.TriggerInterruptRequest();
            Audio.Dmc.TriggerInterruptRequest = () => Processor.TriggerInterruptRequest();

            // connect default first controller
            ConnectController(1, new Joypad());
        }
示例#6
0
        public void ExecuteFrame()
        {
            while (CyclesCount < CPU_CYCLES)
            {
                int cycles = Cpu.ExecuteCycle();

                int divisorAmount = Cpu.DoubleSpeed ? 2 : 1;

                int dmaCycles = Dma.CopyData();

                cycles *= 4;

                Timer.Tick(cycles + dmaCycles);

                Input.Tick();
                Ppu.Tick((cycles + dmaCycles) / divisorAmount);

                Apu.Tick((cycles + dmaCycles) / divisorAmount);

                CyclesCount += cycles / divisorAmount;
            }
            CyclesCount -= CPU_CYCLES;
        }
 public TriangleSoundChannel(Apu apu)
 {
     this.apu = apu;
 }
示例#8
0
 public NoiseSoundChannel(Apu apu)
 {
     this.apu = apu;
 }
示例#9
0
 public void SetupOutput(IGraphicDevice videoDevice, IAudioDevice audioDevice)
 {
     Ppu.OutputDevice = videoDevice;
     Apu = new Apu(this, audioDevice);
 }