From 952451c9b8a7e4aa89ec70ca900480cc86e1e7c3 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Sat, 23 Oct 2021 20:17:13 -0700 Subject: [PATCH] Add mouse input. --- Machines/Amiga/Amiga.cpp | 9 ++++++- Machines/Amiga/Chipset.cpp | 49 +++++++++++++++++++++++++++++++------- Machines/Amiga/Chipset.hpp | 21 ++++++++++++++-- 3 files changed, 67 insertions(+), 12 deletions(-) diff --git a/Machines/Amiga/Amiga.cpp b/Machines/Amiga/Amiga.cpp index e6c8e2d48..a921200a4 100644 --- a/Machines/Amiga/Amiga.cpp +++ b/Machines/Amiga/Amiga.cpp @@ -30,7 +30,7 @@ namespace { // NTSC clock rate: 2*3.579545 = 7.15909Mhz. // PAL clock rate: 7.09379Mhz; 227 cycles/line. constexpr int PALClockRate = 7'093'790; -constexpr int NTSCClockRate = 7'159'090; +//constexpr int NTSCClockRate = 7'159'090; } @@ -40,6 +40,7 @@ class ConcreteMachine: public Activity::Source, public CPU::MC68000::BusHandler, public MachineTypes::MediaTarget, + public MachineTypes::MouseMachine, public MachineTypes::ScanProducer, public MachineTypes::TimedMachine, public Machine { @@ -192,6 +193,12 @@ class ConcreteMachine: void run_for(const Cycles cycles) { mc68000_.run_for(cycles); } + + // MARK: - MachineTypes::MouseMachine. + + Inputs::Mouse &get_mouse() final { + return chipset_.get_mouse();; + } }; } diff --git a/Machines/Amiga/Chipset.cpp b/Machines/Amiga/Chipset.cpp index 7ca9e4962..928c8f1b4 100644 --- a/Machines/Amiga/Chipset.cpp +++ b/Machines/Amiga/Chipset.cpp @@ -44,7 +44,7 @@ Chipset::Chipset(MemoryMap &map, int input_clock_rate) : bitplanes_(DMA_CONSTRUCT), copper_(DMA_CONSTRUCT), crt_(908, 4, Outputs::Display::Type::PAL50, Outputs::Display::InputDataType::Red4Green4Blue4), - cia_a_handler_(map, disk_controller_), + cia_a_handler_(map, disk_controller_, mouse_), cia_b_handler_(disk_controller_), cia_a(cia_a_handler_), cia_b(cia_b_handler_), @@ -604,9 +604,15 @@ void Chipset::perform(const CPU::MC68000::Microcycle &cycle) { // Joystick/mouse input. case Read(0x00a): + cycle.set_value16( + uint16_t( + (mouse_.position[1] << 8) | + mouse_.position[0] + ) + ); + break; case Read(0x00c): -// LOG("TODO: Joystick/mouse position " << PADHEX(4) << *cycle.address); - cycle.set_value16(0x0000); + cycle.set_value16(0x0202); break; case Write(0x034): @@ -1101,7 +1107,8 @@ Outputs::Display::DisplayType Chipset::get_display_type() const { // MARK: - CIA A. -Chipset::CIAAHandler::CIAAHandler(MemoryMap &map, DiskController &controller) : map_(map), controller_(controller) {} +Chipset::CIAAHandler::CIAAHandler(MemoryMap &map, DiskController &controller, Mouse &mouse) : + map_(map), controller_(controller), mouse_(mouse) {} void Chipset::CIAAHandler::set_port_output(MOS::MOS6526::Port port, uint8_t value) { if(port) { @@ -1131,11 +1138,9 @@ uint8_t Chipset::CIAAHandler::get_port_input(MOS::MOS6526::Port port) { if(port) { LOG("TODO: parallel input?"); } else { - uint8_t result = controller_.get_rdy_trk0_wpro_chng(); - // TODO: add in FIR1, FIR0. - - LOG("CIA A, port A input — FIR, RDY, TRK0, etc: " << PADHEX(2) << std::bitset<8>{result}); - return result; + return + controller_.get_rdy_trk0_wpro_chng() & + mouse_.button_state; } return 0xff; } @@ -1368,3 +1373,29 @@ bool Chipset::insert(const std::vector> &di return inserted; } + +// MARK: - Mouse. + +int Chipset::Mouse::get_number_of_buttons() { + return 2; +} + +void Chipset::Mouse::set_button_pressed(int button, bool is_set) { + const uint8_t mask = 0x80 >> button; + button_state = + (button_state & ~mask) | + (is_set ? 0 : mask); +} + +void Chipset::Mouse::reset_all_buttons() { + button_state = 0xff; +} + +void Chipset::Mouse::move(int x, int y) { + position[0] += x; + position[1] += y; +} + +Inputs::Mouse &Chipset::get_mouse() { + return mouse_; +} diff --git a/Machines/Amiga/Chipset.hpp b/Machines/Amiga/Chipset.hpp index 84a611171..7e26578b6 100644 --- a/Machines/Amiga/Chipset.hpp +++ b/Machines/Amiga/Chipset.hpp @@ -18,6 +18,7 @@ #include "../../Activity/Source.hpp" #include "../../ClockReceiver/ClockingHintSource.hpp" #include "../../Components/6526/6526.hpp" +#include "../../Inputs/Mouse.hpp" #include "../../Outputs/CRT/CRT.hpp" #include "../../Processors/68000/68000.hpp" #include "../../Storage/Disk/Controller/DiskController.hpp" @@ -260,13 +261,28 @@ class Chipset: private ClockingHint::Observer { uint16_t palette_[32]{}; uint16_t swizzled_palette_[32]{}; - // MARK: - CIAs + // MARK: - Mouse. + private: + struct Mouse: public Inputs::Mouse { + int get_number_of_buttons() final; + void set_button_pressed(int, bool) final; + void reset_all_buttons() final; + void move(int, int) final; + + uint8_t position[2]{}; + uint8_t button_state = 0xff; + } mouse_; + + public: + Inputs::Mouse &get_mouse(); + + // MARK: - CIAs. private: class DiskController; class CIAAHandler: public MOS::MOS6526::PortHandler { public: - CIAAHandler(MemoryMap &map, DiskController &controller); + CIAAHandler(MemoryMap &map, DiskController &controller, Mouse &mouse); void set_port_output(MOS::MOS6526::Port port, uint8_t value); uint8_t get_port_input(MOS::MOS6526::Port port); void set_activity_observer(Activity::Observer *observer); @@ -274,6 +290,7 @@ class Chipset: private ClockingHint::Observer { private: MemoryMap &map_; DiskController &controller_; + Mouse &mouse_; Activity::Observer *observer_ = nullptr; inline static const std::string led_name = "Power"; } cia_a_handler_;