diff --git a/skoolkit/loadtracer.py b/skoolkit/loadtracer.py index 993f1fbd..4bb784f8 100644 --- a/skoolkit/loadtracer.py +++ b/skoolkit/loadtracer.py @@ -136,6 +136,14 @@ def get_edges(blocks, first_edge, polarity, analyse=False): indexes.append((len(edges) - 1, len(edges) - 1)) data_blocks.append(()) + # Tail pulse + if timings.tail: + if analyse: + ear = (len(edges) - 1) % 2 + print(f'{tstates:>10} {ear:>3} Tail pulse ({timings.tail} T-states)') + tstates += timings.tail + edges.append(tstates) + # Pause if i + 1 < len(blocks) and timings.pause: if analyse: diff --git a/skoolkit/tape.py b/skoolkit/tape.py index a4e9daf1..f6586f9e 100644 --- a/skoolkit/tape.py +++ b/skoolkit/tape.py @@ -238,7 +238,7 @@ def __init__(self, number, tape_data, timings=None, block_id=None, name=None, in self.block_data = block_data class TapeBlockTimings: - def __init__(self, pilot_len=0, pilot=0, sync=(), zero=0, one=0, pause=0, used_bits=8, pulses=(), data=False, error=None): + def __init__(self, pilot_len=0, pilot=0, sync=(), zero=0, one=0, pause=0, used_bits=8, pulses=(), data=False, tail=0, error=None): self.pilot_len = pilot_len self.pilot = pilot self.sync = sync @@ -248,6 +248,7 @@ def __init__(self, pilot_len=0, pilot=0, sync=(), zero=0, one=0, pause=0, used_b self.used_bits = used_bits self.pulses = pulses self.data = data + self.tail = tail self.error = error def _get_tape_block_timings(first_byte, pause=3500000): @@ -354,7 +355,7 @@ def _get_pzx_block(data, i, block_num, prev_rom_pilot): '1-bit pulse sequence: {} (T-states)'.format(', '.join(str(p) for p in s1)), f'Tail pulse: {tail} T-states' )) - timings = TapeBlockTimings(zero=s0[0], one=s1[0], used_bits=used_bits) + timings = TapeBlockTimings(zero=s0[0], one=s1[0], used_bits=used_bits, tail=tail) elif block_id == 'PAUS': name = 'Pause' duration = get_dword(data, i + 8) diff --git a/tests/slow_test_sim_load.py b/tests/slow_test_sim_load.py index b036a4cb..befd7b6d 100644 --- a/tests/slow_test_sim_load.py +++ b/tests/slow_test_sim_load.py @@ -275,7 +275,7 @@ def test_turbo_loader_pzx(self): pzx.add_puls(1) pzx.add_data(create_data_block(code)) pzx.add_puls(1) - pzx.add_data(create_data_block(code2), (600, 600), (1200, 1200)) + pzx.add_data(create_data_block(code2), (600, 600), (1200, 1200), tail=0) pzxfile = self.write_bin_file(pzx.data, suffix='.pzx') exp_data = ( diff --git a/tests/test_tap2sna.py b/tests/test_tap2sna.py index 12552651..94134eff 100644 --- a/tests/test_tap2sna.py +++ b/tests/test_tap2sna.py @@ -629,9 +629,9 @@ def test_option_tape_analysis_with_pzx_file(self): pzx.add_data((6, 7, 8, 9, 10)) pzx.add_paus() pzx.add_puls(pulse_counts=((5000, 2168), (1, 430), (1, 870))) - pzx.add_data((11, 12, 13, 14, 15), (570, 570), (1050, 1050), used_bits=5) + pzx.add_data((11, 12, 13, 14, 15), (570, 570), (1050, 1050), tail=0, used_bits=5) pzx.add_puls(pulse_counts=((2000, 1234), (2, 500), (1, 1000))) - pzx.add_data((16, 17, 18), (570, 600), (1050, 1100)) + pzx.add_data((16, 17, 18), (570, 600), (1050, 1100), tail=0) pzxfile = self.write_bin_file(pzx.data, suffix='.pzx') output, error = self.run_tap2sna(f'--tape-analysis {pzxfile}', catch_exit=0) self.assertEqual(error, '') @@ -641,20 +641,22 @@ def test_option_tape_analysis_with_pzx_file(self): 17480584 1 Pulse (667 T-states) 17481251 0 Pulse (735 T-states) 17481986 1 Data (5 bytes; 855/1710 T-states) - 17562356 1 Pause (3500000 T-states) - 21062356 1 Tone (3223 x 2168 T-states) - 28049820 0 Pulse (667 T-states) - 28050487 1 Pulse (735 T-states) - 28051222 0 Data (5 bytes; 855/1710 T-states) - 28136722 0 Pause (3500000 T-states) - 31636722 0 Tone (5000 x 2168 T-states) - 42476722 0 Pulse (430 T-states) - 42477152 1 Pulse (870 T-states) - 42478022 0 Data (4 bytes + 5 bits; 570/1050 T-states) - 42531722 0 Tone (2000 x 1234 T-states) - 44999722 0 Tone (2 x 500 T-states) - 45000722 0 Pulse (1000 T-states) - 45001722 1 Data (3 bytes; 570/1050 T-states) + 17562356 1 Tail pulse (945 T-states) + 17563301 0 Pause (3500000 T-states) + 21063301 0 Tone (3223 x 2168 T-states) + 28050765 1 Pulse (667 T-states) + 28051432 0 Pulse (735 T-states) + 28052167 1 Data (5 bytes; 855/1710 T-states) + 28137667 1 Tail pulse (945 T-states) + 28138612 0 Pause (3500000 T-states) + 31638612 0 Tone (5000 x 2168 T-states) + 42478612 0 Pulse (430 T-states) + 42479042 1 Pulse (870 T-states) + 42479912 0 Data (4 bytes + 5 bits; 570/1050 T-states) + 42533612 0 Tone (2000 x 1234 T-states) + 45001612 0 Tone (2 x 500 T-states) + 45002612 0 Pulse (1000 T-states) + 45003612 1 Data (3 bytes; 570/1050 T-states) """ self.assertEqual(dedent(exp_output).lstrip(), output)