From 65b856611ec8d4d263c737e03e37c358508b06c5 Mon Sep 17 00:00:00 2001 From: Adrian Conlon Date: Sun, 7 Jan 2018 22:50:14 +0000 Subject: [PATCH] Undocumented 6502 instruction RLA added. Signed-off-by: Adrian Conlon --- M6502/inc/mos6502.h | 11 +++++++++++ M6502/src/Disassembly.cpp | 3 +++ M6502/src/mos6502.cpp | 9 ++++++--- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/M6502/inc/mos6502.h b/M6502/inc/mos6502.h index 216ee9e..14dd0f9 100644 --- a/M6502/inc/mos6502.h +++ b/M6502/inc/mos6502.h @@ -594,6 +594,17 @@ namespace EightBit { ORA(operand); } + void ANDA(uint8_t value) { + adjustNZ(A() &= value); + } + + void RLA(int bbb) { + auto operand = AM_01(bbb); + ROL(operand); + setByte(operand); + ANDA(operand); + } + void ROR(uint8_t& output); void LSR(uint8_t& output); diff --git a/M6502/src/Disassembly.cpp b/M6502/src/Disassembly.cpp index ae2ef77..c40d9b5 100644 --- a/M6502/src/Disassembly.cpp +++ b/M6502/src/Disassembly.cpp @@ -392,6 +392,9 @@ std::string EightBit::Disassembly::disassemble(uint16_t current) const { case 0b000: output << disassemble_AM_01(bbb, "*SLO"); break; + case 0b001: + output << disassemble_AM_01(bbb, "*RLA"); + break; case 0b100: output << disassemble_AM_11(bbb, "*SAX"); break; diff --git a/M6502/src/mos6502.cpp b/M6502/src/mos6502.cpp index 4e4bab0..f6c6ff5 100644 --- a/M6502/src/mos6502.cpp +++ b/M6502/src/mos6502.cpp @@ -7,8 +7,8 @@ EightBit::MOS6502::MOS6502(Bus& bus) //// 0 1 2 3 4 5 6 7 8 9 A B C D E F /* 0 */ 7, 6, 0, 8, 3, 3, 5, 5, 3, 2, 2, 0, 4, 4, 6, 6, /* 1 */ 2, 5, 0, 7, 4, 4, 6, 6, 2, 4, 2, 6, 4, 4, 7, 6, - /* 2 */ 6, 6, 0, 0, 3, 3, 5, 0, 4, 2, 2, 0, 4, 4, 6, 0, - /* 3 */ 2, 5, 0, 0, 4, 4, 6, 0, 2, 4, 2, 0, 4, 4, 7, 0, + /* 2 */ 6, 6, 0, 8, 3, 3, 5, 5, 4, 2, 2, 0, 4, 4, 6, 6, + /* 3 */ 2, 5, 0, 7, 4, 4, 6, 6, 2, 4, 2, 6, 4, 4, 7, 6, /* 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, @@ -297,7 +297,7 @@ int EightBit::MOS6502::execute(uint8_t cell) { ORA(AM_01(decoded.bbb)); break; case 0b001: // AND - adjustNZ(A() &= AM_01(decoded.bbb)); + ANDA(AM_01(decoded.bbb)); break; case 0b010: // EOR adjustNZ(A() ^= AM_01(decoded.bbb)); @@ -414,6 +414,9 @@ int EightBit::MOS6502::execute(uint8_t cell) { case 0b000: // *SLO SLO(decoded.bbb); break; + case 0b001: // *RLA + RLA(decoded.bbb); + break; case 0b100: // *SAX AM_11(decoded.bbb, A() & X()); break;