2019-04-15 22:51:04 +00:00
|
|
|
#include "utils.h"
|
|
|
|
|
|
|
|
namespace emu_6502 {
|
|
|
|
string uint_to_hex(uint64_t value) {
|
|
|
|
stringstream ss;
|
|
|
|
ss << hex << value;
|
|
|
|
|
|
|
|
return ss.str();
|
|
|
|
}
|
|
|
|
|
2019-04-20 22:58:03 +00:00
|
|
|
void set_zero_and_neg_flags(StatusRegister& ps, uint8_t value) {
|
|
|
|
ps.set_zero(value == 0);
|
|
|
|
ps.set_negative((value & 0x80) == 0x80);
|
|
|
|
}
|
|
|
|
|
2019-04-20 10:22:40 +00:00
|
|
|
uint8_t get_zpg_address(Machine& machine) {
|
|
|
|
return machine.read_program_byte();
|
2019-04-15 22:51:04 +00:00
|
|
|
}
|
|
|
|
|
2019-04-20 10:22:40 +00:00
|
|
|
uint8_t get_zpg_x_address(Machine& machine) {
|
2019-04-15 22:51:04 +00:00
|
|
|
// expect wrap around
|
2019-04-20 10:22:40 +00:00
|
|
|
return machine.read_program_byte() + machine.get_cpu().get_x().get_value();
|
2019-04-15 22:51:04 +00:00
|
|
|
}
|
|
|
|
|
2019-04-20 10:22:40 +00:00
|
|
|
uint8_t get_zpg_y_address(Machine& machine) {
|
2019-04-15 22:51:04 +00:00
|
|
|
// expect wrap around
|
2019-04-20 10:22:40 +00:00
|
|
|
return machine.read_program_byte() + machine.get_cpu().get_y().get_value();
|
2019-04-15 22:51:04 +00:00
|
|
|
}
|
|
|
|
|
2019-04-20 10:22:40 +00:00
|
|
|
uint16_t get_abs_address(Machine& machine) {
|
|
|
|
auto low_byte = machine.read_program_byte();
|
|
|
|
auto high_byte = machine.read_program_byte();
|
2019-04-15 22:51:04 +00:00
|
|
|
uint16_t address = (high_byte << 8) + low_byte;
|
|
|
|
return address;
|
|
|
|
}
|
|
|
|
|
2019-04-20 10:22:40 +00:00
|
|
|
uint16_t get_abs_x_address(Machine& machine) {
|
|
|
|
auto low_byte = machine.read_program_byte();
|
|
|
|
auto high_byte = machine.read_program_byte();
|
|
|
|
uint16_t address = (high_byte << 8) + low_byte + machine.get_cpu().get_x().get_value();
|
2019-04-15 22:51:04 +00:00
|
|
|
return address;
|
|
|
|
}
|
|
|
|
|
2019-04-20 10:22:40 +00:00
|
|
|
uint16_t get_abs_y_address(Machine& machine) {
|
|
|
|
auto low_byte = machine.read_program_byte();
|
|
|
|
auto high_byte = machine.read_program_byte();
|
|
|
|
uint16_t address = (high_byte << 8) + low_byte + machine.get_cpu().get_y().get_value();
|
2019-04-15 22:51:04 +00:00
|
|
|
return address;
|
|
|
|
}
|
|
|
|
|
2019-04-20 10:22:40 +00:00
|
|
|
uint16_t get_ind_x_address(Machine& machine) {
|
|
|
|
uint8_t paddress = machine.get_cpu().get_x().get_value() + machine.read_program_byte();
|
2019-04-15 22:51:04 +00:00
|
|
|
auto low = machine.get_memory().get_at(paddress);
|
|
|
|
auto high = machine.get_memory().get_at(paddress + 1);
|
|
|
|
uint16_t address = (high << 8) + low;
|
|
|
|
|
|
|
|
return address;
|
|
|
|
}
|
|
|
|
|
2019-04-20 10:22:40 +00:00
|
|
|
uint16_t get_ind_y_address(Machine& machine) {
|
|
|
|
auto offset = machine.read_program_byte();
|
2019-04-15 22:51:04 +00:00
|
|
|
auto low = machine.get_memory().get_at(offset);
|
|
|
|
auto high = machine.get_memory().get_at(offset + 1);
|
|
|
|
auto y = machine.get_cpu().get_y().get_value();
|
|
|
|
uint16_t address = (high << 8) + low + y;
|
|
|
|
|
|
|
|
return address;
|
|
|
|
}
|
|
|
|
}
|