예제 #1
0
 public void Write(ushort address, byte data)
 {
     if ((address & 0xFFF0) == 0xFF00)
     {
         Map.Switch16kPrgRom(((data >> 2) & 0x7) * 4, 0);
     }
 }
예제 #2
0
 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();
         }
     }
 }
예제 #3
0
        public void SetUpMapperDefaults()
        {
            mem.Switch16kPrgRom((mem.Cartridge.PRG_PAGES - 2) * 4, 0);
            mem.Switch16kPrgRom((mem.Cartridge.PRG_PAGES - 1) * 4, 1);
            if (mem.Cartridge.IsVRAM)
            {
                mem.FillCHR(16);
            }
            mem.Switch8kChrRom(0);

            for (int i = 0; i < 4; i++)
            {
                prg_reg[i]     = (byte)(mem.Cartridge.PRG_PAGES - 4 + i);
                ntl_reg[i]     = 0;
                nth_reg[i]     = 0;
                chl_reg[i]     = (byte)i;
                chh_reg[i]     = 0;
                chl_reg[i + 4] = (byte)(i + 4);
                chh_reg[i + 4] = 0;
            }

            if (sw_val != 0)
            {
                sw_val = 0x00;
            }
            else
            {
                sw_val = 0xFF;
            }
        }
예제 #4
0
 public void Write(ushort address, byte data)
 {
     if (address == 0x6000)
     {
         Map.Switch16kPrgRom(data * 4, 0);
     }
 }
예제 #5
0
        public void Write(ushort address, byte data)
        {
            data = (byte)(address & 0xFF);

            if (address >= 0x9000)
            {
                if ((data & 0xF0) == 0xD0)
                {
                    MEM.Switch16kPrgRom((data & 0x0F) * 4, 1);
                }
                else if ((data & 0xF0) == 0xE0)
                {
                    MEM.Switch8kChrRom((data & 0x0F) * 8);
                }
            }
            else
            {
                if ((data & 0xF0) == 0xB0)
                {
                    MEM.Switch16kPrgRom((data & 0x0F) * 4, 1);
                }
                else if ((data & 0xF0) == 0x70)
                {
                    MEM.Switch8kChrRom((data & 0x0F) * 8);
                }
            }
        }
예제 #6
0
 public void Write(ushort address, byte data)
 {
     if ((address >= 0x8000) && (address <= 0xFFFF))
     {
         Map.Switch16kPrgRom(data * 4, 0);
     }
 }
예제 #7
0
        public void Write(ushort address, byte data)
        {
            switch (address)
            {
            case 0xF000:
                _Map.Switch16kPrgRom((data & 0x0F) * 4, 0);
                break;

            case 0x8000:
                irq_counter = (irq_counter & 0xFFF0) | (data & 0x0F);
                break;

            case 0x9000:
                irq_counter = (irq_counter & 0xFF0F) | ((data & 0x0F) << 4);
                break;

            case 0xA000:
                irq_counter = (irq_counter & 0xF0FF) | ((data & 0x0F) << 8);
                break;

            case 0xB000:
                irq_counter = (irq_counter & 0x0FFF) | ((data & 0x0F) << 12);
                break;

            case 0xC000:
                irq_enable = data & 0x02;
                break;
            }
        }
예제 #8
0
 public void SetUpMapperDefaults()
 {
     Map.Switch16kPrgRom((Map.Cartridge.PRG_PAGES - 1) * 4, 1);
     Map.Switch16kPrgRom((Map.Cartridge.PRG_PAGES - 2) * 4, 0);
     if (Map.Cartridge.IsVRAM)
     {
         Map.FillCHR(8);
     }
     Map.Switch8kChrRom(0);
 }
예제 #9
0
 public void SetUpMapperDefaults()
 {
     Map.Switch16kPrgRom(0, 0);
     Map.Switch16kPrgRom((Map.Cartridge.PRG_PAGES - 1) * 4, 1);
     Map.FillCRAM(32);//we'll need these 32k
     if (Map.Cartridge.IsVRAM)
     {
         Map.FillCHR(16);
     }
     Map.Switch8kChrRom(0);
 }
예제 #10
0
 public void Write(ushort address, byte data)
 {
     address &= 0xF000;
     if (address == 0xA000)
     {
         map.Switch16kPrgRom(data * 4, 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();
     }
 }
예제 #11
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);
     }
 }
예제 #12
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();
     }
 }
예제 #13
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();
            }
        }
예제 #14
0
        public void Write(ushort address, byte data)
        {
            if (address >= 0x8000 & address <= 0xFFFF)
            {
                Map.Switch16kPrgRom(((data & 0x3C) >> 2) * 4, 0);
                Map.Switch8kChrRom((data & 0x3) * 8);
            }
            else
            {
                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;
                }
            }
        }
        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;
                }
            }
        }
예제 #16
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;
                }
            }
        }
예제 #17
0
 public void SetUpMapperDefaults()
 {
     MEM.Switch32kPrgRom(0);
     if (MEM.Cartridge.IsVRAM)
     {
         MEM.FillCHR(16);
     }
     MEM.Switch8kChrRom(0);
     if (MEM.Cartridge.PRG_PAGES == 1)
     {
         MEM.Switch16kPrgRom(0, 1);
     }
 }
예제 #18
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;
            }
        }
예제 #19
0
        public void Write(ushort address, byte data)
        {
            switch (address)
            {
            case 0x8000:
                //case 0x8003:
                _Map.Switch16kPrgRom(data * 4, 0);
                break;

            case 0xC000:
                //case 0xC003:
                _Map.Switch8kPrgRom(data * 2, 2);
                break;

            case 0xB003:
                int mm = data & 0x7F;
                if (mm == 0x20)
                {
                    _Map.Cartridge.Mirroring = Mirroring.Vertical;
                }
                else if (mm == 0x24)
                {
                    _Map.Cartridge.Mirroring = Mirroring.Horizontal;
                }
                else if (mm == 0x28)
                {
                    _Map.Cartridge.Mirroring     = Mirroring.One_Screen;
                    _Map.Cartridge.MirroringBase = 0x2000;
                }
                else if (mm == 0x08 || mm == 0x2C)
                {
                    _Map.Cartridge.Mirroring     = Mirroring.One_Screen;
                    _Map.Cartridge.MirroringBase = 0x2400;
                }
                _Map.ApplayMirroring();
                break;

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

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

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

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

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

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

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

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

            case 0xF000:
                irq_latch = data;
                break;

            case 0xF001:
                irq_enable = (irq_enable & 0x01) * 3;
                break;

            case 0xF002:
                irq_enable = data & 0x03;
                if ((irq_enable & 0x02) != 0)
                {
                    irq_counter = irq_latch;
                    irq_clock   = 0;
                }
                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;
            }
        }
예제 #20
0
 public void Write(ushort address, byte data)
 {
     if ((address >= 0x8000) && (address <= 0x9FFF))
     {
         if ((data & 0x80) == 0x80)
         {
             //Reset
             mapper1_register8000BitPosition = 0;
             mapper1_register8000Value       = 0;
             mapper1_mirroringFlag           = 0;
             mapper1_onePageMirroring        = 1;
             mapper1_prgSwitchingArea        = 1;
             mapper1_prgSwitchingSize        = 1;
             mapper1_vromSwitchingSize       = 0;
         }
         else
         {
             mapper1_register8000Value += (data & 0x1) << mapper1_register8000BitPosition;
             mapper1_register8000BitPosition++;
             if (mapper1_register8000BitPosition == 5)
             {
                 mapper1_mirroringFlag = (byte)(mapper1_register8000Value & 0x1);
                 if (mapper1_mirroringFlag == 0)
                 {
                     Map.Cartridge.Mirroring = Mirroring.Vertical;
                     Map.ApplayMirroring();
                 }
                 else
                 {
                     Map.Cartridge.Mirroring = Mirroring.Horizontal;
                     Map.ApplayMirroring();
                 }
                 mapper1_onePageMirroring = (byte)((mapper1_register8000Value >> 1) & 0x1);
                 if (mapper1_onePageMirroring == 0)
                 {
                     Map.Cartridge.Mirroring     = Mirroring.One_Screen;
                     Map.Cartridge.MirroringBase = 0x2000;
                     Map.ApplayMirroring();
                 }
                 mapper1_prgSwitchingArea        = (byte)((mapper1_register8000Value >> 2) & 0x1);
                 mapper1_prgSwitchingSize        = (byte)((mapper1_register8000Value >> 3) & 0x1);
                 mapper1_vromSwitchingSize       = (byte)((mapper1_register8000Value >> 4) & 0x1);
                 mapper1_register8000BitPosition = 0;
                 mapper1_register8000Value       = 0;
                 mapper1_registerA000BitPosition = 0;
                 mapper1_registerA000Value       = 0;
                 mapper1_registerC000BitPosition = 0;
                 mapper1_registerC000Value       = 0;
                 mapper1_registerE000BitPosition = 0;
                 mapper1_registerE000Value       = 0;
             }
         }
     }
     else if ((address >= 0xA000) && (address <= 0xBFFF))
     {
         if ((data & 0x80) == 0x80)
         {
             //Reset
             mapper1_registerA000BitPosition = 0;
             mapper1_registerA000Value       = 0;
         }
         else
         {
             mapper1_registerA000Value += (data & 0x1) << mapper1_registerA000BitPosition;
             mapper1_registerA000BitPosition++;
             if (mapper1_registerA000BitPosition == 5)
             {
                 if (Map.Cartridge.CHR_PAGES > 0)
                 {
                     if (mapper1_vromSwitchingSize == 1)
                     {
                         Map.Switch4kChrRom(mapper1_registerA000Value * 4, 0);
                     }
                     else
                     {
                         Map.Switch8kChrRom((mapper1_registerA000Value >> 1) * 8);
                     }
                 }
                 mapper1_registerA000BitPosition = 0;
                 mapper1_registerA000Value       = 0;
             }
         }
     }
     else if ((address >= 0xC000) && (address <= 0xDFFF))
     {
         if ((data & 0x80) == 0x80)
         {
             //Reset
             mapper1_registerC000BitPosition = 0;
             mapper1_registerC000Value       = 0;
         }
         else
         {
             mapper1_registerC000Value += (data & 0x1) << mapper1_registerC000BitPosition;
             mapper1_registerC000BitPosition++;
             if (mapper1_registerC000BitPosition == 5)
             {
                 if (Map.Cartridge.CHR_PAGES > 0)
                 {
                     if (mapper1_vromSwitchingSize == 1)
                     {
                         Map.Switch4kChrRom(mapper1_registerC000Value * 4, 1);
                     }
                 }
                 mapper1_registerC000BitPosition = 0;
                 mapper1_registerC000Value       = 0;
             }
         }
     }
     else if ((address >= 0xE000) && (address <= 0xFFFF))
     {
         if ((data & 0x80) == 0x80)
         {
             //Reset
             mapper1_registerE000BitPosition = 0;
             mapper1_registerE000Value       = 0;
             mapper1_registerA000BitPosition = 0;
             mapper1_registerA000Value       = 0;
             mapper1_registerC000BitPosition = 0;
             mapper1_registerC000Value       = 0;
             mapper1_register8000BitPosition = 0;
             mapper1_register8000Value       = 0;
         }
         else
         {
             mapper1_registerE000Value += (data & 0x1) << mapper1_registerE000BitPosition;
             mapper1_registerE000BitPosition++;
             if (mapper1_registerE000BitPosition == 5)
             {
                 if (mapper1_prgSwitchingSize == 1)
                 {
                     if (mapper1_prgSwitchingArea == 1)
                     {
                         // Switch bank at 0x8000 and reset 0xC000
                         Map.Switch16kPrgRom(mapper1_registerE000Value * 4, 0);
                         Map.Switch16kPrgRom((Map.Cartridge.PRG_PAGES - 1) * 4, 1);
                     }
                     else
                     {
                         // Switch bank at 0xC000 and reset 0x8000
                         Map.Switch16kPrgRom(mapper1_registerE000Value * 4, 1);
                         Map.Switch16kPrgRom(0, 0);
                     }
                 }
                 else
                 {
                     //Full 32k switch
                     Map.Switch32kPrgRom((mapper1_registerE000Value >> 1) * 8);
                 }
                 mapper1_registerE000BitPosition = 0;
                 mapper1_registerE000Value       = 0;
             }
         }
     }
 }
예제 #21
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;
            }
        }
예제 #22
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;
            }
        }
예제 #23
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;    //
            }
        }