1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-10-02 19:54:35 +00:00

Threw in 300-baud support. Why not?

This commit is contained in:
Thomas Harte 2016-09-08 07:48:20 -04:00
parent 3e925e80a3
commit 01e5dae512
2 changed files with 24 additions and 14 deletions

View File

@ -69,7 +69,8 @@ static int gzget32(gzFile file)
UEF::UEF(const char *file_name) : UEF::UEF(const char *file_name) :
_time_base(1200), _time_base(1200),
_is_at_end(false), _is_at_end(false),
_pulse_pointer(0) _pulse_pointer(0),
_is_300_baud(false)
{ {
_file = gzopen(file_name, "rb"); _file = gzopen(file_name, "rb");
@ -166,7 +167,7 @@ void UEF::parse_next_tape_chunk()
case 0x0114: queue_security_cycles(); break; case 0x0114: queue_security_cycles(); break;
case 0x0104: queue_defined_data(chunk_length); break; case 0x0104: queue_defined_data(chunk_length); break;
case 0x113: // change of base rate case 0x0113: // change of base rate
{ {
// TODO: something smarter than just converting this to an int // TODO: something smarter than just converting this to an int
float new_time_base = gzgetfloat(_file); float new_time_base = gzgetfloat(_file);
@ -174,6 +175,13 @@ void UEF::parse_next_tape_chunk()
} }
break; break;
case 0x0117:
{
int baud_rate = gzget16(_file);
_is_300_baud = (baud_rate == 300);
}
break;
default: default:
printf("!!! Skipping %04x\n", chunk_id); printf("!!! Skipping %04x\n", chunk_id);
break; break;
@ -335,26 +343,27 @@ void UEF::queue_implicit_byte(uint8_t byte)
void UEF::queue_bit(int bit) void UEF::queue_bit(int bit)
{ {
// TODO: allow for 300-baud encoding int number_of_cycles;
Time duration;
duration.clock_rate = _time_base * 4;
if(bit) if(bit)
{ {
// Encode a 1 as four high-frequency waves // encode high-frequency waves
Time duration;
duration.length = 1; duration.length = 1;
duration.clock_rate = _time_base * 4; number_of_cycles = 2;
_queued_pulses.emplace_back(Pulse::Low, duration);
_queued_pulses.emplace_back(Pulse::High, duration);
_queued_pulses.emplace_back(Pulse::Low, duration);
_queued_pulses.emplace_back(Pulse::High, duration);
} }
else else
{ {
// Encode a 0 as two low-frequency waves // encode low-frequency waves
Time duration;
duration.length = 2; duration.length = 2;
duration.clock_rate = _time_base * 4; number_of_cycles = 1;
}
if(_is_300_baud) number_of_cycles *= 4;
while(number_of_cycles--)
{
_queued_pulses.emplace_back(Pulse::Low, duration); _queued_pulses.emplace_back(Pulse::Low, duration);
_queued_pulses.emplace_back(Pulse::High, duration); _queued_pulses.emplace_back(Pulse::High, duration);
} }

View File

@ -43,6 +43,7 @@ class UEF : public Tape {
gzFile _file; gzFile _file;
unsigned int _time_base; unsigned int _time_base;
bool _is_at_end; bool _is_at_end;
bool _is_300_baud;
std::vector<Pulse> _queued_pulses; std::vector<Pulse> _queued_pulses;
size_t _pulse_pointer; size_t _pulse_pointer;