ntr_bootrom/trunk/IrisSubp/include/IrisSubpMacro.h

411 lines
17 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//======================================================================
// IrisSubpMacro.h
// IRISサブプロセッサ 標準マクロ関数
//
// Copyright (C) 2002-2003 NINTENDO Co.,Ltd.
//======================================================================
#ifndef _IRIS_SUBP_MACRO_H
#define _IRIS_SUBP_MACRO_H
#ifdef __cplusplus
extern "C" {
#endif
#include <IrisSubpTarget.h>
#include <IrisSubpTypes.h>
#include <IrisSubpSystemCall.h>
//----------------------------------------------------------------------
// データ読み込み
//----------------------------------------------------------------------
#define ReadData(readp, bit) (*(vu##bit *)(readp))
//----------------------------------------------------------------------
// データ書き込み
//----------------------------------------------------------------------
#define WriteData(writep, data, bit) \
\
(*(vu##bit *)(writep) = (data))
//----------------------------------------------------------------------
// データ コピー
//----------------------------------------------------------------------
#define CopyData(readp, writep, bit) \
\
(*(vu##bit *)(writep) = *(vu##bit *)(readp))
//----------------------------------------------------------------------
// アドレス境界整列バッファの有効化
//----------------------------------------------------------------------
#ifdef __CC_ARM
#define EnableAlignBuf(alignBuf) \
{ \
vu16 alignBufTmp = *(vu16 *)alignBuf; \
}
#else
#define EnableAlignBuf(alignBuf) ((void) 0)
#endif
//----------------------------------------------------------------------
// 割り込みアドレス セット
//----------------------------------------------------------------------
#define SetIntrAddr(intrp) \
\
(*(vu32 *)INTR_VECTOR_BUF = (vu32 )intrp)
//・割り込み処理のアドレスをセットします。
//----------------------------------------------------------------------
// セット
//----------------------------------------------------------------------
//#define SIMULATOR
#ifndef SIMULATOR
#define DmaSet(dmaNo, srcp, destp, dmaCntData) \
{ \
vu32 *dmaCntp = &((vu32 *)REG_DMA0)[dmaNo * 3]; \
dmaCntp[0] = (vu32 )(srcp); \
dmaCntp[1] = (vu32 )(destp); \
dmaCntp[2] = (vu32 )(dmaCntData); \
{u32 dummy = dmaCntp[2];} \
}
#define DmaSetAsync(dmaNo, srcp, destp, dmaCntData) \
{ \
vu32 *dmaCntp = &((vu32 *)REG_DMA0)[dmaNo * 3]; \
dmaCntp[0] = (vu32 )(srcp); \
dmaCntp[1] = (vu32 )(destp); \
dmaCntp[2] = (vu32 )(dmaCntData); \
}
#else
#define DmaSet(dmaNo, srcp, destp, dmaCntData) \
{ \
int i; \
for (i=0; i<(dmaCntData & 0x1ffff); i++) \
if ((dmaCntData) & DMA_SRC_FIX) { \
if ((dmaCntData) & DMA_32BIT_BUS) \
((vu32 *)(destp))[i] = ((vu32 *)(srcp))[0]; \
else ((vu16 *)(destp))[i] = ((vu16 *)(srcp))[0]; \
} else { \
if ((dmaCntData) & DMA_32BIT_BUS) \
((vu32 *)(destp))[i] = ((vu32 *)(srcp))[i]; \
else ((vu16 *)(destp))[i] = ((vu16 *)(srcp))[i]; \
} \
}
#define DmaSetAsync(dmaNo, srcp, destp, dmaCntData) \
DmaSet( dmaNo, srcp, destp, dmaCntData)
#endif
//・DMAコントローラにパラメータをセットします。
//・SIMULATERを定義するとCPUでシミュレートします。
// GDBでデバッグする場合などに有効です。
//・最後にDMA起動待ちのために"LDR"命令が挿入されます。
//
//・引数:
// dmaNo DMA番号
// srcp ソースアドレス
// destp デスティネーションアドレス
// dmaCntData パラメータデータ
//
//※CPU内部RAM上のプログラムにてDMAを起動すると
// その次の命令が先に実行されます。
// よって、DMA直後に転送先をCPUにて変更しようとした場合、
// 読み込み書き戻しの間にDMAが起動されてしまいますので、
// DMAの転送先のデータが意図していない値になる場合があります。
// その場合にはWaitDma()を直後に挿入して、DMAが終了したか
// どうかをチェックすると続くコードへの影響を確実に回避できます。
//----------------------------------------------------------------------
// クリア
//----------------------------------------------------------------------
#define DmaClear(dmaNo, data, destp, size, bit) \
{ \
vu##bit tmp = (data); \
DmaSet(dmaNo, &tmp, destp, ( \
DMA_ENABLE | DMA_TIMMING_IMM | \
DMA_SRC_FIX | DMA_DEST_INC | \
DMA_##bit##BIT_BUS | ((size)/(bit/8)))); \
}
#define DmaClearIf(dmaNo, data, destp, size, bit) \
{ \
vu##bit tmp = (data); \
DmaSet(dmaNo, &tmp, destp, ( \
DMA_ENABLE | DMA_TIMMING_IMM | \
DMA_IF_ENABLE | \
DMA_SRC_FIX | DMA_DEST_INC | \
DMA_##bit##BIT_BUS | ((size)/(bit/8)))); \
}
#define DmaClearArray( dmaNo, data, destp, bit) \
DmaClear( dmaNo, data, destp, sizeof(destp), bit)
#define DmaClearArrayIf(dmaNo, data, destp, bit) \
DmaClearIf( dmaNo, data, destp, sizeof(destp), bit)
//・DMAでRAMクリアします。
//・クリアデータはスタックに置かれ、それをデスティネーションへコピーします。
//・DmaClearIfDmaClearArrayIfは終了時に割り込み要求を発生します。
//・DmaClearArrayDmaClearArrayIfはデスティネーション配列全体をクリアします。
//
//・引数:
// dmaNo DMA番号
// data クリアデータ
// destp デスティネーションアドレス
// size クリアバイト数
// bit 転送ビット幅16|32
//
//
//※CPU内部RAM上のプログラムにてDMAを起動すると
// その次の命令が先に実行されます。
// よって、DMA直後に転送先をCPUにて変更しようとした場合、
// 読み込み書き戻しの間にDMAが起動されてしまいますので、
// DMAの転送先のデータが意図していない値になる場合があります。
// その場合にはWaitDma()を直後に挿入して、DMAが終了したか
// どうかをチェックすると続くコードへの影響を確実に回避できます。
//----------------------------------------------------------------------
// コピー
//----------------------------------------------------------------------
#define DmaCopy(dmaNo, srcp, destp, size, bit) \
\
DmaSet(dmaNo, srcp, destp, ( \
DMA_ENABLE | DMA_TIMMING_IMM | \
DMA_SRC_INC | DMA_DEST_INC | \
DMA_##bit##BIT_BUS | ((size)/((bit)/8))))
#define DmaCopyIf(dmaNo, srcp, destp, size, bit) \
\
DmaSet(dmaNo, srcp, destp, ( \
DMA_ENABLE | DMA_TIMMING_IMM | \
DMA_IF_ENABLE | \
DMA_SRC_INC | DMA_DEST_INC | \
DMA_##bit##BIT_BUS | ((size)/(bit/8))))
#define DmaCopyArray( dmaNo, srcp, destp, bit) \
DmaCopy( dmaNo, srcp, destp, sizeof(srcp), bit)
#define DmaCopyArrayIf(dmaNo, srcp, destp, bit) \
DmaCopyIf( dmaNo, srcp, destp, sizeof(srcp), bit)
//・DMAでコピーします。
//・DmaCopyIfDmaCopyArrayIfは終了時に割り込み要求を発生します。
//・DmaCopyArrayDmaCopyArrayIfはソース配列全体をコピーします。
//
//・引数:
// dmaNo DMA番号
// srcp ソースアドレス
// destp デスティネーションアドレス
// size 転送バイト数
// bit 転送ビット幅16|32
//
//
//※CPU内部RAM上のプログラムにてDMAを起動すると
// その次の命令が先に実行されます。
// よって、DMA直後に転送先をCPUにて変更しようとした場合、
// 読み込み書き戻しの間にDMAが起動されてしまいますので、
// DMAの転送先のデータが意図していない値になる場合があります。
// その場合にはWaitDma()を直後に挿入して、DMAが終了したか
// どうかをチェックすると続くコードへの影響を確実に回避できます。
//----------------------------------------------------------------------
// HブランクDMA コピー
//----------------------------------------------------------------------
#define H_DmaCopy(dmaNo, srcp, destp, size, bit) \
\
DmaSet(dmaNo, srcp, destp, ( \
DMA_ENABLE | DMA_TIMMING_H_BLANK | \
DMA_SRC_INC | DMA_DEST_RELOAD | \
DMA_CONTINUOUS_ON | \
DMA_##bit##BIT_BUS | ((size)/((bit)/8))))
#define H_DmaCopyIf(dmaNo, srcp, destp, size, bit) \
\
DmaSet(dmaNo, srcp, destp, ( \
DMA_ENABLE | DMA_TIMMING_H_BLANK | \
DMA_IF_ENABLE | \
DMA_SRC_INC | DMA_DEST_RELOAD | \
DMA_CONTINUOUS_ON | \
DMA_##bit##BIT_BUS | ((size)/(bit/8))))
#define H_DmaCopyArray( dmaNo, srcp, destp, bit) \
H_DmaCopy( dmaNo, srcp, destp, sizeof(srcp), bit)
#define H_DmaCopyArrayIf(dmaNo, srcp, destp, bit) \
H_DmaCopyIf( dmaNo, srcp, destp, sizeof(srcp), bit)
//・Hブランクに同期してDMAでコピーします。
//・H_DmaCopyIfH_DmaCopyArrayIfは終了時に割り込み要求を発生します。
//・H_DmaCopyArrayH_DmaCopyArrayIfはソース配列全体をコピーします。
//
//・引数:
// dmaNo DMA番号
// srcp ソースアドレス
// destp デスティネーションアドレス
// size 転送バイト数
// bit 転送ビット幅16|32
//----------------------------------------------------------------------
// VブランクDMA コピー
//----------------------------------------------------------------------
#define V_DmaCopy(dmaNo, srcp, destp, size, bit) \
\
DmaSet(dmaNo, srcp, destp, ( \
DMA_ENABLE | DMA_TIMMING_V_BLANK | \
DMA_SRC_INC | DMA_DEST_INC | \
DMA_##bit##BIT_BUS | ((size)/(bit/8))))
#define V_DmaCopyIf(dmaNo, srcp, destp, size, bit) \
\
DmaSet(dmaNo, srcp, destp, ( \
DMA_ENABLE | DMA_TIMMING_V_BLANK | \
DMA_IF_ENABLE | \
DMA_SRC_INC | DMA_DEST_INC | \
DMA_##bit##BIT_BUS | ((size)/(bit/8))))
#define V_DmaCopyArray( dmaNo, srcp, destp, bit) \
V_DmaCopy( dmaNo, srcp, destp, sizeof(srcp), bit)
#define V_DmaCopyArrayIf(dmaNo, srcp, destp, bit) \
V_DmaCopyIf( dmaNo, srcp, destp, sizeof(srcp), bit)
//・Vブランクに同期してDMAでコピーします。
//・V_DmaCopyIfV_DmaCopyArrayIfは終了時に割り込み要求を発生します。
//・V_DmaCopyArrayV_DmaCopyArrayIfはソース配列全体をコピーします。
//
//・引数:
// dmaNo DMA番号
// srcp ソースアドレス
// destp デスティネーションアドレス
// size 転送バイト数
// bit 転送ビット幅16|32
//----------------------------------------------------------------------
// 終了待ち
//----------------------------------------------------------------------
#define WaitDma(dmaNo) \
{ \
vu32 *(dmaCntp) = (vu32 *)REG_DMA##dmaNo; \
while (dmaCntp[2] & DMA_ENABLE) ; \
}
//・DMAの終了を待ちます。
//
//・引数:
// dmaNo DMA番号
//----------------------------------------------------------------------
// ストップ
//----------------------------------------------------------------------
#define StopDma(dmaNo) \
{ \
vu16 *(dmaCntp) = &((vu16 *)REG_DMA0)[dmaNo * 6]; \
dmaCntp[5] &= ~((DMA_TIMMING_MASK | DMA_CONTINUOUS_ON) \
>> 16); \
dmaCntp[5] &= ~( DMA_ENABLE >> 16); \
{u32 dummy = dmaCntp[5];} \
}
//・DMAを停止します。
//・但し、処理中にDMAの自動起動が掛かった場合は一度だけDMAが実行されます。
//
//・引数:
// dmaNo DMA番号
//----------------------------------------------------------------------
// クリア
//----------------------------------------------------------------------
#define CpuClear(data, destp, size, bit) SVC_CpuClear(data, (void *)(destp), size, bit)
#define CpuClearArray(data, destp, bit) \
CpuClear( data, destp, sizeof(destp), bit)
//・CPUでRAMクリアするシステムコールを呼び出します。
//・クリアデータはスタックに置かれ、それをデスティネーションへコピーします。
//・CpuClearArrayはデスティネーション配列全体をクリアします。
//
//・引数:
// data クリアデータ
// destp デスティネーションアドレス
// size クリアバイト数
// bit 転送ビット幅16|32
//----------------------------------------------------------------------
// コピー
//----------------------------------------------------------------------
#define CpuCopy(srcp, destp, size, bit) SVC_CpuCopy((void *)(srcp), (void *)(destp), size, bit)
#define CpuCopyArray(srcp, destp, bit) \
CpuCopy( srcp, destp, sizeof(srcp), bit)
//・CPUでコピーするシステムコールを呼び出します。
//・CpuCopyArrayはソース配列全体をコピーします。
//
//・引数:
// srcp ソースアドレス
// destp デスティネーションアドレス
// size 転送バイト数
// bit 転送ビット幅16|32
//----------------------------------------------------------------------
// 高速クリア
//----------------------------------------------------------------------
#define CpuClearFast(data, destp, size) SVC_CpuClearFast(data, (void *)(destp), size)
#define CpuClearArrayFast(data, destp) \
CpuClearFast( data, destp, sizeof(destp))
//・CPUで高速にRAMクリアするシステムコールを呼び出します。
//・クリアデータはスタックに置かれ、それをデスティネーションへコピーします。
//・CpuClearArrayFastはデスティネーション配列全体をクリアします。
//
//・引数:
// data クリアデータ
// destp デスティネーションアドレス
// size クリアバイト数
//----------------------------------------------------------------------
// 高速コピー
//----------------------------------------------------------------------
#define CpuCopyFast(srcp, destp, size) SVC_CpuCopyFast((void *)(srcp), (void *)(destp), size)
#define CpuCopyArrayFast(srcp, destp) \
CpuCopyFast( srcp, destp, sizeof(srcp))
//・CPUで高速にコピーするシステムコールを呼び出します。
//・CpuCopyArrayFastはソース配列全体をコピーします。
//
//・引数:
// srcp ソースアドレス
// destp デスティネーションアドレス
// size 転送バイト数
#ifdef __cplusplus
} // extern "C"
#endif
#endif // _IRIS_SUBP_MACRO_H