mirror of
https://github.com/TomHarte/CLK.git
synced 2025-11-01 11:16:16 +00:00
Prefer references for delegate protocols.
This commit is contained in:
@@ -106,5 +106,5 @@ void MultiTimedMachine::run_for(const Time::Seconds duration) {
|
|||||||
if(machine->get_confidence() >= 0.01f) machine->run_for(duration);
|
if(machine->get_confidence() >= 0.01f) machine->run_for(duration);
|
||||||
});
|
});
|
||||||
|
|
||||||
if(delegate_) delegate_->did_run_machines(this);
|
if(delegate_) delegate_->did_run_machines(*this);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ public:
|
|||||||
been received.
|
been received.
|
||||||
*/
|
*/
|
||||||
struct Delegate {
|
struct Delegate {
|
||||||
virtual void did_run_machines(MultiTimedMachine *) = 0;
|
virtual void did_run_machines(MultiTimedMachine &) = 0;
|
||||||
};
|
};
|
||||||
/// Sets @c delegate as the receiver of delegate messages.
|
/// Sets @c delegate as the receiver of delegate messages.
|
||||||
void set_delegate(Delegate *const delegate) {
|
void set_delegate(Delegate *const delegate) {
|
||||||
|
|||||||
@@ -60,24 +60,24 @@ void MultiSpeaker::set_output_volume(const float volume) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MultiSpeaker::speaker_did_complete_samples(Speaker *const speaker, const std::vector<int16_t> &buffer) {
|
void MultiSpeaker::speaker_did_complete_samples(Speaker &speaker, const std::vector<int16_t> &buffer) {
|
||||||
auto delegate = delegate_.load(std::memory_order_relaxed);
|
auto delegate = delegate_.load(std::memory_order_relaxed);
|
||||||
if(!delegate) return;
|
if(!delegate) return;
|
||||||
{
|
{
|
||||||
std::lock_guard lock_guard(front_speaker_mutex_);
|
std::lock_guard lock_guard(front_speaker_mutex_);
|
||||||
if(speaker != front_speaker_) return;
|
if(&speaker != front_speaker_) return;
|
||||||
}
|
}
|
||||||
did_complete_samples(this, buffer, stereo_output_);
|
did_complete_samples(this, buffer, stereo_output_);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MultiSpeaker::speaker_did_change_input_clock(Speaker *const speaker) {
|
void MultiSpeaker::speaker_did_change_input_clock(Speaker &speaker) {
|
||||||
auto delegate = delegate_.load(std::memory_order_relaxed);
|
auto delegate = delegate_.load(std::memory_order_relaxed);
|
||||||
if(!delegate) return;
|
if(!delegate) return;
|
||||||
{
|
{
|
||||||
std::lock_guard lock_guard(front_speaker_mutex_);
|
std::lock_guard lock_guard(front_speaker_mutex_);
|
||||||
if(speaker != front_speaker_) return;
|
if(&speaker != front_speaker_) return;
|
||||||
}
|
}
|
||||||
delegate->speaker_did_change_input_clock(this);
|
delegate->speaker_did_change_input_clock(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MultiSpeaker::set_new_front_machine(::Machine::DynamicMachine *const machine) {
|
void MultiSpeaker::set_new_front_machine(::Machine::DynamicMachine *const machine) {
|
||||||
@@ -87,6 +87,6 @@ void MultiSpeaker::set_new_front_machine(::Machine::DynamicMachine *const machin
|
|||||||
}
|
}
|
||||||
auto delegate = delegate_.load(std::memory_order_relaxed);
|
auto delegate = delegate_.load(std::memory_order_relaxed);
|
||||||
if(delegate) {
|
if(delegate) {
|
||||||
delegate->speaker_did_change_input_clock(this);
|
delegate->speaker_did_change_input_clock(*this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,8 +42,8 @@ public:
|
|||||||
void set_output_volume(float) override;
|
void set_output_volume(float) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void speaker_did_complete_samples(Speaker *speaker, const std::vector<int16_t> &buffer) final;
|
void speaker_did_complete_samples(Speaker &, const std::vector<int16_t> &buffer) final;
|
||||||
void speaker_did_change_input_clock(Speaker *speaker) final;
|
void speaker_did_change_input_clock(Speaker &) final;
|
||||||
MultiSpeaker(const std::vector<Outputs::Speaker::Speaker *> &speakers);
|
MultiSpeaker(const std::vector<Outputs::Speaker::Speaker *> &speakers);
|
||||||
|
|
||||||
std::vector<Outputs::Speaker::Speaker *> speakers_;
|
std::vector<Outputs::Speaker::Speaker *> speakers_;
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ bool MultiMachine::would_collapse(const std::vector<std::unique_ptr<DynamicMachi
|
|||||||
(machines.front()->timed_machine()->get_confidence() >= 2.0f * machines[1]->timed_machine()->get_confidence());
|
(machines.front()->timed_machine()->get_confidence() >= 2.0f * machines[1]->timed_machine()->get_confidence());
|
||||||
}
|
}
|
||||||
|
|
||||||
void MultiMachine::did_run_machines(MultiTimedMachine *) {
|
void MultiMachine::did_run_machines(MultiTimedMachine &) {
|
||||||
std::lock_guard machines_lock(machines_mutex_);
|
std::lock_guard machines_lock(machines_mutex_);
|
||||||
|
|
||||||
if constexpr (logger.enabled) {
|
if constexpr (logger.enabled) {
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ public:
|
|||||||
void *raw_pointer() final;
|
void *raw_pointer() final;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void did_run_machines(MultiTimedMachine *) final;
|
void did_run_machines(MultiTimedMachine &) final;
|
||||||
|
|
||||||
std::vector<std::unique_ptr<DynamicMachine>> machines_;
|
std::vector<std::unique_ptr<DynamicMachine>> machines_;
|
||||||
std::recursive_mutex machines_mutex_;
|
std::recursive_mutex machines_mutex_;
|
||||||
|
|||||||
@@ -820,7 +820,7 @@ void WD1770::update_status(const std::function<void(Status &)> updater) {
|
|||||||
(status_.busy != old_status.busy) ||
|
(status_.busy != old_status.busy) ||
|
||||||
(status_.data_request != old_status.data_request) ||
|
(status_.data_request != old_status.data_request) ||
|
||||||
(status_.interrupt_request != old_status.interrupt_request);
|
(status_.interrupt_request != old_status.interrupt_request);
|
||||||
if(did_change) delegate_->wd1770_did_change_output(this);
|
if(did_change) delegate_->wd1770_did_change_output(*this);
|
||||||
} else updater(status_);
|
} else updater(status_);
|
||||||
|
|
||||||
if(status_.busy != old_status.busy) update_clocking_observer();
|
if(status_.busy != old_status.busy) update_clocking_observer();
|
||||||
|
|||||||
@@ -66,9 +66,8 @@ public:
|
|||||||
/// @returns The current value of the DRQ line output.
|
/// @returns The current value of the DRQ line output.
|
||||||
inline bool get_data_request_line() const { return status_.data_request; }
|
inline bool get_data_request_line() const { return status_.data_request; }
|
||||||
|
|
||||||
class Delegate {
|
struct Delegate {
|
||||||
public:
|
virtual void wd1770_did_change_output(WD1770 &) = 0;
|
||||||
virtual void wd1770_did_change_output(WD1770 *) = 0;
|
|
||||||
};
|
};
|
||||||
inline void set_delegate(Delegate *delegate) { delegate_ = delegate; }
|
inline void set_delegate(Delegate *delegate) { delegate_ = delegate; }
|
||||||
|
|
||||||
|
|||||||
@@ -60,8 +60,7 @@ public:
|
|||||||
*/
|
*/
|
||||||
class IRQDelegatePortHandler: public PortHandler {
|
class IRQDelegatePortHandler: public PortHandler {
|
||||||
public:
|
public:
|
||||||
class Delegate {
|
struct Delegate {
|
||||||
public:
|
|
||||||
/// Indicates that the interrupt status has changed for the IRQDelegatePortHandler provided.
|
/// Indicates that the interrupt status has changed for the IRQDelegatePortHandler provided.
|
||||||
virtual void mos6522_did_change_interrupt_status(void *irq_delegate) = 0;
|
virtual void mos6522_did_change_interrupt_status(void *irq_delegate) = 0;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -425,6 +425,6 @@ void z8530::update_delegate() {
|
|||||||
const bool interrupt_line = get_interrupt_line();
|
const bool interrupt_line = get_interrupt_line();
|
||||||
if(interrupt_line != previous_interrupt_line_) {
|
if(interrupt_line != previous_interrupt_line_) {
|
||||||
previous_interrupt_line_ = interrupt_line;
|
previous_interrupt_line_ = interrupt_line;
|
||||||
if(delegate_) delegate_->did_change_interrupt_status(this, interrupt_line);
|
if(delegate_) delegate_->did_change_interrupt_status(*this, interrupt_line);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ public:
|
|||||||
/*!
|
/*!
|
||||||
Communicates that @c scc now has the interrupt line status @c new_status.
|
Communicates that @c scc now has the interrupt line status @c new_status.
|
||||||
*/
|
*/
|
||||||
virtual void did_change_interrupt_status(z8530 *, bool new_status) = 0;
|
virtual void did_change_interrupt_status(z8530 &, bool new_status) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -54,7 +54,7 @@ public:
|
|||||||
void set_delegate(Delegate *const delegate) {
|
void set_delegate(Delegate *const delegate) {
|
||||||
if(delegate_ == delegate) return;
|
if(delegate_ == delegate) return;
|
||||||
delegate_ = delegate;
|
delegate_ = delegate;
|
||||||
delegate_->did_change_interrupt_status(this, get_interrupt_line());
|
delegate_->did_change_interrupt_status(*this, get_interrupt_line());
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ bool Keyboard::set_key_pressed(const Key key, const char, const bool is_pressed,
|
|||||||
}
|
}
|
||||||
key_states_[key_offset] = is_pressed;
|
key_states_[key_offset] = is_pressed;
|
||||||
|
|
||||||
if(delegate_) return delegate_->keyboard_did_change_key(this, key, is_pressed);
|
if(delegate_) return delegate_->keyboard_did_change_key(*this, key, is_pressed);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -38,7 +38,7 @@ const std::set<Inputs::Keyboard::Key> &Keyboard::get_essential_modifiers() const
|
|||||||
|
|
||||||
void Keyboard::reset_all_keys() {
|
void Keyboard::reset_all_keys() {
|
||||||
std::fill(key_states_.begin(), key_states_.end(), false);
|
std::fill(key_states_.begin(), key_states_.end(), false);
|
||||||
if(delegate_) delegate_->reset_all_keys(this);
|
if(delegate_) delegate_->reset_all_keys(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Keyboard::set_delegate(Delegate *const delegate) {
|
void Keyboard::set_delegate(Delegate *const delegate) {
|
||||||
|
|||||||
@@ -73,8 +73,8 @@ public:
|
|||||||
|
|
||||||
// Delegate interface.
|
// Delegate interface.
|
||||||
struct Delegate {
|
struct Delegate {
|
||||||
virtual bool keyboard_did_change_key(Keyboard *keyboard, Key key, bool is_pressed) = 0;
|
virtual bool keyboard_did_change_key(Keyboard &, Key, bool is_pressed) = 0;
|
||||||
virtual void reset_all_keys(Keyboard *keyboard) = 0;
|
virtual void reset_all_keys(Keyboard &) = 0;
|
||||||
};
|
};
|
||||||
void set_delegate(Delegate *);
|
void set_delegate(Delegate *);
|
||||||
bool get_key_state(Key) const;
|
bool get_key_state(Key) const;
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ public:
|
|||||||
set_delegate(this);
|
set_delegate(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wd1770_did_change_output(WD::WD1770 *) override {
|
void wd1770_did_change_output(WD::WD1770 &) override {
|
||||||
observer_.update_interrupts();
|
observer_.update_interrupts();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -561,7 +561,7 @@ public:
|
|||||||
scsi_is_clocked_ = preference != ClockingHint::Preference::None;
|
scsi_is_clocked_ = preference != ClockingHint::Preference::None;
|
||||||
}
|
}
|
||||||
|
|
||||||
void tape_did_change_interrupt_status(Tape *) final {
|
void tape_did_change_interrupt_status(Tape &) final {
|
||||||
interrupt_status_ = (interrupt_status_ & ~(Interrupt::TransmitDataEmpty | Interrupt::ReceiveDataFull | Interrupt::HighToneDetect)) | tape_.get_interrupt_status();
|
interrupt_status_ = (interrupt_status_ & ~(Interrupt::TransmitDataEmpty | Interrupt::ReceiveDataFull | Interrupt::HighToneDetect)) | tape_.get_interrupt_status();
|
||||||
evaluate_interrupts();
|
evaluate_interrupts();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ void Tape::push_tape_bit(uint16_t bit) {
|
|||||||
void Tape::evaluate_interrupts() {
|
void Tape::evaluate_interrupts() {
|
||||||
if(last_posted_interrupt_status_ != interrupt_status_) {
|
if(last_posted_interrupt_status_ != interrupt_status_) {
|
||||||
last_posted_interrupt_status_ = interrupt_status_;
|
last_posted_interrupt_status_ = interrupt_status_;
|
||||||
if(delegate_) delegate_->tape_did_change_interrupt_status(this);
|
if(delegate_) delegate_->tape_did_change_interrupt_status(*this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ public:
|
|||||||
void clear_interrupts(uint8_t interrupts);
|
void clear_interrupts(uint8_t interrupts);
|
||||||
|
|
||||||
struct Delegate {
|
struct Delegate {
|
||||||
virtual void tape_did_change_interrupt_status(Tape *) = 0;
|
virtual void tape_did_change_interrupt_status(Tape &) = 0;
|
||||||
};
|
};
|
||||||
inline void set_delegate(Delegate *delegate) { delegate_ = delegate; }
|
inline void set_delegate(Delegate *delegate) { delegate_ = delegate; }
|
||||||
|
|
||||||
|
|||||||
@@ -222,11 +222,11 @@ private:
|
|||||||
card_became_just_in_time_ |= !is_every_cycle;
|
card_became_just_in_time_ |= !is_every_cycle;
|
||||||
}
|
}
|
||||||
|
|
||||||
void card_did_change_select_constraints(Apple::II::Card *card) final {
|
void card_did_change_select_constraints(Apple::II::Card &card) final {
|
||||||
pick_card_messaging_group(card);
|
pick_card_messaging_group(&card);
|
||||||
}
|
}
|
||||||
|
|
||||||
void card_did_change_interrupt_flags(Apple::II::Card *) final {
|
void card_did_change_interrupt_flags(Apple::II::Card &) final {
|
||||||
bool nmi = false;
|
bool nmi = false;
|
||||||
bool irq = false;
|
bool irq = false;
|
||||||
|
|
||||||
|
|||||||
@@ -100,8 +100,8 @@ class Card {
|
|||||||
virtual bool irq() { return false; }
|
virtual bool irq() { return false; }
|
||||||
|
|
||||||
struct Delegate {
|
struct Delegate {
|
||||||
virtual void card_did_change_select_constraints(Card *card) = 0;
|
virtual void card_did_change_select_constraints(Card &) = 0;
|
||||||
virtual void card_did_change_interrupt_flags(Card *card) = 0;
|
virtual void card_did_change_interrupt_flags(Card &) = 0;
|
||||||
};
|
};
|
||||||
void set_delegate(Delegate *delegate) {
|
void set_delegate(Delegate *delegate) {
|
||||||
delegate_ = delegate;
|
delegate_ = delegate;
|
||||||
@@ -113,7 +113,7 @@ class Card {
|
|||||||
void set_select_constraints(int constraints) {
|
void set_select_constraints(int constraints) {
|
||||||
if(constraints == select_constraints_) return;
|
if(constraints == select_constraints_) return;
|
||||||
select_constraints_ = constraints;
|
select_constraints_ = constraints;
|
||||||
if(delegate_) delegate_->card_did_change_select_constraints(this);
|
if(delegate_) delegate_->card_did_change_select_constraints(*this);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void did_change_interrupt_flags() {
|
void did_change_interrupt_flags() {
|
||||||
delegate_->card_did_change_interrupt_flags(this);
|
delegate_->card_did_change_interrupt_flags(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ void DriveSpeedAccumulator::post_sample(uint8_t sample) {
|
|||||||
const float normalised_sum = float(sample_total_) / float(samples_per_bucket);
|
const float normalised_sum = float(sample_total_) / float(samples_per_bucket);
|
||||||
const float rotation_speed = (normalised_sum - 3.7f) * 17.6f;
|
const float rotation_speed = (normalised_sum - 3.7f) * 17.6f;
|
||||||
|
|
||||||
delegate_->drive_speed_accumulator_set_drive_speed(this, rotation_speed);
|
delegate_->drive_speed_accumulator_set_drive_speed(*this, rotation_speed);
|
||||||
sample_count_ = 0;
|
sample_count_ = 0;
|
||||||
sample_total_ = 0;
|
sample_total_ = 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ public:
|
|||||||
void post_sample(uint8_t sample);
|
void post_sample(uint8_t sample);
|
||||||
|
|
||||||
struct Delegate {
|
struct Delegate {
|
||||||
virtual void drive_speed_accumulator_set_drive_speed(DriveSpeedAccumulator *, float speed) = 0;
|
virtual void drive_speed_accumulator_set_drive_speed(DriveSpeedAccumulator &, float speed) = 0;
|
||||||
};
|
};
|
||||||
/*!
|
/*!
|
||||||
Sets the delegate to receive drive speed changes.
|
Sets the delegate to receive drive speed changes.
|
||||||
|
|||||||
@@ -478,7 +478,7 @@ public:
|
|||||||
|
|
||||||
// MARK: Interrupt updates.
|
// MARK: Interrupt updates.
|
||||||
|
|
||||||
void did_change_interrupt_status(Zilog::SCC::z8530 *, bool) final {
|
void did_change_interrupt_status(Zilog::SCC::z8530 &, bool) final {
|
||||||
update_interrupt_input();
|
update_interrupt_input();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -536,7 +536,7 @@ private:
|
|||||||
scsi_bus_is_clocked_ = scsi_bus_.preferred_clocking() != ClockingHint::Preference::None;
|
scsi_bus_is_clocked_ = scsi_bus_.preferred_clocking() != ClockingHint::Preference::None;
|
||||||
}
|
}
|
||||||
|
|
||||||
void drive_speed_accumulator_set_drive_speed(DriveSpeedAccumulator *, float speed) final {
|
void drive_speed_accumulator_set_drive_speed(DriveSpeedAccumulator &, const float speed) final {
|
||||||
iwm_.flush();
|
iwm_.flush();
|
||||||
drives_[0].set_rotation_speed(speed);
|
drives_[0].set_rotation_speed(speed);
|
||||||
drives_[1].set_rotation_speed(speed);
|
drives_[1].set_rotation_speed(speed);
|
||||||
|
|||||||
@@ -561,7 +561,7 @@ private:
|
|||||||
void acia6850_did_change_interrupt_status(Motorola::ACIA::ACIA *) final {
|
void acia6850_did_change_interrupt_status(Motorola::ACIA::ACIA *) final {
|
||||||
set_gpip_input();
|
set_gpip_input();
|
||||||
}
|
}
|
||||||
void dma_controller_did_change_output(DMAController *) final {
|
void dma_controller_did_change_output(DMAController &) final {
|
||||||
set_gpip_input();
|
set_gpip_input();
|
||||||
|
|
||||||
// Filty hack, here! Should: set the 68000's bus request line. But until
|
// Filty hack, here! Should: set the 68000's bus request line. But until
|
||||||
|
|||||||
@@ -135,12 +135,12 @@ void DMAController::run_for(HalfCycles duration) {
|
|||||||
fdc_.run_for(duration.flush<Cycles>());
|
fdc_.run_for(duration.flush<Cycles>());
|
||||||
}
|
}
|
||||||
|
|
||||||
void DMAController::wd1770_did_change_output(WD::WD1770 *) {
|
void DMAController::wd1770_did_change_output(WD::WD1770 &) {
|
||||||
// Check for a change in interrupt state.
|
// Check for a change in interrupt state.
|
||||||
const bool old_interrupt_line = interrupt_line_;
|
const bool old_interrupt_line = interrupt_line_;
|
||||||
interrupt_line_ = fdc_.get_interrupt_request_line();
|
interrupt_line_ = fdc_.get_interrupt_request_line();
|
||||||
if(delegate_ && interrupt_line_ != old_interrupt_line) {
|
if(delegate_ && interrupt_line_ != old_interrupt_line) {
|
||||||
delegate_->dma_controller_did_change_output(this);
|
delegate_->dma_controller_did_change_output(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for a change in DRQ state, if it's the FDC that is currently being watched.
|
// Check for a change in DRQ state, if it's the FDC that is currently being watched.
|
||||||
@@ -172,7 +172,7 @@ void DMAController::wd1770_did_change_output(WD::WD1770 *) {
|
|||||||
// Set bus request.
|
// Set bus request.
|
||||||
if(!bus_request_line_) {
|
if(!bus_request_line_) {
|
||||||
bus_request_line_ = true;
|
bus_request_line_ = true;
|
||||||
if(delegate_) delegate_->dma_controller_did_change_output(this);
|
if(delegate_) delegate_->dma_controller_did_change_output(*this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -182,7 +182,7 @@ void DMAController::wd1770_did_change_output(WD::WD1770 *) {
|
|||||||
int DMAController::bus_grant(uint16_t *ram, size_t size) {
|
int DMAController::bus_grant(uint16_t *ram, size_t size) {
|
||||||
// Being granted the bus negates the request.
|
// Being granted the bus negates the request.
|
||||||
bus_request_line_ = false;
|
bus_request_line_ = false;
|
||||||
if(delegate_) delegate_->dma_controller_did_change_output(this);
|
if(delegate_) delegate_->dma_controller_did_change_output(*this);
|
||||||
|
|
||||||
size <<= 1; // Convert to bytes.
|
size <<= 1; // Convert to bytes.
|
||||||
if(control_ & Control::Direction) {
|
if(control_ & Control::Direction) {
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ public:
|
|||||||
void set_floppy_disk(std::shared_ptr<Storage::Disk::Disk> disk, size_t drive);
|
void set_floppy_disk(std::shared_ptr<Storage::Disk::Disk> disk, size_t drive);
|
||||||
|
|
||||||
struct Delegate {
|
struct Delegate {
|
||||||
virtual void dma_controller_did_change_output(DMAController *) = 0;
|
virtual void dma_controller_did_change_output(DMAController &) = 0;
|
||||||
};
|
};
|
||||||
void set_delegate(Delegate *delegate);
|
void set_delegate(Delegate *delegate);
|
||||||
|
|
||||||
@@ -86,7 +86,7 @@ private:
|
|||||||
|
|
||||||
} fdc_;
|
} fdc_;
|
||||||
|
|
||||||
void wd1770_did_change_output(WD::WD1770 *) final;
|
void wd1770_did_change_output(WD::WD1770 &) final;
|
||||||
|
|
||||||
uint16_t control_ = 0;
|
uint16_t control_ = 0;
|
||||||
|
|
||||||
|
|||||||
@@ -152,11 +152,11 @@ void MachineBase::process_index_hole() {}
|
|||||||
|
|
||||||
// MARK: - Drive VIA delegate
|
// MARK: - Drive VIA delegate
|
||||||
|
|
||||||
void MachineBase::drive_via_did_step_head(void *, const int direction) {
|
void MachineBase::drive_via_did_step_head(DriveVIA &, const int direction) {
|
||||||
get_drive().step(Storage::Disk::HeadPosition(direction, 2));
|
get_drive().step(Storage::Disk::HeadPosition(direction, 2));
|
||||||
}
|
}
|
||||||
|
|
||||||
void MachineBase::drive_via_did_set_data_density(void *, const int density) {
|
void MachineBase::drive_via_did_set_data_density(DriveVIA &, const int density) {
|
||||||
set_expected_bit_length(Storage::Encodings::CommodoreGCR::length_of_a_bit_in_time_zone(unsigned(density)));
|
set_expected_bit_length(Storage::Encodings::CommodoreGCR::length_of_a_bit_in_time_zone(unsigned(density)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -252,13 +252,13 @@ void DriveVIA::set_port_output(const uint8_t value, uint8_t) {
|
|||||||
// Check for a head step.
|
// Check for a head step.
|
||||||
const int step_difference = ((value&3) - (previous_port_b_output_&3))&3;
|
const int step_difference = ((value&3) - (previous_port_b_output_&3))&3;
|
||||||
if(step_difference) {
|
if(step_difference) {
|
||||||
if(delegate_) delegate_->drive_via_did_step_head(this, (step_difference == 1) ? 1 : -1);
|
if(delegate_) delegate_->drive_via_did_step_head(*this, (step_difference == 1) ? 1 : -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for a change in density.
|
// Check for a change in density.
|
||||||
const int density_difference = (previous_port_b_output_^value) & (3 << 5);
|
const int density_difference = (previous_port_b_output_^value) & (3 << 5);
|
||||||
if(density_difference && delegate_) {
|
if(density_difference && delegate_) {
|
||||||
delegate_->drive_via_did_set_data_density(this, (value >> 5)&3);
|
delegate_->drive_via_did_set_data_density(*this, (value >> 5)&3);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Post the LED status.
|
// Post the LED status.
|
||||||
|
|||||||
@@ -77,10 +77,9 @@ private:
|
|||||||
*/
|
*/
|
||||||
class DriveVIA: public MOS::MOS6522::IRQDelegatePortHandler {
|
class DriveVIA: public MOS::MOS6522::IRQDelegatePortHandler {
|
||||||
public:
|
public:
|
||||||
class Delegate {
|
struct Delegate {
|
||||||
public:
|
virtual void drive_via_did_step_head(DriveVIA &, int direction) = 0;
|
||||||
virtual void drive_via_did_step_head(void *driveVIA, int direction) = 0;
|
virtual void drive_via_did_set_data_density(DriveVIA &, int density) = 0;
|
||||||
virtual void drive_via_did_set_data_density(void *driveVIA, int density) = 0;
|
|
||||||
};
|
};
|
||||||
void set_delegate(Delegate *);
|
void set_delegate(Delegate *);
|
||||||
|
|
||||||
@@ -142,8 +141,8 @@ protected:
|
|||||||
void mos6522_did_change_interrupt_status(void *mos6522) override;
|
void mos6522_did_change_interrupt_status(void *mos6522) override;
|
||||||
|
|
||||||
// to satisfy DriveVIA::Delegate
|
// to satisfy DriveVIA::Delegate
|
||||||
void drive_via_did_step_head(void *driveVIA, int direction) override;
|
void drive_via_did_step_head(DriveVIA &, int direction) override;
|
||||||
void drive_via_did_set_data_density(void *driveVIA, int density) override;
|
void drive_via_did_set_data_density(DriveVIA &, int density) override;
|
||||||
|
|
||||||
CPU::MOS6502::Processor<CPU::MOS6502::Personality::P6502, MachineBase, false> m6502_;
|
CPU::MOS6502::Processor<CPU::MOS6502::Personality::P6502, MachineBase, false> m6502_;
|
||||||
|
|
||||||
|
|||||||
@@ -684,8 +684,8 @@ public:
|
|||||||
return Utility::TypeRecipient<CharacterMapper>::can_type(c);
|
return Utility::TypeRecipient<CharacterMapper>::can_type(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
void tape_did_change_input(Storage::Tape::BinaryTapePlayer *const tape) final {
|
void tape_did_change_input(Storage::Tape::BinaryTapePlayer &tape) final {
|
||||||
keyboard_via_.set_control_line_input<MOS::MOS6522::Port::A, MOS::MOS6522::Line::One>(!tape->input());
|
keyboard_via_.set_control_line_input<MOS::MOS6522::Port::A, MOS::MOS6522::Line::One>(!tape.input());
|
||||||
}
|
}
|
||||||
|
|
||||||
KeyboardMapper *get_keyboard_mapper() final {
|
KeyboardMapper *get_keyboard_mapper() final {
|
||||||
|
|||||||
@@ -14,14 +14,18 @@ MachineTypes::MappedKeyboardMachine::MappedKeyboardMachine(const std::set<Inputs
|
|||||||
keyboard_.set_delegate(this);
|
keyboard_.set_delegate(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MappedKeyboardMachine::keyboard_did_change_key(Inputs::Keyboard *, Inputs::Keyboard::Key key, bool is_pressed) {
|
bool MappedKeyboardMachine::keyboard_did_change_key(
|
||||||
|
Inputs::Keyboard &,
|
||||||
|
const Inputs::Keyboard::Key key,
|
||||||
|
const bool is_pressed
|
||||||
|
) {
|
||||||
const uint16_t mapped_key = get_keyboard_mapper()->mapped_key_for_key(key);
|
const uint16_t mapped_key = get_keyboard_mapper()->mapped_key_for_key(key);
|
||||||
if(mapped_key == KeyNotMapped) return false;
|
if(mapped_key == KeyNotMapped) return false;
|
||||||
set_key_state(mapped_key, is_pressed);
|
set_key_state(mapped_key, is_pressed);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MappedKeyboardMachine::reset_all_keys(Inputs::Keyboard *) {
|
void MappedKeyboardMachine::reset_all_keys(Inputs::Keyboard &) {
|
||||||
// TODO: unify naming.
|
// TODO: unify naming.
|
||||||
clear_all_keys();
|
clear_all_keys();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -150,8 +150,8 @@ public:
|
|||||||
virtual Inputs::Keyboard &get_keyboard() override;
|
virtual Inputs::Keyboard &get_keyboard() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool keyboard_did_change_key(Inputs::Keyboard *, Inputs::Keyboard::Key, bool is_pressed) override;
|
bool keyboard_did_change_key(Inputs::Keyboard &, Inputs::Keyboard::Key, bool is_pressed) override;
|
||||||
void reset_all_keys(Inputs::Keyboard *) override;
|
void reset_all_keys(Inputs::Keyboard &) override;
|
||||||
Inputs::Keyboard keyboard_;
|
Inputs::Keyboard keyboard_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -408,7 +408,7 @@ template <Analyser::Static::Sega::Target::Model model> class ConcreteMachine:
|
|||||||
return keyboard_;
|
return keyboard_;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool keyboard_did_change_key(Inputs::Keyboard *, Inputs::Keyboard::Key key, bool is_pressed) final {
|
bool keyboard_did_change_key(Inputs::Keyboard &, Inputs::Keyboard::Key key, bool is_pressed) final {
|
||||||
if(key == Inputs::Keyboard::Key::Enter) {
|
if(key == Inputs::Keyboard::Key::Enter) {
|
||||||
pause_is_pressed_ = is_pressed;
|
pause_is_pressed_ = is_pressed;
|
||||||
return true;
|
return true;
|
||||||
@@ -422,7 +422,7 @@ template <Analyser::Static::Sega::Target::Model model> class ConcreteMachine:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void reset_all_keys(Inputs::Keyboard *) final {
|
void reset_all_keys(Inputs::Keyboard &) final {
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Configuration options.
|
// MARK: - Configuration options.
|
||||||
|
|||||||
@@ -29,12 +29,12 @@ class DiskController: public WD::WD1770 {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct Delegate: public WD1770::Delegate {
|
struct Delegate: public WD1770::Delegate {
|
||||||
virtual void disk_controller_did_change_paged_item(DiskController *controller) = 0;
|
virtual void disk_controller_did_change_paged_item(DiskController &) = 0;
|
||||||
};
|
};
|
||||||
inline void set_delegate(Delegate *delegate) {
|
inline void set_delegate(Delegate *delegate) {
|
||||||
delegate_ = delegate;
|
delegate_ = delegate;
|
||||||
WD1770::set_delegate(delegate);
|
WD1770::set_delegate(delegate);
|
||||||
if(delegate) delegate->disk_controller_did_change_paged_item(this);
|
if(delegate) delegate->disk_controller_did_change_paged_item(*this);
|
||||||
}
|
}
|
||||||
inline PagedItem get_paged_item() {
|
inline PagedItem get_paged_item() {
|
||||||
return paged_item_;
|
return paged_item_;
|
||||||
@@ -47,7 +47,7 @@ class DiskController: public WD::WD1770 {
|
|||||||
if(paged_item_ == item) return;
|
if(paged_item_ == item) return;
|
||||||
paged_item_ = item;
|
paged_item_ = item;
|
||||||
if(delegate_) {
|
if(delegate_) {
|
||||||
delegate_->disk_controller_did_change_paged_item(this);
|
delegate_->disk_controller_did_change_paged_item(*this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ void Microdisc::set_control_register(uint8_t control, uint8_t changes) {
|
|||||||
irq_enable_ = bool(control & 0x01);
|
irq_enable_ = bool(control & 0x01);
|
||||||
const bool has_irq = get_interrupt_request_line();
|
const bool has_irq = get_interrupt_request_line();
|
||||||
if(has_irq != had_irq && delegate_) {
|
if(has_irq != had_irq && delegate_) {
|
||||||
delegate_->wd1770_did_change_output(this);
|
delegate_->wd1770_did_change_output(*this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -624,7 +624,7 @@ template <Analyser::Static::Oric::Target::DiskInterface disk_interface, CPU::MOS
|
|||||||
}
|
}
|
||||||
|
|
||||||
// to satisfy Storage::Tape::BinaryTapePlayer::Delegate
|
// to satisfy Storage::Tape::BinaryTapePlayer::Delegate
|
||||||
void tape_did_change_input(Storage::Tape::BinaryTapePlayer *) final {
|
void tape_did_change_input(Storage::Tape::BinaryTapePlayer &) final {
|
||||||
set_via_port_b_input();
|
set_via_port_b_input();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -648,8 +648,8 @@ template <Analyser::Static::Oric::Target::DiskInterface disk_interface, CPU::MOS
|
|||||||
}
|
}
|
||||||
|
|
||||||
// DiskController::Delegate
|
// DiskController::Delegate
|
||||||
void disk_controller_did_change_paged_item(DiskController *controller) final {
|
void disk_controller_did_change_paged_item(DiskController &controller) final {
|
||||||
switch(controller->get_paged_item()) {
|
switch(controller.get_paged_item()) {
|
||||||
default:
|
default:
|
||||||
ram_top_ = basic_visible_ram_top_;
|
ram_top_ = basic_visible_ram_top_;
|
||||||
paged_rom_ = rom_.data();
|
paged_rom_ = rom_.data();
|
||||||
@@ -667,7 +667,7 @@ template <Analyser::Static::Oric::Target::DiskInterface disk_interface, CPU::MOS
|
|||||||
}
|
}
|
||||||
|
|
||||||
// WD::WD1770::Delegate
|
// WD::WD1770::Delegate
|
||||||
void wd1770_did_change_output(WD::WD1770 *) final {
|
void wd1770_did_change_output(WD::WD1770 &) final {
|
||||||
set_interrupt_line();
|
set_interrupt_line();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ void Typer::run_for(const HalfCycles duration) {
|
|||||||
|
|
||||||
if(counter_ < 0 && counter_ + duration >= 0) {
|
if(counter_ < 0 && counter_ + duration >= 0) {
|
||||||
if(!type_next_character()) {
|
if(!type_next_character()) {
|
||||||
delegate_->typer_reset(this);
|
delegate_->typer_reset(*this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -41,7 +41,7 @@ void Typer::run_for(const HalfCycles duration) {
|
|||||||
while(string_pointer_ < string_.size() && counter_ > frequency_) {
|
while(string_pointer_ < string_.size() && counter_ > frequency_) {
|
||||||
counter_ -= frequency_;
|
counter_ -= frequency_;
|
||||||
if(!type_next_character()) {
|
if(!type_next_character()) {
|
||||||
delegate_->typer_reset(this);
|
delegate_->typer_reset(*this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -65,10 +65,9 @@ class CharacterMapper {
|
|||||||
*/
|
*/
|
||||||
class Typer {
|
class Typer {
|
||||||
public:
|
public:
|
||||||
class Delegate: public MachineTypes::KeyActions {
|
struct Delegate: public MachineTypes::KeyActions {
|
||||||
public:
|
/// Informs the delegate that this typer has reached the end of its content.
|
||||||
/// Informs the delegate that this typer has reached the end of its content.
|
virtual void typer_reset(Typer &) = 0;
|
||||||
virtual void typer_reset(Typer *typer) = 0;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Typer(const std::string &string, HalfCycles delay, HalfCycles frequency, CharacterMapper &character_mapper, Delegate *delegate);
|
Typer(const std::string &string, HalfCycles delay, HalfCycles frequency, CharacterMapper &character_mapper, Delegate *delegate);
|
||||||
@@ -131,7 +130,7 @@ protected:
|
|||||||
Provided in order to conform to that part of the Typer::Delegate interface that goes above and
|
Provided in order to conform to that part of the Typer::Delegate interface that goes above and
|
||||||
beyond KeyboardMachine::Machine; responds to the end of typing by clearing all keys.
|
beyond KeyboardMachine::Machine; responds to the end of typing by clearing all keys.
|
||||||
*/
|
*/
|
||||||
void typer_reset(Typer *) override {
|
void typer_reset(Typer &) override {
|
||||||
clear_all_keys();
|
clear_all_keys();
|
||||||
|
|
||||||
// It's unsafe to deallocate typer right now, since it is the caller, but also it has a small
|
// It's unsafe to deallocate typer right now, since it is the caller, but also it has a small
|
||||||
|
|||||||
@@ -73,14 +73,14 @@ struct LockProtectedDelegate {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct SpeakerDelegate: public Outputs::Speaker::Speaker::Delegate, public LockProtectedDelegate {
|
struct SpeakerDelegate: public Outputs::Speaker::Speaker::Delegate, public LockProtectedDelegate {
|
||||||
void speaker_did_complete_samples(Outputs::Speaker::Speaker *speaker, const std::vector<int16_t> &buffer) final {
|
void speaker_did_complete_samples(Outputs::Speaker::Speaker &speaker, const std::vector<int16_t> &buffer) final {
|
||||||
[machineAccessLock lock];
|
[machineAccessLock lock];
|
||||||
[machine speaker:speaker didCompleteSamples:buffer.data() length:(int)buffer.size()];
|
[machine speaker:&speaker didCompleteSamples:buffer.data() length:(int)buffer.size()];
|
||||||
[machineAccessLock unlock];
|
[machineAccessLock unlock];
|
||||||
}
|
}
|
||||||
void speaker_did_change_input_clock(Outputs::Speaker::Speaker *speaker) final {
|
void speaker_did_change_input_clock(Outputs::Speaker::Speaker &speaker) final {
|
||||||
[machineAccessLock lock];
|
[machineAccessLock lock];
|
||||||
[machine speakerDidChangeInputClock:speaker];
|
[machine speakerDidChangeInputClock:&speaker];
|
||||||
[machineAccessLock unlock];
|
[machineAccessLock unlock];
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -311,7 +311,7 @@ void CRT::advance_cycles(int number_of_cycles, bool hsync_requested, bool vsync_
|
|||||||
if(delegate_) {
|
if(delegate_) {
|
||||||
frames_since_last_delegate_call_++;
|
frames_since_last_delegate_call_++;
|
||||||
if(frames_since_last_delegate_call_ == 20) {
|
if(frames_since_last_delegate_call_ == 20) {
|
||||||
delegate_->crt_did_end_batch_of_frames(this, frames_since_last_delegate_call_, vertical_flywheel_->get_and_reset_number_of_surprises());
|
delegate_->crt_did_end_batch_of_frames(*this, frames_since_last_delegate_call_, vertical_flywheel_->get_and_reset_number_of_surprises());
|
||||||
frames_since_last_delegate_call_ = 0;
|
frames_since_last_delegate_call_ = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,9 +44,8 @@ static constexpr bool AlternatesPhase = false;
|
|||||||
|
|
||||||
class CRT;
|
class CRT;
|
||||||
|
|
||||||
class Delegate {
|
struct Delegate {
|
||||||
public:
|
virtual void crt_did_end_batch_of_frames(CRT &, int number_of_frames, int number_of_unexpected_vertical_syncs) = 0;
|
||||||
virtual void crt_did_end_batch_of_frames(CRT *crt, int number_of_frames, int number_of_unexpected_vertical_syncs) = 0;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/*! Models a class 2d analogue output device, accepting a serial stream of data including syncs
|
/*! Models a class 2d analogue output device, accepting a serial stream of data including syncs
|
||||||
@@ -356,7 +355,7 @@ template <typename Receiver> class CRTFrequencyMismatchWarner: public Outputs::C
|
|||||||
public:
|
public:
|
||||||
CRTFrequencyMismatchWarner(Receiver &receiver) : receiver_(receiver) {}
|
CRTFrequencyMismatchWarner(Receiver &receiver) : receiver_(receiver) {}
|
||||||
|
|
||||||
void crt_did_end_batch_of_frames(Outputs::CRT::CRT *, int number_of_frames, int number_of_unexpected_vertical_syncs) final {
|
void crt_did_end_batch_of_frames(Outputs::CRT::CRT &, int number_of_frames, int number_of_unexpected_vertical_syncs) final {
|
||||||
frame_records_[frame_record_pointer_ % frame_records_.size()].number_of_frames = number_of_frames;
|
frame_records_[frame_record_pointer_ % frame_records_.size()].number_of_frames = number_of_frames;
|
||||||
frame_records_[frame_record_pointer_ % frame_records_.size()].number_of_unexpected_vertical_syncs = number_of_unexpected_vertical_syncs;
|
frame_records_[frame_record_pointer_ % frame_records_.size()].number_of_unexpected_vertical_syncs = number_of_unexpected_vertical_syncs;
|
||||||
++frame_record_pointer_;
|
++frame_record_pointer_;
|
||||||
|
|||||||
@@ -245,7 +245,7 @@ protected:
|
|||||||
const int scale = static_cast<ConcreteT *>(this)->get_scale();
|
const int scale = static_cast<ConcreteT *>(this)->get_scale();
|
||||||
|
|
||||||
if(recalculate_filter_if_dirty()) {
|
if(recalculate_filter_if_dirty()) {
|
||||||
delegate->speaker_did_change_input_clock(this);
|
delegate->speaker_did_change_input_clock(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(conversion_) {
|
switch(conversion_) {
|
||||||
|
|||||||
@@ -120,13 +120,13 @@ public:
|
|||||||
Indicates that a new audio packet is ready. If the output is stereo, samples will be interleaved with the first
|
Indicates that a new audio packet is ready. If the output is stereo, samples will be interleaved with the first
|
||||||
being left, the second being right, etc.
|
being left, the second being right, etc.
|
||||||
*/
|
*/
|
||||||
virtual void speaker_did_complete_samples(Speaker *speaker, const std::vector<int16_t> &buffer) = 0;
|
virtual void speaker_did_complete_samples(Speaker &, const std::vector<int16_t> &buffer) = 0;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Provides the delegate with a hint that the input clock rate has changed, which provides an opportunity to
|
Provides the delegate with a hint that the input clock rate has changed, which provides an opportunity to
|
||||||
renegotiate the ideal clock rate, if desired.
|
renegotiate the ideal clock rate, if desired.
|
||||||
*/
|
*/
|
||||||
virtual void speaker_did_change_input_clock([[maybe_unused]] Speaker *speaker) {}
|
virtual void speaker_did_change_input_clock(Speaker &) {}
|
||||||
};
|
};
|
||||||
virtual void set_delegate(Delegate *delegate) {
|
virtual void set_delegate(Delegate *delegate) {
|
||||||
delegate_.store(delegate, std::memory_order_relaxed);
|
delegate_.store(delegate, std::memory_order_relaxed);
|
||||||
@@ -147,7 +147,7 @@ protected:
|
|||||||
// Hope for the fast path first: producer and consumer agree about
|
// Hope for the fast path first: producer and consumer agree about
|
||||||
// number of channels.
|
// number of channels.
|
||||||
if(is_stereo == stereo_output_) {
|
if(is_stereo == stereo_output_) {
|
||||||
delegate->speaker_did_complete_samples(this, buffer);
|
delegate->speaker_did_complete_samples(*this, buffer);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -166,7 +166,7 @@ protected:
|
|||||||
mix_buffer_[(c << 1) + 0] = mix_buffer_[(c << 1) + 1] = buffer[c];
|
mix_buffer_[(c << 1) + 0] = mix_buffer_[(c << 1) + 1] = buffer[c];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
delegate->speaker_did_complete_samples(this, mix_buffer_);
|
delegate->speaker_did_complete_samples(*this, mix_buffer_);
|
||||||
}
|
}
|
||||||
std::atomic<Delegate *> delegate_{nullptr};
|
std::atomic<Delegate *> delegate_{nullptr};
|
||||||
|
|
||||||
|
|||||||
@@ -196,6 +196,6 @@ void BinaryTapePlayer::process(const Storage::Tape::Pulse &pulse) {
|
|||||||
bool new_input_level = pulse.type == Pulse::High;
|
bool new_input_level = pulse.type == Pulse::High;
|
||||||
if(input_level_ != new_input_level) {
|
if(input_level_ != new_input_level) {
|
||||||
input_level_ = new_input_level;
|
input_level_ = new_input_level;
|
||||||
if(delegate_) delegate_->tape_did_change_input(this);
|
if(delegate_) delegate_->tape_did_change_input(*this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -168,7 +168,7 @@ public:
|
|||||||
void run_for(Cycles);
|
void run_for(Cycles);
|
||||||
|
|
||||||
struct Delegate {
|
struct Delegate {
|
||||||
virtual void tape_did_change_input(BinaryTapePlayer *) = 0;
|
virtual void tape_did_change_input(BinaryTapePlayer &) = 0;
|
||||||
};
|
};
|
||||||
void set_delegate(Delegate *);
|
void set_delegate(Delegate *);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user