Started added undocumented instructions: first the NOPS (single, double and triple byte variants, including cycle variations).

Signed-off-by: Adrian Conlon <Adrian.conlon@gmail.com>
This commit is contained in:
Adrian Conlon committed 2017-12-31 14:41:00 +00:00
1 parent 82fe35891d
commit eb40c0865e
2 files changed
+183 -19

No files matched your search

+89 -4
View File
@@ -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;
+94 -15
View File
@@ -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;