diff --git a/M6502/src/Disassembly.cpp b/M6502/src/Disassembly.cpp index 772ff51..9fe68c0 100644 --- a/M6502/src/Disassembly.cpp +++ b/M6502/src/Disassembly.cpp @@ -68,15 +68,27 @@ std::string EightBit::Disassembly::disassemble(uint16_t current) const { case 0b000: // BRK output << disassemble_Implied("BRK"); break; + case 0b001: // DOP/NOP (0x04) + output << disassemble_AM_00(bbb, "*NOP"); + break; case 0b010: // PHP output << disassemble_Implied("PHP"); break; + case 0b011: // TOP/NOP (0b00001100, 0x0c) + output << disassemble_AM_00(bbb, "*NOP"); + break; case 0b100: // BPL output << disassemble_Relative("BPL", relative); break; + case 0b101: // DOP/NOP (0x14) + output << disassemble_AM_00(bbb, "*NOP"); + break; case 0b110: // CLC output << disassemble_Implied("CLC"); break; + case 0b111: // TOP/NOP (0b00011100, 0x1c) + output << disassemble_AM_00(bbb, "*NOP"); + break; default: throw std::domain_error("Illegal instruction"); } @@ -92,9 +104,15 @@ std::string EightBit::Disassembly::disassemble(uint16_t current) const { case 0b100: // BMI output << disassemble_Relative("BMI", relative); break; + case 0b101: // DOP/NOP (0x34) + output << disassemble_AM_00(bbb, "*NOP"); + break; case 0b110: // SEC output << disassemble_Implied("SEC"); break; + case 0b111: // TOP/NOP (0b00111100, 0x3c) + output << disassemble_AM_00(bbb, "*NOP"); + break; default: // BIT output << disassemble_AM_00(bbb, "BIT"); break; @@ -105,6 +123,9 @@ std::string EightBit::Disassembly::disassemble(uint16_t current) const { case 0b000: // RTI output << disassemble_Implied("RTI"); break; + case 0b001: // DOP/NOP (0x44) + output << disassemble_AM_00(bbb, "*NOP"); + break; case 0b010: // PHA output << disassemble_Implied("PHA"); break; @@ -114,9 +135,15 @@ std::string EightBit::Disassembly::disassemble(uint16_t current) const { case 0b100: // BVC output << disassemble_Relative("BVC", relative); break; + case 0b101: // DOP/NOP (0x54) + output << disassemble_AM_00(bbb, "*NOP"); + break; case 0b110: // CLI output << disassemble_Implied("CLI"); break; + case 0b111: // TOP/NOP (0b01011100, 0x5c) + output << disassemble_AM_00(bbb, "*NOP"); + break; default: throw std::domain_error("Illegal addressing mode"); } @@ -126,6 +153,9 @@ std::string EightBit::Disassembly::disassemble(uint16_t current) const { case 0b000: // RTS output << disassemble_Implied("RTS"); break; + case 0b001: // DOP/NOP (0x64) + output << disassemble_AM_00(bbb, "*NOP"); + break; case 0b010: // PLA output << disassemble_Implied("PLA"); break; @@ -135,15 +165,24 @@ std::string EightBit::Disassembly::disassemble(uint16_t current) const { case 0b100: // BVS output << disassemble_Relative("BVS", relative); break; + case 0b101: // DOP/NOP (0x74) + output << disassemble_AM_00(bbb, "*NOP"); + break; case 0b110: // SEI output << disassemble_Implied("SEI"); break; + case 0b111: // TOP/NOP (0b01111100, 0x7c) + output << disassemble_AM_00(bbb, "*NOP"); + break; default: throw std::domain_error("Illegal addressing mode"); } break; case 0b100: switch (bbb) { + case 0b000: // DOP/NOP (0x80) + output << disassemble_AM_00(bbb, "*NOP"); + break; case 0b010: // DEY output << disassemble_Implied("DEY"); break; @@ -182,9 +221,15 @@ std::string EightBit::Disassembly::disassemble(uint16_t current) const { case 0b100: // BNE output << disassemble_Relative("BNE", relative); break; + case 0b101: // DOP/NOP (0xd4) + output << disassemble_AM_00(bbb, "*NOP"); + break; case 0b110: // CLD output << disassemble_Implied("CLD"); break; + case 0b111: // TOP/NOP (0b11011100, 0xdc) + output << disassemble_AM_00(bbb, "*NOP"); + break; default: // CPY output << disassemble_AM_00(bbb, "CPY"); break; @@ -198,9 +243,15 @@ std::string EightBit::Disassembly::disassemble(uint16_t current) const { case 0b100: // BEQ output << disassemble_Relative("BEQ", relative); break; + case 0b101: // DOP/NOP (0xf4) + output << disassemble_AM_00(bbb, "*NOP"); + break; case 0b110: // SED output << disassemble_Implied("SED"); break; + case 0b111: // TOP/NOP (0b11111100, 0xfc) + output << disassemble_AM_00(bbb, "*NOP"); + break; default: // CPX output << disassemble_AM_00(bbb, "CPX"); break; @@ -241,16 +292,44 @@ std::string EightBit::Disassembly::disassemble(uint16_t current) const { case 0b10: switch (aaa) { case 0b000: // ASL - output << disassemble_AM_10(bbb, "ASL"); + switch (bbb) { + case 0b110: // 0x1a + output << disassemble_Implied("*NOP"); + break; + default: + output << disassemble_AM_10(bbb, "ASL"); + break; + } break; case 0b001: // ROL - output << disassemble_AM_10(bbb, "ROL"); + switch (bbb) { + case 0b110: // 0x3a + output << disassemble_Implied("*NOP"); + break; + default: + output << disassemble_AM_10(bbb, "ROL"); + break; + } break; case 0b010: // LSR - output << disassemble_AM_10(bbb, "LSR"); + switch (bbb) { + case 0b110: // 0x5a + output << disassemble_Implied("*NOP"); + break; + default: + output << disassemble_AM_10(bbb, "LSR"); + break; + } break; case 0b011: // ROR - output << disassemble_AM_10(bbb, "ROR"); + switch (bbb) { + case 0b110: // 0x7a + output << disassemble_Implied("*NOP"); + break; + default: + output << disassemble_AM_10(bbb, "ROR"); + break; + } break; case 0b100: switch (bbb) { @@ -283,6 +362,9 @@ std::string EightBit::Disassembly::disassemble(uint16_t current) const { case 0b010: // DEX output << disassemble_Implied("DEX"); break; + case 0b110: // 0xda + output << disassemble_Implied("*NOP"); + break; default: // DEC output << disassemble_AM_10(bbb, "DEC"); break; @@ -293,6 +375,9 @@ std::string EightBit::Disassembly::disassemble(uint16_t current) const { case 0b010: // NOP output << disassemble_Implied("NOP"); break; + case 0b110: // 0xfa + output << disassemble_Implied("*NOP"); + break; default: // INC output << disassemble_AM_10(bbb, "INC"); break; diff --git a/M6502/src/mos6502.cpp b/M6502/src/mos6502.cpp index 5368b98..158cfb2 100644 --- a/M6502/src/mos6502.cpp +++ b/M6502/src/mos6502.cpp @@ -5,22 +5,22 @@ EightBit::MOS6502::MOS6502(Bus& bus) : Processor(bus) { m_timings = { //// 0 1 2 3 4 5 6 7 8 9 A B C D E F - /* 0 */ 7, 6, 0, 0, 0, 3, 5, 0, 3, 2, 2, 0, 0, 4, 6, 0, - /* 1 */ 2, 5, 0, 0, 0, 4, 6, 0, 2, 4, 0, 0, 0, 4, 7, 0, + /* 0 */ 7, 6, 0, 0, 3, 3, 5, 0, 3, 2, 2, 0, 4, 4, 6, 0, + /* 1 */ 2, 5, 0, 0, 4, 4, 6, 0, 2, 4, 2, 0, 4, 4, 7, 0, /* 2 */ 6, 6, 0, 0, 3, 3, 5, 0, 4, 2, 2, 0, 4, 4, 6, 0, - /* 3 */ 2, 5, 0, 0, 0, 4, 6, 0, 2, 4, 0, 0, 0, 4, 7, 0, - /* 4 */ 6, 6, 0, 0, 0, 3, 5, 0, 3, 2, 2, 0, 3, 4, 6, 0, - /* 5 */ 2, 5, 0, 0, 0, 4, 6, 0, 2, 4, 0, 0, 0, 4, 7, 0, - /* 6 */ 6, 6, 0, 0, 0, 3, 5, 0, 4, 2, 2, 0, 5, 4, 6, 0, - /* 7 */ 2, 5, 0, 0, 0, 4, 6, 0, 2, 4, 0, 0, 0, 4, 7, 0, - /* 8 */ 0, 6, 0, 0, 3, 3, 3, 0, 2, 0, 2, 0, 4, 4, 4, 0, + /* 3 */ 2, 5, 0, 0, 4, 4, 6, 0, 2, 4, 2, 0, 4, 4, 7, 0, + /* 4 */ 6, 6, 0, 0, 3, 3, 5, 0, 3, 2, 2, 0, 3, 4, 6, 0, + /* 5 */ 2, 5, 0, 0, 4, 4, 6, 0, 2, 4, 2, 0, 4, 4, 7, 0, + /* 6 */ 6, 6, 0, 0, 3, 3, 5, 0, 4, 2, 2, 0, 5, 4, 6, 0, + /* 7 */ 2, 5, 0, 0, 4, 4, 6, 0, 2, 4, 2, 0, 4, 4, 7, 0, + /* 8 */ 2, 6, 0, 0, 3, 3, 3, 0, 2, 0, 2, 0, 4, 4, 4, 0, /* 9 */ 2, 6, 0, 0, 4, 4, 4, 0, 2, 5, 2, 0, 0, 5, 0, 0, /* A */ 2, 6, 2, 0, 3, 3, 3, 0, 2, 2, 2, 0, 4, 4, 4, 0, /* B */ 2, 5, 0, 0, 4, 4, 4, 0, 2, 4, 2, 0, 4, 4, 4, 0, /* C */ 2, 6, 0, 0, 3, 3, 5, 0, 2, 2, 2, 0, 4, 4, 6, 0, - /* D */ 2, 5, 0, 0, 0, 4, 6, 0, 2, 4, 0, 0, 0, 4, 7, 0, + /* D */ 2, 5, 0, 0, 4, 4, 6, 0, 2, 4, 2, 0, 4, 4, 7, 0, /* E */ 2, 6, 0, 0, 3, 3, 5, 0, 2, 2, 2, 0, 4, 4, 6, 0, - /* F */ 2, 5, 0, 0, 0, 4, 6, 0, 2, 4, 0, 0, 0, 4, 7, 0, + /* F */ 2, 5, 0, 0, 4, 4, 6, 0, 2, 4, 2, 0, 4, 4, 7, 0, }; @@ -100,15 +100,27 @@ int EightBit::MOS6502::execute(uint8_t cell) { case 0b000: // BRK BRK(); break; + case 0b001: // DOP/NOP (0x04) + AM_ZeroPage(); + break; case 0b010: // PHP PHP(); break; + case 0b011: // TOP/NOP (0b00001100, 0x0c) + AM_Absolute(); + break; case 0b100: // BPL Branch(!(P() & NF)); break; + case 0b101: // DOP/NOP (0x14) + AM_ZeroPageX(); + break; case 0b110: // CLC clearFlag(P(), CF); break; + case 0b111: // TOP/NOP (0b‭00011100‬, 0x1c) + AM_AbsoluteX(); + break; default: throw std::domain_error("Illegal instruction"); } @@ -124,9 +136,15 @@ int EightBit::MOS6502::execute(uint8_t cell) { case 0b100: // BMI Branch((P() & NF) != 0); break; + case 0b101: // DOP/NOP (0x34) + AM_ZeroPageX(); + break; case 0b110: // SEC setFlag(P(), CF); break; + case 0b111: // TOP/NOP (0b‭00111100‬, 0x3c) + AM_AbsoluteX(); + break; default: // BIT BIT(AM_00(decoded.bbb)); break; @@ -137,6 +155,9 @@ int EightBit::MOS6502::execute(uint8_t cell) { case 0b000: // RTI RTI(); break; + case 0b001: // DOP/NOP (0x44) + AM_ZeroPage(); + break; case 0b010: // PHA push(A()); break; @@ -146,9 +167,15 @@ int EightBit::MOS6502::execute(uint8_t cell) { case 0b100: // BVC Branch(!(P() & VF)); break; + case 0b101: // DOP/NOP (0x54) + AM_ZeroPageX(); + break; case 0b110: // CLI clearFlag(P(), IF); break; + case 0b111: // TOP/NOP (0b‭01011100‬, 0x5c) + AM_AbsoluteX(); + break; default: throw std::domain_error("Illegal addressing mode"); } @@ -158,6 +185,9 @@ int EightBit::MOS6502::execute(uint8_t cell) { case 0b000: // RTS RTS(); break; + case 0b001: // DOP/NOP (0x64) + AM_ZeroPage(); + break; case 0b010: // PLA adjustNZ(A() = pop()); break; @@ -167,15 +197,24 @@ int EightBit::MOS6502::execute(uint8_t cell) { case 0b100: // BVS Branch((P() & VF) != 0); break; + case 0b101: // DOP/NOP (0x74) + AM_ZeroPageX(); + break; case 0b110: // SEI setFlag(P(), IF); break; + case 0b111: // TOP/NOP (0b‭01111100‬, 0x7c) + AM_AbsoluteX(); + break; default: throw std::domain_error("Illegal addressing mode"); } break; case 0b100: switch (decoded.bbb) { + case 0b000: // DOP/NOP (0x80) + AM_Immediate(); + break; case 0b010: // DEY adjustNZ(--Y()); break; @@ -214,9 +253,15 @@ int EightBit::MOS6502::execute(uint8_t cell) { case 0b100: // BNE Branch(!(P() & ZF)); break; + case 0b101: // DOP/NOP (0xd4) + AM_ZeroPageX(); + break; case 0b110: // CLD clearFlag(P(), DF); break; + case 0b111: // TOP/NOP (0b‭11011100‬, 0xdc) + AM_AbsoluteX(); + break; default: // CPY CMP(Y(), AM_00(decoded.bbb)); break; @@ -230,9 +275,15 @@ int EightBit::MOS6502::execute(uint8_t cell) { case 0b100: // BEQ Branch((P() & ZF) != 0); break; + case 0b101: // DOP/NOP (0xf4) + AM_ZeroPageX(); + break; case 0b110: // SED setFlag(P(), DF); break; + case 0b111: // TOP/NOP (0b‭11111100‬, 0xfc) + AM_AbsoluteX(); + break; default: // CPX CMP(X(), AM_00(decoded.bbb)); break; @@ -273,16 +324,40 @@ int EightBit::MOS6502::execute(uint8_t cell) { case 0b10: switch (decoded.aaa) { case 0b000: // ASL - ASL(decoded.bbb); + switch (decoded.bbb) { + case 0b110: + break; // *NOP (0x1a) + default: + ASL(decoded.bbb); + break; + } break; case 0b001: // ROL - ROL(decoded.bbb); + switch (decoded.bbb) { + case 0b110: + break; // *NOP (0x3a) + default: + ROL(decoded.bbb); + break; + } break; case 0b010: // LSR - LSR(decoded.bbb); + switch (decoded.bbb) { + case 0b110: + break; // *NOP (0x5a) + default: + LSR(decoded.bbb); + break; + } break; - case 0b011: // ROR - ROR(decoded.bbb); + case 0b011: // ROR (0x7a) + switch (decoded.bbb) { + case 0b110: + break; // *NOP + default: + ROR(decoded.bbb); + break; + } break; case 0b100: switch (decoded.bbb) { @@ -312,6 +387,8 @@ int EightBit::MOS6502::execute(uint8_t cell) { case 0b010: // DEX adjustNZ(--X()); break; + case 0b110: // *NOP (0xda) + break; default: // DEC DEC(decoded.bbb); break; @@ -321,6 +398,8 @@ int EightBit::MOS6502::execute(uint8_t cell) { switch (decoded.bbb) { case 0b010: // NOP break; + case 0b110: // *NOP (0xfa) + break; default: // INC INC(decoded.bbb); break;