From 149cbb327b57ec8125bd40335fab415942c0fffa Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Tue, 6 Sep 2016 06:59:51 -0400 Subject: [PATCH] Made something of a first attempt at a parser. Which is failing terribly. --- StaticAnalyser/Acorn/Tape.cpp | 30 ++++------ StaticAnalyser/Commodore/Tape.cpp | 98 ++++++++++++++++++++++++++++++- 2 files changed, 108 insertions(+), 20 deletions(-) diff --git a/StaticAnalyser/Acorn/Tape.cpp b/StaticAnalyser/Acorn/Tape.cpp index 62adde4ca..eeabfc61b 100644 --- a/StaticAnalyser/Acorn/Tape.cpp +++ b/StaticAnalyser/Acorn/Tape.cpp @@ -89,34 +89,26 @@ class Acorn1200BaudTapeParser: public StaticAnalyer::TapeParser &waves) { - while(waves.size() && waves[0] == WaveType::Unrecognised) - { - remove_waves(1); - return; - } + if(waves.size() < 2) return; - if(waves.size() >= 2 && waves[0] == WaveType::Long && waves[1] == WaveType::Long) + if(waves[0] == WaveType::Long && waves[1] == WaveType::Long) { push_symbol(SymbolType::Zero, 2); return; } - if(waves.size() >= 4) - { - // If this makes a 1, post it. - if( waves[0] == WaveType::Short && - waves[1] == WaveType::Short && - waves[2] == WaveType::Short && - waves[3] == WaveType::Short) - { - push_symbol(SymbolType::One, 4); - return; - } + if(waves.size() < 4) return; - // Otherwise, eject at least one wave as all options are exhausted. - remove_waves(1); + if( waves[0] == WaveType::Short && + waves[1] == WaveType::Short && + waves[2] == WaveType::Short && + waves[3] == WaveType::Short) + { + push_symbol(SymbolType::One, 4); return; } + + remove_waves(1); } void add_to_crc(uint8_t value) diff --git a/StaticAnalyser/Commodore/Tape.cpp b/StaticAnalyser/Commodore/Tape.cpp index ce236084b..1700eed44 100644 --- a/StaticAnalyser/Commodore/Tape.cpp +++ b/StaticAnalyser/Commodore/Tape.cpp @@ -8,11 +8,107 @@ #include "Tape.hpp" +#include +#include "../TapeParser.hpp" + using namespace StaticAnalyser::Commodore; +enum class WaveType { + Short, Medium, Long, Unrecognised +}; + +enum class SymbolType { + One, Zero, Word, EndOfBlock, LeadIn +}; + +class CommodoreROMTapeParser: public StaticAnalyer::TapeParser { + public: + CommodoreROMTapeParser(const std::shared_ptr &tape) : + TapeParser(tape), + _wave_period(0.0f), + _previous_was_high(false) {} + + void spin() + { + while(!is_at_end()) + { + SymbolType symbol = get_next_symbol(); + switch(symbol) + { + case SymbolType::One: printf("1"); break; + case SymbolType::Zero: printf("0"); break; + case SymbolType::Word: printf(" "); break; + case SymbolType::EndOfBlock: printf("\n"); break; + case SymbolType::LeadIn: printf("-"); break; + } + } + } + + private: + void process_pulse(Storage::Tape::Tape::Pulse pulse) + { + bool is_high = pulse.type == Storage::Tape::Tape::Pulse::High; + _wave_period += pulse.length.get_float(); + + if(!is_high && _previous_was_high) + { + if(_wave_period >= 0.000592 && _wave_period < 0.000752) push_wave(WaveType::Long); + else if(_wave_period >= 0.000432 && _wave_period < 0.000592) push_wave(WaveType::Medium); + else if(_wave_period >= 0.000272 && _wave_period < 0.000432) push_wave(WaveType::Short); + else push_wave(WaveType::Unrecognised); + + _wave_period = 0.0f; + } + + _previous_was_high = is_high; + } + bool _previous_was_high; + float _wave_period; + + void inspect_waves(const std::vector &waves) + { + if(waves.size() < 2) return; + + if(waves[0] == WaveType::Long && waves[1] == WaveType::Medium) + { + push_symbol(SymbolType::Word, 2); + return; + } + + if(waves[0] == WaveType::Long && waves[1] == WaveType::Short) + { + push_symbol(SymbolType::EndOfBlock, 2); + return; + } + + if(waves[0] == WaveType::Short && waves[1] == WaveType::Medium) + { + push_symbol(SymbolType::Zero, 2); + return; + } + + if(waves[0] == WaveType::Medium && waves[1] == WaveType::Short) + { + push_symbol(SymbolType::One, 2); + return; + } + + if(waves[0] == WaveType::Short) + { + push_symbol(SymbolType::LeadIn, 1); + return; + } + + // Otherwise, eject at least one wave as all options are exhausted. + remove_waves(1); + } +}; + std::list StaticAnalyser::Commodore::GetFiles(const std::shared_ptr &tape) { - std::list file_list; + CommodoreROMTapeParser parser(tape); + parser.spin(); + std::list file_list; return file_list; }