mirror of
https://github.com/TomHarte/CLK.git
synced 2025-02-16 18:30:32 +00:00
Add mouse input.
This commit is contained in:
parent
610327a04e
commit
952451c9b8
@ -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();;
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -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<std::shared_ptr<Storage::Disk::Disk>> &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_;
|
||||
}
|
||||
|
@ -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_;
|
||||
|
Loading…
x
Reference in New Issue
Block a user