1#include "../../../../../include/ProcessingUnit.hpp"
2#include "../../../../../include/opcodes.hpp"
3#include "../../../../../include/mmu.hpp"
5constexpr int machine_cycles = 4;
6#define totalMachineCycles(n) ((n) * machine_cycles)
8#define DUMMY(name) int name(ProcessingUnit&, MMU&) { return totalMachineCycles(1); }
12 return totalMachineCycles(1);
17 const u8 lo = mmu.read(cpu.inc_pc());
18 const u8 hi = mmu.read(cpu.inc_pc());
20 cpu.reg(ProcessingUnit::Register::B) = hi;
21 cpu.reg(ProcessingUnit::Register::C) = lo;
23 return totalMachineCycles(3);
28 const u16 addr = cpu.get_bc();
29 const u8 value = cpu.reg(ProcessingUnit::Register::A);
31 mmu.write(addr, value);
33 return totalMachineCycles(2);
38 const u16 newValue = cpu.get_bc() + 1;
40 cpu.reg(ProcessingUnit::Register::B) = (newValue >> 8) & 0xFF;
41 cpu.reg(ProcessingUnit::Register::C) = newValue & 0xFF;
43 return totalMachineCycles(2);
48 const u8 oldValue = cpu.reg(ProcessingUnit::Register::B);
49 const u8 newValue = oldValue + 1;
50 cpu.reg(ProcessingUnit::Register::B) = newValue;
51 cpu.setFlag(ProcessingUnit::Flag::Z, newValue == 0);
52 cpu.setFlag(ProcessingUnit::Flag::N,
false);
53 cpu.setFlag(ProcessingUnit::Flag::H, (oldValue & 0x0F) == 0x0F);
54 return totalMachineCycles(1);
59 const u8 oldValue = cpu.reg(ProcessingUnit::Register::B);
60 const u8 newValue = oldValue - 1;
61 cpu.reg(ProcessingUnit::Register::B) = newValue;
62 cpu.setFlag(ProcessingUnit::Flag::Z, newValue == 0);
63 cpu.setFlag(ProcessingUnit::Flag::N,
true);
64 cpu.setFlag(ProcessingUnit::Flag::H, (oldValue & 0x0F) == 0x00);
65 return totalMachineCycles(1);
70 const u8 newValue = mmu.read(cpu.inc_pc());
72 cpu.reg(ProcessingUnit::Register::B) = newValue;
74 return totalMachineCycles(2);
79 const u8 a = cpu.reg(ProcessingUnit::Register::A);
81 const u8 carry = (a >> 7) & 1;
82 const u8 result = (a << 1) | carry;
84 cpu.reg(ProcessingUnit::Register::A) = result;
86 cpu.setFlag(ProcessingUnit::Flag::Z,
false);
87 cpu.setFlag(ProcessingUnit::Flag::N,
false);
88 cpu.setFlag(ProcessingUnit::Flag::H,
false);
89 cpu.setFlag(ProcessingUnit::Flag::C, carry);
91 return totalMachineCycles(1);
96 const u8 lo = mmu.read(cpu.inc_pc());
97 const u8 hi = mmu.read(cpu.inc_pc());
99 const u16 addr = (hi << 8) | lo;
101 mmu.write(addr, cpu.get_sp() & 0xFF);
102 mmu.write(addr + 1, cpu.get_sp() >> 8);
104 return totalMachineCycles(5);
109 const u16 hl = cpu.get_hl();
110 const u16 bc = cpu.get_bc();
111 const u32 sum =
static_cast<u32
>(hl) + bc;
113 cpu.reg(ProcessingUnit::Register::H) =
static_cast<u8
>((sum >> 8) & 0xFF);
114 cpu.reg(ProcessingUnit::Register::L) =
static_cast<u8
>(sum & 0xFF);
116 cpu.setFlag(ProcessingUnit::Flag::N,
false);
117 cpu.setFlag(ProcessingUnit::Flag::H, ((hl & 0x0FFF) + (bc & 0x0FFF)) > 0x0FFF);
118 cpu.setFlag(ProcessingUnit::Flag::C, sum > 0xFFFF);
120 return totalMachineCycles(2);
125 const u16 addr = cpu.get_bc();
126 cpu.reg(ProcessingUnit::Register::A) = mmu.read(addr);
128 return totalMachineCycles(2);
133 u16 bc = cpu.get_bc();
136 cpu.reg(ProcessingUnit::Register::B) = bc >> 8;
137 cpu.reg(ProcessingUnit::Register::C) = bc & 0xFF;
139 return totalMachineCycles(2);
144 const u8 oldValue = cpu.reg(ProcessingUnit::Register::C);
145 const u8 newValue = oldValue + 1;
146 cpu.reg(ProcessingUnit::Register::C) = newValue;
147 cpu.setFlag(ProcessingUnit::Flag::Z, newValue == 0);
148 cpu.setFlag(ProcessingUnit::Flag::N,
false);
149 cpu.setFlag(ProcessingUnit::Flag::H, (oldValue & 0x0F) == 0x0F);
150 return totalMachineCycles(1);
155 const u8 oldValue = cpu.reg(ProcessingUnit::Register::C);
156 const u8 newValue = oldValue - 1;
157 cpu.reg(ProcessingUnit::Register::C) = newValue;
158 cpu.setFlag(ProcessingUnit::Flag::Z, newValue == 0);
159 cpu.setFlag(ProcessingUnit::Flag::N,
true);
160 cpu.setFlag(ProcessingUnit::Flag::H, (oldValue & 0x0F) == 0x00);
161 return totalMachineCycles(1);
165 const u8 newValue = mmu.read(cpu.inc_pc());
166 cpu.reg(ProcessingUnit::Register::C) = newValue;
168 return totalMachineCycles(2);
173 const u8 a = cpu.reg(ProcessingUnit::Register::A);
175 const u8 carry = a & 1;
176 const u8 result = (a >> 1) | (carry << 7);
178 cpu.reg(ProcessingUnit::Register::A) = result;
180 cpu.setFlag(ProcessingUnit::Flag::Z,
false);
181 cpu.setFlag(ProcessingUnit::Flag::N,
false);
182 cpu.setFlag(ProcessingUnit::Flag::H,
false);
183 cpu.setFlag(ProcessingUnit::Flag::C, carry);
185 return totalMachineCycles(1);