mirror of
https://github.com/MoleskiCoder/EightBit.git
synced 2026-10-22 07:02:37 +00:00
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:
1 parent
82fe35891d
commit
eb40c0865e
2 files changed
+183
-19
No files matched your search
@@ -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
@@ -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 (0b00011100, 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 (0b00111100, 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 (0b01011100, 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 (0b01111100, 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 (0b11011100, 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 (0b11111100, 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;
|
||||
|
||||
Reference in new issue
Block a user