# DC_FlushRange

## 構文

      #include <nitro/os.h>

      void DC_FlushRange( const void* startAddr, u32 nBytes );

      void DC_CleanAndInvalidateRange( const void* startAddr, u32 nBytes );

## 引数

startAddr | フラッシュする領域の最下位アドレス
nBytes | フラッシュする領域のバイト数

## 返り値

なし。

## 説明

指定されたデータキャッシュ領域のデータをフラッシュします。

具体的には、指定されたメモリ領域に対応するデータキャッシュへの書き込みが行なわれたがメインメモリには反映されていない状態（ダーティ状態）のキャッシュのライトバックを行ない、そのキャッシュ領域のデータを破棄し、無効状態にします。

DMA転送やグラフィクスコマンドの作成時などのように、他のデバイスとのメインメモリを使用したデータ送信のデータブロックを完成させるときに使用します。

startAddr は32バイト単位で下位方向に丸められます。startAddr + nBytes は32バイト単位で上位方向に丸められます。

`DC_CleanAndInvalidateRange()` は `DC_FlushRange()` の別名です。動作は全く同じです。
`DC_Clean*/DC_CleanAndInvalidate*` は、プロトタイプ版の SDK からの移植作業のために用意されたものですので、通常は `DC_Store*/DC_Flush*` をお使いください。

注意

ARM プロセッサのオフィシャルドキュメントでは、データキャッシュを無効化する動作を "Flush"、データキャッシュをライトバックしてクリーン状態にする動作を "Clean"、ライトバックして無効化する動作を "Clean and Flush" と記述してる場合がありますが、本 SDK の API では GAMECUBE や Nintendo64 などの API との統一性を重視するため、無効化を "Invalidate"、ライトバックを "Store"、ライトバックして無効化する動作を "Flush" で統一しています。ご注意ください。

## 内部動作

システム制御コプロセッサのレジスタ7を操作しています。

この関数は指定領域をキャッシュライン単位に分割して操作を繰り返すため、領域サイズに比例した処理時間を必要とします。領域のサイズがある程度大きく、かつ、アプリケーション全体のキャッシュを正しく管理できる状況であれば、`DC_FlushAll()` を呼び出すほうが処理時間は短くなります。

## 参照

`IC_InvalidateAll IC_InvalidateRange
DC_InvalidateAll DC_InvalidateRange
DC_StoreAll DC_StoreRange
DC_FlushAll`

## 履歴

2005/11/14 startAddrの型をconst void*に変更
2005/04/19 領域サイズに比例した処理時間を要する旨を追記
2003/12/22 初版