From 647f0914ed2cf8f257ab79d6a733eb163c92b3d5 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Wed, 25 Jan 2017 19:17:24 -0500 Subject: [PATCH] NES: Some PPU cleanup --- .../Consoles/Nintendo/NES/PPU.regs.cs | 79 ++++++++----------- .../Consoles/Nintendo/NES/PPU.run.cs | 47 ++++++++--- 2 files changed, 70 insertions(+), 56 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.regs.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.regs.cs index f908f255e6..e689787a21 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.regs.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.regs.cs @@ -58,8 +58,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES // this byte is used to simulate open bus reads and writes // it should be modified by every read and write to a ppu register public byte ppu_open_bus=0; - public bool s_latch_clear; - public bool d_latch_clear; public int double_2007_read; // emulates a hardware bug of back to back 2007 reads public int[] ppu_open_bus_decay_timer = new int[8]; @@ -171,14 +169,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES h = _h; } - public void clear_latches() - { - _fv = _v = _h = _vt = _ht = 0; - fh = 0; - ppu.d_latch_clear = true; - ppu.s_latch_clear = true; - } - public void increment_hsc() { //The first one, the horizontal scroll counter, consists of 6 bits, and is @@ -344,9 +334,14 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES if (!reg_2000.vblank_nmi_gen & ((value & 0x80) != 0) && (Reg2002_vblank_active) && !Reg2002_vblank_clear_pending) { //if we just unleashed the vblank interrupt then activate it now - NMI_PendingInstructions = 2; + //if (ppudead != 1) + NMI_PendingInstructions = 2; + + //NMI_PendingInstructions = 2; } - reg_2000.Value = value; + //reg_2000.Value = value; + //if (ppudead != 1) + reg_2000.Value = value; } @@ -366,11 +361,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES void write_2002(byte value) { } byte read_2002() { - //once we thought we clear latches here, but that caused midframe glitches. - //i think we should only reset the state machine for 2005/2006 - //ppur.clear_latches(); byte ret = peek_2002(); + // reading from $2002 resets the destination for $2005 and $2006 writes vtoggle = false; Reg2002_vblank_active = 0; Reg2002_vblank_active_pending = false; @@ -477,7 +470,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES { if (!vtoggle) { - ppur._ht= value >> 3; + ppur._ht = value >> 3; ppur.fh = value & 7; //nes.LogLine("scroll wrote ht = {0} and fh = {1}", ppur._ht, ppur.fh); } @@ -495,36 +488,32 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES //VRAM address register (write) void write_2006(byte value) { - //if (d_latch_clear) - //{ - if (!vtoggle) - { - ppur._vt &= 0x07; - ppur._vt |= (value & 0x3) << 3; - ppur._h = (value >> 2) & 1; - ppur._v = (value >> 3) & 1; - ppur._fv = (value >> 4) & 3; - //nes.LogLine("addr wrote fv = {0}", ppur._fv); - } - else - { - ppur._vt &= 0x18; - ppur._vt |= (value >> 5); - ppur._ht = value & 31; - ppur.install_latches(); - //nes.LogLine("addr wrote vt = {0}, ht = {1}", ppur._vt, ppur._ht); - d_latch_clear = false; - //normally the address isnt observed by the board till it gets clocked by a read or write. - //but maybe thats just because a ppu read/write shoves it on the address bus - //apparently this shoves it on the address bus, too, or else blargg's mmc3 tests dont pass - //ONLY if the ppu is not rendering - if (ppur.status.sl == 241 || (!reg_2001.show_obj && !reg_2001.show_bg)) - nes.Board.AddressPPU(ppur.get_2007access()); - } + if (!vtoggle) + { + ppur._vt &= 0x07; + ppur._vt |= (value & 0x3) << 3; + ppur._h = (value >> 2) & 1; + ppur._v = (value >> 3) & 1; + ppur._fv = (value >> 4) & 3; + //nes.LogLine("addr wrote fv = {0}", ppur._fv); + } + else + { + ppur._vt &= 0x18; + ppur._vt |= (value >> 5); + ppur._ht = value & 31; + ppur.install_latches(); + //nes.LogLine("addr wrote vt = {0}, ht = {1}", ppur._vt, ppur._ht); + //normally the address isnt observed by the board till it gets clocked by a read or write. + //but maybe thats just because a ppu read/write shoves it on the address bus + //apparently this shoves it on the address bus, too, or else blargg's mmc3 tests dont pass + //ONLY if the ppu is not rendering + if (ppur.status.sl == 241 || (!reg_2001.show_obj && !reg_2001.show_bg)) + nes.Board.AddressPPU(ppur.get_2007access()); + } + + vtoggle ^= true; - vtoggle ^= true; - //} - } byte read_2006() { return ppu_open_bus; } byte peek_2006() { return ppu_open_bus; } diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.run.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.run.cs index c4fd7a9548..197257c343 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.run.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/PPU.run.cs @@ -105,16 +105,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES at &= 0x03; at <<= 2; bgdata.at = at; - - //horizontal scroll clocked at cycle 3 and then - //vertical scroll at 251 runppu(1); - if (reg_2001.PPUON) - { - ppur.increment_hsc(); - if (ppur.status.cycle == 251) - ppur.increment_vs(); - } + break; } case 3: @@ -132,9 +124,20 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES ppu_addr_temp |= 8; bgdata.pt_1 = ppubus_read(ppu_addr_temp, true, true); runppu(1); + + //horizontal scroll clocked at cycle 3 and then + //vertical scroll at 255 + if (reg_2001.PPUON) + { + ppur.increment_hsc(); + if (ppur.status.cycle == 255) + ppur.increment_vs(); + } break; case 7: + runppu(1); + break; } //switch(cycle) } @@ -638,10 +641,32 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES //register before around a full frame, but no games //should write to those regs during that time, it needs //to wait for vblank + /* + if (ppudead < 2) + { + ppur.status.sl = 241; + runppu(1); + Reg2002_vblank_active = true; + runppu(5); + runppu(postNMIlines * kLineTime - 6); + ppur.status.sl = 0; + clear_2002(); + } + if (ppudead==2) + { + */ runppu(241 * kLineTime-7*3); - //runppu(preNMIlines * kLineTime); - --ppudead; + /* + } else + { + runppu(241 * kLineTime); + runppu(preNMIlines * kLineTime); + idleSynch ^= true; + } + */ + + ppudead--; } } }