diff --git a/M6502/inc/AddressingMode.h b/M6502/inc/AddressingMode.h deleted file mode 100644 index 1b52b8b..0000000 --- a/M6502/inc/AddressingMode.h +++ /dev/null @@ -1,23 +0,0 @@ -#pragma once - -namespace EightBit { - enum AddressingMode { - Illegal, - Implied, - Accumulator, - Immediate, - Relative, - XIndexed, - IndexedY, - ZeroPage, - ZeroPageX, - ZeroPageY, - Absolute, - AbsoluteX, - AbsoluteY, - AbsoluteXIndirect, - Indirect, - ZeroPageIndirect, - ZeroPageRelative - }; -} \ No newline at end of file diff --git a/M6502/inc/AddressingModeDumper.h b/M6502/inc/AddressingModeDumper.h deleted file mode 100644 index 1a0334c..0000000 --- a/M6502/inc/AddressingModeDumper.h +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -#include -#include - -namespace EightBit { - - typedef std::function dumper_t; - - struct AddressingModeDumper { - dumper_t byteDumper; - dumper_t disassemblyDumper; - }; -} \ No newline at end of file diff --git a/M6502/inc/Disassembly.h b/M6502/inc/Disassembly.h index 814b272..82a9a1d 100644 --- a/M6502/inc/Disassembly.h +++ b/M6502/inc/Disassembly.h @@ -4,34 +4,319 @@ #include #include "mos6502.h" -#include "AddressingMode.h" - #include "Symbols.h" -#include "AddressingModeDumper.h" namespace EightBit { class Disassembly { public: - MOS6502& processor; - const Symbols& symbols; - - std::map dumpers; - Disassembly(MOS6502& processor, const Symbols& symbols); std::string Dump_Flags(uint8_t value) const; std::string Dump_ByteValue(uint8_t value) const; std::string Dump_WordValue(uint16_t value) const; - std::string DumpBytes(AddressingMode mode, uint16_t current) const; std::string Disassemble(uint16_t current) const; - std::string DumpOperand(AddressingMode mode, uint16_t current) const; private: - uint8_t GetByte(uint16_t address) const; - uint16_t GetWord(uint16_t address) const; + MOS6502& processor; + const Symbols& symbols; + + mutable uint16_t m_address; + + std::string disassemble_Implied(const std::string& instruction) const { + return "\t" + instruction; + } + + std::string disassemble_Absolute(const std::string& instruction) const { + return AM_Absolute_dump() + "\t" + instruction + " " + AM_Absolute(); + } + + std::string disassemble_Indirect(const std::string& instruction) const { + return AM_Absolute_dump() + "\t" + instruction + " (" + AM_Absolute() + ")"; + } + + std::string disassemble_Relative(const std::string& instruction, uint16_t address) const { + return AM_Immediate_dump() + "\t" + instruction + " $" + Dump_WordValue(address); + } + + std::string disassemble_AM_00(int bbb, const std::string& instruction) const { + return AM_00_dump(bbb) + "\t" + instruction + " " + AM_00(bbb); + } + + std::string disassemble_AM_01(int bbb, const std::string& instruction) const { + return AM_01_dump(bbb) + "\t" + instruction + " " + AM_01(bbb); + } + + std::string disassemble_AM_10(int bbb, const std::string& instruction) const { + return AM_10_dump(bbb) + "\t" + instruction + " " + AM_10(bbb); + } + + std::string disassemble_AM_10_x(int bbb, const std::string& instruction) const { + return AM_10_x_dump(bbb) + "\t" + instruction + " " + AM_10_x(bbb); + } + +#pragma region 6502 addressing modes + +#pragma region References + + std::string AM_Immediate_dump() const { + return Dump_Byte(m_address + 1); + } + + std::string AM_Immediate() const { + return "#" + AM_Immediate_dump(); + } + + std::string AM_Absolute_dump() const { + return Dump_DByte(m_address + 1); + } + + std::string AM_Absolute() const { + return "$" + Dump_WordValue(processor.getMemory().peekWord(m_address + 1)); + } + + std::string AM_ZeroPage_dump() const { + return Dump_Byte(m_address + 1); + } + + std::string AM_ZeroPage() const { + return "$" + Dump_Byte(m_address + 1); + } + + std::string AM_ZeroPageX_dump() const { + return AM_ZeroPage_dump(); + } + + std::string AM_ZeroPageX() const { + return AM_ZeroPage() + ",X"; + } + + std::string AM_ZeroPageY_dump() const { + return AM_ZeroPage_dump(); + } + + std::string AM_ZeroPageY() const { + return AM_ZeroPage() + ",Y"; + } + + std::string AM_AbsoluteX_dump() const { + return AM_Absolute_dump(); + } + + std::string AM_AbsoluteX() const { + return AM_Absolute() + ",X"; + } + + std::string AM_AbsoluteY_dump() const { + return AM_Absolute_dump(); + } + + std::string AM_AbsoluteY() const { + return AM_Absolute() + ",Y"; + } + + std::string AM_IndexedIndirectX_dump() const { + return AM_ZeroPage_dump(); + } + + std::string AM_IndexedIndirectX() const { + return "($" + Dump_Byte(m_address + 1) + ",X)"; + } + + std::string AM_IndirectIndexedY_dump() const { + return AM_ZeroPage_dump(); + } + + std::string AM_IndirectIndexedY() const { + return "($" + Dump_Byte(m_address + 1) + "),Y"; + } + +#pragma endregion References + +#pragma region 6502 addressing mode switching + + std::string AM_00_dump(int bbb) const { + switch (bbb) { + case 0b000: + return AM_Immediate_dump(); + case 0b001: + return AM_ZeroPage_dump(); + case 0b011: + return AM_Absolute_dump(); + case 0b101: + return AM_ZeroPageX_dump(); + case 0b111: + return AM_AbsoluteX_dump(); + case 0b010: + case 0b100: + case 0b110: + throw std::domain_error("Illegal addressing mode"); + default: + __assume(0); + } + } + + std::string AM_00(int bbb) const { + switch (bbb) { + case 0b000: + return AM_Immediate(); + case 0b001: + return AM_ZeroPage(); + case 0b011: + return AM_Absolute(); + case 0b101: + return AM_ZeroPageX(); + case 0b111: + return AM_AbsoluteX(); + case 0b010: + case 0b100: + case 0b110: + throw std::domain_error("Illegal addressing mode"); + default: + __assume(0); + } + } + + std::string AM_01_dump(int bbb) const { + switch (bbb) { + case 0b000: + return AM_IndexedIndirectX_dump(); + case 0b001: + return AM_ZeroPage_dump(); + case 0b010: + return AM_Immediate_dump(); + case 0b011: + return AM_Absolute_dump(); + case 0b100: + return AM_IndirectIndexedY_dump(); + case 0b101: + return AM_ZeroPageX_dump(); + case 0b110: + return AM_AbsoluteY_dump(); + case 0b111: + return AM_AbsoluteX_dump(); + default: + __assume(0); + } + } + + std::string AM_01(int bbb) const { + switch (bbb) { + case 0b000: + return AM_IndexedIndirectX(); + case 0b001: + return AM_ZeroPage(); + case 0b010: + return AM_Immediate(); + case 0b011: + return AM_Absolute(); + case 0b100: + return AM_IndirectIndexedY(); + case 0b101: + return AM_ZeroPageX(); + case 0b110: + return AM_AbsoluteY(); + case 0b111: + return AM_AbsoluteX(); + default: + __assume(0); + } + } + + std::string AM_10_dump(int bbb) const { + switch (bbb) { + case 0b000: + return AM_Immediate_dump(); + case 0b001: + return AM_ZeroPage_dump(); + case 0b010: + return ""; + case 0b011: + return AM_Absolute_dump(); + case 0b101: + return AM_ZeroPageX_dump(); + case 0b111: + return AM_AbsoluteX_dump(); + case 0b100: + case 0b110: + throw std::domain_error("Illegal addressing mode"); + default: + __assume(0); + } + } + + std::string AM_10(int bbb) const { + switch (bbb) { + case 0b000: + return AM_Immediate(); + case 0b001: + return AM_ZeroPage(); + case 0b010: + return "A"; + case 0b011: + return AM_Absolute(); + case 0b101: + return AM_ZeroPageX(); + case 0b111: + return AM_AbsoluteX(); + case 0b100: + case 0b110: + throw std::domain_error("Illegal addressing mode"); + default: + __assume(0); + } + } + + std::string AM_10_x_dump(int bbb) const { + switch (bbb) { + case 0b000: + return AM_Immediate_dump(); + case 0b001: + return AM_ZeroPage_dump(); + case 0b010: + return ""; + case 0b011: + return AM_Absolute_dump(); + case 0b101: + return AM_ZeroPageY_dump(); + case 0b111: + return AM_AbsoluteY_dump(); + case 0b100: + case 0b110: + throw std::domain_error("Illegal addressing mode"); + default: + __assume(0); + } + } + + std::string AM_10_x(int bbb) const { + switch (bbb) { + case 0b000: + return AM_Immediate(); + case 0b001: + return AM_ZeroPage(); + case 0b010: + return "A"; + case 0b011: + return AM_Absolute(); + case 0b101: + return AM_ZeroPageY(); + case 0b111: + return AM_AbsoluteY(); + case 0b100: + case 0b110: + throw std::domain_error("Illegal addressing mode"); + default: + __assume(0); + } + } + +#pragma endregion 6502 addressing mode switching + +#pragma endregion 6502 addressing modes + + uint8_t GetByte(uint16_t address) const; - std::string Dump_Nothing(uint16_t unused) const; std::string Dump_Byte(uint16_t address) const; std::string Dump_DByte(uint16_t address) const; @@ -39,28 +324,5 @@ namespace EightBit { std::string ConvertAddress(uint8_t address) const; std::string ConvertConstant(uint16_t constant) const; std::string ConvertConstant(uint8_t constant) const; - - std::string Dump_A(uint16_t unused) const; - std::string Dump_imm(uint16_t current) const; - std::string Dump_abs(uint16_t current) const; - std::string Dump_zp(uint16_t current) const; - std::string Dump_zpx(uint16_t current) const; - std::string Dump_zpy(uint16_t current) const; - std::string Dump_absx(uint16_t current) const; - std::string Dump_absy(uint16_t current) const; - std::string Dump_absxind(uint16_t current) const; - std::string Dump_xind(uint16_t current) const; - std::string Dump_indy(uint16_t current) const; - std::string Dump_ind(uint16_t current) const; - std::string Dump_zpind(uint16_t current) const; - std::string Dump_rel(uint16_t current) const; - std::string Dump_zprel(uint16_t current) const; - - const AddressingModeDumper& getDumper(AddressingMode mode) const { - auto dumper = dumpers.find(mode); - if (dumper == dumpers.end()) - throw std::invalid_argument("Illegal addressing mode"); - return dumper->second; - } }; } \ No newline at end of file diff --git a/M6502/inc/ProcessorType.h b/M6502/inc/ProcessorType.h deleted file mode 100644 index 4ba1db0..0000000 --- a/M6502/inc/ProcessorType.h +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -namespace EightBit { - enum ProcessorType { - Cpu6502, - Cpu65SC02, - Cpu65C02 - }; -} \ No newline at end of file diff --git a/M6502/inc/mos6502.h b/M6502/inc/mos6502.h index a171aca..4a61ff2 100644 --- a/M6502/inc/mos6502.h +++ b/M6502/inc/mos6502.h @@ -7,8 +7,6 @@ #include "Memory.h" #include "Processor.h" -#include "ProcessorType.h" -#include "AddressingMode.h" #include "Signal.h" namespace EightBit { @@ -25,32 +23,17 @@ namespace EightBit { CF = 0x01, // Carry }; - typedef std::function instruction_t; - - struct Instruction { - instruction_t vector = nullptr; - int count = 0; - AddressingMode mode = AddressingMode::Illegal; - std::string display = ""; - }; - - MOS6502(Memory& memory, ProcessorType level); + MOS6502(Memory& memory); Signal ExecutingInstruction; Signal ExecutedInstruction; - ProcessorType getLevel() const { return level; } - uint8_t& X() { return x; } uint8_t& Y() { return y; } uint8_t& A() { return a; } uint8_t& S() { return s; } uint8_t& P() { return p; } - const Instruction& getInstruction(uint8_t code) const { - return instructions[code]; - } - virtual void initialise(); virtual int step(); @@ -74,19 +57,7 @@ namespace EightBit { virtual int Execute(uint8_t cell); - void ___(); - private: - static Instruction INS(instruction_t method, int cycles, AddressingMode addressing, std::string display); - - void Install6502Instructions(); - void Install65sc02Instructions(); - void Install65c02Instructions(); - - void InstallInstructionSet(const std::array& basis); - void OverlayInstructionSet(const std::array& overlay); - void OverlayInstructionSet(const std::array& overlay, bool includeIllegal); - void UpdateZeroFlag(uint8_t datum) { clearFlag(P(), ZF, datum); } void UpdateNegativeFlag(uint8_t datum) { setFlag(P(), NF, datum & NF); } @@ -169,18 +140,6 @@ namespace EightBit { #pragma region References - uint8_t& AM_A() { - return A(); - } - - uint8_t& AM_X() { - return X(); - } - - uint8_t& AM_Y() { - return Y(); - } - uint8_t& AM_Immediate() { FetchByte(); return m_memory.reference(); @@ -295,7 +254,7 @@ namespace EightBit { case 0b001: return AM_ZeroPage(); case 0b010: - return AM_A(); + return A(); case 0b011: return AM_Absolute(); case 0b101: @@ -310,14 +269,14 @@ namespace EightBit { } } - uint8_t& AM_10_x(int bbb, bool x = false) { + uint8_t& AM_10_x(int bbb) { switch (bbb) { case 0b000: return AM_Immediate(); case 0b001: return AM_ZeroPage(); case 0b010: - return AM_A(); + return A(); case 0b011: return AM_Absolute(); case 0b101: @@ -344,9 +303,6 @@ namespace EightBit { void BIT(uint8_t data); - void TSB(uint8_t& output); - void TRB(uint8_t& output); - void INC(uint8_t& output); void ROL(uint8_t& output); @@ -363,9 +319,6 @@ namespace EightBit { void EOR(uint8_t data); - void CPX(uint8_t data); - void CPY(uint8_t data); - void CMP(uint8_t data); void CMP(uint8_t first, uint8_t second); void LDA(uint8_t data); @@ -376,265 +329,20 @@ namespace EightBit { void ADC_b(uint8_t data); void ADC_d(uint8_t data); - void RMB(uint8_t& output, uint8_t flag); - void SMB(uint8_t& output, uint8_t flag); - void Branch(int8_t displacement); - void Branch(); + void Branch(bool flag); - void BitBranch_Clear(uint8_t check); - void BitBranch_Set(uint8_t check); - void NOP_imp(); - void NOP2_imp(); - void NOP3_imp(); - - void ORA_xind(); - void ORA_zp(); - void ORA_imm(); - void ORA_abs(); - void ORA_absx(); - void ORA_absy(); - void ORA_zpx(); - void ORA_indy(); - void ORA_zpind(); - - void AND_zpx(); - void AND_indy(); - void AND_zp(); - void AND_absx(); - void AND_absy(); - void AND_imm(); - void AND_xind(); - void AND_abs(); - void AND_zpind(); - - void EOR_absx(); - void EOR_absy(); - void EOR_zpx(); - void EOR_indy(); - void EOR_abs(); - void EOR_imm(); - void EOR_zp(); - void EOR_xind(); - void EOR_zpind(); - - void LDA_absx(); - void LDA_absy(); - void LDA_zpx(); - void LDA_indy(); - void LDA_abs(); - void LDA_imm(); - void LDA_zp(); - void LDA_xind(); - void LDA_zpind(); - - void LDX_imm(); - void LDX_zp(); - void LDX_abs(); - void LDX_zpy(); - void LDX_absy(); - - void LDY_imm(); - void LDY_zp(); - void LDY_abs(); - void LDY_zpx(); - void LDY_absx(); - - void CMP_absx(); - void CMP_absy(); - void CMP_zpx(); - void CMP_indy(); - void CMP_abs(); - void CMP_imm(); - void CMP_zp(); - void CMP_xind(); - void CMP_zpind(); - - void CPX_abs(); - void CPX_zp(); - void CPX_imm(); - - void CPY_imm(); - void CPY_zp(); - void CPY_abs(); - - void ADC_zp(); - void ADC_xind(); - void ADC_imm(); - void ADC_abs(); - void ADC_zpx(); - void ADC_indy(); - void ADC_absx(); - void ADC_absy(); - void ADC_zpind(); - - void SBC_xind(); - void SBC_zp(); - void SBC_imm(); - void SBC_abs(); - void SBC_zpx(); - void SBC_indy(); - void SBC_absx(); - void SBC_absy(); - void SBC_zpind(); - - void BIT_imm(); - void BIT_zp(); - void BIT_zpx(); - void BIT_abs(); - void BIT_absx(); - - void DEC_a(); - void DEC_absx(); - void DEC_zpx(); - void DEC_abs(); - void DEC_zp(); - - void DEX_imp(); - void DEY_imp(); - - void INC_a(); - void INC_zp(); - void INC_absx(); - void INC_zpx(); - void INC_abs(); - - void INX_imp(); - void INY_imp(); - - void STX_zpy(); - void STX_abs(); - void STX_zp(); - - void STY_zpx(); - void STY_abs(); - void STY_zp(); - - void STA_absx(); - void STA_absy(); - void STA_zpx(); - void STA_indy(); - void STA_abs(); - void STA_zp(); - void STA_xind(); - void STA_zpind(); - - void STZ_zp(); - void STZ_zpx(); - void STZ_abs(); - void STZ_absx(); - - void TSX_imp(); - void TAX_imp(); - void TAY_imp(); - void TXS_imp(); - void TYA_imp(); - void TXA_imp(); - - void PHP_imp(); - void PLP_imp(); - void PLA_imp(); - void PHA_imp(); - void PHX_imp(); - void PHY_imp(); - void PLX_imp(); - void PLY_imp(); - - void ASL_a(); - void ASL_zp(); - void ASL_abs(); - void ASL_absx(); - void ASL_zpx(); - - void LSR_absx(); - void LSR_zpx(); - void LSR_abs(); - void LSR_a(); - void LSR_zp(); - - void ROL_absx(); - void ROL_zpx(); - void ROL_abs(); - void ROL_a(); - void ROL_zp(); - - void ROR_absx(); - void ROR_zpx(); - void ROR_abs(); - void ROR_a(); - void ROR_zp(); - - void TSB_zp(); - void TSB_abs(); - - void TRB_zp(); - void TRB_abs(); - - void RMB0_zp(); - void RMB1_zp(); - void RMB2_zp(); - void RMB3_zp(); - void RMB4_zp(); - void RMB5_zp(); - void RMB6_zp(); - void RMB7_zp(); - - void SMB0_zp(); - void SMB1_zp(); - void SMB2_zp(); - void SMB3_zp(); - void SMB4_zp(); - void SMB5_zp(); - void SMB6_zp(); - void SMB7_zp(); + void PHP(); + void PLP(); void JSR_abs(); - void RTI_imp(); - void RTS_imp(); + void RTI(); + void RTS(); void JMP_abs(); void JMP_ind(); void JMP_absxind(); - void BRK_imp(); - - void WAI_imp(); - void STP_imp(); - - void SED_imp(); - void CLD_imp(); - void CLV_imp(); - void SEI_imp(); - void CLI_imp(); - void CLC_imp(); - void SEC_imp(); - - void BMI_rel(); - void BPL_rel(); - void BVC_rel(); - void BVS_rel(); - void BCC_rel(); - void BCS_rel(); - void BNE_rel(); - void BEQ_rel(); - void BRA_rel(); - - void BBR0_zprel(); - void BBR1_zprel(); - void BBR2_zprel(); - void BBR3_zprel(); - void BBR4_zprel(); - void BBR5_zprel(); - void BBR6_zprel(); - void BBR7_zprel(); - - void BBS0_zprel(); - void BBS1_zprel(); - void BBS2_zprel(); - void BBS3_zprel(); - void BBS4_zprel(); - void BBS5_zprel(); - void BBS6_zprel(); - void BBS7_zprel(); + void BRK(); const uint16_t PageOne = 0x100; const uint16_t IRQvector = 0xfffe; @@ -648,13 +356,5 @@ namespace EightBit { uint8_t p; // processor status register16_t m_memptr; - - std::array instructions; - - ProcessorType level; - - std::array overlay6502; - std::array overlay65sc02; - std::array overlay65c02; }; } \ No newline at end of file diff --git a/M6502/src/Disassembly.cpp b/M6502/src/Disassembly.cpp index bfb0901..672fb17 100644 --- a/M6502/src/Disassembly.cpp +++ b/M6502/src/Disassembly.cpp @@ -10,25 +10,6 @@ using namespace std::placeholders; EightBit::Disassembly::Disassembly(MOS6502& targetProcessor, const Symbols& targetSymbols) : processor(targetProcessor), symbols(targetSymbols) { - dumpers = { - { AddressingMode::Illegal, { std::bind(&Disassembly::Dump_Nothing, this, std::placeholders::_1), std::bind(&Disassembly::Dump_Nothing, this, std::placeholders::_1) } }, - { AddressingMode::Implied, { std::bind(&Disassembly::Dump_Nothing, this, std::placeholders::_1), std::bind(&Disassembly::Dump_Nothing, this, std::placeholders::_1) } }, - { AddressingMode::Accumulator, { std::bind(&Disassembly::Dump_Nothing, this, std::placeholders::_1), std::bind(&Disassembly::Dump_A, this, std::placeholders::_1) } }, - { AddressingMode::Immediate, { std::bind(&Disassembly::Dump_Byte, this, std::placeholders::_1), std::bind(&Disassembly::Dump_imm, this, std::placeholders::_1) } }, - { AddressingMode::Relative, { std::bind(&Disassembly::Dump_Byte, this, std::placeholders::_1), std::bind(&Disassembly::Dump_rel, this, std::placeholders::_1) } }, - { AddressingMode::XIndexed, { std::bind(&Disassembly::Dump_Byte, this, std::placeholders::_1), std::bind(&Disassembly::Dump_xind, this, std::placeholders::_1) } }, - { AddressingMode::IndexedY, { std::bind(&Disassembly::Dump_Byte, this, std::placeholders::_1), std::bind(&Disassembly::Dump_indy, this, std::placeholders::_1) } }, - { AddressingMode::ZeroPageIndirect, { std::bind(&Disassembly::Dump_Byte, this, std::placeholders::_1), std::bind(&Disassembly::Dump_zpind, this, std::placeholders::_1) } }, - { AddressingMode::ZeroPage, { std::bind(&Disassembly::Dump_Byte, this, std::placeholders::_1), std::bind(&Disassembly::Dump_zp, this, std::placeholders::_1) } }, - { AddressingMode::ZeroPageX, { std::bind(&Disassembly::Dump_Byte, this, std::placeholders::_1), std::bind(&Disassembly::Dump_zpx, this, std::placeholders::_1) } }, - { AddressingMode::ZeroPageY, { std::bind(&Disassembly::Dump_Byte, this, std::placeholders::_1), std::bind(&Disassembly::Dump_zpy, this, std::placeholders::_1) } }, - { AddressingMode::Absolute, { std::bind(&Disassembly::Dump_DByte, this, std::placeholders::_1), std::bind(&Disassembly::Dump_abs, this, std::placeholders::_1) } }, - { AddressingMode::AbsoluteX, { std::bind(&Disassembly::Dump_DByte, this, std::placeholders::_1), std::bind(&Disassembly::Dump_absx, this, std::placeholders::_1) } }, - { AddressingMode::AbsoluteY, { std::bind(&Disassembly::Dump_DByte, this, std::placeholders::_1), std::bind(&Disassembly::Dump_absy, this, std::placeholders::_1) } }, - { AddressingMode::AbsoluteXIndirect, { std::bind(&Disassembly::Dump_DByte, this, std::placeholders::_1), std::bind(&Disassembly::Dump_absxind, this, std::placeholders::_1) } }, - { AddressingMode::Indirect, { std::bind(&Disassembly::Dump_DByte, this, std::placeholders::_1), std::bind(&Disassembly::Dump_ind, this, std::placeholders::_1) } }, - { AddressingMode::ZeroPageRelative, { std::bind(&Disassembly::Dump_DByte, this, std::placeholders::_1), std::bind(&Disassembly::Dump_zprel, this, std::placeholders::_1) } }, - }; } std::string EightBit::Disassembly::Dump_Flags(uint8_t value) const { @@ -56,52 +37,296 @@ std::string EightBit::Disassembly::Dump_WordValue(uint16_t value) const { return output.str(); } -std::string EightBit::Disassembly::DumpBytes(AddressingMode mode, uint16_t current) const { - return getDumper(mode).byteDumper(current); -} - std::string EightBit::Disassembly::Disassemble(uint16_t current) const { + m_address = current; + std::ostringstream output; - auto content = processor.GetByte(current); - const auto& instruction = processor.getInstruction(content); + auto memory = processor.getMemory(); - auto mode = instruction.mode; - auto mnemomic = instruction.display; + auto cell = memory.peek(current); - auto operand = DumpOperand(mode, current + 1); + output << Dump_ByteValue(cell); - auto label = symbols.getLabels().find(current); - if (label != symbols.getLabels().end()) - output << label->second << ": "; - output << mnemomic << " " << operand; + auto byte = memory.peek(current + 1); + uint16_t relative = processor.PC().word + 2 + (int8_t)byte; + + auto aaa = (cell & 0b11100000) >> 5; + auto bbb = (cell & 0b00011100) >> 2; + auto cc = (cell & 0b00000011); + + switch (cc) { + case 0b00: + switch (aaa) { + case 0b000: + switch (bbb) { + case 0b000: // BRK + output << disassemble_Implied("BRK"); + break; + case 0b010: // PHP + output << disassemble_Implied("PHP"); + break; + case 0b100: // BPL + output << disassemble_Relative("BPL", relative); + break; + case 0b110: // CLC + output << disassemble_Implied("CLC"); + break; + default: + throw std::domain_error("Illegal instruction"); + } + break; + case 0b001: + switch (bbb) { + case 0b000: // JSR + output << disassemble_Absolute("JSR"); + break; + case 0b010: // PLP + output << disassemble_Implied("PLP"); + break; + case 0b100: // BMI + output << disassemble_Relative("BMI", relative); + break; + case 0b110: // SEC + output << disassemble_Implied("SEC"); + break; + default: // BIT + output << disassemble_AM_00(bbb, "BIT"); + break; + } + break; + case 0b010: + switch (bbb) { + case 0b000: // RTI + output << disassemble_Implied("RTI"); + break; + case 0b010: // PHA + output << disassemble_Implied("PHA"); + break; + case 0b011: // JMP + output << disassemble_Absolute("JMP"); + break; + case 0b100: // BVC + output << disassemble_Relative("BVC", relative); + break; + case 0b110: // CLI + output << disassemble_Implied("CLI"); + break; + default: + throw std::domain_error("Illegal addressing mode"); + } + break; + case 0b011: + switch (bbb) { + case 0b000: // RTS + output << disassemble_Implied("RTS"); + break; + case 0b010: // PLA + output << disassemble_Implied("PLA"); + break; + case 0b011: // JMP (abs) + output << disassemble_Indirect("JMP"); + break; + case 0b100: // BVS + output << disassemble_Relative("BVS", relative); + break; + case 0b110: // SEI + output << disassemble_Implied("SEI"); + break; + default: + throw std::domain_error("Illegal addressing mode"); + } + break; + case 0b100: + switch (bbb) { + case 0b010: // DEY + output << disassemble_Implied("DEY"); + break; + case 0b100: // BCC + output << disassemble_Relative("BCC", relative); + break; + case 0b110: // TYA + output << disassemble_Implied("TYA"); + break; + default: // STY + output << disassemble_AM_00(bbb, "STY"); + break; + } + break; + case 0b101: + switch (bbb) { + case 0b010: // TAY + output << disassemble_Implied("TAY"); + break; + case 0b100: // BCS + output << disassemble_Relative("BCS", relative); + break; + case 0b110: // CLV + output << disassemble_Implied("CLV"); + break; + default: // LDY + output << disassemble_AM_00(bbb, "LDY"); + break; + } + break; + case 0b110: + switch (bbb) { + case 0b010: // INY + output << disassemble_Implied("INY"); + break; + case 0b100: // BNE + output << disassemble_Relative("BNE", relative); + break; + case 0b110: // CLD + output << disassemble_Implied("CLD"); + break; + default: // CPY + output << disassemble_AM_00(bbb, "CPY"); + break; + } + break; + case 0b111: + switch (bbb) { + case 0b010: // INX + output << disassemble_Implied("INX"); + break; + case 0b100: // BEQ + output << disassemble_Relative("BEQ", relative); + break; + case 0b110: // SED + output << disassemble_Implied("SED"); + break; + default: // CPX + output << disassemble_AM_00(bbb, "CPX"); + break; + } + break; + } + break; + case 0b01: + switch (aaa) { + case 0b000: // ORA + output << disassemble_AM_01(bbb, "ORA"); + break; + case 0b001: // AND + output << disassemble_AM_01(bbb, "AND"); + break; + case 0b010: // EOR + output << disassemble_AM_01(bbb, "EOR"); + break; + case 0b011: // ADC + output << disassemble_AM_01(bbb, "ADC"); + break; + case 0b100: // STA + output << disassemble_AM_01(bbb, "STA"); + break; + case 0b101: // LDA + output << disassemble_AM_01(bbb, "LDA"); + break; + case 0b110: // CMP + output << disassemble_AM_01(bbb, "CMP"); + break; + case 0b111: // SBC + output << disassemble_AM_01(bbb, "SBC"); + break; + default: + __assume(0); + } + break; + case 0b10: + switch (aaa) { + case 0b000: // ASL + output << disassemble_AM_10(bbb, "ASL"); + break; + case 0b001: // ROL + output << disassemble_AM_10(bbb, "ROL"); + break; + case 0b010: // LSR + output << disassemble_AM_10(bbb, "LSR"); + break; + case 0b011: // ROR + output << disassemble_AM_10(bbb, "ROR"); + break; + case 0b100: + switch (bbb) { + case 0b010: // TXA + output << disassemble_Implied("TXA"); + break; + case 0b110: // TXS + output << disassemble_Implied("TXS"); + break; + default: // STX + output << disassemble_AM_10_x(bbb, "STX"); + break; + } + break; + case 0b101: + switch (bbb) { + case 0b010: // TAX + output << disassemble_Implied("TAX"); + break; + case 0b110: // TSX + output << disassemble_Implied("TSX"); + break; + default: // LDX + output << disassemble_AM_10_x(bbb, "LDX"); + break; + } + break; + case 0b110: + switch (bbb) { + case 0b010: // DEX + output << disassemble_Implied("DEX"); + break; + default: // DEC + output << disassemble_AM_10(bbb, "DEC"); + break; + } + break; + case 0b111: + switch (bbb) { + case 0b010: // NOP + output << disassemble_Implied("NOP"); + break; + default: // INC + output << disassemble_AM_10(bbb, "INC"); + break; + } + break; + default: + __assume(0); + } + break; + case 0b11: + throw std::domain_error("Illegal instruction group"); + default: + __assume(0); + } + + //const auto& instruction = processor.getInstruction(content); + + //auto mode = instruction.mode; + //auto mnemomic = instruction.display; + + //auto operand = DumpOperand(mode, current + 1); + + //auto label = symbols.getLabels().find(current); + //if (label != symbols.getLabels().end()) + // output << label->second << ": "; + //output << mnemomic << " " << operand; return output.str(); } -std::string EightBit::Disassembly::DumpOperand(AddressingMode mode, uint16_t current) const { - return getDumper(mode).disassemblyDumper(current); -} - //// uint8_t EightBit::Disassembly::GetByte(uint16_t address) const { - return processor.GetByte(address); -} - -uint16_t EightBit::Disassembly::GetWord(uint16_t address) const { - register16_t returned; - processor.GetWord(address, returned); - return returned.word; + return processor.getMemory().peek(address); } //// -std::string EightBit::Disassembly::Dump_Nothing(uint16_t) const { - return ""; -} - std::string EightBit::Disassembly::Dump_Byte(uint16_t address) const { return Dump_ByteValue(GetByte(address)); } @@ -143,104 +368,4 @@ std::string EightBit::Disassembly::ConvertConstant(uint8_t constant) const { return label->second; return Dump_ByteValue(constant); } - -//// - -std::string EightBit::Disassembly::Dump_A(uint16_t) const { - return "A"; -} - -std::string EightBit::Disassembly::Dump_imm(uint16_t current) const { - std::ostringstream output; - auto immediate = GetByte(current); - output << "#" << ConvertConstant(immediate); - return output.str(); -} - -std::string EightBit::Disassembly::Dump_abs(uint16_t current) const { - auto address = GetWord(current); - return ConvertAddress(address); -} - -std::string EightBit::Disassembly::Dump_zp(uint16_t current) const { - auto zp = GetByte(current); - return ConvertAddress(zp); -} - -std::string EightBit::Disassembly::Dump_zpx(uint16_t current) const { - std::ostringstream output; - auto zp = GetByte(current); - output << ConvertAddress(zp) << ",X"; - return output.str(); -} - -std::string EightBit::Disassembly::Dump_zpy(uint16_t current) const { - std::ostringstream output; - auto zp = GetByte(current); - output << ConvertAddress(zp) << ",Y"; - return output.str(); -} - -std::string EightBit::Disassembly::Dump_absx(uint16_t current) const { - std::ostringstream output; - auto address = GetWord(current); - output << ConvertAddress(address) << ",X"; - return output.str(); -} - -std::string EightBit::Disassembly::Dump_absy(uint16_t current) const { - std::ostringstream output; - auto address = GetWord(current); - output << ConvertAddress(address) << ",Y"; - return output.str(); -} - -std::string EightBit::Disassembly::Dump_absxind(uint16_t current) const { - std::ostringstream output; - auto address = GetWord(current); - output << "(" << ConvertAddress(address) << ",X)"; - return output.str(); -} - -std::string EightBit::Disassembly::Dump_xind(uint16_t current) const { - std::ostringstream output; - auto zp = GetByte(current); - output << "(" << ConvertAddress(zp) << ",X)"; - return output.str(); -} - -std::string EightBit::Disassembly::Dump_indy(uint16_t current) const { - std::ostringstream output; - auto zp = GetByte(current); - output << "(" << ConvertAddress(zp) << "),Y"; - return output.str(); -} - -std::string EightBit::Disassembly::Dump_ind(uint16_t current) const { - std::ostringstream output; - auto address = GetWord(current); - output << "(" << ConvertAddress(address) << ")"; - return output.str(); -} - -std::string EightBit::Disassembly::Dump_zpind(uint16_t current) const { - std::ostringstream output; - auto zp = GetByte(current); - output << "(" << ConvertAddress(zp) << ")"; - return output.str(); -} - -std::string EightBit::Disassembly::Dump_rel(uint16_t current) const { - uint16_t relative = 1 + current + (int8_t)GetByte(current); - return ConvertAddress(relative); -} - -std::string EightBit::Disassembly::Dump_zprel(uint16_t current) const { - std::ostringstream output; - auto zp = GetByte(current); - int8_t displacement = GetByte(current + 1); - uint16_t address = 1 + current + displacement; - output << ConvertAddress(zp) << "," << ConvertAddress(address); - return output.str(); -} \ No newline at end of file diff --git a/M6502/src/M6502.vcxproj b/M6502/src/M6502.vcxproj index 44cdb03..089b74f 100644 --- a/M6502/src/M6502.vcxproj +++ b/M6502/src/M6502.vcxproj @@ -136,12 +136,9 @@ - - - diff --git a/M6502/src/M6502.vcxproj.filters b/M6502/src/M6502.vcxproj.filters index a743055..ca67e17 100644 --- a/M6502/src/M6502.vcxproj.filters +++ b/M6502/src/M6502.vcxproj.filters @@ -14,12 +14,6 @@ Header Files - - Header Files - - - Header Files - Header Files @@ -29,9 +23,6 @@ Header Files - - Header Files - Header Files diff --git a/M6502/src/mos6502.cpp b/M6502/src/mos6502.cpp index ac34fc3..fa74780 100644 --- a/M6502/src/mos6502.cpp +++ b/M6502/src/mos6502.cpp @@ -1,12 +1,8 @@ #include "stdafx.h" #include "mos6502.h" -EightBit::MOS6502::MOS6502(Memory& memory, ProcessorType cpuLevel) -: Processor(memory), - level(cpuLevel) { - Install6502Instructions(); - Install65sc02Instructions(); - Install65c02Instructions(); +EightBit::MOS6502::MOS6502(Memory& memory) +: Processor(memory) { } void EightBit::MOS6502::initialise() { @@ -65,7 +61,7 @@ void EightBit::MOS6502::Interrupt(uint16_t vector) { int EightBit::MOS6502::Execute(uint8_t cell) { - cycles = 0; + cycles = 1; // http://www.llx.com/~nparker/a2/opcodes.html @@ -84,16 +80,16 @@ int EightBit::MOS6502::Execute(uint8_t cell) { case 0b000: switch (bbb) { case 0b000: // BRK - BRK_imp(); + BRK(); break; case 0b010: // PHP - PHP_imp(); + PHP(); break; case 0b100: // BPL - BPL_rel(); + Branch(!(P() & NF)); break; case 0b110: // CLC - CLC_imp(); + clearFlag(P(), CF); break; default: throw std::domain_error("Illegal instruction"); @@ -105,13 +101,13 @@ int EightBit::MOS6502::Execute(uint8_t cell) { JSR_abs(); break; case 0b010: // PLP - PLP_imp(); + PLP(); break; case 0b100: // BMI - BMI_rel(); + Branch((P() & NF) != 0); break; case 0b110: // SEC - SEC_imp(); + setFlag(P(), CF); break; default: // BIT BIT(AM_00(bbb)); @@ -121,19 +117,19 @@ int EightBit::MOS6502::Execute(uint8_t cell) { case 0b010: switch (bbb) { case 0b000: // RTI - RTI_imp(); + RTI(); break; case 0b010: // PHA - PHA_imp(); + PushByte(A()); break; case 0b011: // JMP JMP_abs(); break; case 0b100: // BVC - BVC_rel(); + Branch(!(P() & VF)); break; - case 0b110: // BVC - CLI_imp(); + case 0b110: // CLI + clearFlag(P(), IF); break; default: throw std::domain_error("Illegal addressing mode"); @@ -142,19 +138,19 @@ int EightBit::MOS6502::Execute(uint8_t cell) { case 0b011: switch (bbb) { case 0b000: // RTS - RTS_imp(); + RTS(); break; case 0b010: // PLA - PLA_imp(); + UpdateZeroNegativeFlags(A() = PopByte()); break; case 0b011: // JMP (abs) JMP_ind(); break; case 0b100: // BVS - BVS_rel(); + Branch((P() & VF) != 0); break; case 0b110: // SEI - SEI_imp(); + setFlag(P(), IF); break; default: throw std::domain_error("Illegal addressing mode"); @@ -163,13 +159,13 @@ int EightBit::MOS6502::Execute(uint8_t cell) { case 0b100: switch (bbb) { case 0b010: // DEY - DEY_imp(); + DEC(Y()); break; case 0b100: // BCC - BCC_rel(); + Branch(!(P() & CF)); break; case 0b110: // TYA - TYA_imp(); + UpdateZeroNegativeFlags(A() = Y()); break; default: // STY AM_00(bbb) = Y(); @@ -179,13 +175,13 @@ int EightBit::MOS6502::Execute(uint8_t cell) { case 0b101: switch (bbb) { case 0b010: // TAY - TAY_imp(); + UpdateZeroNegativeFlags(Y() = A()); break; case 0b100: // BCS - BCS_rel(); + Branch((P() & CF) != 0); break; case 0b110: // CLV - CLV_imp(); + clearFlag(P(), VF); break; default: // LDY LDY(AM_00(bbb)); @@ -195,32 +191,32 @@ int EightBit::MOS6502::Execute(uint8_t cell) { case 0b110: switch (bbb) { case 0b010: // INY - INY_imp(); + INC(Y()); break; case 0b100: // BNE - BNE_rel(); + Branch(!(P() & ZF)); break; case 0b110: // CLD - CLD_imp(); + clearFlag(P(), DF); break; default: // CPY - CPY(AM_00(bbb)); + CMP(Y(), AM_00(bbb)); break; } break; case 0b111: switch (bbb) { case 0b010: // INX - INX_imp(); + INC(X()); break; case 0b100: // BEQ - BEQ_rel(); + Branch((P() & ZF) != 0); break; case 0b110: // SED - SED_imp(); + setFlag(P(), DF); break; default: // CPX - CPX(AM_00(bbb)); + CMP(X(), AM_00(bbb)); break; } break; @@ -247,7 +243,7 @@ int EightBit::MOS6502::Execute(uint8_t cell) { LDA(AM_01(bbb)); break; case 0b110: // CMP - CMP(AM_01(bbb)); + CMP(A(), AM_01(bbb)); break; case 0b111: // SBC SBC(AM_01(bbb)); @@ -273,10 +269,10 @@ int EightBit::MOS6502::Execute(uint8_t cell) { case 0b100: switch (bbb) { case 0b010: // TXA - TXA_imp(); + UpdateZeroNegativeFlags(A() = X()); break; case 0b110: // TXS - TXS_imp(); + S() = X(); break; default: // STX AM_10_x(bbb) = X(); @@ -286,7 +282,7 @@ int EightBit::MOS6502::Execute(uint8_t cell) { case 0b101: switch (bbb) { case 0b110: // TSX - TSX_imp(); + UpdateZeroNegativeFlags(X() = S()); break; default: // LDX LDX(AM_10_x(bbb)); @@ -296,7 +292,7 @@ int EightBit::MOS6502::Execute(uint8_t cell) { case 0b110: switch (bbb) { case 0b010: // DEX - DEX_imp(); + DEC(X()); break; default: // DEC DEC(AM_10(bbb)); @@ -306,7 +302,6 @@ int EightBit::MOS6502::Execute(uint8_t cell) { case 0b111: switch (bbb) { case 0b010: // NOP - NOP_imp(); break; default: // INC INC(AM_10(bbb)); @@ -326,129 +321,6 @@ int EightBit::MOS6502::Execute(uint8_t cell) { return cycles; } -void EightBit::MOS6502::___() { - if (level >= ProcessorType::Cpu65SC02) { - // Generally, missing instructions act as a one byte, - // one cycle NOP instruction on 65c02 (ish) processors. - NOP_imp(); - cycles++; - } else { - throw std::domain_error("Whoops: Invalid instruction."); - } -} - -EightBit::MOS6502::Instruction EightBit::MOS6502::INS(instruction_t method, int cycles, AddressingMode addressing, std::string display) { - MOS6502::Instruction returnValue; - returnValue.vector = method; - returnValue.count = cycles; - returnValue.mode = addressing; - returnValue.display = display; - return returnValue; -} - -//// - -#define BIND(method) std::bind(&MOS6502:: method, this) - -void EightBit::MOS6502::Install6502Instructions() { - overlay6502 = { - //// 0 1 2 3 4 5 6 7 8 9 A B C D E F - /* 0 */ INS(BIND(BRK_imp), 7, AddressingMode::Implied, "BRK"), INS(BIND(ORA_xind), 6, AddressingMode::XIndexed, "ORA"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(ORA_zp), 4, AddressingMode::ZeroPage, "ORA"), INS(BIND(ASL_zp), 5, AddressingMode::ZeroPage, "ASL"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(PHP_imp), 3, AddressingMode::Implied, "PHP"), INS(BIND(ORA_imm), 2, AddressingMode::Immediate, "ORA"), INS(BIND(ASL_a), 2, AddressingMode::Accumulator, "ASL"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(ORA_abs), 4, AddressingMode::Absolute, "ORA"), INS(BIND(ASL_abs), 6, AddressingMode::Absolute, "ASL"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), - /* 1 */ INS(BIND(BPL_rel), 2, AddressingMode::Relative, "BPL"), INS(BIND(ORA_indy), 5, AddressingMode::IndexedY, "ORA"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(ORA_zpx), 4, AddressingMode::ZeroPageX, "ORA"), INS(BIND(ASL_zpx), 6, AddressingMode::ZeroPageX, "ASL"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(CLC_imp), 2, AddressingMode::Implied, "CLC"), INS(BIND(ORA_absy), 4, AddressingMode::AbsoluteY, "ORA"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(ORA_absx), 4, AddressingMode::AbsoluteX, "ORA"), INS(BIND(ASL_absx), 7, AddressingMode::AbsoluteX, "ASL"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), - /* 2 */ INS(BIND(JSR_abs), 6, AddressingMode::Absolute, "JSR"), INS(BIND(AND_xind), 6, AddressingMode::XIndexed, "AND"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(BIT_zp), 3, AddressingMode::ZeroPage, "BIT"), INS(BIND(AND_zp), 3, AddressingMode::ZeroPage, "AND"), INS(BIND(ROL_zp), 5, AddressingMode::ZeroPage, "ROL"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(PLP_imp), 4, AddressingMode::Implied, "PLP"), INS(BIND(AND_imm),2, AddressingMode::Immediate, "AND"), INS(BIND(ROL_a), 2, AddressingMode::Accumulator, "ROL"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(BIT_abs), 4, AddressingMode::Absolute, "BIT"), INS(BIND(AND_abs), 4, AddressingMode::Absolute, "AND"), INS(BIND(ROL_abs), 6, AddressingMode::Absolute, "ROL"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), - /* 3 */ INS(BIND(BMI_rel), 2, AddressingMode::Relative, "BMI"), INS(BIND(AND_indy), 5, AddressingMode::IndexedY, "AND"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(AND_zpx), 4, AddressingMode::ZeroPageX, "AND"), INS(BIND(ROL_zpx), 6, AddressingMode::ZeroPageX, "ROL"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(SEC_imp), 2, AddressingMode::Implied, "SEC"), INS(BIND(AND_absy), 4, AddressingMode::AbsoluteY, "AND"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(AND_absx), 4, AddressingMode::AbsoluteX, "AND"), INS(BIND(ROL_absx), 7, AddressingMode::AbsoluteX, "ROL"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), - /* 4 */ INS(BIND(RTI_imp), 6, AddressingMode::Implied, "RTI"), INS(BIND(EOR_xind), 6, AddressingMode::XIndexed, "EOR"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(EOR_zp), 3, AddressingMode::ZeroPage, "EOR"), INS(BIND(LSR_zp), 5, AddressingMode::ZeroPage, "LSR"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(PHA_imp), 3, AddressingMode::Implied, "PHA"), INS(BIND(EOR_imm),2, AddressingMode::Immediate, "EOR"), INS(BIND(LSR_a), 2, AddressingMode::Accumulator, "LSR"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(JMP_abs), 3, AddressingMode::Absolute, "JMP"), INS(BIND(EOR_abs), 4, AddressingMode::Absolute, "EOR"), INS(BIND(LSR_abs), 6, AddressingMode::Absolute, "LSR"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), - /* 5 */ INS(BIND(BVC_rel), 2, AddressingMode::Relative, "BVC"), INS(BIND(EOR_indy), 5, AddressingMode::IndexedY, "EOR"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(EOR_zpx), 4, AddressingMode::ZeroPageX, "EOR"), INS(BIND(LSR_zpx), 6, AddressingMode::ZeroPageX, "LSR"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(CLI_imp), 2, AddressingMode::Implied, "CLI"), INS(BIND(EOR_absy), 4, AddressingMode::AbsoluteY, "EOR"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(EOR_absx), 4, AddressingMode::AbsoluteX, "EOR"), INS(BIND(LSR_absx), 7, AddressingMode::AbsoluteX, "LSR"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), - /* 6 */ INS(BIND(RTS_imp), 6, AddressingMode::Implied, "RTS"), INS(BIND(ADC_xind), 6, AddressingMode::XIndexed, "ADC"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(ADC_zp), 3, AddressingMode::ZeroPage, "ADC"), INS(BIND(ROR_zp), 5, AddressingMode::ZeroPage, "ROR"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(PLA_imp), 4, AddressingMode::Implied, "PLA"), INS(BIND(ADC_imm),2, AddressingMode::Immediate, "ADC"), INS(BIND(ROR_a), 2, AddressingMode::Accumulator, "ROR"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(JMP_ind), 5, AddressingMode::Indirect, "JMP"), INS(BIND(ADC_abs), 4, AddressingMode::Absolute, "ADC"), INS(BIND(ROR_abs), 6, AddressingMode::Absolute, "ROR"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), - /* 7 */ INS(BIND(BVS_rel), 2, AddressingMode::Relative, "BVS"), INS(BIND(ADC_indy), 5, AddressingMode::IndexedY, "ADC"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(ADC_zpx), 4, AddressingMode::ZeroPageX, "ADC"), INS(BIND(ROR_zpx), 6, AddressingMode::ZeroPageX, "ROR"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(SEI_imp), 2, AddressingMode::Implied, "SEI"), INS(BIND(ADC_absy), 4, AddressingMode::AbsoluteY, "ADC"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(ADC_absx), 4, AddressingMode::AbsoluteX, "ADC"), INS(BIND(ROR_absx), 7, AddressingMode::AbsoluteX, "ROR"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), - /* 8 */ INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(STA_xind), 6, AddressingMode::XIndexed, "STA"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(STY_zp), 3, AddressingMode::ZeroPage, "STY"), INS(BIND(STA_zp), 3, AddressingMode::ZeroPage, "STA"), INS(BIND(STX_zp), 3, AddressingMode::ZeroPage, "STX"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(DEY_imp), 2, AddressingMode::Implied, "DEY"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(TXA_imp), 2, AddressingMode::Implied, "TXA"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(STY_abs), 4, AddressingMode::Absolute, "STY"), INS(BIND(STA_abs), 4, AddressingMode::Absolute, "STA"), INS(BIND(STX_abs), 4, AddressingMode::Absolute, "STX"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), - /* 9 */ INS(BIND(BCC_rel), 2, AddressingMode::Relative, "BCC"), INS(BIND(STA_indy), 6, AddressingMode::IndexedY, "STA"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(STY_zpx), 4, AddressingMode::ZeroPageX, "STY"), INS(BIND(STA_zpx), 4, AddressingMode::ZeroPageX, "STA"), INS(BIND(STX_zpy), 4, AddressingMode::ZeroPageY, "STX"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(TYA_imp), 2, AddressingMode::Implied, "TYA"), INS(BIND(STA_absy), 5, AddressingMode::AbsoluteY, "STA"), INS(BIND(TXS_imp), 2, AddressingMode::Implied, "TXS"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(STA_absx), 5, AddressingMode::AbsoluteX, "STA"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), - /* A */ INS(BIND(LDY_imm), 2, AddressingMode::Immediate, "LDY"), INS(BIND(LDA_xind), 6, AddressingMode::XIndexed, "LDA"), INS(BIND(LDX_imm), 2, AddressingMode::Immediate, "LDX"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(LDY_zp), 3, AddressingMode::ZeroPage, "LDY"), INS(BIND(LDA_zp), 3, AddressingMode::ZeroPage, "LDA"), INS(BIND(LDX_zp), 3, AddressingMode::ZeroPage, "LDX"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(TAY_imp), 2, AddressingMode::Implied, "TAY"), INS(BIND(LDA_imm),2, AddressingMode::Immediate, "LDA"), INS(BIND(TAX_imp), 2, AddressingMode::Implied, "TAX"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(LDY_abs), 4, AddressingMode::Absolute, "LDY"), INS(BIND(LDA_abs), 4, AddressingMode::Absolute, "LDA"), INS(BIND(LDX_abs), 4, AddressingMode::Absolute, "LDX"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), - /* B */ INS(BIND(BCS_rel), 2, AddressingMode::Relative, "BCS"), INS(BIND(LDA_indy), 5, AddressingMode::IndexedY, "LDA"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(LDY_zpx), 4, AddressingMode::ZeroPageX, "LDY"), INS(BIND(LDA_zpx), 4, AddressingMode::ZeroPageX, "LDA"), INS(BIND(LDX_zpy), 4, AddressingMode::ZeroPageY, "LDX"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(CLV_imp), 2, AddressingMode::Implied, "CLV"), INS(BIND(LDA_absy), 4, AddressingMode::AbsoluteY, "LDA"), INS(BIND(TSX_imp), 2, AddressingMode::Implied, "TSX"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(LDY_absx), 4, AddressingMode::AbsoluteX, "LDY"), INS(BIND(LDA_absx), 4, AddressingMode::AbsoluteX, "LDA"), INS(BIND(LDX_absy), 4, AddressingMode::AbsoluteY, "LDX"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), - /* C */ INS(BIND(CPY_imm), 2, AddressingMode::Immediate, "CPY"), INS(BIND(CMP_xind), 6, AddressingMode::XIndexed, "CMP"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(CPY_zp), 3, AddressingMode::ZeroPage, "CPY"), INS(BIND(CMP_zp), 3, AddressingMode::ZeroPage, "CMP"), INS(BIND(DEC_zp), 5, AddressingMode::ZeroPage, "DEC"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(INY_imp), 2, AddressingMode::Implied, "INY"), INS(BIND(CMP_imm),2, AddressingMode::Immediate, "CMP"), INS(BIND(DEX_imp), 2, AddressingMode::Implied, "DEX"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(CPY_abs), 4, AddressingMode::Absolute, "CPY"), INS(BIND(CMP_abs), 4, AddressingMode::Absolute, "CMP"), INS(BIND(DEC_abs), 6, AddressingMode::Absolute, "DEC"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), - /* D */ INS(BIND(BNE_rel), 2, AddressingMode::Relative, "BNE"), INS(BIND(CMP_indy), 5, AddressingMode::IndexedY, "CMP"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(CMP_zpx), 4, AddressingMode::ZeroPageX, "CMP"), INS(BIND(DEC_zpx), 6, AddressingMode::ZeroPageX, "DEC"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(CLD_imp), 2, AddressingMode::Implied, "CLD"), INS(BIND(CMP_absy), 4, AddressingMode::AbsoluteY, "CMP"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(CMP_absx), 4, AddressingMode::AbsoluteX, "CMP"), INS(BIND(DEC_absx), 7, AddressingMode::AbsoluteX, "DEC"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), - /* E */ INS(BIND(CPX_imm), 2, AddressingMode::Immediate, "CPX"), INS(BIND(SBC_xind), 6, AddressingMode::XIndexed, "SBC"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(CPX_zp), 3, AddressingMode::ZeroPage, "CPX"), INS(BIND(SBC_zp), 3, AddressingMode::ZeroPage, "SBC"), INS(BIND(INC_zp), 5, AddressingMode::ZeroPage, "INC"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(INX_imp), 2, AddressingMode::Implied, "INX"), INS(BIND(SBC_imm),2, AddressingMode::Immediate, "SBC"), INS(BIND(NOP_imp), 2, AddressingMode::Implied, "NOP"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(CPX_abs), 4, AddressingMode::Absolute, "CPX"), INS(BIND(SBC_abs), 4, AddressingMode::Absolute, "SBC"), INS(BIND(INC_abs), 6, AddressingMode::Absolute, "INC"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), - /* F */ INS(BIND(BEQ_rel), 2, AddressingMode::Relative, "BEQ"), INS(BIND(SBC_indy), 5, AddressingMode::IndexedY, "SBC"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(SBC_zpx), 4, AddressingMode::ZeroPageX, "SBC"), INS(BIND(INC_zpx), 6, AddressingMode::ZeroPageX, "INC"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(SED_imp), 2, AddressingMode::Implied, "SED"), INS(BIND(SBC_absy), 4, AddressingMode::AbsoluteY, "SBC"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(SBC_absx), 4, AddressingMode::AbsoluteX, "SBC"), INS(BIND(INC_absx), 7, AddressingMode::AbsoluteX, "INC"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), - }; - - InstallInstructionSet(overlay6502); -} - -void EightBit::MOS6502::Install65sc02Instructions() { - if (level >= ProcessorType::Cpu65SC02) { - overlay65sc02 = { - //// 0 1 2 3 4 5 6 7 8 9 A B C D E F - /* 0 */ INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(NOP2_imp), 2, AddressingMode::Implied, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(TSB_zp), 5, AddressingMode::ZeroPage, "TSB"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(TSB_abs), 6, AddressingMode::Absolute, "TSB"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), - /* 1 */ INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(ORA_zpind), 5, AddressingMode::ZeroPageIndirect, "ORA"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(TRB_zp), 5, AddressingMode::ZeroPage, "TRB"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(INC_a), 2, AddressingMode::Accumulator, "INC"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(TRB_abs), 6, AddressingMode::Absolute, "TRB"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), - /* 2 */ INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(NOP2_imp), 2, AddressingMode::Implied, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), - /* 3 */ INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(AND_zpind), 5, AddressingMode::ZeroPageIndirect, "AND"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(BIT_zpx), 4, AddressingMode::ZeroPageX, "BIT"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(DEC_a), 2, AddressingMode::Accumulator, "DEC"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(BIT_absx), 4, AddressingMode::AbsoluteX, "BIT"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), - /* 4 */ INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(NOP2_imp), 2, AddressingMode::Implied, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(NOP2_imp), 3, AddressingMode::Implied, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), - /* 5 */ INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(EOR_zpind), 5, AddressingMode::ZeroPageIndirect, "EOR"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(NOP2_imp), 4, AddressingMode::Implied, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(PHY_imp), 2, AddressingMode::Implied, "PHY"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(NOP3_imp), 8, AddressingMode::Implied, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), - /* 6 */ INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(NOP2_imp), 2, AddressingMode::Implied, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(STZ_zp), 3, AddressingMode::ZeroPage, "STZ"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), - /* 7 */ INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(ADC_zpind), 5, AddressingMode::ZeroPageIndirect, "ADC"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(STZ_zpx), 4, AddressingMode::ZeroPageX, "STZ"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(PLY_imp), 2, AddressingMode::Implied, "PLY"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(JMP_absxind), 6, AddressingMode::AbsoluteXIndirect, "JMP"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), - /* 8 */ INS(BIND(BRA_rel), 2, AddressingMode::Relative, "BRA"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(NOP2_imp), 2, AddressingMode::Implied, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(BIT_imm),2, AddressingMode::Immediate, "BIT"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), - /* 9 */ INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(STA_zpind), 5, AddressingMode::ZeroPageIndirect, "STA"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(STZ_abs), 4, AddressingMode::Absolute, "STZ"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(STZ_absx), 2, AddressingMode::AbsoluteX, "STZ"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), - /* A */ INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), - /* B */ INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(LDA_zpind), 5, AddressingMode::ZeroPageIndirect, "LDA"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), - /* C */ INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(NOP2_imp), 2, AddressingMode::Implied, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), - /* D */ INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(CMP_zpind), 5, AddressingMode::ZeroPageIndirect, "CMP"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(NOP2_imp), 4, AddressingMode::Implied, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(PHX_imp), 2, AddressingMode::Implied, "PHX"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(NOP3_imp), 4, AddressingMode::Implied, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), - /* E */ INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(NOP2_imp), 2, AddressingMode::Implied, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), - /* F */ INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(SBC_zpind), 5, AddressingMode::ZeroPageIndirect, "SBC"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(NOP2_imp), 4, AddressingMode::Implied, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(PLX_imp), 2, AddressingMode::Implied, "PLX"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(NOP3_imp), 4, AddressingMode::Implied, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), - }; - - OverlayInstructionSet(overlay65sc02); - } -} - -void EightBit::MOS6502::Install65c02Instructions() { - if (level >= ProcessorType::Cpu65C02) { - overlay65c02 = { - //// 0 1 2 3 4 5 6 7 8 9 A B C D E F - /* 0 */ INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(RMB0_zp), 5, AddressingMode::ZeroPage, "RMB0"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(BBR0_zprel), 5, AddressingMode::ZeroPageRelative, "BBR0"), - /* 1 */ INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(RMB1_zp), 5, AddressingMode::ZeroPage, "RMB1"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(BBR1_zprel), 5, AddressingMode::ZeroPageRelative, "BBR1"), - /* 2 */ INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(RMB2_zp), 5, AddressingMode::ZeroPage, "RMB2"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(BBR2_zprel), 5, AddressingMode::ZeroPageRelative, "BBR2"), - /* 3 */ INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(RMB3_zp), 5, AddressingMode::ZeroPage, "RMB3"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(BBR3_zprel), 5, AddressingMode::ZeroPageRelative, "BBR3"), - /* 4 */ INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(RMB4_zp), 5, AddressingMode::ZeroPage, "RMB4"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(BBR4_zprel), 5, AddressingMode::ZeroPageRelative, "BBR4"), - /* 5 */ INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(RMB5_zp), 5, AddressingMode::ZeroPage, "RMB5"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(BBR5_zprel), 5, AddressingMode::ZeroPageRelative, "BBR5"), - /* 6 */ INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(RMB6_zp), 5, AddressingMode::ZeroPage, "RMB6"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(BBR6_zprel), 5, AddressingMode::ZeroPageRelative, "BBR6"), - /* 7 */ INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(RMB7_zp), 5, AddressingMode::ZeroPage, "RMB7"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(BBR7_zprel), 5, AddressingMode::ZeroPageRelative, "BBR7"), - /* 8 */ INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(SMB0_zp), 5, AddressingMode::ZeroPage, "SMB0"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(BBS0_zprel), 5, AddressingMode::ZeroPageRelative, "BBS0"), - /* 9 */ INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(SMB1_zp), 5, AddressingMode::ZeroPage, "SMB1"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(BBS1_zprel), 5, AddressingMode::ZeroPageRelative, "BBS1"), - /* A */ INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(SMB2_zp), 5, AddressingMode::ZeroPage, "SMB2"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(BBS2_zprel), 5, AddressingMode::ZeroPageRelative, "BBS2"), - /* B */ INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(SMB3_zp), 5, AddressingMode::ZeroPage, "SMB3"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(BBS3_zprel), 5, AddressingMode::ZeroPageRelative, "BBS3"), - /* C */ INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(SMB4_zp), 5, AddressingMode::ZeroPage, "SMB4"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(WAI_imp), 3, AddressingMode::Implied, "WAI"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(BBS4_zprel), 5, AddressingMode::ZeroPageRelative, "BBS4"), - /* D */ INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(SMB5_zp), 5, AddressingMode::ZeroPage, "SMB5"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(STP_imp), 3, AddressingMode::Implied, "STP"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(BBS5_zprel), 5, AddressingMode::ZeroPageRelative, "BBS5"), - /* E */ INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(SMB6_zp), 5, AddressingMode::ZeroPage, "SMB6"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(BBS6_zprel), 5, AddressingMode::ZeroPageRelative, "BBS6"), - /* F */ INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(SMB7_zp), 5, AddressingMode::ZeroPage, "SMB7"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 0, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(___), 2, AddressingMode::Illegal, "___"), INS(BIND(BBS7_zprel), 5, AddressingMode::ZeroPageRelative, "BBS7"), - }; - - OverlayInstructionSet(overlay65c02); - } -} - -void EightBit::MOS6502::InstallInstructionSet(const std::array& basis) { - OverlayInstructionSet(basis, true); -} - -void EightBit::MOS6502::OverlayInstructionSet(const std::array& overlay) { - OverlayInstructionSet(overlay, false); -} - -void EightBit::MOS6502::OverlayInstructionSet(const std::array& overlay, bool includeIllegal) { - for (uint16_t i = 0; i < 0x100; ++i) { - auto newInstruction = overlay[i]; - auto illegal = newInstruction.mode == AddressingMode::Illegal; - if (includeIllegal || !illegal) { - auto oldInstruction = instructions[i]; - if (oldInstruction.mode != AddressingMode::Illegal) { - throw std::domain_error("Whoops: replacing a non-missing instruction."); - } - - instructions[i] = newInstruction; - } - } -} - //// void EightBit::MOS6502::PushByte(uint8_t value) { @@ -504,16 +376,6 @@ void EightBit::MOS6502::BIT(uint8_t data) { setFlag(P(), VF, data & VF); } -void EightBit::MOS6502::TSB(uint8_t& output) { - UpdateZeroFlag(A() & output); - output |= A(); -} - -void EightBit::MOS6502::TRB(uint8_t& output) { - UpdateZeroFlag(A() & output); - output &= ~A(); -} - void EightBit::MOS6502::INC(uint8_t& output) { UpdateZeroNegativeFlags(++output); } @@ -561,8 +423,7 @@ void EightBit::MOS6502::SBC_d(uint8_t data) { register16_t difference; difference.word = A() - data - carry; - if (level < ProcessorType::Cpu65SC02) - UpdateZeroNegativeFlags(difference.low); + UpdateZeroNegativeFlags(difference.low); setFlag(P(), VF, (A() ^ data) & (A() ^ difference.low) & 0x80); clearFlag(P(), CF, difference.high); @@ -579,25 +440,10 @@ void EightBit::MOS6502::SBC_d(uint8_t data) { high -= 6; A() = promoteNibble(high) | lowNibble(low); - if (level >= ProcessorType::Cpu65SC02) - UpdateZeroNegativeFlags(A()); } void EightBit::MOS6502::EOR(uint8_t data) { - A() ^= data; - UpdateZeroNegativeFlags(A()); -} - -void EightBit::MOS6502::CPX(uint8_t data) { - CMP(X(), data); -} - -void EightBit::MOS6502::CPY(uint8_t data) { - CMP(Y(), data); -} - -void EightBit::MOS6502::CMP(uint8_t data) { - CMP(A(), data); + UpdateZeroNegativeFlags(A() ^= data); } void EightBit::MOS6502::CMP(uint8_t first, uint8_t second) { @@ -644,8 +490,7 @@ void EightBit::MOS6502::ADC_d(uint8_t data) { register16_t sum; sum.word = A() + data + carry; - if (level < ProcessorType::Cpu65SC02) - UpdateZeroNegativeFlags(sum.low); + UpdateZeroNegativeFlags(sum.low); auto low = (uint8_t)(lowNibble(A()) + lowNibble(data) + carry); if (low > 9) @@ -660,34 +505,12 @@ void EightBit::MOS6502::ADC_d(uint8_t data) { setFlag(P(), CF, high > 0xf); A() = (uint8_t)(promoteNibble(high) | lowNibble(low)); - if (level >= ProcessorType::Cpu65SC02) - UpdateZeroNegativeFlags(A()); -} - -//// - -void EightBit::MOS6502::RMB(uint8_t& output, uint8_t flag) { - output &= ~flag; -} - -void EightBit::MOS6502::SMB(uint8_t& output, uint8_t flag) { - output |= flag; } //// void EightBit::MOS6502::Branch(int8_t displacement) { - ++cycles; - auto oldPage = PC().high; PC().word += displacement; - auto newPage = PC().high; - if (oldPage != newPage) - cycles += 2; -} - -void EightBit::MOS6502::Branch() { - int8_t displacement = AM_Immediate(); - Branch(displacement); } void EightBit::MOS6502::Branch(bool flag) { @@ -696,779 +519,18 @@ void EightBit::MOS6502::Branch(bool flag) { Branch(displacement); } -void EightBit::MOS6502::BitBranch_Clear(uint8_t check) { - auto zp = FetchByte(); - auto contents = GetByte(zp); - auto displacement = FetchByte(); - if ((contents & check) == 0) - PC().word += displacement; -} - -void EightBit::MOS6502::BitBranch_Set(uint8_t check) { - auto zp = FetchByte(); - auto contents = GetByte(zp); - auto displacement = FetchByte(); - if ((contents & check) != 0) - PC().word += displacement; -} - // -void EightBit::MOS6502::NOP_imp() { -} - -void EightBit::MOS6502::NOP2_imp() { - FetchByte(); -} - -void EightBit::MOS6502::NOP3_imp() { - register16_t discarded; - FetchWord(discarded); -} - -// - -void EightBit::MOS6502::ORA_xind() { - ORA(AM_IndexedIndirectX()); -} - -void EightBit::MOS6502::ORA_zp() { - ORA(AM_ZeroPage()); -} - -void EightBit::MOS6502::ORA_imm() { - ORA(AM_Immediate()); -} - -void EightBit::MOS6502::ORA_abs() { - ORA(AM_Absolute()); -} - -void EightBit::MOS6502::ORA_absx() { - ORA(AM_AbsoluteX()); -} - -void EightBit::MOS6502::ORA_absy() { - ORA(AM_AbsoluteY()); -} - -void EightBit::MOS6502::ORA_zpx() { - ORA(AM_ZeroPageX()); -} - -void EightBit::MOS6502::ORA_indy() { - ORA(AM_IndirectIndexedY()); -} - -void EightBit::MOS6502::ORA_zpind() { - ORA(AM_ZeroPageIndirect()); -} - -// - -void EightBit::MOS6502::AND_zpx() { - AND(AM_ZeroPageX()); -} - -void EightBit::MOS6502::AND_indy() { - AND(AM_IndirectIndexedY()); -} - -void EightBit::MOS6502::AND_zp() { - AND(AM_ZeroPage()); -} - -void EightBit::MOS6502::AND_absx() { - AND(AM_AbsoluteX()); -} - -void EightBit::MOS6502::AND_absy() { - AND(AM_AbsoluteY()); -} - -void EightBit::MOS6502::AND_imm() { - AND(AM_Immediate()); -} - -void EightBit::MOS6502::AND_xind() { - AND(AM_IndexedIndirectX()); -} - -void EightBit::MOS6502::AND_abs() { - AND(AM_Absolute()); -} - -void EightBit::MOS6502::AND_zpind() { - AND(AM_ZeroPageIndirect()); -} - -// - -void EightBit::MOS6502::EOR_absx() { - EOR(AM_AbsoluteX()); -} - -void EightBit::MOS6502::EOR_absy() { - EOR(AM_AbsoluteY()); -} - -void EightBit::MOS6502::EOR_zpx() { - EOR(AM_ZeroPageX()); -} - -void EightBit::MOS6502::EOR_indy() { - EOR(AM_IndirectIndexedY()); -} - -void EightBit::MOS6502::EOR_abs() { - EOR(AM_Absolute()); -} - -void EightBit::MOS6502::EOR_imm() { - EOR(AM_Immediate()); -} - -void EightBit::MOS6502::EOR_zp() { - EOR(AM_ZeroPage()); -} - -void EightBit::MOS6502::EOR_xind() { - EOR(AM_IndexedIndirectX()); -} - -void EightBit::MOS6502::EOR_zpind() { - EOR(AM_ZeroPageIndirect()); -} - -// - -void EightBit::MOS6502::LDA_absx() { - LDA(AM_AbsoluteX()); -} - -void EightBit::MOS6502::LDA_absy() { - LDA(AM_AbsoluteY()); -} - -void EightBit::MOS6502::LDA_zpx() { - LDA(AM_ZeroPageX()); -} - -void EightBit::MOS6502::LDA_indy() { - LDA(AM_IndirectIndexedY()); -} - -void EightBit::MOS6502::LDA_abs() { - LDA(AM_Absolute()); -} - -void EightBit::MOS6502::LDA_imm() { - LDA(AM_Immediate()); -} - -void EightBit::MOS6502::LDA_zp() { - LDA(AM_ZeroPage()); -} - -void EightBit::MOS6502::LDA_xind() { - LDA(AM_IndexedIndirectX()); -} - -void EightBit::MOS6502::LDA_zpind() { - LDA(AM_ZeroPageIndirect()); -} - -// - -void EightBit::MOS6502::LDX_imm() { - LDX(AM_Immediate()); -} - -void EightBit::MOS6502::LDX_zp() { - LDX(AM_ZeroPage()); -} - -void EightBit::MOS6502::LDX_abs() { - LDX(AM_Absolute()); -} - -void EightBit::MOS6502::LDX_zpy() { - LDX(AM_ZeroPageY()); -} - -void EightBit::MOS6502::LDX_absy() { - LDX(AM_AbsoluteY()); -} - -// - -void EightBit::MOS6502::LDY_imm() { - LDY(AM_Immediate()); -} - -void EightBit::MOS6502::LDY_zp() { - LDY(AM_ZeroPage()); -} - -void EightBit::MOS6502::LDY_abs() { - LDY(AM_Absolute()); -} - -void EightBit::MOS6502::LDY_zpx() { - LDY(AM_ZeroPageX()); -} - -void EightBit::MOS6502::LDY_absx() { - LDY(AM_AbsoluteX()); -} - -// - -void EightBit::MOS6502::CMP_absx() { - CMP(AM_AbsoluteX()); -} - -void EightBit::MOS6502::CMP_absy() { - CMP(AM_AbsoluteY()); -} - -void EightBit::MOS6502::CMP_zpx() { - CMP(AM_ZeroPageX()); -} - -void EightBit::MOS6502::CMP_indy() { - CMP(AM_IndirectIndexedY()); -} - -void EightBit::MOS6502::CMP_abs() { - CMP(AM_Absolute()); -} - -void EightBit::MOS6502::CMP_imm() { - CMP(AM_Immediate()); -} - -void EightBit::MOS6502::CMP_zp() { - CMP(AM_ZeroPage()); -} - -void EightBit::MOS6502::CMP_xind() { - CMP(AM_IndexedIndirectX()); -} - -void EightBit::MOS6502::CMP_zpind() { - CMP(AM_ZeroPageIndirect()); -} - -// - -void EightBit::MOS6502::CPX_abs() { - CPX(AM_Absolute()); -} - -void EightBit::MOS6502::CPX_zp() { - CPX(AM_ZeroPage()); -} - -void EightBit::MOS6502::CPX_imm() { - CPX(AM_Immediate()); -} - -// - -void EightBit::MOS6502::CPY_imm() { - CPY(AM_Immediate()); -} - -void EightBit::MOS6502::CPY_zp() { - CPY(AM_ZeroPage()); -} - -void EightBit::MOS6502::CPY_abs() { - CPY(AM_Absolute()); -} - -// - -void EightBit::MOS6502::ADC_zp() { - ADC(AM_ZeroPage()); -} - -void EightBit::MOS6502::ADC_xind() { - ADC(AM_IndexedIndirectX()); -} - -void EightBit::MOS6502::ADC_imm() { - ADC(AM_Immediate()); -} - -void EightBit::MOS6502::ADC_abs() { - ADC(AM_Absolute()); -} - -void EightBit::MOS6502::ADC_zpx() { - ADC(AM_ZeroPageX()); -} - -void EightBit::MOS6502::ADC_indy() { - ADC(AM_IndirectIndexedY()); -} - -void EightBit::MOS6502::ADC_absx() { - ADC(AM_AbsoluteX()); -} - -void EightBit::MOS6502::ADC_absy() { - ADC(AM_AbsoluteY()); -} - -void EightBit::MOS6502::ADC_zpind() { - ADC(AM_ZeroPageIndirect()); -} - -// - -void EightBit::MOS6502::SBC_xind() { - SBC(AM_IndexedIndirectX()); -} - -void EightBit::MOS6502::SBC_zp() { - SBC(AM_ZeroPage()); -} - -void EightBit::MOS6502::SBC_imm() { - SBC(AM_Immediate()); -} - -void EightBit::MOS6502::SBC_abs() { - SBC(AM_Absolute()); -} - -void EightBit::MOS6502::SBC_zpx() { - SBC(AM_ZeroPageX()); -} - -void EightBit::MOS6502::SBC_indy() { - SBC(AM_IndirectIndexedY()); -} - -void EightBit::MOS6502::SBC_absx() { - SBC(AM_AbsoluteX()); -} - -void EightBit::MOS6502::SBC_absy() { - SBC(AM_AbsoluteY()); -} - -void EightBit::MOS6502::SBC_zpind() { - SBC(AM_ZeroPageIndirect()); -} - -// - -void EightBit::MOS6502::BIT_imm() { - BIT(AM_Immediate()); -} - -void EightBit::MOS6502::BIT_zp() { - BIT(AM_ZeroPage()); -} - -void EightBit::MOS6502::BIT_zpx() { - BIT(AM_ZeroPageX()); -} - -void EightBit::MOS6502::BIT_abs() { - BIT(AM_Absolute()); -} - -void EightBit::MOS6502::BIT_absx() { - BIT(AM_AbsoluteX()); -} - -// - -void EightBit::MOS6502::DEC_a() { - DEC(AM_A()); -} - -void EightBit::MOS6502::DEC_absx() { - DEC(AM_AbsoluteX()); -} - -void EightBit::MOS6502::DEC_zpx() { - DEC(AM_ZeroPageX()); -} - -void EightBit::MOS6502::DEC_abs() { - DEC(AM_Absolute()); -} - -void EightBit::MOS6502::DEC_zp() { - DEC(AM_ZeroPage()); -} - -// - -void EightBit::MOS6502::DEX_imp() { - DEC(AM_X()); -} - -void EightBit::MOS6502::DEY_imp() { - DEC(AM_Y()); -} - -// - -void EightBit::MOS6502::INC_a() { - INC(AM_A()); -} - -void EightBit::MOS6502::INC_zp() { - INC(AM_ZeroPage()); -} - -void EightBit::MOS6502::INC_absx() { - INC(AM_AbsoluteX()); -} - -void EightBit::MOS6502::INC_zpx() { - INC(AM_ZeroPageX()); -} - -void EightBit::MOS6502::INC_abs() { - INC(AM_Absolute()); -} - -// - -void EightBit::MOS6502::INX_imp() { - INC(AM_X()); -} - -void EightBit::MOS6502::INY_imp() { - INC(AM_Y()); -} - -// - -void EightBit::MOS6502::STX_zpy() { - AM_ZeroPageY() = X(); -} - -void EightBit::MOS6502::STX_abs() { - AM_Absolute() = X(); -} - -void EightBit::MOS6502::STX_zp() { - AM_ZeroPage() = X(); -} - -// - -void EightBit::MOS6502::STY_zpx() { - AM_ZeroPageX() = Y(); -} - -void EightBit::MOS6502::STY_abs() { - AM_Absolute() = Y(); -} - -void EightBit::MOS6502::STY_zp() { - AM_ZeroPage() = Y(); -} - -// - -void EightBit::MOS6502::STA_absx() { - AM_AbsoluteX() = A(); -} - -void EightBit::MOS6502::STA_absy() { - AM_AbsoluteY() = A(); -} - -void EightBit::MOS6502::STA_zpx() { - AM_ZeroPageX() = A(); -} - -void EightBit::MOS6502::STA_indy() { - AM_IndirectIndexedY() = A(); -} - -void EightBit::MOS6502::STA_abs() { - AM_Absolute() = A(); -} - -void EightBit::MOS6502::STA_zp() { - AM_ZeroPage() = A(); -} - -void EightBit::MOS6502::STA_xind() { - AM_IndexedIndirectX() = A(); -} - -void EightBit::MOS6502::STA_zpind() { - AM_ZeroPageIndirect() = A(); -} - -// - -void EightBit::MOS6502::STZ_zp() { - AM_ZeroPage() = 0; -} - -void EightBit::MOS6502::STZ_zpx() { - AM_ZeroPageX() = 0; -} - -void EightBit::MOS6502::STZ_abs() { - AM_Absolute() = 0; -} - -void EightBit::MOS6502::STZ_absx() { - AM_AbsoluteX() = 0; -} - -// - -void EightBit::MOS6502::TSX_imp() { - UpdateZeroNegativeFlags(X() = S()); -} - -void EightBit::MOS6502::TAX_imp() { - UpdateZeroNegativeFlags(X() = A()); -} - -void EightBit::MOS6502::TAY_imp() { - UpdateZeroNegativeFlags(Y() = A()); -} - -void EightBit::MOS6502::TXS_imp() { - S() = X(); -} - -void EightBit::MOS6502::TYA_imp() { - UpdateZeroNegativeFlags(A() = Y()); -} - -void EightBit::MOS6502::TXA_imp() { - UpdateZeroNegativeFlags(A() = X()); -} - -// - -void EightBit::MOS6502::PHP_imp() { +void EightBit::MOS6502::PHP() { setFlag(P(), BF); PushByte(P()); } -void EightBit::MOS6502::PLP_imp() { +void EightBit::MOS6502::PLP() { P() = PopByte(); setFlag(P(), RF); } -void EightBit::MOS6502::PLA_imp() { - A() = PopByte(); - UpdateZeroNegativeFlags(A()); -} - -void EightBit::MOS6502::PHA_imp() { - PushByte(A()); -} - -void EightBit::MOS6502::PHX_imp() { - PushByte(X()); -} - -void EightBit::MOS6502::PHY_imp() { - PushByte(Y()); -} - -void EightBit::MOS6502::PLX_imp() { - UpdateZeroNegativeFlags(X() = PopByte()); -} - -void EightBit::MOS6502::PLY_imp() { - UpdateZeroNegativeFlags(Y() = PopByte()); -} - -// - -void EightBit::MOS6502::ASL_a() { - ASL(AM_A()); -} - -void EightBit::MOS6502::ASL_zp() { - ASL(AM_ZeroPage()); -} - -void EightBit::MOS6502::ASL_abs() { - ASL(AM_Absolute()); -} - -void EightBit::MOS6502::ASL_absx() { - ASL(AM_AbsoluteX()); -} - -void EightBit::MOS6502::ASL_zpx() { - ASL(AM_ZeroPageX()); -} - -// - -void EightBit::MOS6502::LSR_absx() { - LSR(AM_AbsoluteX()); -} - -void EightBit::MOS6502::LSR_zpx() { - LSR(AM_ZeroPageX()); -} - -void EightBit::MOS6502::LSR_abs() { - LSR(AM_Absolute()); -} - -void EightBit::MOS6502::LSR_a() { - LSR(AM_A()); -} - -void EightBit::MOS6502::LSR_zp() { - LSR(AM_ZeroPage()); -} - -// - -void EightBit::MOS6502::ROL_absx() { - ROL(AM_AbsoluteX()); -} - -void EightBit::MOS6502::ROL_zpx() { - ROL(AM_ZeroPageX()); -} - -void EightBit::MOS6502::ROL_abs() { - ROL(AM_Absolute()); -} - -void EightBit::MOS6502::ROL_a() { - ROL(AM_A()); -} - -void EightBit::MOS6502::ROL_zp() { - ROL(AM_ZeroPage()); -} - -// - -void EightBit::MOS6502::ROR_absx() { - ROR(AM_AbsoluteX()); -} - -void EightBit::MOS6502::ROR_zpx() { - ROR(AM_ZeroPageX()); -} - -void EightBit::MOS6502::ROR_abs() { - ROR(AM_Absolute()); -} - -void EightBit::MOS6502::ROR_a() { - ROR(AM_A()); -} - -void EightBit::MOS6502::ROR_zp() { - ROR(AM_ZeroPage()); -} - -// - -void EightBit::MOS6502::TSB_zp() { - TSB(AM_ZeroPage()); -} - -void EightBit::MOS6502::TSB_abs() { - TSB(AM_Absolute()); -} - -// - -void EightBit::MOS6502::TRB_zp() { - TRB(AM_ZeroPage()); -} - -void EightBit::MOS6502::TRB_abs() { - TRB(AM_Absolute()); -} - -// - -void EightBit::MOS6502::RMB0_zp() { - RMB(AM_ZeroPage(), 1); -} - -void EightBit::MOS6502::RMB1_zp() { - RMB(AM_ZeroPage(), 2); -} - -void EightBit::MOS6502::RMB2_zp() { - RMB(AM_ZeroPage(), 4); -} - -void EightBit::MOS6502::RMB3_zp() { - RMB(AM_ZeroPage(), 8); -} - -void EightBit::MOS6502::RMB4_zp() { - RMB(AM_ZeroPage(), 0x10); -} - -void EightBit::MOS6502::RMB5_zp() { - RMB(AM_ZeroPage(), 0x20); -} - -void EightBit::MOS6502::RMB6_zp() { - RMB(AM_ZeroPage(), 0x40); -} - -void EightBit::MOS6502::RMB7_zp() { - RMB(AM_ZeroPage(), 0x80); -} - -// - -void EightBit::MOS6502::SMB0_zp() { - SMB(AM_ZeroPage(), 1); -} - -void EightBit::MOS6502::SMB1_zp() { - SMB(AM_ZeroPage(), 2); -} - -void EightBit::MOS6502::SMB2_zp() { - SMB(AM_ZeroPage(), 4); -} - -void EightBit::MOS6502::SMB3_zp() { - SMB(AM_ZeroPage(), 8); -} - -void EightBit::MOS6502::SMB4_zp() { - SMB(AM_ZeroPage(), 0x10); -} - -void EightBit::MOS6502::SMB5_zp() { - SMB(AM_ZeroPage(), 0x20); -} - -void EightBit::MOS6502::SMB6_zp() { - SMB(AM_ZeroPage(), 0x40); -} - -void EightBit::MOS6502::SMB7_zp() { - SMB(AM_ZeroPage(), 0x80); -} - // void EightBit::MOS6502::JSR_abs() { @@ -1478,12 +540,12 @@ void EightBit::MOS6502::JSR_abs() { PC() = m_memptr; } -void EightBit::MOS6502::RTI_imp() { - PLP_imp(); +void EightBit::MOS6502::RTI() { + PLP(); PopWord(PC()); } -void EightBit::MOS6502::RTS_imp() { +void EightBit::MOS6502::RTS() { PopWord(PC()); PC().word++; } @@ -1503,157 +565,10 @@ void EightBit::MOS6502::JMP_absxind() { PC() = m_memptr; } -void EightBit::MOS6502::BRK_imp() { +void EightBit::MOS6502::BRK() { PC().word++; PushWord(PC()); - PHP_imp(); + PHP(); setFlag(P(), IF); - if (level >= ProcessorType::Cpu65SC02) - clearFlag(P(), DF); - - GetWord(IRQvector, PC()); -} - -// - -void EightBit::MOS6502::WAI_imp() { - throw std::runtime_error("Not implemented"); -} - -void EightBit::MOS6502::STP_imp() { - throw std::runtime_error("Not implemented"); -} - -// - -void EightBit::MOS6502::SED_imp() { - setFlag(P(), DF); -} - -void EightBit::MOS6502::CLD_imp() { - clearFlag(P(), DF); -} - -void EightBit::MOS6502::CLV_imp() { - clearFlag(P(), VF); -} - -void EightBit::MOS6502::SEI_imp() { - setFlag(P(), IF); -} - -void EightBit::MOS6502::CLI_imp() { - clearFlag(P(), IF); -} - -void EightBit::MOS6502::CLC_imp() { - clearFlag(P(), CF); -} - -void EightBit::MOS6502::SEC_imp() { - setFlag(P(), CF); -} - -// - -void EightBit::MOS6502::BMI_rel() { - Branch((P() & NF) != 0); -} - -void EightBit::MOS6502::BPL_rel() { - Branch(!(P() & NF)); -} - -void EightBit::MOS6502::BVC_rel() { - Branch(!(P() & VF)); -} - -void EightBit::MOS6502::BVS_rel() { - Branch((P() & VF) != 0); -} - -void EightBit::MOS6502::BCC_rel() { - Branch(!(P() & CF)); -} - -void EightBit::MOS6502::BCS_rel() { - Branch((P() & CF) != 0); -} - -void EightBit::MOS6502::BNE_rel() { - Branch(!(P() & ZF)); -} - -void EightBit::MOS6502::BEQ_rel() { - Branch((P() & ZF) != 0); -} - -void EightBit::MOS6502::BRA_rel() { - Branch(); -} - -// - -void EightBit::MOS6502::BBR0_zprel() { - BitBranch_Clear(0x1); -} - -void EightBit::MOS6502::BBR1_zprel() { - BitBranch_Clear(0x2); -} - -void EightBit::MOS6502::BBR2_zprel() { - BitBranch_Clear(0x4); -} - -void EightBit::MOS6502::BBR3_zprel() { - BitBranch_Clear(0x8); -} - -void EightBit::MOS6502::BBR4_zprel() { - BitBranch_Clear(0x10); -} - -void EightBit::MOS6502::BBR5_zprel() { - BitBranch_Clear(0x20); -} - -void EightBit::MOS6502::BBR6_zprel() { - BitBranch_Clear(0x40); -} - -void EightBit::MOS6502::BBR7_zprel() { - BitBranch_Clear(0x80); -} - -void EightBit::MOS6502::BBS0_zprel() { - BitBranch_Set(0x1); -} - -void EightBit::MOS6502::BBS1_zprel() { - BitBranch_Set(0x2); -} - -void EightBit::MOS6502::BBS2_zprel() { - BitBranch_Set(0x4); -} - -void EightBit::MOS6502::BBS3_zprel() { - BitBranch_Set(0x8); -} - -void EightBit::MOS6502::BBS4_zprel() { - BitBranch_Set(0x10); -} - -void EightBit::MOS6502::BBS5_zprel() { - BitBranch_Set(0x20); -} - -void EightBit::MOS6502::BBS6_zprel() { - BitBranch_Set(0x40); -} - -void EightBit::MOS6502::BBS7_zprel() { - BitBranch_Set(0x80); + GetWord(IRQvector, PC()); } diff --git a/M6502/test_M6502/Board.cpp b/M6502/test_M6502/Board.cpp index c9aeaf6..207da50 100644 --- a/M6502/test_M6502/Board.cpp +++ b/M6502/test_M6502/Board.cpp @@ -2,8 +2,6 @@ #include "Board.h" #include "Disassembly.h" -#include "ProcessorType.h" - #include #include #include @@ -12,7 +10,7 @@ Board::Board(const Configuration& configuration) : m_configuration(configuration), m_memory(0xffff), - m_cpu(EightBit::MOS6502(m_memory, EightBit::ProcessorType::Cpu6502)), + m_cpu(EightBit::MOS6502(m_memory)), m_symbols(""), m_disassembler(m_cpu, m_symbols), m_profiler(m_cpu, m_disassembler, m_symbols), @@ -77,9 +75,6 @@ void Board::Cpu_ExecutingInstruction_Debug(const EightBit::MOS6502& cpu) { auto address = m_cpu.PC().word; auto cell = m_memory.peek(address); - const auto& instruction = m_cpu.getInstruction(cell); - auto mode = instruction.mode; - std::cout << std::hex; std::cout << "PC=" << std::setw(4) << std::setfill('0') << address << ":"; std::cout << "P=" << m_disassembler.Dump_Flags(m_cpu.P()) << ", "; @@ -89,11 +84,6 @@ void Board::Cpu_ExecutingInstruction_Debug(const EightBit::MOS6502& cpu) { std::cout << "Y=" << (int)m_cpu.Y() << ", "; std::cout << "S=" << (int)m_cpu.S() << "\t"; - std::cout << m_disassembler.Dump_ByteValue(cell); - std::cout << m_disassembler.DumpBytes(mode, address + 1); - - std::cout << "\t "; - std::cout << m_disassembler.Disassemble(address); std::cout << "\n";