diff --git a/docs/graphics/launcher.png b/docs/graphics/launcher.png index 7588fa4ae..6ff519ea9 100644 Binary files a/docs/graphics/launcher.png and b/docs/graphics/launcher.png differ diff --git a/docs/graphics/rominfo_1x_large.png b/docs/graphics/rominfo_1x_large.png index d4ee3af06..828797709 100644 Binary files a/docs/graphics/rominfo_1x_large.png and b/docs/graphics/rominfo_1x_large.png differ diff --git a/docs/graphics/rominfo_1x_small.png b/docs/graphics/rominfo_1x_small.png index aed185510..93cfc7b3d 100644 Binary files a/docs/graphics/rominfo_1x_small.png and b/docs/graphics/rominfo_1x_small.png differ diff --git a/docs/graphics/rominfo_2x_small.png b/docs/graphics/rominfo_2x_small.png index 77b69ba1d..45f3b2bf4 100644 Binary files a/docs/graphics/rominfo_2x_small.png and b/docs/graphics/rominfo_2x_small.png differ diff --git a/docs/index.html b/docs/index.html index 223bc60a9..67ad5604f 100644 --- a/docs/index.html +++ b/docs/index.html @@ -273,10 +273,11 @@ Atari 2600 FPGA project, including cycle-exact audio, analog interference from mixing of audio channels, as well as stereo sound support; dynamic sound resampling is also included -
  • Emulates the Atari 2600 Joystick, Paddle, Driving, CBS Booster Grip, Sega Genesis, QuadTari controllers using your computer's keyboard, - joysticks or mouse
  • -
  • Emulates CX22/CX80 style Trak-Balls, Amiga/Atari mouse, MindLink controller and the Light Gun using your - computer's mouse
  • +
  • Emulates the Atari 2600 Joystick, Paddle, Driving, CBS Booster Grip, + Sega Genesis, Joy 2B+, + QuadTari controllers using your computer's keyboard, joysticks or mouse
  • +
  • Emulates CX22/CX80 style Trak-Balls, Amiga/Atari mouse, MindLink controller + and the Light Gun using your computer's mouse
  • Emulates the Atari 2600 Keyboard controllers using your computer's keyboard
  • Emulates Spectravideo CompuMate system using your computer's keyboard, including mapping of CompuMate 'Backspace', 'Space' and 'Enter' functionality to @@ -797,101 +798,57 @@
    -

    Joystick/Booster Grip Controller (can be remapped)

    +

    Joystick, Booster Grip (¹), Sega Genesis (²) & Joy 2B+ (³) Controller (can be remapped)

    - -
    - - - - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Left Joystick
    FunctionKeyLeft Controller KeyRight Controller Key
    Joystick UpUp Up arrow, Keypad 8
    Joystick DownDown arrow, Keypad 2
    Joystick LeftLeft arrow, Keypad 4
    Joystick RightRight arrow, Keypad 6
    Fire ButtonLeft Control, Space, Keypad 5
    Top Booster ButtonRight Shift, 4, Keypad 9
    Handle Grip TriggerRight Control, 5, Keypad 3
    -
    - - - - - - - - - - - - - + + - + + - + + - + + - + + - + +
    Right Joystick
    FunctionKey
    Joystick Up Y
    Joystick DownDownDown arrow, Keypad 2 H
    Joystick LeftLeftLeft arrow, Keypad 4 G
    Joystick RightRightRight arrow, Keypad 6 J
    Fire ButtonFire, Button 'B'Left Control, Space, Keypad 5 F
    Top Booster ButtonTop Booster Button ¹, Button 'C' ² ³Right Shift, 4, Keypad 9 6
    Handle Grip TriggerHandle Grip Trigger ¹, Button '3' ³Right Control, 5, Keypad 3 7
    @@ -900,92 +857,52 @@

    -

    Sega Genesis Controller (cannot be remapped, always associated with joystick and Booster Grip controllers)

    +

    Paddle Controller (digital emulation) (can be remapped)

    - - @@ -999,54 +916,27 @@ - -
    - - - - - + + - - + + + - - + + + - - + + + - - + + + - - + + + - - - -
    Left Pad
    FunctionKeyLeft Paddles KeyRight Paddles Key
    Pad UpSame as Left Joystick 'Up'Paddle A Turn LeftLeft arrowG
    Pad DownSame as Left Joystick 'Down'Paddle A Turn RightRight arrowJ
    Pad LeftSame as Left Joystick 'Left'Paddle A FireLeft Control, Space, Keypad 5F
    Pad RightSame as Left Joystick 'Right'Paddle B Turn LeftUp arrowY
    Button 'B'Same as Left Joystick 'Fire'Paddle B Turn RightDown arrowH
    Button 'C'Same as Left Joystick 'Top Booster Button'
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +
    Right Pad
    FunctionKey
    Pad UpSame as Right Joystick 'Up'
    Pad DownSame as Right Joystick 'Down'
    Pad LeftSame as Right Joystick 'Left'
    Pad RightSame as Right Joystick 'Right'
    Button 'B'Same as Right Joystick 'Fire'
    Button 'C'Same as Right Joystick 'Top Booster Button'Paddle B FireRight Control, 46
    - - - - - + + - + + - + - - - - - - -
    Left Driving
    FunctionKeyLeft Driving KeyRight Driving Key
    Counter ClockwiseTurn Left Left arrow, Keypad 4G
    ClockwiseTurn Right Right arrow, Keypad 6
    Fire ButtonLeft Control, Space, Keypad 5
    -
    - - - - - - - - - - - - - - - - +
    Right Driving
    FunctionKey
    Counter ClockwiseG
    Clockwise J
    Fire ButtonLeft Control, Space, Keypad 5 F
    @@ -1055,132 +945,19 @@

    -

    Trackball Controller (uses mouse, left port only)

    +

    Trackball & Light Gun Controller (uses mouse, left port only)

    - - - - + - +
    Left Trackball
    FunctionKeyLeft Trackball Key
    Fire ButtonFire Same as Left Joystick 'Fire'
    -
    -

    Light Gun Controller (uses mouse, left port only)

    - - - - - - - - - - - - - -
    Left Light Gun
    FunctionKey
    Fire ButtonSame as Left Joystick 'Fire'
    - -
    -

    Paddle Controller digital emulation (can be remapped)

    - - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Left Paddles
    FunctionKey
    Paddle A Turn LeftLeft arrow
    Paddle A Turn RightRight arrow
    Paddle A FireLeft Control, Space, Keypad 5
    Paddle B Turn LeftUp arrow
    Paddle B Turn RightDown arrow
    Paddle B FireRight Control, 4
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Right Paddles
    FunctionKey
    Paddle A Turn LeftG
    Paddle A Turn RightJ
    Paddle A FireF
    Paddle B Turn LeftY
    Paddle B Turn RightH
    Paddle B Fire6
    -
    -

    Keyboard Controller (can be remapped)

    @@ -1188,145 +965,81 @@ - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Left Keyboard
    Pad ButtonKeyLeft Keyboard KeyRight Keyboard Key
    1 18
    2 29
    3 30
    4 Q
    5W
    6E
    7A
    8S
    9D
    .Z
    0X
    #C
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + +
    Right Keyboard
    Pad ButtonKey
    18
    29
    30
    4 I
    5W O
    6E P
    7A K
    8S L
    9D ;
    .Z ,
    0X .
    #C /
    @@ -1518,7 +1231,7 @@
    -

    TV effects Keys (can be remapped)

    +

    TV Effects Keys (can be remapped)

    @@ -2192,7 +1905,6 @@ -
    Shift-Control-Alt + P to enter, Shift-Control-Alt + P/Escape to exit and continue with emulation Shift-Control-Cmd + P to enter, Shift-Control-Cmd + P/Escape to exit and continue with emulation

    @@ -2556,7 +2268,7 @@ Booster Grip ✓ - ✓ + ✓ (+ extra) ✓ (+ extra) ✕ ✓ (+ extra) @@ -2569,6 +2281,14 @@ ✕ ✕ + + Joy 2B+ + ✓ + ✓ (+ extra) + ✓ (+ extra) + ✕ + ✕ (+ extra) + Keyboard ✓ @@ -5260,6 +4980,7 @@ Ms Pac-Man (Stella extended codes): AtariVox ¹A SpeakJet based unlimited-vocabulary speech/sound synthesizer with 32K EEPROM. SaveKeyA 32K EEPROM for saving high scores, etc. (the EEPROM portion of an AtariVox). Genesis Sega Genesis controller, which can be used similar to a Booster Grip, giving an extra button. + Joy2B+ Joy 2B+ controller, which can be used similar to a Booster Grip, giving two extra buttons. CompuMate ¹Spectravideo CompuMate (if either left or right is set, CompuMate is used for both). LightgunAtari XG-1 compatible Light Gun. MindLink ¹MindLink controller. diff --git a/src/debugger/gui/Joy2BPlusWidget.cxx b/src/debugger/gui/Joy2BPlusWidget.cxx new file mode 100644 index 000000000..78775b09d --- /dev/null +++ b/src/debugger/gui/Joy2BPlusWidget.cxx @@ -0,0 +1,133 @@ +//============================================================================ +// +// SSSS tt lll lll +// SS SS tt ll ll +// SS tttttt eeee ll ll aaaa +// SSSS tt ee ee ll ll aa +// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator" +// SS SS tt ee ll ll aa aa +// SSSS ttt eeeee llll llll aaaaa +// +// Copyright (c) 1995-2022 by Bradford W. Mott, Stephen Anthony +// and the Stella Team +// +// See the file "License.txt" for information on usage and redistribution of +// this file, and for a DISCLAIMER OF ALL WARRANTIES. +//============================================================================ + +#include "Joy2BPlusWidget.hxx" + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Joy2BPlusWidget::Joy2BPlusWidget(GuiObject* boss, const GUI::Font& font, + int x, int y, Controller& controller) + : ControllerWidget(boss, font, x, y, controller) +{ + const string& label = isLeftPort() ? "Left (Joy 2B+)" : "Right (Joy 2B+)"; + + const int fontHeight = font.getFontHeight(); + int xpos = x, ypos = y, lwidth = font.getStringWidth("Right (Joy 2B+)"); + StaticTextWidget* t; + + t = new StaticTextWidget(boss, font, xpos, ypos+2, lwidth, + fontHeight, label, TextAlign::Left); + xpos += t->getWidth()/2 - 5; ypos += t->getHeight() + 10; + myPins[kJUp] = new CheckboxWidget(boss, font, xpos, ypos, "", + CheckboxWidget::kCheckActionCmd); + myPins[kJUp]->setID(kJUp); + myPins[kJUp]->setTarget(this); + + ypos += myPins[kJUp]->getHeight() * 2 + 10; + myPins[kJDown] = new CheckboxWidget(boss, font, xpos, ypos, "", + CheckboxWidget::kCheckActionCmd); + myPins[kJDown]->setID(kJDown); + myPins[kJDown]->setTarget(this); + + xpos -= myPins[kJUp]->getWidth() + 5; + ypos -= myPins[kJUp]->getHeight() + 5; + myPins[kJLeft] = new CheckboxWidget(boss, font, xpos, ypos, "", + CheckboxWidget::kCheckActionCmd); + myPins[kJLeft]->setID(kJLeft); + myPins[kJLeft]->setTarget(this); + + xpos += (myPins[kJUp]->getWidth() + 5) * 2; + myPins[kJRight] = new CheckboxWidget(boss, font, xpos, ypos, "", + CheckboxWidget::kCheckActionCmd); + myPins[kJRight]->setID(kJRight); + myPins[kJRight]->setTarget(this); + + xpos -= (myPins[kJUp]->getWidth() + 5) * 2; + ypos = 20 + (myPins[kJUp]->getHeight() + 10) * 3; + myPins[kJButtonB] = new CheckboxWidget(boss, font, xpos, ypos, "Button B", + CheckboxWidget::kCheckActionCmd); + myPins[kJButtonB]->setID(kJButtonB); + myPins[kJButtonB]->setTarget(this); + + ypos += myPins[kJButtonB]->getHeight() + 5; + myPins[kJButtonC] = new CheckboxWidget(boss, font, xpos, ypos, "Button C", + CheckboxWidget::kCheckActionCmd); + myPins[kJButtonC]->setID(kJButtonC); + myPins[kJButtonC]->setTarget(this); + + ypos += myPins[kJButtonC]->getHeight() + 5; + myPins[kJButton3] = new CheckboxWidget(boss, font, xpos, ypos, "Button 3", + CheckboxWidget::kCheckActionCmd); + myPins[kJButton3]->setID(kJButton3); + myPins[kJButton3]->setTarget(this); + + addFocusWidget(myPins[kJUp]); + addFocusWidget(myPins[kJLeft]); + addFocusWidget(myPins[kJRight]); + addFocusWidget(myPins[kJDown]); + addFocusWidget(myPins[kJButtonB]); + addFocusWidget(myPins[kJButtonC]); + addFocusWidget(myPins[kJButton3]); +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void Joy2BPlusWidget::loadConfig() +{ + myPins[kJUp]->setState(!getPin(ourPinNo[kJUp])); + myPins[kJDown]->setState(!getPin(ourPinNo[kJDown])); + myPins[kJLeft]->setState(!getPin(ourPinNo[kJLeft])); + myPins[kJRight]->setState(!getPin(ourPinNo[kJRight])); + myPins[kJButtonB]->setState(!getPin(ourPinNo[kJButtonB])); + + myPins[kJButton3]->setState( + getPin(Controller::AnalogPin::Five) == AnalogReadout::connectToGround()); + myPins[kJButtonC]->setState( + getPin(Controller::AnalogPin::Nine) == AnalogReadout::connectToGround()); +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void Joy2BPlusWidget::handleCommand( + CommandSender* sender, int cmd, int data, int id) +{ + if(cmd == CheckboxWidget::kCheckActionCmd) + { + switch(id) + { + case kJUp: + case kJDown: + case kJLeft: + case kJRight: + case kJButtonB: + setPin(ourPinNo[id], !myPins[id]->getState()); + break; + case kJButtonC: + setPin(Controller::AnalogPin::Nine, + myPins[id]->getState() ? AnalogReadout::connectToGround() + : AnalogReadout::connectToVcc()); + break; + case kJButton3: + setPin(Controller::AnalogPin::Five, + myPins[id]->getState() ? AnalogReadout::connectToGround() + : AnalogReadout::connectToVcc()); + break; + default: + break; + } + } +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +constexpr std::array Joy2BPlusWidget::ourPinNo; diff --git a/src/debugger/gui/Joy2BPlusWidget.hxx b/src/debugger/gui/Joy2BPlusWidget.hxx new file mode 100644 index 000000000..baa32400d --- /dev/null +++ b/src/debugger/gui/Joy2BPlusWidget.hxx @@ -0,0 +1,53 @@ +//============================================================================ +// +// SSSS tt lll lll +// SS SS tt ll ll +// SS tttttt eeee ll ll aaaa +// SSSS tt ee ee ll ll aa +// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator" +// SS SS tt ee ll ll aa aa +// SSSS ttt eeeee llll llll aaaaa +// +// Copyright (c) 1995-2022 by Bradford W. Mott, Stephen Anthony +// and the Stella Team +// +// See the file "License.txt" for information on usage and redistribution of +// this file, and for a DISCLAIMER OF ALL WARRANTIES. +//============================================================================ + +#ifndef JOY2BPLUS_WIDGET_HXX +#define JOY2BPLUS_WIDGET_HXX + +#include "Control.hxx" +#include "ControllerWidget.hxx" + +class Joy2BPlusWidget : public ControllerWidget +{ + public: + Joy2BPlusWidget(GuiObject* boss, const GUI::Font& font, int x, int y, + Controller& controller); + ~Joy2BPlusWidget() override = default; + + private: + enum { kJUp = 0, kJDown, kJLeft, kJRight, kJButtonB, kJButtonC, kJButton3 }; + + std::array myPins{nullptr}; + static constexpr std::array ourPinNo = {{ + Controller::DigitalPin::One, Controller::DigitalPin::Two, + Controller::DigitalPin::Three, Controller::DigitalPin::Four, + Controller::DigitalPin::Six + }}; + + private: + void loadConfig() override; + void handleCommand(CommandSender* sender, int cmd, int data, int id) override; + + // Following constructors and assignment operators not supported + Joy2BPlusWidget() = delete; + Joy2BPlusWidget(const Joy2BPlusWidget&) = delete; + Joy2BPlusWidget(Joy2BPlusWidget&&) = delete; + Joy2BPlusWidget& operator=(const Joy2BPlusWidget&) = delete; + Joy2BPlusWidget& operator=(Joy2BPlusWidget&&) = delete; +}; + +#endif diff --git a/src/debugger/gui/RiotWidget.cxx b/src/debugger/gui/RiotWidget.cxx index 9dfa26c0a..9182848ed 100644 --- a/src/debugger/gui/RiotWidget.cxx +++ b/src/debugger/gui/RiotWidget.cxx @@ -40,6 +40,7 @@ #include "AtariMouseWidget.hxx" #include "TrakBallWidget.hxx" #include "QuadTariWidget.hxx" +#include "Joy2BPlusWidget.hxx" #include "RiotWidget.hxx" @@ -537,6 +538,8 @@ ControllerWidget* RiotWidget::addControlWidget(GuiObject* boss, const GUI::Font& return new DrivingWidget(boss, font, x, y, controller); case Controller::Type::Genesis: return new GenesisWidget(boss, font, x, y, controller); + case Controller::Type::Joy2BPlus: + return new Joy2BPlusWidget(boss, font, x, y, controller); case Controller::Type::Joystick: return new JoystickWidget(boss, font, x, y, controller); case Controller::Type::Keyboard: @@ -544,14 +547,14 @@ ControllerWidget* RiotWidget::addControlWidget(GuiObject* boss, const GUI::Font& // case Controller::Type::KidVid: // TODO - implement this // case Controller::Type::MindLink: // TODO - implement this // case Controller::Type::Lightgun: // TODO - implement this + case Controller::Type::QuadTari: + return new QuadTariWidget(boss, font, x, y, controller); case Controller::Type::Paddles: return new PaddleWidget(boss, font, x, y, controller); case Controller::Type::SaveKey: return new SaveKeyWidget(boss, font, x, y, controller); case Controller::Type::TrakBall: return new TrakBallWidget(boss, font, x, y, controller); - case Controller::Type::QuadTari: - return new QuadTariWidget(boss, font, x, y, controller); default: return new NullControlWidget(boss, font, x, y, controller); } diff --git a/src/debugger/gui/module.mk b/src/debugger/gui/module.mk index 268f5566f..f0c64410c 100644 --- a/src/debugger/gui/module.mk +++ b/src/debugger/gui/module.mk @@ -56,13 +56,14 @@ MODULE_OBJS := \ src/debugger/gui/CartDebugWidget.o \ src/debugger/gui/CpuWidget.o \ src/debugger/gui/DataGridOpsWidget.o \ - src/debugger/gui/DataGridRamWidget.o \ + src/debugger/gui/DataGridRamWidget.o \ src/debugger/gui/DataGridWidget.o \ src/debugger/gui/DebuggerDialog.o \ src/debugger/gui/DelayQueueWidget.o \ src/debugger/gui/DrivingWidget.o \ src/debugger/gui/FlashWidget.o \ src/debugger/gui/GenesisWidget.o \ + src/debugger/gui/Joy2BPlusWidget.o \ src/debugger/gui/JoystickWidget.o \ src/debugger/gui/KeyboardWidget.o \ src/debugger/gui/PaddleWidget.o \ diff --git a/src/emucore/Booster.cxx b/src/emucore/Booster.cxx index 6abb6f76f..bf0413271 100644 --- a/src/emucore/Booster.cxx +++ b/src/emucore/Booster.cxx @@ -23,13 +23,13 @@ BoosterGrip::BoosterGrip(Jack jack, const Event& event, const System& system) { if(myJack == Jack::Left) { - myTriggerEvent = Event::LeftJoystickFire5; - myBoosterEvent = Event::LeftJoystickFire9; + myBoosterEvent = Event::LeftJoystickFire5; + myTriggerEvent = Event::LeftJoystickFire9; } else { - myTriggerEvent = Event::RightJoystickFire5; - myBoosterEvent = Event::RightJoystickFire9; + myBoosterEvent = Event::RightJoystickFire5; + myTriggerEvent = Event::RightJoystickFire9; } setPin(AnalogPin::Five, AnalogReadout::disconnect()); @@ -48,6 +48,6 @@ void BoosterGrip::updateButtons() updateMouseButtons(firePressed, boosterPressed); setPin(DigitalPin::Six, !getAutoFireState(firePressed)); - setPin(AnalogPin::Five, triggerPressed ? AnalogReadout::connectToVcc() : AnalogReadout::disconnect()); - setPin(AnalogPin::Nine, boosterPressed ? AnalogReadout::connectToVcc() : AnalogReadout::disconnect()); + setPin(AnalogPin::Five, boosterPressed ? AnalogReadout::connectToVcc() : AnalogReadout::disconnect()); + setPin(AnalogPin::Nine, triggerPressed ? AnalogReadout::connectToVcc() : AnalogReadout::disconnect()); } diff --git a/src/emucore/Console.cxx b/src/emucore/Console.cxx index c45949b0b..edb160d1e 100644 --- a/src/emucore/Console.cxx +++ b/src/emucore/Console.cxx @@ -40,6 +40,7 @@ #include "TrakBall.hxx" #include "Lightgun.hxx" #include "QuadTari.hxx" +#include "Joy2BPlus.hxx" #include "M6502.hxx" #include "M6532.hxx" #include "TIA.hxx" @@ -1015,6 +1016,10 @@ unique_ptr Console::getControllerPort(const Controller::Type type, controller = make_unique(port, myOSystem, *mySystem, myProperties); break; + case Controller::Type::Joy2BPlus: + controller = make_unique(port, myEvent, *mySystem); + break; + default: // What else can we do? // always create because it may have been changed by user dialog diff --git a/src/emucore/Control.cxx b/src/emucore/Control.cxx index 7fd196b8c..7ffc779be 100644 --- a/src/emucore/Control.cxx +++ b/src/emucore/Control.cxx @@ -111,7 +111,7 @@ string Controller::getName(const Type type) "Amiga mouse", "Atari mouse", "AtariVox", "Booster Grip", "CompuMate", "Driving", "Sega Genesis", "Joystick", "Keyboard", "Kid Vid", "MindLink", "Paddles", "Paddles_IAxis", "Paddles_IAxDr", "SaveKey", "Trak-Ball", - "Light Gun", "QuadTari" + "Light Gun", "QuadTari", "Joy 2B+" }; return NAMES[static_cast(type)]; @@ -126,7 +126,7 @@ string Controller::getPropName(const Type type) "AMIGAMOUSE", "ATARIMOUSE", "ATARIVOX", "BOOSTERGRIP", "COMPUMATE", "DRIVING", "GENESIS", "JOYSTICK", "KEYBOARD", "KIDVID", "MINDLINK", "PADDLES", "PADDLES_IAXIS", "PADDLES_IAXDR", "SAVEKEY", "TRAKBALL", - "LIGHTGUN", "QUADTARI" + "LIGHTGUN", "QUADTARI", "JOY2B+" }; return PROP_NAMES[static_cast(type)]; diff --git a/src/emucore/Control.hxx b/src/emucore/Control.hxx index a687ef689..62e1b8747 100644 --- a/src/emucore/Control.hxx +++ b/src/emucore/Control.hxx @@ -102,7 +102,7 @@ class Controller : public Serializable AmigaMouse, AtariMouse, AtariVox, BoosterGrip, CompuMate, Driving, Genesis, Joystick, Keyboard, KidVid, MindLink, Paddles, PaddlesIAxis, PaddlesIAxDr, SaveKey, TrakBall, - Lightgun, QuadTari, + Lightgun, QuadTari, Joy2BPlus, LastType }; diff --git a/src/emucore/ControllerDetector.cxx b/src/emucore/ControllerDetector.cxx index 1af47811d..5bf9b2986 100644 --- a/src/emucore/ControllerDetector.cxx +++ b/src/emucore/ControllerDetector.cxx @@ -71,8 +71,10 @@ Controller::Type ControllerDetector::autodetectPort( type = Controller::Type::AtariMouse; else if(isProbablyAmigaMouse(image, size)) type = Controller::Type::AmigaMouse; - else if(usesKeyboard(image, size, port)) - type = Controller::Type::Keyboard; + else if(usesKeyboard(image, size, port)) // must be detected before Genesis! + type = usesJoystickDirections(image, size) + ? Controller::Type::Joy2BPlus + : Controller::Type::Keyboard; else if(usesGenesisButton(image, size, port)) type = Controller::Type::Genesis; else if(isProbablyLightGun(image, size, port)) @@ -248,6 +250,31 @@ bool ControllerDetector::usesJoystickButton(const ByteBuffer& image, size_t size return false; } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +// Returns true if the port's joystick direction access code is found. +bool ControllerDetector::usesJoystickDirections(const ByteBuffer& image, size_t size) +{ + // check for SWCHA access (both ports) + static constexpr int NUM_SIGS = 8; + static constexpr int SIG_SIZE = 3; + static constexpr uInt8 signature[NUM_SIGS][SIG_SIZE] = { + { 0xad, 0x80, 0x02 }, // lda SWCHA (also found in MagiCard, so this needs properties now!) + { 0xae, 0x80, 0x02 }, // ldx SWCHA + { 0xac, 0x80, 0x02 }, // ldy SWCHA + { 0x2c, 0x80, 0x02 }, // bit SWCHA + { 0x0d, 0x80, 0x02 }, // ora SWCHA (Official Frogger) + { 0x2d, 0x80, 0x02 }, // and SWCHA (Crypts of Chaos, some paddle games) + { 0x4d, 0x80, 0x02 }, // eor SWCHA (Chopper Command) + { 0xad, 0x88, 0x02 }, // lda SWCHA|8 (Jawbreaker) + }; + + for(uInt32 i = 0; i < NUM_SIGS; ++i) + if(searchForBytes(image, size, signature[i], SIG_SIZE)) + return true; + + return false; +} + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bool ControllerDetector::usesKeyboard(const ByteBuffer& image, size_t size, Controller::Jack port) @@ -255,7 +282,7 @@ bool ControllerDetector::usesKeyboard(const ByteBuffer& image, size_t size, if(port == Controller::Jack::Left) { // check for INPT0 *AND* INPT1 access - static constexpr int NUM_SIGS_0_0 = 6; + static constexpr int NUM_SIGS_0_0 = 7; static constexpr int SIG_SIZE_0_0 = 3; static constexpr uInt8 signature_0_0[NUM_SIGS_0_0][SIG_SIZE_0_0] = { { 0x24, 0x38, 0x30 }, // bit INPT0|$30; bmi @@ -263,6 +290,7 @@ bool ControllerDetector::usesKeyboard(const ByteBuffer& image, size_t size, { 0xa4, 0x38, 0x30 }, // ldy INPT0|$30; bmi { 0xb5, 0x38, 0x30 }, // lda INPT0|$30,x; bmi { 0x24, 0x08, 0x30 }, // bit INPT0; bmi + { 0x24, 0x08, 0x10 }, // bit INPT0; bpl (Tap-A-Mole, also e.g. Chopper Command, Secret Quest, River Raid II) { 0xa6, 0x08, 0x30 } // ldx INPT0; bmi }; static constexpr int NUM_SIGS_0_2 = 1; @@ -271,7 +299,7 @@ bool ControllerDetector::usesKeyboard(const ByteBuffer& image, size_t size, { 0xb5, 0x38, 0x29, 0x80, 0xd0 } // lda INPT0,x; and #80; bne }; - static constexpr int NUM_SIGS_1_0 = 7; + static constexpr int NUM_SIGS_1_0 = 8; static constexpr int SIG_SIZE_1_0 = 3; static constexpr uInt8 signature_1_0[NUM_SIGS_1_0][SIG_SIZE_1_0] = { { 0x24, 0x39, 0x10 }, // bit INPT1|$30; bpl @@ -280,6 +308,7 @@ bool ControllerDetector::usesKeyboard(const ByteBuffer& image, size_t size, { 0xa4, 0x39, 0x30 }, // ldy INPT1|$30; bmi { 0xb5, 0x38, 0x30 }, // lda INPT0|$30,x; bmi { 0x24, 0x09, 0x30 }, // bit INPT1; bmi + { 0x24, 0x09, 0x10 }, // bit INPT1; bpl (Tap-A-Mole and some Genesis games) { 0xa6, 0x09, 0x30 } // ldx INPT1; bmi }; static constexpr int NUM_SIGS_1_2 = 1; diff --git a/src/emucore/ControllerDetector.hxx b/src/emucore/ControllerDetector.hxx index 0fbaeeeca..8c7634674 100644 --- a/src/emucore/ControllerDetector.hxx +++ b/src/emucore/ControllerDetector.hxx @@ -92,6 +92,9 @@ class ControllerDetector static bool usesJoystickButton(const ByteBuffer& image, size_t size, Controller::Jack port); + // Returns true if joystick direction access code is found. + static bool usesJoystickDirections(const ByteBuffer& image, size_t size); + // Returns true if the port's keyboard access code is found. static bool usesKeyboard(const ByteBuffer& image, size_t size, Controller::Jack port); diff --git a/src/emucore/DefProps.hxx b/src/emucore/DefProps.hxx index ad0eca731..fac824d9f 100644 --- a/src/emucore/DefProps.hxx +++ b/src/emucore/DefProps.hxx @@ -840,7 +840,7 @@ static constexpr BSPF::array2D DefProps = {{ { "393e41ca8bdd35b52bf6256a968a9b89", "U.S. Games Corporation - Western Technologies, John Hall", "VC1012", "M.A.D. (1983) (U.S. Games)", "AKA Missile Intercept, Mutually Assured Destruction", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" }, { "3947eb7305b0c904256cdbc5c5956c0f", "Jone Yuan Telephonic Enterprise Co", "", "Lilly Adventure (Jone Yuan)", "2600 Screen Search Console", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" }, { "396f7bc90ab4fa4975f8c74abe4e81f0", "Atari, Larry Kaplan - Sears", "CX2612 - 99804, 49-75103", "Street Racer (1977) (Atari)", "Uses the Paddle Controllers (swapped)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "YES", "", "", "AUTO 60", "", "", "", "" }, - { "3974e2d1f614fbd3a092533ecae2e84d", "Alessandro Ciceri", "", "MagiCard+ (alex_79) WIP_20150118", "MagiCard hack", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" }, + { "3974e2d1f614fbd3a092533ecae2e84d", "Alessandro Ciceri", "", "MagiCard+ (alex_79) WIP_20150118", "MagiCard hack", "", "", "", "", "", "", "", "", "", "", "KEYBOARD", "", "", "KEYBOARD", "", "", "", "", "", "", "", "", "", "" }, { "39790a2e9030751d7db414e13f1b6960", "", "", "Robotfindskitten2600 (26-04-2003) (Jeremy Penner) [a1]", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" }, { "39a6a5a2e1f6297cceaa48bb03af02e9", "", "", "Pitfall 2 Plus (Hack)", "Hack of Pitfall 2", "Hack", "", "", "", "{\"score_addresses\":[\"0xc7\",\"0xc8\",\"0xc9\"],\"score_digits\":6,\"variations_count\":1}", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" }, { "39b94d41bd3b01c12b4054c1a8733783", "SOLID Corp. (D. Scott Williamson)", "CX2655-016", "Star Castle 2600 (SolidCorp) [016]", "", "Homebrew", "", "", "", "", "http://starcastle2600.blogspot.com/p/star-castle-2600-story.html", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "YES", "" }, @@ -1751,7 +1751,7 @@ static constexpr BSPF::array2D DefProps = {{ { "78297db7f416af3052dd793b53ff014e", "", "", "Poker Squares (V0.17) (2001) (B. Watson)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" }, { "7836794b79e8060c2b8326a2db74eef0", "", "", "RIOT RAM Test (26-11-2002) (Dennis Debro)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" }, { "784176346e9422733d55c427230e5bad", "Activision, Alex DeMeo", "", "Title Match Pro Wrestling (1989) (Activision)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" }, - { "784abfdb31d5341e5bd404d8d2a71c3b", "Alessandro Ciceri", "", "MagiCard (TV format conversion) (alex_79) (PAL)", "MagiCard PAL conversion hack", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" }, + { "784abfdb31d5341e5bd404d8d2a71c3b", "Alessandro Ciceri", "", "MagiCard (TV format conversion) (alex_79) (PAL)", "MagiCard PAL conversion hack", "", "", "", "", "", "", "", "", "", "", "KEYBOARD", "", "", "KEYBOARD", "", "", "", "", "", "", "", "", "", "" }, { "7860716fa5dbc0fffab93fb9a4cb4132", "", "", "Hangman Monkey Wordlist (Hack)", "Hack of Hangman", "Hack", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" }, { "7867ee819b53d69cfcfe740f7ddca574", "Arcadia Corporation, Dennis Caswell", "1 AR-4000, AR-4100", "Phaser Patrol (1982) (Arcadia) (Prototype)", "", "Prototype", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "YES", "" }, { "787ebc2609a31eb5c57c4a18837d1aee", "Brian Prescott", "", "Vault Assault (19xx) (Brian Prescott)", "", "", "", "", "", "", "https://atariage.com/store/index.php?l=product_detail&p=113", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" }, @@ -1833,7 +1833,7 @@ static constexpr BSPF::array2D DefProps = {{ { "7d93071b3e3616093a6b5a98b0315751", "", "", "Gunfight 2600 - Music & Bugfixes 2 (2001) (Manuel Rotschkar)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" }, { "7d940d749e55b96b7b746519fa06f2de", "Arcadia Corporation, Dennis Caswell", "AR-4302", "Party Mix (Preview) (1983) (Arcadia) (PAL)", "Uses the Paddle Controllers", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" }, { "7d9c96b215d1941e87b6fb412eb9204f", "", "", "Othello (Unknown) (PAL) (4K)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" }, - { "7da9de8d62fcdd3a2c545b2e720c2a61", "CommaVid, John Bronstein", "CM-001", "MagiCard (1981) (CommaVid) (4K)", "Uses the Keyboard Controllers", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" }, + { "7da9de8d62fcdd3a2c545b2e720c2a61", "CommaVid, John Bronstein", "CM-001", "MagiCard (1981) (CommaVid) (4K)", "Uses the Keyboard Controllers", "", "", "", "", "", "", "", "", "", "", "KEYBOARD", "", "", "KEYBOARD", "", "", "", "", "", "", "", "", "", "" }, { "7dbc8fa2e488e3f6b87fbe0f76c5b89f", "Ed Federmeyer", "", "Sound X (1996) (Ed Federmeyer)", "", "Extremely Rare", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" }, { "7dc03a1f56d0e6a8aae3e3e50d654a08", "", "", "Hozer Video Demo (PD)", "", "New Release", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" }, { "7dcbfd2acc013e817f011309c7504daa", "Arcadia Corporation, Dennis Caswell", "AR-4000, AR-4100", "Phaser Patrol (1982) (Arcadia)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "YES", "" }, @@ -2903,7 +2903,7 @@ static constexpr BSPF::array2D DefProps = {{ { "cdb81bf33d830ee4ee0606ee99e84dba", "Arcadia Corporation, Scott Nelson", "AR-4300", "Fireball (1982) (Arcadia) (PAL)", "Uses the Paddle Controllers", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "15", "15", "01", "", "", "", "" }, { "cdc1a5c61d7488eadc9aba36166b253d", "Retroactive", "", "Qb (V0.12) (Stella) (2001) (Retroactive)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "YES", "" }, { "cdd4a538c420358ab64767d326921bf6", "", "", "4 in 1 (Logitachi)", "", "", "", "", "4IN1", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" }, - { "cddabfd68363a76cd30bee4e8094c646", "Computer Magic - CommaVid, John Bronstein", "CM-001", "MagiCard (1981) (CommaVid)", "Uses the Keyboard Controllers", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" }, + { "cddabfd68363a76cd30bee4e8094c646", "Computer Magic - CommaVid, John Bronstein", "CM-001", "MagiCard (1981) (CommaVid)", "Uses the Keyboard Controllers", "", "", "", "", "", "", "", "", "", "", "KEYBOARD", "", "", "KEYBOARD", "", "", "", "", "", "", "", "", "", "" }, { "ce17325834bf8b0a0d0d8de08478d436", "", "", "Boring Freeway (Hack)", "Hack of Freeway", "Hack", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" }, { "ce1cbe159b9ae5992dacf09371de5e13", "Atari - GCC, Kevin Osborn", "CX2689", "Kangaroo (01-19-1983) (Atari) (Prototype)", "", "Prototype", "", "", "", "", "http://www.atariprotos.com/2600/software/kangaroo/kangaroo.htm", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" }, { "ce243747bf34a2de366f846b3f4ca772", "Home Vision - Gem International Corp. - VDI", "", "Jacky Jump (1983) (Home Vision) (PAL)", "AKA Bobby Is Going Home", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" }, @@ -3265,7 +3265,7 @@ static constexpr BSPF::array2D DefProps = {{ { "e556e07cc06c803f2955986f53ef63ed", "Coleco - Individeo, Ed Temple", "2665", "Front Line (1984) (Coleco)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" }, { "e558be88eef569f33716e8e330d2f5bc", "Shock Vision", "", "Keystone Kapers (Shock Vision)", "", "", "", "", "", "{\"score_addresses\":[\"0x9a\",\"0x9b\",\"0x9c\"],\"score_digits\":6,\"variations_count\":1}", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" }, { "e56da674188ba2f02c7a0a343a01236f", "", "", "This Planet Sucks Demo 4 (Greg Troutman) (PD)", "", "New Release", "", "", "", "", "https://atariage.com/store/index.php?l=product_detail&p=102", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" }, - { "e59d022d524d05acc19515598c831e4d", "Alessandro Ciceri", "", "MagiCard+ (alex_79) WIP_20150118 (PAL)", "MagiCard hack", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" }, + { "e59d022d524d05acc19515598c831e4d", "Alessandro Ciceri", "", "MagiCard+ (alex_79) WIP_20150118 (PAL)", "MagiCard hack", "", "", "", "", "", "", "", "", "", "", "KEYBOARD", "", "", "KEYBOARD", "", "", "", "", "", "", "", "", "", "" }, { "e5a6e0bb7d56e2f08b237e15076e5699", "", "", "Color Table Display Helper (PD)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" }, { "e5bacf526036d3c8c99db5b030cf00e7", "", "", "Starmaster (Genesis)", "Genesis controller (C switches to map mode)", "Hack of Starmaster", "", "", "", "{\"notes\":\"Score only calculated when game is over\",\"score_addresses\":[\"0xc1\",\"0xc2\"],\"variations_address\":\"0x80\",\"variations_count\":4,\"variations_zero_based\":true}", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" }, { "e5d5085123a98c1e61818caa2971e999", "", "", "Euchre (PAL) (Erik Eid) (PD)", "", "", "", "", "", "", "https://atariage.com/store/index.php?l=product_detail&p=126", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" }, diff --git a/src/emucore/EventHandler.cxx b/src/emucore/EventHandler.cxx index 83468338c..a635cd5de 100644 --- a/src/emucore/EventHandler.cxx +++ b/src/emucore/EventHandler.cxx @@ -2784,327 +2784,332 @@ void EventHandler::exitEmulation(bool checkLauncher) } } +#if defined(__clang__) + #pragma clang diagnostic ignored "-Wmissing-field-initializers" +#elif defined(__GNUC__) || defined(__GNUG__) + #pragma GCC diagnostic ignored "-Wmissing-field-initializers" +#endif // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - EventHandler::EmulActionList EventHandler::ourEmulActionList = { { - { Event::Quit, "Quit", "" }, - { Event::ReloadConsole, "Reload current ROM/load next game", "" }, - { Event::PreviousMultiCartRom, "Load previous multicart game", "" }, - { Event::ExitMode, "Exit current Stella menu/mode", "" }, - { Event::OptionsMenuMode, "Enter Options menu UI", "" }, - { Event::CmdMenuMode, "Toggle Commands menu UI", "" }, - { Event::HighScoresMenuMode, "Toggle High Scores UI", "" }, - { Event::PlusRomsSetupMode, "Toggle PlusROMs setup UI", "" }, - { Event::TogglePauseMode, "Toggle Pause mode", "" }, - { Event::StartPauseMode, "Start Pause mode", "" }, - { Event::Fry, "Fry cartridge", "" }, - { Event::DecreaseSpeed, "Decrease emulation speed", "" }, - { Event::IncreaseSpeed, "Increase emulation speed", "" }, - { Event::ToggleTurbo, "Toggle 'Turbo' mode", "" }, - { Event::DebuggerMode, "Toggle Debugger mode", "" }, + { Event::Quit, "Quit" }, + { Event::ReloadConsole, "Reload current ROM/load next game" }, + { Event::PreviousMultiCartRom, "Load previous multicart game" }, + { Event::ExitMode, "Exit current Stella menu/mode" }, + { Event::OptionsMenuMode, "Enter Options menu UI" }, + { Event::CmdMenuMode, "Toggle Commands menu UI" }, + { Event::HighScoresMenuMode, "Toggle High Scores UI" }, + { Event::PlusRomsSetupMode, "Toggle PlusROMs setup UI" }, + { Event::TogglePauseMode, "Toggle Pause mode" }, + { Event::StartPauseMode, "Start Pause mode" }, + { Event::Fry, "Fry cartridge" }, + { Event::DecreaseSpeed, "Decrease emulation speed" }, + { Event::IncreaseSpeed, "Increase emulation speed" }, + { Event::ToggleTurbo, "Toggle 'Turbo' mode" }, + { Event::DebuggerMode, "Toggle Debugger mode" }, - { Event::ConsoleSelect, "Select", "" }, - { Event::ConsoleReset, "Reset", "" }, - { Event::ConsoleColor, "Color TV", "" }, - { Event::ConsoleBlackWhite, "Black & White TV", "" }, - { Event::ConsoleColorToggle, "Toggle Color / B&W TV", "" }, - { Event::Console7800Pause, "7800 Pause Key", "" }, - { Event::ConsoleLeftDiffA, "Left Difficulty A", "" }, - { Event::ConsoleLeftDiffB, "Left Difficulty B", "" }, - { Event::ConsoleLeftDiffToggle, "Toggle Left Difficulty", "" }, - { Event::ConsoleRightDiffA, "Right Difficulty A", "" }, - { Event::ConsoleRightDiffB, "Right Difficulty B", "" }, - { Event::ConsoleRightDiffToggle, "Toggle Right Difficulty", "" }, - { Event::SaveState, "Save state", "" }, - { Event::SaveAllStates, "Save all TM states of current game", "" }, - { Event::PreviousState, "Change to previous state slot", "" }, - { Event::NextState, "Change to next state slot", "" }, - { Event::ToggleAutoSlot, "Toggle automatic state slot change", "" }, - { Event::LoadState, "Load state", "" }, - { Event::LoadAllStates, "Load saved TM states for current game", "" }, + { Event::ConsoleSelect, "Select" }, + { Event::ConsoleReset, "Reset" }, + { Event::ConsoleColor, "Color TV" }, + { Event::ConsoleBlackWhite, "Black & White TV" }, + { Event::ConsoleColorToggle, "Toggle Color / B&W TV" }, + { Event::Console7800Pause, "7800 Pause Key" }, + { Event::ConsoleLeftDiffA, "Left Difficulty A" }, + { Event::ConsoleLeftDiffB, "Left Difficulty B" }, + { Event::ConsoleLeftDiffToggle, "Toggle Left Difficulty" }, + { Event::ConsoleRightDiffA, "Right Difficulty A" }, + { Event::ConsoleRightDiffB, "Right Difficulty B" }, + { Event::ConsoleRightDiffToggle, "Toggle Right Difficulty" }, + { Event::SaveState, "Save state" }, + { Event::SaveAllStates, "Save all TM states of current game" }, + { Event::PreviousState, "Change to previous state slot" }, + { Event::NextState, "Change to next state slot" }, + { Event::ToggleAutoSlot, "Toggle automatic state slot change" }, + { Event::LoadState, "Load state" }, + { Event::LoadAllStates, "Load saved TM states for current game" }, #ifdef PNG_SUPPORT - { Event::TakeSnapshot, "Snapshot", "" }, - { Event::ToggleContSnapshots, "Save continuous snapsh. (as defined)", "" }, - { Event::ToggleContSnapshotsFrame,"Save continuous snapsh. (every frame)", "" }, + { Event::TakeSnapshot, "Snapshot" }, + { Event::ToggleContSnapshots, "Save continuous snapsh. (as defined)" }, + { Event::ToggleContSnapshotsFrame,"Save continuous snapsh. (every frame)" }, #endif // Global keys: - { Event::PreviousSettingGroup, "Select previous setting group", "" }, - { Event::NextSettingGroup, "Select next setting group", "" }, - { Event::PreviousSetting, "Select previous setting", "" }, - { Event::NextSetting, "Select next setting", "" }, - { Event::SettingDecrease, "Decrease current setting", "" }, - { Event::SettingIncrease, "Increase current setting", "" }, + { Event::PreviousSettingGroup, "Select previous setting group" }, + { Event::NextSettingGroup, "Select next setting group" }, + { Event::PreviousSetting, "Select previous setting" }, + { Event::NextSetting, "Select next setting" }, + { Event::SettingDecrease, "Decrease current setting" }, + { Event::SettingIncrease, "Increase current setting" }, // Controllers: - { Event::LeftJoystickUp, "Left Joystick Up", "" }, - { Event::LeftJoystickDown, "Left Joystick Down", "" }, - { Event::LeftJoystickLeft, "Left Joystick Left", "" }, - { Event::LeftJoystickRight, "Left Joystick Right", "" }, - { Event::LeftJoystickFire, "Left Joystick Fire", "" }, - { Event::LeftJoystickFire5, "Left Booster Top Booster Button", "" }, - { Event::LeftJoystickFire9, "Left Booster Handle Grip Trigger", "" }, + { Event::LeftJoystickUp, "Left Joystick Up" }, + { Event::LeftJoystickDown, "Left Joystick Down" }, + { Event::LeftJoystickLeft, "Left Joystick Left" }, + { Event::LeftJoystickRight, "Left Joystick Right" }, + { Event::LeftJoystickFire, "Left Joystick Fire" }, + { Event::LeftJoystickFire5, "Left Top Booster Button, Button 'C'" }, + { Event::LeftJoystickFire9, "Left Handle Grip Trigger, Button '3'" }, - { Event::RightJoystickUp, "Right Joystick Up", "" }, - { Event::RightJoystickDown, "Right Joystick Down", "" }, - { Event::RightJoystickLeft, "Right Joystick Left", "" }, - { Event::RightJoystickRight, "Right Joystick Right", "" }, - { Event::RightJoystickFire, "Right Joystick Fire", "" }, - { Event::RightJoystickFire5, "Right Booster Top Booster Button", "" }, - { Event::RightJoystickFire9, "Right Booster Handle Grip Trigger", "" }, + { Event::RightJoystickUp, "Right Joystick Up" }, + { Event::RightJoystickDown, "Right Joystick Down" }, + { Event::RightJoystickLeft, "Right Joystick Left" }, + { Event::RightJoystickRight, "Right Joystick Right" }, + { Event::RightJoystickFire, "Right Joystick Fire" }, + { Event::RightJoystickFire5, "Right Top Booster Button, Button 'C'" }, + { Event::RightJoystickFire9, "Right Handle Grip Trigger, Button '3'" }, - { Event::QTJoystickThreeUp, "QuadTari Joystick 3 Up", "" }, - { Event::QTJoystickThreeDown, "QuadTari Joystick 3 Down", "" }, - { Event::QTJoystickThreeLeft, "QuadTari Joystick 3 Left", "" }, - { Event::QTJoystickThreeRight, "QuadTari Joystick 3 Right", "" }, - { Event::QTJoystickThreeFire, "QuadTari Joystick 3 Fire", "" }, + { Event::QTJoystickThreeUp, "QuadTari Joystick 3 Up" }, + { Event::QTJoystickThreeDown, "QuadTari Joystick 3 Down" }, + { Event::QTJoystickThreeLeft, "QuadTari Joystick 3 Left" }, + { Event::QTJoystickThreeRight, "QuadTari Joystick 3 Right" }, + { Event::QTJoystickThreeFire, "QuadTari Joystick 3 Fire" }, - { Event::QTJoystickFourUp, "QuadTari Joystick 4 Up", "" }, - { Event::QTJoystickFourDown, "QuadTari Joystick 4 Down", "" }, - { Event::QTJoystickFourLeft, "QuadTari Joystick 4 Left", "" }, - { Event::QTJoystickFourRight, "QuadTari Joystick 4 Right", "" }, - { Event::QTJoystickFourFire, "QuadTari Joystick 4 Fire", "" }, + { Event::QTJoystickFourUp, "QuadTari Joystick 4 Up" }, + { Event::QTJoystickFourDown, "QuadTari Joystick 4 Down" }, + { Event::QTJoystickFourLeft, "QuadTari Joystick 4 Left" }, + { Event::QTJoystickFourRight, "QuadTari Joystick 4 Right" }, + { Event::QTJoystickFourFire, "QuadTari Joystick 4 Fire" }, - { Event::LeftPaddleAAnalog, "Left Paddle A Analog", "" }, - { Event::LeftPaddleAIncrease, "Left Paddle A Turn Left", "" }, - { Event::LeftPaddleADecrease, "Left Paddle A Turn Right", "" }, - { Event::LeftPaddleAFire, "Left Paddle A Fire", "" }, + { Event::LeftPaddleAAnalog, "Left Paddle A Analog" }, + { Event::LeftPaddleAIncrease, "Left Paddle A Turn Left" }, + { Event::LeftPaddleADecrease, "Left Paddle A Turn Right" }, + { Event::LeftPaddleAFire, "Left Paddle A Fire" }, - { Event::LeftPaddleBAnalog, "Left Paddle B Analog", "" }, - { Event::LeftPaddleBIncrease, "Left Paddle B Turn Left", "" }, - { Event::LeftPaddleBDecrease, "Left Paddle B Turn Right", "" }, - { Event::LeftPaddleBFire, "Left Paddle B Fire", "" }, + { Event::LeftPaddleBAnalog, "Left Paddle B Analog" }, + { Event::LeftPaddleBIncrease, "Left Paddle B Turn Left" }, + { Event::LeftPaddleBDecrease, "Left Paddle B Turn Right" }, + { Event::LeftPaddleBFire, "Left Paddle B Fire" }, - { Event::RightPaddleAAnalog, "Right Paddle A Analog", "" }, - { Event::RightPaddleAIncrease, "Right Paddle A Turn Left", "" }, - { Event::RightPaddleADecrease, "Right Paddle A Turn Right", "" }, - { Event::RightPaddleAFire, "Right Paddle A Fire", "" }, + { Event::RightPaddleAAnalog, "Right Paddle A Analog" }, + { Event::RightPaddleAIncrease, "Right Paddle A Turn Left" }, + { Event::RightPaddleADecrease, "Right Paddle A Turn Right" }, + { Event::RightPaddleAFire, "Right Paddle A Fire" }, - { Event::RightPaddleBAnalog, "Right Paddle B Analog", "" }, - { Event::RightPaddleBIncrease, "Right Paddle B Turn Left", "" }, - { Event::RightPaddleBDecrease, "Right Paddle B Turn Right", "" }, - { Event::RightPaddleBFire, "Right Paddle B Fire", "" }, + { Event::RightPaddleBAnalog, "Right Paddle B Analog" }, + { Event::RightPaddleBIncrease, "Right Paddle B Turn Left" }, + { Event::RightPaddleBDecrease, "Right Paddle B Turn Right" }, + { Event::RightPaddleBFire, "Right Paddle B Fire" }, - { Event::QTPaddle3AFire, "QuadTari Paddle 3A Fire", "" }, - { Event::QTPaddle3BFire, "QuadTari Paddle 3B Fire", "" }, - { Event::QTPaddle4AFire, "QuadTari Paddle 4A Fire", "" }, - { Event::QTPaddle4BFire, "QuadTari Paddle 4B Fire", "" }, + { Event::QTPaddle3AFire, "QuadTari Paddle 3A Fire" }, + { Event::QTPaddle3BFire, "QuadTari Paddle 3B Fire" }, + { Event::QTPaddle4AFire, "QuadTari Paddle 4A Fire" }, + { Event::QTPaddle4BFire, "QuadTari Paddle 4B Fire" }, - { Event::LeftKeyboard1, "Left Keyboard 1", "" }, - { Event::LeftKeyboard2, "Left Keyboard 2", "" }, - { Event::LeftKeyboard3, "Left Keyboard 3", "" }, - { Event::LeftKeyboard4, "Left Keyboard 4", "" }, - { Event::LeftKeyboard5, "Left Keyboard 5", "" }, - { Event::LeftKeyboard6, "Left Keyboard 6", "" }, - { Event::LeftKeyboard7, "Left Keyboard 7", "" }, - { Event::LeftKeyboard8, "Left Keyboard 8", "" }, - { Event::LeftKeyboard9, "Left Keyboard 9", "" }, - { Event::LeftKeyboardStar, "Left Keyboard *", "" }, - { Event::LeftKeyboard0, "Left Keyboard 0", "" }, - { Event::LeftKeyboardPound, "Left Keyboard #", "" }, + { Event::LeftKeyboard1, "Left Keyboard 1" }, + { Event::LeftKeyboard2, "Left Keyboard 2" }, + { Event::LeftKeyboard3, "Left Keyboard 3" }, + { Event::LeftKeyboard4, "Left Keyboard 4" }, + { Event::LeftKeyboard5, "Left Keyboard 5" }, + { Event::LeftKeyboard6, "Left Keyboard 6" }, + { Event::LeftKeyboard7, "Left Keyboard 7" }, + { Event::LeftKeyboard8, "Left Keyboard 8" }, + { Event::LeftKeyboard9, "Left Keyboard 9" }, + { Event::LeftKeyboardStar, "Left Keyboard *" }, + { Event::LeftKeyboard0, "Left Keyboard 0" }, + { Event::LeftKeyboardPound, "Left Keyboard #" }, - { Event::RightKeyboard1, "Right Keyboard 1", "" }, - { Event::RightKeyboard2, "Right Keyboard 2", "" }, - { Event::RightKeyboard3, "Right Keyboard 3", "" }, - { Event::RightKeyboard4, "Right Keyboard 4", "" }, - { Event::RightKeyboard5, "Right Keyboard 5", "" }, - { Event::RightKeyboard6, "Right Keyboard 6", "" }, - { Event::RightKeyboard7, "Right Keyboard 7", "" }, - { Event::RightKeyboard8, "Right Keyboard 8", "" }, - { Event::RightKeyboard9, "Right Keyboard 9", "" }, - { Event::RightKeyboardStar, "Right Keyboard *", "" }, - { Event::RightKeyboard0, "Right Keyboard 0", "" }, - { Event::RightKeyboardPound, "Right Keyboard #", "" }, + { Event::RightKeyboard1, "Right Keyboard 1" }, + { Event::RightKeyboard2, "Right Keyboard 2" }, + { Event::RightKeyboard3, "Right Keyboard 3" }, + { Event::RightKeyboard4, "Right Keyboard 4" }, + { Event::RightKeyboard5, "Right Keyboard 5" }, + { Event::RightKeyboard6, "Right Keyboard 6" }, + { Event::RightKeyboard7, "Right Keyboard 7" }, + { Event::RightKeyboard8, "Right Keyboard 8" }, + { Event::RightKeyboard9, "Right Keyboard 9" }, + { Event::RightKeyboardStar, "Right Keyboard *" }, + { Event::RightKeyboard0, "Right Keyboard 0" }, + { Event::RightKeyboardPound, "Right Keyboard #" }, - { Event::LeftDrivingAnalog, "Left Driving Analog", "" }, - { Event::LeftDrivingCCW, "Left Driving Turn Left", "" }, - { Event::LeftDrivingCW, "Left Driving Turn Right", "" }, - { Event::LeftDrivingFire, "Left Driving Fire", "" }, + { Event::LeftDrivingAnalog, "Left Driving Analog" }, + { Event::LeftDrivingCCW, "Left Driving Turn Left" }, + { Event::LeftDrivingCW, "Left Driving Turn Right" }, + { Event::LeftDrivingFire, "Left Driving Fire" }, - { Event::RightDrivingAnalog, "Right Driving Analog", "" }, - { Event::RightDrivingCCW, "Right Driving Turn Left", "" }, - { Event::RightDrivingCW, "Right Driving Turn Right", "" }, - { Event::RightDrivingFire, "Right Driving Fire", "" }, + { Event::RightDrivingAnalog, "Right Driving Analog" }, + { Event::RightDrivingCCW, "Right Driving Turn Left" }, + { Event::RightDrivingCW, "Right Driving Turn Right" }, + { Event::RightDrivingFire, "Right Driving Fire" }, // Video - { Event::ToggleInter, "Toggle display interpolation", "" }, - { Event::VidmodeDecrease, "Previous zoom level", "" }, - { Event::VidmodeIncrease, "Next zoom level", "" }, - { Event::ToggleFullScreen, "Toggle fullscreen", "" }, + { Event::ToggleInter, "Toggle display interpolation" }, + { Event::VidmodeDecrease, "Previous zoom level" }, + { Event::VidmodeIncrease, "Next zoom level" }, + { Event::ToggleFullScreen, "Toggle fullscreen" }, #ifdef ADAPTABLE_REFRESH_SUPPORT - { Event::ToggleAdaptRefresh, "Toggle fullscreen refresh rate adapt", "" }, + { Event::ToggleAdaptRefresh, "Toggle fullscreen refresh rate adapt" }, #endif - { Event::OverscanDecrease, "Decrease overscan in fullscreen mode", "" }, - { Event::OverscanIncrease, "Increase overscan in fullscreen mode", "" }, - { Event::ToggleCorrectAspectRatio,"Toggle aspect ratio correct scaling", "" }, - { Event::VSizeAdjustDecrease, "Decrease vertical display size", "" }, - { Event::VSizeAdjustIncrease, "Increase vertical display size", "" }, - { Event::VCenterDecrease, "Move display up", "" }, - { Event::VCenterIncrease, "Move display down", "" }, - { Event::FormatDecrease, "Decrease TV format", "" }, - { Event::FormatIncrease, "Increase TV format", "" }, + { Event::OverscanDecrease, "Decrease overscan in fullscreen mode" }, + { Event::OverscanIncrease, "Increase overscan in fullscreen mode" }, + { Event::ToggleCorrectAspectRatio,"Toggle aspect ratio correct scaling" }, + { Event::VSizeAdjustDecrease, "Decrease vertical display size" }, + { Event::VSizeAdjustIncrease, "Increase vertical display size" }, + { Event::VCenterDecrease, "Move display up" }, + { Event::VCenterIncrease, "Move display down" }, + { Event::FormatDecrease, "Decrease TV format" }, + { Event::FormatIncrease, "Increase TV format" }, // Palette settings - { Event::PaletteDecrease, "Switch to previous palette", "" }, - { Event::PaletteIncrease, "Switch to next palette", "" }, - { Event::PreviousPaletteAttribute,"Select previous palette attribute", "" }, - { Event::NextPaletteAttribute, "Select next palette attribute", "" }, - { Event::PaletteAttributeDecrease,"Decrease selected palette attribute", "" }, - { Event::PaletteAttributeIncrease,"Increase selected palette attribute", "" }, + { Event::PaletteDecrease, "Switch to previous palette" }, + { Event::PaletteIncrease, "Switch to next palette" }, + { Event::PreviousPaletteAttribute,"Select previous palette attribute" }, + { Event::NextPaletteAttribute, "Select next palette attribute" }, + { Event::PaletteAttributeDecrease,"Decrease selected palette attribute" }, + { Event::PaletteAttributeIncrease,"Increase selected palette attribute" }, // Blargg TV effects: - { Event::VidmodeStd, "Disable TV effects", "" }, - { Event::VidmodeRGB, "Select 'RGB' preset", "" }, - { Event::VidmodeSVideo, "Select 'S-Video' preset", "" }, - { Event::VidModeComposite, "Select 'Composite' preset", "" }, - { Event::VidModeBad, "Select 'Badly adjusted' preset", "" }, - { Event::VidModeCustom, "Select 'Custom' preset", "" }, - { Event::PreviousVideoMode, "Select previous TV effect mode preset", "" }, - { Event::NextVideoMode, "Select next TV effect mode preset", "" }, - { Event::PreviousAttribute, "Select previous 'Custom' attribute", "" }, - { Event::NextAttribute, "Select next 'Custom' attribute", "" }, - { Event::DecreaseAttribute, "Decrease selected 'Custom' attribute", "" }, - { Event::IncreaseAttribute, "Increase selected 'Custom' attribute", "" }, + { Event::VidmodeStd, "Disable TV effects" }, + { Event::VidmodeRGB, "Select 'RGB' preset" }, + { Event::VidmodeSVideo, "Select 'S-Video' preset" }, + { Event::VidModeComposite, "Select 'Composite' preset" }, + { Event::VidModeBad, "Select 'Badly adjusted' preset" }, + { Event::VidModeCustom, "Select 'Custom' preset" }, + { Event::PreviousVideoMode, "Select previous TV effect mode preset" }, + { Event::NextVideoMode, "Select next TV effect mode preset" }, + { Event::PreviousAttribute, "Select previous 'Custom' attribute" }, + { Event::NextAttribute, "Select next 'Custom' attribute" }, + { Event::DecreaseAttribute, "Decrease selected 'Custom' attribute" }, + { Event::IncreaseAttribute, "Increase selected 'Custom' attribute" }, // Other TV effects - { Event::TogglePhosphor, "Toggle 'phosphor' effect", "" }, - { Event::PhosphorDecrease, "Decrease 'phosphor' blend", "" }, - { Event::PhosphorIncrease, "Increase 'phosphor' blend", "" }, - { Event::ScanlinesDecrease, "Decrease scanlines", "" }, - { Event::ScanlinesIncrease, "Increase scanlines", "" }, - { Event::PreviousScanlineMask, "Switch to previous scanline mask", "" }, - { Event::NextScanlineMask, "Switch to next scanline mask", "" }, + { Event::TogglePhosphor, "Toggle 'phosphor' effect" }, + { Event::PhosphorDecrease, "Decrease 'phosphor' blend" }, + { Event::PhosphorIncrease, "Increase 'phosphor' blend" }, + { Event::ScanlinesDecrease, "Decrease scanlines" }, + { Event::ScanlinesIncrease, "Increase scanlines" }, + { Event::PreviousScanlineMask, "Switch to previous scanline mask" }, + { Event::NextScanlineMask, "Switch to next scanline mask" }, // Audio - { Event::SoundToggle, "Toggle sound", "" }, - { Event::VolumeDecrease, "Decrease volume", "" }, - { Event::VolumeIncrease, "Increase volume", "" }, + { Event::SoundToggle, "Toggle sound" }, + { Event::VolumeDecrease, "Decrease volume" }, + { Event::VolumeIncrease, "Increase volume" }, // Devices & Ports: - { Event::DecreaseDeadzone, "Decrease digital dead zone", "" }, - { Event::IncreaseDeadzone, "Increase digital dead zone", "" }, - { Event::DecAnalogDeadzone, "Decrease analog dead zone", "" }, - { Event::IncAnalogDeadzone, "Increase analog dead zone", "" }, - { Event::DecAnalogSense, "Decrease analog paddle sensitivity", "" }, - { Event::IncAnalogSense, "Increase analog paddle sensitivity", "" }, - { Event::DecAnalogLinear, "Decrease analog paddle linearity", "" }, - { Event::IncAnalogLinear, "Increase analog paddle linearity", "" }, - { Event::DecDejtterAveraging, "Decrease paddle dejitter averaging", "" }, - { Event::IncDejtterAveraging, "Increase paddle dejitter averaging", "" }, - { Event::DecDejtterReaction, "Decrease paddle dejitter reaction", "" }, - { Event::IncDejtterReaction, "Increase paddle dejitter reaction", "" }, - { Event::DecDigitalSense, "Decrease digital paddle sensitivity", "" }, - { Event::IncDigitalSense, "Increase digital paddle sensitivity", "" }, - { Event::ToggleAutoFire, "Toggle auto fire", "" }, - { Event::DecreaseAutoFire, "Decrease auto fire speed", "" }, - { Event::IncreaseAutoFire, "Increase auto fire speed", "" }, - { Event::ToggleFourDirections, "Toggle allow four joystick directions", "" }, - { Event::ToggleKeyCombos, "Toggle use of modifier key combos", "" }, - { Event::ToggleSAPortOrder, "Swap Stelladaptor port ordering", "" }, + { Event::DecreaseDeadzone, "Decrease digital dead zone" }, + { Event::IncreaseDeadzone, "Increase digital dead zone" }, + { Event::DecAnalogDeadzone, "Decrease analog dead zone" }, + { Event::IncAnalogDeadzone, "Increase analog dead zone" }, + { Event::DecAnalogSense, "Decrease analog paddle sensitivity" }, + { Event::IncAnalogSense, "Increase analog paddle sensitivity" }, + { Event::DecAnalogLinear, "Decrease analog paddle linearity" }, + { Event::IncAnalogLinear, "Increase analog paddle linearity" }, + { Event::DecDejtterAveraging, "Decrease paddle dejitter averaging" }, + { Event::IncDejtterAveraging, "Increase paddle dejitter averaging" }, + { Event::DecDejtterReaction, "Decrease paddle dejitter reaction" }, + { Event::IncDejtterReaction, "Increase paddle dejitter reaction" }, + { Event::DecDigitalSense, "Decrease digital paddle sensitivity" }, + { Event::IncDigitalSense, "Increase digital paddle sensitivity" }, + { Event::ToggleAutoFire, "Toggle auto fire" }, + { Event::DecreaseAutoFire, "Decrease auto fire speed" }, + { Event::IncreaseAutoFire, "Increase auto fire speed" }, + { Event::ToggleFourDirections, "Toggle allow four joystick directions" }, + { Event::ToggleKeyCombos, "Toggle use of modifier key combos" }, + { Event::ToggleSAPortOrder, "Swap Stelladaptor port ordering" }, // Devices & Ports related properties - { Event::PreviousLeftPort, "Select previous left controller", "" }, - { Event::NextLeftPort, "Select next left controller", "" }, - { Event::PreviousRightPort, "Select previous right controller", "" }, - { Event::NextRightPort, "Select next right controller", "" }, - { Event::ToggleSwapPorts, "Toggle swap ports", "" }, - { Event::ToggleSwapPaddles, "Toggle swap paddles", "" }, + { Event::PreviousLeftPort, "Select previous left controller" }, + { Event::NextLeftPort, "Select next left controller" }, + { Event::PreviousRightPort, "Select previous right controller" }, + { Event::NextRightPort, "Select next right controller" }, + { Event::ToggleSwapPorts, "Toggle swap ports" }, + { Event::ToggleSwapPaddles, "Toggle swap paddles" }, // Mouse - { Event::PrevMouseAsController, "Select previous mouse controls", "" }, - { Event::NextMouseAsController, "Select next mouse controls", "" }, - { Event::DecMousePaddleSense, "Decrease mouse paddle sensitivity", "" }, - { Event::IncMousePaddleSense, "Increase mouse paddle sensitivity", "" }, - { Event::DecMouseTrackballSense, "Decrease mouse trackball sensitivity", "" }, - { Event::IncMouseTrackballSense, "Increase mouse trackball sensitivity", "" }, - { Event::DecreaseDrivingSense, "Decrease driving sensitivity", "" }, - { Event::IncreaseDrivingSense, "Increase driving sensitivity", "" }, - { Event::PreviousCursorVisbility, "Select prev. cursor visibility mode", "" }, - { Event::NextCursorVisbility, "Select next cursor visibility mode", "" }, - { Event::ToggleGrabMouse, "Toggle grab mouse", "" }, + { Event::PrevMouseAsController, "Select previous mouse controls" }, + { Event::NextMouseAsController, "Select next mouse controls" }, + { Event::DecMousePaddleSense, "Decrease mouse paddle sensitivity" }, + { Event::IncMousePaddleSense, "Increase mouse paddle sensitivity" }, + { Event::DecMouseTrackballSense, "Decrease mouse trackball sensitivity" }, + { Event::IncMouseTrackballSense, "Increase mouse trackball sensitivity" }, + { Event::DecreaseDrivingSense, "Decrease driving sensitivity" }, + { Event::IncreaseDrivingSense, "Increase driving sensitivity" }, + { Event::PreviousCursorVisbility, "Select prev. cursor visibility mode" }, + { Event::NextCursorVisbility, "Select next cursor visibility mode" }, + { Event::ToggleGrabMouse, "Toggle grab mouse" }, // Mouse related properties - { Event::PreviousMouseControl, "Select previous mouse emulation mode", "" }, - { Event::NextMouseControl, "Select next mouse emulation mode", "" }, - { Event::DecreaseMouseAxesRange, "Decrease mouse axes range", "" }, - { Event::IncreaseMouseAxesRange, "Increase mouse axes range", "" }, + { Event::PreviousMouseControl, "Select previous mouse emulation mode" }, + { Event::NextMouseControl, "Select next mouse emulation mode" }, + { Event::DecreaseMouseAxesRange, "Decrease mouse axes range" }, + { Event::IncreaseMouseAxesRange, "Increase mouse axes range" }, // Time Machine - { Event::ToggleTimeMachine, "Toggle 'Time Machine' mode", "" }, - { Event::TimeMachineMode, "Toggle 'Time Machine' UI", "" }, - { Event::RewindPause, "Rewind one state & enter Pause mode", "" }, - { Event::Rewind1Menu, "Rewind one state & enter TM UI", "" }, - { Event::Rewind10Menu, "Rewind 10 states & enter TM UI", "" }, - { Event::RewindAllMenu, "Rewind all states & enter TM UI", "" }, - { Event::UnwindPause, "Unwind one state & enter Pause mode", "" }, - { Event::Unwind1Menu, "Unwind one state & enter TM UI", "" }, - { Event::Unwind10Menu, "Unwind 10 states & enter TM UI", "" }, - { Event::UnwindAllMenu, "Unwind all states & enter TM UI", "" }, - { Event::TogglePlayBackMode, "Toggle 'Time Machine' playback mode", "" }, + { Event::ToggleTimeMachine, "Toggle 'Time Machine' mode" }, + { Event::TimeMachineMode, "Toggle 'Time Machine' UI" }, + { Event::RewindPause, "Rewind one state & enter Pause mode" }, + { Event::Rewind1Menu, "Rewind one state & enter TM UI" }, + { Event::Rewind10Menu, "Rewind 10 states & enter TM UI" }, + { Event::RewindAllMenu, "Rewind all states & enter TM UI" }, + { Event::UnwindPause, "Unwind one state & enter Pause mode" }, + { Event::Unwind1Menu, "Unwind one state & enter TM UI" }, + { Event::Unwind10Menu, "Unwind 10 states & enter TM UI" }, + { Event::UnwindAllMenu, "Unwind all states & enter TM UI" }, + { Event::TogglePlayBackMode, "Toggle 'Time Machine' playback mode" }, // Developer: - { Event::ToggleDeveloperSet, "Toggle developer settings sets", "" }, - { Event::ToggleFrameStats, "Toggle frame stats", "" }, - { Event::ToggleP0Bit, "Toggle TIA Player0 object", "" }, - { Event::ToggleP0Collision, "Toggle TIA Player0 collisions", "" }, - { Event::ToggleP1Bit, "Toggle TIA Player1 object", "" }, - { Event::ToggleP1Collision, "Toggle TIA Player1 collisions", "" }, - { Event::ToggleM0Bit, "Toggle TIA Missile0 object", "" }, - { Event::ToggleM0Collision, "Toggle TIA Missile0 collisions", "" }, - { Event::ToggleM1Bit, "Toggle TIA Missile1 object", "" }, - { Event::ToggleM1Collision, "Toggle TIA Missile1 collisions", "" }, - { Event::ToggleBLBit, "Toggle TIA Ball object", "" }, - { Event::ToggleBLCollision, "Toggle TIA Ball collisions", "" }, - { Event::TogglePFBit, "Toggle TIA Playfield object", "" }, - { Event::TogglePFCollision, "Toggle TIA Playfield collisions", "" }, - { Event::ToggleBits, "Toggle all TIA objects", "" }, - { Event::ToggleCollisions, "Toggle all TIA collisions", "" }, - { Event::ToggleFixedColors, "Toggle TIA 'Fixed Debug Colors' mode", "" }, - { Event::ToggleColorLoss, "Toggle PAL color-loss effect", "" }, - { Event::ToggleJitter, "Toggle TV scanline 'Jitter' effect", "" }, - { Event::JitterSenseDecrease, "Decrease TV 'Jitter' sensitivity", "" }, - { Event::JitterSenseIncrease, "Increase TV 'Jitter' sensitivity", "" }, - { Event::JitterRecDecrease, "Decrease TV 'Jitter' roll", "" }, - { Event::JitterRecIncrease, "Increase TV 'Jitter' roll", "" }, + { Event::ToggleDeveloperSet, "Toggle developer settings sets" }, + { Event::ToggleFrameStats, "Toggle frame stats" }, + { Event::ToggleP0Bit, "Toggle TIA Player0 object" }, + { Event::ToggleP0Collision, "Toggle TIA Player0 collisions" }, + { Event::ToggleP1Bit, "Toggle TIA Player1 object" }, + { Event::ToggleP1Collision, "Toggle TIA Player1 collisions" }, + { Event::ToggleM0Bit, "Toggle TIA Missile0 object" }, + { Event::ToggleM0Collision, "Toggle TIA Missile0 collisions" }, + { Event::ToggleM1Bit, "Toggle TIA Missile1 object" }, + { Event::ToggleM1Collision, "Toggle TIA Missile1 collisions" }, + { Event::ToggleBLBit, "Toggle TIA Ball object" }, + { Event::ToggleBLCollision, "Toggle TIA Ball collisions" }, + { Event::TogglePFBit, "Toggle TIA Playfield object" }, + { Event::TogglePFCollision, "Toggle TIA Playfield collisions" }, + { Event::ToggleBits, "Toggle all TIA objects" }, + { Event::ToggleCollisions, "Toggle all TIA collisions" }, + { Event::ToggleFixedColors, "Toggle TIA 'Fixed Debug Colors' mode" }, + { Event::ToggleColorLoss, "Toggle PAL color-loss effect" }, + { Event::ToggleJitter, "Toggle TV scanline 'Jitter' effect" }, + { Event::JitterSenseDecrease, "Decrease TV 'Jitter' sensitivity" }, + { Event::JitterSenseIncrease, "Increase TV 'Jitter' sensitivity" }, + { Event::JitterRecDecrease, "Decrease TV 'Jitter' roll" }, + { Event::JitterRecIncrease, "Increase TV 'Jitter' roll" }, // Combo - { Event::Combo1, "Combo 1", "" }, - { Event::Combo2, "Combo 2", "" }, - { Event::Combo3, "Combo 3", "" }, - { Event::Combo4, "Combo 4", "" }, - { Event::Combo5, "Combo 5", "" }, - { Event::Combo6, "Combo 6", "" }, - { Event::Combo7, "Combo 7", "" }, - { Event::Combo8, "Combo 8", "" }, - { Event::Combo9, "Combo 9", "" }, - { Event::Combo10, "Combo 10", "" }, - { Event::Combo11, "Combo 11", "" }, - { Event::Combo12, "Combo 12", "" }, - { Event::Combo13, "Combo 13", "" }, - { Event::Combo14, "Combo 14", "" }, - { Event::Combo15, "Combo 15", "" }, - { Event::Combo16, "Combo 16", "" }, + { Event::Combo1, "Combo 1" }, + { Event::Combo2, "Combo 2" }, + { Event::Combo3, "Combo 3" }, + { Event::Combo4, "Combo 4" }, + { Event::Combo5, "Combo 5" }, + { Event::Combo6, "Combo 6" }, + { Event::Combo7, "Combo 7" }, + { Event::Combo8, "Combo 8" }, + { Event::Combo9, "Combo 9" }, + { Event::Combo10, "Combo 10" }, + { Event::Combo11, "Combo 11" }, + { Event::Combo12, "Combo 12" }, + { Event::Combo13, "Combo 13" }, + { Event::Combo14, "Combo 14" }, + { Event::Combo15, "Combo 15" }, + { Event::Combo16, "Combo 16" }, } }; // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - EventHandler::MenuActionList EventHandler::ourMenuActionList = { { - { Event::UIHelp, "Open context-sensitive help", "" }, + { Event::UIHelp, "Open context-sensitive help" }, - { Event::UIUp, "Move Up", "" }, - { Event::UIDown, "Move Down", "" }, - { Event::UILeft, "Move Left", "" }, - { Event::UIRight, "Move Right", "" }, + { Event::UIUp, "Move Up" }, + { Event::UIDown, "Move Down" }, + { Event::UILeft, "Move Left" }, + { Event::UIRight, "Move Right" }, - { Event::UIHome, "Home", "" }, - { Event::UIEnd, "End", "" }, - { Event::UIPgUp, "Page Up", "" }, - { Event::UIPgDown, "Page Down", "" }, + { Event::UIHome, "Home" }, + { Event::UIEnd, "End" }, + { Event::UIPgUp, "Page Up" }, + { Event::UIPgDown, "Page Down" }, - { Event::UIOK, "OK", "" }, - { Event::UICancel, "Cancel", "" }, - { Event::UISelect, "Select item", "" }, + { Event::UIOK, "OK" }, + { Event::UICancel, "Cancel" }, + { Event::UISelect, "Select item" }, - { Event::UINavPrev, "Previous object", "" }, - { Event::UINavNext, "Next object", "" }, - { Event::UITabPrev, "Previous tab", "" }, - { Event::UITabNext, "Next tab", "" }, + { Event::UINavPrev, "Previous object" }, + { Event::UINavNext, "Next object" }, + { Event::UITabPrev, "Previous tab" }, + { Event::UITabNext, "Next tab" }, - { Event::UIPrevDir, "Parent directory", "" }, - { Event::ToggleFullScreen, "Toggle fullscreen", "" }, - { Event::Quit, "Quit", "" } + { Event::UIPrevDir, "Parent directory" }, + { Event::ToggleFullScreen, "Toggle fullscreen" }, + { Event::Quit, "Quit" } } }; // Event groups diff --git a/src/emucore/Joy2BPlus.cxx b/src/emucore/Joy2BPlus.cxx new file mode 100644 index 000000000..214a3660b --- /dev/null +++ b/src/emucore/Joy2BPlus.cxx @@ -0,0 +1,53 @@ +//============================================================================ +// +// SSSS tt lll lll +// SS SS tt ll ll +// SS tttttt eeee ll ll aaaa +// SSSS tt ee ee ll ll aa +// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator" +// SS SS tt ee ll ll aa aa +// SSSS ttt eeeee llll llll aaaaa +// +// Copyright (c) 1995-2022 by Bradford W. Mott, Stephen Anthony +// and the Stella Team +// +// See the file "License.txt" for information on usage and redistribution of +// this file, and for a DISCLAIMER OF ALL WARRANTIES. +//============================================================================ + +#include "Joy2BPlus.hxx" + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Joy2BPlus::Joy2BPlus(Jack jack, const Event& event, const System& system) + : Joystick(jack, event, system, Controller::Type::Joy2BPlus) +{ + if(myJack == Jack::Left) + { + myButtonCEvent = Event::LeftJoystickFire5; + myButton3Event = Event::LeftJoystickFire9; + } + else + { + myButtonCEvent = Event::RightJoystickFire5; + myButton3Event = Event::RightJoystickFire9; + } + + setPin(AnalogPin::Five, AnalogReadout::connectToVcc()); + setPin(AnalogPin::Nine, AnalogReadout::connectToVcc()); +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void Joy2BPlus::updateButtons() +{ + bool firePressed = myEvent.get(myFireEvent) != 0; + // The Joy 2B+ has two more buttons on it. These buttons are + // connected to the inputs usually used by paddles. + bool buttonCPressed = myEvent.get(myButtonCEvent) != 0; + const bool button3Pressed = myEvent.get(myButton3Event) != 0; + + updateMouseButtons(firePressed, buttonCPressed); + + setPin(DigitalPin::Six, !getAutoFireState(firePressed)); + setPin(AnalogPin::Five, buttonCPressed ? AnalogReadout::connectToGround() : AnalogReadout::connectToVcc()); + setPin(AnalogPin::Nine, button3Pressed ? AnalogReadout::connectToGround() : AnalogReadout::connectToVcc()); +} diff --git a/src/emucore/Joy2BPlus.hxx b/src/emucore/Joy2BPlus.hxx new file mode 100644 index 000000000..b359be0a9 --- /dev/null +++ b/src/emucore/Joy2BPlus.hxx @@ -0,0 +1,71 @@ +//============================================================================ +// +// SSSS tt lll lll +// SS SS tt ll ll +// SS tttttt eeee ll ll aaaa +// SSSS tt ee ee ll ll aa +// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator" +// SS SS tt ee ll ll aa aa +// SSSS ttt eeeee llll llll aaaaa +// +// Copyright (c) 1995-2022 by Bradford W. Mott, Stephen Anthony +// and the Stella Team +// +// See the file "License.txt" for information on usage and redistribution of +// this file, and for a DISCLAIMER OF ALL WARRANTIES. +//============================================================================ + +#ifndef JOY2BPLUS_HXX +#define JOY2BPLUS_HXX + +#include "Joystick.hxx" + +/** + The Joy 2B+ controller works with the 2600 console for joystick directions + and some of the buttons. Button 'B' corresponds to the normal fire button + (joy0fire), while button 'C' is read through INPT1 (analog pin 5) and + button '3' through INPT0 (analog pin 9). + + @author Thomas Jentzsch +*/ +class Joy2BPlus : public Joystick +{ + public: + /** + Create a new Joy 2B+ joystick plugged into the specified jack + + @param jack The jack the controller is plugged into + @param event The event object to use for events + @param system The system using this controller + */ + Joy2BPlus(Jack jack, const Event& event, const System& system); + ~Joy2BPlus() override = default; + + public: + /** + Returns the name of this controller. + */ + string name() const override { return "Joy 2B+"; } + + private: + /** + Update the button pin states. + */ + void updateButtons() override; + + private: + // Pre-compute the events we care about based on given port + // This will eliminate test for left or right port in update() + Event::Type myButton3Event, myButtonCEvent; + + private: + // Following constructors and assignment operators not supported + Joy2BPlus() = delete; + Joy2BPlus(const Joy2BPlus&) = delete; + Joy2BPlus(Joy2BPlus&&) = delete; + Joy2BPlus& operator=(const Joy2BPlus&) = delete; + Joy2BPlus& operator=(Joy2BPlus&&) = delete; +}; + +#endif + diff --git a/src/emucore/module.mk b/src/emucore/module.mk index 40626cdf7..c85875e8b 100644 --- a/src/emucore/module.mk +++ b/src/emucore/module.mk @@ -1,100 +1,101 @@ MODULE := src/emucore MODULE_OBJS := \ - src/emucore/AtariVox.o \ - src/emucore/Bankswitch.o \ - src/emucore/Booster.o \ - src/emucore/Cart.o \ + src/emucore/AtariVox.o \ + src/emucore/Bankswitch.o \ + src/emucore/Booster.o \ + src/emucore/Cart.o \ src/emucore/CartARM.o \ - src/emucore/CartCreator.o \ - src/emucore/CartDetector.o \ - src/emucore/CartEnhanced.o \ - src/emucore/Cart0840.o \ + src/emucore/CartCreator.o \ + src/emucore/CartDetector.o \ + src/emucore/CartEnhanced.o \ + src/emucore/Cart0840.o \ src/emucore/Cart0FA0.o \ - src/emucore/Cart2K.o \ - src/emucore/Cart3E.o \ - src/emucore/Cart3EPlus.o \ - src/emucore/Cart3EX.o \ - src/emucore/Cart3F.o \ - src/emucore/Cart4A50.o \ - src/emucore/Cart4K.o \ - src/emucore/Cart4KSC.o \ - src/emucore/CartAR.o \ - src/emucore/CartBUS.o \ - src/emucore/CartCDF.o \ - src/emucore/CartCM.o \ - src/emucore/CartCTY.o \ - src/emucore/CartCV.o \ - src/emucore/CartDPC.o \ - src/emucore/CartDPCPlus.o \ - src/emucore/CartE0.o \ - src/emucore/CartE7.o \ - src/emucore/CartEF.o \ - src/emucore/CartEFSC.o \ - src/emucore/CartBF.o \ - src/emucore/CartBFSC.o \ - src/emucore/CartDF.o \ - src/emucore/CartDFSC.o \ - src/emucore/CartF0.o \ - src/emucore/CartF4.o \ - src/emucore/CartF4SC.o \ - src/emucore/CartF6.o \ - src/emucore/CartF6SC.o \ - src/emucore/CartF8.o \ - src/emucore/CartF8SC.o \ - src/emucore/CartFA.o \ - src/emucore/CartFA2.o \ - src/emucore/CartFC.o \ - src/emucore/CartFE.o \ - src/emucore/CartMDM.o \ - src/emucore/CartMVC.o \ - src/emucore/CartSB.o \ - src/emucore/CartTVBoy.o \ - src/emucore/CartUA.o \ - src/emucore/CartWD.o \ - src/emucore/CartX07.o \ - src/emucore/CompuMate.o \ - src/emucore/Console.o \ - src/emucore/Control.o \ - src/emucore/ControllerDetector.o \ - src/emucore/DispatchResult.o \ - src/emucore/Driving.o \ - src/emucore/EventHandler.o \ - src/emucore/EmulationTiming.o \ - src/emucore/EmulationWorker.o \ - src/emucore/FrameBuffer.o \ - src/emucore/FBSurface.o \ - src/emucore/FSNode.o \ - src/emucore/Genesis.o \ + src/emucore/Cart2K.o \ + src/emucore/Cart3E.o \ + src/emucore/Cart3EPlus.o \ + src/emucore/Cart3EX.o \ + src/emucore/Cart3F.o \ + src/emucore/Cart4A50.o \ + src/emucore/Cart4K.o \ + src/emucore/Cart4KSC.o \ + src/emucore/CartAR.o \ + src/emucore/CartBUS.o \ + src/emucore/CartCDF.o \ + src/emucore/CartCM.o \ + src/emucore/CartCTY.o \ + src/emucore/CartCV.o \ + src/emucore/CartDPC.o \ + src/emucore/CartDPCPlus.o \ + src/emucore/CartE0.o \ + src/emucore/CartE7.o \ + src/emucore/CartEF.o \ + src/emucore/CartEFSC.o \ + src/emucore/CartBF.o \ + src/emucore/CartBFSC.o \ + src/emucore/CartDF.o \ + src/emucore/CartDFSC.o \ + src/emucore/CartF0.o \ + src/emucore/CartF4.o \ + src/emucore/CartF4SC.o \ + src/emucore/CartF6.o \ + src/emucore/CartF6SC.o \ + src/emucore/CartF8.o \ + src/emucore/CartF8SC.o \ + src/emucore/CartFA.o \ + src/emucore/CartFA2.o \ + src/emucore/CartFC.o \ + src/emucore/CartFE.o \ + src/emucore/CartMDM.o \ + src/emucore/CartMVC.o \ + src/emucore/CartSB.o \ + src/emucore/CartTVBoy.o \ + src/emucore/CartUA.o \ + src/emucore/CartWD.o \ + src/emucore/CartX07.o \ + src/emucore/CompuMate.o \ + src/emucore/Console.o \ + src/emucore/Control.o \ + src/emucore/ControllerDetector.o \ + src/emucore/DispatchResult.o \ + src/emucore/Driving.o \ + src/emucore/EventHandler.o \ + src/emucore/EmulationTiming.o \ + src/emucore/EmulationWorker.o \ + src/emucore/FrameBuffer.o \ + src/emucore/FBSurface.o \ + src/emucore/FSNode.o \ + src/emucore/Genesis.o \ src/emucore/GlobalKeyHandler.o \ - src/emucore/Joystick.o \ - src/emucore/Keyboard.o \ - src/emucore/KidVid.o \ - src/emucore/Lightgun.o \ - src/emucore/MindLink.o \ - src/emucore/M6502.o \ - src/emucore/M6532.o \ - src/emucore/MT24LC256.o \ - src/emucore/MD5.o \ - src/emucore/OSystem.o \ - src/emucore/OSystemStandalone.o \ - src/emucore/Paddles.o \ - src/emucore/PlusROM.o \ - src/emucore/PointingDevice.o \ - src/emucore/ProfilingRunner.o \ - src/emucore/Props.o \ - src/emucore/PropsSet.o \ - src/emucore/QuadTari.o \ - src/emucore/SaveKey.o \ - src/emucore/Serializer.o \ - src/emucore/Settings.o \ - src/emucore/Switches.o \ - src/emucore/System.o \ - src/emucore/TIASurface.o \ - src/emucore/Thumbulator.o + src/emucore/Joy2BPlus.o \ + src/emucore/Joystick.o \ + src/emucore/Keyboard.o \ + src/emucore/KidVid.o \ + src/emucore/Lightgun.o \ + src/emucore/MindLink.o \ + src/emucore/M6502.o \ + src/emucore/M6532.o \ + src/emucore/MT24LC256.o \ + src/emucore/MD5.o \ + src/emucore/OSystem.o \ + src/emucore/OSystemStandalone.o \ + src/emucore/Paddles.o \ + src/emucore/PlusROM.o \ + src/emucore/PointingDevice.o \ + src/emucore/ProfilingRunner.o \ + src/emucore/Props.o \ + src/emucore/PropsSet.o \ + src/emucore/QuadTari.o \ + src/emucore/SaveKey.o \ + src/emucore/Serializer.o \ + src/emucore/Settings.o \ + src/emucore/Switches.o \ + src/emucore/System.o \ + src/emucore/TIASurface.o \ + src/emucore/Thumbulator.o MODULE_DIRS += \ - src/emucore + src/emucore # Include common rules include $(srcdir)/common.rules diff --git a/src/emucore/stella.pro b/src/emucore/stella.pro index 37551c84a..cdf4f08ea 100644 --- a/src/emucore/stella.pro +++ b/src/emucore/stella.pro @@ -5187,6 +5187,8 @@ "Cart.Manufacturer" "Alessandro Ciceri" "Cart.Name" "MagiCard+ (alex_79) WIP_20150118" "Cart.Note" "MagiCard hack" +"Controller.Left" "KEYBOARD" +"Controller.Right" "KEYBOARD" "" "Cart.MD5" "39790a2e9030751d7db414e13f1b6960" @@ -10936,6 +10938,8 @@ "Cart.Manufacturer" "Alessandro Ciceri" "Cart.Name" "MagiCard (TV format conversion) (alex_79) (PAL)" "Cart.Note" "MagiCard PAL conversion hack" +"Controller.Left" "KEYBOARD" +"Controller.Right" "KEYBOARD" "" "Cart.MD5" "7860716fa5dbc0fffab93fb9a4cb4132" @@ -11459,6 +11463,8 @@ "Cart.ModelNo" "CM-001" "Cart.Name" "MagiCard (1981) (CommaVid) (4K)" "Cart.Note" "Uses the Keyboard Controllers" +"Controller.Left" "KEYBOARD" +"Controller.Right" "KEYBOARD" "" "Cart.MD5" "7dbc8fa2e488e3f6b87fbe0f76c5b89f" @@ -18264,6 +18270,8 @@ "Cart.ModelNo" "CM-001" "Cart.Name" "MagiCard (1981) (CommaVid)" "Cart.Note" "Uses the Keyboard Controllers" +"Controller.Left" "KEYBOARD" +"Controller.Right" "KEYBOARD" "" "Cart.MD5" "ce17325834bf8b0a0d0d8de08478d436" @@ -20527,6 +20535,8 @@ "Cart.Manufacturer" "Alessandro Ciceri" "Cart.Name" "MagiCard+ (alex_79) WIP_20150118 (PAL)" "Cart.Note" "MagiCard hack" +"Controller.Left" "KEYBOARD" +"Controller.Right" "KEYBOARD" "" "Cart.MD5" "e5a6e0bb7d56e2f08b237e15076e5699" diff --git a/src/gui/GameInfoDialog.cxx b/src/gui/GameInfoDialog.cxx index 0406c469a..e9192c223 100644 --- a/src/gui/GameInfoDialog.cxx +++ b/src/gui/GameInfoDialog.cxx @@ -294,6 +294,7 @@ void GameInfoDialog::addControllersTab() VarList::push_back(items, "AtariVox", "ATARIVOX"); VarList::push_back(items, "SaveKey", "SAVEKEY"); VarList::push_back(items, "Sega Genesis", "GENESIS"); + VarList::push_back(items, "Joy2B+", "JOY_2B+"); VarList::push_back(items, "Kid Vid", "KIDVID"); VarList::push_back(items, "Light Gun", "LIGHTGUN"); VarList::push_back(items, "MindLink", "MINDLINK"); diff --git a/src/gui/InputDialog.cxx b/src/gui/InputDialog.cxx index 4a95e3ef3..64f474807 100644 --- a/src/gui/InputDialog.cxx +++ b/src/gui/InputDialog.cxx @@ -53,7 +53,7 @@ InputDialog::InputDialog(OSystem& osystem, DialogContainer& parent, VGAP = Dialog::vGap(); // Set real dimensions - setSize(48 * fontWidth + PopUpWidget::dropDownWidth(_font) + HBORDER * 2, + setSize(49 * fontWidth + PopUpWidget::dropDownWidth(_font) + HBORDER * 2, _th + VGAP * 3 + lineHeight + 13 * (lineHeight + VGAP) + VGAP * 9 + buttonHeight + VBORDER * 3, max_w, max_h); diff --git a/src/gui/LauncherDialog.cxx b/src/gui/LauncherDialog.cxx index 28053bc5e..8b8987e7d 100644 --- a/src/gui/LauncherDialog.cxx +++ b/src/gui/LauncherDialog.cxx @@ -75,8 +75,14 @@ LauncherDialog::LauncherDialog(OSystem& osystem, DialogContainer& parent, myUseMinimalUI = instance().settings().getBool("minimal_ui"); - addOptionWidgets(ypos); - addPathWidgets(ypos); + // if minimalUI, show title within dialog surface instead of showing the filtering control + if(myUseMinimalUI) { + addTitleWidget(ypos); + addPathWidgets(ypos); //-- path widget line will have file count + } else { + addPathWidgets(ypos); + addFilteringWidgets(ypos); //-- filtering widget line has file count + } addRomWidgets(ypos); if(!myUseMinimalUI && bottomButtons) addButtonWidgets(ypos); @@ -97,60 +103,64 @@ LauncherDialog::LauncherDialog(OSystem& osystem, DialogContainer& parent, } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void LauncherDialog::addOptionWidgets(int& ypos) +void LauncherDialog::addTitleWidget(int &ypos) +{ + const int fontHeight = Dialog::fontHeight(), + VGAP = Dialog::vGap(); + // App information + ostringstream ver; + ver << "Stella " << STELLA_VERSION; +#if defined(RETRON77) + ver << " for RetroN 77"; +#endif + new StaticTextWidget(this, _font, 0, ypos, _w, fontHeight, + ver.str(), TextAlign::Center); + ypos += fontHeight + VGAP; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void LauncherDialog::addFilteringWidgets(int& ypos) { const int lineHeight = Dialog::lineHeight(), fontHeight = Dialog::fontHeight(), fontWidth = Dialog::fontWidth(), HBORDER = Dialog::hBorder(), - VGAP = Dialog::vGap(), LBL_GAP = Dialog::fontWidth(), buttonHeight = Dialog::buttonHeight(), btnGap = fontWidth / 4, btnYOfs = (buttonHeight - lineHeight) / 2 + 1; - string lblFound = "12345 items found"; - int lwFound = _font.getStringWidth(lblFound); WidgetArray wid; - if(myUseMinimalUI) - { - // App information - ostringstream ver; - ver << "Stella " << STELLA_VERSION; -#if defined(RETRON77) - ver << " for RetroN 77"; -#endif - new StaticTextWidget(this, _font, 0, ypos, _w, fontHeight, - ver.str(), TextAlign::Center); - ypos += fontHeight + VGAP; - } - - if(!myUseMinimalUI && _w >= 640) + if(_w >= 640) { const bool smallIcon = lineHeight < 26; - const GUI::Icon& settingsIcon = smallIcon ? GUI::icon_settings_small : GUI::icon_settings_large; - const GUI::Icon& helpIcon = smallIcon ? GUI::icon_help_small : GUI::icon_help_large; - const int iconWidth = settingsIcon.width(); + + // Figure out general icon button size + const GUI::Icon& reloadIcon = smallIcon ? GUI::icon_reload_small : GUI::icon_reload_large; + const GUI::Icon& dummyIcon = reloadIcon; //-- used for sizing all the other icons + const int iconWidth = dummyIcon.width(); const int iconGap = ((fontWidth + 1) & ~0b1) + 1; // round up to next even - const int buttonWidth = iconWidth + iconGap; - const GUI::Icon& dummyIcon = settingsIcon; + const int iconButtonWidth = iconWidth + iconGap; int xpos = HBORDER; - mySettingsButton = new ButtonWidget(this, _font, xpos, ypos - btnYOfs, - iconWidth, buttonHeight, settingsIcon, - iconGap, " Options" + ELLIPSIS + " ", kOptionsCmd); - mySettingsButton-> setToolTip("(Ctrl+O)"); - wid.push_back(mySettingsButton); - const int cwSettings = mySettingsButton->getWidth(); - const int cwSubDirs = buttonWidth; - const int cwAllFiles = buttonWidth; - const int cwHelp = buttonWidth; + // Setup some constants for Settings button - icon, label, and width + const GUI::Icon& settingsIcon = smallIcon ? GUI::icon_settings_small : GUI::icon_settings_large; + const string lblSettings = "Options" + ELLIPSIS; + const int lwSettings = _font.getStringWidth(lblSettings); + const int bwSettings = iconButtonWidth + lwSettings + btnGap * 2 + 1; // Button width for Options button + + // Setup some variables for handling the Filter label + field const string& lblFilter = "Filter"; int lwFilter = _font.getStringWidth(lblFilter); + + string lblFound = "12345 items found"; + int lwFound = _font.getStringWidth(lblFound); int fwFilter = EditTextWidget::calcWidth(_font, "123456"); // at least 6 chars - int wTotal = cwSettings + cwSubDirs + cwAllFiles + lwFilter + fwFilter + lwFound + cwHelp - + LBL_GAP * 5 + btnGap * 2 + HBORDER * 2; + + // Calculate how much space everything will take + int wTotal = xpos + (iconButtonWidth * 3) + lwFilter + fwFilter + lwFound + bwSettings + + LBL_GAP * 6 + btnGap * 2 + HBORDER; // make sure there is space for at least 6 characters in the filter field if(_w < wTotal) @@ -169,8 +179,15 @@ void LauncherDialog::addOptionWidgets(int& ypos) fwFilter += _w - wTotal; + ypos += btnYOfs; + // Show the reload button + myReloadButton = new ButtonWidget(this, _font, xpos, ypos - btnYOfs, + iconButtonWidth, buttonHeight, reloadIcon, kReloadCmd); + myReloadButton->setToolTip("Reload listing. (Ctrl+R)"); + wid.push_back(myReloadButton); + xpos = myReloadButton->getRight() + LBL_GAP * 2; + // Show the "Filter" label - xpos = mySettingsButton->getRight() + LBL_GAP * 2; if(lwFilter) { const StaticTextWidget* s = new StaticTextWidget(this, _font, xpos, ypos, lblFilter); @@ -182,36 +199,35 @@ void LauncherDialog::addOptionWidgets(int& ypos) myPattern->setToolTip("Enter filter text to reduce file list.\n" "Use '*' and '?' as wildcards."); wid.push_back(myPattern); + xpos = myPattern->getRight() + btnGap; // Show the button for all files - xpos = myPattern->getRight() + btnGap; myOnlyRomsButton = new ButtonWidget(this, _font, xpos, ypos - btnYOfs, - buttonWidth, buttonHeight, dummyIcon, kAllfilesCmd); + iconButtonWidth, buttonHeight, dummyIcon, kAllfilesCmd); myOnlyRomsButton->setToolTip("Toggle file type filter (Ctrl+A)"); wid.push_back(myOnlyRomsButton); + xpos = myOnlyRomsButton->getRight() + btnGap; // Show the subdirectories button - xpos = myOnlyRomsButton->getRight() + btnGap; mySubDirsButton = new ButtonWidget(this, _font, xpos, ypos - btnYOfs, - buttonWidth, buttonHeight, dummyIcon, kSubDirsCmd); + iconButtonWidth, buttonHeight, dummyIcon, kSubDirsCmd); mySubDirsButton->setToolTip("Toggle subdirectories (Ctrl+D)"); wid.push_back(mySubDirsButton); - - // Show the help button - xpos = _w - HBORDER - buttonWidth; - myHelpButton = new ButtonWidget(this, _font, xpos, ypos - btnYOfs, - buttonWidth, buttonHeight, helpIcon, kHelpCmd); - const string key = instance().eventHandler().getMappingDesc(Event::UIHelp, EventMode::kMenuMode); - myHelpButton->setToolTip("Click for help. (" + key + ")"); - wid.push_back(myHelpButton); + xpos = mySubDirsButton->getRight() + btnGap + LBL_GAP; // Show the files counter - xpos = myHelpButton->getLeft() - fontWidth - lwFound; // _w - HBORDER - lwFound; myRomCount = new StaticTextWidget(this, _font, xpos, ypos, - lwFound, fontHeight, "", TextAlign::Right); + lwFound, fontHeight, "", TextAlign::Right); - ypos += lineHeight + VGAP * 2; + // Show the Settings / Options button (positioned from the right) + xpos = _w - HBORDER - bwSettings; + mySettingsButton = new ButtonWidget(this, _font, xpos, ypos - btnYOfs, + iconWidth, buttonHeight, settingsIcon, + iconGap, lblSettings, kOptionsCmd); + mySettingsButton-> setToolTip("(Ctrl+O)"); + wid.push_back(mySettingsButton); + ypos = mySettingsButton->getBottom() + Dialog::vGap(); } addToFocusList(wid); } @@ -226,41 +242,47 @@ void LauncherDialog::addPathWidgets(int& ypos) fontWidth = Dialog::fontWidth(), HBORDER = Dialog::hBorder(), LBL_GAP = fontWidth, - BTN_GAP = fontWidth / 4; + buttonHeight = Dialog::buttonHeight(), + BTN_GAP = fontWidth / 4, + btnYOfs = (buttonHeight - lineHeight) / 2 + 1; const bool smallIcon = lineHeight < 26; const string lblFound = "12345 items"; const int lwFound = _font.getStringWidth(lblFound); - const GUI::Icon& reloadIcon = smallIcon ? GUI::icon_reload_small : GUI::icon_reload_large; - const int iconWidth = reloadIcon.width(); - const int buttonWidth = iconWidth + ((fontWidth + 1) & ~0b1) + 1; // round up to next odd - const int buttonHeight = Dialog::buttonHeight(); // lineHeight + 2; + + // Setup some constants for Help button + const GUI::Icon& helpIcon = smallIcon ? GUI::icon_help_small : GUI::icon_help_large; + const int iconWidth = helpIcon.width(); + const int iconGap = ((fontWidth + 1) & ~0b1) + 1; // round up to next even + const int buttonWidth = iconWidth + iconGap; const int wNav = _w - HBORDER * 2 - (myUseMinimalUI ? lwFound + LBL_GAP : buttonWidth + BTN_GAP); int xpos = HBORDER; WidgetArray wid; - myNavigationBar = new NavigationWidget(this, _font, xpos, ypos, wNav, buttonHeight); + myNavigationBar = new NavigationWidget(this, _font, xpos, ypos - btnYOfs, wNav, buttonHeight); - if(!myUseMinimalUI) - { - xpos = myNavigationBar->getRight() + BTN_GAP; - myReloadButton = new ButtonWidget(this, _font, xpos, ypos, - buttonWidth, buttonHeight, reloadIcon, kReloadCmd); - myReloadButton->setToolTip("Reload listing. (Ctrl+R)"); - wid.push_back(myReloadButton); - } - else + if(myUseMinimalUI) { // Show the files counter myShortCount = true; xpos = _w - HBORDER - lwFound - LBL_GAP / 2; - myRomCount = new StaticTextWidget(this, _font, xpos, ypos + 2, + myRomCount = new StaticTextWidget(this, _font, xpos, ypos, lwFound, fontHeight, "", TextAlign::Right); - EditTextWidget* e = new EditTextWidget(this, _font, myNavigationBar->getRight() - 1, ypos, + EditTextWidget* e = new EditTextWidget(this, _font, myNavigationBar->getRight() - 1, ypos - btnYOfs, lwFound + LBL_GAP + 1, buttonHeight - 2, ""); - e->setEditable(false, true); + e->setEditable(false); + e->setEnabled(false); + } else { + // Show Help icon at far right + xpos = _w - HBORDER - (buttonWidth + BTN_GAP - 2); + myHelpButton = new ButtonWidget(this, _font, xpos, ypos - btnYOfs, + buttonWidth, buttonHeight, helpIcon, kHelpCmd); + const string key = instance().eventHandler().getMappingDesc(Event::UIHelp, EventMode::kMenuMode); + myHelpButton->setToolTip("Click for help. (" + key + ")"); + wid.push_back(myHelpButton); } - ypos = myNavigationBar->getBottom() + Dialog::vGap(); + ypos += lineHeight + Dialog::vGap() * 2; + addToFocusList(wid); } diff --git a/src/gui/LauncherDialog.hxx b/src/gui/LauncherDialog.hxx index 10f84cc42..df81bb22d 100644 --- a/src/gui/LauncherDialog.hxx +++ b/src/gui/LauncherDialog.hxx @@ -121,7 +121,8 @@ class LauncherDialog : public Dialog, CommandSender void loadConfig() override; void saveConfig() override; void updateUI(); - void addOptionWidgets(int& ypos); + void addTitleWidget(int& ypos); + void addFilteringWidgets(int& ypos); void addPathWidgets(int& ypos); void addRomWidgets(int ypos); void addButtonWidgets(int& ypos); diff --git a/src/gui/QuadTariDialog.cxx b/src/gui/QuadTariDialog.cxx index 9a2f23994..d59d11054 100644 --- a/src/gui/QuadTariDialog.cxx +++ b/src/gui/QuadTariDialog.cxx @@ -55,6 +55,7 @@ QuadTariDialog::QuadTariDialog(GuiObject* boss, const GUI::Font& font, int max_w VarList::push_back(ctrls, "AtariVox", "ATARIVOX"); VarList::push_back(ctrls, "SaveKey", "SAVEKEY"); //VarList::push_back(ctrls, "Sega Genesis", "GENESIS"); + //VarList::push_back(items, "Joy2B+", "JOY_2B+"); //VarList::push_back(ctrls, "Kid Vid", "KIDVID"); //VarList::push_back(ctrls, "Light Gun", "LIGHTGUN"); //VarList::push_back(ctrls, "MindLink", "MINDLINK"); diff --git a/src/gui/StellaSettingsDialog.cxx b/src/gui/StellaSettingsDialog.cxx index 3d3be7893..4652e0da3 100644 --- a/src/gui/StellaSettingsDialog.cxx +++ b/src/gui/StellaSettingsDialog.cxx @@ -193,6 +193,7 @@ void StellaSettingsDialog::addGameOptions(WidgetArray& wid, int xpos, int& ypos) VarList::push_back(ctrls, "Atari mouse", "ATARIMOUSE"); VarList::push_back(ctrls, "Trak-Ball", "TRAKBALL"); VarList::push_back(ctrls, "Sega Genesis", "GENESIS"); + VarList::push_back(ctrls, "Joy2B+", "JOY_2B+"); // TODO: should work, but needs testing with real hardware VarList::push_back(ctrls, "QuadTari", "QUADTARI"); int pwidth = _font.getStringWidth("Sega Genesis"); diff --git a/src/libretro/Makefile.common b/src/libretro/Makefile.common index e162bb1dc..13926bb04 100644 --- a/src/libretro/Makefile.common +++ b/src/libretro/Makefile.common @@ -107,6 +107,7 @@ SOURCES_CXX := \ $(CORE_DIR)/emucore/FSNode.cxx \ $(CORE_DIR)/emucore/Genesis.cxx \ $(CORE_DIR)/emucore/GlobalKeyHandler.cxx \ + $(CORE_DIR)/emucore/Joy2BPlus.cxx \ $(CORE_DIR)/emucore/Joystick.cxx \ $(CORE_DIR)/emucore/Keyboard.cxx \ $(CORE_DIR)/emucore/KidVid.cxx \ diff --git a/src/libretro/Stella.vcxproj b/src/libretro/Stella.vcxproj index 43472ef65..452b74065 100644 --- a/src/libretro/Stella.vcxproj +++ b/src/libretro/Stella.vcxproj @@ -259,6 +259,7 @@ + diff --git a/src/macos/stella.xcodeproj/project.pbxproj b/src/macos/stella.xcodeproj/project.pbxproj index e6c984ba9..ef25ec74c 100644 --- a/src/macos/stella.xcodeproj/project.pbxproj +++ b/src/macos/stella.xcodeproj/project.pbxproj @@ -643,6 +643,10 @@ DCDFF08220B781B0001227C0 /* DispatchResult.hxx in Headers */ = {isa = PBXBuildFile; fileRef = DCDFF08020B781B0001227C0 /* DispatchResult.hxx */; }; DCE1FF3E286B5D5A003568AD /* FSNodeREGULAR.hxx in Headers */ = {isa = PBXBuildFile; fileRef = DCE1FF3C286B5D5A003568AD /* FSNodeREGULAR.hxx */; }; DCE1FF3F286B5D5A003568AD /* FSNodeREGULAR.cxx in Sources */ = {isa = PBXBuildFile; fileRef = DCE1FF3D286B5D5A003568AD /* FSNodeREGULAR.cxx */; }; + DCE1FF42286DFB76003568AD /* Joy2BPlusWidget.cxx in Sources */ = {isa = PBXBuildFile; fileRef = DCE1FF40286DFB76003568AD /* Joy2BPlusWidget.cxx */; }; + DCE1FF43286DFB76003568AD /* Joy2BPlusWidget.hxx in Headers */ = {isa = PBXBuildFile; fileRef = DCE1FF41286DFB76003568AD /* Joy2BPlusWidget.hxx */; }; + DCE1FF46286DFB98003568AD /* Joy2BPlus.hxx in Headers */ = {isa = PBXBuildFile; fileRef = DCE1FF44286DFB98003568AD /* Joy2BPlus.hxx */; }; + DCE1FF47286DFB98003568AD /* Joy2BPlus.cxx in Sources */ = {isa = PBXBuildFile; fileRef = DCE1FF45286DFB98003568AD /* Joy2BPlus.cxx */; }; DCE395EF16CB0B5F008DB1E5 /* FSNodeFactory.hxx in Headers */ = {isa = PBXBuildFile; fileRef = DCE395EA16CB0B5F008DB1E5 /* FSNodeFactory.hxx */; }; DCE395F016CB0B5F008DB1E5 /* FSNodeZIP.cxx in Sources */ = {isa = PBXBuildFile; fileRef = DCE395EB16CB0B5F008DB1E5 /* FSNodeZIP.cxx */; }; DCE395F116CB0B5F008DB1E5 /* FSNodeZIP.hxx in Headers */ = {isa = PBXBuildFile; fileRef = DCE395EC16CB0B5F008DB1E5 /* FSNodeZIP.hxx */; }; @@ -1473,6 +1477,10 @@ DCDFF08020B781B0001227C0 /* DispatchResult.hxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = DispatchResult.hxx; sourceTree = ""; }; DCE1FF3C286B5D5A003568AD /* FSNodeREGULAR.hxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = FSNodeREGULAR.hxx; sourceTree = ""; }; DCE1FF3D286B5D5A003568AD /* FSNodeREGULAR.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FSNodeREGULAR.cxx; sourceTree = ""; }; + DCE1FF40286DFB76003568AD /* Joy2BPlusWidget.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Joy2BPlusWidget.cxx; sourceTree = ""; }; + DCE1FF41286DFB76003568AD /* Joy2BPlusWidget.hxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = Joy2BPlusWidget.hxx; sourceTree = ""; }; + DCE1FF44286DFB98003568AD /* Joy2BPlus.hxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = Joy2BPlus.hxx; sourceTree = ""; }; + DCE1FF45286DFB98003568AD /* Joy2BPlus.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Joy2BPlus.cxx; sourceTree = ""; }; DCE395EA16CB0B5F008DB1E5 /* FSNodeFactory.hxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = FSNodeFactory.hxx; sourceTree = ""; }; DCE395EB16CB0B5F008DB1E5 /* FSNodeZIP.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FSNodeZIP.cxx; sourceTree = ""; }; DCE395EC16CB0B5F008DB1E5 /* FSNodeZIP.hxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = FSNodeZIP.hxx; sourceTree = ""; }; @@ -1843,6 +1851,8 @@ DC9616271F817830008A2206 /* FlashWidget.hxx */, DCCF4ADA14B9433100814FAB /* GenesisWidget.cxx */, DCCF4ADB14B9433100814FAB /* GenesisWidget.hxx */, + DCE1FF40286DFB76003568AD /* Joy2BPlusWidget.cxx */, + DCE1FF41286DFB76003568AD /* Joy2BPlusWidget.hxx */, DCCF47DC14B60DEE00814FAB /* JoystickWidget.cxx */, DCCF47DD14B60DEE00814FAB /* JoystickWidget.hxx */, DCCF4B0014BA27EB00814FAB /* KeyboardWidget.cxx */, @@ -2133,6 +2143,8 @@ DCD3F7C411340AAF00DBA3AE /* Genesis.hxx */, DC6DC5E5273C2BED00F64413 /* GlobalKeyHandler.cxx */, DC6DC5E6273C2BED00F64413 /* GlobalKeyHandler.hxx */, + DCE1FF45286DFB98003568AD /* Joy2BPlus.cxx */, + DCE1FF44286DFB98003568AD /* Joy2BPlus.hxx */, 2DE2DF420627AE07006BEC99 /* Joystick.cxx */, 2DE2DF430627AE07006BEC99 /* Joystick.hxx */, 2DE2DF440627AE07006BEC99 /* Keyboard.cxx */, @@ -2719,6 +2731,7 @@ 2D91741309BA90380026E9FF /* ScrollBarWidget.hxx in Headers */, 2D91741609BA90380026E9FF /* TabWidget.hxx in Headers */, DCB60ACC25430FC600A5C1D2 /* FBBackend.hxx in Headers */, + DCE1FF43286DFB76003568AD /* Joy2BPlusWidget.hxx in Headers */, DCB2ECB01F0AECA3009738A6 /* CartDetector.hxx in Headers */, 2D91741809BA90380026E9FF /* Widget.hxx in Headers */, 2D91741909BA90380026E9FF /* CartUA.hxx in Headers */, @@ -2727,6 +2740,7 @@ DC2ABA7725A0E178007E57D3 /* StellaDb.hxx in Headers */, DCBD31E92299ADB400567357 /* Rect.hxx in Headers */, DCBA539925557E2800087DD7 /* UndoHandler.hxx in Headers */, + DCE1FF46286DFB98003568AD /* Joy2BPlus.hxx in Headers */, 2D91741A09BA90380026E9FF /* FSNode.hxx in Headers */, DC2ABA5C259BD544007E57D3 /* CompositeKeyValueRepository.hxx in Headers */, DC816CF72572F92A00FBCCDA /* json_lib.hxx in Headers */, @@ -3153,6 +3167,7 @@ DCF8621921C9D43300F95F52 /* StaggeredLogger.cxx in Sources */, E0DCD3AA20A64E96000B614E /* ConvolutionBuffer.cxx in Sources */, DC6DC5E1273C2A5E00F64413 /* OptionsMenu.cxx in Sources */, + DCE1FF47286DFB98003568AD /* Joy2BPlus.cxx in Sources */, DC843980247B297A00C6A4FC /* CartTVBoyWidget.cxx in Sources */, 2D91747E09BA90380026E9FF /* CartE7.cxx in Sources */, DC9616321F817830008A2206 /* PointingDeviceWidget.cxx in Sources */, @@ -3377,6 +3392,7 @@ DCD6FC8111C281ED005DA767 /* pngwtran.c in Sources */, DCD6FC8211C281ED005DA767 /* pngwutil.c in Sources */, DCD6FC9311C28C6F005DA767 /* PNGLibrary.cxx in Sources */, + DCE1FF42286DFB76003568AD /* Joy2BPlusWidget.cxx in Sources */, DC98F35611F5B56200AA520F /* MessageBox.cxx in Sources */, DC9616301F817830008A2206 /* FlashWidget.cxx in Sources */, DCFFE59D12100E1400DFA000 /* ComboDialog.cxx in Sources */, diff --git a/src/windows/Stella.vcxproj b/src/windows/Stella.vcxproj index 1bc74a67c..e81df4371 100755 --- a/src/windows/Stella.vcxproj +++ b/src/windows/Stella.vcxproj @@ -828,6 +828,7 @@ true + true @@ -886,6 +887,7 @@ + @@ -2014,6 +2016,7 @@ true + true @@ -2088,6 +2091,7 @@ + diff --git a/src/windows/Stella.vcxproj.filters b/src/windows/Stella.vcxproj.filters index 94ce95363..8b4c02580 100644 --- a/src/windows/Stella.vcxproj.filters +++ b/src/windows/Stella.vcxproj.filters @@ -1139,6 +1139,11 @@ Source Files + + Source Files\emucore + + + Source Files\debugger @@ -2359,6 +2364,11 @@ Header Files + + Header Files\emucore + + + Header Files\debugger diff --git a/test/roms/controller/joy2bplus/Grizzards.NTSC.full-beta-4.a26 b/test/roms/controller/joy2bplus/Grizzards.NTSC.full-beta-4.a26 new file mode 100644 index 000000000..67ca07973 Binary files /dev/null and b/test/roms/controller/joy2bplus/Grizzards.NTSC.full-beta-4.a26 differ