mirror of
https://github.com/TomHarte/CLK.git
synced 2024-12-23 20:29:42 +00:00
Given that a final gap is semantically part of describing tape contents, ensured one formally appears before declaring that the tape has ended.
This commit is contained in:
parent
c775db50ef
commit
c6e48dfd56
@ -40,29 +40,37 @@ ZX80O::ZX80O(const char *file_name) :
|
|||||||
void ZX80O::virtual_reset() {
|
void ZX80O::virtual_reset() {
|
||||||
fseek(file_, 0, SEEK_SET);
|
fseek(file_, 0, SEEK_SET);
|
||||||
is_past_silence_ = false;
|
is_past_silence_ = false;
|
||||||
|
has_ended_final_byte_ = false;
|
||||||
is_high_ = true;
|
is_high_ = true;
|
||||||
bit_pointer_ = wave_pointer_ = 0;
|
bit_pointer_ = wave_pointer_ = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ZX80O::has_finished_data() {
|
||||||
|
return (ftell(file_) == end_of_file_ - 0x4000) && !wave_pointer_ && !bit_pointer_;
|
||||||
|
}
|
||||||
|
|
||||||
bool ZX80O::is_at_end() {
|
bool ZX80O::is_at_end() {
|
||||||
return ftell(file_) == end_of_file_ - 0x4000;
|
return has_finished_data() && has_ended_final_byte_;
|
||||||
}
|
}
|
||||||
|
|
||||||
Tape::Pulse ZX80O::virtual_get_next_pulse() {
|
Tape::Pulse ZX80O::virtual_get_next_pulse() {
|
||||||
Tape::Pulse pulse;
|
Tape::Pulse pulse;
|
||||||
|
|
||||||
// Start with 1 second of silence.
|
// Start with 1 second of silence.
|
||||||
if(!is_past_silence_ || (is_at_end() && !wave_pointer_)) {
|
if(!is_past_silence_ || has_finished_data()) {
|
||||||
pulse.type = Pulse::Type::Low;
|
pulse.type = Pulse::Type::Low;
|
||||||
pulse.length.length = 5;
|
pulse.length.length = 5;
|
||||||
pulse.length.clock_rate = 1;
|
pulse.length.clock_rate = 1;
|
||||||
is_past_silence_ = true;
|
is_past_silence_ = true;
|
||||||
|
has_ended_final_byte_ = has_finished_data();
|
||||||
return pulse;
|
return pulse;
|
||||||
}
|
}
|
||||||
|
|
||||||
// For each byte, output 8 bits and then silence.
|
// For each byte, output 8 bits and then silence.
|
||||||
if(!bit_pointer_ && !wave_pointer_) {
|
if(!bit_pointer_ && !wave_pointer_) {
|
||||||
byte_ = (uint8_t)fgetc(file_);
|
byte_ = (uint8_t)fgetc(file_);
|
||||||
|
if(has_finished_data())
|
||||||
|
printf("");
|
||||||
bit_pointer_ = 0;
|
bit_pointer_ = 0;
|
||||||
wave_pointer_ = 0;
|
wave_pointer_ = 0;
|
||||||
}
|
}
|
||||||
|
@ -38,11 +38,12 @@ class ZX80O: public Tape, public Storage::FileHolder {
|
|||||||
private:
|
private:
|
||||||
void virtual_reset();
|
void virtual_reset();
|
||||||
Pulse virtual_get_next_pulse();
|
Pulse virtual_get_next_pulse();
|
||||||
|
bool has_finished_data();
|
||||||
|
|
||||||
uint8_t byte_;
|
uint8_t byte_;
|
||||||
int bit_pointer_;
|
int bit_pointer_;
|
||||||
int wave_pointer_;
|
int wave_pointer_;
|
||||||
bool is_past_silence_;
|
bool is_past_silence_, has_ended_final_byte_;
|
||||||
bool is_high_;
|
bool is_high_;
|
||||||
|
|
||||||
uint16_t end_of_file_;
|
uint16_t end_of_file_;
|
||||||
|
Loading…
Reference in New Issue
Block a user