mirror of
https://github.com/libretro/snes9x.git
synced 2024-11-27 10:30:31 +00:00
Prevent read_idx from overflowing
This commit is contained in:
parent
7498a1aa4a
commit
f139bf704f
44
controls.cpp
44
controls.cpp
@ -3085,6 +3085,16 @@ void S9xSetJoypadLatch (bool latch)
|
|||||||
FLAG_LATCH = latch;
|
FLAG_LATCH = latch;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// prevent read_idx from overflowing (only latching resets it)
|
||||||
|
// otherwise $4016/7 reads will start returning input data again
|
||||||
|
static inline uint8 IncreaseReadIdxPost(uint8 &var)
|
||||||
|
{
|
||||||
|
uint8 oldval = var;
|
||||||
|
if (var < 255)
|
||||||
|
var++;
|
||||||
|
return oldval;
|
||||||
|
}
|
||||||
|
|
||||||
uint8 S9xReadJOYSERn (int n)
|
uint8 S9xReadJOYSERn (int n)
|
||||||
{
|
{
|
||||||
int i, j, r;
|
int i, j, r;
|
||||||
@ -3139,7 +3149,7 @@ uint8 S9xReadJOYSERn (int n)
|
|||||||
switch (i = curcontrollers[n])
|
switch (i = curcontrollers[n])
|
||||||
{
|
{
|
||||||
case MP5:
|
case MP5:
|
||||||
r = read_idx[n][FLAG_IOBIT(n) ? 0 : 1]++;
|
r = IncreaseReadIdxPost(read_idx[n][FLAG_IOBIT(n) ? 0 : 1]);
|
||||||
j = FLAG_IOBIT(n) ? 0 : 2;
|
j = FLAG_IOBIT(n) ? 0 : 2;
|
||||||
|
|
||||||
for (i = 0; i < 2; i++, j++)
|
for (i = 0; i < 2; i++, j++)
|
||||||
@ -3164,64 +3174,64 @@ uint8 S9xReadJOYSERn (int n)
|
|||||||
case JOYPAD7:
|
case JOYPAD7:
|
||||||
if (read_idx[n][0] >= 16)
|
if (read_idx[n][0] >= 16)
|
||||||
{
|
{
|
||||||
read_idx[n][0]++;
|
IncreaseReadIdxPost(read_idx[n][0]);
|
||||||
return (bits | 1);
|
return (bits | 1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return (bits | ((joypad[i - JOYPAD0].buttons & (0x8000 >> read_idx[n][0]++)) ? 1 : 0));
|
return (bits | ((joypad[i - JOYPAD0].buttons & (0x8000 >> IncreaseReadIdxPost(read_idx[n][0]))) ? 1 : 0));
|
||||||
|
|
||||||
case MOUSE0:
|
case MOUSE0:
|
||||||
case MOUSE1:
|
case MOUSE1:
|
||||||
if (read_idx[n][0] < 8)
|
if (read_idx[n][0] < 8)
|
||||||
{
|
{
|
||||||
read_idx[n][0]++;
|
IncreaseReadIdxPost(read_idx[n][0]);
|
||||||
return (bits);
|
return (bits);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
if (read_idx[n][0] < 16)
|
if (read_idx[n][0] < 16)
|
||||||
return (bits | ((mouse[i - MOUSE0].buttons & (0x8000 >> read_idx[n][0]++)) ? 1 : 0));
|
return (bits | ((mouse[i - MOUSE0].buttons & (0x8000 >> IncreaseReadIdxPost(read_idx[n][0]))) ? 1 : 0));
|
||||||
else
|
else
|
||||||
if (read_idx[n][0] < 24)
|
if (read_idx[n][0] < 24)
|
||||||
return (bits | ((mouse[i - MOUSE0].delta_y & (0x800000 >> read_idx[n][0]++)) ? 1 : 0));
|
return (bits | ((mouse[i - MOUSE0].delta_y & (0x800000 >> IncreaseReadIdxPost(read_idx[n][0]))) ? 1 : 0));
|
||||||
else
|
else
|
||||||
if (read_idx[n][0] < 32)
|
if (read_idx[n][0] < 32)
|
||||||
return (bits | ((mouse[i - MOUSE0].delta_x & (0x80000000 >> read_idx[n][0]++)) ? 1 : 0));
|
return (bits | ((mouse[i - MOUSE0].delta_x & (0x80000000 >> IncreaseReadIdxPost(read_idx[n][0]))) ? 1 : 0));
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
read_idx[n][0]++;
|
IncreaseReadIdxPost(read_idx[n][0]);
|
||||||
return (bits | 1);
|
return (bits | 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
case SUPERSCOPE:
|
case SUPERSCOPE:
|
||||||
if (read_idx[n][0] < 8)
|
if (read_idx[n][0] < 8)
|
||||||
return (bits | ((superscope.read_buttons & (0x80 >> read_idx[n][0]++)) ? 1 : 0));
|
return (bits | ((superscope.read_buttons & (0x80 >> IncreaseReadIdxPost(read_idx[n][0]))) ? 1 : 0));
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
read_idx[n][0]++;
|
IncreaseReadIdxPost(read_idx[n][0]);
|
||||||
return (bits | 1);
|
return (bits | 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
case ONE_JUSTIFIER:
|
case ONE_JUSTIFIER:
|
||||||
if (read_idx[n][0] < 24)
|
if (read_idx[n][0] < 24)
|
||||||
return (bits | ((0xaa7000 >> read_idx[n][0]++) & 1));
|
return (bits | ((0xaa7000 >> IncreaseReadIdxPost(read_idx[n][0])) & 1));
|
||||||
else
|
else
|
||||||
if (read_idx[n][0] < 32)
|
if (read_idx[n][0] < 32)
|
||||||
return (bits | ((justifier.buttons & (JUSTIFIER_TRIGGER | JUSTIFIER_START | JUSTIFIER_SELECT) & (0x80000000 >> read_idx[n][0]++)) ? 1 : 0));
|
return (bits | ((justifier.buttons & (JUSTIFIER_TRIGGER | JUSTIFIER_START | JUSTIFIER_SELECT) & (0x80000000 >> IncreaseReadIdxPost(read_idx[n][0]))) ? 1 : 0));
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
read_idx[n][0]++;
|
IncreaseReadIdxPost(read_idx[n][0]);
|
||||||
return (bits | 1);
|
return (bits | 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
case TWO_JUSTIFIERS:
|
case TWO_JUSTIFIERS:
|
||||||
if (read_idx[n][0] < 24)
|
if (read_idx[n][0] < 24)
|
||||||
return (bits | ((0xaa7000 >> read_idx[n][0]++) & 1));
|
return (bits | ((0xaa7000 >> IncreaseReadIdxPost(read_idx[n][0])) & 1));
|
||||||
else
|
else
|
||||||
if (read_idx[n][0] < 32)
|
if (read_idx[n][0] < 32)
|
||||||
return (bits | ((justifier.buttons & (0x80000000 >> read_idx[n][0]++)) ? 1 : 0));
|
return (bits | ((justifier.buttons & (0x80000000 >> IncreaseReadIdxPost(read_idx[n][0]))) ? 1 : 0));
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
read_idx[n][0]++;
|
IncreaseReadIdxPost(read_idx[n][0]);
|
||||||
return (bits | 1);
|
return (bits | 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3230,7 +3240,7 @@ uint8 S9xReadJOYSERn (int n)
|
|||||||
return (bits | ((macsrifle.buttons & 0x01) ? 1 : 0));
|
return (bits | ((macsrifle.buttons & 0x01) ? 1 : 0));
|
||||||
|
|
||||||
default:
|
default:
|
||||||
read_idx[n][0]++;
|
IncreaseReadIdxPost(read_idx[n][0]);
|
||||||
return (bits);
|
return (bits);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user