public static string GetInstruction(int offset) { AddressMode mode = GetAddressMode(offset); string format = GetInstructionFormatString(offset); string mnemonic = GetMnemonic(offset); string op1 = "", op2 = ""; if (mode == AddressMode.BLOCK_MOVE) { op1 = Util.NumberToBaseString(Data.GetROMByte(offset + 1), Util.NumberBase.Hexadecimal, 2, true); op2 = Util.NumberToBaseString(Data.GetROMByte(offset + 2), Util.NumberBase.Hexadecimal, 2, true); } else if (mode == AddressMode.CONSTANT_8 || mode == AddressMode.IMMEDIATE_8) { op1 = Util.NumberToBaseString(Data.GetROMByte(offset + 1), Util.NumberBase.Hexadecimal, 2, true); } else if (mode == AddressMode.IMMEDIATE_16) { op1 = Util.NumberToBaseString(Util.GetROMWord(offset + 1), Util.NumberBase.Hexadecimal, 4, true); } else { op1 = FormatOperandAddress(offset, mode); } return(string.Format(format, mnemonic, op1, op2)); }
public static int GetIntermediateAddress(int offset) { int bank, directPage, operand, programCounter; int opcode = Data.GetROMByte(offset); AddressMode mode = GetAddressMode(offset); switch (mode) { case AddressMode.DIRECT_PAGE: case AddressMode.DIRECT_PAGE_X_INDEX: case AddressMode.DIRECT_PAGE_Y_INDEX: case AddressMode.DIRECT_PAGE_INDIRECT: case AddressMode.DIRECT_PAGE_X_INDEX_INDIRECT: case AddressMode.DIRECT_PAGE_INDIRECT_Y_INDEX: case AddressMode.DIRECT_PAGE_LONG_INDIRECT: case AddressMode.DIRECT_PAGE_LONG_INDIRECT_Y_INDEX: directPage = Data.GetDirectPage(offset); operand = Data.GetROMByte(offset + 1); return((directPage + operand) & 0xFFFF); case AddressMode.DIRECT_PAGE_S_INDEX: case AddressMode.DIRECT_PAGE_S_INDEX_INDIRECT_Y_INDEX: return(Data.GetROMByte(offset + 1)); case AddressMode.ADDRESS: case AddressMode.ADDRESS_X_INDEX: case AddressMode.ADDRESS_Y_INDEX: case AddressMode.ADDRESS_X_INDEX_INDIRECT: bank = (opcode == 0x20 || opcode == 0x4C || opcode == 0x7C || opcode == 0xFC) ? Util.ConvertPCtoSNES(offset) >> 16 : Data.GetDataBank(offset); operand = Util.GetROMWord(offset + 1); return((bank << 16) | operand); case AddressMode.ADDRESS_INDIRECT: case AddressMode.ADDRESS_LONG_INDIRECT: operand = Util.GetROMWord(offset + 1); return(operand); case AddressMode.LONG: case AddressMode.LONG_X_INDEX: operand = Util.GetROMLong(offset + 1); return(operand); case AddressMode.RELATIVE_8: programCounter = Util.ConvertPCtoSNES(offset + 2); bank = programCounter >> 16; offset = (sbyte)Data.GetROMByte(offset + 1); return((bank << 16) | ((programCounter + offset) & 0xFFFF)); case AddressMode.RELATIVE_16: programCounter = Util.ConvertPCtoSNES(offset + 3); bank = programCounter >> 16; offset = (short)Util.GetROMWord(offset + 1); return((bank << 16) | ((programCounter + offset) & 0xFFFF)); } return(-1); }
private static string FormatOperandAddress(int offset, AddressMode mode) { int address = Util.GetIntermediateAddress(offset); if (address < 0) { return(""); } if (Data.GetLabel(address) != "") { return(Data.GetLabel(address)); } int count = BytesToShow(mode); if (mode == AddressMode.RELATIVE_8 || mode == AddressMode.RELATIVE_16) { address = Util.GetROMWord(offset + 1); } address &= ~(-1 << (8 * count)); return(Util.NumberToBaseString(address, Util.NumberBase.Hexadecimal, 2 * count, true)); }
private static string FormatOperandAddress(int offset, AddressMode mode) { int address = Util.GetEffectiveAddress(offset); if (address < 0) { return(""); } int pc = Util.ConvertSNEStoPC(address); if (pc >= 0 && !string.IsNullOrEmpty(Data.GetLabel(pc))) { return(Data.GetLabel(pc)); } int count = BytesToShow(mode); if (mode == AddressMode.RELATIVE_8 || mode == AddressMode.RELATIVE_16) { address = Util.GetROMWord(offset + 1); } address &= ~(-1 << (8 * count)); return(Util.NumberToBaseString(address, Util.NumberBase.Hexadecimal, 2 * count, true)); }