mirror of
https://github.com/rvtr/ntr_bootrom.git
synced 2025-10-31 07:11:11 -04:00
411 lines
17 KiB
C
411 lines
17 KiB
C
//======================================================================
|
||
// 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)
|
||
|
||
//・割り込み処理のアドレスをセットします。
|
||
|
||
|
||
//----------------------------------------------------------------------
|
||
// DMA セット
|
||
//----------------------------------------------------------------------
|
||
|
||
//#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が終了したか
|
||
// どうかをチェックすると続くコードへの影響を確実に回避できます。
|
||
|
||
|
||
//----------------------------------------------------------------------
|
||
// 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クリアします。
|
||
//・クリアデータはスタックに置かれ、それをデスティネーションへコピーします。
|
||
//・DmaClearIf/DmaClearArrayIfは終了時に割り込み要求を発生します。
|
||
//・DmaClearArray/DmaClearArrayIfはデスティネーション配列全体をクリアします。
|
||
//
|
||
//・引数:
|
||
// dmaNo DMA番号
|
||
// data クリアデータ
|
||
// destp デスティネーションアドレス
|
||
// size クリアバイト数
|
||
// bit 転送ビット幅(16|32)
|
||
//
|
||
//
|
||
//※CPU内部RAM上のプログラムにてDMAを起動すると
|
||
// その次の命令が先に実行されます。
|
||
// よって、DMA直後に転送先をCPUにて変更しようとした場合、
|
||
// 読み込み/書き戻しの間にDMAが起動されてしまいますので、
|
||
// DMAの転送先のデータが意図していない値になる場合があります。
|
||
// その場合にはWaitDma()を直後に挿入して、DMAが終了したか
|
||
// どうかをチェックすると続くコードへの影響を確実に回避できます。
|
||
|
||
//----------------------------------------------------------------------
|
||
// 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でコピーします。
|
||
//・DmaCopyIf/DmaCopyArrayIfは終了時に割り込み要求を発生します。
|
||
//・DmaCopyArray/DmaCopyArrayIfはソース配列全体をコピーします。
|
||
//
|
||
//・引数:
|
||
// 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_DmaCopyIf/H_DmaCopyArrayIfは終了時に割り込み要求を発生します。
|
||
//・H_DmaCopyArray/H_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_DmaCopyIf/V_DmaCopyArrayIfは終了時に割り込み要求を発生します。
|
||
//・V_DmaCopyArray/V_DmaCopyArrayIfはソース配列全体をコピーします。
|
||
//
|
||
//・引数:
|
||
// dmaNo DMA番号
|
||
// srcp ソースアドレス
|
||
// destp デスティネーションアドレス
|
||
// size 転送バイト数
|
||
// bit 転送ビット幅(16|32)
|
||
|
||
//----------------------------------------------------------------------
|
||
// DMA 終了待ち
|
||
//----------------------------------------------------------------------
|
||
|
||
#define WaitDma(dmaNo) \
|
||
{ \
|
||
vu32 *(dmaCntp) = (vu32 *)REG_DMA##dmaNo; \
|
||
while (dmaCntp[2] & DMA_ENABLE) ; \
|
||
}
|
||
|
||
//・DMAの終了を待ちます。
|
||
//
|
||
//・引数:
|
||
// dmaNo DMA番号
|
||
|
||
|
||
//----------------------------------------------------------------------
|
||
// 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番号
|
||
|
||
|
||
//----------------------------------------------------------------------
|
||
// CPU クリア
|
||
//----------------------------------------------------------------------
|
||
|
||
#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)
|
||
|
||
//----------------------------------------------------------------------
|
||
// CPU コピー
|
||
//----------------------------------------------------------------------
|
||
|
||
#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)
|
||
|
||
//----------------------------------------------------------------------
|
||
// CPU 高速クリア
|
||
//----------------------------------------------------------------------
|
||
|
||
#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 クリアバイト数
|
||
|
||
//----------------------------------------------------------------------
|
||
// CPU 高速コピー
|
||
//----------------------------------------------------------------------
|
||
|
||
#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
|