From 0d515dafdfdf9d090bcc89d638ca8d87c4d0d167 Mon Sep 17 00:00:00 2001 From: goyuken Date: Wed, 31 Oct 2012 14:36:43 +0000 Subject: [PATCH] nes: add ClockCPU() to INESBoard, for boards that count M2 cycles, and changed some mappers to use it. Mappers that need more inspection: Mapper027, SxROM, VRC2_4, VRC6, VRC7 --- .../Consoles/Nintendo/NES/BoardSystem.cs | 3 +++ .../Nintendo/NES/Boards/BANDAI-FCG-1.cs | 5 ++-- .../Nintendo/NES/Boards/Irem_H3001.cs | 10 ++++---- .../Nintendo/NES/Boards/JALECO_SS8806.cs | 12 +++++----- .../Consoles/Nintendo/NES/Boards/Mapper040.cs | 6 ++--- .../Consoles/Nintendo/NES/Boards/Mapper042.cs | 8 +++---- .../Consoles/Nintendo/NES/Boards/Mapper069.cs | 5 ++-- .../Consoles/Nintendo/NES/Boards/Mapper168.cs | 8 +++---- .../Consoles/Nintendo/NES/Boards/Mapper50.cs | 5 ++-- .../Nintendo/NES/Boards/NAMCOT_m19_m210.cs | 14 +++++------ .../Consoles/Nintendo/NES/Boards/Sunsoft3.cs | 5 ++-- .../Consoles/Nintendo/NES/Boards/VRC3.cs | 6 +++-- .../Consoles/Nintendo/NES/Core.cs | 1 + .../Consoles/Nintendo/NES/FDS/FDS.cs | 23 +++++++------------ 14 files changed, 57 insertions(+), 54 deletions(-) diff --git a/BizHawk.Emulation/Consoles/Nintendo/NES/BoardSystem.cs b/BizHawk.Emulation/Consoles/Nintendo/NES/BoardSystem.cs index 74a696cbfa..53022c4778 100644 --- a/BizHawk.Emulation/Consoles/Nintendo/NES/BoardSystem.cs +++ b/BizHawk.Emulation/Consoles/Nintendo/NES/BoardSystem.cs @@ -23,6 +23,8 @@ namespace BizHawk.Emulation.Consoles.Nintendo //gets called once per PPU clock, for boards with complex behaviour which must be monitoring clock (i.e. mmc3 irq counter) void ClockPPU(); + //gets called once per CPU clock; typically for boards with M2 counters + void ClockCPU(); byte ReadPRG(int addr); byte ReadPPU(int addr); byte PeekPPU(int addr); @@ -72,6 +74,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo public abstract bool Configure(NES.EDetectionOrigin origin); public virtual void ClockPPU() { } + public virtual void ClockCPU() { } public CartInfo Cart { get { return NES.cart; } } public NES NES { get; set; } diff --git a/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/BANDAI-FCG-1.cs b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/BANDAI-FCG-1.cs index 63021262d4..57021007e1 100644 --- a/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/BANDAI-FCG-1.cs +++ b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/BANDAI-FCG-1.cs @@ -169,7 +169,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo IRQSignal = irq_asserted; } - void ClockCPU() + public override void ClockCPU() { irq_counter--; if (irq_counter == 0x0000) @@ -179,6 +179,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo } } + /* public override void ClockPPU() { clock_counter++; @@ -187,7 +188,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo ClockCPU(); clock_counter = 0; } - } + }*/ public override byte ReadPRG(int addr) { diff --git a/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Irem_H3001.cs b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Irem_H3001.cs index 0ae3c841a8..82717680df 100644 --- a/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Irem_H3001.cs +++ b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Irem_H3001.cs @@ -67,7 +67,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo return true; } - + /* public override void ClockPPU() { clock_counter++; @@ -76,12 +76,12 @@ namespace BizHawk.Emulation.Consoles.Nintendo ClockCPU(); clock_counter = 0; } - } + }*/ - void ClockCPU() + public override void ClockCPU() { - if(irq_counter==0) return; - if(!irq_counter_enabled) return; + if (irq_counter == 0) return; + if (!irq_counter_enabled) return; irq_counter--; if (irq_counter != 0) return; irq_asserted = true; diff --git a/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/JALECO_SS8806.cs b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/JALECO_SS8806.cs index aff6694de1..b1fcb7bb80 100644 --- a/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/JALECO_SS8806.cs +++ b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/JALECO_SS8806.cs @@ -220,12 +220,12 @@ namespace BizHawk.Emulation.Consoles.Nintendo } - public override void ClockPPU() + public override void ClockCPU() { - ppuclock++; - if (ppuclock == 3) - { - ppuclock = 0; + //ppuclock++; + //if (ppuclock == 3) + //{ + //ppuclock = 0; if (!irqcountpaused) { int newclock = irqclock - 1; @@ -237,7 +237,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo else irqclock = newclock; } - } + //} } /// diff --git a/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Mapper040.cs b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Mapper040.cs index 740582982f..ee2e853714 100644 --- a/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Mapper040.cs +++ b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Mapper040.cs @@ -59,14 +59,14 @@ namespace BizHawk.Emulation.Consoles.Nintendo } } - public override void ClockPPU() + public override void ClockCPU() { if (irqactive) { irqcnt++; - if (irqcnt >= 4096 * 3) + if (irqcnt >= 4096) { - irqcnt = 4096 * 3; + irqcnt = 4096; IRQSignal = true; } } diff --git a/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Mapper042.cs b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Mapper042.cs index 1e684a74d3..f82dcdbad7 100644 --- a/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Mapper042.cs +++ b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Mapper042.cs @@ -79,16 +79,16 @@ namespace BizHawk.Emulation.Consoles.Nintendo return ROM[addr | prg << 13]; } - public override void ClockPPU() + public override void ClockCPU() { if (irqenable) { irqcnt++; - if (irqcnt >= 32768 * 3) - irqcnt -= 32768 * 3; + if (irqcnt >= 32768) + irqcnt -= 32768; - IRQSignal = irqcnt >= 24576 * 3; + IRQSignal = irqcnt >= 24576; } } diff --git a/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Mapper069.cs b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Mapper069.cs index 8430f26534..0ffec31197 100644 --- a/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Mapper069.cs +++ b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Mapper069.cs @@ -178,7 +178,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo IRQSignal = irq_asserted; } - void ClockCPU() + public override void ClockCPU() { if (!irq_countdown) return; irq_counter--; @@ -189,6 +189,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo } } + /* public override void ClockPPU() { clock_counter++; @@ -197,7 +198,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo ClockCPU(); clock_counter = 0; } - } + }*/ public override byte ReadPRG(int addr) { diff --git a/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Mapper168.cs b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Mapper168.cs index b337b423b1..123c67c2ac 100644 --- a/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Mapper168.cs +++ b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Mapper168.cs @@ -15,7 +15,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo { int prg = 0; int chr = 0; - int irqclock = 2048 * 3; + int irqclock = 2048; public override bool Configure(NES.EDetectionOrigin origin) { @@ -95,14 +95,14 @@ namespace BizHawk.Emulation.Consoles.Nintendo ser.Sync("irqclock", ref irqclock); } - public override void ClockPPU() + public override void ClockCPU() { - if (irqclock == 2048 * 3 - 1) + if (irqclock == 2048 - 1) { irqclock++; IRQSignal = true; } - else if (irqclock < 2048 * 3 - 1) + else if (irqclock < 2048 - 1) { irqclock++; } diff --git a/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Mapper50.cs b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Mapper50.cs index 51021e569d..8167dd1198 100644 --- a/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Mapper50.cs +++ b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Mapper50.cs @@ -90,7 +90,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo base.SyncIRQ(irq_ready); } - private void IRQ_Tick() + public override void ClockCPU() { if (irq_enable) { @@ -100,6 +100,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo } } + /* public override void ClockPPU() { ppu_cyclecount++; @@ -109,6 +110,6 @@ namespace BizHawk.Emulation.Consoles.Nintendo IRQ_Tick(); base.ClockPPU(); } - } + }*/ } } diff --git a/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/NAMCOT_m19_m210.cs b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/NAMCOT_m19_m210.cs index f42b5b70be..360992a2ab 100644 --- a/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/NAMCOT_m19_m210.cs +++ b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/NAMCOT_m19_m210.cs @@ -302,21 +302,21 @@ namespace BizHawk.Emulation.Consoles.Nintendo else irq_counter++; } - public override void ClockPPU() + public override void ClockCPU() { if (irq_enabled) { - irq_cycles--; - if (irq_cycles == 0) - { - irq_cycles += 3; + //irq_cycles--; + //if (irq_cycles == 0) + //{ + //irq_cycles += 3; ClockIRQ(); - } + //} } if (audio != null) { audio_cycles++; - if (audio_cycles == 15 * 3) + if (audio_cycles == 15) { audio_cycles = 0; audio.Clock(); diff --git a/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Sunsoft3.cs b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Sunsoft3.cs index 199968c353..b4c4cbee23 100644 --- a/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Sunsoft3.cs +++ b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Sunsoft3.cs @@ -113,7 +113,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo } - void ClockCPU() + public override void ClockCPU() { if (!irq_enable) return; if (irq_counter == 0) @@ -143,6 +143,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo else return base.ReadPPU(addr); } + /* public override void ClockPPU() { clock_counter++; @@ -151,6 +152,6 @@ namespace BizHawk.Emulation.Consoles.Nintendo clock_counter = 0; ClockCPU(); } - } + }*/ } } diff --git a/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/VRC3.cs b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/VRC3.cs index 738e3c0f74..13dd10a6f7 100644 --- a/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/VRC3.cs +++ b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/VRC3.cs @@ -135,8 +135,9 @@ namespace BizHawk.Emulation.Consoles.Nintendo } } - void ClockIRQ() + public override void ClockCPU() { + if (!irq_enabled) return; if (irq_mode) { //8 bit mode @@ -170,6 +171,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo } } + /* public override void ClockPPU() { if (!irq_enabled) return; @@ -180,7 +182,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo irq_cycles += 3; ClockIRQ(); } - } + }*/ } } \ No newline at end of file diff --git a/BizHawk.Emulation/Consoles/Nintendo/NES/Core.cs b/BizHawk.Emulation/Consoles/Nintendo/NES/Core.cs index d722e65cd6..4ad6f48924 100644 --- a/BizHawk.Emulation/Consoles/Nintendo/NES/Core.cs +++ b/BizHawk.Emulation/Consoles/Nintendo/NES/Core.cs @@ -222,6 +222,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo } apu.RunOne(); + board.ClockCPU(); ppu.PostCpuInstructionOne(); } } diff --git a/BizHawk.Emulation/Consoles/Nintendo/NES/FDS/FDS.cs b/BizHawk.Emulation/Consoles/Nintendo/NES/FDS/FDS.cs index c66a58d0b6..8b365905b5 100644 --- a/BizHawk.Emulation/Consoles/Nintendo/NES/FDS/FDS.cs +++ b/BizHawk.Emulation/Consoles/Nintendo/NES/FDS/FDS.cs @@ -25,8 +25,6 @@ namespace BizHawk.Emulation.Consoles.Nintendo #region state RamAdapter diskdrive; FDSAudio audio; - /// 0-2, how many ppu cycles since audio was last triggered - int audioclock; /// currently loaded side of the .FDS image, 0 based int? currentside = null; /// collection of diffs (as provided by the RamAdapter) for each side in the .FDS image @@ -60,7 +58,6 @@ namespace BizHawk.Emulation.Consoles.Nintendo ser.BeginSection("audio"); audio.SyncState(ser); ser.EndSection(); - ser.Sync("audioclock", ref audioclock); { // silly little hack int tmp = currentside != null ? (int)currentside : 1234567; @@ -216,9 +213,6 @@ namespace BizHawk.Emulation.Consoles.Nintendo bool timerirq { get { return _timerirq; } set { _timerirq = value; SetIRQ(); } } - - - public override void WriteEXP(int addr, byte value) { //if (addr == 0x0025) @@ -244,7 +238,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo break; case 0x0022: timerreg = (byte)(value & 3); - timervalue = timerlatch * 3; + timervalue = timerlatch; break; case 0x0023: diskenable = (value & 1) != 0; @@ -314,7 +308,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo return ret; } - public override void ClockPPU() + public override void ClockCPU() { if ((timerreg & 2) != 0 && timervalue > 0) { @@ -323,7 +317,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo { if ((timerreg & 1) != 0) { - timervalue = timerlatch * 3; + timervalue = timerlatch; } else { @@ -334,14 +328,13 @@ namespace BizHawk.Emulation.Consoles.Nintendo timerirq = true; } } + audio.Clock(); + } + + public override void ClockPPU() + { diskdrive.Clock(); diskirq = diskdrive.irq; - audioclock++; - if (audioclock == 3) - { - audioclock = 0; - audio.Clock(); - } } public override byte ReadWRAM(int addr)