コード例 #1
0
ファイル: CPU65C816.cs プロジェクト: vhanla/DiztinGUIsh
        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);
        }