Exemple #1
0
 public void Write(ushort address, byte data)
 {
     Map.Switch32kPrgRom((data & 0x07) * 8);
     if ((data & 0x10) != 0)
     {
         Map.Cartridge.MirroringBase = 0x2400;
     }
     else
     {
         Map.Cartridge.MirroringBase = 0x2000;
     }
     Map.ApplayMirroring();
 }
Exemple #2
0
        public void Write(ushort address, byte data)
        {
            if (address >= 0x8000 & address <= 0xFFFF)
            {
                Map.Switch32kPrgRom(((data & 0x30) >> 4) * 8);
                Map.Switch8kChrRom((data & 0x3) * 8);
            }
            else
            {
                switch (address)
                {
                case 0x42FC:
                case 0x42FE:
                case 0x42FF:
                    switch (address & 0x1)
                    {
                    case 0:
                        Map.Cartridge.Mirroring = Mirroring.One_Screen;
                        if ((data & 0x10) != 0)
                        {
                            Map.Cartridge.MirroringBase = 0x2400;
                        }
                        else
                        {
                            Map.Cartridge.MirroringBase = 0x2000;
                        }
                        Map.ApplayMirroring();
                        break;

                    case 1:
                        if ((data & 0x10) != 0)
                        {
                            Map.Cartridge.Mirroring = Mirroring.Vertical;
                        }
                        else
                        {
                            Map.Cartridge.Mirroring = Mirroring.Horizontal;
                        }
                        Map.ApplayMirroring();
                        break;
                    }
                    break;

                case 0x4501: IRQEnabled = false; break;

                case 0x4502: irq_counter = (short)((irq_counter & 0xFF00) | data); break;

                case 0x4503: irq_counter = (short)((data << 8) | (irq_counter & 0x00FF)); IRQEnabled = true; break;
                }
            }
        }
Exemple #3
0
        public void Write(ushort address, byte data)
        {
            switch (address)
            {
            case 0x42FE:
                Map.Cartridge.Mirroring = Mirroring.One_Screen;
                if ((data & 0x10) != 0)
                {
                    Map.Cartridge.MirroringBase = 0x2400;
                }
                else
                {
                    Map.Cartridge.MirroringBase = 0x2000;
                }
                Map.ApplayMirroring();
                break;

            case 0x42FF:
                if ((data & 0x10) != 0)
                {
                    Map.Cartridge.Mirroring = Mirroring.Horizontal;
                }
                else
                {
                    Map.Cartridge.Mirroring = Mirroring.Vertical;
                }
                Map.ApplayMirroring();
                break;

            case 0x4501: IRQEnabled = false; break;

            case 0x4502: irq_counter = (short)((irq_counter & 0xFF00) | data); break;

            case 0x4503: irq_counter = (short)((data << 8) | (irq_counter & 0x00FF)); IRQEnabled = true; break;

            case 0x4504:
            case 0x4505:
            case 0x4506:
            case 0x4507: Map.Switch8kPrgRom(data * 2, address & 0x03); break;

            case 0x4510:
            case 0x4511:
            case 0x4512:
            case 0x4513:
            case 0x4514:
            case 0x4515:
            case 0x4516:
            case 0x4517: Map.Switch1kChrRom(data, address & 0x07); break;
            }
        }
Exemple #4
0
        public void Write(ushort address, byte data)
        {
            if ((address >= 0x8000) && (address <= 0xFFFF))
            {
                byte X = (byte)(data & 0x3F);
                Map.Cartridge.Mirroring = ((data & 0x40) == 0) ? Mirroring.Vertical : Mirroring.Horizontal;
                Map.ApplayMirroring();
                byte Y = (byte)(data & 0x80);
                Y >>= 7;
                switch (address & 0x3)
                {
                case 0:    //0=32K
                    Map.Switch16kPrgRom(X * 4, 0);
                    Map.Switch16kPrgRom((X + 1) * 4, 1);
                    break;

                case 1:    //1=128K
                    Map.Switch16kPrgRom(X * 4, 0);
                    Map.Switch16kPrgRom((Map.Cartridge.PRG_PAGES - 1) * 4, 1);
                    break;

                case 2:    //2=8K
                    Map.Switch8kPrgRom(((X * 2) + Y) * 2, 0);
                    Map.Switch8kPrgRom(((X * 2) + Y) * 2, 1);
                    Map.Switch8kPrgRom(((X * 2) + Y) * 2, 2);
                    Map.Switch8kPrgRom(((X * 2) + Y) * 2, 3);
                    break;

                case 3:    //3=16K
                    Map.Switch16kPrgRom(X * 4, 0);
                    Map.Switch16kPrgRom(X * 4, 1);
                    break;
                }
            }
        }
 public void Write(ushort address, byte data)
 {
     if (address >= 0x8000 & address <= 0xFFFF)
     {
         _Map.Switch16kPrgRom((data & 0x7) * 4, 0);
         _Map.Switch8kChrRom(((data & 0xF0) >> 4) * 8);
         if ((address & 0xFE00) != 0xFE00)
         {
             if (IREM)
             {
                 if ((data & 0x8) != 0)
                 {
                     _Map.Cartridge.Mirroring = Mirroring.Horizontal;
                 }
                 else
                 {
                     _Map.Cartridge.Mirroring = Mirroring.Vertical;
                 }
             }
             else
             {
                 _Map.Cartridge.Mirroring = Mirroring.One_Screen;
                 if ((data & 0x8) != 0)
                 {
                     _Map.Cartridge.MirroringBase = 0x2000;
                 }
                 else
                 {
                     _Map.Cartridge.MirroringBase = 0x2400;
                 }
             }
             _Map.ApplayMirroring();
         }
     }
 }
Exemple #6
0
        void SetVRAM()
        {
            int[] bank = new int[4];

            for (int i = 0; i < 4; i++)
            {
                bank[i] = (nth_reg[i] << 8) | (ntl_reg[i]);
            }

            if (mir_mode != 0)
            {
                for (int i = 0; i < 4; i++)
                {
                    if ((nth_reg[i] == 0) && (ntl_reg[i] == (byte)i))
                    {
                        mir_mode = 0;
                    }
                }

                if (mir_mode != 0)
                {
                    mem.Switch1kCHRToVRAM(bank[0], 0);
                    mem.Switch1kCHRToVRAM(bank[1], 1);
                    mem.Switch1kCHRToVRAM(bank[2], 2);
                    mem.Switch1kCHRToVRAM(bank[3], 3);
                }
            }
            else
            {
                if (mir_type == 0)
                {
                    mem.Cartridge.Mirroring = Mirroring.Vertical;
                    mem.ApplayMirroring();
                }
                else if (mir_type == 1)
                {
                    mem.Cartridge.Mirroring = Mirroring.Horizontal;
                    mem.ApplayMirroring();
                }
                else
                {
                    mem.Cartridge.Mirroring     = Mirroring.One_Screen;
                    mem.Cartridge.MirroringBase = 0x2000;
                    mem.ApplayMirroring();
                }
            }
        }
 public void Write(ushort address, byte data)
 {
     if (address == 0x7EF0)
     {
         Map.Switch2kChrRom(((data >> 1) & 0x3F) * 2, 0);
     }
     else if (address == 0x7EF1)
     {
         Map.Switch2kChrRom(((data >> 1) & 0x3F) * 2, 1);
     }
     else if (address == 0x7EF2)
     {
         Map.Switch1kChrRom(data, 4);
     }
     else if (address == 0x7EF3)
     {
         Map.Switch1kChrRom(data, 5);
     }
     else if (address == 0x7EF4)
     {
         Map.Switch1kChrRom(data, 6);
     }
     else if (address == 0x7EF5)
     {
         Map.Switch1kChrRom(data, 7);
     }
     else if (address == 0x7EF6)
     {
         if ((address & 0x1) == 0)
         {
             Map.Cartridge.Mirroring = Mirroring.Vertical;
         }
         else
         {
             Map.Cartridge.Mirroring = Mirroring.Horizontal;
         }
         Map.ApplayMirroring();
     }
     else if (address == 0x7EF8)
     {
         //if (data == 0xA3)
         //    Map.IsSRAMReadOnly = true;
         //else if (data == 0xFF)
         //    Map.IsSRAMReadOnly = false;
     }
     else if (address == 0x7EFA)
     {
         Map.Switch8kPrgRom(data * 2, 0);
     }
     else if (address == 0x7EFC)
     {
         Map.Switch8kPrgRom(data * 2, 1);
     }
     else if (address == 0x7EFE)
     {
         Map.Switch8kPrgRom(data * 2, 2);
     }
 }
 public void Write(ushort address, byte data)
 {
     address &= 0xF000;
     if (address == 0xA000)
     {
         Map.Switch8kPrgRom(data * 2, 0);
     }
     else if (address == 0xB000)
     {
         reg[0] = data;
         if (latch_a == 0xFD)
         {
             Map.Switch4kChrRom(reg[0] * 4, 0);
         }
     }
     else if (address == 0xC000)
     {
         reg[1] = data;
         if (latch_a == 0xFE)
         {
             Map.Switch4kChrRom(reg[1] * 4, 0);
         }
     }
     else if (address == 0xD000)
     {
         reg[2] = data;
         if (latch_b == 0xFD)
         {
             Map.Switch4kChrRom(reg[2] * 4, 1);
         }
     }
     else if (address == 0xE000)
     {
         reg[3] = data;
         if (latch_b == 0xFE)
         {
             Map.Switch4kChrRom(reg[3] * 4, 1);
         }
     }
     else if (address == 0xF000)
     {
         if ((data & 1) == 1)
         {
             Map.Cartridge.Mirroring = Mirroring.Horizontal;
         }
         else
         {
             Map.Cartridge.Mirroring = Mirroring.Vertical;
         }
         Map.ApplayMirroring();
     }
 }
Exemple #9
0
 public void Write(ushort address, byte data)
 {
     mem.Cartridge.Mirroring = ((address & 0x8) != 0) ? Mirroring.Horizontal : Mirroring.Vertical;
     mem.ApplayMirroring();
     mem.Switch8kChrRom((address & 0x7) * 8);
     if ((address & 0x4000) != 0)
     {
         mem.Switch32kPrgRom(((address & 0x6) >> 1) * 8);
     }
     else
     {
         mem.Switch16kPrgRom((address & 0x7) * 4, 0);
         mem.Switch16kPrgRom((address & 0x7) * 4, 1);
     }
 }
 public void Write(ushort address, byte data)
 {
     if (address >= 0x6000 & address <= 0xFFFF)
     {
         Map.Switch32kPrgRom((address & 0x7) * 8);
         Map.Cartridge.Mirroring = ((address & 0x20) == 0) ? Mirroring.Vertical : Mirroring.Horizontal;
         Mapper41_CHR_High       = (byte)(data & 0x18);
         if ((address & 0x4) == 0)
         {
             Mapper41_CHR_Low = (byte)(data & 0x3);
         }
         temp = (ushort)(Mapper41_CHR_High | Mapper41_CHR_Low);
         Map.Switch8kChrRom((temp) * 8);
         Map.ApplayMirroring();
     }
 }
Exemple #11
0
 public void Write(ushort address, byte data)
 {
     if (address < 0xC000)
     {
         MEM.Switch16kPrgRom((data & 0x0F) * 4, 1);
         if ((data & 0x80) != 0)
         {
             MEM.Cartridge.Mirroring = Mirroring.Vertical;
         }
         else
         {
             MEM.Cartridge.Mirroring = Mirroring.Horizontal;
         }
         MEM.ApplayMirroring();
     }
 }
Exemple #12
0
        public void Write(ushort address, byte data)
        {
            if (address >= 0x8000 & address <= 0xFFFF)
            {
                if ((address & 0x10) == 0)
                {
                    _Map.Switch32kPrgRom((address & 0xF) * 8);
                }
                else
                {
                    _Map.Switch16kPrgRom((((address & 0xF) << 1) | (((address & 0x20) >> 5))) * 4, 0);
                    _Map.Switch16kPrgRom((((address & 0xF) << 1) | (((address & 0x20) >> 5))) * 4, 1);
                }

                _Map.Cartridge.Mirroring = ((address & 0x80) != 0) ? Mirroring.Horizontal : Mirroring.Vertical;
                _Map.ApplayMirroring();
            }
        }
        public void Write(ushort address, byte data)
        {
            switch (address & 0xF000)
            {
            case 0x8000:
                _Map.Switch8kPrgRom((data & 0x0F) * 2, 0);
                break;

            case 0x9000:
                if ((data & 0x01) != 0)
                {
                    _Map.Cartridge.Mirroring = Mirroring.Horizontal;
                }
                else
                {
                    _Map.Cartridge.Mirroring = Mirroring.Vertical;
                }

                reg[0] = (reg[0] & 0x0F) | ((data & 0x02) << 3);
                reg[1] = (reg[1] & 0x0F) | ((data & 0x04) << 2);
                _Map.Switch4kChrRom(reg[0] * 4, 0);
                _Map.Switch4kChrRom(reg[1] * 4, 1);
                _Map.ApplayMirroring();
                break;

            case 0xA000:
                _Map.Switch8kPrgRom((data & 0x0F) * 2, 1);
                break;

            case 0xC000:
                _Map.Switch8kPrgRom((data & 0x0F) * 2, 2);
                break;

            case 0xE000:
                reg[0] = (reg[0] & 0x10) | (data & 0x0F);
                _Map.Switch4kChrRom(reg[0] * 4, 0);
                break;

            case 0xF000:
                reg[1] = (reg[1] & 0x10) | (data & 0x0F);
                _Map.Switch4kChrRom(reg[1] * 4, 1);
                break;
            }
        }
        public void Write(ushort address, byte data)
        {
            if ((address >= 0x8000) && (address <= 0xFFFF))
            {
                int    banks = ((address & 0x4000) != 0) ? 1 : 0;
                ushort wher  = (ushort)((address & 0x0Fc0) >> 7);
                _Map.Switch8kChrRom(((address & 0x003F) + (banks << 6)) * 8);
                if ((address & 0x1000) != 0)     //A12
                {
                    if ((address & 0x0040) != 0) //A6
                    {
                        _Map.Switch16kPrgRom((((wher + (banks << 5)) << 1) + 1) * 4, 0);
                        _Map.Switch16kPrgRom((((wher + (banks << 5)) << 1) + 1) * 4, 1);
                    }
                    else
                    {
                        _Map.Switch16kPrgRom(((wher + (banks << 5)) << 1) * 4, 0);
                        _Map.Switch16kPrgRom(((wher + (banks << 5)) << 1) * 4, 1);
                    }
                }
                else
                {
                    _Map.Switch32kPrgRom((wher + (banks << 5)) * 8);//ignore A6
                }
                _Map.Cartridge.Mirroring = ((address >> 13) & 1) == 0 ? Mirroring.Vertical : Mirroring.Horizontal;
                _Map.ApplayMirroring();
            }
            else if ((address >= 0x5800) && (address <= 0x5FFF))
            {
                switch (address & 0x3)
                {
                case 0: Mapper225_reg0 = (byte)(data & 0xf); break;

                case 1: Mapper225_reg1 = (byte)(data & 0xf); break;

                case 2: Mapper225_reg2 = (byte)(data & 0xf); break;

                case 3: Mapper225_reg3 = (byte)(data & 0xf); break;
                }
            }
        }
Exemple #15
0
        public void Write(ushort address, byte data)
        {
            switch (address)
            {
            case 0x9FFF: Map.Cartridge.Mirroring = ((data & 0x01) == 0) ? Mirroring.Vertical : Mirroring.Horizontal;
                mapper32SwitchingMode            = ((data & 0x02) == 0) ? 0 : 1;
                Map.ApplayMirroring();
                break;

            case 0x8FFF:
                if (mapper32SwitchingMode == 0)
                {
                    Map.Switch8kPrgRom(data * 2, 0);
                }
                else
                {
                    Map.Switch8kPrgRom(data * 2, 2);
                }
                break;

            case 0xAFFF: Map.Switch8kPrgRom(data * 2, 1); break;

            case 0xBFF0: Map.Switch1kChrRom(data, 0); break;

            case 0xBFF1: Map.Switch1kChrRom(data, 1); break;

            case 0xBFF2: Map.Switch1kChrRom(data, 2); break;

            case 0xBFF3: Map.Switch1kChrRom(data, 3); break;

            case 0xBFF4: Map.Switch1kChrRom(data, 4); break;

            case 0xBFF5: Map.Switch1kChrRom(data, 5); break;

            case 0xBFF6: Map.Switch1kChrRom(data, 6); break;

            case 0xBFF7: Map.Switch1kChrRom(data, 7); break;
            }
        }
Exemple #16
0
        public void Write(ushort address, byte data)
        {
            switch (address & 0xF000)
            {
            case 0xF000:
            case 0xE000:
            case 0xD000:
            case 0xC000: Map.Switch16kPrgRom(data * 4, 0); break;

            case 0x9000:

                if ((data & 0x10) != 0)
                {
                    Map.Cartridge.MirroringBase = 0x2000;
                }
                else
                {
                    Map.Cartridge.MirroringBase = 0x2400;
                }
                Map.ApplayMirroring();
                break;
            }
        }
 public void Write(ushort address, byte data)
 {
     if (address == 0x7EF0)
     {
         if (Swapped)
         {
             Map.Switch2kChrRom((data >> 1) * 2, 2);
         }
         else
         {
             Map.Switch2kChrRom((data >> 1) * 2, 0);
         }
     }
     else if (address == 0x7EF1)
     {
         if (Swapped)
         {
             Map.Switch2kChrRom((data >> 1) * 2, 3);
         }
         else
         {
             Map.Switch2kChrRom((data >> 1) * 2, 1);
         }
     }
     else if (address == 0x7EF2)
     {
         if (Swapped)
         {
             Map.Switch1kChrRom(data, 0);
         }
         else
         {
             Map.Switch1kChrRom(data, 4);
         }
     }
     else if (address == 0x7EF3)
     {
         if (Swapped)
         {
             Map.Switch1kChrRom(data, 1);
         }
         else
         {
             Map.Switch1kChrRom(data, 5);
         }
     }
     else if (address == 0x7EF4)
     {
         if (Swapped)
         {
             Map.Switch1kChrRom(data, 2);
         }
         else
         {
             Map.Switch1kChrRom(data, 6);
         }
     }
     else if (address == 0x7EF5)
     {
         if (Swapped)
         {
             Map.Switch1kChrRom(data, 3);
         }
         else
         {
             Map.Switch1kChrRom(data, 7);
         }
     }
     else if (address == 0x7EF6)
     {
         Swapped = ((data & 0x2) >> 1) != 0;
         if ((data & 0x01) == 0)
         {
             Map.Cartridge.Mirroring = Mirroring.Horizontal;
         }
         else
         {
             Map.Cartridge.Mirroring = Mirroring.Vertical;
         }
         Map.ApplayMirroring();
     }
     else if (address == 0x7EFA)
     {
         Map.Switch8kPrgRom((data >> 2) * 2, 0);
     }
     else if (address == 0x7EFB)
     {
         Map.Switch8kPrgRom((data >> 2) * 2, 1);
     }
     else if (address == 0x7EFC)
     {
         Map.Switch8kPrgRom((data >> 2) * 2, 2);
     }
 }
Exemple #18
0
        public void Write(ushort address, byte data)
        {
            switch (address & 0xF)
            {
            case 0: Map.Switch1kChrRom(data, 0); break;

            case 1: Map.Switch1kChrRom(data, 1); break;

            case 2: Map.Switch1kChrRom(data, 2); break;

            case 3: Map.Switch1kChrRom(data, 3); break;

            case 4: Map.Switch1kChrRom(data, 4); break;

            case 5: Map.Switch1kChrRom(data, 5); break;

            case 6: Map.Switch1kChrRom(data, 6); break;

            case 7: Map.Switch1kChrRom(data, 7); break;

            case 8: Map.Switch16kPrgRom(data * 4, 0); break;

            case 9: switch (data & 0x3)
                {
                case 0:
                    Map.Cartridge.Mirroring = Mirroring.Vertical;
                    break;

                case 1:
                    Map.Cartridge.Mirroring = Mirroring.Horizontal;
                    break;

                case 2:
                    Map.Cartridge.Mirroring     = Mirroring.One_Screen;
                    Map.Cartridge.MirroringBase = 0x2000;
                    break;

                case 3:
                    Map.Cartridge.Mirroring     = Mirroring.One_Screen;
                    Map.Cartridge.MirroringBase = 0x2400;
                    break;
                }
                Map.ApplayMirroring();
                break;

            case 0xA:
                timer_irq_enabled    = ((data & 0x1) != 0);
                timer_irq_counter_16 = timer_irq_Latch_16;
                break;

            case 0xB:
                timer_irq_Latch_16 = (short)((timer_irq_Latch_16 & 0xFF00) | data);
                break;

            case 0xC:
                timer_irq_Latch_16 = (short)((data << 8) | (timer_irq_Latch_16 & 0x00FF));
                break;

            case 0xD: break;    //
            }
        }
 public void Write(ushort address, byte data)
 {
     if (address == 0x8000)
     {
         mapper64_commandNumber    = data;
         mapper64_prgAddressSelect = (byte)(data & 0x40);
         mapper64_chrAddressSelect = (byte)(data & 0x80);
     }
     else if (address == 0x8001)
     {
         if ((mapper64_commandNumber & 0xf) == 0)
         {
             //Swap 2 1k chr roms
             data = (byte)(data - (data % 2));
             if (mapper64_chrAddressSelect == 0)
             {
                 Map.Switch2kChrRom(data, 0);
             }
             else
             {
                 Map.Switch2kChrRom(data, 2);
             }
         }
         else if ((mapper64_commandNumber & 0xf) == 1)
         {
             //Swap 2 1k chr roms
             data = (byte)(data - (data % 2));
             if (mapper64_chrAddressSelect == 0)
             {
                 Map.Switch2kChrRom(data, 1);
             }
             else
             {
                 Map.Switch2kChrRom(data, 3);
             }
         }
         else if ((mapper64_commandNumber & 0xf) == 2)
         {
             //Swap 1k chr rom
             if (mapper64_chrAddressSelect == 0)
             {
                 Map.Switch1kChrRom(data, 4);
             }
             else
             {
                 Map.Switch1kChrRom(data, 0);
             }
         }
         else if ((mapper64_commandNumber & 0xf) == 3)
         {
             //Swap 1k chr rom
             if (mapper64_chrAddressSelect == 0)
             {
                 Map.Switch1kChrRom(data, 5);
             }
             else
             {
                 Map.Switch1kChrRom(data, 1);
             }
         }
         else if ((mapper64_commandNumber & 0xf) == 4)
         {
             //Swap 1k chr rom
             if (mapper64_chrAddressSelect == 0)
             {
                 Map.Switch1kChrRom(data, 6);
             }
             else
             {
                 Map.Switch1kChrRom(data, 2);
             }
         }
         else if ((mapper64_commandNumber & 0xf) == 5)
         {
             //Swap 1k chr rom
             if (mapper64_chrAddressSelect == 0)
             {
                 Map.Switch1kChrRom(data, 7);
             }
             else
             {
                 Map.Switch1kChrRom(data, 3);
             }
         }
         else if ((mapper64_commandNumber & 0xf) == 6)
         {
             if (mapper64_prgAddressSelect == 0)
             {
                 Map.Switch8kPrgRom(data * 2, 0);
             }
             else
             {
                 Map.Switch8kPrgRom(data * 2, 1);
             }
         }
         else if ((mapper64_commandNumber & 0xf) == 7)
         {
             if (mapper64_prgAddressSelect == 0)
             {
                 Map.Switch8kPrgRom(data * 2, 1);
             }
             else
             {
                 Map.Switch8kPrgRom(data * 2, 2);
             }
         }
         else if ((mapper64_commandNumber & 0xf) == 8)
         {
             Map.Switch1kChrRom(data, 1);
         }
         else if ((mapper64_commandNumber & 0xf) == 9)
         {
             Map.Switch1kChrRom(data, 3);
         }
         else if ((mapper64_commandNumber & 0xf) == 0xf)
         {
             if (mapper64_prgAddressSelect == 0)
             {
                 Map.Switch8kPrgRom(data * 2, 2);
             }
             else
             {
                 Map.Switch8kPrgRom(data * 2, 0);
             }
         }
     }
     else if (address == 0xA000)
     {
         if ((data & 1) == 1)
         {
             Map.Cartridge.Mirroring = Mirroring.Vertical;
         }
         else
         {
             Map.Cartridge.Mirroring = Mirroring.Horizontal;
         }
         Map.ApplayMirroring();
     }
 }
Exemple #20
0
        public void Write(ushort address, byte data)
        {
            switch (address)
            {
            case 0x8000: Map.Switch16kPrgRom(data * 4, 0); break;

            case 0xB003:
                switch (data & 0x3)
                {
                case 0: Map.Cartridge.Mirroring = Mirroring.Vertical; break;

                case 1: Map.Cartridge.Mirroring = Mirroring.Horizontal; break;

                case 2:
                    Map.Cartridge.Mirroring     = Mirroring.One_Screen;
                    Map.Cartridge.MirroringBase = 0x2000;
                    break;

                case 3:
                    Map.Cartridge.Mirroring     = Mirroring.One_Screen;
                    Map.Cartridge.MirroringBase = 0x2400;
                    break;
                }
                Map.ApplayMirroring();
                break;

            case 0xC000: Map.Switch8kPrgRom(data * 2, 2); break;

            case 0xD000: Map.Switch1kChrRom(data, 0); break;

            case 0xD001: Map.Switch1kChrRom(data, 1); break;

            case 0xD002: Map.Switch1kChrRom(data, 2); break;

            case 0xD003: Map.Switch1kChrRom(data, 3); break;

            case 0xE000: Map.Switch1kChrRom(data, 4); break;

            case 0xE001: Map.Switch1kChrRom(data, 5); break;

            case 0xE002: Map.Switch1kChrRom(data, 6); break;

            case 0xE003: Map.Switch1kChrRom(data, 7); break;

            case 0xF000:
                irq_latch = data;
                break;

            case 0xF001:
                irq_enable = (data & 0x01) != 0;
                break;

            case 0xF002:
                irq_counter = irq_latch;
                break;

            //Sound
            //Pulse 1
            case 0x9000:
                Map.apu.VRC6PULSE1.Write9000(data);
                break;

            case 0x9001:
                Map.apu.VRC6PULSE1.Write9001(data);
                break;

            case 0x9002:
                Map.apu.VRC6PULSE1.Write9002(data);
                break;

            //Pulse 2
            case 0xA000:
                Map.apu.VRC6PULSE2.WriteA000(data);
                break;

            case 0xA001:
                Map.apu.VRC6PULSE2.WriteA001(data);
                break;

            case 0xA002:
                Map.apu.VRC6PULSE2.WriteA002(data);
                break;

            //Sawtooth
            case 0xB000:
                Map.apu.VRC6SAWTOOTH.WriteB000(data);
                break;

            case 0xB001:
                Map.apu.VRC6SAWTOOTH.WriteB001(data);
                break;

            case 0xB002:
                Map.apu.VRC6SAWTOOTH.WriteB002(data);
                break;
            }
        }
Exemple #21
0
        public void Write(ushort address, byte data)
        {
            switch (address & 0xE001)
            {
            case 0x8000:
                reg = data;
                SetBank_CPU();
                SetBank_PPU();
                break;

            case 0x8001:
                if (reg <= 0x05)
                {
                    if ((data & 0x20) != 0)
                    {
                        Map.Cartridge.Mirroring     = Mirroring.One_Screen;
                        Map.Cartridge.MirroringBase = 0x2400;
                        Map.ApplayMirroring();
                    }
                    else
                    {
                        Map.Cartridge.Mirroring     = Mirroring.One_Screen;
                        Map.Cartridge.MirroringBase = 0x2000;
                        Map.ApplayMirroring();
                    }
                    data &= 0x1F;
                }

                switch (reg & 0x07)
                {
                case 0x00:
                    //if (VROM_1K_SIZE)
                {
                    chr01 = (byte)(data & 0xFE);
                    SetBank_PPU();
                }
                break;

                case 0x01:
                    //if (VROM_1K_SIZE)
                {
                    chr23 = (byte)(data & 0xFE);
                    SetBank_PPU();
                }
                break;

                case 0x02:
                    //if (VROM_1K_SIZE)
                {
                    chr4 = data;
                    SetBank_PPU();
                }
                break;

                case 0x03:
                    //if (VROM_1K_SIZE)
                {
                    chr5 = data;
                    SetBank_PPU();
                }
                break;

                case 0x04:
                    //if (VROM_1K_SIZE)
                {
                    chr6 = data;
                    SetBank_PPU();
                }
                break;

                case 0x05:
                    //if (VROM_1K_SIZE)
                {
                    chr7 = data;
                    SetBank_PPU();
                }
                break;

                case 0x06:
                    prg0 = data;
                    SetBank_CPU();
                    break;

                case 0x07:
                    prg1 = data;
                    SetBank_CPU();
                    break;
                }
                break;
            }
        }
        public void Write(ushort address, byte data)
        {
            switch (address)
            {
            case 0x8000:
                reg[0] = data;
                SetPRG();
                SetCHR();
                break;

            case 0xA000:
                reg[1] = data;
                switch (reg[0] & 0x07)
                {
                case 0x00:
                    prg0 = (data & ((MEM.Cartridge.PRG_PAGES * 4) - 1));
                    SetPRG();
                    break;

                case 0x01:
                    prg1 = (data & ((MEM.Cartridge.PRG_PAGES * 4) - 1));
                    SetPRG();
                    break;

                case 0x02:
                    chr01 = (byte)(data & 0xFE);
                    SetCHR();
                    break;

                case 0x03:
                    chr23 = (byte)(data & 0xFE);
                    SetCHR();
                    break;

                case 0x04:
                    chr4 = data;
                    SetCHR();
                    break;

                case 0x05:
                    chr5 = data;
                    SetCHR();
                    break;

                case 0x06:
                    chr6 = data;
                    SetCHR();
                    break;

                case 0x07:
                    chr7 = data;
                    SetCHR();
                    break;
                }
                break;

            case 0xC000:
                reg[3] = data;
                SetCHR();
                break;

            case 0xE000:
                reg[2] = data;
                if (MEM.Cartridge.Mirroring != Mirroring.Four_Screen)
                {
                    if ((data & 0x01) != 0)
                    {
                        MEM.Cartridge.Mirroring = Mirroring.Horizontal;
                    }
                    else
                    {
                        MEM.Cartridge.Mirroring = Mirroring.Vertical;
                    }
                    MEM.ApplayMirroring();
                }
                SetCHR();
                break;
            }
        }
Exemple #23
0
        public void Write(ushort address, byte data)
        {
            switch (address)
            {
            /*Swap mode*/
            case 0x9001:
            case 0x9004:
                SwapMode = (data & 0X2) == 0X2;
                break;

            /*prg selection 1*/
            case 0x8000:
            case 0x8002:
            case 0x8004:
            case 0x8006:
                if (!SwapMode)
                {
                    _Map.Switch16kPrgRom((_Map.Cartridge.PRG_PAGES - 1) * 4, 1);
                    _Map.Switch8kPrgRom((data & 0X1f) * 2, 0);
                }
                else
                {
                    _Map.Switch16kPrgRom((_Map.Cartridge.PRG_PAGES - 1) * 4, 1);
                    _Map.Switch8kPrgRom((data & 0X1f) * 2, 2);
                }
                break;

            /*prg selection 2*/
            case 0xA000:
            case 0xA002:
            case 0xA004:
            case 0xA006:
                _Map.Switch8kPrgRom((data & 0X1f) * 2, 1);
                break;

            /*Mirroring Control*/
            case 0x9000:
            case 0x9002:
                data &= 0x03;
                if (data == 0)
                {
                    _Map.Cartridge.Mirroring = Mirroring.Vertical;
                }
                else if (data == 1)
                {
                    _Map.Cartridge.Mirroring = Mirroring.Horizontal;
                }
                else if (data == 2)
                {
                    _Map.Cartridge.Mirroring     = Mirroring.One_Screen;
                    _Map.Cartridge.MirroringBase = 0x2000;
                }
                else
                {
                    _Map.Cartridge.Mirroring     = Mirroring.One_Screen;
                    _Map.Cartridge.MirroringBase = 0x2400;
                }
                _Map.ApplayMirroring();
                break;

            /*CHR Selection*/
            case 0xB000:
                reg[0] = (byte)((reg[0] & 0xF0) | (data & 0x0F));
                _Map.Switch1kChrRom(reg[0], 0);
                break;

            case 0xB002:
            case 0xB008:
                reg[0] = (byte)((reg[0] & 0x0F) | ((data & 0x0F) << 4));
                _Map.Switch1kChrRom(reg[0], 0);
                break;

            case 0xB001:
            case 0xB004:
                reg[1] = (byte)((reg[1] & 0xF0) | (data & 0x0F));
                _Map.Switch1kChrRom(reg[1], 1);
                break;

            case 0xB003:
            case 0xB00C:
                reg[1] = (byte)((reg[1] & 0x0F) | ((data & 0x0F) << 4));
                _Map.Switch1kChrRom(reg[1], 1);
                break;

            case 0xC000:
                reg[2] = (byte)((reg[2] & 0xF0) | (data & 0x0F));
                _Map.Switch1kChrRom(reg[2], 2);
                break;

            case 0xC002:
            case 0xC008:
                reg[2] = (byte)((reg[2] & 0x0F) | ((data & 0x0F) << 4));
                _Map.Switch1kChrRom(reg[2], 2);
                break;

            case 0xC001:
            case 0xC004:
                reg[3] = (byte)((reg[3] & 0xF0) | (data & 0x0F));
                _Map.Switch1kChrRom(reg[3], 3);
                break;

            case 0xC003:
            case 0xC00C:
                reg[3] = (byte)((reg[3] & 0x0F) | ((data & 0x0F) << 4));
                _Map.Switch1kChrRom(reg[3], 3);
                break;

            case 0xD000:
                reg[4] = (byte)((reg[4] & 0xF0) | (data & 0x0F));
                _Map.Switch1kChrRom(reg[4], 4);
                break;

            case 0xD002:
            case 0xD008:
                reg[4] = (byte)((reg[4] & 0x0F) | ((data & 0x0F) << 4));
                _Map.Switch1kChrRom(reg[4], 4);
                break;

            case 0xD001:
            case 0xD004:
                reg[5] = (byte)((reg[5] & 0xF0) | (data & 0x0F));
                _Map.Switch1kChrRom(reg[5], 5);
                break;

            case 0xD003:
            case 0xD00C:
                reg[5] = (byte)((reg[5] & 0x0F) | ((data & 0x0F) << 4));
                _Map.Switch1kChrRom(reg[5], 5);
                break;

            case 0xE000:
                reg[6] = (byte)((reg[6] & 0xF0) | (data & 0x0F));
                _Map.Switch1kChrRom(reg[6], 6);
                break;

            case 0xE002:
            case 0xE008:
                reg[6] = (byte)((reg[6] & 0x0F) | ((data & 0x0F) << 4));
                _Map.Switch1kChrRom(reg[6], 6);
                break;

            case 0xE001:
            case 0xE004:
                reg[7] = (byte)((reg[7] & 0xF0) | (data & 0x0F));
                _Map.Switch1kChrRom(reg[7], 7);
                break;

            case 0xE003:
            case 0xE00C:
                reg[7] = (byte)((reg[7] & 0x0F) | ((data & 0x0F) << 4));
                _Map.Switch1kChrRom(reg[7], 7);
                break;

            /*IRQs*/
            case 0xF000:
                irq_latch = (irq_latch & 0xF0) | (data & 0x0F);
                break;

            case 0xF002:
            case 0xF008:
                irq_latch = (irq_latch & 0x0F) | ((data & 0x0F) << 4);
                break;

            case 0xF001:
            case 0xF004:
                irq_enable  = (byte)(data & 0x03);
                irq_counter = irq_latch;
                irq_clock   = 0;
                break;

            case 0xF003:
            case 0xF00C:
                irq_enable = (byte)((irq_enable & 0x01) * 3);
                break;
            }
        }
        public void Write(ushort address, byte data)
        {
            if ((address & 0xFF00) == 0x4100)
            {
                // Street Fighter 2 YOKO
                mem.Switch32kPrgRom(((data & 0x30) >> 4) * 8);
            }
            else if ((address & 0xFF00) == 0x6100)
            {
                // Master Fighter 2
                mem.Switch32kPrgRom((data & 0x03) * 8);
            }
            else
            {
                switch (address & 0xE001)
                {
                case 0x8000:
                    reg[0] = data;
                    SetCHR();
                    break;

                case 0x8001:
                    reg[1] = data;
                    SetCHR();
                    switch (reg[0] & 0x07)
                    {
                    case 0x00:
                        chr01 = (byte)(data & 0xFE);
                        SetCHR();
                        break;

                    case 0x01:
                        chr23 = (byte)(data & 0xFE);
                        SetCHR();
                        break;

                    case 0x02:
                        chr4 = data;
                        SetCHR();
                        break;

                    case 0x03:
                        chr5 = data;
                        SetCHR();
                        break;

                    case 0x04:
                        chr6 = data;
                        SetCHR();
                        break;

                    case 0x05:
                        chr7 = data;
                        SetCHR();
                        break;
                    }
                    break;

                case 0xA000:
                    if ((data & 0x01) != 0)
                    {
                        mem.Cartridge.Mirroring = Mirroring.Horizontal;
                    }
                    else
                    {
                        mem.Cartridge.Mirroring = Mirroring.Vertical;
                    }
                    mem.ApplayMirroring();
                    break;

                case 0xC000:
                    irq_counter = data;
                    break;

                case 0xC001:
                    irq_latch = data;
                    break;

                case 0xE000:
                    irq_enable = 0;
                    break;

                case 0xE001:
                    irq_enable = 0xFF;
                    break;
                }
            }
        }
        public void Write(ushort address, byte data)
        {
            if (address == 0x8000)
            {
                Map.Switch8kPrgRom(data * 2, 0);
            }
            else if (address == 0x9000)
            {
                switch (data & 0x3)
                {
                case 0: Map.Cartridge.Mirroring = Mirroring.Vertical; break;

                case 1: Map.Cartridge.Mirroring = Mirroring.Horizontal; break;

                case 2:
                    Map.Cartridge.Mirroring     = Mirroring.One_Screen;
                    Map.Cartridge.MirroringBase = 0x2400;
                    break;

                case 3:
                    Map.Cartridge.Mirroring     = Mirroring.One_Screen;
                    Map.Cartridge.MirroringBase = 0x2000;
                    break;
                }
                Map.ApplayMirroring();
            }
            else if (address == 0xA000)
            {
                Map.Switch8kPrgRom(data * 2, 1);
            }
            else if (address == 0xB000)
            {
                Map.Switch1kChrRom((data >> 1), 0);
            }
            else if (address == 0xB001)
            {
                Map.Switch1kChrRom((data >> 1), 1);
            }
            else if (address == 0xC000)
            {
                Map.Switch1kChrRom((data >> 1), 2);
            }
            else if (address == 0xC001)
            {
                Map.Switch1kChrRom((data >> 1), 3);
            }
            else if (address == 0xD000)
            {
                Map.Switch1kChrRom((data >> 1), 4);
            }
            else if (address == 0xD001)
            {
                Map.Switch1kChrRom((data >> 1), 5);
            }
            else if (address == 0xE000)
            {
                Map.Switch1kChrRom((data >> 1), 6);
            }
            else if (address == 0xE001)
            {
                Map.Switch1kChrRom((data >> 1), 7);
            }
        }
        public void Write(ushort address, byte data)
        {
            switch (address)
            {
            case 0x8000:
                reg[0] = (reg[0] & 0xF0) | (data & 0x0F);
                Map.Switch8kPrgRom(reg[0] * 2, 0);
                break;

            case 0x8001:
                reg[0] = (reg[0] & 0x0F) | ((data & 0x0F) << 4);
                Map.Switch8kPrgRom(reg[0] * 2, 0);
                break;

            case 0x8002:
                reg[1] = (reg[1] & 0xF0) | (data & 0x0F);
                Map.Switch8kPrgRom(reg[1] * 2, 1);
                break;

            case 0x8003:
                reg[1] = (reg[1] & 0x0F) | ((data & 0x0F) << 4);
                Map.Switch8kPrgRom(reg[1] * 2, 1);
                break;

            case 0x9000:
                reg[2] = (reg[2] & 0xF0) | (data & 0x0F);
                Map.Switch8kPrgRom(reg[2] * 2, 2);
                break;

            case 0x9001:
                reg[2] = (reg[2] & 0x0F) | ((data & 0x0F) << 4);
                Map.Switch8kPrgRom(reg[2] * 2, 2);
                break;

            case 0xA000:
                reg[3] = (reg[3] & 0xF0) | (data & 0x0F);
                Map.Switch1kChrRom(reg[3], 0);
                break;

            case 0xA001:
                reg[3] = (reg[3] & 0x0F) | ((data & 0x0F) << 4);
                Map.Switch1kChrRom(reg[3], 0);
                break;

            case 0xA002:
                reg[4] = (reg[4] & 0xF0) | (data & 0x0F);
                Map.Switch1kChrRom(reg[4], 1);
                break;

            case 0xA003:
                reg[4] = (reg[4] & 0x0F) | ((data & 0x0F) << 4);
                Map.Switch1kChrRom(reg[4], 1);
                break;

            case 0xB000:
                reg[5] = (reg[5] & 0xF0) | (data & 0x0F);
                Map.Switch1kChrRom(reg[5], 2);
                break;

            case 0xB001:
                reg[5] = (reg[5] & 0x0F) | ((data & 0x0F) << 4);
                Map.Switch1kChrRom(reg[5], 2);
                break;

            case 0xB002:
                reg[6] = (reg[6] & 0xF0) | (data & 0x0F);
                Map.Switch1kChrRom(reg[6], 3);
                break;

            case 0xB003:
                reg[6] = (reg[6] & 0x0F) | ((data & 0x0F) << 4);
                Map.Switch1kChrRom(reg[6], 3);
                break;

            case 0xC000:
                reg[7] = (reg[7] & 0xF0) | (data & 0x0F);
                Map.Switch1kChrRom(reg[7], 4);
                break;

            case 0xC001:
                reg[7] = (reg[7] & 0x0F) | ((data & 0x0F) << 4);
                Map.Switch1kChrRom(reg[7], 4);
                break;

            case 0xC002:
                reg[8] = (reg[8] & 0xF0) | (data & 0x0F);
                Map.Switch1kChrRom(reg[8], 5);
                break;

            case 0xC003:
                reg[8] = (reg[8] & 0x0F) | ((data & 0x0F) << 4);
                Map.Switch1kChrRom(reg[8], 5);
                break;

            case 0xD000:
                reg[9] = (reg[9] & 0xF0) | (data & 0x0F);
                Map.Switch1kChrRom(reg[9], 6);
                break;

            case 0xD001:
                reg[9] = (reg[9] & 0x0F) | ((data & 0x0F) << 4);
                Map.Switch1kChrRom(reg[9], 6);
                break;

            case 0xD002:
                reg[10] = (reg[10] & 0xF0) | (data & 0x0F);
                Map.Switch1kChrRom(reg[10], 7);
                break;

            case 0xD003:
                reg[10] = (reg[10] & 0x0F) | ((data & 0x0F) << 4);
                Map.Switch1kChrRom(reg[10], 7);
                break;

            case 0xE000:
                irq_latch = (irq_latch & 0xFFF0) | (data & 0x0F);
                break;

            case 0xE001:
                irq_latch = (irq_latch & 0xFF0F) | ((data & 0x0F) << 4);
                break;

            case 0xE002:
                irq_latch = (irq_latch & 0xF0FF) | ((data & 0x0F) << 8);
                break;

            case 0xE003:
                irq_latch = (irq_latch & 0x0FFF) | ((data & 0x0F) << 12);
                break;

            case 0xF000:
                irq_counter = irq_latch;
                break;

            case 0xF001:
                irq_mode   = (data >> 1) & 0x07;
                irq_enable = (data & 0x01);
                break;

            case 0xF002:
                data &= 0x03;
                if (data == 0)
                {
                    Map.Cartridge.Mirroring = Mirroring.Horizontal;
                }
                else if (data == 1)
                {
                    Map.Cartridge.Mirroring = Mirroring.Vertical;
                }
                else
                {
                    Map.Cartridge.Mirroring     = Mirroring.One_Screen;
                    Map.Cartridge.MirroringBase = 0x2000;
                }
                Map.ApplayMirroring();
                break;
            }
        }
        public void Write(ushort address, byte data)
        {
            switch (address)
            {
            case 0x8000:
                if (!PRGMode)
                {
                    Map.Switch8kPrgRom(data * 2, 0);
                }
                else
                {
                    Map.Switch8kPrgRom(data * 2, 2);
                }
                break;

            case 0xA000:
                Map.Switch8kPrgRom(data * 2, 1);
                break;

            case 0x9000:
                switch (data & 0x3)
                {
                case 0: Map.Cartridge.Mirroring = Mirroring.Vertical; break;

                case 1: Map.Cartridge.Mirroring = Mirroring.Horizontal; break;

                case 2:
                    Map.Cartridge.Mirroring     = Mirroring.One_Screen;
                    Map.Cartridge.MirroringBase = 0x2000;
                    break;

                case 3:
                    Map.Cartridge.Mirroring     = Mirroring.One_Screen;
                    Map.Cartridge.MirroringBase = 0x2400;
                    break;
                }
                Map.ApplayMirroring();
                break;

            case 0x9080:
            case 0x9002:
                PRGMode = (data & 0x2) == 0x2;
                break;

            case 0xB000:
                REG[0] = (byte)((REG[0] & 0xF0) | (data & 0x0F));
                Map.Switch1kChrRom(REG[0], 0);
                break;

            case 0xB002:
            case 0xB040:
                REG[0] = (byte)(((data & 0x0F) << 4) | (REG[0] & 0x0F));
                Map.Switch1kChrRom(REG[0], 0);
                break;

            case 0xB001:
            case 0xB004:
            case 0xB080:
                REG[1] = (byte)((REG[1] & 0xF0) | (data & 0x0F));
                Map.Switch1kChrRom(REG[1], 1);
                break;

            case 0xB003:
            case 0xB006:
            case 0xB0C0:
                REG[1] = (byte)(((data & 0x0F) << 4) | (REG[1] & 0x0F));
                Map.Switch1kChrRom(REG[1], 1);
                break;

            case 0xC000:
                REG[2] = (byte)((REG[2] & 0xF0) | (data & 0x0F));
                Map.Switch1kChrRom(REG[2], 2);
                break;

            case 0xC002:
            case 0xC040:
                REG[2] = (byte)(((data & 0x0F) << 4) | (REG[2] & 0x0F));
                Map.Switch1kChrRom(REG[2], 2);
                break;

            case 0xC001:
            case 0xC004:
            case 0xC080:
                REG[3] = (byte)((REG[3] & 0xF0) | (data & 0x0F));
                Map.Switch1kChrRom(REG[3], 3);
                break;

            case 0xC003:
            case 0xC006:
            case 0xC0C0:
                REG[3] = (byte)(((data & 0x0F) << 4) | (REG[3] & 0x0F));
                Map.Switch1kChrRom(REG[3], 3);
                break;

            case 0xD000:
                REG[4] = (byte)((REG[4] & 0xF0) | (data & 0x0F));
                Map.Switch1kChrRom(REG[4], 4);
                break;

            case 0xD002:
            case 0xD040:
                REG[4] = (byte)(((data & 0x0F) << 4) | (REG[4] & 0x0F));
                Map.Switch1kChrRom(REG[4], 4);
                break;

            case 0xD001:
            case 0xD004:
            case 0xD080:
                REG[5] = (byte)((REG[5] & 0xF0) | (data & 0x0F));
                Map.Switch1kChrRom(REG[5], 5);
                break;

            case 0xD003:
            case 0xD006:
            case 0xD0C0:
                REG[5] = (byte)(((data & 0x0F) << 4) | (REG[5] & 0x0F));
                Map.Switch1kChrRom(REG[5], 5);
                break;

            case 0xE000:
                REG[6] = (byte)((REG[6] & 0xF0) | (data & 0x0F));
                Map.Switch1kChrRom(REG[6], 6);
                break;

            case 0xE002:
            case 0xE040:
                REG[6] = (byte)(((data & 0x0F) << 4) | (REG[6] & 0x0F));
                Map.Switch1kChrRom(REG[6], 6);
                break;

            case 0xE001:
            case 0xE004:
            case 0xE080:
                REG[7] = (byte)((REG[7] & 0xF0) | (data & 0x0F));
                Map.Switch1kChrRom(REG[7], 7);
                break;

            case 0xE003:
            case 0xE006:
            case 0xE0C0:
                REG[7] = (byte)(((data & 0x0F) << 4) | (REG[7] & 0x0F));
                Map.Switch1kChrRom(REG[7], 7);
                break;

            case 0xF000:
                irq_latch = (irq_latch & 0xF0) | (data & 0x0F);
                break;

            case 0xF002:
            case 0xF040:
                irq_latch = (irq_latch & 0x0F) | ((data & 0x0F) << 4);
                break;

            case 0xF003:
            case 0xF0C0:
            case 0xF006:
                irq_enable = (irq_enable & 0x01) * 3;
                irq_clock  = 0;
                break;

            case 0xF004:
            case 0xF080:
                irq_enable = data & 0x03;
                if ((irq_enable & 0x02) != 0)
                {
                    irq_counter = irq_latch;
                    irq_clock   = 0;
                }
                break;
            }
        }
        public void Write(ushort address, byte data)
        {
            switch (address & 0xE000)
            {
            case 0x8000:
                reg = data;
                break;

            case 0xA000:
                switch (reg & 0x0F)
                {
                case 0x00: Map.Switch1kChrRom(data, 0); break;

                case 0x01: Map.Switch1kChrRom(data, 1); break;

                case 0x02: Map.Switch1kChrRom(data, 2); break;

                case 0x03: Map.Switch1kChrRom(data, 3); break;

                case 0x04: Map.Switch1kChrRom(data, 4); break;

                case 0x05: Map.Switch1kChrRom(data, 5); break;

                case 0x06: Map.Switch1kChrRom(data, 6); break;

                case 0x07: Map.Switch1kChrRom(data, 7); break;

                case 0x08:
                    if ((data & 0x40) == 0)
                    {
                        Map.Switch8kPrgRomToSRAM((data & 0x3F) * 2);
                    }
                    break;

                case 0x09:
                    Map.Switch8kPrgRom(data * 2, 0);
                    break;

                case 0x0A:
                    Map.Switch8kPrgRom(data * 2, 1);
                    break;

                case 0x0B:
                    Map.Switch8kPrgRom(data * 2, 2);
                    break;

                case 0x0C:
                    data &= 0x03;
                    if (data == 0)
                    {
                        Map.Cartridge.Mirroring = Mirroring.Vertical;
                    }
                    if (data == 1)
                    {
                        Map.Cartridge.Mirroring = Mirroring.Horizontal;
                    }
                    if (data == 2)
                    {
                        Map.Cartridge.Mirroring     = Mirroring.One_Screen;
                        Map.Cartridge.MirroringBase = 0x2000;
                    }
                    if (data == 3)
                    {
                        Map.Cartridge.Mirroring     = Mirroring.One_Screen;
                        Map.Cartridge.MirroringBase = 0x2400;
                    }
                    Map.ApplayMirroring();
                    break;

                case 0x0D:
                    if (data == 0)
                    {
                        timer_irq_enabled = false;
                    }
                    if (data == 0x81)
                    {
                        timer_irq_enabled = true;
                    }
                    break;

                case 0x0E:
                    timer_irq_counter_69 = (short)((timer_irq_counter_69 & 0xFF00) | data);

                    break;

                case 0x0F:
                    timer_irq_counter_69 = (short)((timer_irq_counter_69 & 0x00FF) | (data << 8));
                    break;
                }
                break;

            case 0xC000:
            case 0xE000:
                break;
            }
        }
Exemple #29
0
 public void Write(ushort address, byte data)
 {
     if (address == 0x8000)
     {
         Map.Switch8kPrgRom((data & 0x1F) * 2, 0);
         if (type1)
         {
             if ((data & 0x40) == 0x40)
             {
                 Map.Cartridge.Mirroring = Mirroring.Horizontal;
             }
             else
             {
                 Map.Cartridge.Mirroring = Mirroring.Vertical;
             }
             Map.ApplayMirroring();
         }
     }
     else if (address == 0x8001)
     {
         Map.Switch8kPrgRom(data * 2, 1);
     }
     else if (address == 0x8002)
     {
         Map.Switch2kChrRom(data * 2, 0);
     }
     else if (address == 0x8003)
     {
         Map.Switch2kChrRom(data * 2, 1);
     }
     else if (address == 0xA000)
     {
         Map.Switch1kChrRom(data, 4);
     }
     else if (address == 0xA001)
     {
         Map.Switch1kChrRom(data, 5);
     }
     else if (address == 0xA002)
     {
         Map.Switch1kChrRom(data, 6);
     }
     else if (address == 0xA003)
     {
         Map.Switch1kChrRom(data, 7);
     }
     //Type 2 registers
     else if (address == 0xC000)
     {
         type1      = false;
         IRQCounter = data;
     }
     else if (address == 0xC001)
     {
         type1      = false;
         IRQCounter = data;
     }
     else if (address == 0xC002)
     {
         type1     = false;
         IRQEabled = true;
     }
     else if (address == 0xC003)
     {
         type1     = false;
         IRQEabled = false;
     }
     else if (address == 0xE000)
     {
         type1 = false;
         if ((data & 0x40) == 0x40)
         {
             Map.Cartridge.Mirroring = Mirroring.Horizontal;
         }
         else
         {
             Map.Cartridge.Mirroring = Mirroring.Vertical;
         }
         Map.ApplayMirroring();
     }
 }
        public void Write(ushort address, byte data)
        {
            switch (address)
            {
            /*PRG*/
            case 0x8000: _Map.Switch8kPrgRom(data * 2, 0); break;

            case 0x8010:
            case 0x8008: _Map.Switch8kPrgRom(data * 2, 1); break;

            case 0x9000: _Map.Switch8kPrgRom(data * 2, 2); break;

            /*CHR*/
            case 0xA000: _Map.Switch1kChrRom(data, 0); break;

            case 0xA008:
            case 0xA010: _Map.Switch1kChrRom(data, 1); break;

            case 0xB000: _Map.Switch1kChrRom(data, 2); break;

            case 0xB008:
            case 0xB010: _Map.Switch1kChrRom(data, 3); break;

            case 0xC000: _Map.Switch1kChrRom(data, 4); break;

            case 0xC008:
            case 0xC010: _Map.Switch1kChrRom(data, 5); break;

            case 0xD000: _Map.Switch1kChrRom(data, 6); break;

            case 0xD008:
            case 0xD010: _Map.Switch1kChrRom(data, 7); break;

            /*Mirroring*/
            case 0xE000:
                data &= 0x03;
                if (data == 0)
                {
                    _Map.Cartridge.Mirroring = Mirroring.Vertical;
                }
                else if (data == 1)
                {
                    _Map.Cartridge.Mirroring = Mirroring.Horizontal;
                }
                else if (data == 2)
                {
                    _Map.Cartridge.Mirroring     = Mirroring.One_Screen;
                    _Map.Cartridge.MirroringBase = 0x2000;
                }
                else
                {
                    _Map.Cartridge.Mirroring     = Mirroring.One_Screen;
                    _Map.Cartridge.MirroringBase = 0x2400;
                }
                _Map.ApplayMirroring();
                break;

            case 0xE008:
            case 0xE010:
                irq_latch = data;
                break;

            case 0xF000:
                irq_enable  = data & 0x03;
                irq_counter = irq_latch;
                irq_clock   = 0;
                break;

            case 0xF008:
            case 0xF010:
                irq_enable = (irq_enable & 0x01) * 3;
                break;
            }
        }