summaryrefslogtreecommitdiff
path: root/src/Arithmetic.cpp
blob: dd2a1efd81b59d63692d19baaabfa2d30202a4c9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include "Arithmetic.h"

#include "ExecutorCases.h"
#include "CPUContext.h"
#include "Instruction.h"
#include "Bus.h"

#include <stdexcept>
#include <iostream>

namespace executor_cases {
  void Add_rm32_r32(CPUContext& cc){
    x86::ModRM modrm = cc.m_Instruction.m_ModRM;

    std::cout << "[Instruction] ";

    switch(modrm.m_State) {
    case x86::ModRMState::R:
      cc.m_Registers[modrm.m_Rm] += cc.m_Registers[modrm.m_Reg];
      std::cout << "add " << x86::Register2Str((x86::Register)modrm.m_Rm) << ", " <<  x86::Register2Str((x86::Register)modrm.m_Rm);
      break;
    default:
      helpers::Add_rm_dst(cc, helpers::ResolveModRMAddress(cc));
      std::cout << "add DWORD PTR [0x" << helpers::ResolveModRMAddress(cc) << "], " <<  x86::Register2Str((x86::Register)modrm.m_Reg);
      break;
    }

    std::cout << std::endl;
  }

  // TODO: Finish the function
  void Add_r32_rm32(CPUContext& cc){
    // x86::ModRM modrm = cc.m_Instruction.optional.m_ModRM;
    
    // std::cout << "[Instruction] ";
    
    // switch(modrm.m_State) {
    // case x86::ModRMState::R:
    //   cc.m_Registers[modrm.m_Reg] += cc.m_Registers[modrm.m_Rm];
    //   std::cout << "add " << x86::Register2Str((x86::Register)modrm.m_Reg) << ", " <<  x86::Register2Str((x86::Register)modrm.m_Rm);
    //   break;
    // default:
    //   uint32_t dstAddress = ;ResolveModRMAddress(cc);
    //   uint32_t dstPrevValue = cc.m_Bus->AccessX<uint32_t>(dstAddress);
    //   uint32_t currRegValue = cc.m_Registers[cc.m_Instruction.optional.m_ModRM.m_Reg];
    //   uint32_t result = dstPrevValue + currRegValue;
    //   std::cout << "add DWORD PTR [0x" << helpers::ResolveModRMAddress(cc) << "], " <<  x86::Register2Str((x86::Register)modrm.m_Reg);
    //   break;
    // }

    // std::cout << std::endl;
    std::runtime_error("Not implemented!");
 }

  namespace helpers {
    void Add_rm_dst(CPUContext& cc, uint32_t address) {
      uint32_t dstPrevValue = cc.m_Bus->AccessX<uint32_t>(address);
      uint32_t currRegValue = cc.m_Registers[cc.m_Instruction.m_ModRM.m_Reg];
      uint32_t result = dstPrevValue + currRegValue;
      cc.m_Bus->WriteX<uint32_t>(address, result);
    }
  }
}