public DmcSoundChannel(Apu apu, Dma dma, Memory memory) { this.apu = apu; this.dma = dma; this.memory = memory; this.dma.DmcDma += this.OnDmcDma; }
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; }
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(); }
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; }
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()); }
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; }
public NoiseSoundChannel(Apu apu) { this.apu = apu; }
public void SetupOutput(IGraphicDevice videoDevice, IAudioDevice audioDevice) { Ppu.OutputDevice = videoDevice; Apu = new Apu(this, audioDevice); }