From 1e6fdc26594ff5dc4900e145b489054ba6445cc0 Mon Sep 17 00:00:00 2001 From: saxxonpike Date: Thu, 29 Nov 2012 02:46:35 +0000 Subject: [PATCH] commodore64: VIC reads from proper bank, increased performance --- .../Computers/Commodore64/C64.Core.cs | 2 +- .../Computers/Commodore64/MOS/MOSPLA.cs | 30 ++++++++++--------- .../Computers/Commodore64/MOS/Vic.cs | 3 +- 3 files changed, 19 insertions(+), 16 deletions(-) diff --git a/BizHawk.Emulation/Computers/Commodore64/C64.Core.cs b/BizHawk.Emulation/Computers/Commodore64/C64.Core.cs index 9c447033d5..e187b6b101 100644 --- a/BizHawk.Emulation/Computers/Commodore64/C64.Core.cs +++ b/BizHawk.Emulation/Computers/Commodore64/C64.Core.cs @@ -149,7 +149,7 @@ namespace BizHawk.Emulation.Computers.Commodore64 cartPort = new CartridgePort(); cia0 = new MOS6526(initRegion); cia1 = new MOS6526(initRegion); - pla = new MOSPLA(this, cia1.ReadPort0); + pla = new MOSPLA(this); switch (initRegion) { case Region.NTSC: diff --git a/BizHawk.Emulation/Computers/Commodore64/MOS/MOSPLA.cs b/BizHawk.Emulation/Computers/Commodore64/MOS/MOSPLA.cs index b901a7e370..ac9108d65c 100644 --- a/BizHawk.Emulation/Computers/Commodore64/MOS/MOSPLA.cs +++ b/BizHawk.Emulation/Computers/Commodore64/MOS/MOSPLA.cs @@ -53,12 +53,11 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS private bool pinHiRam; private bool pinLoRam; private bool ultimax; - private Func vicBankPortRead; + private ushort vicBank; - public MOSPLA(C64Chips newChips, FuncnewVicBankPortRead) + public MOSPLA(C64Chips newChips) { chips = newChips; - vicBankPortRead = newVicBankPortRead; pinExRom = true; pinGame = true; } @@ -408,6 +407,7 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS break; case PLABank.Cia1: chips.cia1.Poke(addr, val); + UpdateVicBank(); break; case PLABank.ColorRam: chips.colorRam.Poke(addr, val); @@ -500,21 +500,22 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS } else { + addr |= vicBank; if ((addr & 0x7000) == 0x1000) - { return chips.charRom.Read(addr); - } else - { - uint bank = (vicBankPortRead() & (uint)0x3); - switch (bank) - { - case 0: addr |= 0xC000; break; - case 1: addr |= 0x8000; break; - case 2: addr |= 0x4000; break; - } return chips.ram.Read(addr); - } + } + } + + private void UpdateVicBank() + { + switch (chips.cia1.ReadPort0() & 0x3) + { + case 0: vicBank = 0xC000; break; + case 1: vicBank = 0x8000; break; + case 2: vicBank = 0x4000; break; + case 3: vicBank = 0x0000; break; } } @@ -539,6 +540,7 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS break; case PLABank.Cia1: chips.cia1.Write(addr, val); + UpdateVicBank(); break; case PLABank.ColorRam: chips.colorRam.Write(addr, val); diff --git a/BizHawk.Emulation/Computers/Commodore64/MOS/Vic.cs b/BizHawk.Emulation/Computers/Commodore64/MOS/Vic.cs index c174c77f1f..bf67710557 100644 --- a/BizHawk.Emulation/Computers/Commodore64/MOS/Vic.cs +++ b/BizHawk.Emulation/Computers/Commodore64/MOS/Vic.cs @@ -1032,7 +1032,6 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS break; case 0x1A: WriteRegister(addr, val); - UpdatePins(); break; case 0x1E: case 0x1F: @@ -1153,12 +1152,14 @@ namespace BizHawk.Emulation.Computers.Commodore64.MOS intSpriteDataCollision = ((val & 0x02) != 0); intSpriteCollision = ((val & 0x04) != 0); intLightPen = ((val & 0x08) != 0); + UpdatePins(); break; case 0x1A: enableIntRaster = ((val & 0x01) != 0); enableIntSpriteDataCollision = ((val & 0x02) != 0); enableIntSpriteCollision = ((val & 0x04) != 0); enableIntLightPen = ((val & 0x08) != 0); + UpdatePins(); break; case 0x1B: sprites[0].priority = ((val & 0x01) != 0);