public void Write(ushort address, byte data) { if ((address >= 0x8000) && (address <= 0xFFFF)) { Map.Switch4kChrRom(data * 4, 1); } }
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 == 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); } }
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(); } }
public void SetUpMapperDefaults() { mapper4_prgAddressSelect = 0; mapper4_chrAddressSelect = 0; SetPRG(); if (_Map.Cartridge.IsVRAM) { _Map.FillCHR(8); } _Map.Switch4kChrRom(0, 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); } }
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; } } } }