-
Notifications
You must be signed in to change notification settings - Fork 0
/
ops_0x0.cpp
64 lines (57 loc) · 1.68 KB
/
ops_0x0.cpp
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
64
#include "modrm.hpp"
#include "hw/cpu.hpp"
#include <stdio.h>
void add_rm32_r32(Pentium* cpu)
{
cpu->ip.regs_32 += 1;
ModRM modrm = create_modrm();
parse_modrm(&modrm, cpu);
uint32_t rm32_val = get_rm32(cpu, &modrm);
uint32_t r32_val = cpu->gpregs[modrm.reg_index].regs_32;
uint64_t result = (uint64_t)rm32_val + (uint64_t)r32_val;
set_rm32(cpu, &modrm, result);
}
void add_al_imm8(Pentium* cpu)
{
uint8_t imm8_val = cpu->bus->read(cpu->getLinearAddr() + 1);
uint8_t al_val = cpu->gpregs[(int)GPRegister8::AL].regs_8l;
uint16_t result = (uint16_t)al_val + (uint16_t)imm8_val;
cpu->gpregs[(int)GPRegister8::AL].regs_8l = result;
cpu->ip.regs_32 += 2;
}
void push_es(Pentium* cpu)
{
cpu->push32(cpu->sgregs[(int)SGRegister::ES].base);
cpu->ip.regs_32++;
printf("PUSH ES (0x%x)\n", cpu->sgregs[(int)SGRegister::ES].base);
}
void pop_es(Pentium* cpu)
{
cpu->sgregs[(int)SGRegister::ES].base = cpu->pop32();
cpu->ip.regs_32++;
}
void or_rm16_r16(Pentium* cpu)
{
cpu->ip.regs_32++;
ModRM modrm = create_modrm();
parse_modrm(&modrm, cpu);
uint16_t rm16_val = get_rm16(cpu, &modrm);
uint16_t r16_val = cpu->gpregs[modrm.reg_index].regs_16;
uint16_t result = rm16_val | r16_val;
set_rm16(cpu, &modrm, result);
}
void or_rm32_r32(Pentium* cpu)
{
cpu->ip.regs_32++;
ModRM modrm = create_modrm();
parse_modrm(&modrm, cpu);
uint32_t rm32_val = get_rm32(cpu, &modrm);
uint32_t r32_val = cpu->gpregs[modrm.reg_index].regs_32;
uint32_t result = rm32_val | r32_val;
set_rm32(cpu, &modrm, result);
}
void push_cs(Pentium* cpu)
{
cpu->push32(cpu->sgregs[(int)SGRegister::CS].base);
cpu->ip.regs_32++;
}