diff --git a/Machines/Atari2600/Atari2600.cpp b/Machines/Atari2600/Atari2600.cpp index 109b1e7a1..255d99b45 100644 --- a/Machines/Atari2600/Atari2600.cpp +++ b/Machines/Atari2600/Atari2600.cpp @@ -130,6 +130,18 @@ class ConcreteMachine: } } + bool get_switch_is_enabled(Atari2600Switch input) override { + uint8_t port_input = bus_->mos6532_.get_port_input(1); + switch(input) { + case Atari2600SwitchReset: return !!(port_input & 0x01); + case Atari2600SwitchSelect: return !!(port_input & 0x02); + case Atari2600SwitchColour: return !!(port_input & 0x08); + case Atari2600SwitchLeftPlayerDifficulty: return !!(port_input & 0x40); + case Atari2600SwitchRightPlayerDifficulty: return !!(port_input & 0x80); + default: return false; + } + } + void set_reset_switch(bool state) override { bus_->set_reset_line(state); } diff --git a/Machines/Atari2600/Atari2600.hpp b/Machines/Atari2600/Atari2600.hpp index c4c2d5282..856409fd4 100644 --- a/Machines/Atari2600/Atari2600.hpp +++ b/Machines/Atari2600/Atari2600.hpp @@ -33,6 +33,9 @@ class Machine: /// Sets the switch @c input to @c state. virtual void set_switch_is_enabled(Atari2600Switch input, bool state) = 0; + /// Gets the state of switch @c input. + virtual bool get_switch_is_enabled(Atari2600Switch input) = 0; + // Presses or releases the reset button. virtual void set_reset_switch(bool state) = 0; }; diff --git a/Machines/ZX8081/ZX8081.cpp b/Machines/ZX8081/ZX8081.cpp index a5e044c53..7e8c8a507 100644 --- a/Machines/ZX8081/ZX8081.cpp +++ b/Machines/ZX8081/ZX8081.cpp @@ -341,10 +341,15 @@ template class ConcreteMachine: tape_player_.set_motor_control(false); } } + void set_tape_is_playing(bool is_playing) override final { tape_player_.set_motor_control(is_playing); } + bool get_tape_is_playing() override final { + return tape_player_.get_motor_control(); + } + // MARK: - Typer timing HalfCycles get_typer_delay() override final { return Cycles(7000000); } HalfCycles get_typer_frequency() override final { return Cycles(390000); } diff --git a/Machines/ZX8081/ZX8081.hpp b/Machines/ZX8081/ZX8081.hpp index 14993c44e..351e62aa1 100644 --- a/Machines/ZX8081/ZX8081.hpp +++ b/Machines/ZX8081/ZX8081.hpp @@ -30,6 +30,7 @@ class Machine: static Machine *ZX8081(const Analyser::Static::Target &target_hint); virtual void set_tape_is_playing(bool is_playing) = 0; + virtual bool get_tape_is_playing() = 0; }; } diff --git a/OSBindings/Mac/Clock Signal/Machine/Wrappers/CSAtari2600.mm b/OSBindings/Mac/Clock Signal/Machine/Wrappers/CSAtari2600.mm index 5f9420719..5b596cb7d 100644 --- a/OSBindings/Mac/Clock Signal/Machine/Wrappers/CSAtari2600.mm +++ b/OSBindings/Mac/Clock Signal/Machine/Wrappers/CSAtari2600.mm @@ -25,29 +25,41 @@ } - (void)setColourButton:(BOOL)colourButton { - _colourButton = colourButton; - @synchronized(_machine) { _atari2600->set_switch_is_enabled(Atari2600SwitchColour, colourButton); } } -- (void)setLeftPlayerDifficultyButton:(BOOL)leftPlayerDifficultyButton { - _leftPlayerDifficultyButton = leftPlayerDifficultyButton; +- (BOOL)colourButton { + @synchronized(_machine) { + return _atari2600->get_switch_is_enabled(Atari2600SwitchColour); + } +} +- (void)setLeftPlayerDifficultyButton:(BOOL)leftPlayerDifficultyButton { @synchronized(_machine) { _atari2600->set_switch_is_enabled(Atari2600SwitchLeftPlayerDifficulty, leftPlayerDifficultyButton); } } -- (void)setRightPlayerDifficultyButton:(BOOL)rightPlayerDifficultyButton { - _rightPlayerDifficultyButton = rightPlayerDifficultyButton; +- (BOOL)leftPlayerDifficultyButton { + @synchronized(_machine) { + return _atari2600->get_switch_is_enabled(Atari2600SwitchLeftPlayerDifficulty); + } +} +- (void)setRightPlayerDifficultyButton:(BOOL)rightPlayerDifficultyButton { @synchronized(_machine) { _atari2600->set_switch_is_enabled(Atari2600SwitchRightPlayerDifficulty, rightPlayerDifficultyButton); } } +- (BOOL)rightPlayerDifficultyButton { + @synchronized(_machine) { + return _atari2600->get_switch_is_enabled(Atari2600SwitchRightPlayerDifficulty); + } +} + - (void)toggleSwitch:(Atari2600Switch)toggleSwitch { @synchronized(_machine) { _atari2600->set_switch_is_enabled(toggleSwitch, true); diff --git a/OSBindings/Mac/Clock Signal/Machine/Wrappers/CSZX8081.mm b/OSBindings/Mac/Clock Signal/Machine/Wrappers/CSZX8081.mm index 8067655b4..0143bb3bb 100644 --- a/OSBindings/Mac/Clock Signal/Machine/Wrappers/CSZX8081.mm +++ b/OSBindings/Mac/Clock Signal/Machine/Wrappers/CSZX8081.mm @@ -28,9 +28,14 @@ - (void)setTapeIsPlaying:(BOOL)tapeIsPlaying { @synchronized(_machine) { - _tapeIsPlaying = tapeIsPlaying; _zx8081->set_tape_is_playing(tapeIsPlaying ? true : false); } } +- (BOOL)tapeIsPlaying { + @synchronized(_machine) { + return _zx8081->get_tape_is_playing(); + } +} + @end