added missing write method to QuadTari (fixes #832, SaveKey not working in QT)

This commit is contained in:
Thomas Jentzsch 2021-09-28 21:43:46 +02:00
parent 72f5f17011
commit 7c8f426a1b
3 changed files with 37 additions and 12 deletions

View File

@ -107,6 +107,19 @@ unique_ptr<Controller> QuadTari::addController(const Controller::Type type, bool
} }
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool QuadTari::isFirst()
{
constexpr int MIN_CYCLES = 76; // minimal cycles required for stable input switch (just to be safe)
if(mySystem.tia().dumpPortsCycles() < MIN_CYCLES)
// Random controller if read too soon after dump ports changed
return mySystem.randGenerator().next() % 2;
else
// If bit 7 of VBlank is not set, read first, else second controller
return !(mySystem.tia().registerValue(VBLANK) & 0x80);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool QuadTari::read(DigitalPin pin) bool QuadTari::read(DigitalPin pin)
{ {
@ -114,22 +127,21 @@ bool QuadTari::read(DigitalPin pin)
// can switch the controller multiple times per frame // can switch the controller multiple times per frame
// (we can't just read 60 times per second in the ::update() method) // (we can't just read 60 times per second in the ::update() method)
constexpr int MIN_CYCLES = 76; // minimal cycles required for stable input switch (just to be safe) if(isFirst())
bool readFirst;
if(mySystem.tia().dumpPortsCycles() < MIN_CYCLES)
// Random controller if read too soon after dump ports changed
readFirst = mySystem.randGenerator().next() % 2;
else
// If bit 7 of VBlank is not set, read first, else second controller
readFirst = !(mySystem.tia().registerValue(VBLANK) & 0x80);
if(readFirst)
return myFirstController->read(pin); return myFirstController->read(pin);
else else
return mySecondController->read(pin); return mySecondController->read(pin);
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void QuadTari::write(DigitalPin pin, bool value)
{
if(isFirst())
return myFirstController->write(pin, value);
else
return mySecondController->write(pin, value);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void QuadTari::update() void QuadTari::update()
{ {

View File

@ -59,6 +59,16 @@ class QuadTari : public Controller
*/ */
bool read(DigitalPin pin) override; bool read(DigitalPin pin) override;
/**
Write the given value to the specified digital pin for this
controller. Writing is only allowed to the pins associated
with the PIA. Therefore you cannot write to pin six.
@param pin The pin of the controller jack to write to
@param value The value to write to the pin
*/
void write(DigitalPin pin, bool value) override;
/** /**
Update the entire digital and analog pin state according to the Update the entire digital and analog pin state according to the
events currently set. events currently set.
@ -96,6 +106,9 @@ class QuadTari : public Controller
Controller::Type xtype, int xid, Controller::Type ytype, int yid) override; Controller::Type xtype, int xid, Controller::Type ytype, int yid) override;
private: private:
// determine which controller is active
bool isFirst();
unique_ptr<Controller> addController(const Controller::Type type, bool second); unique_ptr<Controller> addController(const Controller::Type type, bool second);
const OSystem& myOSystem; const OSystem& myOSystem;