diff --git a/BizHawk.Emulation.Cores/Computers/SinclairSpectrum/Media/MediaConverter.cs b/BizHawk.Emulation.Cores/Computers/SinclairSpectrum/Media/MediaConverter.cs index 6f9dc4c130..631095ccd7 100644 --- a/BizHawk.Emulation.Cores/Computers/SinclairSpectrum/Media/MediaConverter.cs +++ b/BizHawk.Emulation.Cores/Computers/SinclairSpectrum/Media/MediaConverter.cs @@ -115,6 +115,21 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum buf[offsetIndex + 1] = (byte)(value >> 8); } + /// + /// Takes a PauseInMilliseconds value and returns the value in T-States + /// + /// + /// + public static int TranslatePause(int pauseInMS) + { + // t-states per millisecond + var tspms = (69888 * 50) / 1000; + // get value + int res = pauseInMS * tspms; + + return res; + } + #endregion } } diff --git a/BizHawk.Emulation.Cores/Computers/SinclairSpectrum/Media/Tape/TAP/TapConverter.cs b/BizHawk.Emulation.Cores/Computers/SinclairSpectrum/Media/Tape/TAP/TapConverter.cs index 945585cc71..97e1b448cf 100644 --- a/BizHawk.Emulation.Cores/Computers/SinclairSpectrum/Media/Tape/TAP/TapConverter.cs +++ b/BizHawk.Emulation.Cores/Computers/SinclairSpectrum/Media/Tape/TAP/TapConverter.cs @@ -44,7 +44,6 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum #endregion - #region TAP Format Constants /// @@ -337,7 +336,7 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum // add block pause int actualPause = PAUSE_MS * 1000; - dataPeriods.Add(actualPause); + //dataPeriods.Add(actualPause); // default pause for tap files tdb.PauseInMS = 1000; @@ -348,9 +347,40 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum // add the raw data tdb.BlockData = blockdata; + // generate separate PAUS block + TapeDataBlock tdbPause = new TapeDataBlock(); + tdbPause.DataPeriods = new List(); + tdbPause.BlockDescription = BlockType.PAUSE_BLOCK; + tdbPause.PauseInMS = 0; + var pauseInTStates = TranslatePause(tdb.PauseInMS); + //if (pauseInTStates > 0) + //tdbPause.DataPeriods.Add(pauseInTStates); + tdb.PauseInMS = 0; + // add block to the tape _datacorder.DataBlocks.Add(tdb); - + + // PAUS block if neccessary + if (pauseInTStates > 0) + { + tdbPause.AddMetaData(BlockDescriptorTitle.Block_ID, pauseInTStates.ToString() + " cycles"); + + int by1000 = pauseInTStates / 70000; + int rem1000 = pauseInTStates % 70000; + + if (by1000 > 1) + { + tdbPause.DataPeriods.Add(35000); + tdbPause.DataPeriods.Add(pauseInTStates - 35000); + } + else + { + tdbPause.DataPeriods.Add(pauseInTStates); + tdbPause.DataPeriods.Add(0); + } + + _datacorder.DataBlocks.Add(tdbPause); + } } } } diff --git a/BizHawk.Emulation.Cores/Computers/SinclairSpectrum/Media/Tape/TZX/TzxConverter.cs b/BizHawk.Emulation.Cores/Computers/SinclairSpectrum/Media/Tape/TZX/TzxConverter.cs index 891914b324..320f2593ad 100644 --- a/BizHawk.Emulation.Cores/Computers/SinclairSpectrum/Media/Tape/TZX/TzxConverter.cs +++ b/BizHawk.Emulation.Cores/Computers/SinclairSpectrum/Media/Tape/TZX/TzxConverter.cs @@ -322,6 +322,9 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum // advance the position to the next block _position += blockLen; + + // generate PAUSE block + CreatePauseBlock(_datacorder.DataBlocks.Last()); } #endregion @@ -379,6 +382,9 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum // advance the position to the next block _position += blockLen; + + // generate PAUSE block + CreatePauseBlock(_datacorder.DataBlocks.Last()); } #endregion @@ -502,6 +508,9 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum // advance the position to the next block _position += blockLen; + + // generate PAUSE block + CreatePauseBlock(_datacorder.DataBlocks.Last()); } #endregion @@ -595,7 +604,7 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum // add end of block pause if (pauseAfterBlock > 0) { - t.DataPeriods.Add(3500 * pauseAfterBlock); + //t.DataPeriods.Add(3500 * pauseAfterBlock); } t.PauseInMS = pauseAfterBlock; @@ -605,6 +614,9 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum // add the block _datacorder.DataBlocks.Add(t); + + // generate PAUSE block + CreatePauseBlock(_datacorder.DataBlocks.Last()); } #endregion @@ -773,8 +785,8 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum else { // this is actually just a pause - pauseDuration = 3500 * pauseDuration; - t.DataPeriods.Add(pauseDuration); + //pauseDuration = 3500 * pauseDuration; + //t.DataPeriods.Add(pauseDuration); } // add end of block pause @@ -785,6 +797,10 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum // advanced position to next block _position += 2; + + // generate PAUSE block + CreatePauseBlock(_datacorder.DataBlocks.Last()); + } #endregion @@ -1764,8 +1780,9 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum // add block pause if pause is not 0 if (pauseAfterBlock != 0) { - int actualPause = pauseAfterBlock * 3500; - dataPeriods.Add(actualPause); + block.PauseInMS = pauseAfterBlock; + //int actualPause = pauseAfterBlock * 3500; + //dataPeriods.Add(actualPause); } // add to the tapedatablock object @@ -1827,6 +1844,44 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum } #endregion + + #region Pause Block Creator + + /// + /// If neccessary a seperate PAUSE block will be created + /// + /// + private void CreatePauseBlock(TapeDataBlock original) + { + if (original.PauseInMS > 0) + { + TapeDataBlock pBlock = new TapeDataBlock(); + pBlock.DataPeriods = new List(); + pBlock.BlockDescription = BlockType.PAUSE_BLOCK; + pBlock.PauseInMS = 0; + var pauseInTStates = TranslatePause(original.PauseInMS); + + pBlock.AddMetaData(BlockDescriptorTitle.Block_ID, pauseInTStates.ToString() + " cycles"); + + int by1000 = pauseInTStates / 70000; + int rem1000 = pauseInTStates % 70000; + + if (by1000 > 1) + { + pBlock.DataPeriods.Add(35000); + pBlock.DataPeriods.Add(pauseInTStates - 35000); + } + else + { + pBlock.DataPeriods.Add(pauseInTStates); + pBlock.DataPeriods.Add(0); + } + + _datacorder.DataBlocks.Add(pBlock); + } + } + + #endregion } public enum DataBlockType diff --git a/BizHawk.Emulation.Cores/Computers/SinclairSpectrum/Media/Tape/TapeDataBlock.cs b/BizHawk.Emulation.Cores/Computers/SinclairSpectrum/Media/Tape/TapeDataBlock.cs index c2b595f240..de839971c6 100644 --- a/BizHawk.Emulation.Cores/Computers/SinclairSpectrum/Media/Tape/TapeDataBlock.cs +++ b/BizHawk.Emulation.Cores/Computers/SinclairSpectrum/Media/Tape/TapeDataBlock.cs @@ -238,8 +238,10 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum PULS, DATA, BRWS, - PAUS + PAUS, + // zxhawk proprietry + PAUSE_BLOCK, }