Fully integrated new decoder.
This commit is contained in:
@@ -733,7 +733,7 @@ static size_t pad_bit_decoder(unsigned char pad, unsigned char *buffer, size_t s
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 3:
|
case 3: case 4: case 5:
|
||||||
//No multitap if both ports use special devices
|
//No multitap if both ports use special devices
|
||||||
if ((zmv_vars.inputs_enabled & BIT(0xA)) && (zmv_vars.inputs_enabled & BIT(0x09)))
|
if ((zmv_vars.inputs_enabled & BIT(0xA)) && (zmv_vars.inputs_enabled & BIT(0x09)))
|
||||||
{
|
{
|
||||||
@@ -1171,23 +1171,58 @@ static bool zmv_replay_command(enum zmv_commands command)
|
|||||||
return(false);
|
return(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define RESTORE_PAD(cur, prev, bit) \
|
static void replay_pad(unsigned char pad, unsigned char flag, unsigned char *buffer, size_t *skip_bits)
|
||||||
cur = prev |= ((zmv_vars.inputs_enabled & BIT(bit)) ? 0x8000 : 0);
|
{
|
||||||
|
unsigned int *last_state = 0, *current_state = 0;
|
||||||
|
unsigned char bit_mask = 0;
|
||||||
|
|
||||||
#define REPLAY_PAD(prev, cur, bit) \
|
switch (pad)
|
||||||
if (flag & BIT(bit)) \
|
{
|
||||||
{ \
|
case 1:
|
||||||
if (skip_bits && ((skip_bits&7) < 4)) \
|
last_state = &zmv_vars.last_joy_state.A;
|
||||||
{ \
|
current_state = &JoyAOrig;
|
||||||
fread(press_buf + skip_bits/8, 1, 1, zmv_vars.fp); \
|
bit_mask = BIT(7);
|
||||||
} \
|
break;
|
||||||
else \
|
|
||||||
{ \
|
case 2:
|
||||||
fread(press_buf + skip_bits/8, 1, 2, zmv_vars.fp); \
|
last_state = &zmv_vars.last_joy_state.B;
|
||||||
} \
|
current_state = &JoyBOrig;
|
||||||
skip_bits = bit_decoder(&prev, GAMEPAD_MASK, press_buf, skip_bits); \
|
bit_mask = BIT(6);
|
||||||
} \
|
break;
|
||||||
RESTORE_PAD(cur, prev, bit+8)
|
|
||||||
|
case 3:
|
||||||
|
last_state = &zmv_vars.last_joy_state.C;
|
||||||
|
current_state = &JoyCOrig;
|
||||||
|
bit_mask = BIT(5);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 4:
|
||||||
|
last_state = &zmv_vars.last_joy_state.D;
|
||||||
|
current_state = &JoyDOrig;
|
||||||
|
bit_mask = BIT(4);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 5:
|
||||||
|
last_state = &zmv_vars.last_joy_state.E;
|
||||||
|
current_state = &JoyEOrig;
|
||||||
|
bit_mask = BIT(3);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flag & bit_mask)
|
||||||
|
{
|
||||||
|
if (*skip_bits && ((*skip_bits&7) < 4))
|
||||||
|
{
|
||||||
|
fread(buffer + *skip_bits/8, 1, 1, zmv_vars.fp);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fread(buffer + *skip_bits/8, 1, 2, zmv_vars.fp);
|
||||||
|
}
|
||||||
|
*skip_bits = pad_bit_decoder(pad, buffer, *skip_bits);
|
||||||
|
}
|
||||||
|
*current_state = *last_state;
|
||||||
|
}
|
||||||
|
|
||||||
static bool zmv_replay()
|
static bool zmv_replay()
|
||||||
{
|
{
|
||||||
@@ -1195,11 +1230,11 @@ static bool zmv_replay()
|
|||||||
{
|
{
|
||||||
if (zmv_vars.rle_count)
|
if (zmv_vars.rle_count)
|
||||||
{
|
{
|
||||||
RESTORE_PAD(JoyAOrig, zmv_vars.last_joy_state.A, 15);
|
JoyAOrig = zmv_vars.last_joy_state.A;
|
||||||
RESTORE_PAD(JoyBOrig, zmv_vars.last_joy_state.B, 14);
|
JoyBOrig = zmv_vars.last_joy_state.B;
|
||||||
RESTORE_PAD(JoyCOrig, zmv_vars.last_joy_state.C, 13);
|
JoyCOrig = zmv_vars.last_joy_state.C;
|
||||||
RESTORE_PAD(JoyDOrig, zmv_vars.last_joy_state.D, 12);
|
JoyDOrig = zmv_vars.last_joy_state.D;
|
||||||
RESTORE_PAD(JoyEOrig, zmv_vars.last_joy_state.E, 11);
|
JoyEOrig = zmv_vars.last_joy_state.E;
|
||||||
zmv_vars.rle_count--;
|
zmv_vars.rle_count--;
|
||||||
|
|
||||||
debug_input;
|
debug_input;
|
||||||
@@ -1244,11 +1279,11 @@ static bool zmv_replay()
|
|||||||
unsigned char press_buf[] = { 0, 0, 0, 0, 0, 0, 0, 0 };
|
unsigned char press_buf[] = { 0, 0, 0, 0, 0, 0, 0, 0 };
|
||||||
size_t skip_bits = 0;
|
size_t skip_bits = 0;
|
||||||
|
|
||||||
REPLAY_PAD(zmv_vars.last_joy_state.A, JoyAOrig, 7);
|
replay_pad(1, flag, press_buf, &skip_bits);
|
||||||
REPLAY_PAD(zmv_vars.last_joy_state.B, JoyBOrig, 6);
|
replay_pad(2, flag, press_buf, &skip_bits);
|
||||||
REPLAY_PAD(zmv_vars.last_joy_state.C, JoyCOrig, 5);
|
replay_pad(3, flag, press_buf, &skip_bits);
|
||||||
REPLAY_PAD(zmv_vars.last_joy_state.D, JoyDOrig, 4);
|
replay_pad(4, flag, press_buf, &skip_bits);
|
||||||
REPLAY_PAD(zmv_vars.last_joy_state.E, JoyEOrig, 3);
|
replay_pad(5, flag, press_buf, &skip_bits);
|
||||||
|
|
||||||
debug_input;
|
debug_input;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user