From 8efcf00286b8e6af39ddcb0676a8d15fa20dbfff Mon Sep 17 00:00:00 2001 From: Marc Parsons Date: Fri, 1 May 2026 13:31:56 +0100 Subject: [PATCH] TZX support fully supported added batman.tzx --- Core/Io/TapManager.cs | 176 +++++++++++++++++------- Core/Io/TzxBlocks.cs | 31 +++++ Core/Io/TzxParser.cs | 45 ++++++ Desktop/Desktop.csproj | 12 ++ Desktop/ROMS/TZX/Batman - Release 1.tzx | Bin 0 -> 49967 bytes 5 files changed, 214 insertions(+), 50 deletions(-) create mode 100644 Desktop/ROMS/TZX/Batman - Release 1.tzx diff --git a/Core/Io/TapManager.cs b/Core/Io/TapManager.cs index 87d6ac0..46915b2 100644 --- a/Core/Io/TapManager.cs +++ b/Core/Io/TapManager.cs @@ -1,13 +1,22 @@ using System; using System.Collections.Generic; -using Core.Io; +//using Core.Io; namespace Core.Io { public class TapManager { - private Queue _blocks = new Queue(); - private byte[] _currentBlock; + private Queue _playQueue = new Queue(); + private TzxBlock _currentBlock; // Now holds a TzxBlock instead of byte[] + + // Dynamic Timings for the current block + private int _pilotLength; + private int _sync1Length; + private int _sync2Length; + private int _zeroLength; + private int _oneLength; + private int _pauseTStates; + //private byte[] _currentBlock; private List _tzxBlocks = new List(); // State Machine Tracking @@ -24,7 +33,7 @@ namespace Core.Io public void LoadTapData(byte[] fileData) { - _blocks.Clear(); + _playQueue.Clear(); int position = 0; while (position < fileData.Length) @@ -36,13 +45,25 @@ namespace Core.Io Array.Copy(fileData, position, blockData, 0, blockLength); position += blockLength; - _blocks.Enqueue(blockData); + // Wrap the raw TAP data into our new TZX Standard Block! + _playQueue.Enqueue(new StandardSpeedBlock + { + DataLength = (ushort)blockLength, + Data = blockData, + PauseAfterMs = 1000 // Standard TAP blocks have a ~1 second pause + }); } } + public void LoadTzxData(List blocks) + { + _playQueue.Clear(); + foreach (var block in blocks) _playQueue.Enqueue(block); + } + public void Play() { - if (_blocks.Count > 0 && _state == TapeState.Idle) + if (_playQueue.Count > 0 && _state == TapeState.Idle) { LoadNextBlock(); } @@ -55,24 +76,54 @@ namespace Core.Io private void LoadNextBlock() { - if (_blocks.Count == 0) + if (_playQueue.Count == 0) { _state = TapeState.Idle; return; } - _currentBlock = _blocks.Dequeue(); + _currentBlock = _playQueue.Dequeue(); + + // If it's metadata (like our ArchiveInfoBlock), just skip it and load the next audio block + if (_currentBlock.BlockId == 0x32) + { + LoadNextBlock(); + return; + } + _byteIndex = 0; - _bitIndex = 7; // MSB first + _bitIndex = 7; _pulseCountForCurrentBit = 0; - - // Header blocks (flag 0x00) have longer pilot tones than Data blocks - bool isHeader = _currentBlock.Length > 0 && _currentBlock[0] == 0; - _pilotPulsesRemaining = isHeader ? 8063 : 3223; - - _state = TapeState.Pilot; - _pulseTimer = 2168; // Length of a pilot pulse EarBit = false; + _state = TapeState.Pilot; + + // --- CONFIGURE TIMINGS BASED ON BLOCK TYPE --- + if (_currentBlock is StandardSpeedBlock stdBlock) + { + bool isHeader = stdBlock.Data.Length > 0 && stdBlock.Data[0] == 0; + _pilotPulsesRemaining = isHeader ? 8063 : 3223; + + _pilotLength = 2168; + _sync1Length = 667; + _sync2Length = 735; + _zeroLength = 855; + _oneLength = 1710; + _pauseTStates = stdBlock.PauseAfterMs * 3500; // 3.5 MHz = 3500 T-States per millisecond + } + else if (_currentBlock is TurboSpeedBlock turboBlock) + { + _pilotPulsesRemaining = turboBlock.PilotToneLength; + + _pilotLength = turboBlock.PilotPulseLength; + _sync1Length = turboBlock.SyncFirstPulseLength; + _sync2Length = turboBlock.SyncSecondPulseLength; + _zeroLength = turboBlock.ZeroBitPulseLength; + _oneLength = turboBlock.OneBitPulseLength; + _pauseTStates = turboBlock.PauseAfterMs * 3500; + } + + // Start the very first pilot pulse! + _pulseTimer = _pilotLength; } // --- THE ENGINE SYNC --- @@ -98,18 +149,18 @@ namespace Core.Io _pilotPulsesRemaining--; if (_pilotPulsesRemaining > 0) { - _pulseTimer += 2168; + _pulseTimer += _pilotLength; } else { _state = TapeState.Sync1; - _pulseTimer += 667; + _pulseTimer += _sync1Length; } break; case TapeState.Sync1: _state = TapeState.Sync2; - _pulseTimer += 735; + _pulseTimer += _sync2Length; break; case TapeState.Sync2: @@ -136,32 +187,22 @@ namespace Core.Io _bitIndex = 7; _byteIndex++; - if (_byteIndex >= _currentBlock.Length) + // --- THE FIX --- + // Extract the raw byte array from the generic TzxBlock + byte[] dataArray = ExtractDataFromBlock(_currentBlock); + + // Now we can safely check the length! + if (_byteIndex >= dataArray.Length) { - // Block finished! 1 second pause before the next block + // Block finished! Enter the Pause state and wait for the dynamic delay _state = TapeState.Pause; - _pulseTimer += 3500000; + _pulseTimer += _pauseTStates; return; } } CalculateNextDataPulse(); } break; - //case TapeState.Pause: - // // The .TAP Format Auto-Stop Heuristic: - // if (_currentBlock != null && _currentBlock.Length > 0 && _currentBlock[0] == 0x00) - // { - // // 1. It was a Header block. The ROM is waiting for the Data right now! Keep spinning. - // LoadNextBlock(); - // } - // else - // { - // // 2. It was a Data block (or custom). The "file" is done. - // // Auto-Stop the tape deck so we don't accidentally play the next level into the void. - // _state = TapeState.Idle; - // _currentBlock = null; - // } - // break; case TapeState.Pause: _state = TapeState.Idle; LoadNextBlock(); @@ -171,11 +212,15 @@ namespace Core.Io private void CalculateNextDataPulse() { - // Extract the current bit from the current byte - bool isBitOne = (_currentBlock[_byteIndex] & (1 << _bitIndex)) != 0; + // We need to pull the Data array from the base TzxBlock + byte[] dataArray = Array.Empty(); + if (_currentBlock is StandardSpeedBlock std) dataArray = std.Data; + else if (_currentBlock is TurboSpeedBlock turbo) dataArray = turbo.Data; - // Bit 0 = 855 T-States, Bit 1 = 1710 T-States - _pulseTimer += isBitOne ? 1710 : 855; + bool isBitOne = (dataArray[_byteIndex] & (1 << _bitIndex)) != 0; + + // Use the dynamic zero/one lengths! + _pulseTimer += isBitOne ? _oneLength : _zeroLength; } // --- FAST LOAD METHODS (For ROM Hijack) --- @@ -188,31 +233,62 @@ namespace Core.Io // Change this line: //public bool HasBlocks => _blocks.Count > 0 || _currentBlock != null; // Only consider _currentBlock valid if we are actively playing it! - public bool HasBlocks => _blocks.Count > 0 || (_currentBlock != null && _state != TapeState.Idle && _state != TapeState.Pause); + public bool HasBlocks => _playQueue.Count > 0 || (_currentBlock != null && _state != TapeState.Idle && _state != TapeState.Pause); + + // Helper to grab the raw bytes out of whatever TZX block is currently loaded + private byte[] ExtractDataFromBlock(TzxBlock block) + { + if (block is StandardSpeedBlock std) return std.Data; + if (block is TurboSpeedBlock turbo) return turbo.Data; + + // If it's metadata or a block type without data, return an empty array + return Array.Empty(); + } public byte[] GetNextBlock() { // Yank the current block ONLY if it is actively playing if (_currentBlock != null && _state != TapeState.Idle && _state != TapeState.Pause) { - byte[] blockToReturn = _currentBlock; + byte[] blockToReturn = ExtractDataFromBlock(_currentBlock); + _state = TapeState.Idle; // Ensure the tape deck is stopped _currentBlock = null; + return blockToReturn; } // Otherwise, pull directly from the unplayed queue _state = TapeState.Idle; // Stop the tape deck just in case _currentBlock = null; - return _blocks.Count > 0 ? _blocks.Dequeue() : null; + + // Dequeue the next TzxBlock and extract its bytes + if (_playQueue.Count > 0) + { + TzxBlock nextBlock = _playQueue.Dequeue(); + return ExtractDataFromBlock(nextBlock); + } + + return null; } - public void LoadTzxData(List blocks) - { - _tzxBlocks = blocks; + //public byte[] GetNextBlock() + //{ + // // Yank the current block ONLY if it is actively playing + // if (_currentBlock != null && _state != TapeState.Idle && _state != TapeState.Pause) + // { + // byte[] blockToReturn = _currentBlock; + // _state = TapeState.Idle; // Ensure the tape deck is stopped + // _currentBlock = null; + // return blockToReturn; + // } + + // // Otherwise, pull directly from the unplayed queue + // _state = TapeState.Idle; // Stop the tape deck just in case + // _currentBlock = null; + // return _playQueue.Count > 0 ? _blocks.Dequeue() : null; + //} + - // Just to prove it works before we build the State Machine! - System.Diagnostics.Debug.WriteLine($"Successfully loaded {_tzxBlocks.Count} TZX blocks!"); - } } } \ No newline at end of file diff --git a/Core/Io/TzxBlocks.cs b/Core/Io/TzxBlocks.cs index 1fc212c..521d051 100644 --- a/Core/Io/TzxBlocks.cs +++ b/Core/Io/TzxBlocks.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; namespace Core.Io { @@ -21,4 +22,34 @@ namespace Core.Io // The actual tape bytes public byte[] Data { get; set; } = Array.Empty(); } + + // ID 0x32: Archive Info Block (Metadata) + public class ArchiveInfoBlock : TzxBlock + { + public override int BlockId => 0x32; + + // Key: Text ID (e.g., 0 = Full Title, 1 = Software House, 2 = Publisher, 4 = Year) + // Value: The actual text string + public Dictionary Metadata { get; set; } = new Dictionary(); + } + + // ID 0x11: Turbo Speed Data Block + public class TurboSpeedBlock : TzxBlock + { + public override int BlockId => 0x11; + + public ushort PilotPulseLength { get; set; } + public ushort SyncFirstPulseLength { get; set; } + public ushort SyncSecondPulseLength { get; set; } + public ushort ZeroBitPulseLength { get; set; } + public ushort OneBitPulseLength { get; set; } + public ushort PilotToneLength { get; set; } + public byte UsedBitsInLastByte { get; set; } + public ushort PauseAfterMs { get; set; } + + // This is a 24-bit integer in the file, so we store it in a standard 32-bit int + public int DataLength { get; set; } + + public byte[] Data { get; set; } = Array.Empty(); + } } \ No newline at end of file diff --git a/Core/Io/TzxParser.cs b/Core/Io/TzxParser.cs index 659f06f..81fe51e 100644 --- a/Core/Io/TzxParser.cs +++ b/Core/Io/TzxParser.cs @@ -41,6 +41,51 @@ namespace Core.Io stdBlock.Data = br.ReadBytes(stdBlock.DataLength); blocks.Add(stdBlock); break; + case 0x11: // Turbo Speed Data Block + var turboBlock = new TurboSpeedBlock + { + PilotPulseLength = br.ReadUInt16(), + SyncFirstPulseLength = br.ReadUInt16(), + SyncSecondPulseLength = br.ReadUInt16(), + ZeroBitPulseLength = br.ReadUInt16(), + OneBitPulseLength = br.ReadUInt16(), + PilotToneLength = br.ReadUInt16(), + UsedBitsInLastByte = br.ReadByte(), + PauseAfterMs = br.ReadUInt16() + }; + + // Z80 files are Little-Endian. Read 3 bytes and combine them into a 24-bit integer. + byte len0 = br.ReadByte(); + byte len1 = br.ReadByte(); + byte len2 = br.ReadByte(); + turboBlock.DataLength = len0 | (len1 << 8) | (len2 << 16); + + // Read the actual tape data + turboBlock.Data = br.ReadBytes(turboBlock.DataLength); + + blocks.Add(turboBlock); + break; + case 0x32: // Archive Info Block + var archiveBlock = new ArchiveInfoBlock(); + + // The total length of the block (we read it to advance the stream, + // but the string count is what we actually use to loop) + ushort totalLength = br.ReadUInt16(); + byte stringCount = br.ReadByte(); + + for (int i = 0; i < stringCount; i++) + { + byte textId = br.ReadByte(); + byte textLength = br.ReadByte(); + + // Read the raw bytes and convert them to an ASCII string + string text = System.Text.Encoding.ASCII.GetString(br.ReadBytes(textLength)); + + archiveBlock.Metadata[textId] = text; + } + + blocks.Add(archiveBlock); + break; // TODO: Add cases for 0x11 (Turbo), 0x12 (Tone), 0x13 (Pulses), etc. diff --git a/Desktop/Desktop.csproj b/Desktop/Desktop.csproj index 08e6b8a..e7e7761 100644 --- a/Desktop/Desktop.csproj +++ b/Desktop/Desktop.csproj @@ -25,6 +25,9 @@ + + + @@ -76,6 +79,15 @@ Always + + Always + + + Always + + + Always + diff --git a/Desktop/ROMS/TZX/Batman - Release 1.tzx b/Desktop/ROMS/TZX/Batman - Release 1.tzx new file mode 100644 index 0000000000000000000000000000000000000000..c90584f6d977e90cdbd3d90b51ceca4fbbc8c2b3 GIT binary patch literal 49967 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

=LzXOF?^5nL2z6_4SrcS=YZB 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

3bN@u-p4| z{i6}fj9xxYdCV`L0Q2q#F(>u|r zfp?V7z&orEScDr>_cHvMZFy;vf8M?F)7vxmPpSU&=S)w0yoGGoK*;SWxQ!(9Y5s!S zK*0}R`P1fB>C}32x@H(IkDKVu-Zq-F9yQPK{ivC%%D25e@rP0KiXunN+`nMk+q346 zns<4=WbZR;{)m9fxG-gZ3c!8Ty-`#8lo^34sq83kE5o$iaAQ3r1|k{?MNn3hV0@VJ z8e}Ivh>8p)Hy>>IWr&IouqSZ@Rpo;>k>Y=B<3A6b83AIk{&gj8cmp|7SL82m{*k|M zqPK0&&j%*rE-#yS-01t+L7VU4zP6^{eRrr0914KBtk90em$iFk*6Gbl&Q}!|m(d-Rq^e9R zJL0iCE7#XzmLKH-$O|Y>puFKMKvFJB z0$AF?Lje+#c;;+|$VEEz8b|5bq@_hkXWQmz^v!IX=xg#)yL^tweYonust2_9BI()^ z6jbYVogG`YC(_p}2cTyR!1rx|?Gi62Uf+<@b6dP(WSb3RCd5xj|L2Bvy@$njE)V

zW)dy48z3J z2c&eu6ZDyvhP2cue@grlF~Du!;7{>4dMWy;QGGwmBL%iI3eE&W!vxus9FXH&EhCuf z+Xs~52y4V{5XvvVZ{Il)hYVl978Do1q%#7i0b{eECjfg%ro~RoXWd> zYD=!@lkaOHBkpEIa$?4NX?aId)2z`8I~=!xM^sY% zqj`Md1|j>p5!@zfsO6cG6S(y5TY!J20>+2BA-)4n<-J3-C0BEk@3+g1xZ5t56WgV- zLUbz2M=xZBYX{Qu?wzP8yito&1McMe266y5pVP2u9BzY`KBbtcf$b@@;Q^A7(ldDA zl6YuSh>zHP&!_-4=`{EhMu2bBesr1#>}#_S|4G2?zX?pG5%~$~n-~PuXq7bnJ*h~e zsz#e=!A9OdXjhnaS47lai5z(aYjHtSixVPH??-`V9&t6DMcfgSN!|Wiq^|O9;<+D3 zJh$wqF{rmu$Dy{PenLGNHwrNLXu-6hY{X*HHEsbcVFE)6QQp=HjJt%FCtWjgt9}-^ zlJ8M}hO0E*6Xb8z@!S%eGrx*!b*_r2d1-w!9@+E<^*CzGW4bn(&a~o+jrz2ecz`Xz z{&oqjK*9eKdnJ1iKB~>NgqyDU<`r3OXm2cJAtCqMeRaa|C)l~=TOj3QtLOe8$ zUp$V1+VJ!moN(iKrrrYdY_k+b^~aTiDE_H1>;Z~U;4unx^Y;t&8O-k$RzN-@NHAWhs8Gz%Pl%t9k}@NH0{WuLeEh!W(s4=M zuDo{k_;DI9{fx#%J){(%x>B%!KF^qe4)LZainrMtuG;GzU(=5;G8)t+&;8^0gt1C* zC7