/// <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); } }
/// <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(); } } }
/// <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(); } } }
/// <summary> /// YMF825 をハードウェアリセットします。 /// この命令は即時に実行されます。 /// </summary> public virtual void ResetHardware() { if (IsDisposed) { throw new ObjectDisposedException(ToString()); } lock (lockObject) SpiInterface.ResetHardware(); }
/// <summary> /// 書き込み命令の送信キューをフラッシュし、YMF825 に即時に実行させます。 /// </summary> public void Flush() { if (IsDisposed) { throw new ObjectDisposedException(ToString()); } lock (lockObject) SpiInterface.Flush(); }
protected virtual void Dispose(bool disposing) { if (IsDisposed) { return; } if (disposing) { SpiInterface.Dispose(); } IsDisposed = true; }
/// <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)); } }