LDA LDX LDY BIT ADC SBC AND ORA EOR CMP CPX CPY
=====================================

LDA #imm
    FetchOperandLo
    FetchOpcode

LDA ZeroPage
    FetchOperandLo
    ReadAddress
    FetchOpcode

LDA ZeroPage,X
    FetchOperandLo
    IndexX
    ReadAddress;
    FetchOpcode

LDA Absolute
    FetchOperandLo
    FetchOperandHi
    ReadAddress
    FetchOpcode

LDA Absolute, X/Y
    FetchOperandLo
    FetchOperandHiAndIndex;
    ReadAddressAndSkip;
    ReadAddress
    FetchOpcode

LDA (Indirect, X)
    FetchOperandLo
    IndexX
    FetchAddressLo;
    FetchAddressHi;
    ReadAddress
    FetchOpcode

LDA (Indirect), Y
    FetchOperandLo
    FetchAddressLo
    FetchAddressHiAndIndex
    ReadAddressAndSkip
    ReadAddress
    FetchOpcode


STA STX STY
=====================================

STA ZeroPage
    FetchOperandLo
    WriteRegister
    FetchOpcode

STA ZeroPage, X
    FetchOperandLo
    IndexX
    WriteRegister
    FetchOpcode

STA Absolute
    FetchOperandLo
    FetchOperandHi
    WriteRegister
    FetchOpcode

STA Absolute, X/Y
    FetchOperandLo
    FetchOperandHiAndIndex
    ReadAddress
    WriteRegister
    FetchOpcode

STA (Indirect, X)
    FetchOperandLo
    IndexX
    FetchAddressLo
    FetchAddressHi
    WriteRegister
    FetchOpcode

STA (Indirect), Y
    FetchOperandLo
    FetchAddressLo
    FetchAddressHiAndIndex
    ReadAddress
    WriteRegister
    FetchOpcode

ASL LSR ROL ROR INC DEC
========================
ASL A
    FakeFetchOperand
    FetchOpcode

ASL ZeroPage
    FetchOperandLo
    ReadAddress
    WriteAddress
    WriteAddress
    FetchOpcode

ASL ZeroPage, X
    FetchOperandLo
    IndexX
    ReadAddress
    WriteAddress
    WriteAddress
    FetchOpcode

ASL Absolute
    FetchOperandLo
    FetchOperandHi
    ReadAddress
    WriteAddress
    WriteAddress
    FetchOpcode

ASL Absolute, X
    FetchOperandLo
    FetchOperandHiAndIndex
    ReadAddress
    ReadAddress
    WriteAddress
    WriteAddress
    FetchOpcode

BCC BCS BNE BEQ BPL BMI BVC BVS
========================
BCC
    FetchOperandLo
    CheckIfTaken;
    CheckIfPageCrossed;
    FetchOpcode

CLC SEC CLI SEI CLD SED CLV
===========================

---




MICROINSTRUCTIONS
===========================================

FetchOpcode
    DoOpcodeWork();
    IR = Mem::Read(PC++);
    Decode();
    ResetState();

FakeFetchOperand
    Address.Lo = Mem::Read(PC);

FetchOperandLo
    Address.Lo = B = Mem::Read(PC++);

FetchOperandHi
    Address.Hi = Mem::Read(PC++);

FetchOperandHiAndIndex
    Address.Hi = Mem::Read(PC++);
    if (Address.Lo+X/Y > 255) pageCrossed = true;
    Address.Lo += X/Y;

ReadAddress
    B = Mem::Read(Address);
    if (pageCrossed) Address += 0x0100;

ReadAddressAndSkip
    B = Mem::Read(Address);
    if (pageCrossed)
        Address += 0x0100;
    else
        InsertFetchOpcode();

IndexX
    B = Mem::Read(Address);
    Address.Lo += X;

FetchAddressLo
    T = Mem::Read(Address++);

FetchAddressHi
    Address.Hi = Mem::Read(Address);
    Address.Lo = T;

FetchAddressHiAndIndex
    Address.Hi = Mem::Read(Address);
    pageCrossed = (T+Y > 255);
    Address.Lo = T+Y;

WriteRegister
    if ((IR&3)==1) Mem::Write(Address, rA);
    else if ((IR&3)==2) Mem::Write(Address, rX);
    else if ((IR&3)==0) Mem::Write(Address, rY);

WriteAddress
    Mem::Write(Address, B);
    DoOpcodeWork();

FetchOperandAndCheckBranch
    Address.Lo = B = Mem::Read(PC++);
    If (!condition)
        InsertFetchOpcode();
    else
        T = PC.Hi;
        PC = PC +(int8_t)B;

CheckIfPageCrossed
    FakeFetchOperand();
    if (PC.Hi == T)
        InsertFetchOpCode();
    else
        pageCrossed = true;
