ZXHawk: TapeDevice - replaced embedded end of block pause values with individual PAUSE blocks
This commit is contained in:
parent
84bc77e82e
commit
94436c307c
|
@ -115,6 +115,21 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum
|
|||
buf[offsetIndex + 1] = (byte)(value >> 8);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Takes a PauseInMilliseconds value and returns the value in T-States
|
||||
/// </summary>
|
||||
/// <param name="pauseInMS"></param>
|
||||
/// <returns></returns>
|
||||
public static int TranslatePause(int pauseInMS)
|
||||
{
|
||||
// t-states per millisecond
|
||||
var tspms = (69888 * 50) / 1000;
|
||||
// get value
|
||||
int res = pauseInMS * tspms;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
|
|
@ -44,7 +44,6 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum
|
|||
|
||||
#endregion
|
||||
|
||||
|
||||
#region TAP Format Constants
|
||||
|
||||
/// <summary>
|
||||
|
@ -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<int>();
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
||||
/// <summary>
|
||||
/// If neccessary a seperate PAUSE block will be created
|
||||
/// </summary>
|
||||
/// <param name="original"></param>
|
||||
private void CreatePauseBlock(TapeDataBlock original)
|
||||
{
|
||||
if (original.PauseInMS > 0)
|
||||
{
|
||||
TapeDataBlock pBlock = new TapeDataBlock();
|
||||
pBlock.DataPeriods = new List<int>();
|
||||
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
|
||||
|
|
|
@ -238,8 +238,10 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum
|
|||
PULS,
|
||||
DATA,
|
||||
BRWS,
|
||||
PAUS
|
||||
PAUS,
|
||||
|
||||
// zxhawk proprietry
|
||||
PAUSE_BLOCK,
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue