diff --git a/BizHawk.Emulation/Consoles/Nintendo/NES/FDS/FDS.cs b/BizHawk.Emulation/Consoles/Nintendo/NES/FDS/FDS.cs index 2fcd5d9a04..5f7c4a48d9 100644 --- a/BizHawk.Emulation/Consoles/Nintendo/NES/FDS/FDS.cs +++ b/BizHawk.Emulation/Consoles/Nintendo/NES/FDS/FDS.cs @@ -5,6 +5,12 @@ using System.Text; namespace BizHawk.Emulation.Consoles.Nintendo { + /* + * http://sourceforge.net/p/fceultra/code/2696/tree/fceu/src/fds.cpp - only used for timer info + * http://nesdev.com/FDS%20technical%20reference.txt - implementation is mostly a combination of + * http://wiki.nesdev.com/w/index.php/Family_Computer_Disk_System - these two documents + * http://nesdev.com/diskspec.txt - not useless + */ [NES.INESBoardImplCancel] public class FDS : NES.NESBoardBase { @@ -77,7 +83,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo int timerlatch; int timervalue; - bool timeractive; + byte timerreg; byte reg4026; @@ -94,16 +100,13 @@ namespace BizHawk.Emulation.Consoles.Nintendo timerirq = false; break; case 0x0021: - timerlatch &= 0xff00; + timerlatch &= 0x00ff; timerlatch |= value << 8; timerirq = false; break; case 0x0022: - if ((value & 1) != 0) - { - timeractive = true; - timervalue = timerlatch * 3; - } + timerreg = (byte)(value & 3); + timervalue = timerlatch * 3; break; case 0x0023: diskenable = (value & 1) != 0; @@ -171,12 +174,21 @@ namespace BizHawk.Emulation.Consoles.Nintendo public override void ClockPPU() { - if (timeractive) + if ((timerreg & 2) != 0 && timervalue > 0) { timervalue--; if (timervalue == 0) { - timeractive = false; + if ((timerreg & 1) != 0) + { + timervalue = timerlatch * 3; + } + else + { + timerreg &= unchecked((byte)~2); + timervalue = 0; + timerlatch = 0; + } timerirq = true; } } diff --git a/BizHawk.Emulation/Consoles/Nintendo/NES/FDS/RamAdapter.cs b/BizHawk.Emulation/Consoles/Nintendo/NES/FDS/RamAdapter.cs index b6f0f00a55..6fd1a95f5c 100644 --- a/BizHawk.Emulation/Consoles/Nintendo/NES/FDS/RamAdapter.cs +++ b/BizHawk.Emulation/Consoles/Nintendo/NES/FDS/RamAdapter.cs @@ -25,6 +25,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo { // the current circulating .fds dumps are horribly broken. here we attempt to fix them up as best as possible. // todo: implement CRC. since the RamAdapter itself doesn't implement it, broken is not a problem + // since its not contained in dumps, no way to be sure that the implementation is right MemoryStream inp = new MemoryStream(inputdisk, false); BinaryReader br = new BinaryReader(inp); @@ -282,7 +283,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo case RamAdapterState.SPINUP: state = RamAdapterState.RUNNING; SetCycles(); - transferreset = false; + //transferreset = false; // this definitely does not happen. //numcrc = 0; Console.WriteLine("FDS: Spin up complete! Disk is running"); break; @@ -302,7 +303,8 @@ namespace BizHawk.Emulation.Consoles.Nintendo byte readreglatch; byte writereglatch; - bool bytetransferflag = false; + bool _bytetransferflag; + bool bytetransferflag { get { return _bytetransferflag; } set { _bytetransferflag = value; } } bool lookingforendofgap = false;