1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-12-24 12:30:17 +00:00

This likely forms the Commodore dipoles correctly. It just stays stuck in leader tone forever is all.

This commit is contained in:
Thomas Harte 2016-08-15 20:08:50 -04:00
parent ca2dc6b6c4
commit 7e2b4554ea
2 changed files with 33 additions and 8 deletions

View File

@ -12,7 +12,7 @@
using namespace Storage; using namespace Storage;
TapePRG::TapePRG(const char *file_name) : _file(nullptr) TapePRG::TapePRG(const char *file_name) : _file(nullptr), _bitPhase(3)
{ {
struct stat file_stats; struct stat file_stats;
stat(file_name, &file_stats); stat(file_name, &file_stats);
@ -39,11 +39,34 @@ TapePRG::~TapePRG()
Tape::Pulse TapePRG::get_next_pulse() Tape::Pulse TapePRG::get_next_pulse()
{ {
static const unsigned int leader_zero_length = 179;
static const unsigned int zero_length = 169;
static const unsigned int one_length = 247;
static const unsigned int word_marker_length = 328;
_bitPhase = (_bitPhase+1)&3;
if(!_bitPhase) get_next_output_token();
Tape::Pulse pulse; Tape::Pulse pulse;
switch(_outputToken)
{
case Leader: pulse.length.length = leader_zero_length; break;
case Zero: pulse.length.length = (_bitPhase&2) ? one_length : zero_length; break;
case One: pulse.length.length = (_bitPhase&2) ? zero_length : one_length; break;
case WordMarker: pulse.length.length = (_bitPhase&2) ? one_length : word_marker_length; break;
}
pulse.length.clock_rate = 1000000;
pulse.type = (_bitPhase&1) ? Pulse::Low : Pulse::High;
return pulse; return pulse;
} }
void TapePRG::reset() void TapePRG::reset()
{ {
// TODO _bitPhase = 3;
fseek(_file, 2, SEEK_SET);
}
void TapePRG::get_next_output_token()
{
_outputToken = Leader;
} }

View File

@ -45,12 +45,14 @@ class TapePRG: public Tape {
FilePhaseHeader FilePhaseHeader
} _filePhase; } _filePhase;
enum BitPhase { int _bitPhase;
BitPhase0, enum OutputToken {
BitPhase1, Leader,
BitPhase2, Zero,
BitPhase3 One,
} _bitPhase; WordMarker
} _outputToken;
void get_next_output_token();
}; };
} }