diff --git a/include/instructions.h b/include/instructions.h index 2cbf5bd..b8216ff 100644 --- a/include/instructions.h +++ b/include/instructions.h @@ -117,5 +117,6 @@ public: // called by opcode_81 and opcode_83 void add_rm32_imm(int imm_flag); void or_rm32_imm(int imm_flag); + void adc_rm32_imm(int imm_flag); void cmp_rm32_imm8(); }; diff --git a/instructions.cpp b/instructions.cpp index aac3ae8..4fcf3ce 100644 --- a/instructions.cpp +++ b/instructions.cpp @@ -1172,7 +1172,7 @@ void Instructions::opcode_81(){ or_rm32_imm(IMM32); break; case 2: - // TODO: adc_rm32_imm32(); + adc_rm32_imm(IMM32); break; case 3: // TODO: sbb_rm32_imm32(); @@ -1208,7 +1208,7 @@ void Instructions::opcode_83(){ or_rm32_imm(IMM8); break; case 2: - // TODO: adc_rm32_imm8(); + adc_rm32_imm(IMM8); break; case 3: // TODO: sbb_rm32_imm8(); @@ -1514,6 +1514,24 @@ void Instructions::or_rm32_imm(int imm_flag){ this->eip++; } +void Instructions::adc_rm32_imm(int imm_flag){ + //printf("adc_rm32_imm called.\n"); + + this->eip++; + + if(imm_flag == IMM8){ + uint8_t imm8 = memory.read_uint8(this->eip); + this->registers[this->M] += imm8 + get_flag(CF); + } else if(imm_flag == IMM32){ + uint32_t imm32 = memory.read_uint32(this->eip); + imm32 = swap_endian32(imm32); + this->registers[this->M] += imm32 + get_flag(CF); + } else { + } + + this->eip++; +} + void Instructions::cmp_rm32_imm8(){ //printf("cmp_rm32_imm8 called.\n");