#include "cpu.h" #define NEW_OPCODE(op, addr, cyc, len, ill) {op, addr, cyc, len, ill, #op} const struct Opcode OPCODE_TABLE[256] = { /* 00 */ NEW_OPCODE(BRK, IMP, 7, 1, 0), /* 01 */ NEW_OPCODE(ORA, INDX, 6, 2, 0), /* 02 */ NEW_OPCODE(JAM, IMP, -1, 1, 1), /* 03 */ NEW_OPCODE(SLO, INDX, 8, 2, 1), /* 04 */ NEW_OPCODE(NOP, ZPG, 3, 2, 1), /* 05 */ NEW_OPCODE(ORA, ZPG, 3, 2, 0), /* 06 */ NEW_OPCODE(ASL, ZPG, 5, 2, 0), /* 07 */ NEW_OPCODE(SLO, ZPG, 5, 2, 1), /* 08 */ NEW_OPCODE(PHP, IMP, 3, 1, 0), /* 09 */ NEW_OPCODE(ORA, IMM, 2, 2, 0), /* 0A */ NEW_OPCODE(ASL, ACC, 2, 1, 0), /* 0B */ NEW_OPCODE(ANC, IMM, 2, 2, 1), /* 0C */ NEW_OPCODE(NOP, ABS, 4, 3, 1), /* 0D */ NEW_OPCODE(ORA, ABS, 4, 3, 0), /* 0E */ NEW_OPCODE(ASL, ABS, 6, 3, 0), /* 0F */ NEW_OPCODE(SLO, ABS, 6, 3, 1), /* 10 */ NEW_OPCODE(BPL, REL, 2, 2, 0), /* 11 */ NEW_OPCODE(ORA, INDY, 5, 2, 0), /* 12 */ NEW_OPCODE(JAM, IMP, -1, 1, 1), /* 13 */ NEW_OPCODE(SLO, INDY, 8, 2, 1), /* 14 */ NEW_OPCODE(NOP, ZPX, 4, 2, 1), /* 15 */ NEW_OPCODE(ORA, ZPX, 4, 2, 0), /* 16 */ NEW_OPCODE(ASL, ZPX, 6, 2, 0), /* 17 */ NEW_OPCODE(SLO, ZPX, 6, 2, 1), /* 18 */ NEW_OPCODE(CLC, IMP, 2, 1, 0), /* 19 */ NEW_OPCODE(ORA, ABY, 4, 3, 0), /* 1A */ NEW_OPCODE(NOP, IMP, 2, 1, 1), /* 1B */ NEW_OPCODE(SLO, ABY, 7, 3, 1), /* 1C */ NEW_OPCODE(NOP, ABX, 4, 3, 1), /* 1D */ NEW_OPCODE(ORA, ABX, 4, 3, 0), /* 1E */ NEW_OPCODE(ASL, ABX, 7, 3, 0), /* 1F */ NEW_OPCODE(SLO, ABX, 7, 3, 1), /* 20 */ NEW_OPCODE(JSR, ABS, 6, 3, 0), /* 21 */ NEW_OPCODE(AND, INDX, 6, 2, 0), /* 22 */ NEW_OPCODE(JAM, IMP, -1, 1, 1), /* 23 */ NEW_OPCODE(RLA, INDX, 8, 2, 1), /* 24 */ NEW_OPCODE(BIT, ZPG, 3, 2, 0), /* 25 */ NEW_OPCODE(AND, ZPG, 3, 2, 0), /* 26 */ NEW_OPCODE(ROL, ZPG, 5, 2, 0), /* 27 */ NEW_OPCODE(RLA, ZPG, 5, 2, 1), /* 28 */ NEW_OPCODE(PLP, IMP, 4, 1, 0), /* 29 */ NEW_OPCODE(AND, IMM, 2, 2, 0), /* 2A */ NEW_OPCODE(ROL, ACC, 2, 1, 0), /* 2B */ NEW_OPCODE(ANC, IMM, 2, 2, 1), /* 2C */ NEW_OPCODE(BIT, ABS, 4, 3, 0), /* 2D */ NEW_OPCODE(AND, ABS, 4, 3, 0), /* 2E */ NEW_OPCODE(ROL, ABS, 6, 3, 0), /* 2F */ NEW_OPCODE(RLA, ABS, 6, 3, 1), /* 30 */ NEW_OPCODE(BMI, REL, 2, 2, 0), /* 31 */ NEW_OPCODE(AND, INDY, 5, 2, 0), /* 32 */ NEW_OPCODE(JAM, IMP, -1, 1, 1), /* 33 */ NEW_OPCODE(RLA, INDY, 8, 2, 1), /* 34 */ NEW_OPCODE(NOP, ZPX, 4, 2, 1), /* 35 */ NEW_OPCODE(AND, ZPX, 4, 2, 0), /* 36 */ NEW_OPCODE(ROL, ZPX, 6, 2, 0), /* 37 */ NEW_OPCODE(RLA, ZPX, 6, 2, 1), /* 38 */ NEW_OPCODE(SEC, IMP, 2, 1, 0), /* 39 */ NEW_OPCODE(AND, ABY, 4, 3, 0), /* 3A */ NEW_OPCODE(NOP, IMP, 2, 1, 1), /* 3B */ NEW_OPCODE(RLA, ABY, 7, 3, 1), /* 3C */ NEW_OPCODE(NOP, ABX, 4, 3, 1), /* 3D */ NEW_OPCODE(AND, ABX, 4, 3, 0), /* 3E */ NEW_OPCODE(ROL, ABX, 7, 3, 0), /* 3F */ NEW_OPCODE(RLA, ABX, 7, 3, 0), /* 40 */ NEW_OPCODE(RTI, IMP, 6, 1, 0), /* 41 */ NEW_OPCODE(EOR, INDX, 6, 2, 0), /* 42 */ NEW_OPCODE(JAM, IMP, -1, 1, 1), /* 43 */ NEW_OPCODE(SRE, INDX, 8, 2, 1), /* 44 */ NEW_OPCODE(NOP, ZPG, 3, 2, 1), /* 45 */ NEW_OPCODE(EOR, ZPG, 3, 2, 0), /* 46 */ NEW_OPCODE(LSR, ZPG, 5, 2, 0), /* 47 */ NEW_OPCODE(SRE, ZPG, 5, 2, 1), /* 48 */ NEW_OPCODE(PHA, IMP, 3, 1, 0), /* 49 */ NEW_OPCODE(EOR, IMM, 2, 2, 0), /* 4A */ NEW_OPCODE(LSR, ACC, 2, 1, 0), /* 4B */ NEW_OPCODE(ASR, IMM, 2, 2, 1), /* 4C */ NEW_OPCODE(JMP, ABS, 3, 3, 0), /* 4D */ NEW_OPCODE(EOR, ABS, 4, 3, 0), /* 4E */ NEW_OPCODE(LSR, ABS, 6, 3, 0), /* 4F */ NEW_OPCODE(SRE, ABS, 6, 3, 1), /* 50 */ NEW_OPCODE(BVC, REL, 2, 2, 0), /* 51 */ NEW_OPCODE(EOR, INDY, 5, 2, 0), /* 52 */ NEW_OPCODE(JAM, IMP, -1, 1, 1), /* 53 */ NEW_OPCODE(SRE, INDY, 8, 2, 1), /* 54 */ NEW_OPCODE(NOP, ZPX, 4, 2, 1), /* 55 */ NEW_OPCODE(EOR, ZPX, 4, 2, 0), /* 56 */ NEW_OPCODE(LSR, ZPX, 6, 2, 0), /* 57 */ NEW_OPCODE(SRE, ZPX, 6, 2, 1), /* 58 */ NEW_OPCODE(CLI, IMP, 2, 1, 0), /* 59 */ NEW_OPCODE(EOR, ABY, 4, 3, 0), /* 5A */ NEW_OPCODE(NOP, IMP, 2, 1, 1), /* 5B */ NEW_OPCODE(SRE, ABY, 7, 3, 1), /* 5C */ NEW_OPCODE(NOP, ABX, 4, 3, 1), /* 5D */ NEW_OPCODE(EOR, ABX, 4, 3, 0), /* 5E */ NEW_OPCODE(LSR, ABX, 7, 3, 0), /* 5F */ NEW_OPCODE(SRE, ABX, 7, 3, 1), /* 60 */ NEW_OPCODE(RTS, IMP, 6, 1, 0), /* 61 */ NEW_OPCODE(ADC, INDX, 6, 2, 0), /* 62 */ NEW_OPCODE(JAM, IMP, -1, 1, 1), /* 63 */ NEW_OPCODE(RRA, INDX, 8, 2, 1), /* 64 */ NEW_OPCODE(NOP, ZPG, 3, 2, 1), /* 65 */ NEW_OPCODE(ADC, ZPG, 3, 2, 0), /* 66 */ NEW_OPCODE(ROR, ZPG, 5, 2, 0), /* 67 */ NEW_OPCODE(RRA, ZPG, 5, 2, 1), /* 68 */ NEW_OPCODE(PLA, IMP, 4, 1, 0), /* 69 */ NEW_OPCODE(ADC, IMM, 2, 2, 0), /* 6A */ NEW_OPCODE(ROR, ACC, 2, 1, 0), /* 6B */ NEW_OPCODE(ARR, IMM, 2, 2, 1), /* 6C */ NEW_OPCODE(JMP, IND, 5, 3, 0), /* 6D */ NEW_OPCODE(ADC, ABS, 4, 3, 0), /* 6E */ NEW_OPCODE(ROR, ABS, 6, 3, 0), /* 6F */ NEW_OPCODE(RRA, ABS, 6, 3, 1), /* 70 */ NEW_OPCODE(BVS, REL, 2, 2, 0), /* 71 */ NEW_OPCODE(ADC, INDY, 5, 2, 0), /* 72 */ NEW_OPCODE(JAM, IMP, -1, 1, 1), /* 73 */ NEW_OPCODE(RRA, INDY, 8, 2, 1), /* 74 */ NEW_OPCODE(NOP, ZPX, 4, 2, 1), /* 75 */ NEW_OPCODE(ADC, ZPX, 4, 2, 0), /* 76 */ NEW_OPCODE(ROR, ZPX, 6, 2, 0), /* 77 */ NEW_OPCODE(RRA, ZPX, 6, 2, 1), /* 78 */ NEW_OPCODE(SEI, IMP, 2, 1, 0), /* 79 */ NEW_OPCODE(ADC, ABY, 4, 3, 0), /* 7A */ NEW_OPCODE(NOP, IMP, 2, 1, 1), /* 7B */ NEW_OPCODE(RRA, ABY, 7, 3, 1), /* 7C */ NEW_OPCODE(NOP, ABX, 4, 3, 1), /* 7D */ NEW_OPCODE(ADC, ABX, 4, 3, 0), /* 7E */ NEW_OPCODE(ROR, ABX, 7, 3, 0), /* 7F */ NEW_OPCODE(RRA, ABX, 7, 3, 1), /* 80 */ NEW_OPCODE(NOP, IMM, 2, 3, 1), /* 81 */ NEW_OPCODE(STA, INDX, 6, 2, 0), /* 82 */ NEW_OPCODE(NOP, IMM, 2, 3, 1), /* 83 */ NEW_OPCODE(SAX, INDX, 6, 2, 1), /* 84 */ NEW_OPCODE(STY, ZPG, 3, 2, 0), /* 85 */ NEW_OPCODE(STA, ZPG, 3, 2, 0), /* 86 */ NEW_OPCODE(STX, ZPG, 3, 2, 0), /* 87 */ NEW_OPCODE(SAX, ZPG, 3, 2, 1), /* 88 */ NEW_OPCODE(DEY, IMP, 2, 1, 0), /* 89 */ NEW_OPCODE(NOP, IMM, 2, 3, 1), /* 8A */ NEW_OPCODE(TXA, IMP, 2, 1, 0), /* 8B */ NEW_OPCODE(XAA, IMM, 2, 2, 1), /* 8C */ NEW_OPCODE(STY, ABS, 4, 3, 0), /* 8D */ NEW_OPCODE(STA, ABS, 4, 3, 0), /* 8E */ NEW_OPCODE(STX, ABS, 4, 3, 0), /* 8F */ NEW_OPCODE(SAX, ABS, 4, 3, 1), /* 90 */ NEW_OPCODE(BCC, REL, 2, 2, 0), /* 91 */ NEW_OPCODE(STA, INDY, 6, 2, 0), /* 92 */ NEW_OPCODE(JAM, IMP, -1, 1, 1), /* 93 */ NEW_OPCODE(SHA, INDY, 6, 2, 1), /* 94 */ NEW_OPCODE(STY, ZPX, 4, 2, 0), /* 95 */ NEW_OPCODE(STA, ZPX, 4, 2, 0), /* 96 */ NEW_OPCODE(STX, ZPY, 4, 2, 0), /* 97 */ NEW_OPCODE(SAX, ZPY, 4, 2, 1), /* 98 */ NEW_OPCODE(TYA, IMP, 2, 1, 0), /* 99 */ NEW_OPCODE(STA, ABY, 5, 3, 0), /* 9A */ NEW_OPCODE(TXS, IMP, 2, 1, 0), /* 9B */ NEW_OPCODE(SHS, ABY, 5, 3, 1), /* 9C */ NEW_OPCODE(SHY, ABX, 5, 3, 1), /* 9D */ NEW_OPCODE(STA, ABX, 5, 3, 0), /* 9E */ NEW_OPCODE(SHX, ABY, 5, 3, 1), /* 9F */ NEW_OPCODE(SHA, ABY, 5, 3, 1), /* A0 */ NEW_OPCODE(LDY, IMM, 2, 2, 0), /* A1 */ NEW_OPCODE(LDA, INDX, 6, 2, 0), /* A2 */ NEW_OPCODE(LDX, IMM, 2, 2, 0), /* A3 */ NEW_OPCODE(LAX, INDX, 6, 2, 1), /* A4 */ NEW_OPCODE(LDY, ZPG, 3, 2, 0), /* A5 */ NEW_OPCODE(LDA, ZPG, 3, 2, 0), /* A6 */ NEW_OPCODE(LDX, ZPG, 3, 2, 0), /* A7 */ NEW_OPCODE(LAX, ZPG, 3, 2, 1), /* A8 */ NEW_OPCODE(TAY, IMP, 2, 1, 0), /* A9 */ NEW_OPCODE(LDA, IMM, 2, 2, 0), /* AA */ NEW_OPCODE(TAX, IMP, 2, 1, 0), /* AB */ NEW_OPCODE(LAX, IMM, 2, 2, 1), /* AC */ NEW_OPCODE(LDY, ABS, 4, 3, 0), /* AD */ NEW_OPCODE(LDA, ABS, 4, 3, 0), /* AE */ NEW_OPCODE(LDX, ABS, 4, 3, 0), /* AF */ NEW_OPCODE(LAX, ABS, 4, 3, 1), /* B0 */ NEW_OPCODE(BCS, REL, 2, 2, 0), /* B1 */ NEW_OPCODE(LDA, INDY, 5, 2, 0), /* B2 */ NEW_OPCODE(JAM, IMP, -1, 1, 1), /* B3 */ NEW_OPCODE(LAX, INDY, 5, 2, 1), /* B4 */ NEW_OPCODE(LDY, ZPX, 4, 2, 0), /* B5 */ NEW_OPCODE(LDA, ZPX, 4, 2, 0), /* B6 */ NEW_OPCODE(LDX, ZPY, 4, 2, 0), /* B7 */ NEW_OPCODE(LAX, ZPY, 4, 2, 1), /* B8 */ NEW_OPCODE(CLV, IMP, 2, 1, 0), /* B9 */ NEW_OPCODE(LDA, ABY, 4, 3, 0), /* BA */ NEW_OPCODE(TSX, IMP, 2, 1, 0), /* BB */ NEW_OPCODE(LAS, ABY, 4, 3, 1), /* BC */ NEW_OPCODE(LDY, ABX, 4, 3, 0), /* BD */ NEW_OPCODE(LDA, ABX, 4, 3, 0), /* BE */ NEW_OPCODE(LDX, ABY, 4, 3, 0), /* BF */ NEW_OPCODE(LAX, ABY, 4, 3, 1), /* C0 */ NEW_OPCODE(CPY, IMM, 2, 2, 0), /* C1 */ NEW_OPCODE(CMP, INDX, 6, 2, 0), /* C2 */ NEW_OPCODE(NOP, IMM, 2, 2, 1), /* C3 */ NEW_OPCODE(DCP, INDX, 8, 2, 1), /* C4 */ NEW_OPCODE(CPY, ZPG, 3, 2, 0), /* C5 */ NEW_OPCODE(CMP, ZPG, 3, 2, 0), /* C6 */ NEW_OPCODE(DEC, ZPG, 5, 2, 0), /* C7 */ NEW_OPCODE(DCP, ZPG, 5, 2, 1), /* C8 */ NEW_OPCODE(INY, IMP, 2, 1, 0), /* C9 */ NEW_OPCODE(CMP, IMM, 2, 2, 0), /* CA */ NEW_OPCODE(DEX, IMP, 2, 1, 0), /* CB */ NEW_OPCODE(SBX, IMM, 2, 2, 1), /* CC */ NEW_OPCODE(CPY, ABS, 4, 3, 0), /* CD */ NEW_OPCODE(CMP, ABS, 4, 3, 0), /* CE */ NEW_OPCODE(DEC, ABS, 6, 3, 0), /* CF */ NEW_OPCODE(DCP, ABS, 6, 3, 1), /* D0 */ NEW_OPCODE(BNE, REL, 2, 2, 0), /* D1 */ NEW_OPCODE(CMP, INDY, 5, 2, 0), /* D2 */ NEW_OPCODE(JAM, IMP, -1, 1, 1), /* D3 */ NEW_OPCODE(DCP, INDY, 8, 2, 1), /* D4 */ NEW_OPCODE(NOP, ZPX, 4, 2, 1), /* D5 */ NEW_OPCODE(CMP, ZPX, 4, 2, 0), /* D6 */ NEW_OPCODE(DEC, ZPX, 6, 2, 0), /* D7 */ NEW_OPCODE(DCP, ZPX, 6, 2, 1), /* D8 */ NEW_OPCODE(CLD, IMP, 2, 1, 0), /* D9 */ NEW_OPCODE(CMP, ABY, 4, 3, 0), /* DA */ NEW_OPCODE(NOP, IMP, 2, 1, 1), /* DB */ NEW_OPCODE(DCP, ABY, 7, 3, 1), /* DC */ NEW_OPCODE(NOP, ABX, 4, 3, 1), /* DD */ NEW_OPCODE(CMP, ABX, 4, 3, 0), /* DE */ NEW_OPCODE(DEC, ABX, 7, 3, 0), /* DF */ NEW_OPCODE(DCP, ABX, 7, 3, 1), /* E0 */ NEW_OPCODE(CPX, IMM, 2, 2, 0), /* E1 */ NEW_OPCODE(SBC, INDX, 6, 2, 0), /* E2 */ NEW_OPCODE(NOP, IMM, 2, 2, 1), /* E3 */ NEW_OPCODE(ISC, INDX, 8, 2, 1), /* E4 */ NEW_OPCODE(CPX, ZPG, 3, 2, 0), /* E5 */ NEW_OPCODE(SBC, ZPG, 3, 2, 0), /* E6 */ NEW_OPCODE(INC, ZPG, 5, 2, 0), /* E7 */ NEW_OPCODE(ISC, ZPG, 5, 2, 1), /* E8 */ NEW_OPCODE(INX, IMP, 2, 1, 0), /* E9 */ NEW_OPCODE(SBC, IMM, 2, 2, 0), /* EA */ NEW_OPCODE(NOP, IMP, 2, 1, 0), /* EB */ NEW_OPCODE(SBC, IMM, 2, 2, 1), /* EC */ NEW_OPCODE(CPX, ABS, 4, 3, 0), /* ED */ NEW_OPCODE(SBC, ABS, 4, 3, 0), /* EE */ NEW_OPCODE(INC, ABS, 6, 3, 0), /* EF */ NEW_OPCODE(ISC, ABS, 6, 3, 1), /* F0 */ NEW_OPCODE(BEQ, REL, 2, 2, 0), /* F1 */ NEW_OPCODE(SBC, INDY, 5, 2, 0), /* F2 */ NEW_OPCODE(JAM, IMP, -1, 1, 1), /* F3 */ NEW_OPCODE(ISC, INDY, 8, 2, 1), /* F4 */ NEW_OPCODE(NOP, ZPX, 4, 2, 1), /* F5 */ NEW_OPCODE(SBC, ZPX, 4, 2, 0), /* F6 */ NEW_OPCODE(INC, ZPX, 6, 2, 0), /* F7 */ NEW_OPCODE(ISC, ZPX, 6, 2, 1), /* F8 */ NEW_OPCODE(SED, IMP, 2, 1, 0), /* F9 */ NEW_OPCODE(SBC, ABY, 4, 3, 0), /* FA */ NEW_OPCODE(NOP, IMP, 2, 1, 1), /* FC */ NEW_OPCODE(ISC, ABY, 7, 3, 1), /* FB */ NEW_OPCODE(NOP, ABX, 4, 3, 1), /* FD */ NEW_OPCODE(SBC, ABX, 4, 3, 0), /* FE */ NEW_OPCODE(INC, ABX, 7, 3, 0), /* FF */ NEW_OPCODE(ISC, ABX, 7, 3, 1) };