Select Git revision
cpu_addInst.c
cpu_addInst.c 4.44 KiB
case 0x00:{
/*ADD r/m8 rm8*/
if(likely(cpu_decode_RM(cpu_state, &s_op, EIGHT_BIT))){
uint8_t op1;
if(s_op.regmem_type == MEMORY)
op1 = cpu_read_byte_from_mem(cpu_state, s_op.regmem_mem);
else
op1 = cpu_read_byte_from_reg(s_op.regmem_reg, IS_HIGH(s_op.regmem));
uint8_t op2 = cpu_read_byte_from_reg(s_op.reg, IS_HIGH(s_op.reg));
uint8_t result = op1 + op2;
if(s_op.regmem_type == MEMORY)
cpu_write_byte_in_mem(cpu_state, result, s_op.regmem_mem);
else
cpu_write_byte_in_reg(s_op.regmem_reg, result, IS_HIGH(s_op.regmem));
cpu_set_overflow_add(cpu_state, op1, op2, result, EIGHT_BIT);
cpu_set_sign_flag(cpu_state, result, EIGHT_BIT);
cpu_set_zero_flag(cpu_state, result);
cpu_set_carry_add(cpu_state, op1, result);
cpu_set_parity_flag(cpu_state, result);
#ifdef DEBUG_PRINT_INST
fprintf(stderr, "ADD rm8 r8 \n");
#endif
return true;
}
break;
}
case 0x01:{
/*r/ADD m32 r32.*/
if(likely(cpu_decode_RM(cpu_state, &s_op, !EIGHT_BIT))){
uint32_t op1;
if(s_op.regmem_type == MEMORY)
op1 = cpu_read_word_from_mem(cpu_state, s_op.regmem_mem);
else
op1 = cpu_read_word_from_reg(s_op.regmem_reg);
uint32_t op2 = cpu_read_word_from_reg(s_op.reg);
uint32_t result = op1 + op2;
if(s_op.regmem_type == MEMORY)
cpu_write_word_in_mem(cpu_state, result, s_op.regmem_mem);
else
cpu_write_word_in_reg(s_op.regmem_reg, result);
cpu_set_overflow_add(cpu_state, op1, op2, result, EIGHT_BIT);
cpu_set_sign_flag(cpu_state, result, EIGHT_BIT);
cpu_set_zero_flag(cpu_state, result);
cpu_set_carry_add(cpu_state, op1, result);
cpu_set_parity_flag(cpu_state, result);
#ifdef DEBUG_PRINT_INST
fprintf(stderr, "ADD m32 r32 \n");
#endif
return true;
}
break;
}
case 0x02:{
/*ADD r8 r/m8.*/
if(likely(cpu_decode_RM(cpu_state, &s_op, EIGHT_BIT))){
uint8_t op1 = cpu_read_byte_from_reg(s_op.reg, IS_HIGH(s_op.reg));