Exemple #1
0
        private void sidCreate(sidplayfp.sidbuilder builder, sidplayfp.SidConfig.sid_model_t defaultModel,
                               bool forced, ref List <UInt32> extraSidAddresses)
        {
            if (builder != null)
            {
                sidplayfp.SidTuneInfo tuneInfo = m_tune.getInfo();

                // Setup base SID
                sidplayfp.SidConfig.sid_model_t userModel = getSidModel(tuneInfo.sidModel(0), defaultModel, forced);
                sidemu s = builder.lock_(m_c64.getEventScheduler(), userModel);
                if (!builder.getStatus())
                {
                    throw new configError(builder.error());
                }

                m_c64.setBaseSid(s);
                m_mixer.addSid(s);

                // Setup extra SIDs if needed
                if (extraSidAddresses.Count != 0)
                {
                    // If bits 6-7 are set to Unknown then the second SID will be set to the same SID
                    // model as the first SID.
                    defaultModel = userModel;

                    UInt32 extraSidChips = (UInt32)extraSidAddresses.Count;

                    for (UInt32 i = 0; i < extraSidChips; i++)
                    {
                        sidplayfp.SidConfig.sid_model_t userModel_1 = getSidModel(tuneInfo.sidModel(i + 1), defaultModel, forced);

                        sidemu s1 = builder.lock_(m_c64.getEventScheduler(), userModel_1);
                        if (!builder.getStatus())
                        {
                            throw new configError(builder.error());
                        }

                        if (!m_c64.addExtraSid(s1, (Int32)extraSidAddresses[(Int32)i]))
                        {
                            throw new configError(ERR_UNSUPPORTED_SID_ADDR);
                        }

                        m_mixer.addSid(s1);
                    }
                }
            }
        }
Exemple #2
0
        private void initialise()
        {
            m_isPlaying = state_t.STOPPED;

            m_c64.reset();

            sidplayfp.SidTuneInfo tuneInfo = m_tune.getInfo();

            UInt32 size = (UInt32)(tuneInfo.loadAddr()) + tuneInfo.c64dataLen() - 1;

            if (size > 0xffff)
            {
                throw new configError(ERR_UNSUPPORTED_SIZE);
            }

            psiddrv driver = new psiddrv(m_tune.getInfo());

            if (!driver.drvReloc())
            {
                throw new configError(driver.errorString());
            }

            m_info.m_driverAddr   = driver.driverAddr();
            m_info.m_driverLength = driver.driverLength();

            sidmemory sm = m_c64.getMemInterface();

            driver.install(ref sm, videoSwitch);

            sm = m_c64.getMemInterface();
            if (!m_tune.placeSidTuneInC64mem(ref sm))
            {
                throw new configError(m_tune.statusString());
            }

            m_c64.resetCpu();
            //Console.WriteLine("{0:x}", sm.readMemByte(0x17e3));
        }
Exemple #3
0
        /**
         * Get required I/O map to reach address
         *
         * @param addr a 16-bit effective address
         * @return a default bank-select value for $01
         */
        //private byte iomap(UInt16 addr) { return 0; }

        public psiddrv(sidplayfp.SidTuneInfo tuneInfo)
        {
            m_tuneInfo = tuneInfo;
        }
Exemple #4
0
        // Clock speed changes due to loading a new song
        private c64.c64.model_t c64model(sidplayfp.SidConfig.c64_model_t defaultModel, bool forced)
        {
            sidplayfp.SidTuneInfo tuneInfo = m_tune.getInfo();

            sidplayfp.SidTuneInfo.clock_t clockSpeed = tuneInfo.clockSpeed();

            c64.c64.model_t model = c64.c64.model_t.PAL_B;

            // Use preferred speed if forced or if song speed is unknown
            if (forced || clockSpeed == sidplayfp.SidTuneInfo.clock_t.CLOCK_UNKNOWN || clockSpeed == sidplayfp.SidTuneInfo.clock_t.CLOCK_ANY)
            {
                switch (defaultModel)
                {
                case sidplayfp.SidConfig.c64_model_t.PAL:
                    clockSpeed  = sidplayfp.SidTuneInfo.clock_t.CLOCK_PAL;
                    model       = c64.c64.model_t.PAL_B;
                    videoSwitch = 1;
                    break;

                case sidplayfp.SidConfig.c64_model_t.DREAN:
                    clockSpeed  = sidplayfp.SidTuneInfo.clock_t.CLOCK_PAL;
                    model       = c64.c64.model_t.PAL_N;
                    videoSwitch = 1;     // TODO verify
                    break;

                case sidplayfp.SidConfig.c64_model_t.NTSC:
                    clockSpeed  = sidplayfp.SidTuneInfo.clock_t.CLOCK_NTSC;
                    model       = c64.c64.model_t.NTSC_M;
                    videoSwitch = 0;
                    break;

                case sidplayfp.SidConfig.c64_model_t.OLD_NTSC:
                    clockSpeed  = sidplayfp.SidTuneInfo.clock_t.CLOCK_NTSC;
                    model       = c64.c64.model_t.OLD_NTSC_M;
                    videoSwitch = 0;
                    break;
                }
            }
            else
            {
                switch (clockSpeed)
                {
                default:
                case sidplayfp.SidTuneInfo.clock_t.CLOCK_PAL:
                    model       = c64.c64.model_t.PAL_B;
                    videoSwitch = 1;
                    break;

                case sidplayfp.SidTuneInfo.clock_t.CLOCK_NTSC:
                    model       = c64.c64.model_t.NTSC_M;
                    videoSwitch = 0;
                    break;
                }
            }

            switch (clockSpeed)
            {
            case sidplayfp.SidTuneInfo.clock_t.CLOCK_PAL:
                if (tuneInfo.songSpeed() == sidplayfp.SidTuneInfo.SPEED_CIA_1A)
                {
                    m_info.m_speedString = TXT_PAL_CIA;
                }
                else if (tuneInfo.clockSpeed() == sidplayfp.SidTuneInfo.clock_t.CLOCK_NTSC)
                {
                    m_info.m_speedString = TXT_PAL_VBI_FIXED;
                }
                else
                {
                    m_info.m_speedString = TXT_PAL_VBI;
                }
                break;

            case sidplayfp.SidTuneInfo.clock_t.CLOCK_NTSC:
                if (tuneInfo.songSpeed() == sidplayfp.SidTuneInfo.SPEED_CIA_1A)
                {
                    m_info.m_speedString = TXT_NTSC_CIA;
                }
                else if (tuneInfo.clockSpeed() == sidplayfp.SidTuneInfo.clock_t.CLOCK_PAL)
                {
                    m_info.m_speedString = TXT_NTSC_VBI_FIXED;
                }
                else
                {
                    m_info.m_speedString = TXT_NTSC_VBI;
                }
                break;

            default:
                break;
            }

            return(model);
        }
Exemple #5
0
        public bool config(ref sidplayfp.SidConfig cfg, bool force = false)
        {
            // Check if configuration have been changed or forced
            if (!force && !m_cfg.compare(ref cfg))
            {
                return(true);
            }

            // Check for base sampling frequency
            if (cfg.frequency < 8000)
            {
                m_errorString = ERR_UNSUPPORTED_FREQ;
                return(false);
            }

            // Only do these if we have a loaded tune
            if (m_tune != null)
            {
                sidplayfp.SidTuneInfo tuneInfo = m_tune.getInfo();

                try
                {
                    sidRelease();

                    List <UInt32> addresses        = new List <uint>();
                    UInt16        secondSidAddress = tuneInfo.sidChipBase(1) != 0 ?
                                                     tuneInfo.sidChipBase(1) :
                                                     cfg.secondSidAddress;
                    if (secondSidAddress != 0)
                    {
                        addresses.Add(secondSidAddress);
                    }

                    UInt16 thirdSidAddress = tuneInfo.sidChipBase(2) != 0 ?
                                             tuneInfo.sidChipBase(2) :
                                             cfg.thirdSidAddress;
                    if (thirdSidAddress != 0)
                    {
                        addresses.Add(thirdSidAddress);
                    }

                    // SID emulation setup (must be performed before the
                    // environment setup call)
                    sidCreate(cfg.sidEmulation, cfg.defaultSidModel, cfg.forceSidModel, ref addresses);

                    // Determine clock speed
                    c64.c64.model_t model = c64model(cfg.defaultC64Model, cfg.forceC64Model);

                    m_c64.setModel(model);

                    sidParams(m_c64.getMainCpuSpeed(), (Int32)cfg.frequency, cfg.samplingMethod, cfg.fastSampling);

                    // Configure, setup and install C64 environment/events
                    initialise();
                }
                catch (configError e)
                {
                    m_errorString      = e.message();
                    m_cfg.sidEmulation = null;
                    if (m_cfg != cfg)
                    {
                        config(ref m_cfg);
                    }
                    return(false);
                }
            }

            bool isStereo = cfg.playback == sidplayfp.SidConfig.playback_t.STEREO;

            m_info.m_channels = (UInt32)(isStereo ? 2 : 1);

            m_mixer.setStereo(isStereo);
            m_mixer.setVolume((Int32)cfg.leftVolume, (Int32)cfg.rightVolume);

            // Update Configuration
            m_cfg = cfg;

            return(true);
        }