#define FALSE 0 #define TRUE 1 enum Addressing { eImmediate, eAbsolute, eZeroPage, eImplied, eIndirectAbsolute, eAbsoluteIndexedX, eAbsoluteIndexedY, eZeroPageIndexedX, eZeroPageIndexedY, eIndexedIndirect, eIndirectIndexed, eRelative, eAccumulator }; typedef int Addressing; int getLength(Addressing addr){ switch(addr){ case eAbsolute: case eAbsoluteIndexedX: case eAbsoluteIndexedY: return 3; case eAccumulator: return 1; default: return 2; } } /* * Any addressing method which is single line commented out without definition * implies that handling should be hard-coded in the switch case of the * instruction from which it came. */ int fAddressing(Addressing addr, short x) { switch(addr){ case eImmediate: return x; case eAccumulator: return acc; case eAbsolute: return Memory[x]; case eAbsoluteIndexedX: return Memory[(x + X)]; case eAbsoluteIndexedY: return Memory[(x + Y)]; case eZeroPage: return Memory[(x & 0x00FF)]; case eZeroPageIndexedX: return Memory[((x = X) & 0x00FF)]; case eZeroPageIndexedY: return Memory[((x = Y) & 0x00FF)]; case eIndexedIndirect: return Memory[((x + X) << 8) + ((x + X) + 1)]; case eIndirectIndexed: return ((Memory[x] + Memory[(x+1 << 8)]) + Y); //case eImplied: No reference //case eIndirectAbsolute: Only used in the JMP instruction //case eRelative: Only used in branch instructions } }