1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-11-23 03:32:32 +00:00

With silence and high tone implemented, this may well hit a large proportion of existing files.

This commit is contained in:
Thomas Harte 2016-01-18 19:45:14 -06:00
parent 7d6214e078
commit 127684c590
2 changed files with 30 additions and 3 deletions

View File

@ -53,11 +53,11 @@ Storage::Tape::Pulse Storage::UEF::get_next_pulse()
find_next_tape_chunk(); find_next_tape_chunk();
} }
next_pulse.length.clock_rate = _time_base; next_pulse.length.clock_rate = _time_base * 2;
switch(_chunk_id) switch(_chunk_id)
{ {
case 0x0100: case 0x0102: case 0x0110: case 0x0111: case 0x0114: case 0x0100: case 0x0102:
{ {
// In the ordinary ("1200 baud") data encoding format, // In the ordinary ("1200 baud") data encoding format,
// a zero bit is encoded as one complete cycle at the base frequency. // a zero bit is encoded as one complete cycle at the base frequency.
@ -72,6 +72,21 @@ Storage::Tape::Pulse Storage::UEF::get_next_pulse()
next_pulse.length.length = _current_bit ? 1 : 2; next_pulse.length.length = _current_bit ? 1 : 2;
_bit_position = (_bit_position+1)&(_current_bit ? 3 : 1); _bit_position = (_bit_position+1)&(_current_bit ? 3 : 1);
} break; } break;
case 0x0110:
next_pulse.type = (_bit_position&1) ? Pulse::High : Pulse::Low;
next_pulse.length.length = 2;
_bit_position ^= 1;
if(!_bit_position) _chunk_position++;
break;
case 0x0112:
case 0x0116:
next_pulse.type = Pulse::Zero;
next_pulse.length.length = _tone_length;
_chunk_position++;
break;
} }
return next_pulse; return next_pulse;
@ -109,7 +124,9 @@ void Storage::UEF::find_next_tape_chunk()
return; return;
case 0x0110: // carrier tone case 0x0110: // carrier tone
// TODO: read length _tone_length = (uint16_t)gzgetc(_file);
_tone_length |= (uint16_t)(gzgetc(_file) << 8);
gzseek(_file, _chunk_length - 2, SEEK_CUR);
return; return;
case 0x0111: // carrier tone with dummy byte case 0x0111: // carrier tone with dummy byte
// TODO: read length // TODO: read length
@ -134,6 +151,10 @@ bool Storage::UEF::chunk_is_finished()
{ {
case 0x0100: return (_chunk_position / 10) == _chunk_length; case 0x0100: return (_chunk_position / 10) == _chunk_length;
case 0x0102: return (_chunk_position / 8) == _chunk_length; case 0x0102: return (_chunk_position / 8) == _chunk_length;
case 0x0111: return _chunk_position == _tone_length;
case 0x0112:
case 0x0116: return _chunk_position ? true : false;
default: return true; default: return true;
} }
@ -173,6 +194,10 @@ bool Storage::UEF::get_next_bit()
} }
break; break;
case 0x0110:
_chunk_position++;
return true;
default: return true; default: return true;
} }
} }

View File

@ -36,6 +36,8 @@ class UEF : public Tape {
bool _current_bit; bool _current_bit;
uint32_t _bit_position; uint32_t _bit_position;
uint16_t _tone_length;
void find_next_tape_chunk(); void find_next_tape_chunk();
bool get_next_bit(); bool get_next_bit();
bool chunk_is_finished(); bool chunk_is_finished();