82 uint16_t
adr = 0xffde - (2 * (
opcode >> 4));
159 uint16_t dst =
dp_dp(&src);
188 uint8_t result =
A + (val ^ 0xff) + 1;
189 PSW.Z = (result == 0);
190 PSW.N = (result & 0x80);
226 uint16_t dst =
dp_imm(&src);
239 uint16_t value =
read(low) - 1;
240 write(low, value & 0xff);
241 value +=
read(high) << 8;
242 write(high, value >> 8);
244 PSW.N = value & 0x8000;
303 uint16_t dst =
dp_dp(&src);
329 uint8_t val =
read(
dp()) ^ 0xff;
331 uint8_t result =
A + val + 1;
361 uint16_t dst =
dp_imm(&src);
374 uint16_t value =
read(low) + 1;
375 write(low, value & 0xff);
376 value +=
read(high) << 8;
377 write(high, value >> 8);
379 PSW.N = value & 0x8000;
388 bool newC =
A & 0x80;
389 A = (
A << 1) |
PSW.C;
442 uint16_t dst =
dp_dp(&src);
470 uint8_t result =
A + (val ^ 0xff) + 1;
471 PSW.Z = (result == 0);
472 PSW.N = (result & 0x80);
506 uint16_t dst =
dp_imm(&src);
519 uint16_t value =
read_word(low) ^ 0xffff;
520 uint16_t ya =
A | (
Y << 8);
521 int result = ya + value + 1;
522 PSW.C = result > 0xffff;
523 PSW.Z = (result & 0xffff) == 0;
524 PSW.N = result & 0x8000;
581 uint16_t dst =
dp_dp(&src);
607 uint8_t result =
read(
adr) - 1;
640 uint16_t dst =
dp_imm(&src);
653 uint8_t vall =
read(low);
655 uint16_t value = vall | (
read(high) << 8);
656 uint16_t ya =
A | (
Y << 8);
657 int result = ya + value;
658 PSW.V = (ya & 0x8000) == (value & 0x8000) &&
659 (value & 0x8000) != (result & 0x8000);
660 PSW.H = ((ya & 0xfff) + (value & 0xfff)) > 0xfff;
661 PSW.C = result > 0xffff;
662 PSW.Z = (result & 0xffff) == 0;
663 PSW.N = result & 0x8000;
675 A = (
A >> 1) | (
PSW.C << 7);
726 uint16_t dst =
dp_dp(&src);
757 uint16_t dst =
dp_imm(&val);
784 uint16_t dst =
dp_imm(&src);
797 uint8_t vall =
read(low);
799 uint16_t value = (vall | (
read(high) << 8)) ^ 0xffff;
800 uint16_t ya =
A | (
Y << 8);
801 int result = ya + value + 1;
802 PSW.V = (ya & 0x8000) == (value & 0x8000) &&
803 (value & 0x8000) != (result & 0x8000);
804 PSW.H = ((ya & 0xfff) + (value & 0xfff) + 1) > 0xfff;
805 PSW.C = result > 0xffff;
806 PSW.Z = (result & 0xffff) == 0;
807 PSW.N = result & 0x8000;
833 PSW.H = (
X & 0xf) <= (
Y & 0xf);
834 int yva = (
Y << 8) |
A;
836 for (
int i = 0;
i < 9;
i++) {
838 yva |= (yva & 0x20000) ? 1 : 0;
840 if (yva >= x) yva ^= 1;
841 if (yva & 1) yva -= x;
856 A = (
A >> 4) | (
A << 4);
889 uint16_t dst =
dp_dp(&src);
945 uint16_t dst =
dp_imm(&src);
958 uint8_t vall =
read(low);
960 uint16_t val = vall | (
read(high) << 8);
964 PSW.N = val & 0x8000;
987 if (
A > 0x99 || !
PSW.C) {
991 if ((
A & 0xf) > 9 || !
PSW.H) {
1039 uint8_t result = (
read(
adr) & (~(1 << bit))) | (
PSW.C << bit);
1065 uint16_t result =
A *
Y;
1068 PSW.Z = ((
Y & 0xFFFF) == 0);
1069 PSW.N = (
Y & 0x8000);
1116 uint16_t high =
dp_word(&low);
1129 PSW.Z = ((
Y & 0xFFFF) == 0);
1130 PSW.N = (
Y & 0x8000);
1141 uint8_t val =
read(
dpx()) ^ 0xff;
1143 uint8_t result =
A + val + 1;
1150 if (
A > 0x99 ||
PSW.C) {
1154 if ((
A & 0xf) > 9 ||
PSW.H) {
1194 uint8_t result =
read(
adr) ^ (1 << bit);
1254 uint16_t dst =
dp_dp(&val);
1265 PSW.Z = ((
Y & 0xFFFF) == 0);
1266 PSW.N = (
Y & 0x8000);
1272 PSW.Z = ((
Y & 0xFFFF) == 0);
1273 PSW.N = (
Y & 0x8000);
1291 throw std::runtime_error(
"Unknown SPC opcode: " + std::to_string(
opcode));
1299 std::stringstream log_entry_stream;
1300 log_entry_stream <<
"\033[1;36m$" << std::hex << std::setw(4)
1301 << std::setfill(
'0') << initial_pc <<
"\033[0m";
1302 log_entry_stream <<
" \033[1;32m" << std::hex << std::setw(2)
1303 << std::setfill(
'0') <<
static_cast<int>(
opcode) <<
"\033[0m"
1304 <<
" \033[1;35m" << std::setw(18) << std::left
1305 << std::setfill(
' ') << mnemonic <<
"\033[0m";
1307 log_entry_stream <<
" \033[1;33mA: " << std::hex << std::setw(2)
1308 << std::setfill(
'0') << std::right << static_cast<int>(
A)
1310 log_entry_stream <<
" \033[1;33mX: " << std::hex << std::setw(2)
1311 << std::setfill(
'0') << std::right << static_cast<int>(
X)
1313 log_entry_stream <<
" \033[1;33mY: " << std::hex << std::setw(2)
1314 << std::setfill(
'0') << std::right << static_cast<int>(
Y)
1316 std::string log_entry = log_entry_stream.str();
1318 std::cerr << log_entry << std::endl;
const std::unordered_map< uint8_t, std::string > spc_opcode_map
void CMPM(uint16_t dst, uint8_t value)
uint8_t read(uint16_t address)
uint8_t abs_bit(uint16_t *adr)
void ANDM(uint16_t dest, uint8_t operand)
void EORM(uint16_t dest, uint8_t operand)
void DEC(uint16_t operand)
uint16_t ind_ind(uint8_t *srcVal)
void SBCM(uint16_t &dest, uint8_t operand)
void Reset(bool hard=false)
void push_byte(uint8_t value)
uint8_t FlagsToByte(Flags flags)
void LogInstruction(uint16_t initial_pc, uint8_t opcode)
uint16_t dp_imm(uint8_t *srcVal)
uint16_t ReadOpcodeWord()
uint16_t dp_dp(uint8_t *src)
void ROL(uint16_t operand)
void write(uint16_t address, uint8_t value)
uint16_t dp_word(uint16_t *low)
void push_word(uint16_t value)
uint16_t read_word(uint16_t address)
void ASL(uint16_t operand)
void ADCM(uint16_t &dest, uint8_t operand)
void DoBranch(uint8_t value, bool check)
void ExecuteInstructions(uint8_t opcode)
void ORM(uint16_t dest, uint8_t operand)
Flags ByteToFlags(uint8_t byte)
SNES Emulation and debugging tools.
Main namespace for the application.