public void StartPpuDebug(NESManager newManager)
        {
            manager  = newManager;
            emulator = manager.Emulator;
            ppu      = emulator.Ppu;

            paletteTextures = new Texture2D[paletteImages.Length];
            paletteBuffers  = new Color32[paletteImages.Length][];
            for (int i = 0; i < paletteTextures.Length; i++)
            {
                paletteTextures[i]            = new Texture2D(4, 1, TextureFormat.RGBA32, false);
                paletteTextures[i].filterMode = FilterMode.Point;
                paletteImages[i].texture      = paletteTextures[i];
                paletteBuffers[i]             = new Color32[paletteTextures[i].width * paletteTextures[i].height];
            }

            patternTextures = new Texture2D[patternImages.Length];
            patternBuffers  = new Color32[patternImages.Length][];
            for (int i = 0; i < patternTextures.Length; i++)
            {
                patternTextures[i]            = new Texture2D(16 * 8, 16 * 8, TextureFormat.RGBA32, false);
                paletteTextures[i].filterMode = FilterMode.Point;
                patternImages[i].texture      = patternTextures[i];
                patternBuffers[i]             = new Color32[patternTextures[i].width * patternTextures[i].height];
            }

            patternBuffer = new byte[patternTextures[0].width, patternTextures[0].height];
            paletteBuffer = new byte[4];

            oamBuilder = new StringBuilder();
        }
Exemple #2
0
        public void StartLog(Emulator newEmulator)
        {
            emulator = newEmulator;
            cpu      = emulator.Cpu;
            ppu      = emulator.Ppu;

            if (enableLog)
            {
                // Add callback
                emulator.onBeforeStep -= QueueLog;
                emulator.onBeforeStep += QueueLog;

                // Clear queue
                while (queue.TryDequeue(out _))
                {
                    ;
                }

                // Clear log
                if (File.Exists(path))
                {
                    File.Delete(path);
                }

                // Start Thread
                logThread = new Thread(() => { MessageLoop(); });
                logThread.Start();
            }
        }
Exemple #3
0
        public FormRwDecoder(Ppu ppu)
        {
            InitializeComponent();

            this.ppu = ppu;

            ppu.AddListener(PpuListener);
        }
Exemple #4
0
        public FormPixelClock(Ppu ppu)
        {
            InitializeComponent();

            this.ppu = ppu;

            ppu.AddListener(PpuListener);
        }
Exemple #5
0
 public LoggingNes()
 {
     PpuRam = new PpuMemoryMap();
     Ppu    = new Ppu(PpuRam, Screen);
     Ram    = new MemoryMap(Ppu);
     Cpu    = new LoggingCpu(Ram, programCounter: 0xC000, stackPointer: InitialStackPointer);
     CpuCycleDurationMilliseconds = 0f;
 }
Exemple #6
0
 public CpuBus(byte[] programRom, Ppu ppu, Joypad joypad, DMA dma, Func <int> cpuMasterClockCyclesAction)
 {
     _programRom           = programRom;
     _ppu                  = ppu;
     _joypad               = joypad;
     _dma                  = dma;
     _cpuMasterClockCycles = cpuMasterClockCyclesAction;
 }
Exemple #7
0
        public FormClk(Ppu ppu)
        {
            InitializeComponent();

            this.ppu = ppu;

            textBoxCLKPad.Text        = ppu.Pads.CLK.ToString();
            textBoxToggleCounter.Text = ppu.ToggleCounter.ToString();

            ppu.AddListener(PpuListener);
        }
Exemple #8
0
        public FormReset(Ppu ppu)
        {
            InitializeComponent();

            this.ppu = ppu;

            textBoxXRES.Text    = ppu.Pads.nRES.ToString();
            textBoxRESCL.Text   = ppu.RESCL.ToString();
            textBoxResetFF.Text = ppu.ResetFF.ToString();

            ppu.AddListener(PpuListener);
        }
Exemple #9
0
 public NesEngine(TvFormat tvFormat, PaletteFormat plFormat)
 {
     AutoSaveSram = true;
     Debug.WriteLine(this, "Initializeing the nes emulation engine...", DebugStatus.None);
     TvFormat = tvFormat;
     //Initialize Engine
     Memory           = new Memory.Memory(this);
     Cpu              = new Cpu(Memory, tvFormat, this);
     Cpu.PauseToggle += CpuPauseToggle;
     Ppu              = new Ppu(tvFormat, plFormat, this);
     Debug.WriteLine(this, "Nes initialized ok.", DebugStatus.Cool);
 }
Exemple #10
0
        private Xy GetXy(int offset, int desl, int multi = 1)
        {
            offset -= 0x8010;
            var ppu = new Ppu(TvFormat.Ntsc, new PaletteFormat(), null);

            var w = 128 * multi;

            return(new Xy
            {
                X = ppu.GetX(offset, desl, multi),
                Y = ppu.GetY(offset, w, multi)
            });
        }
Exemple #11
0
        public Computer(NesFile file, TextLogger logger)
        {
            if (file.Version != 0)
            {
                throw new System.Exception(string.Format("Version {0} not implemented", file.Version));
            }

            if(file.BatteryRAM)
            {
                throw new System.Exception("Battery backed RAM not implemented");
            }

            if (file.HasTrainer)
            {
                throw new System.Exception("Trainer not implemented");
            }

            switch (file.Mapper)
            {
                case 0x00: // NROM

                    //CPU $6000 -$7FFF: Family Basic only: PRG RAM, mirrored as necessary to fill entire 8 KiB window, write protectable with an external switch
                    //CPU $8000 -$BFFF: First 16 KB of ROM.
                    //CPU $C000 -$FFFF: Last 16 KB of ROM(NROM - 256) or mirror of $8000 -$BFFF(NROM - 128).

                    break;

                default:
                    throw new System.Exception(string.Format("Mapper {0} not implemented", file.Mapper));
            }

            if (file.VSUnisystem)
            {
                throw new System.Exception("VSUnisystem not implemented");
            }

            if (file.PlayChoice10)
            {
                throw new System.Exception("PlayChoice10 not implemented");
            }

            PpuMap = new PpuMap(new Ram(0x2000), new Rom(file.chr_rom), file.VRAMLayout);

            Ppu = new Ppu(PpuMap);
            Ppu.Logger = logger;

            CpuMap = new CpuMap(new Ram(0x0800), new Rom(file.prg_rom), Ppu);

            Cpu = new Cpu(CpuMap);
            Cpu.Logger = logger;
        }
Exemple #12
0
        public Computer(NesFile file, TextLogger logger)
        {
            if (file.Version != 0)
            {
                throw new System.Exception(string.Format("Version {0} not implemented", file.Version));
            }

            if (file.BatteryRAM)
            {
                throw new System.Exception("Battery backed RAM not implemented");
            }

            if (file.HasTrainer)
            {
                throw new System.Exception("Trainer not implemented");
            }

            switch (file.Mapper)
            {
            case 0x00:     // NROM

                //CPU $6000 -$7FFF: Family Basic only: PRG RAM, mirrored as necessary to fill entire 8 KiB window, write protectable with an external switch
                //CPU $8000 -$BFFF: First 16 KB of ROM.
                //CPU $C000 -$FFFF: Last 16 KB of ROM(NROM - 256) or mirror of $8000 -$BFFF(NROM - 128).

                break;

            default:
                throw new System.Exception(string.Format("Mapper {0} not implemented", file.Mapper));
            }

            if (file.VSUnisystem)
            {
                throw new System.Exception("VSUnisystem not implemented");
            }

            if (file.PlayChoice10)
            {
                throw new System.Exception("PlayChoice10 not implemented");
            }

            PpuMap = new PpuMap(new Ram(0x2000), new Rom(file.chr_rom), file.VRAMLayout);

            Ppu        = new Ppu(PpuMap);
            Ppu.Logger = logger;

            CpuMap = new CpuMap(new Ram(0x0800), new Rom(file.prg_rom), Ppu);

            Cpu        = new Cpu(CpuMap);
            Cpu.Logger = logger;
        }
Exemple #13
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();
        }
Exemple #14
0
        public Emulator(Cartridge cartridge)
        {
            LoadMapper(cartridge);
            if (Mapper == null)
            {
                return;
            }

            Cpu           = new Cpu(this);
            Ppu           = new Ppu(this);
            Apu           = new Apu(this);
            ControllerOne = new Controller();
            ControllerTwo = new Controller();

            IsValid = true;
        }
Exemple #15
0
        public void StartOutput(NESManager newManager)
        {
            manager = newManager;
            ppu     = manager.Emulator.Ppu;

            screenTexture = new Texture2D(Emulator.ScreenWidth, Emulator.ScreenHeight, TextureFormat.RGBA32, false)
            {
                filterMode = FilterMode.Point
            };
            screenImage.texture = screenTexture;
            bufferLength        = screenTexture.width * screenTexture.height;
            screenBuffer        = new Color32[bufferLength];

            // RGBA32 texture format data layout exactly matches Color32 struct
            nativeScreenTexture = screenTexture.GetRawTextureData <Color32>();
        }
Exemple #16
0
        public void RunFrame()
        {
            while (ElapsedFrameCycles < CyclesPerFrame)
            {
                while (CpuCyclesForDot < CyclesPerDot)
                {
                    CpuCyclesForDot += Cpu.Step();
                }

                MemoryMap.FlushMmio();

                Ppu.Tick();

                MemoryMap.UpdateMmio();

                CpuCyclesForDot    -= CyclesPerDot;
                ElapsedFrameCycles += CyclesPerDot;
            }

            ElapsedFrameCycles -= CyclesPerFrame;
        }
Exemple #17
0
        public void TestPpuCoord()
        {
            var ppu = new Ppu(TvFormat.Ntsc, new PaletteFormat(), null);

            //Multiplicador 1
            Assert.AreEqual(new Xy(0, 0), GetXy(0x8010, 0));
            Assert.AreEqual(new Xy(1, 0), GetXy(0x8010, 1));
            Assert.AreEqual(new Xy(2, 0), GetXy(0x8010, 2));
            Assert.AreEqual(new Xy(3, 0), GetXy(0x8010, 3));
            Assert.AreEqual(new Xy(4, 0), GetXy(0x8010, 4));
            Assert.AreEqual(new Xy(5, 0), GetXy(0x8010, 5));
            Assert.AreEqual(new Xy(6, 0), GetXy(0x8010, 6));
            Assert.AreEqual(new Xy(7, 0), GetXy(0x8010, 7));

            Assert.AreEqual(new Xy(48, 136), GetXy(0x9170, 0));

            Assert.AreEqual(new Xy(80, 128), GetXy(0x90B0, 0));
            Assert.AreEqual(new Xy(320, 512), GetXy(0x90B0, 0, 4));

            Assert.AreEqual(new Xy(48, 136), GetXy(0x9170, 0));
            Assert.AreEqual(new Xy(192, 544), GetXy(0x9170, 0, 4));
        }
Exemple #18
0
        public void Frame()
        {
            var originalOddFrame = Ppu.OddFrame;

            while (isRunning && originalOddFrame == Ppu.OddFrame)
            {
                if (stepMode & !shouldStep)
                {
                    return;
                }

                shouldStep = false;

                if (shouldReset)
                {
                    Cpu.Reset();
                    Ppu.Reset();
                    Apu.Reset();

                    originalOddFrame = Ppu.OddFrame;

                    shouldReset = false;
                }

                onBeforeStep?.Invoke();

                var cycles = Cpu.Step();

                for (var i = 0; i < cycles * PpuDotsPerCpuCycle; i++)
                {
                    Ppu.Step();
                }

                for (var i = 0; i < cycles; i++)
                {
                    Apu.Step();
                }
            }
        }
Exemple #19
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;
        }
Exemple #20
0
 private void Form1_Load(object sender, EventArgs e)
 {
     ppu = new Ppu();
     ShowAll();
 }
Exemple #21
0
 public LegacyNesEmu(Ppu ppu)
 {
     this.ppu = ppu;
 }
Exemple #22
0
 public void SetupTv(TvFormat tvFormat, PaletteFormat palleteFormat)
 {
     Pause();
     Cpu.SetTvFormat(tvFormat);
     Ppu.SetTvFormat(tvFormat, palleteFormat);
 }
Exemple #23
0
 public Nes()
 {
     this.cpu = new Cpu(this);
     this.ppu = new Ppu();
 }
 public void StartFramerate(Ppu newPpu)
 {
     ppu = newPpu;
 }