Merge branch 'master' into feature/filesystem

This commit is contained in:
Stephen Anthony 2022-07-06 14:49:24 -02:30
commit 20903564e6
33 changed files with 954 additions and 808 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

After

Width:  |  Height:  |  Size: 54 KiB

View File

@ -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</li>
<li>Emulates the Atari 2600 Joystick, Paddle, Driving, CBS Booster Grip, Sega Genesis, QuadTari controllers using your computer's keyboard,
joysticks or mouse</li>
<li>Emulates CX22/CX80 style Trak-Balls, Amiga/Atari mouse, MindLink controller and the Light Gun using your
computer's mouse</li>
<li>Emulates the Atari 2600 Joystick, Paddle, Driving, CBS Booster Grip,
Sega Genesis, <a href="https://github.com/ascrnet/Joy2Bplus">Joy 2B+</a>,
QuadTari controllers using your computer's keyboard, joysticks or mouse</li>
<li>Emulates CX22/CX80 style Trak-Balls, Amiga/Atari mouse, MindLink controller
and the Light Gun using your computer's mouse</li>
<li>Emulates the Atari 2600 Keyboard controllers using your computer's keyboard</li>
<li>Emulates <a href="https://en.wikipedia.org/wiki/CompuMate">Spectravideo CompuMate</a> system using your computer's keyboard,
including mapping of CompuMate 'Backspace', 'Space' and 'Enter' functionality to
@ -797,101 +798,57 @@
</table>
</br>
<p><b>Joystick/Booster Grip Controller (can be remapped)</b></p>
<p><b>Joystick, Booster Grip (&#185;), Sega Genesis (&#178;) & Joy 2B+ (&#179;) Controller (can be remapped)</b></p>
<table style="border: hidden">
<tr>
<td style="padding: 0px">
<table>
<tr>
<th colspan=2>Left Joystick</th>
</tr>
<tr>
<th>Function</th>
<th>Key</th>
<th>Left Controller Key</th>
<th>Right Controller Key</th>
</tr>
<tr>
<td>Joystick Up</td>
<td>Up</td>
<td>Up arrow, Keypad 8</td>
</tr>
<tr>
<td>Joystick Down</td>
<td>Down arrow, Keypad 2</td>
</tr>
<tr>
<td>Joystick Left</td>
<td>Left arrow, Keypad 4</td>
</tr>
<tr>
<td>Joystick Right</td>
<td>Right arrow, Keypad 6</td>
</tr>
<tr>
<td>Fire Button</td>
<td>Left Control, Space, Keypad 5</td>
</tr>
<tr>
<td>Top Booster Button</td>
<td>Right Shift, 4, Keypad 9</td>
</tr>
<tr>
<td>Handle Grip Trigger</td>
<td>Right Control, 5, Keypad 3</td>
</tr>
</table>
</td>
<td style="border: hidden"></td>
<td style="padding: 0px">
<table>
<tr>
<th colspan=2>Right Joystick</th>
</tr>
<tr>
<th>Function</th>
<th>Key</th>
</tr>
<tr>
<td>Joystick Up</td>
<td>Y</td>
</tr>
<tr>
<td>Joystick Down</td>
<td>Down</td>
<td>Down arrow, Keypad 2</td>
<td>H</td>
</tr>
<tr>
<td>Joystick Left</td>
<td>Left</td>
<td>Left arrow, Keypad 4</td>
<td>G</td>
</tr>
<tr>
<td>Joystick Right</td>
<td>Right</td>
<td>Right arrow, Keypad 6</td>
<td>J</td>
</tr>
<tr>
<td>Fire Button</td>
<td>Fire, Button 'B'</td>
<td>Left Control, Space, Keypad 5</td>
<td>F</td>
</tr>
<tr>
<td>Top Booster Button</td>
<td>Top Booster Button &#185;, Button 'C' &#178; &#179;</td>
<td>Right Shift, 4, Keypad 9</td>
<td>6</td>
</tr>
<tr>
<td>Handle Grip Trigger</td>
<td>Handle Grip Trigger &#185;, Button '3' &#179;</td>
<td>Right Control, 5, Keypad 3</td>
<td>7</td>
</tr>
</table>
@ -900,92 +857,52 @@
</table>
</br>
<p><b>Sega Genesis Controller (cannot be remapped, always associated with joystick and Booster Grip controllers)</b></p>
<p><b>Paddle Controller (digital emulation) (can be remapped)</b></p>
<table style="border: hidden">
<tr>
<td style="padding: 0px">
<table>
<tr>
<th colspan=2>Left Pad</th>
</tr>
<tr>
<th>Function</th>
<th>Key</th>
<th>Left Paddles Key</th>
<th>Right Paddles Key</th>
</tr>
<tr>
<td>Pad Up</td>
<td>Same as Left Joystick 'Up'</td>
<td>Paddle A Turn Left</td>
<td>Left arrow</td>
<td>G</td>
</tr>
<tr>
<td>Pad Down</td>
<td>Same as Left Joystick 'Down'</td>
<td>Paddle A Turn Right</td>
<td>Right arrow</td>
<td>J</td>
</tr>
<tr>
<td>Pad Left</td>
<td>Same as Left Joystick 'Left'</td>
<td>Paddle A Fire</td>
<td>Left Control, Space, Keypad 5</td>
<td>F</td>
</tr>
<tr>
<td>Pad Right</td>
<td>Same as Left Joystick 'Right'</td>
<td>Paddle B Turn Left</td>
<td>Up arrow</td>
<td>Y</td>
</tr>
<tr>
<td>Button 'B'</td>
<td>Same as Left Joystick 'Fire'</td>
<td>Paddle B Turn Right</td>
<td>Down arrow</td>
<td>H</td>
</tr>
<tr>
<td>Button 'C'</td>
<td>Same as Left Joystick 'Top Booster Button'</td>
</tr>
</table>
</td>
<td style="border: hidden"></td>
<td style="padding: 0px">
<table>
<tr>
<th colspan=2>Right Pad</th>
</tr>
<tr>
<th>Function</th>
<th>Key</th>
</tr>
<tr>
<td>Pad Up</td>
<td>Same as Right Joystick 'Up'</td>
</tr>
<tr>
<td>Pad Down</td>
<td>Same as Right Joystick 'Down'</td>
</tr>
<tr>
<td>Pad Left</td>
<td>Same as Right Joystick 'Left'</td>
</tr>
<tr>
<td>Pad Right</td>
<td>Same as Right Joystick 'Right'</td>
</tr>
<tr>
<td>Button 'B'</td>
<td>Same as Right Joystick 'Fire'</td>
</tr>
<tr>
<td>Button 'C'</td>
<td>Same as Right Joystick 'Top Booster Button'</td>
<td>Paddle B Fire</td>
<td>Right Control, 4</td>
<td>6</td>
</tr>
</table>
</td>
@ -999,54 +916,27 @@
<tr>
<td style="padding: 0px">
<table>
<tr>
<th colspan=2>Left Driving</th>
</tr>
<tr>
<th>Function</th>
<th>Key</th>
<th>Left Driving Key</th>
<th>Right Driving Key</th>
</tr>
<tr>
<td>Counter Clockwise</td>
<td>Turn Left</td>
<td>Left arrow, Keypad 4</td>
<td>G</td>
</tr>
<tr>
<td>Clockwise</td>
<td>Turn Right</td>
<td>Right arrow, Keypad 6</td>
</tr>
<tr>
<td>Fire Button</td>
<td>Left Control, Space, Keypad 5</td>
</tr>
</table>
</td>
<td style="border: hidden"></td>
<td style="padding: 0px">
<table>
<tr>
<th colspan=2>Right Driving</th>
</tr>
<tr>
<th>Function</th>
<th>Key</th>
</tr>
<tr>
<td>Counter Clockwise</td>
<td>G</td>
</tr>
<tr>
<td>Clockwise</td>
<td>J</td>
</tr>
<tr>
<td>Fire Button</td>
<td>Left Control, Space, Keypad 5</td>
<td>F</td>
</tr>
</table>
@ -1055,132 +945,19 @@
</table>
</br>
<p><b>Trackball Controller (uses mouse, left port only)</b></p>
<p><b>Trackball & Light Gun Controller (uses mouse, left port only)</b></p>
<table>
<tr>
<th colspan=2>Left Trackball</th>
</tr>
<tr>
<th>Function</th>
<th>Key</th>
<th>Left Trackball Key</th>
</tr>
<tr>
<td>Fire Button</td>
<td>Fire</td>
<td>Same as Left Joystick 'Fire'</td>
</tr>
</table>
</br>
<p><b>Light Gun Controller (uses mouse, left port only)</b></p>
<table>
<tr>
<th colspan=2>Left Light Gun</th>
</tr>
<tr>
<th>Function</th>
<th>Key</th>
</tr>
<tr>
<td>Fire Button</td>
<td>Same as Left Joystick 'Fire'</td>
</tr>
</table>
</br>
<p><b>Paddle Controller digital emulation (can be remapped)</b></p>
<table style="border: hidden">
<tr>
<td style="padding: 0px">
<table>
<tr>
<th colspan=2>Left Paddles</th>
</tr>
<tr>
<th>Function</th>
<th>Key</th>
</tr>
<tr>
<td>Paddle A Turn Left</td>
<td>Left arrow</td>
</tr>
<tr>
<td>Paddle A Turn Right</td>
<td>Right arrow</td>
</tr>
<tr>
<td>Paddle A Fire</td>
<td>Left Control, Space, Keypad 5</td>
</tr>
<tr>
<td>Paddle B Turn Left</td>
<td>Up arrow</td>
</tr>
<tr>
<td>Paddle B Turn Right</td>
<td>Down arrow</td>
</tr>
<tr>
<td>Paddle B Fire</td>
<td>Right Control, 4</td>
</tr>
</table>
</td>
<td style="border: hidden"></td>
<td style="padding: 0px">
<table>
<tr>
<th colspan=2>Right Paddles</th>
</tr>
<tr>
<th>Function</th>
<th>Key</th>
</tr>
<tr>
<td>Paddle A Turn Left</td>
<td>G</td>
</tr>
<tr>
<td>Paddle A Turn Right</td>
<td>J</td>
</tr>
<tr>
<td>Paddle A Fire</td>
<td>F</td>
</tr>
<tr>
<td>Paddle B Turn Left</td>
<td>Y</td>
</tr>
<tr>
<td>Paddle B Turn Right</td>
<td>H</td>
</tr>
<tr>
<td>Paddle B Fire</td>
<td>6</td>
</tr>
</table>
</td>
</tr>
</table>
</br>
<p><b>Keyboard Controller (can be remapped)</b></p>
@ -1188,145 +965,81 @@
<tr>
<td style="padding: 0px">
<table>
<tr>
<th colspan=2>Left Keyboard</th>
</tr>
<tr>
<th>Pad Button</th>
<th>Key</th>
<th>Left Keyboard Key</th>
<th>Right Keyboard Key</th>
</tr>
<tr>
<td>1</td>
<td>1</td>
<td>8</td>
</tr>
<tr>
<td>2</td>
<td>2</td>
<td>9</td>
</tr>
<tr>
<td>3</td>
<td>3</td>
<td>0</td>
</tr>
<tr>
<td>4</td>
<td>Q</td>
</tr>
<tr>
<td>5</td>
<td>W</td>
</tr>
<tr>
<td>6</td>
<td>E</td>
</tr>
<tr>
<td>7</td>
<td>A</td>
</tr>
<tr>
<td>8</td>
<td>S</td>
</tr>
<tr>
<td>9</td>
<td>D</td>
</tr>
<tr>
<td>.</td>
<td>Z</td>
</tr>
<tr>
<td>0</td>
<td>X</td>
</tr>
<tr>
<td>#</td>
<td>C</td>
</tr>
</table>
</td>
<td style="border: hidden"></td>
<td style="padding: 0px">
<table>
<tr>
<th colspan=2>Right Keyboard</th>
</tr>
<tr>
<th>Pad Button</th>
<th>Key</th>
</tr>
<tr>
<td>1</td>
<td>8</td>
</tr>
<tr>
<td>2</td>
<td>9</td>
</tr>
<tr>
<td>3</td>
<td>0</td>
</tr>
<tr>
<td>4</td>
<td>I</td>
</tr>
<tr>
<td>5</td>
<td>W</td>
<td>O</td>
</tr>
<tr>
<td>6</td>
<td>E</td>
<td>P</td>
</tr>
<tr>
<td>7</td>
<td>A</td>
<td>K</td>
</tr>
<tr>
<td>8</td>
<td>S</td>
<td>L</td>
</tr>
<tr>
<td>9</td>
<td>D</td>
<td>;</td>
</tr>
<tr>
<td>.</td>
<td>Z</td>
<td>,</td>
</tr>
<tr>
<td>0</td>
<td>X</td>
<td>.</td>
</tr>
<tr>
<td>#</td>
<td>C</td>
<td>/</td>
</tr>
</table>
@ -1518,7 +1231,7 @@
</table>
</br>
<p><b>TV effects Keys (can be remapped)</b></p>
<p><b>TV Effects Keys (can be remapped)</b></p>
<table BORDER=2 cellpadding=4>
<tr>
@ -2192,7 +1905,6 @@
<td>Shift-Control-Alt + P to enter, Shift-Control-Alt + P/Escape to exit and continue with emulation</td>
<td>Shift-Control-Cmd + P to enter, Shift-Control-Cmd + P/Escape to exit and continue with emulation</td>
</tr>
</table>
</br>
@ -2556,7 +2268,7 @@
<tr>
<th> Booster Grip</th>
<td> &#x2713;</td>
<td> &#x2713;</td>
<td> &#x2713; (+ extra)</td>
<td> &#x2713; (+ extra)</td>
<td> &#x2715;</td>
<td> &#x2713; (+ extra)</td>
@ -2569,6 +2281,14 @@
<td> &#x2715;</td>
<td> &#x2715;</td>
</tr>
<tr>
<th> Joy 2B+</th>
<td> &#x2713;</td>
<td> &#x2713; (+ extra)</td>
<td> &#x2713; (+ extra)</td>
<td> &#x2715;</td>
<td> &#x2715; (+ extra)</td>
</tr>
<tr>
<th> Keyboard</th>
<td> &#x2713;</td>
@ -5260,6 +4980,7 @@ Ms Pac-Man (Stella extended codes):
<tr><td><a href="https://atariage.com/store/index.php?l=product_detail&p=1045">AtariVox &#185</a></td><td>A SpeakJet based unlimited-vocabulary speech/sound synthesizer with 32K EEPROM.</td></tr>
<tr><td>SaveKey</td><td>A 32K EEPROM for saving high scores, etc. (the EEPROM portion of an AtariVox).</td></tr>
<tr><td>Genesis </td><td>Sega Genesis controller, which can be used similar to a Booster Grip, giving an extra button.</td></tr>
<tr><td>Joy2B+ </td><td><a href="https://github.com/ascrnet/Joy2Bplus">Joy 2B+</a> controller, which can be used similar to a Booster Grip, giving two extra buttons.</td></tr>
<tr><td>CompuMate &#185</td><td>Spectravideo CompuMate (if either left or right is set, CompuMate is used for both).</td></tr>
<tr><td>Lightgun</td><td>Atari XG-1 compatible Light Gun.</td></tr>
<tr><td>MindLink &#185</td><td>MindLink controller.</td></tr>

View File

@ -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<Controller::DigitalPin, 5> Joy2BPlusWidget::ourPinNo;

View File

@ -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<CheckboxWidget*, 7> myPins{nullptr};
static constexpr std::array<Controller::DigitalPin, 5> 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

View File

@ -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);
}

View File

@ -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 \

View File

@ -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());
}

View File

@ -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<Controller> Console::getControllerPort(const Controller::Type type,
controller = make_unique<QuadTari>(port, myOSystem, *mySystem, myProperties);
break;
case Controller::Type::Joy2BPlus:
controller = make_unique<Joy2BPlus>(port, myEvent, *mySystem);
break;
default:
// What else can we do?
// always create because it may have been changed by user dialog

View File

@ -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<int>(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<int>(type)];

View File

@ -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
};

View File

@ -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;

View File

@ -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);

View File

@ -840,7 +840,7 @@ static constexpr BSPF::array2D<const char*, DEF_PROPS_SIZE, 29> 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<const char*, DEF_PROPS_SIZE, 29> 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<const char*, DEF_PROPS_SIZE, 29> 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<const char*, DEF_PROPS_SIZE, 29> 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<const char*, DEF_PROPS_SIZE, 29> 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", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },

View File

@ -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

53
src/emucore/Joy2BPlus.cxx Normal file
View File

@ -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());
}

71
src/emucore/Joy2BPlus.hxx Normal file
View File

@ -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

View File

@ -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

View File

@ -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"

View File

@ -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");

View File

@ -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);

View File

@ -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);
}

View File

@ -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);

View File

@ -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");

View File

@ -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");

View File

@ -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 \

View File

@ -259,6 +259,7 @@
<ClCompile Include="..\emucore\FSNode.cxx" />
<ClCompile Include="..\emucore\Genesis.cxx" />
<ClCompile Include="..\emucore\GlobalKeyHandler.cxx" />
<ClCompile Include="..\emucore\Joy2BPlus.cxx" />
<ClCompile Include="..\emucore\Joystick.cxx" />
<ClCompile Include="..\emucore\Keyboard.cxx" />
<ClCompile Include="..\emucore\KidVid.cxx" />

View File

@ -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 = "<group>"; };
DCE1FF3C286B5D5A003568AD /* FSNodeREGULAR.hxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = FSNodeREGULAR.hxx; sourceTree = "<group>"; };
DCE1FF3D286B5D5A003568AD /* FSNodeREGULAR.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FSNodeREGULAR.cxx; sourceTree = "<group>"; };
DCE1FF40286DFB76003568AD /* Joy2BPlusWidget.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Joy2BPlusWidget.cxx; sourceTree = "<group>"; };
DCE1FF41286DFB76003568AD /* Joy2BPlusWidget.hxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = Joy2BPlusWidget.hxx; sourceTree = "<group>"; };
DCE1FF44286DFB98003568AD /* Joy2BPlus.hxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = Joy2BPlus.hxx; sourceTree = "<group>"; };
DCE1FF45286DFB98003568AD /* Joy2BPlus.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Joy2BPlus.cxx; sourceTree = "<group>"; };
DCE395EA16CB0B5F008DB1E5 /* FSNodeFactory.hxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = FSNodeFactory.hxx; sourceTree = "<group>"; };
DCE395EB16CB0B5F008DB1E5 /* FSNodeZIP.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FSNodeZIP.cxx; sourceTree = "<group>"; };
DCE395EC16CB0B5F008DB1E5 /* FSNodeZIP.hxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = FSNodeZIP.hxx; sourceTree = "<group>"; };
@ -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 */,

View File

@ -828,6 +828,7 @@
<ClCompile Include="..\debugger\gui\GenesisWidget.cxx">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug-NoDebugger|x64'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\debugger\gui\Joy2BPlusWidget.cxx" />
<ClCompile Include="..\debugger\gui\JoystickWidget.cxx">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug-NoDebugger|x64'">true</ExcludedFromBuild>
</ClCompile>
@ -886,6 +887,7 @@
<ClCompile Include="..\emucore\EmulationWorker.cxx" />
<ClCompile Include="..\emucore\FBSurface.cxx" />
<ClCompile Include="..\emucore\GlobalKeyHandler.cxx" />
<ClCompile Include="..\emucore\Joy2BPlus.cxx" />
<ClCompile Include="..\emucore\Lightgun.cxx" />
<ClCompile Include="..\emucore\MindLink.cxx" />
<ClCompile Include="..\emucore\OSystemStandalone.cxx" />
@ -2014,6 +2016,7 @@
<ClInclude Include="..\debugger\gui\GenesisWidget.hxx">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug-NoDebugger|x64'">true</ExcludedFromBuild>
</ClInclude>
<ClInclude Include="..\debugger\gui\Joy2BPlusWidget.hxx" />
<ClInclude Include="..\debugger\gui\JoystickWidget.hxx">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug-NoDebugger|x64'">true</ExcludedFromBuild>
</ClInclude>
@ -2088,6 +2091,7 @@
<ClInclude Include="..\emucore\FBSurface.hxx" />
<ClInclude Include="..\emucore\FrameBufferConstants.hxx" />
<ClInclude Include="..\emucore\GlobalKeyHandler.hxx" />
<ClInclude Include="..\emucore\Joy2BPlus.hxx" />
<ClInclude Include="..\emucore\Lightgun.hxx" />
<ClInclude Include="..\emucore\MindLink.hxx" />
<ClInclude Include="..\emucore\OSystemStandalone.hxx" />

View File

@ -1139,6 +1139,11 @@
</ClCompile>
<ClCompile Include="..\common\FSNodeREGULAR.cxx">
<Filter>Source Files</Filter>
<ClCompile Include="..\emucore\Joy2BPlus.cxx">
<Filter>Source Files\emucore</Filter>
</ClCompile>
<ClCompile Include="..\debugger\gui\Joy2BPlusWidget.cxx">
<Filter>Source Files\debugger</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
@ -2359,6 +2364,11 @@
</ClInclude>
<ClInclude Include="..\common\FSNodeREGULAR.hxx">
<Filter>Header Files</Filter>
<ClInclude Include="..\emucore\Joy2BPlus.hxx">
<Filter>Header Files\emucore</Filter>
</ClInclude>
<ClInclude Include="..\debugger\gui\Joy2BPlusWidget.hxx">
<Filter>Header Files\debugger</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>