48 sp = (sp & 0xff) | 0x100;
105 uint16_t cache_pc =
PC;
106 uint32_t operand = 0;
107 bool immediate =
false;
112 uint32_t vector = (
E) ? 0xfffe : 0xffe6;
125 uint32_t high =
AdrIdx(&low);
130 uint32_t vector = (
E) ? 0xfff4 : 0xffe4;
143 uint32_t high =
AdrSr(&low);
149 uint32_t high =
AdrDp(&low);
155 uint32_t high =
AdrDp(&low);
161 uint32_t high =
AdrDp(&low);
167 uint32_t high =
AdrIdl(&low);
187 A = (
A & 0xff00) | ((
A << 1) & 0xff);
220 uint32_t high =
AdrAbl(&low);
230 uint32_t high =
AdrIdy(&low,
false);
236 uint32_t high =
AdrIdp(&low);
242 uint32_t high =
AdrIsy(&low);
248 uint32_t high =
AdrDp(&low);
254 uint32_t high =
AdrDpx(&low);
260 uint32_t high =
AdrDpx(&low);
266 uint32_t high =
AdrIly(&low);
277 uint32_t high =
AdrAby(&low,
false);
284 A = (
A & 0xff00) | ((
A + 1) & 0xff);
304 uint32_t high =
AdrAbx(&low,
false);
310 uint32_t high =
AdrAbx(&low,
true);
316 uint32_t high =
AdrAlx(&low);
329 uint32_t high =
AdrIdx(&low);
345 uint32_t high =
AdrSr(&low);
351 uint32_t high =
AdrDp(&low);
357 uint32_t high =
AdrDp(&low);
363 uint32_t high =
AdrDp(&low);
369 uint32_t high =
AdrIdl(&low);
391 A = (
A & 0xff00) | (result & 0xff);
426 uint32_t high =
AdrAbl(&low);
436 uint32_t high =
AdrIdy(&low,
false);
442 uint32_t high =
AdrIdp(&low);
448 uint32_t high =
AdrIsy(&low);
454 uint32_t high =
AdrDpx(&low);
460 uint32_t high =
AdrDpx(&low);
466 uint32_t high =
AdrDpx(&low);
472 uint32_t high =
AdrIly(&low);
483 uint32_t high =
AdrAby(&low,
false);
490 A = (
A & 0xff00) | ((
A - 1) & 0xff);
505 uint32_t high =
AdrAbx(&low,
false);
511 uint32_t high =
AdrAbx(&low,
false);
517 uint32_t high =
AdrAbx(&low,
true);
523 uint32_t high =
AdrAlx(&low);
538 uint32_t high =
AdrIdx(&low);
549 uint32_t high =
AdrSr(&low);
575 uint32_t high =
AdrDp(&low);
581 uint32_t high =
AdrDp(&low);
587 uint32_t high =
AdrIdl(&low);
611 A = (
A & 0xff00) | ((
A >> 1) & 0x7f);
642 uint32_t high =
AdrAbl(&low);
652 uint32_t high =
AdrIdy(&low,
false);
658 uint32_t high =
AdrIdp(&low);
664 uint32_t high =
AdrIsy(&low);
690 uint32_t high =
AdrDpx(&low);
696 uint32_t high =
AdrDpx(&low);
702 uint32_t high =
AdrIly(&low);
713 uint32_t high =
AdrAby(&low,
false);
742 uint32_t high =
AdrAbx(&low,
false);
748 uint32_t high =
AdrAbx(&low,
true);
754 uint32_t high =
AdrAlx(&low);
768 uint32_t high =
AdrIdx(&low);
780 uint32_t high =
AdrSr(&low);
786 uint32_t high =
AdrDp(&low);
792 uint32_t high =
AdrDp(&low);
798 uint32_t high =
AdrDp(&low);
804 uint32_t high =
AdrIdl(&low);
831 A = (
A & 0xff00) | ((
A >> 1) & 0x7f) | (C << 7);
833 A = (
A >> 1) | (C << 15);
866 uint32_t high =
AdrAbl(&low);
876 uint32_t high =
AdrIdy(&low,
false);
882 uint32_t high =
AdrIdp(&low);
888 uint32_t high =
AdrIsy(&low);
894 uint32_t high =
AdrDpx(&low);
900 uint32_t high =
AdrDpx(&low);
906 uint32_t high =
AdrDpx(&low);
912 uint32_t high =
AdrIly(&low);
923 uint32_t high =
AdrAby(&low,
false);
949 ((
PB << 16) | ((adr +
X + 1) & 0xffff)),
true);
954 uint32_t high =
AdrAbx(&low,
false);
960 uint32_t high =
AdrAbx(&low,
true);
966 uint32_t high =
AdrAlx(&low);
976 uint32_t high =
AdrIdx(&low);
988 uint32_t high =
AdrSr(&low);
994 uint32_t high =
AdrDp(&low);
1000 uint32_t high =
AdrDp(&low);
1006 uint32_t high =
AdrDp(&low);
1012 uint32_t high =
AdrIdl(&low);
1040 A = (
A & 0xff00) | (
X & 0xff);
1073 uint32_t high =
AdrAbl(&low);
1083 uint32_t high =
AdrIdy(&low,
true);
1089 uint32_t high =
AdrIdp(&low);
1095 uint32_t high =
AdrIsy(&low);
1101 uint32_t high =
AdrDpx(&low);
1107 uint32_t high =
AdrDpx(&low);
1113 uint32_t high =
AdrDpy(&low);
1119 uint32_t high =
AdrIly(&low);
1126 A = (
A & 0xff00) | (
Y & 0xff);
1135 uint32_t high =
AdrAby(&low,
true);
1162 uint32_t high =
AdrAbx(&low,
true);
1168 uint32_t high =
AdrAbx(&low,
true);
1174 uint32_t high =
AdrAlx(&low);
1186 uint32_t high =
AdrIdx(&low);
1198 uint32_t high =
AdrSr(&low);
1204 uint32_t high =
AdrDp(&low);
1210 uint32_t high =
AdrDp(&low);
1216 uint32_t high =
AdrDp(&low);
1222 uint32_t high =
AdrIdl(&low);
1280 uint32_t high =
AdrAbl(&low);
1290 uint32_t high =
AdrIdy(&low,
false);
1296 uint32_t high =
AdrIdp(&low);
1302 uint32_t high =
AdrIsy(&low);
1308 uint32_t high =
AdrDpx(&low);
1314 uint32_t high =
AdrDpx(&low);
1320 uint32_t high =
AdrDpy(&low);
1326 uint32_t high =
AdrIly(&low);
1337 uint32_t high =
AdrAby(&low,
false);
1363 uint32_t high =
AdrAbx(&low,
false);
1369 uint32_t high =
AdrAbx(&low,
false);
1375 uint32_t high =
AdrAby(&low,
false);
1381 uint32_t high =
AdrAlx(&low);
1393 uint32_t high =
AdrIdx(&low);
1406 uint32_t high =
AdrSr(&low);
1412 uint32_t high =
AdrDp(&low);
1418 uint32_t high =
AdrDp(&low);
1424 uint32_t high =
AdrDp(&low);
1430 uint32_t high =
AdrIdl(&low);
1486 uint32_t high =
AdrAbl(&low);
1496 uint32_t high =
AdrIdy(&low,
false);
1502 uint32_t high =
AdrIdp(&low);
1508 uint32_t high =
AdrIsy(&low);
1514 uint32_t high =
AdrDp(&low);
1520 uint32_t high =
AdrDpx(&low);
1526 uint32_t high =
AdrDpx(&low);
1532 uint32_t high =
AdrIly(&low);
1543 uint32_t high =
AdrAby(&low,
false);
1565 PC =
ReadWord(adr, ((adr + 1) & 0xffff),
false);
1572 uint32_t high =
AdrAbx(&low,
false);
1578 uint32_t high =
AdrAbx(&low,
true);
1584 uint32_t high =
AdrAlx(&low);
1596 uint32_t high =
AdrIdx(&low);
1609 uint32_t high =
AdrSr(&low);
1615 uint32_t high =
AdrDp(&low);
1621 uint32_t high =
AdrDp(&low);
1627 uint32_t high =
AdrDp(&low);
1633 uint32_t high =
AdrIdl(&low);
1659 uint8_t low =
A & 0xff;
1660 uint8_t high =
A >> 8;
1661 A = (low << 8) | high;
1688 uint32_t high =
AdrAbl(&low);
1698 uint32_t high =
AdrIdy(&low,
false);
1704 uint32_t high =
AdrIdp(&low);
1710 uint32_t high =
AdrIsy(&low);
1720 uint32_t high =
AdrDpx(&low);
1726 uint32_t high =
AdrDpx(&low);
1732 uint32_t high =
AdrIly(&low);
1743 uint32_t high =
AdrAby(&low,
false);
1773 uint16_t value =
ReadWord((
PB << 16) | ((adr +
X) & 0xffff),
1774 (
PB << 16) | ((adr +
X + 1) & 0xffff),
true);
1780 uint32_t high =
AdrAbx(&low,
false);
1786 uint32_t high =
AdrAbx(&low,
true);
1792 uint32_t high =
AdrAlx(&low);
1798 LogInstructions(cache_pc, opcode, operand, immediate, accumulator_mode);
1803 bool immediate,
bool accumulator_mode) {
1805 std::ostringstream oss;
1806 oss <<
"$" << std::uppercase << std::setw(2) << std::setfill(
'0')
1807 <<
static_cast<int>(
PB) <<
":" << std::hex <<
PC <<
": 0x"
1808 << std::setw(2) << std::setfill(
'0') << std::hex
1818 std::ostringstream oss_ops;
1820 if (accumulator_mode) {
1821 oss_ops << std::hex << std::setw(2) << std::setfill(
'0')
1822 <<
static_cast<int>(operand);
1824 oss_ops << std::hex << std::setw(4) << std::setfill(
'0')
1825 <<
static_cast<int>(operand);
1827 ops = oss_ops.str();
1830 oss << ops << std::endl;
1836 std::cout <<
"\033[1;36m"
1837 <<
"$" << std::uppercase << std::setw(2) << std::setfill(
'0')
1838 <<
static_cast<int>(
PB) <<
":" << std::hex <<
PC;
1839 std::cout <<
" \033[1;32m"
1840 <<
": 0x" << std::hex << std::uppercase << std::setw(2)
1841 << std::setfill(
'0') <<
static_cast<int>(opcode) <<
" ";
1851 if (accumulator_mode) {
1852 std::cout << std::hex << std::setw(2) << std::setfill(
'0') << operand;
1854 std::cout << std::hex << std::setw(4) << std::setfill(
'0')
1855 <<
static_cast<int>(operand);
1858 bool x_indexing, y_indexing;
1859 auto x_indexed_instruction_opcodes = {0x15, 0x16, 0x17, 0x55, 0x56,
1860 0x57, 0xD5, 0xD6, 0xD7, 0xF5,
1862 auto y_indexed_instruction_opcodes = {0x19, 0x97, 0x1D, 0x59, 0x5D, 0x99,
1863 0x9D, 0xB9, 0xD9, 0xDD, 0xF9, 0xFD};
1864 if (std::find(x_indexed_instruction_opcodes.begin(),
1865 x_indexed_instruction_opcodes.end(),
1866 opcode) != x_indexed_instruction_opcodes.end()) {
1871 if (std::find(y_indexed_instruction_opcodes.begin(),
1872 y_indexed_instruction_opcodes.end(),
1873 opcode) != y_indexed_instruction_opcodes.end()) {
1889 std::cout << std::right;
1890 std::cout <<
"\033[1;33m"
1891 <<
" A:" << std::hex << std::setw(2) << std::setfill(
'0')
1892 <<
static_cast<int>(
A);
1893 std::cout <<
" X:" << std::hex << std::setw(2) << std::setfill(
'0')
1894 <<
static_cast<int>(
X);
1895 std::cout <<
" Y:" << std::hex << std::setw(2) << std::setfill(
'0')
1896 <<
static_cast<int>(
Y);
1897 std::cout <<
" S:" << std::hex << std::setw(2) << std::setfill(
'0')
1898 <<
static_cast<int>(
status);
1899 std::cout <<
" DB:" << std::hex << std::setw(2) << std::setfill(
'0')
1900 <<
static_cast<int>(
DB);
1901 std::cout <<
" D:" << std::hex << std::setw(2) << std::setfill(
'0')
1902 <<
static_cast<int>(
D);
1903 std::cout <<
" SP:" << std::hex << std::setw(4) << std::setfill(
'0')
1906 std::cout << std::endl;
void Stx(uint32_t low, uint32_t high)
bool GetNegativeFlag() const
uint32_t AdrAby(uint32_t *low, bool write)
uint32_t AdrAbl(uint32_t *low)
void Asl(uint32_t low, uint32_t high)
uint32_t AdrIdy(uint32_t *low, bool write)
void Inc(uint32_t low, uint32_t high)
uint32_t AdrSr(uint32_t *low)
void SetZN(uint16_t value, bool byte)
void Ldy(uint32_t low, uint32_t high)
uint32_t Immediate(uint32_t *low, bool xFlag)
void Sta(uint32_t low, uint32_t high)
uint8_t ReadByte(uint32_t address)
uint32_t AdrIdl(uint32_t *low)
void Cpy(uint32_t low, uint32_t high)
uint16_t ReadWord(uint32_t address, uint32_t address_high, bool int_check=false)
void SetDecimalFlag(bool set)
uint32_t AdrAbx(uint32_t *low, bool write)
uint32_t AdrDp(uint32_t *low)
void Bit(uint32_t low, uint32_t high)
std::vector< InstructionEntry > instruction_log_
void And(uint32_t low, uint32_t high)
void SetZeroFlag(bool set)
void WriteByte(uint32_t address, uint8_t value)
void ORA(uint32_t low, uint32_t high)
uint32_t AdrIdp(uint32_t *low)
void Sbc(uint32_t low, uint32_t high)
void Trb(uint32_t low, uint32_t high)
void Lda(uint32_t low, uint32_t high)
void Cpx(uint32_t low, uint32_t high)
void Rol(uint32_t low, uint32_t high)
uint32_t AdrDpy(uint32_t *low)
void Tsb(uint32_t low, uint32_t high)
void Dec(uint32_t low, uint32_t high)
void SetFlags(uint8_t val)
void Ldx(uint32_t low, uint32_t high)
void PushByte(uint8_t value)
void PushWord(uint16_t value, bool int_check=false)
int GetAccumulatorSize() const
uint32_t AdrIly(uint32_t *low)
void LogInstructions(uint16_t PC, uint8_t opcode, uint16_t operand, bool immediate, bool accumulator_mode)
void SetOverflowFlag(bool set)
void ExecuteInstruction(uint8_t opcode)
uint32_t AdrIdx(uint32_t *low)
uint32_t Absolute(uint32_t *low)
uint32_t AdrAlx(uint32_t *low)
void Reset(bool hard=false)
uint16_t PopWord(bool int_check=false)
void SetCarryFlag(bool set)
void SetInterruptFlag(bool set)
bool GetCarryFlag() const
void DoBranch(bool check)
void Eor(uint32_t low, uint32_t high)
void SetSP(uint16_t value)
uint32_t AdrIsy(uint32_t *low)
void Stz(uint32_t low, uint32_t high)
void Cmp(uint32_t low, uint32_t high)
uint16_t ReadOpcodeWord(bool int_check=false)
void Ror(uint32_t low, uint32_t high)
bool GetOverflowFlag() const
void Sty(uint32_t low, uint32_t high)
void Lsr(uint32_t low, uint32_t high)
uint32_t AdrDpx(uint32_t *low)
void Adc(uint32_t low, uint32_t high)
const std::unordered_map< uint8_t, std::string > opcode_to_mnemonic
SNES Emulation and debugging tools.
Main namespace for the application.