예제 #1
0
파일: Nametables.cs 프로젝트: mrmikey/nes
 public void SetupNametables(Mirroring mirroring)
 {
     // Sorts nametable mirroring! :)
     switch (mirroring)
     {
         case Mirroring.Horizontal:
             logicalNametables[0] = physicalNametables[0];
             logicalNametables[1] = physicalNametables[0];
             logicalNametables[2] = physicalNametables[1];
             logicalNametables[3] = physicalNametables[2];
             break;
         case Mirroring.Vertical:
             logicalNametables[0] = physicalNametables[0];
             logicalNametables[1] = physicalNametables[1];
             logicalNametables[2] = physicalNametables[0];
             logicalNametables[3] = physicalNametables[1];
             break;
         case Mirroring.None:
             logicalNametables[0] = physicalNametables[0];
             logicalNametables[1] = physicalNametables[1];
             logicalNametables[2] = physicalNametables[2];
             logicalNametables[3] = physicalNametables[3];
             break;
         default:
             throw new NotImplementedException();
     }
 }
예제 #2
0
 public override void Initialize(string sha1, byte[] prg_dump, byte[] chr_dump, byte[] trainer_dump, Mirroring defaultMirroring)
 {
     base.Initialize(sha1, prg_dump, chr_dump, trainer_dump, defaultMirroring);
     InitializeSoundMixTable();
     channel_sq1 = new MMC5SqrSoundChannel();
     channel_sq2 = new MMC5SqrSoundChannel();
     channel_pcm = new MMC5PcmSoundChannel();
 }
예제 #3
0
        public void LoadNesData(NesEngine _engine)
        {
            #region CPU

            _regA = _engine.Cpu.REG_A;
            _regX = _engine.Cpu.REG_X;
            _regY = _engine.Cpu.REG_Y;
            _regS = _engine.Cpu.REG_S;
            _regPc = _engine.Cpu.REG_PC;
            _flagN = _engine.Cpu.Flag_N;
            _flagV = _engine.Cpu.Flag_V;
            _flagB = _engine.Cpu.Flag_B;
            _flagD = _engine.Cpu.Flag_D;
            _flagI = _engine.Cpu.Flag_I;
            _flagZ = _engine.Cpu.Flag_Z;
            _flagC = _engine.Cpu.Flag_C;
            CycleCounter = _engine.Cpu.CycleCounter;
            _cyclesPerScanline = _engine.Cpu.CyclesPerScanline;
            _opCode = _engine.Cpu.OpCode;
            _prevPc = _engine.Cpu.PrevPc;

            #endregion

            #region MEMORY

            _ram = _engine.Memory.Ram;
            _sram = _engine.Memory.SRam;
            _joyData1 = _engine.Memory.JoyData1;
            _joyData2 = _engine.Memory.JoyData2;
            _joyStrobe = _engine.Memory.JoyStrobe;

            #endregion

            #region CART

            if (_engine.Memory.Map.Cartridge.ChrPages == 0)
                _chr = _engine.Memory.Map.Cartridge.Chr;
            _mirroring = _engine.Memory.Map.Cartridge.Mirroring;
            _saveRAMPresent = _engine.Memory.Map.Cartridge.IsSaveRam;
            _isVram = _engine.Memory.Map.Cartridge.IsVram;
            _mirroringBase = _engine.Memory.Map.Cartridge.MirroringBase;

            #endregion

            #region _map

            CurrentPRGRomPage = _engine.Memory.Map.CurrentPrgRomPage;
            CurrentChrRomPage = _engine.Memory.Map.CurrentChrRomPage;

            #endregion

            #region PPU

            _sprram = _engine.Ppu.SprRam;
            _vram = _engine.Ppu.VRam;
            _currentScanLine = _engine.Ppu.CurrentScanLine;
            _vramAddress = _engine.Ppu.VRamAddress;
            _sprite0Hit = _engine.Ppu.Sprite0Hit;
            _spriteCrossed = _engine.Ppu.SpriteCrossed;
            _scanlinesPerFrame = _engine.Ppu.ScanlinesPerFrame;
            _scanlineOfVblank = _engine.Ppu.ScanlineOfVblank;
            _fps = _engine.Ppu.Fps;
            _vblank = _engine.Ppu.VBlank;
            _vramReadBuffer = _engine.Ppu.VRamReadBuffer;
            _noLimiter = _engine.Ppu.NoLimiter;
            /*2000*/
            _executeNMIonVBlank = _engine.Ppu.ExecuteNMIonVBlank;
            _spriteSize = _engine.Ppu.SpriteSize;
            _patternTableAddressBackground = _engine.Ppu.PatternTableAddressBackground;
            _patternTableAddress8X8Sprites = _engine.Ppu.PatternTableAddress8X8Sprites;
            _vramAddressIncrement = _engine.Ppu.VRamAddressIncrement;
            _reloadBits2000 = _engine.Ppu.ReloadBits2000;
            /*2001*/
            _colorEmphasis = _engine.Ppu.ColorEmphasis;
            _spriteVisibility = _engine.Ppu.SpriteVisibility;
            _backgroundVisibility = _engine.Ppu.BackgroundVisibility;
            _spriteClipping = _engine.Ppu.SpriteClipping;
            _backgroundClipping = _engine.Ppu.BackgroundClipping;
            _monochromeMode = _engine.Ppu.MonochromeMode;
            /*2003*/
            _spriteRamAddress = _engine.Ppu.SpriteRamAddress;
            /*2005,2006*/
            _ppuToggle = _engine.Ppu.PpuToggle;
            _vramTemp = _engine.Ppu.VRamTemp;
            /*Draw stuff*/
            _hScroll = _engine.Ppu.HScroll;
            _vScroll = _engine.Ppu.VScroll;
            _vBits = _engine.Ppu.VBits;
            _tileY = _engine.Ppu.TileY;

            #endregion

            #region APU

            _FrameCounter = _engine.Apu._FrameCounter;
            _PAL = _engine.Apu._PAL;
            DMCIRQPending = _engine.Apu.DMCIRQPending;
            FrameIRQEnabled = _engine.Apu.FrameIRQEnabled;
            FrameIRQPending = _engine.Apu.FrameIRQPending;
            _engine.Apu.DMC.SaveState(this);
            _engine.Apu.NOIZE.SaveState(this);
            _engine.Apu.RECT1.SaveState(this);
            _engine.Apu.RECT2.SaveState(this);
            _engine.Apu.TRIANGLE.SaveState(this);
            _engine.Apu.VRC6PULSE1.SaveState(this);
            _engine.Apu.VRC6PULSE2.SaveState(this);
            _engine.Apu.VRC6SAWTOOTH.SaveState(this);

            #endregion

            #region Mappers

            //MAPPER 1
            if (_engine.Memory.Map.Cartridge.MapperNo == 1)
            {
                var map1 = (Mapper01) _engine.Memory.Map.CurrentMapper;
                mapper1_register8000BitPosition = map1.Mapper1Register8000BitPosition;
                mapper1_registerA000BitPosition = map1.Mapper1RegisterA000BitPosition;
                mapper1_registerC000BitPosition = map1.Mapper1RegisterC000BitPosition;
                mapper1_registerE000BitPosition = map1.Mapper1RegisterE000BitPosition;
                mapper1_register8000Value = map1.Mapper1Register8000Value;
                mapper1_registerA000Value = map1.Mapper1RegisterA000Value;
                mapper1_registerC000Value = map1.Mapper1RegisterC000Value;
                mapper1_registerE000Value = map1.Mapper1RegisterE000Value;
                mapper1_mirroringFlag = map1.Mapper1MirroringFlag;
                mapper1_onePageMirroring = map1.Mapper1OnePageMirroring;
                mapper1_prgSwitchingArea = map1.Mapper1PRGSwitchingArea;
                mapper1_prgSwitchingSize = map1.Mapper1PRGSwitchingSize;
                mapper1_vromSwitchingSize = map1.Mapper1VromSwitchingSize;
            }
            //MAPPER 4
            if (_engine.Memory.Map.Cartridge.MapperNo == 4)
            {
                var map4 = (Mapper04) _engine.Memory.Map.CurrentMapper;
                mapper4_commandNumber = map4.Mapper4CommandNumber;
                mapper4_prgAddressSelect = map4.Mapper4PRGAddressSelect;
                mapper4_chrAddressSelect = map4.Mapper4ChrAddressSelect;
                mapper4_timer_irq_enabled = map4.TimerIrqEnabled;
                mapper4_timer_irq_count = map4.TimerIrqCount;
                mapper4_timer_irq_reload = map4.TimerIrqReload;
            }
            //MAPPER 5
            if (_engine.Memory.Map.Cartridge.MapperNo == 5)
            {
                var map5 = (Mapper05) _engine.Memory.Map.CurrentMapper;
                mapper5_prgBankSize = map5.Mapper5PRGBankSize;
                mapper5_chrBankSize = map5.Mapper5ChrBankSize;
                mapper5_scanlineSplit = map5.Mapper5ScanlineSplit;
                mapper5_splitIrqEnabled = map5.Mapper5SplitIrqEnabled;
            }
            //MAPPER 6
            if (_engine.Memory.Map.Cartridge.MapperNo == 6)
            {
                var map6 = (Mapper06) _engine.Memory.Map.CurrentMapper;
                mapper6_IRQEnabled = map6.IRQEnabled;
                mapper6_irq_counter = map6.irq_counter;
            }
            //MAPPER 8
            if (_engine.Memory.Map.Cartridge.MapperNo == 8)
            {
                var map8 = (Mapper08) _engine.Memory.Map.CurrentMapper;
                mapper8_IRQEnabled = map8.IRQEnabled;
                mapper8_irq_counter = map8.irq_counter;
            }
            //MAPPER 9
            if (_engine.Memory.Map.Cartridge.MapperNo == 9)
            {
                var map9 = (Mapper09) _engine.Memory.Map.CurrentMapper;
                mapper9_latch1 = map9.latch1;
                mapper9_latch2 = map9.latch2;
                mapper9_latch1data1 = map9.latch1data1;
                mapper9_latch1data2 = map9.latch1data2;
                mapper9_latch2data1 = map9.latch2data1;
                mapper9_latch2data2 = map9.latch2data2;
            }
            //MAPPER 10
            if (_engine.Memory.Map.Cartridge.MapperNo == 10)
            {
                var map10 = (Mapper10) _engine.Memory.Map.CurrentMapper;
                mapper10_latch1 = map10.Latch1;
                mapper10_latch2 = map10.Latch2;
                mapper10_latch1data1 = map10.Latch1Data1;
                mapper10_latch1data2 = map10.Latch1Data2;
                mapper10_latch2data1 = map10.Latch2Data1;
                mapper10_latch2data2 = map10.Latch2Data2;
            }
            //MAPPER 16
            if (_engine.Memory.Map.Cartridge.MapperNo == 16)
            {
                var map16 = (Mapper16) _engine.Memory.Map.CurrentMapper;
                timer_irq_counter_16 = map16.timer_irq_counter_16;
                timer_irq_Latch_16 = map16.timer_irq_Latch_16;
                timer_irq_enabled = map16.timer_irq_enabled;
            }
            //MAPPER 17
            if (_engine.Memory.Map.Cartridge.MapperNo == 17)
            {
                var map17 = (Mapper17) _engine.Memory.Map.CurrentMapper;
                mapper17_IRQEnabled = map17.IRQEnabled;
                mapper17_irq_counter = map17.irq_counter;
            }
            //MAPPER 18
            if (_engine.Memory.Map.Cartridge.MapperNo == 18)
            {
                var map18 = (Mapper18) _engine.Memory.Map.CurrentMapper;
                Mapper18_Timer = map18.Mapper18_Timer;
                Mapper18_latch = map18.Mapper18_latch;
                mapper18_control = map18.mapper18_control;
                Mapper18_IRQWidth = map18.Mapper18_IRQWidth;
                Mapper18_timer_irq_enabled = map18.timer_irq_enabled;
                Mapper18_x = map18.x;
            }
            //MAPPER 19
            if (_engine.Memory.Map.Cartridge.MapperNo == 19)
            {
                var map19 = (Mapper19) _engine.Memory.Map.CurrentMapper;
                Mapper19_VROMRAMfor0000 = map19.VROMRAMfor0000;
                Mapper19_VROMRAMfor1000 = map19.VROMRAMfor1000;
                Mapper19_irq_counter = map19.irq_counter;
                Mapper19_IRQEnabled = map19.IRQEnabled;
            }
            //MAPPER 21
            if (_engine.Memory.Map.Cartridge.MapperNo == 21)
            {
                var map21 = (Mapper21) _engine.Memory.Map.CurrentMapper;
                Mapper21_PRGMode = map21.PRGMode;
                Mapper21_REG = map21.REG;
                Mapper21_irq_latch = map21.IrqLatch;
                Mapper21_irq_enable = map21.IrqEnable;
                Mapper21_irq_counter = map21.IrqCounter;
                Mapper21_irq_clock = map21.IrqClock;
            }
            //MAPPER 23
            if (_engine.Memory.Map.Cartridge.MapperNo == 23)
            {
                var map23 = (Mapper23) _engine.Memory.Map.CurrentMapper;
                Mapper23_PRGMode = map23.PRGMode;
                Mapper23_REG = map23.REG;
                Mapper23_irq_latch = map23.IrqLatch;
                Mapper23_irq_enable = map23.IrqEnable;
                Mapper23_irq_counter = map23.IrqCounter;
                Mapper23_irq_clock = map23.IrqClock;
            }
            //MAPPER 24
            if (_engine.Memory.Map.Cartridge.MapperNo == 24)
            {
                var map24 = (Mapper24) _engine.Memory.Map.CurrentMapper;
                Mapper24_irq_latch = map24.irq_latch;
                Mapper24_irq_enable = map24.irq_enable;
                Mapper24_irq_counter = map24.irq_counter;
                Mapper24_irq_clock = map24.irq_clock;
            }
            //MAPPER 225
            if (_engine.Memory.Map.Cartridge.MapperNo == 225)
            {
                var map225 = (Mapper225255) _engine.Memory.Map.CurrentMapper;
                Mapper225_reg0 = map225.Mapper225_reg0;
                Mapper225_reg1 = map225.Mapper225_reg1;
                Mapper225_reg2 = map225.Mapper225_reg2;
                Mapper225_reg3 = map225.Mapper225_reg3;
            }
            //MAPPER 32
            if (_engine.Memory.Map.Cartridge.MapperNo == 32)
            {
                var map32 = (Mapper32) _engine.Memory.Map.CurrentMapper;
                mapper32SwitchingMode = map32.mapper32SwitchingMode;
            }
            //MAPPER 33
            if (_engine.Memory.Map.Cartridge.MapperNo == 33)
            {
                var map33 = (Mapper33) _engine.Memory.Map.CurrentMapper;
                mapper33_type1 = map33.Type1;
                mapper33_IRQCounter = map33.IrqCounter;
                mapper33_IRQEabled = map33.IrqEabled;
            }
            //MAPPER 41
            if (_engine.Memory.Map.Cartridge.MapperNo == 41)
            {
                var map41 = (Mapper41) _engine.Memory.Map.CurrentMapper;
                Mapper41_CHR_Low = map41.Mapper41_CHR_Low;
                Mapper41_CHR_High = map41.Mapper41_CHR_High;
            }
            //MAPPER 64
            if (_engine.Memory.Map.Cartridge.MapperNo == 64)
            {
                var map64 = (Mapper64) _engine.Memory.Map.CurrentMapper;
                mapper64_commandNumber = map64.Mapper64CommandNumber;
                mapper64_prgAddressSelect = map64.Mapper64PrgAddressSelect;
                mapper64_chrAddressSelect = map64.Mapper64ChrAddressSelect;
            }
            //MAPPER 65
            if (_engine.Memory.Map.Cartridge.MapperNo == 65)
            {
                var map65 = (Mapper65) _engine.Memory.Map.CurrentMapper;
                mapper65_timer_irq_counter_65 = map65.timer_irq_counter_65;
                mapper65_timer_irq_Latch_65 = map65.timer_irq_Latch_65;
                mapper65_timer_irq_enabled = map65.timer_irq_enabled;
            }
            //MAPPER 69
            if (_engine.Memory.Map.Cartridge.MapperNo == 69)
            {
                var map69 = (Mapper69) _engine.Memory.Map.CurrentMapper;
                mapper69_reg = map69.reg;
                mapper69_timer_irq_counter_69 = map69.timer_irq_counter_69;
                mapper69_timer_irq_enabled = map69.timer_irq_enabled;
            }
            //MAPPER 91
            if (_engine.Memory.Map.Cartridge.MapperNo == 91)
            {
                var map91 = (Mapper91) _engine.Memory.Map.CurrentMapper;
                mapper91_IRQEnabled = map91.IRQEnabled;
                mapper91_IRQCount = map91.IRQCount;
            }

            #endregion
        }
예제 #4
0
 public override void Initialize(string sha1, byte[] prg_dump, byte[] chr_dump, byte[] trainer_dump, Mirroring defaultMirroring)
 {
     base.Initialize(sha1, prg_dump, chr_dump, trainer_dump, defaultMirroring);
     InitializeSoundMixTable();
 }
예제 #5
0
파일: Board.cs 프로젝트: ywjno/mynes-code
 protected void SwitchNMT(Mirroring mirroring)
 {
     SwitchNMT((byte)mirroring);
 }
예제 #6
0
파일: Board.cs 프로젝트: ywjno/mynes-code
 /// <summary>
 /// Initialize the board
 /// </summary>
 /// <param name="sha1">The rom sha1 calculated without the header</param>
 /// <param name="prg_dump">The prg data dump.</param>
 /// <param name="chr_dump">The chr data dump</param>
 /// <param name="trainer_dump">The trainer data dump.</param>
 /// <param name="defaultMirroring">The default mirroring as defined in rom.</param>
 public virtual void Initialize(string sha1, byte[] prg_dump, byte[] chr_dump, byte[] trainer_dump, Mirroring defaultMirroring)
 {
     RomSHA1 = sha1;
     // Find on DB
     GameInfo = NesCartDatabase.Find(sha1, out IsGameFoundOnDB);
     //set cart info
     if (GameInfo.Cartridges != null)
     {
         foreach (NesCartDatabaseCartridgeInfo cartinf in GameInfo.Cartridges)
             if (cartinf.SHA1.ToLower() == sha1.ToLower())
             {
                 GameCartInfo = cartinf;
                 break;
             }
     }
     BoardType = "N/A";
     BoardPCB = "N/A";
     this.Chips = new List<string>();
     if (IsGameFoundOnDB)
     {
         Console.WriteLine("Game found in Database !!");
         Console.WriteLine("> Game name: " + GameInfo.Game_Name);
         Console.WriteLine("> Game alt name: " + GameInfo.Game_AltName);
         BoardType = GameCartInfo.Board_Type;
         Console.WriteLine("> Board Type: " + BoardType);
         BoardPCB = GameCartInfo.Board_Pcb;
         Console.WriteLine("> Board Pcb: " + BoardPCB);
         // Chips ... important for some boards
         if (GameCartInfo.chip_type != null)
             for (int i = 0; i < GameCartInfo.chip_type.Count; i++)
             {
                 Console.WriteLine(string.Format("> CHIP {0}: {1}", (i + 1).ToString(),
                    GameCartInfo.chip_type[i]));
                 this.Chips.Add(GameCartInfo.chip_type[i]);
             }
     }
     // Mirroring
     this.default_mirroring = defaultMirroring;
     nmt_banks = new byte[4][]
     {
         new byte[0x0400], new byte[0x0400], new byte[0x0400], new byte[0x0400]
         /*Only 2 nmt banks should be used in normal state*/
     };
     nmt_indexes = new int[4];
     SwitchNMT(defaultMirroring);
     // PRG data ***********************************************
     List<BankInfo> prgBanks = new List<BankInfo>(GetPRGRAM());
     prg_rom_bank_offset = prgBanks.Count;
     prgBanks.AddRange(GetPRGROM(prg_dump));
     SRAMSaveRequired = false;
     prg_banks = new byte[prgBanks.Count][];
     prg_enable = new bool[prgBanks.Count];
     prg_isram = new bool[prgBanks.Count];
     prg_writable = new bool[prgBanks.Count];
     prg_battery = new bool[prgBanks.Count];
     for (int i = 0; i < prgBanks.Count; i++)
     {
         prg_banks[i] = prgBanks[i].DATA;
         prg_enable[i] = prgBanks[i].Enabled;
         prg_writable[i] = prgBanks[i].Writable;
         prg_isram[i] = prgBanks[i].IsRAM;
         prg_battery[i] = prgBanks[i].IsBattery;
         if (!SRAMSaveRequired)
         {
             if (prg_battery[i])
                 SRAMSaveRequired = true;
         }
     }
     prg_indexes = new int[5];
     // ********************************************************
     // Trainer ************************************************
     // Put trainer at first ram bank.
     if (trainer_dump != null)
     {
         if (trainer_dump.Length > 0)
         {
             for (int i = 0; i < prgBanks.Count; i++)
             {
                 if (prg_isram[i])
                 {
                     trainer_dump.CopyTo(prg_banks[i], 0x1000);
                     break;
                 }
             }
         }
     }
     // ********************************************************
     // CHR data ***********************************************
     List<BankInfo> chrBanks = new List<BankInfo>(GetCHRRAM());
     chr_rom_bank_offset = chrBanks.Count;
     chrBanks.AddRange(GetCHRROM(chr_dump));
     chr_banks = new byte[chrBanks.Count][];
     chr_enable = new bool[chrBanks.Count];
     chr_isram = new bool[chrBanks.Count];
     chr_writable = new bool[chrBanks.Count];
     for (int i = 0; i < chrBanks.Count; i++)
     {
         chr_banks[i] = chrBanks[i].DATA;
         chr_enable[i] = chrBanks[i].Enabled;
         chr_writable[i] = chrBanks[i].Writable;
         chr_isram[i] = chrBanks[i].IsRAM;
     }
     chr_indexes = new int[8];
     // ********************************************************
 }
예제 #7
0
 public Mapper002(byte[] prgRom, byte[] chrRom, Mirroring mirroring) : base(prgRom, chrRom, mirroring)
 {
     m_FinalBankOffset = PrgRom.Length - 0x4000 - 0xc000;
     m_BankCount       = PrgRom.Length / 0x4000;
 }
예제 #8
0
 protected Mapper(byte[] prgRom, byte[] chrRom, Mirroring mirroring)
 {
     PrgRom    = prgRom;
     ChrRom    = EnsureArray(chrRom, 0x2000);
     Mirroring = mirroring;
 }
예제 #9
0
 public Mapper066(byte[] prgRom, byte[] chrRom, Mirroring mirroring) : base(prgRom, chrRom, mirroring)
 {
 }
예제 #10
0
 public override void Initialize(string sha1, byte[] prg_dump, byte[] chr_dump, byte[] trainer_dump, Mirroring defaultMirroring)
 {
     base.Initialize(sha1, prg_dump, chr_dump, trainer_dump, defaultMirroring);
     InitializeSoundMixTable();
     channel_sq1 = new MMC5SqrSoundChannel();
     channel_sq2 = new MMC5SqrSoundChannel();
     channel_pcm = new MMC5PcmSoundChannel();
 }