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);
}
/// <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
}
}

View File

@ -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);
}
}
}
}

View File

@ -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

View File

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