add BurnTrackballConfigStartStopPoints() to trackball device

This commit is contained in:
dinkc64 2019-08-08 22:28:45 -04:00
parent 75918297a5
commit 4c93aa6b86
3 changed files with 46 additions and 16 deletions

View File

@ -1,9 +1,9 @@
#include "burnint.h" #include "burnint.h"
#include "burn_gun.h" #include "burn_gun.h"
// Generic Light Gun support for FBA // Generic Light Gun & Trackball (dial, paddle, wheel, trackball) support for FBA
// written by Barry Harris (Treble Winner) based on the code in Kev's opwolf driver // written by Barry Harris (Treble Winner) based on the code in Kev's opwolf driver
// Trackball/Paddle/Dial section by dink // Trackball/Paddle/Dial emulation by dink
INT32 nBurnGunNumPlayers = 0; INT32 nBurnGunNumPlayers = 0;
bool bBurnGunAutoHide = 1; bool bBurnGunAutoHide = 1;
@ -145,12 +145,14 @@ void BurnPaddleReturn(BurnDialINF &dial, INT32 num, INT32 isB)
} }
// Trackball Helpers // Trackball Helpers
static UINT16 TrackA[MAX_GUNS]; // trackball counters static INT32 TrackA[MAX_GUNS]; // trackball counters
static UINT16 TrackB[MAX_GUNS]; static INT32 TrackB[MAX_GUNS];
static INT32 DIAL_INC[MAX_GUNS * 2]; // velocity counter static INT32 DIAL_INC[MAX_GUNS * 2]; // velocity counter
static UINT8 DrvJoyT[MAX_GUNS * 4]; // direction bytes static UINT8 DrvJoyT[MAX_GUNS * 4]; // direction bytes
static UINT8 TrackRev[MAX_GUNS * 2]; // normal/reversed config static UINT8 TrackRev[MAX_GUNS * 2]; // normal/reversed config
static INT32 TrackStart[MAX_GUNS * 2]; // Start / Stop points
static INT32 TrackStop[MAX_GUNS * 2];
void BurnTrackballFrame(INT32 dev, INT16 PortA, INT16 PortB, INT32 VelocityStart, INT32 VelocityMax) void BurnTrackballFrame(INT32 dev, INT16 PortA, INT16 PortB, INT32 VelocityStart, INT32 VelocityMax)
{ {
@ -193,6 +195,14 @@ void BurnTrackballUpdate(INT32 dev)
else else
TrackA[dev] += DIAL_INC[(dev*2) + 0]; TrackA[dev] += DIAL_INC[(dev*2) + 0];
} }
// PortA Start / Stop points (if configured)
if (TrackStart[(dev*2) + 0] != -1 && TrackA[dev] < TrackStart[(dev*2) + 0])
TrackA[dev] = TrackStart[(dev*2) + 0];
if (TrackStop[(dev*2) + 0] != -1 && TrackA[dev] > TrackStop[(dev*2) + 0])
TrackA[dev] = TrackStop[(dev*2) + 0];
// PortB (usually Y-Axis) // PortB (usually Y-Axis)
if (DrvJoyT[(dev*4) + 2]) { // Backward if (DrvJoyT[(dev*4) + 2]) { // Backward
if (TrackRev[(dev*2) + 1]) if (TrackRev[(dev*2) + 1])
@ -206,6 +216,13 @@ void BurnTrackballUpdate(INT32 dev)
else else
TrackB[dev] += DIAL_INC[(dev*2) + 1]; TrackB[dev] += DIAL_INC[(dev*2) + 1];
} }
// PortB Start / Stop points (if configured)
if (TrackStart[(dev*2) + 1] != -1 && TrackB[dev] < TrackStart[(dev*2) + 1])
TrackB[dev] = TrackStart[(dev*2) + 1];
if (TrackStop[(dev*2) + 1] != -1 && TrackB[dev] > TrackStop[(dev*2) + 1])
TrackB[dev] = TrackStop[(dev*2) + 1];
} }
void BurnTrackballUpdateSlither(INT32 dev) void BurnTrackballUpdateSlither(INT32 dev)
@ -217,30 +234,30 @@ void BurnTrackballUpdateSlither(INT32 dev)
flippy[0] ^= 1; flippy[0] ^= 1;
if (flippy[0]) return; if (flippy[0]) return;
if (TrackRev[(dev*2) + 0]) if (TrackRev[(dev*2) + 0])
TrackA[dev] += DIAL_INC[(dev*2) + 0] / 2; TrackA[dev] += DIAL_INC[(dev*2) + 0];
else else
TrackA[dev] -= DIAL_INC[(dev*2) + 0] / 2; TrackA[dev] -= DIAL_INC[(dev*2) + 0];
} }
if (DrvJoyT[(dev*4) + 1]) { // Forward if (DrvJoyT[(dev*4) + 1]) { // Forward
if (TrackRev[(dev*2) + 0]) if (TrackRev[(dev*2) + 0])
TrackA[dev] -= DIAL_INC[(dev*2) + 0] / 2; TrackA[dev] -= DIAL_INC[(dev*2) + 0];
else else
TrackA[dev] += DIAL_INC[(dev*2) + 0] / 2; TrackA[dev] += DIAL_INC[(dev*2) + 0];
} }
// PortB (usually Y-Axis) // PortB (usually Y-Axis)
if (DrvJoyT[(dev*4) + 2]) { // Backward if (DrvJoyT[(dev*4) + 2]) { // Backward
if (TrackRev[(dev*2) + 1]) if (TrackRev[(dev*2) + 1])
TrackB[dev] += DIAL_INC[(dev*2) + 1] / 2; TrackB[dev] += DIAL_INC[(dev*2) + 1];
else else
TrackB[dev] -= DIAL_INC[(dev*2) + 1] / 2; TrackB[dev] -= DIAL_INC[(dev*2) + 1];
} }
if (DrvJoyT[(dev*4) + 3]) { // Forward if (DrvJoyT[(dev*4) + 3]) { // Forward
flippy[1] ^= 1; flippy[1] ^= 1;
if (flippy[1]) return; if (flippy[1]) return;
if (TrackRev[(dev*2) + 1]) if (TrackRev[(dev*2) + 1])
TrackB[dev] -= DIAL_INC[(dev*2) + 1] / 2; TrackB[dev] -= DIAL_INC[(dev*2) + 1];
else else
TrackB[dev] += DIAL_INC[(dev*2) + 1] / 2; TrackB[dev] += DIAL_INC[(dev*2) + 1];
} }
} }
@ -273,6 +290,15 @@ void BurnTrackballConfig(INT32 dev, INT32 PortA_rev, INT32 PortB_rev)
TrackRev[(dev*2) + 0] = PortA_rev; TrackRev[(dev*2) + 0] = PortA_rev;
TrackRev[(dev*2) + 1] = PortB_rev; TrackRev[(dev*2) + 1] = PortB_rev;
} }
void BurnTrackballConfigStartStopPoints(INT32 dev, INT32 PortA_Start, INT32 PortA_Stop, INT32 PortB_Start, INT32 PortB_Stop)
{
TrackStart[(dev*2) + 0] = PortA_Start;
TrackStart[(dev*2) + 1] = PortB_Start;
TrackStop[(dev*2) + 0] = PortA_Stop;
TrackStop[(dev*2) + 1] = PortB_Stop;
}
// end Trackball Helpers // end Trackball Helpers
void BurnPaddleSetWrap(INT32 num, INT32 xmin, INT32 xmax, INT32 ymin, INT32 ymax) void BurnPaddleSetWrap(INT32 num, INT32 xmin, INT32 xmax, INT32 ymin, INT32 ymax)
@ -374,12 +400,16 @@ void BurnGunInit(INT32 nNumPlayers, bool bDrawTargets)
BurnPaddleSetWrap(i, 0, 0xf0, 0, 0xf0); // Paddle/dial stuff BurnPaddleSetWrap(i, 0, 0xf0, 0, 0xf0); // Paddle/dial stuff
} }
// Trackball stuff // Trackball stuff (init)
memset(&TrackA, 0, sizeof(TrackA)); memset(&TrackA, 0, sizeof(TrackA));
memset(&TrackB, 0, sizeof(TrackB)); memset(&TrackB, 0, sizeof(TrackB));
memset(&DrvJoyT, 0, sizeof(DrvJoyT)); memset(&DrvJoyT, 0, sizeof(DrvJoyT));
memset(&DIAL_INC, 0, sizeof(DIAL_INC)); memset(&DIAL_INC, 0, sizeof(DIAL_INC));
memset(&TrackRev, 0, sizeof(TrackRev)); memset(&TrackRev, 0, sizeof(TrackRev));
for (INT32 i = 0; i < MAX_GUNS*2; i++) {
TrackStart[i] = -1;
TrackStop[i] = -1;
}
} }
void BurnGunExit() void BurnGunExit()
@ -420,7 +450,6 @@ void BurnGunScan()
SCAN_VAR(DIAL_INC); SCAN_VAR(DIAL_INC);
SCAN_VAR(DrvJoyT); SCAN_VAR(DrvJoyT);
SCAN_VAR(TrackRev);
} }
} }

View File

@ -58,6 +58,7 @@ void BurnTrackballUDLR(INT32 dev, INT32 u, INT32 d, INT32 l, INT32 r);
// Configure if an axis (Port) is reversed (1) or normal (0) // Configure if an axis (Port) is reversed (1) or normal (0)
void BurnTrackballConfig(INT32 dev, INT32 PortA_rev, INT32 PortB_rev); void BurnTrackballConfig(INT32 dev, INT32 PortA_rev, INT32 PortB_rev);
void BurnTrackballConfigStartStopPoints(INT32 dev, INT32 PortA_Start, INT32 PortA_Stop, INT32 PortB_Start, INT32 PortB_Stop);
// Read the position counter (8/16bit) // Read the position counter (8/16bit)
UINT8 BurnTrackballRead(INT32 dev, INT32 isB); UINT8 BurnTrackballRead(INT32 dev, INT32 isB);

View File

@ -1097,8 +1097,8 @@ static INT32 DrvFrame()
if (is_slither) { if (is_slither) {
BurnTrackballConfig(0, AXIS_NORMAL, AXIS_REVERSED); BurnTrackballConfig(0, AXIS_NORMAL, AXIS_REVERSED);
BurnTrackballConfig(1, AXIS_NORMAL, AXIS_REVERSED); BurnTrackballConfig(1, AXIS_NORMAL, AXIS_REVERSED);
BurnTrackballFrame(0, DrvAnalogPort0, DrvAnalogPort1, 2, 3); BurnTrackballFrame(0, DrvAnalogPort0, DrvAnalogPort1, 1, 2);
BurnTrackballFrame(1, DrvAnalogPort2, DrvAnalogPort3, 2, 3); BurnTrackballFrame(1, DrvAnalogPort2, DrvAnalogPort3, 1, 2);
BurnTrackballUpdateSlither(0); BurnTrackballUpdateSlither(0);
BurnTrackballUpdateSlither(1); BurnTrackballUpdateSlither(1);
} }