808x: Fix the flags at the end of the ADC and SBB instructions, fixes #4103.
This commit is contained in:
@@ -1223,34 +1223,48 @@ static void
|
|||||||
add(int bits)
|
add(int bits)
|
||||||
{
|
{
|
||||||
int size_mask = (1 << bits) - 1;
|
int size_mask = (1 << bits) - 1;
|
||||||
|
int special_case = 0;
|
||||||
|
uint32_t temp_src = cpu_src;
|
||||||
|
|
||||||
|
if ((cpu_alu_op == 2) && !(cpu_src & size_mask) && (cpu_state.flags & C_FLAG))
|
||||||
|
special_case = 1;
|
||||||
|
|
||||||
cpu_data = cpu_dest + cpu_src;
|
cpu_data = cpu_dest + cpu_src;
|
||||||
|
if ((cpu_alu_op == 2) && (cpu_state.flags & C_FLAG))
|
||||||
|
cpu_src--;
|
||||||
set_apzs(bits);
|
set_apzs(bits);
|
||||||
set_of_add(bits);
|
set_of_add(bits);
|
||||||
|
|
||||||
/* Anything - FF with carry on is basically anything + 0x100: value stays
|
/* Anything - FF with carry on is basically anything + 0x100: value stays
|
||||||
unchanged but carry goes on. */
|
unchanged but carry goes on. */
|
||||||
if ((cpu_alu_op == 2) && !(cpu_src & size_mask) && (cpu_state.flags & C_FLAG))
|
if (special_case)
|
||||||
cpu_state.flags |= C_FLAG;
|
cpu_state.flags |= C_FLAG;
|
||||||
else
|
else
|
||||||
set_cf((cpu_src & size_mask) > (cpu_data & size_mask));
|
set_cf((temp_src & size_mask) > (cpu_data & size_mask));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
sub(int bits)
|
sub(int bits)
|
||||||
{
|
{
|
||||||
int size_mask = (1 << bits) - 1;
|
int size_mask = (1 << bits) - 1;
|
||||||
|
int special_case = 0;
|
||||||
|
uint32_t temp_src = cpu_src;
|
||||||
|
|
||||||
|
if ((cpu_alu_op == 3) && !(cpu_src & size_mask) && (cpu_state.flags & C_FLAG))
|
||||||
|
special_case = 1;
|
||||||
|
|
||||||
cpu_data = cpu_dest - cpu_src;
|
cpu_data = cpu_dest - cpu_src;
|
||||||
|
if ((cpu_alu_op == 3) && (cpu_state.flags & C_FLAG))
|
||||||
|
cpu_src--;
|
||||||
set_apzs(bits);
|
set_apzs(bits);
|
||||||
set_of_sub(bits);
|
set_of_sub(bits);
|
||||||
|
|
||||||
/* Anything - FF with carry on is basically anything - 0x100: value stays
|
/* Anything - FF with carry on is basically anything - 0x100: value stays
|
||||||
unchanged but carry goes on. */
|
unchanged but carry goes on. */
|
||||||
if ((cpu_alu_op == 3) && !(cpu_src & size_mask) && (cpu_state.flags & C_FLAG))
|
if (special_case)
|
||||||
cpu_state.flags |= C_FLAG;
|
cpu_state.flags |= C_FLAG;
|
||||||
else
|
else
|
||||||
set_cf((cpu_src & size_mask) > (cpu_dest & size_mask));
|
set_cf((temp_src & size_mask) > (cpu_dest & size_mask));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
Reference in New Issue
Block a user