Exemplo n.º 1
0
        /// <summary>
        /// 指定したアドレスを読み出す命令を実行します。
        /// この命令は即時に実行されます。
        /// </summary>
        /// <param name="address">YMF825 のレジスタ番号。範囲は 0x00 から 0x7f です。</param>
        /// <returns>YMF825 から返されたデータ。</returns>
        public virtual byte Read(byte address)
        {
            if (IsDisposed)
            {
                throw new ObjectDisposedException(ToString());
            }

            if (address >= 0x80)
            {
                throw new ArgumentOutOfRangeException(nameof(address));
            }

            lock (lockObject)
            {
                var result = SpiInterface.Read((byte)(address | 0x80));

                WriteBytes++;
                ReadBytes++;
                ReadCommandCount++;

                DataRead?.Invoke(this, new DataTransferedEventArgs(CurrentTargetChip, address, result));

                return(result);
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// アドレスと可変長データの書き込み命令を送信キューに追加します。
        /// </summary>
        /// <param name="address">YMF825 のレジスタ番号。範囲は 0x00 から 0x7f です。</param>
        /// <param name="data">可変長データが格納された <see cref="byte"/> 型の配列。</param>
        /// <param name="offset">配列の読み出しを開始するインデクス。</param>
        /// <param name="count">配列を読み出すバイト数。</param>
        public virtual void BurstWrite(byte address, byte[] data, int offset, int count)
        {
            if (IsDisposed)
            {
                throw new ObjectDisposedException(ToString());
            }

            if (address >= 0x80)
            {
                throw new ArgumentOutOfRangeException(nameof(address));
            }

            lock (lockObject)
            {
                SpiInterface.BurstWrite(address, data, offset, count);

                WriteBytes++;
                BurstWriteBytes += count;
                BurstWriteCommandCount++;

                DataBurstWrote?.Invoke(this, new DataBurstWriteEventArgs(CurrentTargetChip, address, data, offset, count));

                if (AutoFlush)
                {
                    SpiInterface.Flush();
                }
            }
        }
Exemplo n.º 3
0
        /// <summary>
        /// アドレスとデータの書き込み命令を送信キューに追加します。
        /// </summary>
        /// <param name="address">YMF825 のレジスタ番号。範囲は 0x00 から 0x7f です。</param>
        /// <param name="data">レジスタに書き込まれるデータ。</param>
        public virtual void Write(byte address, byte data)
        {
            if (IsDisposed)
            {
                throw new ObjectDisposedException(ToString());
            }

            if (address >= 0x80)
            {
                throw new ArgumentOutOfRangeException(nameof(address));
            }

            lock (lockObject)
            {
                SpiInterface.Write(address, data);
                WriteBytes += 2;
                WriteCommandCount++;
                DataWrote?.Invoke(this, new DataTransferedEventArgs(CurrentTargetChip, address, data));

                if (AutoFlush)
                {
                    SpiInterface.Flush();
                }
            }
        }
Exemplo n.º 4
0
        /// <summary>
        /// YMF825 をハードウェアリセットします。
        /// この命令は即時に実行されます。
        /// </summary>
        public virtual void ResetHardware()
        {
            if (IsDisposed)
            {
                throw new ObjectDisposedException(ToString());
            }

            lock (lockObject)
                SpiInterface.ResetHardware();
        }
Exemplo n.º 5
0
        /// <summary>
        /// 書き込み命令の送信キューをフラッシュし、YMF825 に即時に実行させます。
        /// </summary>
        public void Flush()
        {
            if (IsDisposed)
            {
                throw new ObjectDisposedException(ToString());
            }

            lock (lockObject)
                SpiInterface.Flush();
        }
Exemplo n.º 6
0
        protected virtual void Dispose(bool disposing)
        {
            if (IsDisposed)
            {
                return;
            }

            if (disposing)
            {
                SpiInterface.Dispose();
            }

            IsDisposed = true;
        }
Exemplo n.º 7
0
        /// <summary>
        /// 書き込み命令の対象となる YMF825 の組み合わせを設定します。
        /// </summary>
        /// <param name="target">YMF825 の組み合わせが格納された <see cref="TargetChip"/> 列挙体の値。</param>
        public void ChangeTargetDevice(TargetChip target)
        {
            if (IsDisposed)
            {
                throw new ObjectDisposedException(ToString());
            }

            var targetValue = (int)target;

            if (targetValue == 0 || targetValue > (int)AvailableChip)
            {
                throw new ArgumentOutOfRangeException(nameof(target));
            }

            lock (lockObject)
            {
                CurrentTargetChip = target;
                SpiInterface.SetCsTargetPin((byte)(targetValue << 3));
            }
        }