// TODO: Check size of symbols (24/16/8) and use knowledge of CPU bank registers (K/DP/DB) to look at correct address public int ReadAddress(int index, bool readWord, OffsetRegister offset, out int address) { address = index; if (offset == OffsetRegister.X) { address += X; } if (offset == OffsetRegister.Y) { address += Y; } if (offset == OffsetRegister.IndirectY) { address = ReadAddress(address, true) + Y; // TODO: Page boundary crossing issue } if (offset == OffsetRegister.IndirectX) { address = ReadAddress(address + X, true); } if (address >= CpuData.Length || (readWord && address + 1 >= CpuData.Length)) { return(-1); } return(CpuData[address] + (readWord ? (CpuData[address + 1] << 8) : 0)); }
public override string ToString() { var sb = new StringBuilder(); switch (ValueType) { case OperandValueType.Byte: sb.Append("byte "); break; case OperandValueType.Word: sb.Append("word "); break; case OperandValueType.Dword: break; default: throw new Exception("Invalid operand value type"); // TODO } if (IsPointer) { sb.Append('['); } if (IsOffset) { sb.Append(OffsetRegister.ToString().ToLower()); sb.Append(" + "); } if (Type >= OperandType.ImmB && Type <= OperandType.ImmD) { sb.Append(Payload); } else { sb.Append(Type.ToString().ToLower()); } if (IsPointer) { sb.Append(']'); } return(sb.ToString()); }
public int ReadAddress(int index, bool readWord = false, OffsetRegister offset = OffsetRegister.None) { return(ReadAddress(index, readWord, offset, out var dummy)); }