6502-emulator/src/opcode/handler/jump-opcode-handler-contain...

44 lines
1.6 KiB
C++

#include "jump-opcode-handler-container.h"
#include "../../utils.h"
namespace emu_6502 {
JumpOpcodeHandlerContainer::JumpOpcodeHandlerContainer() {
handlers.insert({Op::JMP_ABS, [this](Machine& machine) { jmp_abs(machine); }});
handlers.insert({Op::JMP_IND, [this](Machine& machine) { jmp_ind(machine); }});
handlers.insert({Op::JSR, [this](Machine& machine) { jsr(machine); }});
handlers.insert({Op::RTI, [this](Machine& machine) { rti(machine); }});
handlers.insert({Op::RTS, [this](Machine& machine) { rts(machine); }});
}
void JumpOpcodeHandlerContainer::jmp_abs(Machine& machine) {
auto addr = get_abs_address(machine);
machine.get_cpu().get_pc().set_value(addr);
}
void JumpOpcodeHandlerContainer::jmp_ind(Machine& machine) {
auto addr = get_ind_address(machine);
machine.get_cpu().get_pc().set_value(addr);
}
void JumpOpcodeHandlerContainer::jsr(Machine& machine) {
uint16_t addr = get_abs_address(machine);
uint16_t pc_value = machine.get_cpu().get_pc().get_value();
machine.get_stack().push(pc_value >> 8);
machine.get_stack().push(pc_value);
machine.get_cpu().get_pc().set_value(addr);
}
void JumpOpcodeHandlerContainer::rti(Machine& machine) {}
void JumpOpcodeHandlerContainer::rts(Machine& machine) {
auto low_byte = machine.get_stack().pop();
auto high_byte = machine.get_stack().pop();
uint16_t return_address = (high_byte << 8) + low_byte;// + 1;
machine.get_cpu().get_pc().set_value(return_address);
}
}