Esempio n. 1
0
 public void Write(ushort address, byte data)
 {
     if ((address >= 0x8000) && (address <= 0xFFFF))
     {
         Map.Switch4kChrRom(data * 4, 1);
     }
 }
Esempio n. 2
0
        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;
            }
        }
Esempio n. 3
0
 public void Write(ushort address, byte data)
 {
     if (address == 0x7ffd)
     {
         Map.Switch32kPrgRom(data * 8);
     }
     else if (address == 0x7ffe)
     {
         Map.Switch4kChrRom(data * 4, 0);
     }
     else if (address == 0x7fff)
     {
         Map.Switch4kChrRom(data * 4, 1);
     }
     else if (address >= 0x8000)
     {
         Map.Switch32kPrgRom(data * 8);
     }
 }
Esempio n. 4
0
 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();
     }
 }
Esempio n. 5
0
 public void SetUpMapperDefaults()
 {
     mapper4_prgAddressSelect = 0;
     mapper4_chrAddressSelect = 0;
     SetPRG();
     if (_Map.Cartridge.IsVRAM)
     {
         _Map.FillCHR(8);
     }
     _Map.Switch4kChrRom(0, 0);
 }
Esempio n. 6
0
        void SetCHR()
        {
            int[] bank = new int[8];

            for (int i = 0; i < 8; i++)
            {
                bank[i] = (chh_reg[i] << 8) | (chl_reg[i]);
            }

            if (chr_size == 0)
            {
                mem.Switch8kChrRom(bank[0] * 8);
            }
            else if (chr_size == 1)
            {
                mem.Switch4kChrRom(bank[0] * 4, 0);
                mem.Switch4kChrRom(bank[4] * 4, 1);
            }
            else if (chr_size == 2)
            {
                mem.Switch2kChrRom(bank[0] * 2, 0);
                mem.Switch2kChrRom(bank[2] * 2, 1);
                mem.Switch2kChrRom(bank[4] * 2, 2);
                mem.Switch2kChrRom(bank[6] * 2, 3);
            }
            else
            {
                mem.Switch1kChrRom(bank[0], 0);
                mem.Switch1kChrRom(bank[1], 1);
                mem.Switch1kChrRom(bank[2], 2);
                mem.Switch1kChrRom(bank[3], 3);
                mem.Switch1kChrRom(bank[4], 4);
                mem.Switch1kChrRom(bank[5], 5);
                mem.Switch1kChrRom(bank[6], 6);
                mem.Switch1kChrRom(bank[7], 7);
            }
        }
Esempio n. 7
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;
             }
         }
     }
 }