Skip to content
Snippets Groups Projects
Select Git revision
  • f84c1dbe57f85b3628ed47deee64cd2ee16a04ef
  • master default
  • v1
3 results

cpu_addInst.c

Blame
  • 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));