Exemple #1
0
        public void InitializeEngine()
        {
            myCartridge = new NesCartridge();
            my6502      = new ProcessorNes6502(this);
            myMapper    = new Mapper(this, myCartridge);
            myPpu       = new Ppu(this);
            myJoypad    = new Joypad();

            scratchRam    = new byte[4][];
            scratchRam[0] = new byte[0x800];
            scratchRam[1] = new byte[0x800];
            scratchRam[2] = new byte[0x800];
            scratchRam[3] = new byte[0x800];
            saveRam       = new byte[0x2000];

            isSaveRamReadOnly   = false;
            isDebugging         = false;
            isQuitting          = false;
            isPaused            = false;
            hasQuit             = false;
            fixBackgroundChange = false;
            fixSpriteHit        = false;
            fixScrollOffset1    = false;
            fixScrollOffset2    = false;
            fixScrollOffset3    = false;
        }
Exemple #2
0
        public byte WriteMemory8(ushort address, byte data)
        {
            if (address < 0x800)
            {
                scratchRam[0][address] = data;
            }
            else if (address < 0x1000)
            {
                scratchRam[1][address - 0x800] = data;
            }
            else if (address < 0x1800)
            {
                scratchRam[2][address - 0x1000] = data;
            }
            else if (address < 0x2000)
            {
                scratchRam[3][address - 0x1800] = data;
            }
            else if (address < 0x4000)
            {
                //address = (ushort)((address - 0x2000) % 8);
                switch (address)
                {
                case (0x2000): myPpu.ControlRegister1Write(data); break;

                case (0x2001): myPpu.ControlRegister2Write(data); break;

                case (0x2003): myPpu.SpriteRamAddressRegisterWrite(data); break;

                case (0x2004): myPpu.SpriteRamIORegisterWrite(data); break;

                case (0x2005): myPpu.VramAddressRegister1Write(data); break;

                case (0x2006): myPpu.VramAddressRegister2Write(data); break;

                case (0x2007): myPpu.VramIORegisterWrite(data); break;
                    //default: Console.WriteLine("UNKOWN CONTROL WRITE: {0}", address); break;
                }
            }
            else if (address < 0x6000)
            {
                switch (address)
                {
                case (0x4014): myPpu.SpriteRamDmaBegin(data); break;

                case (0x4016): myJoypad.Joypad1Write(data); break;

                case (0x4017): Joypad.Joypad2Write(/*data)*/); break;
                    //default: Console.WriteLine("UNKOWN WRITE: {0:x}", address); break;
                }
                if (myCartridge.Mapper == 5)
                {
                    myMapper.WritePrgRom(address, data);
                }
            }
            else if (address < 0x8000)
            {
                if (!isSaveRamReadOnly)
                {
                    saveRam[address - 0x6000] = data;
                }

                if (myCartridge.Mapper == 34)
                {
                    myMapper.WritePrgRom(address, data);
                }
            }
            else
            {
                myMapper.WritePrgRom(address, data);
            }
            return(1);
        }
Exemple #3
0
        public byte ReadMemory8(ushort address)
        {
            byte returnvalue = 0;

            if (address < 0x2000)
            {
                if (address < 0x800)
                {
                    returnvalue = scratchRam[0][address];
                }
                else if (address < 0x1000)
                {
                    returnvalue = scratchRam[1][address - 0x800];
                    //Console.WriteLine("I need ram Mirroring {0:x}", address);
                }

                else if (address < 0x1800)
                {
                    returnvalue = scratchRam[2][address - 0x1000];
                    //Console.WriteLine("I need ram Mirroring {0:x}", address);
                }
                //else if (address < 0x2000) {
                else
                {
                    returnvalue = scratchRam[3][address - 0x1800];
                    //Console.WriteLine("I need ram Mirroring {0:x}", address);
                }

                //returnvalue = scratchRam[address >> 11][address & 0x7ff];
            }
            else if (address < 0x6000)
            {
                switch (address)
                {
                case (0x2002): returnvalue = myPpu.StatusRegisterRead(); break;

                case (0x2004): returnvalue = myPpu.SpriteRamIORegisterRead(); break;

                case (0x2007): returnvalue = myPpu.VramIORegisterRead(); break;

                //case (0x4015): returnvalue = myPPU.Sound_Signal_Register_Read(); break;
                case (0x4016): returnvalue = myJoypad.Joypad1Read(); break;

                case (0x4017): returnvalue = Joypad.Joypad2Read(); break;
                    //default: Console.WriteLine("UNKOWN READ: {0:x}", address); break;
                }
            }
            else if (address < 0x8000)
            {
                returnvalue = saveRam[address - 0x6000];
                if (myCartridge.Mapper == 5)
                {
                    returnvalue = 1;
                }
            }
            else
            {
                returnvalue = myMapper.ReadPrgRom(address);
            }
            return(returnvalue);
        }