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); }