Fully integrated new decoder.

This commit is contained in:
n-a-c-h
2005-05-15 22:36:27 +00:00
parent 2f7351090d
commit 71409f73ac

View File

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