# Shinobi Library

1998/10/4

# キャッシュ関数

## 0. 概要

> キャッシュ関数は、SH4 のキャッシュユニットを管理し、キャッシュの初期化、無効化(インバリデート)、パージ、内蔵メモリとしてのキャッシュ領域の管理を行います。
> キャッシュコントロールレジスタの操作は、P2 領域から行う必要があるので、syCacheInit, syCacheICI, syCacheOCI の各 API はマクロで提供され、内部で、syCacheInit_P2, syCacheICI_P2, syCacheOCI_P2 関数を呼び出します。

## 1.データ型

マクロ名 | 値
--- | ---
SYD_CACHE_FORM_IC_INDEX | 0x00008000
SYD_CACHE_FORM_OC_INDEX | 0x00000080
SYD_CACHE_FORM_IC_ENABLE | 0x00000100
SYD_CACHE_FORM_OC_ENABLE | 0x00000001
SYD_CACHE_FORM_OC_RAM | 0x00000020
SYD_CACHE_FORM_P1_CB | 0x00000004
SYD_CACHE_FORM_P0_WT | 0x00000002

typedef Uint32 SY_CACHE_FORM;

## 2. 関数リファレンス

### 2.1 関数一覧

関数 | 機能
--- | ---
syCacheInit＜新規＞ | 関数の初期化
syCacheICI＜新規＞ | すべてのキャッシュの無効化
syCacheOCl＜新規＞ | オペランドキャッシュのすべてのエントリを無効化
syCacheOCBI＜新規＞ | オペランドキャッシュブロックの無効化
syCacheOCBP＜新規＞ | オペランドキャッシュブロックのパージ
syCacheOCWB＜新規＞ | オペランドキャッシュブロックの書き戻し
syCachePREF＜新規＞ | オペランドキャッシュのプリフェッチ
syCacheMOVCAL＜新規＞ | MOVCA.L命令の実行

### 2.2 関数API

## syCacheInit

［関数］
  Void syCacheInit(SY_CACH_FORM form)
［入力］
  form
    キャッシュのタイプ。以下のタイプのORを取って指定する。

    SYD_CACHE_IC_INDEX | インストラクションキャッシュをインデックスモードにする
    SYD_CACHE_OC_INDEX | オペランドキャッシュをインデックスモードにする
    SYD_CACHE_IC_ENABLE | インストラクションキャッシュをイネーブル
    SYD_CACHE_OC_ENABLE | オペランドキャッシュをイネーブル
    SYD_CACHE_OC_RAM | オペランドキャッシュをRAMモードにする
    SYD_CACHE_P1_CB | P1領域をコピーバックモードに
    SYD_CACHE_P0_WT | P0領域をライトバックモードに

［出力］
  なし
［戻値］
  なし
［機能］
  キャッシュ関数を初期化します。
［備考］
  この関数は、syHwInit関数内で呼ばれており、かつ、ここで設定する値は、アプリケーションで勝手に書きかえることは禁止されています。
  初期化時の設定値は次の通りです。
  SYD_CACHE_FORM_IC_ENABLE | SYD_CACHE_FORM_OC_ENABLE | SYD_CACHE_FORM_P1_CB
  オペランドキャッシュのRAMモードはSHINOBIライブラリとしては禁止します。

## syCacheICI

［関数］
  Void syCacheICI(Void)
［入力］
  なし
［出力］
  なし
［戻値］
  なし
［機能］
  インストラクションキャッシュのすべてのエントリをインバリデートします。
［備考］
  なし

## syCacheOCI

［関数］
  Void syCacheOCI(Void)
［入力］
  なし
［出力］
  なし
［戻値］
  なし
［機能］
  オペランドキャッシュのすべてのエントリをインバリデートします。
［備考］
  なし

## syCacheOCBI

［関数］
  Void syCacheOCBI(void *address, Uint32 size)
［入力］
  address
    先頭アドレス
  size
    サイズ
［出力］
  なし
［戻値］
  なし
［機能］
  指定された領域を含む全キャッシュブロックをインバリデートします。（インバリデート=キャッシュ内容を捨てる）
［用例］

［備考］
  P2領域(0xa0000000h〜0xbfffffff)のアドレスが指定された時は、P0領域に置き換えインバリデートします。

## syCacheOCBP

［関数］
  Void syCacheOCBP(Void *address, Uint32 size)
［入力］
  address
    先頭アドレス
  size
    サイズ
［出力］
  なし
［戻値］
  なし
［機能］
  指定された領域を含む全キャッシュブロックをパージします。（パージ=ライトバック後に捨てる）
［備考］
  P2領域(0xa0000000h〜0xbfffffff)のアドレスが指定された時は、P0領域に置き換えパージします。つまり、キャッシュ不可のP2領域であっても、メモリの実体に対する変更が行われます。

## syCacheOCWB

［関数］
  Void syCacheOCWB(Void *address, Uint32 size);
［入力］
  address
    先頭アドレス
  size
    サイズ
［出力］
  なし
［戻値］
  なし
［機能］
  指定された領域を含む全キャッシュブロックをライトバックします。（ライトバック=実メモリに書き戻す）
［備考］
  P2領域(0xa0000000h〜0xbfffffff)のアドレスが指定された時は、P0領域に置き換えライトバックします。つまり、キャッシュ不可のP2領域であっても、メモリの実体に対する変更が行われます。

## syCachePREF

［関数］
  Void syCachePREF(Void *address, Uint32 size)
［入力］
  address
    先頭アドレス
  size
    サイズ
［出力］
  なし
［戻値］
  なし
［機能］
  指定された領域に対し、プリフェッチを実行します。
［備考］
  なし

## syCacheMOVCAL

［関数］
  Void syCacheMOVCAL(Void *address, Uint32 size)
［入力］
  address
    先頭アドレス
  size
    サイズ
［出力］
  なし
［戻値］
  なし
［機能］
  指定された領域を含む全キャッシュブロックに MOVCA.L を実行します。（キャッシュブロックの確保=キャッシュミス時にブロックリードを行わずにキャッシュ上にだけデータを書込む）
［備考］
  指定する領域の先頭や末尾が 32 bytes に整合されていない場合に本関数を実行すると、隣接するデータが壊れます。

オーバービューに戻る
TOPに戻る