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,
}