From a947553badab1bb27aacfe558a56e8981de1c98d Mon Sep 17 00:00:00 2001 From: Stephen Anthony Date: Sun, 14 Apr 2019 16:22:46 -0230 Subject: [PATCH 1/2] More 'enum class' and associated cleanups. --- src/common/MouseControl.cxx | 152 ++++++++++++++---------------------- src/common/MouseControl.hxx | 2 +- src/gui/GameInfoDialog.cxx | 18 ++--- 3 files changed, 67 insertions(+), 105 deletions(-) diff --git a/src/common/MouseControl.cxx b/src/common/MouseControl.cxx index 976be62ae..ae9703f32 100644 --- a/src/common/MouseControl.cxx +++ b/src/common/MouseControl.cxx @@ -42,105 +42,67 @@ MouseControl::MouseControl(Console& console, const string& mode) m_mode[0] >= '0' && m_mode[0] <= '8' && m_mode[1] >= '0' && m_mode[1] <= '8') { - Axis xaxis = Axis(int(m_mode[0]) - '0'); - Axis yaxis = Axis(int(m_mode[1]) - '0'); + MouseControl::Type xaxis = MouseControl::Type(int(m_mode[0]) - '0'); + MouseControl::Type yaxis = MouseControl::Type(int(m_mode[1]) - '0'); ostringstream msg; - msg << "Mouse X-axis is "; Controller::Type xtype = Controller::Type::Joystick, ytype = Controller::Type::Joystick; int xid = -1, yid = -1; - switch(xaxis) - { - case NoControl: - msg << "not used"; - break; - case Paddle0: - xtype = Controller::Type::Paddles; - xid = 0; - msg << "Paddle 0"; - break; - case Paddle1: - xtype = Controller::Type::Paddles; - xid = 1; - msg << "Paddle 1"; - break; - case Paddle2: - xtype = Controller::Type::Paddles; - xid = 2; - msg << "Paddle 2"; - break; - case Paddle3: - xtype = Controller::Type::Paddles; - xid = 3; - msg << "Paddle 3"; - break; - case Driving0: - xtype = Controller::Type::Driving; - xid = 0; - msg << "Driving 0"; - break; - case Driving1: - xtype = Controller::Type::Driving; - xid = 1; - msg << "Driving 1"; - break; - case MindLink0: - xtype = Controller::Type::MindLink; - xid = 0; - msg << "MindLink 0"; - break; - case MindLink1: - xtype = Controller::Type::MindLink; - xid = 1; - msg << "MindLink 1"; - break; - } + + auto MControlToController = [&msg](MouseControl::Type axis, + Controller::Type& type, int& id) { + switch(axis) + { + case MouseControl::Type::NoControl: + msg << "not used"; + break; + case MouseControl::Type::Paddle0: + type = Controller::Type::Paddles; + id = 0; + msg << "Paddle 0"; + break; + case MouseControl::Type::Paddle1: + type = Controller::Type::Paddles; + id = 1; + msg << "Paddle 1"; + break; + case MouseControl::Type::Paddle2: + type = Controller::Type::Paddles; + id = 2; + msg << "Paddle 2"; + break; + case MouseControl::Type::Paddle3: + type = Controller::Type::Paddles; + id = 3; + msg << "Paddle 3"; + break; + case MouseControl::Type::Driving0: + type = Controller::Type::Driving; + id = 0; + msg << "Driving 0"; + break; + case MouseControl::Type::Driving1: + type = Controller::Type::Driving; + id = 1; + msg << "Driving 1"; + break; + case MouseControl::Type::MindLink0: + type = Controller::Type::MindLink; + id = 0; + msg << "MindLink 0"; + break; + case MouseControl::Type::MindLink1: + type = Controller::Type::MindLink; + id = 1; + msg << "MindLink 1"; + break; + } + }; + + msg << "Mouse X-axis is "; + MControlToController(xaxis, xtype, xid); msg << ", Y-axis is "; - switch(yaxis) - { - case NoControl: - msg << "not used"; - break; - case Paddle0: - ytype = Controller::Type::Paddles; - yid = 0; - msg << "Paddle 0"; - break; - case Paddle1: - ytype = Controller::Type::Paddles; - yid = 1; - msg << "Paddle 1"; - break; - case Paddle2: - ytype = Controller::Type::Paddles; - yid = 2; - msg << "Paddle 2"; - break; - case Paddle3: - ytype = Controller::Type::Paddles; - yid = 3; - msg << "Paddle 3"; - break; - case Driving0: - ytype = Controller::Type::Driving; - yid = 0; - msg << "Driving 0"; - break; - case Driving1: - ytype = Controller::Type::Driving; - yid = 1; - msg << "Driving 1"; - break; - case MindLink0: - ytype = Controller::Type::MindLink; - yid = 0; - msg << "MindLink 0"; - break; - case MindLink1: - ytype = Controller::Type::MindLink; - yid = 1; - msg << "MindLink 1"; - break; - } + MControlToController(yaxis, ytype, yid); + myModeList.push_back(MouseMode(xtype, xid, ytype, yid, msg.str())); } diff --git a/src/common/MouseControl.hxx b/src/common/MouseControl.hxx index f8894d54a..29c994bf1 100644 --- a/src/common/MouseControl.hxx +++ b/src/common/MouseControl.hxx @@ -41,7 +41,7 @@ class MouseControl /** Enumeration of mouse axis control types */ - enum Axis + enum class Type { Paddle0 = 0, Paddle1, Paddle2, Paddle3, Driving0, Driving1, MindLink0, MindLink1, diff --git a/src/gui/GameInfoDialog.cxx b/src/gui/GameInfoDialog.cxx index 20fe031a0..f01f54e05 100644 --- a/src/gui/GameInfoDialog.cxx +++ b/src/gui/GameInfoDialog.cxx @@ -247,15 +247,15 @@ GameInfoDialog::GameInfoDialog( // Mouse controller specific axis pwidth = font.getStringWidth("MindLink 0"); items.clear(); - VarList::push_back(items, "None", MouseControl::NoControl); - VarList::push_back(items, "Paddle 0", MouseControl::Paddle0); - VarList::push_back(items, "Paddle 1", MouseControl::Paddle1); - VarList::push_back(items, "Paddle 2", MouseControl::Paddle2); - VarList::push_back(items, "Paddle 3", MouseControl::Paddle3); - VarList::push_back(items, "Driving 0", MouseControl::Driving0); - VarList::push_back(items, "Driving 1", MouseControl::Driving1); - VarList::push_back(items, "MindLink 0", MouseControl::MindLink0); - VarList::push_back(items, "MindLink 1", MouseControl::MindLink1); + VarList::push_back(items, "None", static_cast(MouseControl::Type::NoControl)); + VarList::push_back(items, "Paddle 0", static_cast(MouseControl::Type::Paddle0)); + VarList::push_back(items, "Paddle 1", static_cast(MouseControl::Type::Paddle1)); + VarList::push_back(items, "Paddle 2", static_cast(MouseControl::Type::Paddle2)); + VarList::push_back(items, "Paddle 3", static_cast(MouseControl::Type::Paddle3)); + VarList::push_back(items, "Driving 0", static_cast(MouseControl::Type::Driving0)); + VarList::push_back(items, "Driving 1", static_cast(MouseControl::Type::Driving1)); + VarList::push_back(items, "MindLink 0", static_cast(MouseControl::Type::MindLink0)); + VarList::push_back(items, "MindLink 1", static_cast(MouseControl::Type::MindLink1)); xpos += 20; ypos += lineHeight + VGAP; From 93851177239b99310d6ecdf14029919c64a67699 Mon Sep 17 00:00:00 2001 From: Christian Speckner Date: Mon, 15 Apr 2019 12:01:04 +0200 Subject: [PATCH 2/2] Move inlined sprite tick logic to improve readability. --- src/emucore/tia/Ball.hxx | 116 +++++++++++++++++--------------- src/emucore/tia/Missile.hxx | 120 ++++++++++++++++++--------------- src/emucore/tia/Player.hxx | 122 ++++++++++++++++++---------------- src/emucore/tia/Playfield.hxx | 55 ++++++++------- 4 files changed, 225 insertions(+), 188 deletions(-) diff --git a/src/emucore/tia/Ball.hxx b/src/emucore/tia/Ball.hxx index 654f08b06..274206827 100644 --- a/src/emucore/tia/Ball.hxx +++ b/src/emucore/tia/Ball.hxx @@ -82,60 +82,9 @@ class Ball : public Serializable bool save(Serializer& out) const override; bool load(Serializer& in) override; - void movementTick(uInt32 clock, bool hblank) - { - myLastMovementTick = myCounter; + inline void movementTick(uInt32 clock, bool hblank); - if (clock == myHmmClocks) - isMoving = false; - - if(isMoving) - { - if (hblank) tick(false); - myInvertedPhaseClock = !hblank; - } - } - - void tick(bool isReceivingMclock = true) - { - if(myUseInvertedPhaseClock && myInvertedPhaseClock) - { - myInvertedPhaseClock = false; - return; - } - - myIsVisible = myIsRendering && myRenderCounter >= 0; - collision = (myIsVisible && myIsEnabled) ? myCollisionMaskEnabled : myCollisionMaskDisabled; - - bool starfieldEffect = isMoving && isReceivingMclock; - - if (myCounter == 156) { - myIsRendering = true; - myRenderCounter = renderCounterOffset; - - uInt8 starfieldDelta = (myCounter + TIAConstants::H_PIXEL - myLastMovementTick) % 4; - if (starfieldEffect && starfieldDelta == 3 && myWidth < 4) ++myRenderCounter; - - switch (starfieldDelta) { - case 3: - myEffectiveWidth = myWidth == 1 ? 2 : myWidth; - break; - - case 2: - myEffectiveWidth = 0; - break; - - default: - myEffectiveWidth = myWidth; - break; - } - - } else if (myIsRendering && ++myRenderCounter >= (starfieldEffect ? myEffectiveWidth : myWidth)) - myIsRendering = false; - - if (++myCounter >= TIAConstants::H_PIXEL) - myCounter = 0; - } + inline void tick(bool isReceivingMclock = true); public: @@ -191,4 +140,65 @@ class Ball : public Serializable Ball& operator=(Ball&&); }; +// ############################################################################ +// Implementation +// ############################################################################ + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void Ball::movementTick(uInt32 clock, bool hblank) +{ + myLastMovementTick = myCounter; + + if (clock == myHmmClocks) + isMoving = false; + + if(isMoving) + { + if (hblank) tick(false); + myInvertedPhaseClock = !hblank; + } +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void Ball::tick(bool isReceivingMclock) +{ + if(myUseInvertedPhaseClock && myInvertedPhaseClock) + { + myInvertedPhaseClock = false; + return; + } + + myIsVisible = myIsRendering && myRenderCounter >= 0; + collision = (myIsVisible && myIsEnabled) ? myCollisionMaskEnabled : myCollisionMaskDisabled; + + bool starfieldEffect = isMoving && isReceivingMclock; + + if (myCounter == 156) { + myIsRendering = true; + myRenderCounter = renderCounterOffset; + + uInt8 starfieldDelta = (myCounter + TIAConstants::H_PIXEL - myLastMovementTick) % 4; + if (starfieldEffect && starfieldDelta == 3 && myWidth < 4) ++myRenderCounter; + + switch (starfieldDelta) { + case 3: + myEffectiveWidth = myWidth == 1 ? 2 : myWidth; + break; + + case 2: + myEffectiveWidth = 0; + break; + + default: + myEffectiveWidth = myWidth; + break; + } + + } else if (myIsRendering && ++myRenderCounter >= (starfieldEffect ? myEffectiveWidth : myWidth)) + myIsRendering = false; + + if (++myCounter >= TIAConstants::H_PIXEL) + myCounter = 0; +} + #endif // TIA_BALL diff --git a/src/emucore/tia/Missile.hxx b/src/emucore/tia/Missile.hxx index 2cfc0408b..0edf68e2a 100644 --- a/src/emucore/tia/Missile.hxx +++ b/src/emucore/tia/Missile.hxx @@ -76,62 +76,9 @@ class Missile : public Serializable bool save(Serializer& out) const override; bool load(Serializer& in) override; - void movementTick(uInt8 clock, uInt8 hclock, bool hblank) - { - if(clock == myHmmClocks) isMoving = false; + inline void movementTick(uInt8 clock, uInt8 hclock, bool hblank); - if (isMoving) - { - if (hblank) tick(hclock, false); - myInvertedPhaseClock = !hblank; - } - } - - void tick(uInt8 hclock, bool isReceivingMclock = true) - { - if(myUseInvertedPhaseClock && myInvertedPhaseClock) - { - myInvertedPhaseClock = false; - return; - } - - myIsVisible = - myIsRendering && - (myRenderCounter >= 0 || (isMoving && isReceivingMclock && myRenderCounter == -1 && myWidth < 4 && ((hclock + 1) % 4 == 3))); - - collision = (myIsVisible && myIsEnabled) ? myCollisionMaskEnabled : myCollisionMaskDisabled; - - if (myDecodes[myCounter] && !myResmp) { - myIsRendering = true; - myRenderCounter = renderCounterOffset; - } else if (myIsRendering) { - - if (myRenderCounter == -1) { - if (isMoving && isReceivingMclock) { - switch ((hclock + 1) % 4) { - case 3: - myEffectiveWidth = myWidth == 1 ? 2 : myWidth; - if (myWidth < 4) ++myRenderCounter; - break; - - case 2: - myEffectiveWidth = 0; - break; - - default: - myEffectiveWidth = myWidth; - break; - } - } else { - myEffectiveWidth = myWidth; - } - } - - if (++myRenderCounter >= (isMoving ? myEffectiveWidth : myWidth)) myIsRendering = false; - } - - if (++myCounter >= TIAConstants::H_PIXEL) myCounter = 0; - } + inline void tick(uInt8 hclock, bool isReceivingMclock = true); public: @@ -188,4 +135,67 @@ class Missile : public Serializable Missile& operator=(Missile&&) = delete; }; +// ############################################################################ +// Implementation +// ############################################################################ + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void Missile::movementTick(uInt8 clock, uInt8 hclock, bool hblank) +{ + if(clock == myHmmClocks) isMoving = false; + + if (isMoving) + { + if (hblank) tick(hclock, false); + myInvertedPhaseClock = !hblank; + } +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void Missile::tick(uInt8 hclock, bool isReceivingMclock) +{ + if(myUseInvertedPhaseClock && myInvertedPhaseClock) + { + myInvertedPhaseClock = false; + return; + } + + myIsVisible = + myIsRendering && + (myRenderCounter >= 0 || (isMoving && isReceivingMclock && myRenderCounter == -1 && myWidth < 4 && ((hclock + 1) % 4 == 3))); + + collision = (myIsVisible && myIsEnabled) ? myCollisionMaskEnabled : myCollisionMaskDisabled; + + if (myDecodes[myCounter] && !myResmp) { + myIsRendering = true; + myRenderCounter = renderCounterOffset; + } else if (myIsRendering) { + + if (myRenderCounter == -1) { + if (isMoving && isReceivingMclock) { + switch ((hclock + 1) % 4) { + case 3: + myEffectiveWidth = myWidth == 1 ? 2 : myWidth; + if (myWidth < 4) ++myRenderCounter; + break; + + case 2: + myEffectiveWidth = 0; + break; + + default: + myEffectiveWidth = myWidth; + break; + } + } else { + myEffectiveWidth = myWidth; + } + } + + if (++myRenderCounter >= (isMoving ? myEffectiveWidth : myWidth)) myIsRendering = false; + } + + if (++myCounter >= TIAConstants::H_PIXEL) myCounter = 0; +} + #endif // TIA_MISSILE diff --git a/src/emucore/tia/Player.hxx b/src/emucore/tia/Player.hxx index dab8fe9f2..d44432f64 100644 --- a/src/emucore/tia/Player.hxx +++ b/src/emucore/tia/Player.hxx @@ -87,63 +87,9 @@ class Player : public Serializable bool save(Serializer& out) const override; bool load(Serializer& in) override; - void movementTick(uInt32 clock, bool hblank) - { - if (clock == myHmmClocks) - isMoving = false; + inline void movementTick(uInt32 clock, bool hblank); - if(isMoving) - { - if (hblank) tick(); - myInvertedPhaseClock = !hblank; - } - } - - void tick() - { - if(myUseInvertedPhaseClock && myInvertedPhaseClock) - { - myInvertedPhaseClock = false; - return; - } - - if (!myIsRendering || myRenderCounter < myRenderCounterTripPoint) - collision = myCollisionMaskDisabled; - else - collision = (myPattern & (1 << mySampleCounter)) ? myCollisionMaskEnabled : myCollisionMaskDisabled; - - if (myDecodes[myCounter]) { - myIsRendering = true; - mySampleCounter = 0; - myRenderCounter = renderCounterOffset; - } else if (myIsRendering) { - ++myRenderCounter; - - switch (myDivider) { - case 1: - if (myRenderCounter > 0) - ++mySampleCounter; - - if (myRenderCounter >= 0 && myDividerChangeCounter >= 0 && myDividerChangeCounter-- == 0) - setDivider(myDividerPending); - - break; - - default: - if (myRenderCounter > 1 && (((myRenderCounter - 1) % myDivider) == 0)) - ++mySampleCounter; - - if (myRenderCounter > 0 && myDividerChangeCounter >= 0 && myDividerChangeCounter-- == 0) - setDivider(myDividerPending); - - break; - } - - if (mySampleCounter > 7) myIsRendering = false; - } - - if (++myCounter >= TIAConstants::H_PIXEL) myCounter = 0; - } + inline void tick(); public: @@ -205,4 +151,68 @@ class Player : public Serializable Player& operator=(Player&&) = delete; }; +// ############################################################################ +// Implementation +// ############################################################################ + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void Player::movementTick(uInt32 clock, bool hblank) +{ + if (clock == myHmmClocks) + isMoving = false; + + if(isMoving) + { + if (hblank) tick(); + myInvertedPhaseClock = !hblank; + } +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void Player::tick() +{ + if(myUseInvertedPhaseClock && myInvertedPhaseClock) + { + myInvertedPhaseClock = false; + return; + } + + if (!myIsRendering || myRenderCounter < myRenderCounterTripPoint) + collision = myCollisionMaskDisabled; + else + collision = (myPattern & (1 << mySampleCounter)) ? myCollisionMaskEnabled : myCollisionMaskDisabled; + + if (myDecodes[myCounter]) { + myIsRendering = true; + mySampleCounter = 0; + myRenderCounter = renderCounterOffset; + } else if (myIsRendering) { + ++myRenderCounter; + + switch (myDivider) { + case 1: + if (myRenderCounter > 0) + ++mySampleCounter; + + if (myRenderCounter >= 0 && myDividerChangeCounter >= 0 && myDividerChangeCounter-- == 0) + setDivider(myDividerPending); + + break; + + default: + if (myRenderCounter > 1 && (((myRenderCounter - 1) % myDivider) == 0)) + ++mySampleCounter; + + if (myRenderCounter > 0 && myDividerChangeCounter >= 0 && myDividerChangeCounter-- == 0) + setDivider(myDividerPending); + + break; + } + + if (mySampleCounter > 7) myIsRendering = false; + } + + if (++myCounter >= TIAConstants::H_PIXEL) myCounter = 0; +} + #endif // TIA_PLAYER diff --git a/src/emucore/tia/Playfield.hxx b/src/emucore/tia/Playfield.hxx index 945139bd0..5bc0b547b 100644 --- a/src/emucore/tia/Playfield.hxx +++ b/src/emucore/tia/Playfield.hxx @@ -127,31 +127,9 @@ class Playfield : public Serializable bool load(Serializer& in) override; /** - Tick one color clock. Inline for performance. + Tick one color clock. Inline for performance (implementation below). */ - void tick(uInt32 x) - { - myX = x; - - // Reflected flag is updated only at x = 0 or x = 79 - if (myX == TIAConstants::H_PIXEL / 2 || myX == 0) myRefp = myReflected; - - if (x & 0x03) return; - - uInt32 currentPixel; - - if (myEffectivePattern == 0) { - currentPixel = 0; - } else if (x < TIAConstants::H_PIXEL / 2) { - currentPixel = myEffectivePattern & (1 << (x >> 2)); - } else if (myRefp) { - currentPixel = myEffectivePattern & (1 << (39 - (x >> 2))); - } else { - currentPixel = myEffectivePattern & (1 << ((x >> 2) - 20)); - } - - collision = currentPixel ? myCollisionMaskEnabled : myCollisionMaskDisabled; - } + inline void tick(uInt32 x); public: @@ -268,4 +246,33 @@ class Playfield : public Serializable Playfield& operator=(Playfield&&) = delete; }; +// ############################################################################ +// Implementation +// ############################################################################ + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void Playfield::tick(uInt32 x) +{ + myX = x; + + // Reflected flag is updated only at x = 0 or x = 79 + if (myX == TIAConstants::H_PIXEL / 2 || myX == 0) myRefp = myReflected; + + if (x & 0x03) return; + + uInt32 currentPixel; + + if (myEffectivePattern == 0) { + currentPixel = 0; + } else if (x < TIAConstants::H_PIXEL / 2) { + currentPixel = myEffectivePattern & (1 << (x >> 2)); + } else if (myRefp) { + currentPixel = myEffectivePattern & (1 << (39 - (x >> 2))); + } else { + currentPixel = myEffectivePattern & (1 << ((x >> 2) - 20)); + } + + collision = currentPixel ? myCollisionMaskEnabled : myCollisionMaskDisabled; +} + #endif // TIA_PLAYFIELD