mirror of https://github.com/stella-emu/stella.git
parent
86e01bc8b9
commit
8bf1f0c404
|
@ -275,7 +275,7 @@
|
||||||
<li>Emulates <a href="http://en.wikipedia.org/wiki/CompuMate">Spectravideo CompuMate</a> system using your computer's keyboard,
|
<li>Emulates <a href="http://en.wikipedia.org/wiki/CompuMate">Spectravideo CompuMate</a> system using your computer's keyboard,
|
||||||
including mapping of CompuMate 'Backspace', 'Space' and 'Enter' functionality to
|
including mapping of CompuMate 'Backspace', 'Space' and 'Enter' functionality to
|
||||||
to the actual keys on your keyboard</li>
|
to the actual keys on your keyboard</li>
|
||||||
<li>Emulates the Mindlink Controller using your computer's mouse</li>
|
<li>Emulates the Mindlink Controller and the Light Gun using your computer's mouse</li>
|
||||||
<li>Supports autodetection for most common controller types</li>
|
<li>Supports autodetection for most common controller types</li>
|
||||||
<li>Support for real Atari 2600 controllers using the
|
<li>Support for real Atari 2600 controllers using the
|
||||||
<a href="http://www.grandideastudio.com/portfolio/stelladaptor-2600">Stelladaptor</a> and
|
<a href="http://www.grandideastudio.com/portfolio/stelladaptor-2600">Stelladaptor</a> and
|
||||||
|
@ -1784,6 +1784,14 @@
|
||||||
<td> ✕</td>
|
<td> ✕</td>
|
||||||
<td> ✕</td>
|
<td> ✕</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th> Light Gun</th>
|
||||||
|
<td> ✕</td>
|
||||||
|
<td> ✕</td>
|
||||||
|
<td> ✓</td>
|
||||||
|
<td> ✕</td>
|
||||||
|
<td> ✕</td>
|
||||||
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th> Mindlink</th>
|
<th> Mindlink</th>
|
||||||
<td> ✕</td>
|
<td> ✕</td>
|
||||||
|
@ -3817,6 +3825,7 @@ Ms Pac-Man (Stella extended codes):
|
||||||
<tr><td>SaveKey</td><td>A 32K EEPROM for saving high scores, etc. (the EEPROM portion of an AtariVox).</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 BoosterGrip, giving an extra button.</td></tr>
|
<tr><td>Genesis </td><td>Sega Genesis controller, which can be used similar to a BoosterGrip, giving an extra button.</td></tr>
|
||||||
<tr><td>CompuMate ¹</td><td>Spectravideo CompuMate (if either left or right is set, CompuMate is used for both).</td></tr>
|
<tr><td>CompuMate ¹</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 ¹</td><td>Mindlink controller.</td></tr>
|
<tr><td>Mindlink ¹</td><td>Mindlink controller.</td></tr>
|
||||||
</table></td>
|
</table></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
|
@ -16,12 +16,16 @@
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
||||||
|
|
||||||
|
#include "Event.hxx"
|
||||||
#include "TIA.hxx"
|
#include "TIA.hxx"
|
||||||
#include "System.hxx"
|
|
||||||
#include "FrameBuffer.hxx"
|
#include "FrameBuffer.hxx"
|
||||||
|
|
||||||
#include "Lightgun.hxx"
|
#include "Lightgun.hxx"
|
||||||
|
|
||||||
|
// | | Left port | Right port |
|
||||||
|
// | Fire button | SWCHA bit 4 | SWCHA bit 0 | DP:1
|
||||||
|
// | Detect light | INPT4 bit 7 | INPT5 bit 7 | DP:6
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
Lightgun::Lightgun(Jack jack, const Event& event, const System& system, const FrameBuffer& frameBuffer)
|
Lightgun::Lightgun(Jack jack, const Event& event, const System& system, const FrameBuffer& frameBuffer)
|
||||||
: Controller(jack, event, system, Controller::Type::Lightgun),
|
: Controller(jack, event, system, Controller::Type::Lightgun),
|
||||||
|
@ -32,31 +36,30 @@ Lightgun::Lightgun(Jack jack, const Event& event, const System& system, const Fr
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
bool Lightgun::read(DigitalPin pin)
|
bool Lightgun::read(DigitalPin pin)
|
||||||
{
|
{
|
||||||
|
|
||||||
// We need to override the Controller::read() method, since the lightgun
|
// We need to override the Controller::read() method, since the lightgun
|
||||||
// checks this multiple times per frame
|
// checks this multiple times per frame
|
||||||
// (we can't just read 60 times per second in the ::update() method)
|
// (we can't just read 60 times per second in the ::update() method)
|
||||||
switch (pin)
|
switch (pin)
|
||||||
{
|
{
|
||||||
// Pin 6: INPT4/5
|
case DigitalPin::Six: // INPT4/5
|
||||||
case DigitalPin::Six:
|
|
||||||
{
|
{
|
||||||
const Common::Rect& rect = myFrameBuffer.imageRect();
|
const Common::Rect& rect = myFrameBuffer.imageRect();
|
||||||
// scale mouse coordinates into TIA coordinates
|
// scale mouse coordinates into TIA coordinates
|
||||||
Int32 xpos = (myMouseX - rect.x()) * TIAConstants::H_PIXEL / rect.w();
|
Int32 xMouse = (myEvent.get(Event::MouseAxisXValue) - rect.x())
|
||||||
Int32 ypos = (myMouseY - rect.y()) * 210 / rect.h(); // TODO: replace "magic number"
|
* TIAConstants::H_PIXEL / rect.w();
|
||||||
|
Int32 yMouse = (myEvent.get(Event::MouseAxisYValue) - rect.y())
|
||||||
|
* 210 / rect.h(); // TODO: replace "magic number"
|
||||||
// get adjusted TIA coordinates
|
// get adjusted TIA coordinates
|
||||||
Int32 x = mySystem.tia().clocksThisLine() - TIAConstants::H_BLANK_CLOCKS + X_OFS;
|
Int32 xTia = mySystem.tia().clocksThisLine() - TIAConstants::H_BLANK_CLOCKS + X_OFS;
|
||||||
Int32 y = mySystem.tia().scanlines() - mySystem.tia().startLine() + Y_OFS;
|
Int32 yTia = mySystem.tia().scanlines() - mySystem.tia().startLine() + Y_OFS;
|
||||||
|
|
||||||
if (x < 0)
|
if (xTia < 0)
|
||||||
x += TIAConstants::H_CLOCKS;
|
xTia += TIAConstants::H_CLOCKS;
|
||||||
|
|
||||||
bool enable = !((x - xpos) >= 0 && (x - xpos) < 15 && (y - ypos) >= 0);
|
bool enable = !((xTia - xMouse) >= 0 && (xTia - xMouse) < 15 && (yTia - yMouse) >= 0);
|
||||||
|
|
||||||
return enable;
|
return enable;
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return Controller::read(pin);
|
return Controller::read(pin);
|
||||||
}
|
}
|
||||||
|
@ -65,16 +68,8 @@ bool Lightgun::read(DigitalPin pin)
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void Lightgun::update()
|
void Lightgun::update()
|
||||||
{
|
{
|
||||||
// | | Left port | Right port |
|
// we allow left and right mouse buttons for fire button
|
||||||
// | Fire button | SWCHA bit 4 | SWCHA bit 0 | DP:1
|
setPin(DigitalPin::One, myEvent.get(Event::MouseButtonLeftValue)
|
||||||
// | Detect light | INPT4 bit 7 | INPT5 bit 7 | DP:6
|
|| myEvent.get(Event::MouseButtonRightValue));
|
||||||
|
|
||||||
Int32 xVal = myEvent.get(Event::MouseAxisXValue);
|
|
||||||
Int32 yVal = myEvent.get(Event::MouseAxisYValue);
|
|
||||||
|
|
||||||
myMouseX = xVal ? xVal : myMouseX;
|
|
||||||
myMouseY = yVal ? yVal : myMouseY;
|
|
||||||
|
|
||||||
setPin(DigitalPin::One, myEvent.get(Event::MouseButtonLeftValue) || myEvent.get(Event::MouseButtonRightValue));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,10 +18,6 @@
|
||||||
#ifndef LIGHTGUN_HXX
|
#ifndef LIGHTGUN_HXX
|
||||||
#define LIGHTGUN_HXX
|
#define LIGHTGUN_HXX
|
||||||
|
|
||||||
#include "bspf.hxx"
|
|
||||||
#include "Control.hxx"
|
|
||||||
#include "Event.hxx"
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This class handles the lightgun controller
|
This class handles the lightgun controller
|
||||||
|
|
||||||
|
@ -63,21 +59,12 @@ public:
|
||||||
*/
|
*/
|
||||||
string name() const override { return "Lightgun"; }
|
string name() const override { return "Lightgun"; }
|
||||||
|
|
||||||
/**
|
|
||||||
Answers whether the controller is intrinsically an analog controller.
|
|
||||||
*/
|
|
||||||
bool isAnalog() const override { return true; }
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const FrameBuffer& myFrameBuffer;
|
const FrameBuffer& myFrameBuffer;
|
||||||
Int32 myMouseX{0}, myMouseY{0};
|
|
||||||
|
|
||||||
static constexpr Int32 X_OFS = -21;
|
static constexpr Int32 X_OFS = -21;
|
||||||
static constexpr Int32 Y_OFS = 5;
|
static constexpr Int32 Y_OFS = 5;
|
||||||
|
|
||||||
// Lookup table for associating paddle buttons with controller pins
|
|
||||||
static const Controller::DigitalPin ourButtonPin;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Following constructors and assignment operators not supported
|
// Following constructors and assignment operators not supported
|
||||||
Lightgun() = delete;
|
Lightgun() = delete;
|
||||||
|
|
Loading…
Reference in New Issue