ZXHawk: TapeDevice - replaced embedded end of block pause values with individual PAUSE blocks

This commit is contained in:
Asnivor 2018-06-21 15:08:38 +01:00
parent 84bc77e82e
commit 94436c307c
4 changed files with 111 additions and 9 deletions

View File

@ -115,6 +115,21 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum
buf[offsetIndex + 1] = (byte)(value >> 8); 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 #endregion
} }
} }

View File

@ -44,7 +44,6 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum
#endregion #endregion
#region TAP Format Constants #region TAP Format Constants
/// <summary> /// <summary>
@ -337,7 +336,7 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum
// add block pause // add block pause
int actualPause = PAUSE_MS * 1000; int actualPause = PAUSE_MS * 1000;
dataPeriods.Add(actualPause); //dataPeriods.Add(actualPause);
// default pause for tap files // default pause for tap files
tdb.PauseInMS = 1000; tdb.PauseInMS = 1000;
@ -348,9 +347,40 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum
// add the raw data // add the raw data
tdb.BlockData = blockdata; 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 // add block to the tape
_datacorder.DataBlocks.Add(tdb); _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);
}
} }
} }
} }

View File

@ -322,6 +322,9 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum
// advance the position to the next block // advance the position to the next block
_position += blockLen; _position += blockLen;
// generate PAUSE block
CreatePauseBlock(_datacorder.DataBlocks.Last());
} }
#endregion #endregion
@ -379,6 +382,9 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum
// advance the position to the next block // advance the position to the next block
_position += blockLen; _position += blockLen;
// generate PAUSE block
CreatePauseBlock(_datacorder.DataBlocks.Last());
} }
#endregion #endregion
@ -502,6 +508,9 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum
// advance the position to the next block // advance the position to the next block
_position += blockLen; _position += blockLen;
// generate PAUSE block
CreatePauseBlock(_datacorder.DataBlocks.Last());
} }
#endregion #endregion
@ -595,7 +604,7 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum
// add end of block pause // add end of block pause
if (pauseAfterBlock > 0) if (pauseAfterBlock > 0)
{ {
t.DataPeriods.Add(3500 * pauseAfterBlock); //t.DataPeriods.Add(3500 * pauseAfterBlock);
} }
t.PauseInMS = pauseAfterBlock; t.PauseInMS = pauseAfterBlock;
@ -605,6 +614,9 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum
// add the block // add the block
_datacorder.DataBlocks.Add(t); _datacorder.DataBlocks.Add(t);
// generate PAUSE block
CreatePauseBlock(_datacorder.DataBlocks.Last());
} }
#endregion #endregion
@ -773,8 +785,8 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum
else else
{ {
// this is actually just a pause // this is actually just a pause
pauseDuration = 3500 * pauseDuration; //pauseDuration = 3500 * pauseDuration;
t.DataPeriods.Add(pauseDuration); //t.DataPeriods.Add(pauseDuration);
} }
// add end of block pause // add end of block pause
@ -785,6 +797,10 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum
// advanced position to next block // advanced position to next block
_position += 2; _position += 2;
// generate PAUSE block
CreatePauseBlock(_datacorder.DataBlocks.Last());
} }
#endregion #endregion
@ -1764,8 +1780,9 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum
// add block pause if pause is not 0 // add block pause if pause is not 0
if (pauseAfterBlock != 0) if (pauseAfterBlock != 0)
{ {
int actualPause = pauseAfterBlock * 3500; block.PauseInMS = pauseAfterBlock;
dataPeriods.Add(actualPause); //int actualPause = pauseAfterBlock * 3500;
//dataPeriods.Add(actualPause);
} }
// add to the tapedatablock object // add to the tapedatablock object
@ -1827,6 +1844,44 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum
} }
#endregion #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 public enum DataBlockType

View File

@ -238,8 +238,10 @@ namespace BizHawk.Emulation.Cores.Computers.SinclairSpectrum
PULS, PULS,
DATA, DATA,
BRWS, BRWS,
PAUS PAUS,
// zxhawk proprietry
PAUSE_BLOCK,
} }