diff --git a/build/buildtools/commondefs b/build/buildtools/commondefs index cec7bcc..a75be73 100644 --- a/build/buildtools/commondefs +++ b/build/buildtools/commondefs @@ -121,8 +121,10 @@ ifeq ($(TWL_CODEGEN_PROC),ARM9) TWL_LIBS_BASE ?= \ libos \ + libpxi \ libmi \ libvlink \ + libctrdg \ ifdef TWL_PROFILE_TYPE TWL_LIBS_BASE += libos.$(TWL_PROFILE_TYPE) @@ -132,6 +134,7 @@ else # ($(TWL_CODEGEN_PROC),ARM7) TWL_LIBS_BASE ?= \ libos_sp \ + libpxi_sp \ libmi_sp \ libvlink_sp \ libnvram_sp \ diff --git a/build/libraries/Makefile b/build/libraries/Makefile index 7a6d36e..b5d7db6 100644 --- a/build/libraries/Makefile +++ b/build/libraries/Makefile @@ -23,9 +23,11 @@ include $(TWLSDK_ROOT)/build/buildtools/commondefs SUBDIRS = \ init \ os \ + pxi \ mi \ vlink \ spi \ + ctrdg \ #---------------------------------------------------------------------------- diff --git a/build/libraries/ctrdg/ARM9/Makefile b/build/libraries/ctrdg/ARM9/Makefile new file mode 100644 index 0000000..2dfda20 --- /dev/null +++ b/build/libraries/ctrdg/ARM9/Makefile @@ -0,0 +1,61 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: TwlSDK - libraries - ctrdg +# File: Makefile +# +# Copyright 2007 Nintendo. All rights reserved. +# +# These coded instructions, statements, and computer programs contain +# proprietary information of Nintendo of America Inc. and/or Nintendo +# Company Ltd., and are protected by Federal copyright law. They may +# not be disclosed to third parties or copied or duplicated in any form, +# in whole or in part, without the prior written consent of Nintendo. +# +# $Log: $ +# $NoKeywords: $ +#---------------------------------------------------------------------------- + + +SUBDIRS = + +#---------------------------------------------------------------------------- + +# build ARM & THUMB libraries +TWL_CODEGEN_ALL = True + +TWL_PROC = ARM9 + +SRCDIR = ../common . +SRCDIR += $(TWL_NITROSDK_ROOT)/build/libraries/ctrdg/common/src \ + $(TWL_NITROSDK_ROOT)/build/libraries/ctrdg/ARM9/src \ + +SRCS = \ + ctrdg.c \ + ctrdg_proc.c \ + ctrdg_vib.c \ + ctrdg_backup.c \ + ctrdg_flash_common.c \ + ctrdg_flash_AT29LV512.c \ + ctrdg_flash_LE26FV10N1TS-10.c \ + ctrdg_flash_LE39FW512.c \ + ctrdg_flash_MX29L010.c \ + ctrdg_flash_MX29L512.c \ + ctrdg_sram.c \ + ctrdg_task.c + + +TARGET_LIB = libctrdg$(TWL_LIBSUFFIX).a + +include $(TWLSDK_ROOT)/build/buildtools/commondefs + +INSTALL_TARGETS = $(TARGETS) +INSTALL_DIR = $(TWL_INSTALL_LIBDIR) + +#---------------------------------------------------------------------------- + +do-build: $(TARGETS) + + +include $(TWLSDK_ROOT)/build/buildtools/modulerules + +#===== End of Makefile ===== diff --git a/build/libraries/ctrdg/ARM9/ctrdg_proc.c b/build/libraries/ctrdg/ARM9/ctrdg_proc.c new file mode 100644 index 0000000..d6cfac9 --- /dev/null +++ b/build/libraries/ctrdg/ARM9/ctrdg_proc.c @@ -0,0 +1,506 @@ +/*---------------------------------------------------------------------------* + Project: NitroSDK - CTRDG + File: ctrdg.c + + Copyright 2003-2006 Nintendo. All rights reserved. + + These coded instructions, statements, and computer programs contain + proprietary information of Nintendo of America Inc. and/or Nintendo + Company Ltd., and are protected by Federal copyright law. They may + not be disclosed to third parties or copied or duplicated in any form, + in whole or in part, without the prior written consent of Nintendo. + + $Log: ctrdg_proc.c,v $ + Revision 1.28 2006/05/02 02:04:47 kitase_hirotake + 不必要なデバッグ出力の削除 + + Revision 1.27 2006/05/02 02:03:23 kitase_hirotake + 不必要なデバッグ出力の削除 + + Revision 1.26 2006/05/01 06:04:55 yada + avoid warning + + Revision 1.25 2006/04/28 11:04:22 yada + add about PHI Clock setting + + Revision 1.24 2006/04/05 10:48:30 okubata_ryoma + AGBバックアップライブラリのSDK収録のための変更 + + Revision 1.23 2006/02/22 02:27:10 kitase_hirotake + 前回の修正を戻す(デフォルトで terminate を行わないように修正) + + Revision 1.22 2006/02/13 00:25:27 kitase_hirotake + デフォルトで terminate を行わないように修正 + + Revision 1.21 2006/02/10 02:53:18 yosizaki + support memory protection of cartridge access. + + Revision 1.20 2006/02/08 00:04:25 kitase_hirotake + Warning 修正 + + Revision 1.19 2006/02/07 08:13:09 kitase_hirotake + CTRDG_CheckPulledOut 追加 + + Revision 1.18 2006/01/18 02:11:20 kitase_hirotake + do-indent + + Revision 1.17 2005/11/01 02:57:45 okubata_ryoma + CTRDG_SendToARM7の追加 + + Revision 1.16 2005/06/21 02:46:40 yada + insert calling cache function + + Revision 1.15 2005/02/28 05:26:03 yosizaki + do-indent. + + Revision 1.14 2005/01/13 01:58:51 yada + number of using DMA changed. DMA0 -> DMA1 + + Revision 1.13 2005/01/12 11:09:04 takano_makoto + fix copyright header. + + Revision 1.12 2005/01/12 00:41:38 yada + change a little, around an auto variable + + Revision 1.11 2004/11/24 04:38:18 yada + just fix typo + + Revision 1.10 2004/09/28 05:06:15 yada + fix a little + + Revision 1.9 2004/09/27 13:46:42 yada + only arrange comments + + Revision 1.8 2004/09/17 00:07:27 yada + avoid warning by overriding pxi callback + + Revision 1.7 2004/09/16 04:15:24 yada + fix a little + + Revision 1.6 2004/09/15 09:50:12 yada + on default, pulling out cartridge doesn't cause terminate. + + Revision 1.5 2004/09/15 05:55:46 yada + change include + + Revision 1.4 2004/09/14 13:07:26 yada + fix small bug + + Revision 1.3 2004/09/14 13:01:50 yada + CallbackForPulledOut->PulledOutCallback + + Revision 1.2 2004/09/14 10:52:30 yada + fix address data sent to ARM7 via PXI + + Revision 1.1 2004/09/14 09:58:21 yada + initial release + + $NoKeywords: $ + *---------------------------------------------------------------------------*/ +#include +#include <../include/ctrdg_work.h> + +extern void CTRDGi_InitCommon(void); +extern void CTRDGi_SendtoPxi(u32 data); + +//---- pxi callbacks +static void CTRDGi_CallbackForInitModuleInfo(PXIFifoTag tag, u32 data, BOOL err); +static void CTRDGi_PulledOutCallback(PXIFifoTag tag, u32 data, BOOL err); +static void CTRDGi_CallbackForSetPhi(PXIFifoTag tag, u32 data, BOOL err); + +extern CTRDGWork CTRDGi_Work; + +//---- lock for pxi +static int CTRDGi_Lock = FALSE; + +//---- user callback +CTRDGPulledOutCallback CTRDG_UserCallback = NULL; + +/* カートリッジ抜けコールバックは 2 度呼ばれない */ +static BOOL isCartridgePullOut = FALSE; +static BOOL skipCheck = FALSE; +static BOOL ctrdg_already_pullout = FALSE; + +//================================================================================ +// INIT +//================================================================================ +/*---------------------------------------------------------------------------* + Name: CTRDG_Init + + Description: initialize cartridge functions + + Arguments: None + + Returns: None + *---------------------------------------------------------------------------*/ +void CTRDG_Init(void) +{ + static BOOL isInitialized; + + if (isInitialized) + { + return; + } + isInitialized = TRUE; + + CTRDGi_InitCommon(); + + /* カートリッジ抜けコールバックが 2 度以上呼ばれないように */ + ctrdg_already_pullout = FALSE; + +#ifndef SDK_SMALL_BUILD + //---- setting PXI + PXI_Init(); + while (!PXI_IsCallbackReady(PXI_FIFO_TAG_CTRDG, PXI_PROC_ARM7)) + { + } + PXI_SetFifoRecvCallback(PXI_FIFO_TAG_CTRDG, CTRDGi_CallbackForInitModuleInfo); + + CTRDGi_InitModuleInfo(); + + PXI_SetFifoRecvCallback(PXI_FIFO_TAG_CTRDG, NULL); // to avoid warning by overriding + PXI_SetFifoRecvCallback(PXI_FIFO_TAG_CTRDG, CTRDGi_PulledOutCallback); + + //---- init user callback + CTRDG_UserCallback = NULL; + + // AGBBackupアクセス関数の非同期版を使用するためのTaskThread作成 + { + static CTRDGiTaskWork CTRDGTaskList; + CTRDGi_InitTaskThread(&CTRDGTaskList); + } + + PXI_SetFifoRecvCallback(PXI_FIFO_TAG_CTRDG_PHI, CTRDGi_CallbackForSetPhi ); + + /* + * ユーザが明示的に enable を指定しない限りアクセス無効. + * (オプションカートリッジでないなら書き込みアクセスも禁止) + */ +#if defined(SDK_ARM9) + CTRDG_Enable(FALSE); +#endif +#endif // SDK_SMALL_BUILD +} + +/*---------------------------------------------------------------------------* + Name: CTRDGi_InitModuleInfo + + Description: initialize the information of peripheral device around cartridge + + Because try lock cartridge, in case another processor had locked, + wait till its was released. + + To avoid other bus master interrupts, + DMA1 is used for accessing cartridge. + This is a compatibility in future. + + Arguments: None + + Returns: None + *---------------------------------------------------------------------------*/ +static CTRDGHeader headerBuf ATTRIBUTE_ALIGN(32); + +void CTRDGi_InitModuleInfo(void) +{ +#ifndef SDK_SMALL_BUILD + + static BOOL isInitialized; + CTRDGLockByProc lockInfo; + OSIrqMask lastIE; + BOOL lastIME; + + CTRDGModuleInfo *cip = CTRDGi_GetModuleInfoAddr(); + + if (isInitialized) + { + return; + } + isInitialized = TRUE; + + if (!(reg_OS_PAUSE & REG_OS_PAUSE_CHK_MASK)) + { + return; + } + + lastIE = OS_SetIrqMask(OS_IE_SPFIFO_RECV); + lastIME = OS_EnableIrq(); + + //---- get privilege for accessing cartridge + CTRDGi_LockByProcessor(CTRDGi_Work.lockID, &lockInfo); + + //---- read information of peripheral devices + { + MIProcessor proc = MI_GetMainMemoryPriority(); + CTRDGRomCycle rc; + + // set the latest access cycle + CTRDGi_ChangeLatestAccessCycle(&rc); + + // set main memory priority for avoiding DMA stole by ARM7 access + MI_SetMainMemoryPriority(MI_PROCESSOR_ARM9); + + // 16bit access in order to have much enough access interval + DC_InvalidateRange(&((u8 *)&headerBuf)[0x80], sizeof(headerBuf) - 0x80); + MI_DmaCopy16(1, (void *)(HW_CTRDG_ROM + 0x80), + &((u8 *)&headerBuf)[0x80], sizeof(headerBuf) - 0x80); + + // restore main memory priority + MI_SetMainMemoryPriority(proc); + + // restore access cycle + CTRDGi_RestoreAccessCycle(&rc); + } + + //---- release privilege for accessing cartridge + CTRDGi_UnlockByProcessor(CTRDGi_Work.lockID, &lockInfo); + + //---- copy the information of peripheral devices to system area + { + int i; + CTRDGHeader *chb = &headerBuf; + + cip->moduleID.raw = chb->moduleID; + for (i = 0; i < 3; i++) + { + cip->exLsiID[i] = chb->exLsiID[i]; + } + cip->makerCode = chb->makerCode; + cip->gameCode = chb->gameCode; + } + + //---- copy NINTENDO logo data in the ARM9 system ROM to main memory + MI_CpuCopy32((void *)CTRDG_SYSROM9_NINLOGO_ADR, &headerBuf.nintendoLogo, + sizeof(headerBuf.nintendoLogo)); + DC_FlushAll(); + + //---- send message to ARM7 + CTRDGi_SendtoPxi(CTRDG_PXI_COMMAND_INIT_MODULE_INFO | + (((u32)&headerBuf - HW_MAIN_MEM) >> 5) << CTRDG_PXI_COMMAND_PARAM_SHIFT); + + //---- wait till ARM7 finish initialize + while (CTRDGi_Work.subpInitialized != TRUE) + { + SVC_WaitByLoop(1); + } + + (void)OS_RestoreIrq(lastIME); + (void)OS_SetIrqMask(lastIE); + +#endif // SDK_SMALL_BUILD +} + +/*---------------------------------------------------------------------------* + Name: CTRDGi_CallbackForInitModuleInfo + + Description: callback to receive data from PXI + + Arguments: tag : tag from PXI (unused) + data : data from PXI + err : error bit (unused) + + Returns: None + *---------------------------------------------------------------------------*/ +static void CTRDGi_CallbackForInitModuleInfo(PXIFifoTag tag, u32 data, BOOL err) +{ +#pragma unused( tag, err ) + + if ((data & CTRDG_PXI_COMMAND_MASK) == CTRDG_PXI_COMMAND_INIT_MODULE_INFO) + { + CTRDGi_Work.subpInitialized = TRUE; + } + else + { +#ifndef SDK_FINALROM + OS_Panic("illegal Cartridge pxi command."); +#else + OS_Panic(""); +#endif + } +} + +//================================================================================ +// PULLOUT PROCS +//================================================================================ +/*---------------------------------------------------------------------------* + Name: CTRDGi_PulledOutCallback + + Description: callback to receive data from PXI + + Arguments: tag : tag from PXI (unused) + data : data from PXI + err : error bit (unused) + + Returns: None + *---------------------------------------------------------------------------*/ +static void CTRDGi_PulledOutCallback(PXIFifoTag tag, u32 data, BOOL err) +{ +#pragma unused( tag, err ) + + //---- receive message 'pulled out' + if ((data & CTRDG_PXI_COMMAND_MASK) == CTRDG_PXI_COMMAND_PULLED_OUT) + { + if (ctrdg_already_pullout == FALSE) + { + BOOL isTerminateImm = FALSE; + + //---- call user callback + if (CTRDG_UserCallback) + { + isTerminateImm = CTRDG_UserCallback(); + } + + //---- terminate + if (isTerminateImm) + { + CTRDG_TerminateForPulledOut(); + } + /* 一度呼ばれたら、もう呼ばれない */ + ctrdg_already_pullout = TRUE; + } + } + else + { +OS_Printf(">>>tag[%x] data[%x] err[%x]\n", tag, data, err); +#ifndef SDK_FINALROM + OS_Panic("illegal Cartridge pxi command."); +#else + OS_Panic(""); +#endif + } +} + +/*---------------------------------------------------------------------------* + Name: CTRDG_SetPulledOutCallback + + Description: set user callback for being pulled out cartridge + + Arguments: callback : callback + + Returns: None + *---------------------------------------------------------------------------*/ +void CTRDG_SetPulledOutCallback(CTRDGPulledOutCallback callback) +{ + CTRDG_UserCallback = callback; +} + +/*---------------------------------------------------------------------------* + Name: CTRDG_TerminateForPulledOut + + Description: terminate for pulling out cartridge. + send message to do termination to ARM7 + + Arguments: None + + Returns: None + *---------------------------------------------------------------------------*/ +void CTRDG_TerminateForPulledOut(void) +{ + //---- send 'TERMINATE' command to ARM7, and terminate itself immediately + CTRDGi_SendtoPxi(CTRDG_PXI_COMMAND_TERMINATE); + + OS_Terminate(); +} + +/*---------------------------------------------------------------------------* + Name: CTRDG_SendToARM7 + + Description: send data to ARM7 + + Arguments: arg : data to send + + Returns: None + *---------------------------------------------------------------------------*/ +void CTRDG_SendToARM7(void *arg) +{ + (void)PXI_SendWordByFifo(PXI_FIFO_TAG_CTRDG_Ex, (u32)arg, FALSE); +} + +/*---------------------------------------------------------------------------* + Name: CTRDG_CheckPulledOut + + Description: cartridge is pulled out + + Arguments: None + + Returns: None + *---------------------------------------------------------------------------*/ +void CTRDG_CheckPulledOut(void) +{ + //---- if skip flag or cartridge already pulled out. + if (skipCheck || isCartridgePullOut) + { + return; + } + + //---------------- check cartridge pulled out + //---- check cartridge + isCartridgePullOut = CTRDG_IsPulledOut(); + + //---- if no cartridge... + if (!CTRDG_IsExisting()) + { + if (!isCartridgePullOut) + { + skipCheck = TRUE; + return; + } + } + + //---------------- if cartridge pulled out, tell that to ARM9 + if (isCartridgePullOut) + { + /* ARM7 から PXI で呼んでいた関数を同じく呼ぶ */ + /* 引数は処理がされる場合の引数に強制的にした */ + CTRDGi_PulledOutCallback(PXI_FIFO_TAG_CTRDG, CTRDG_PXI_COMMAND_PULLED_OUT, NULL); + } +} + +/*---------------------------------------------------------------------------* + Name: CTRDG_SetPhiClock + + Description: set ARM9 and ARM7 PHI output clock + + Arguments: clock : PHI clock to set. (MIPhiClock value) + + Returns: None. + *---------------------------------------------------------------------------*/ +void CTRDG_SetPhiClock(CTRDGPhiClock clock) +{ + u32 data = ((u32)clock << CTRDG_PXI_COMMAND_PARAM_SHIFT)| CTRDG_PXI_COMMAND_SET_PHI; + + //---- check parameter range + SDK_ASSERT( (u32)clock <= CTRDG_PHI_CLOCK_16MHZ ); + + //---- set ARM9 PHI output clock + MIi_SetPhiClock( (MIiPhiClock)clock ); + + //---- send command to set ARM7 phi clock + CTRDGi_Lock = TRUE; + while (PXI_SendWordByFifo(PXI_FIFO_TAG_CTRDG_PHI, data, FALSE) != PXI_FIFO_SUCCESS) + { + SVC_WaitByLoop(1); + } + + //---- wait response + while( CTRDGi_Lock ) + { + SVC_WaitByLoop(1); + } +} + +/*---------------------------------------------------------------------------* + Name: CTRDG_CallbackForSetPhi + + Description: callback from ARM7 to receive PHI clock setting + + Arguments: tag : tag from PXI (unused) + data : data from PXI + err : error bit (unused) + + Returns: None. + *---------------------------------------------------------------------------*/ +static void CTRDGi_CallbackForSetPhi(PXIFifoTag tag, u32 data, BOOL err) +{ +#pragma unused(tag, data, err) + CTRDGi_Lock = FALSE; +} diff --git a/build/libraries/ctrdg/Makefile b/build/libraries/ctrdg/Makefile new file mode 100644 index 0000000..a6f3b67 --- /dev/null +++ b/build/libraries/ctrdg/Makefile @@ -0,0 +1,34 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: TwlSDK - libraries - ctrdg +# File: Makefile +# +# Copyright 2007 Nintendo. All rights reserved. +# +# These coded instructions, statements, and computer programs contain +# proprietary information of Nintendo of America Inc. and/or Nintendo +# Company Ltd., and are protected by Federal copyright law. They may +# not be disclosed to third parties or copied or duplicated in any form, +# in whole or in part, without the prior written consent of Nintendo. +# +# $Log: $ +# $NoKeywords: $ +#---------------------------------------------------------------------------- + +include $(TWLSDK_ROOT)/build/buildtools/commondefs + + +#---------------------------------------------------------------------------- + +SUBDIRS = ARM9 + +#ifdef TWL_WITH_ARM7 +SUBDIRS += # ARM7 +#endif + +#---------------------------------------------------------------------------- + +include $(TWLSDK_ROOT)/build/buildtools/modulerules + + +#===== End of Makefile ===== diff --git a/build/libraries/ctrdg/common/ctrdg.c b/build/libraries/ctrdg/common/ctrdg.c new file mode 100644 index 0000000..9100742 --- /dev/null +++ b/build/libraries/ctrdg/common/ctrdg.c @@ -0,0 +1,918 @@ +/*---------------------------------------------------------------------------* + Project: NitroSDK - CTRDG + File: ctrdg.c + + Copyright 2003-2006 Nintendo. All rights reserved. + + These coded instructions, statements, and computer programs contain + proprietary information of Nintendo of America Inc. and/or Nintendo + Company Ltd., and are protected by Federal copyright law. They may + not be disclosed to third parties or copied or duplicated in any form, + in whole or in part, without the prior written consent of Nintendo. + + $Log: ctrdg.c,v $ + Revision 1.23 2006/04/24 00:05:09 okubata_ryoma + CW2.0の警告レベル強化に伴った変更 + + Revision 1.22 2006/02/22 04:06:44 kitase_hirotake + 無制限にロック待ちしないように修正 + + Revision 1.21 2006/02/10 02:53:18 yosizaki + support memory protection of cartridge access. + + Revision 1.20 2006/01/18 02:11:20 kitase_hirotake + do-indent + + Revision 1.19 2005/11/30 12:22:42 yosizaki + add CTRDG_IsEnabled(), CTRDG_Enable(), CTRDG_CheckEnabled(). + + Revision 1.18 2005/04/12 06:22:51 yosizaki + add pulled-out checkers. + + Revision 1.17 2005/02/28 05:26:03 yosizaki + do-indent. + + Revision 1.16 2005/02/18 14:19:10 seiki_masashi + Copyright 表記の修正 + + Revision 1.15 2005/02/18 13:17:08 seiki_masashi + warning 対策 + + Revision 1.14 2004/09/29 02:32:59 yada + consider for exchanging a option cartridge and an AGB cartridge in sleeping + + Revision 1.13 2004/09/27 13:46:04 yada + only arrange spacing + + Revision 1.12 2004/09/21 01:31:23 yada + in CTRDG_CommonInit(), call SVC_CpuClear instead of MI_CpuClear. + + Revision 1.11 2004/09/17 12:25:18 yada + add data forwarding functions + + Revision 1.10 2004/09/17 06:43:50 yada + add line in CTRDG_CpuCopy8() + + Revision 1.9 2004/09/17 05:11:50 yada + add CTRDG_IsOptionCartridge() + + Revision 1.8 2004/09/16 09:22:20 yada + fix a little + + Revision 1.7 2004/09/16 04:11:48 yada + OS_IsExisting() skip process after detect pulled out + + Revision 1.6 2004/09/14 11:56:49 yada + only write comment about CTRDGi_InitCommon + + Revision 1.5 2004/09/14 09:59:17 yada + move ARM9 code to ctrdg_proc.c + + Revision 1.4 2004/09/14 08:52:43 yada + separate callback to 2 function + + Revision 1.3 2004/09/14 07:23:45 yada + fix a little + + Revision 1.2 2004/09/14 06:09:44 yada + check cartridge pulled out in ARM7 + + Revision 1.1 2004/09/13 10:45:14 yada + initial release. + + $NoKeywords: $ + *---------------------------------------------------------------------------*/ +#include +#include <../include/ctrdg_work.h> +#include + +//---------------------------------------------------------------------------- + +CTRDGWork CTRDGi_Work; + +/* cartridge permission */ +static BOOL CTRDGi_EnableFlag = FALSE; + + +/*---------------------------------------------------------------------------* + Name: CTRDGi_InitCommon + + Description: common routine called from CTRDG_Init. + keep lockID for cartridge functions. + + Arguments: None + + Returns: None + *---------------------------------------------------------------------------*/ +void CTRDGi_InitCommon(void) +{ + SVC_CpuClear(0, &CTRDGi_Work, sizeof(CTRDGi_Work), 32); // use SVC_* intentionally. + + CTRDGi_Work.lockID = (u16)OS_GetLockID(); +} + +/*---------------------------------------------------------------------------* + Name: CTRDG_IsBitID + + Description: return whether peripheral device which is specified by bitID exists + in cartridge + + Arguments: bitID bit ID + + Returns: TRUE if existed + *---------------------------------------------------------------------------*/ + +BOOL CTRDG_IsBitID(u8 bitID) +{ + return (CTRDG_IsExisting() && CTRDGi_IsBitIDAtInit(bitID)); +} + +/*---------------------------------------------------------------------------* + Name: CTRDGi_IsBitIDAtInit + + Description: return whether peripheral device which is specified by bitID existed + in cartridge at boot time + + Arguments: bitID bit ID + + Returns: TRUE if existed + *---------------------------------------------------------------------------*/ +BOOL CTRDGi_IsBitIDAtInit(u8 bitID) +{ + BOOL retval = FALSE; + + CTRDGModuleInfo *cip = CTRDGi_GetModuleInfoAddr(); + + if (cip->moduleID.raw != 0xffff && cip->moduleID.raw != 0x0000 && ~cip->moduleID.bitID & bitID) + { + retval = TRUE; + } + + return retval; +} + +/*---------------------------------------------------------------------------* + Name: CTRDG_IsNumberID + + Description: return whether peripheral device which is specified by numberID exists + in cartridge + + Arguments: numberID number ID + + Returns: TRUE if existed + *---------------------------------------------------------------------------*/ +BOOL CTRDG_IsNumberID(u8 numberID) +{ + return (CTRDG_IsExisting() && CTRDGi_IsNumberIDAtInit(numberID)); +} + +/*---------------------------------------------------------------------------* + Name: CTRDGi_IsNumberIDAtInit + + Description: return whether peripheral device which is specified by numberID existed + in cartridge at boot time + + Arguments: numberID number ID + + Returns: TRUE if existed + *---------------------------------------------------------------------------*/ +BOOL CTRDGi_IsNumberIDAtInit(u8 numberID) +{ + BOOL retval = FALSE; + + CTRDGModuleInfo *cip = CTRDGi_GetModuleInfoAddr(); + + if (cip->moduleID.raw != 0xffff && cip->moduleID.raw != 0x0000) + { + if (cip->moduleID.numberID == numberID) + { + retval = TRUE; + } + else if (!cip->moduleID.disableExLsiID) + { + if (cip->exLsiID[0] == numberID + || cip->exLsiID[1] == numberID || cip->exLsiID[2] == numberID) + { + retval = TRUE; + } + } + } + + return retval; +} + +/*---------------------------------------------------------------------------* + Name: CTRDG_IsAgbCartridge + + Description: return whether AGB cartridge exists + + Arguments: None + + Returns: TRUE if existed + *---------------------------------------------------------------------------*/ +BOOL CTRDG_IsAgbCartridge(void) +{ + return (CTRDG_IsExisting() && CTRDGi_IsAgbCartridgeAtInit()); +} + +/*---------------------------------------------------------------------------* + Name: CTRDG_IsOptionCartridge + + Description: return whether option cartridge exists + + Arguments: None + + Returns: TRUE if existed + *---------------------------------------------------------------------------*/ +BOOL CTRDG_IsOptionCartridge(void) +{ + return (CTRDG_IsExisting() && !CTRDGi_IsAgbCartridgeAtInit()); +} + +/*---------------------------------------------------------------------------* + Name: CTRDGi_IsAgbCartridgeAtInit + + Description: return whether AGB cartridge existed at boot time + + Arguments: None + + Returns: TRUE if existed + *---------------------------------------------------------------------------*/ +BOOL CTRDGi_IsAgbCartridgeAtInit(void) +{ + CTRDGModuleInfo *cip = CTRDGi_GetModuleInfoAddr(); + + return cip->isAgbCartridge; +} + +/*---------------------------------------------------------------------------* + Name: CTRDG_GetAgbGameCode + + Description: get game code in AGB cartridge + + Arguments: None + + Returns: Game code if exist, FALSE if cartridge not exist + *---------------------------------------------------------------------------*/ +u32 CTRDG_GetAgbGameCode(void) +{ + u32 retval = FALSE; + + if (CTRDG_IsExisting()) + { + retval = CTRDGi_GetAgbGameCodeAtInit(); + } + + return retval; +} + +/*---------------------------------------------------------------------------* + Name: CTRDGi_GetAgbGameCodeAtInit + + Description: get game code in AGB cartridge read at boot time + + Arguments: None + + Returns: Game code if exist, FALSE if cartridge did not exist + *---------------------------------------------------------------------------*/ +u32 CTRDGi_GetAgbGameCodeAtInit(void) +{ + CTRDGModuleInfo *cip = CTRDGi_GetModuleInfoAddr(); + u32 retval = FALSE; + + if (CTRDGi_IsAgbCartridgeAtInit()) + { + retval = cip->gameCode; + } + + return retval; +} + +/*---------------------------------------------------------------------------* + Name: CTRDG_GetAgbMakerCode + + Description: get maker code in AGB cartridge + + Arguments: None + + Returns: Maker code if exist, FALSE if cartridge not exist + *---------------------------------------------------------------------------*/ +u16 CTRDG_GetAgbMakerCode(void) +{ + u16 retval = FALSE; + + if (CTRDG_IsExisting()) + { + retval = CTRDGi_GetAgbMakerCodeAtInit(); + } + + return retval; +} + +/*---------------------------------------------------------------------------* + Name: CTRDGi_GetAgbMakerCodeAtInit + + Description: get maker code in AGB cartridge read at boot time + + Arguments: None + + Returns: Maker code if exist, FALSE if not exist + *---------------------------------------------------------------------------*/ +u16 CTRDGi_GetAgbMakerCodeAtInit(void) +{ + CTRDGModuleInfo *cip = CTRDGi_GetModuleInfoAddr(); + u16 retval = FALSE; + + if (CTRDGi_IsAgbCartridgeAtInit()) + { + retval = cip->makerCode; + } + + return retval; +} + + +/*---------------------------------------------------------------------------* + Name: CTRDG_IsPulledOut + + Description: get whether system has detected pulled out cartridge + + Arguments: None + + Returns: TRUE if detect pull out + *---------------------------------------------------------------------------*/ +BOOL CTRDG_IsPulledOut(void) +{ + CTRDGModuleInfo *cip = CTRDGi_GetModuleInfoAddr(); + + //---- cartridge not exist at boot time + if (cip->moduleID.raw == 0xffff) + { + return FALSE; + } + + //---- check existing when not detect pulled out + if (!cip->detectPullOut) + { + (void)CTRDG_IsExisting(); + } + + return cip->detectPullOut; +} + +/*---------------------------------------------------------------------------* + Name: CTRDG_IsAgbCartridgePulledOut + + Description: get whether system has detected pulled out AGB cartridge + + Arguments: None + + Returns: TRUE if detect pull out + *---------------------------------------------------------------------------*/ +BOOL CTRDG_IsAgbCartridgePulledOut(void) +{ + return (CTRDG_IsPulledOut() && CTRDGi_IsAgbCartridgeAtInit()); +} + +/*---------------------------------------------------------------------------* + Name: CTRDG_IsOptionCartridgePulledOut + + Description: get whether system has detected pulled out option cartridge + + Arguments: None + + Returns: TRUE if detect pull out + *---------------------------------------------------------------------------*/ +BOOL CTRDG_IsOptionCartridgePulledOut(void) +{ + return (CTRDG_IsPulledOut() && !CTRDGi_IsAgbCartridgeAtInit()); +} + +/*---------------------------------------------------------------------------* + Name: CTRDG_IsExisting + + Description: get whether cartridge exists + + Arguments: None + + Returns: TRUE if existing + *---------------------------------------------------------------------------*/ +BOOL CTRDG_IsExisting(void) +{ + BOOL retval = TRUE; + CTRDGLockByProc lockInfo; + + CTRDGHeader *chp = CTRDGi_GetHeaderAddr(); + CTRDGModuleInfo *cip = CTRDGi_GetModuleInfoAddr(); + + //---- if cartridge not exist at boot time. + if (cip->moduleID.raw == 0xffff) + { + return FALSE; + } + + //---- if detect cartirdge pulled out + if (cip->detectPullOut == TRUE) + { + return FALSE; + } +#if defined(SDK_ARM7) + //---- get privilege for accessing cartridge + if(CTRDGi_LockByProcessor(CTRDGi_Work.lockID, &lockInfo) == FALSE) + { + (void)OS_RestoreInterrupts(lockInfo.irq); + return TRUE; + } +#else + //---- get privilege for accessing cartridge + CTRDGi_LockByProcessor(CTRDGi_Work.lockID, &lockInfo); +#endif + + //---- check if cartridge exists + { + CTRDGRomCycle rc; + u8 isRomCode; + + // set the lastest access cycle + CTRDGi_ChangeLatestAccessCycle(&rc); + isRomCode = chp->isRomCode; + + // ( please observe comparison order to the following ) + if ((isRomCode == CTRDG_IS_ROM_CODE && cip->moduleID.raw != chp->moduleID) // memory loaded + || (isRomCode != CTRDG_IS_ROM_CODE && cip->moduleID.raw != *CTRDGi_GetModuleIDImageAddr()) // memory not loaded + || ((cip->gameCode != chp->gameCode) && cip->isAgbCartridge)) // AGB cartridge comparison + { + cip->detectPullOut = TRUE; + retval = FALSE; + } + + //---- restore access cycle + CTRDGi_RestoreAccessCycle(&rc); + } + + //---- release privilege for accessing cartridge + CTRDGi_UnlockByProcessor(CTRDGi_Work.lockID, &lockInfo); + + return retval; +} + +/*---------------------------------------------------------------------------* + Name: CTRDGi_ChangeLatestAccessCycle + + Description: set access cycle to cartridge to latest setting + + Arguments: r : Cartridge ROM access cycle + + Returns: None. + *---------------------------------------------------------------------------*/ +void CTRDGi_ChangeLatestAccessCycle(CTRDGRomCycle *r) +{ + r->c1 = MI_GetCartridgeRomCycle1st(); + r->c2 = MI_GetCartridgeRomCycle2nd(); + + MI_SetCartridgeRomCycle1st(MI_CTRDG_ROMCYCLE1_18); + MI_SetCartridgeRomCycle2nd(MI_CTRDG_ROMCYCLE2_6); +} + +/*---------------------------------------------------------------------------* + Name: CTRDGi_RestoreAccessCycle + + Description: set access cycle to cartridge to the original setting + + Arguments: r : Cartridge ROM access cycle + + Returns: None. + *---------------------------------------------------------------------------*/ +void CTRDGi_RestoreAccessCycle(CTRDGRomCycle *r) +{ + MI_SetCartridgeRomCycle1st(r->c1); + MI_SetCartridgeRomCycle2nd(r->c2); +} + + +/*---------------------------------------------------------------------------* + Name: CTRDGi_LockByProcessor + + Description: get privilege for accessing cartridge to specified processor + + Because try lock cartridge, in case another processor had locked, + wait till its was released. + + Status of interrupt in return is disable. + + Arguments: lockID : lock ID for cartridge + info : info for lock by my processor + + Returns: None. + *---------------------------------------------------------------------------*/ +#if defined(SDK_ARM7) +BOOL CTRDGi_LockByProcessor(u16 lockID, CTRDGLockByProc *info) +#else +void CTRDGi_LockByProcessor(u16 lockID, CTRDGLockByProc *info) +#endif +{ + while (1) + { + info->irq = OS_DisableInterrupts(); + + if (((info->locked = OS_ReadOwnerOfLockCartridge() & CTRDG_LOCKED_BY_MYPROC_FLAG) != 0) + || (OS_TryLockCartridge(lockID) == OS_LOCK_SUCCESS)) + { +#if defined(SDK_ARM7) + return TRUE; +#else + break; +#endif + } +#if defined(SDK_ARM7) + return FALSE; +#endif + (void)OS_RestoreInterrupts(info->irq); + + SVC_WaitByLoop(1); + } +} + +/*---------------------------------------------------------------------------* + Name: CTRDGi_UnlockByProcessor + + Description: release privilege for accessing cartirige + + Arguments: lockID : lock ID for cartridge + info : info for lock by my processor + it must be the value got in CTRDGi_LockCartridgeByProccesser. + + Returns: None. + *---------------------------------------------------------------------------*/ +void CTRDGi_UnlockByProcessor(u16 lockID, CTRDGLockByProc *info) +{ + if (!info->locked) + { + (void)OS_UnLockCartridge(lockID); + } + + (void)OS_RestoreInterrupts(info->irq); +} + +/*---------------------------------------------------------------------------* + Name: CTRDGi_SendtoPxi + + Description: send data via PXI + + Arguments: data : data to send + + Returns: None + *---------------------------------------------------------------------------*/ +void CTRDGi_SendtoPxi(u32 data) +{ + while (PXI_SendWordByFifo(PXI_FIFO_TAG_CTRDG, data, FALSE) != PXI_FIFO_SUCCESS) + { + SVC_WaitByLoop(1); + } +} + +//================================================================================ +// READ DATA FROM CARTRIDGE +//================================================================================ +/*---------------------------------------------------------------------------* + Name: CTRDG_DmaCopy16 / 32 + + Description: read cartridge data via DMA + + Arguments: dmaNo : DMA No. + src : source address (in cartridge) + dest : destination address (in memory) + size : forwarding size + + Returns: TRUE if success. + FALSE if fail. ( no cartridge ) + *---------------------------------------------------------------------------*/ +BOOL CTRDG_DmaCopy16(u32 dmaNo, const void *src, void *dest, u32 size) +{ + return CTRDGi_CopyCommon(dmaNo, src, dest, size, CTRDGi_FORWARD_DMA16); +} +BOOL CTRDG_DmaCopy32(u32 dmaNo, const void *src, void *dest, u32 size) +{ + return CTRDGi_CopyCommon(dmaNo, src, dest, size, CTRDGi_FORWARD_DMA32); +} + +/*---------------------------------------------------------------------------* + Name: CTRDG_CpuCopy8 / 16 / 32 + + Description: read cartridge data by CPU access + + Arguments: src : source address (in cartridge) + dest : destination address (in memory) + size : forwarding size + + Returns: TRUE if success. + FALSE if fail. ( no cartridge ) + *---------------------------------------------------------------------------*/ +BOOL CTRDG_CpuCopy8(const void *src, void *dest, u32 size) +{ + if (HW_CTRDG_ROM <= (u32)dest && (u32)dest < HW_CTRDG_RAM_END) + { + return CTRDGi_CopyCommon(0 /*dummy */ , (const void *)dest, (void *)src, size, + CTRDGi_FORWARD_CPU8); + } + else + { + return CTRDGi_CopyCommon(0 /*dummy */ , src, dest, size, CTRDGi_FORWARD_CPU8); + } +} +BOOL CTRDG_CpuCopy16(const void *src, void *dest, u32 size) +{ + return CTRDGi_CopyCommon(0 /*dummy */ , src, dest, size, CTRDGi_FORWARD_CPU16); +} +BOOL CTRDG_CpuCopy32(const void *src, void *dest, u32 size) +{ + return CTRDGi_CopyCommon(0 /*dummy */ , src, dest, size, CTRDGi_FORWARD_CPU32); +} + +/*---------------------------------------------------------------------------* + Name: CTRDGi_CopyCommon + + Description: read/write cartridge data. + subroutine of CTRDG_CpuCopy*(), CTRDG_DmaCopy*() and CTRDG_WriteStream8(). + + Arguments: dmaNo : DMA No. + src : source address + dest : destination address + size : forwarding size + forwardType : action flag + + Returns: TRUE if success. + FALSE if fail. ( no cartridge ) + *---------------------------------------------------------------------------*/ +BOOL CTRDGi_CopyCommon(u32 dmaNo, const void *src, void *dest, u32 size, u32 forwardType) +{ + //---- check cartridge existence + if (!CTRDG_IsExisting()) + { + return FALSE; + } + + /* confirm whether application has certainly judged AGB-cartridge */ + CTRDG_CheckEnabled(); + + (void)OS_LockCartridge(CTRDGi_Work.lockID); + + if ((forwardType & CTRDGi_FORWARD_TYPE_MASK) == CTRDGi_FORWARD_TYPE_DMA) + { + MI_StopDma(dmaNo); + DC_FlushRange(dest, size); + } + + switch (forwardType) + { + case CTRDGi_FORWARD_DMA16: + MI_DmaCopy16(dmaNo, src, dest, size); + break; + case CTRDGi_FORWARD_DMA32: + MI_DmaCopy32(dmaNo, src, dest, size); + break; + case CTRDGi_FORWARD_CPU16: + MI_CpuCopy16(src, dest, size); + break; + case CTRDGi_FORWARD_CPU32: + MI_CpuCopy32(src, dest, size); + break; + + case CTRDGi_FORWARD_CPU8: + { + int n; + u8 *dest8 = (u8 *)dest; + u8 *src8 = (u8 *)src; + for (n = 0; n < size; n++) + { + *dest8++ = *src8++; + } + } + break; + } + + (void)OS_UnLockCartridge(CTRDGi_Work.lockID); + + //---- check to remove cartridge in the middle of reading + if (!CTRDG_IsExisting()) + { + return FALSE; + } + + return TRUE; +} + +/*---------------------------------------------------------------------------* + Name: CTRDG_Read8 / 16 / 32 + + Description: read cartridge data by CPU access + + Arguments: address : source address (in cartridge) + rdata : address to store read data + + Returns: TRUE if success. + FALSE if fail. ( no cartridge ) + *---------------------------------------------------------------------------*/ +BOOL CTRDG_Read8(const u8 *address, u8 *rdata) +{ + return CTRDGi_AccessCommon((void *)address, 0 /*dummy */ , rdata, CTRDGi_ACCESS_READ8); +} +BOOL CTRDG_Read16(const u16 *address, u16 *rdata) +{ + return CTRDGi_AccessCommon((void *)address, 0 /*dummy */ , rdata, CTRDGi_ACCESS_READ16); +} +BOOL CTRDG_Read32(const u32 *address, u32 *rdata) +{ + return CTRDGi_AccessCommon((void *)address, 0 /*dummy */ , rdata, CTRDGi_ACCESS_READ32); +} + +/*---------------------------------------------------------------------------* + Name: CTRDG_Write8 / 16 / 32 + + Description: write data to cartridge + + Arguments: address : destination address (in cartridge) + data : data to write + + Returns: TRUE if success. + FALSE if fail. ( no cartridge ) + *---------------------------------------------------------------------------*/ +BOOL CTRDG_Write8(u8 *address, u8 data) +{ + return CTRDGi_AccessCommon(address, data, 0 /*dummy */ , CTRDGi_ACCESS_WRITE8); +} +BOOL CTRDG_Write16(u16 *address, u16 data) +{ + return CTRDGi_AccessCommon(address, data, 0 /*dummy */ , CTRDGi_ACCESS_WRITE16); +} +BOOL CTRDG_Write32(u32 *address, u32 data) +{ + return CTRDGi_AccessCommon(address, data, 0 /*dummy */ , CTRDGi_ACCESS_WRITE32); +} + +/*---------------------------------------------------------------------------* + Name: CTRDGi_AccessCommon + + Description: read/write cartridge data. + subroutine of CTRDG_Read*() and CTRDG_Write*(). + + Arguments: address : address to access + data : data to write (in write mode) + rdata : address to store read data (in read mode) + accessType : action flag + + Returns: TRUE if success. + FALSE if fail. ( no cartridge ) + *---------------------------------------------------------------------------*/ +BOOL CTRDGi_AccessCommon(void *address, u32 data, void *rdata, u32 accessType) +{ + //---- check cartridge existence + if (!CTRDG_IsExisting()) + { + return FALSE; + } + + /* confirm whether application has certainly judged AGB-cartridge */ + CTRDG_CheckEnabled(); + + (void)OS_LockCartridge(CTRDGi_Work.lockID); + + switch (accessType) + { + case CTRDGi_ACCESS_READ8: + if (rdata) + { + *(u8 *)rdata = *(u8 *)address; + } + break; + case CTRDGi_ACCESS_READ16: + if (rdata) + { + *(u16 *)rdata = *(u16 *)address; + } + break; + case CTRDGi_ACCESS_READ32: + if (rdata) + { + *(u32 *)rdata = *(u32 *)address; + } + break; + case CTRDGi_ACCESS_WRITE8: + *(u8 *)address = (u8)data; + break; + case CTRDGi_ACCESS_WRITE16: + *(u16 *)address = (u16)data; + break; + case CTRDGi_ACCESS_WRITE32: + *(u32 *)address = (u32)data; + break; + } + + (void)OS_UnLockCartridge(CTRDGi_Work.lockID); + + //---- check to remove cartridge in the middle of reading + if (!CTRDG_IsExisting()) + { + return FALSE; + } + + return TRUE; +} + +/*---------------------------------------------------------------------------* + Name: CTRDG_IsEnabled + + Description: check if CTRDG is accessable + + Arguments: None. + + Returns: Return cartridge access permission. + *---------------------------------------------------------------------------*/ +BOOL CTRDG_IsEnabled(void) +{ + return CTRDGi_EnableFlag; +} + +/*---------------------------------------------------------------------------* + Name: CTRDG_Enable + + Description: Set cartridge access permission mode. + + Arguments: enable permission mode to be set. + + Returns: None. + *---------------------------------------------------------------------------*/ +#define SET_PROTECTION_A( id, adr, siz ) ldr r0, =(adr|HW_C6_PR_##siz|HW_C6_PR_ENABLE) +#define SET_PROTECTION_B( id, adr, siz ) mcr p15, 0, r0, c6, id, 0 +#define REGION_BIT(a,b,c,d,e,f,g,h) (((a)<<0)|((b)<<1)|((c)<<2)|((d)<<3)|((e)<<4)|((f)<<5)|((g)<<6)|((h)<<7)) +#define REGION_ACC(a,b,c,d,e,f,g,h) (((a)<<0)|((b)<<4)|((c)<<8)|((d)<<12)|((e)<<16)|((f)<<20)|((g)<<24)|((h)<<28)) +#define NA 0 +#define RW 1 +#define RO 5 + +#include +static asm void CTRDGi_AllocCtrdgPR( void ) +{ + SET_PROTECTION_A( c3, HW_CTRDG_ROM, 64MB ) + SET_PROTECTION_B( c3, HW_CTRDG_ROM, 64MB ) + bx lr +} +static asm void CTRDGi_AllocMmemHiPR( void ) +{ + SET_PROTECTION_A( c3, HW_MAIN_MEM_HI, 32MB ) + SET_PROTECTION_B( c3, HW_MAIN_MEM_HI, 32MB ) + bx lr +} +#include + +void CTRDG_Enable(BOOL enable) +{ + OSIntrMode bak_cpsr = OS_DisableInterrupts(); + CTRDGi_EnableFlag = enable; +#if defined(SDK_ARM9) +// if (!CTRDG_IsOptionCartridge()) <- この条件では不正アクセスの可能性あり + { + u32 iacc = (u32)(enable ? OS_PR3_ACCESS_RW : OS_PR3_ACCESS_NA); + u32 dacc = (u32)(enable ? OS_PR3_ACCESS_RW : OS_PR3_ACCESS_RO); + (void)OS_SetIPermissionsForProtectionRegion(OS_PR3_ACCESS_MASK, iacc); + (void)OS_SetDPermissionsForProtectionRegion(OS_PR3_ACCESS_MASK, dacc); + if ( enable ) + { + // for CTRDG + OS_DisableICacheForProtectionRegion(1<<3); + OS_DisableDCacheForProtectionRegion(1<<3); + OS_DisableWriteBufferForProtectionRegion(1<<3); + CTRDGi_AllocCtrdgPR(); + } + else + { + // for HW_MAIN_MEM_HI + OS_EnableICacheForProtectionRegion(1<<3); + OS_EnableDCacheForProtectionRegion(1<<3); + OS_EnableWriteBufferForProtectionRegion(1<<3); + CTRDGi_AllocMmemHiPR(); + } + } +#endif /* defined(SDK_ARM9) */ + (void)OS_RestoreInterrupts(bak_cpsr); +} + +/*---------------------------------------------------------------------------* + Name: CTRDG_CheckEnabled + + Description: Terminate program if CTRDG is not accessable + + Arguments: None. + + Returns: None. + *---------------------------------------------------------------------------*/ +void CTRDG_CheckEnabled(void) +{ +#ifdef SDK_ARM9 + if (!CTRDG_IsOptionCartridge() && !CTRDG_IsEnabled()) + { + OS_TPanic + ("cartridge permission denied. (you must call CTRDG_Enable() under the guideline.)"); + } +#endif +} diff --git a/build/libraries/init/ARM9/crt0.c b/build/libraries/init/ARM9/crt0.c index 6a056a6..016a62e 100644 --- a/build/libraries/init/ARM9/crt0.c +++ b/build/libraries/init/ARM9/crt0.c @@ -421,12 +421,13 @@ static asm void init_cp15(void) /* ; Region G: BACK_GROUND: Base = 0x0, Size = 4GB, I:NC NB / D:NC NB, I:NA / D:NA ; Region 0: IO_VRAM: Base = 0x04000000, Size = 64MB, I:NC NB / D:NC NB, I:RW / D:RW -; Region 1Rel: MAIN_MEM: Base = 0x02000000, Size = 8MB*, I:Cach Buf / D:Cach Buf, I:RW / D:RW -; Region 1Dbg: MAIN_MEM: Base = 0x02000000, Size = 8MB, I:Cach Buf / D:Cach Buf, I:RW / D:RW +; Region 1Rel: MAIN_MEM: Base = 0x02000000, Size = 16MB*, I:Cach Buf / D:Cach Buf, I:RW / D:RW +; Region 1Dbg: MAIN_MEM: Base = 0x02000000, Size = 16MB, I:Cach Buf / D:Cach Buf, I:RW / D:RW ; (* Size will be arranged in OS_InitArena(). ) ; Region 2Rel: SOUND_DATA: Base = 0x02380000, Size = 512KB, I:NC NB / D:NC NB, I:NA / D:NA ; Region 2D4M: SOUND_DATA: Base = 0x02300000, Size = 1MB, I:NC NB / D:NC NB, I:NA / D:NA ; Region 2D8M: SOUND_DATA: Base = 0x02600000, Size = 2MB, I:NC NB / D:NC NB, I:NA / D:NA +; Region 3: MAIN_MEM_HI: Base = 0x08000000, Size = 256MB, I:Cach Buf / D:Cach Buf, I:RW / D:RW ; Region 3: CARTRIDGE: Base = 0x08000000, Size = 128MB, I:NC NB / D:NC NB, I:NA / D:RW ; Region 4: DTCM: Base = SOUND_DATA, Size = 16KB, I:NC NB / D:NC NB, I:NA / D:RW ; Region 5: ITCM: Base = 0x01000000, Size = 16MB, I:NC NB / D:NC NB, I:RW / D:RW @@ -452,8 +453,8 @@ static asm void init_cp15(void) SET_PROTECTION_B( c0, HW_IOREG, 64MB ) //---- メインメモリ - SET_PROTECTION_A( c1, HW_MAIN_MEM_MAIN, 8MB ) - SET_PROTECTION_B( c1, HW_MAIN_MEM_MAIN, 8MB ) + SET_PROTECTION_A( c1, HW_MAIN_MEM_MAIN, 16MB ) + SET_PROTECTION_B( c1, HW_MAIN_MEM_MAIN, 16MB ) //---- サウンドデータ領域 #if HW_MAIN_MEM_SUB_SIZE+HW_MAIN_MEM_SHARED_SIZE == 0x1000 @@ -490,10 +491,10 @@ static asm void init_cp15(void) #pragma message(ERROR: Size unmatch HW_MAIN_MEM_SUB_SIZE) #endif - //---- カートリッジ又は他の用途 - // CPU 内部ワーク RAM 等 - SET_PROTECTION_A( c3, HW_CTRDG_ROM, 128MB ) - SET_PROTECTION_B( c3, HW_CTRDG_ROM, 128MB ) + //---- メインメモリ上位イメージ 又は他の用途 + // カートリッジ、CPU 内部ワーク RAM 等 + SET_PROTECTION_A( c3, HW_MAIN_MEM_HI, 32MB ) + SET_PROTECTION_B( c3, HW_MAIN_MEM_HI, 32MB ) //---- データ TCM // + CPU 内部ワーク RAM の場合あり @@ -542,7 +543,7 @@ static asm void init_cp15(void) // 1: MAIN_MEM // 6: BIOS // - mov r0, #REGION_BIT(0,1,0,0,0,0,1,0) + mov r0, #REGION_BIT(0,1,0,1,0,0,1,0) mcr p15, 0, r0, c2, c0, 1 // @@ -550,14 +551,14 @@ static asm void init_cp15(void) // 1: MAIN_MEM // 6: BIOS // - mov r0, #REGION_BIT(0,1,0,0,0,0,1,0) + mov r0, #REGION_BIT(0,1,0,1,0,0,1,0) mcr p15, 0, r0, c2, c0, 0 // // ライトバッファ イネーブル(リージョン設定) // 1: MAIN_MEM // - mov r0, #REGION_BIT(0,1,0,0,0,0,0,0) + mov r0, #REGION_BIT(0,1,0,1,0,0,0,0) mcr p15, 0, r0, c3, c0, 0 // @@ -571,7 +572,7 @@ static asm void init_cp15(void) // BIOS : RO // SHARED : NA // - ldr r0, =REGION_ACC(RW,RW,NA,NA,NA,RW,RO,NA) + ldr r0, =REGION_ACC(RW,RW,NA,RW,NA,RW,RO,NA) mcr p15, 0, r0, c5, c0, 3 // diff --git a/build/libraries/os/common/os_emulator.c b/build/libraries/os/common/os_emulator.c new file mode 100644 index 0000000..9e9c37f --- /dev/null +++ b/build/libraries/os/common/os_emulator.c @@ -0,0 +1,273 @@ +/*---------------------------------------------------------------------------* + Project: NitroSDK - OS + File: os_emulator.c + + Copyright 2003-2006 Nintendo. All rights reserved. + + These coded instructions, statements, and computer programs contain + proprietary information of Nintendo of America Inc. and/or Nintendo + Company Ltd., and are protected by Federal copyright law. They may + not be disclosed to third parties or copied or duplicated in any form, + in whole or in part, without the prior written consent of Nintendo. + + $Log: os_emulator.c,v $ + Revision 1.22 2006/04/25 23:58:19 okubata_ryoma + 返り値がリファレンスの記述と異なる値を返すという不具合修正 + + Revision 1.21 2006/01/18 02:11:30 kitase_hirotake + do-indent + + Revision 1.20 2005/02/28 05:26:28 yosizaki + do-indent. + + Revision 1.19 2005/02/18 08:51:35 yasu + 著作年度変更 + + Revision 1.18 2005/02/18 06:20:18 yasu + Signed/Unsigned 変換警告抑制 + + Revision 1.17 2004/09/22 00:25:38 yada + OS_GetConsole() Type returns constant value + if SDK_SMALL_BUILD and SDK_FINALROM are defined + + Revision 1.16 2004/08/17 04:10:32 yada + detect debugger correctly + + Revision 1.15 2004/08/16 08:15:54 yada + HW_CHECK_DEBUGGER_BUF definition is moved to mmap_shared.h header + + Revision 1.14 2004/08/11 13:18:58 yada + change method to detect platform + + Revision 1.13 2004/07/23 01:03:03 yada + OS_UnLockCartridge -> OS_UnlockCartridge + + Revision 1.12 2004/07/22 08:22:41 yada + fix for changing some lockID's type u32->u16 + + Revision 1.11 2004/06/08 10:43:26 yada + add information about main memory size + + Revision 1.10 2004/06/08 04:34:45 yada + only fix comment + + Revision 1.9 2004/06/07 04:29:39 yada + add OS_GetConsoleType() + + Revision 1.8 2004/02/13 08:39:30 yasu + OS_IsRunOnEmulator returns by FALSE if ARM7 + + Revision 1.7 2004/02/13 02:26:56 yada + ARM9とAMR7 でインクルードファイル場合わけ + + Revision 1.6 2004/02/12 11:08:30 yada + ARM9/ARM7 振り分け作業 + + Revision 1.5 2004/02/06 09:29:43 yasu + OS_IsRunEmulator の認識処理を一度だけにした. + + Revision 1.4 2004/02/05 07:09:02 yasu + change SDK prefix iris -> nitro + + Revision 1.3 2003/12/25 07:31:26 yada + 型ルール統一による変更 + + Revision 1.2 2003/11/30 04:20:26 yasu + OS_EnableInterrupt/DisableInterrupt の戻り値の型の変更 + + Revision 1.1 2003/11/29 01:25:46 yada + ファイル名称変更 + + Revision 1.1 2003/11/25 11:17:37 yasu + エミュレータの自動判別追加 + + $NoKeywords: $ + *---------------------------------------------------------------------------*/ +#include + +//---- current processor lock flag +#ifdef SDK_ARM9 +#define OSi_CURPROC_LOCKED_FLAG OS_MAINP_LOCKED_FLAG +#else +#define OSi_CURPROC_LOCKED_FLAG OS_SUBP_LOCKED_FLAG +#endif + +static u32 OSi_ConsoleTypeCache = OSi_CONSOLE_NOT_DETECT; + +u32 OSi_GetDeviceType(void); +BOOL OSi_IsRunOnDebugger(void); + +//================================================================================ +/*---------------------------------------------------------------------------* + Name: OS_IsRunOnEmulator + + Description: Detect emulator + + Arguments: None + + Returns: non 0 if emulator + *---------------------------------------------------------------------------*/ +BOOL OS_IsRunOnEmulator(void) +{ +#ifdef SDK_ARM9 +#ifndef SDK_FINALROM + static int onEmu = -1; // Not so good coding style... + u32 val; + OSIntrMode intr; + + if (onEmu == -1) + { + intr = OS_DisableInterrupts(); + { + // PING magic number to ensata + (*(REGType32v *)REG_CLIPMTX_RESULT_0_ADDR) = 0x2468ace0; + + // PONG magic number from ensata + val = *(vu16 *)REG_VCOUNT_ADDR & 0x1ffU; + + if (val == 270) + { + // Recognized as ensata, send back ACK signal to ensata + *(vu32 *)0x4fff010 = 0x13579bdf; // ACK Signal 1 + *(vu32 *)0x4fff010 = 0xfdb97531; // ACK Signal 2 + onEmu = TRUE; + } + else + { + // Unidentified ... + onEmu = FALSE; + } + } + (void)OS_RestoreInterrupts(intr); + } + return (BOOL)onEmu; +#else + return FALSE; +#endif + +#else // SDK_ARM7 + return FALSE; // always FALSE if ARM7 +#endif +} + +/*---------------------------------------------------------------------------* + Name: OS_GetConsoleType + + Description: Detect console type + + Arguments: None + + Returns: + *---------------------------------------------------------------------------*/ +u32 OS_GetConsoleType(void) +{ +#if defined( SDK_FINALROM ) || defined( SDK_SMALL_BUILD ) + OSi_ConsoleTypeCache = OS_CONSOLE_NITRO | OS_CONSOLE_DEV_CARD | OS_CONSOLE_SIZE_4MB; + +#else // if defined( SDK_FINALROM ) && defined( SDK_SMALL_BUILD ) + + //---- skip if detect already + if (OSi_ConsoleTypeCache == OSi_CONSOLE_NOT_DETECT) + { + //---- whether device is cartridge? + u32 type = OSi_GetDeviceType(); + + //---- running on software emulator Ensata? + if (OS_IsRunOnEmulator()) + { + type |= OS_CONSOLE_ENSATA; + } + //---- running on debugger? + else if (OSi_IsRunOnDebugger()) + { + type |= OS_CONSOLE_ISDEBUGGER; + } + //---- is card device cartridge? so that running on IS-Emulator + else if (type & OS_CONSOLE_DEV_CARTRIDGE) + { + type |= OS_CONSOLE_ISEMULATOR; + } + //---- else, maybe retail NITRO. + else + { + type |= OS_CONSOLE_NITRO; + } + + //---- main memory size (maybe ARM7 has already detected) + type |= *(u16 *)HW_MMEMCHECKER_SUB; + + OSi_ConsoleTypeCache = type; + } +#endif // if defined( SDK_FINALROM ) && defined( SDK_SMALL_BUILD ) + + return OSi_ConsoleTypeCache; +} + +/*---------------------------------------------------------------------------* + Name: OSi_GetDeviceType + + Description: get card device type + (subroutine of OS_GetConsoleType) + + Arguments: None + + Returns: decided by bus card data loaded + OS_CONSOLE_DEV_CARTRIDGE : via cartridge bus + OS_CONSOLE_DEV_CARD : via card bus + *---------------------------------------------------------------------------*/ +u32 OSi_GetDeviceType(void) +{ + u32 result = OS_CONSOLE_DEV_CARD; + +#if 0 + BOOL checked = FALSE; + u16 lockId = (u16)OS_GetLockID(); // treat as success absolutely + + do + { + s32 ret = OS_LOCK_ERROR; + OSIntrMode enabled = OS_DisableInterrupts(); + + //---- cartridge already locked or lock now success + if ((OS_ReadOwnerOfLockCartridge() & OSi_CURPROC_LOCKED_FLAG) + || ((ret = (s32)OS_TryLockCartridge(lockId)) == OS_LOCK_SUCCESS)) + { + //---- check cartridge header + result = + (u32)(((((vu32 *)HW_CTRDG_ROM)[0] == (u32)'TNIN') && + (((vu32 *)HW_CTRDG_ROM)[1] == (u32)'ODNE')) ? + OS_CONSOLE_DEV_CARTRIDGE : OS_CONSOLE_DEV_CARD); + //---- unlock cartridge + if (ret == OS_LOCK_SUCCESS) + { + (void)OS_UnlockCartridge(lockId); + checked = TRUE; + } + } + + (void)OS_RestoreInterrupts(enabled); + } + while (!checked); +#endif + + return result; +} + +/*---------------------------------------------------------------------------* + Name: OSi_IsRunOnDebugger + + Description: Detect Debugger + (subroutine of OS_GetConsoleType) + + Arguments: None + + Returns: TRUE : debugger + FALSE : not debugger + *---------------------------------------------------------------------------*/ +BOOL OSi_IsRunOnDebugger(void) +{ + u16 *checkAddress = (u16 *)((*(u16 *)HW_CHECK_DEBUGGER_SW == + 0) ? HW_CHECK_DEBUGGER_BUF1 : HW_CHECK_DEBUGGER_BUF2); + + return (*checkAddress == 1) ? TRUE : FALSE; +} diff --git a/build/libraries/os/common/os_exception.c b/build/libraries/os/common/os_exception.c new file mode 100644 index 0000000..64aa6a8 --- /dev/null +++ b/build/libraries/os/common/os_exception.c @@ -0,0 +1,523 @@ +/*---------------------------------------------------------------------------* + Project: NitroSDK - OS + File: os_exception.c + + Copyright 2003-2006 Nintendo. All rights reserved. + + These coded instructions, statements, and computer programs contain + proprietary information of Nintendo of America Inc. and/or Nintendo + Company Ltd., and are protected by Federal copyright law. They may + not be disclosed to third parties or copied or duplicated in any form, + in whole or in part, without the prior written consent of Nintendo. + + $Log: os_exception.c,v $ + Revision 1.38 2006/05/24 07:54:06 kitase_hirotake + 例外ハンドラの設定条件の変更 + + Revision 1.37 2006/05/08 09:26:16 okubata_ryoma + FINALROMの場合はデバッガ上でもOS_CONSOLE_NITROを返すことに関する修正 + + Revision 1.36 2006/04/04 06:05:53 yosizaki + コールスタックの8バイト整合に関する修正. + + Revision 1.35 2006/01/18 02:11:30 kitase_hirotake + do-indent + + Revision 1.34 2005/02/28 05:26:28 yosizaki + do-indent. + + Revision 1.33 2004/11/02 10:35:45 yada + just fix comment + + Revision 1.32 2004/10/03 09:59:16 yasu + Avoid sdkindent in inline-asm{} + + Revision 1.31 2004/09/02 02:53:42 yada + only change comment + + Revision 1.30 2004/08/26 00:20:10 yada + change method to distinguish running on debugger + + Revision 1.29 2004/06/11 06:24:43 yada + close SDK_BB support + + Revision 1.28 2004/06/10 06:25:06 yada + consider for occurring exception in THUMB mode + + Revision 1.27 2004/06/07 10:56:35 yada + make difference to set handler according to exec environment + + Revision 1.26 2004/05/12 11:00:48 yada + OSi_ExPrintf always uses OS_Printf + + Revision 1.25 2004/05/12 05:34:29 yada + some fix + + Revision 1.24 2004/05/12 05:31:46 yada + modification for DEBUGGER + + Revision 1.23 2004/05/07 02:11:06 takano_makoto + Change OSiExContext offset definition. + + Revision 1.22 2004/04/16 09:36:19 yada + fix temporary exception vector + 0x27fffd9c->0x027ffd9c + + Revision 1.21 2004/04/14 12:48:20 yada + IS-NITRO-DEBUGGERへの暫定対応 + + Revision 1.20 2004/03/30 06:09:29 yada + ldconst や lda を ldr = を使用する記述にした。 + + Revision 1.19 2004/03/18 12:56:43 yada + 例外ベクタ設定のミス修正 + + Revision 1.18 2004/03/11 09:47:14 yada + 例外時にFIQ,IRQ割り込み禁止していたのをIRQ割り込み禁止のみにした。 + + Revision 1.17 2004/03/09 02:37:59 yada + debuggerモニタハンドラ呼び出し判定部分修正 + + Revision 1.16 2004/03/08 02:54:13 yada + デバッガモニタの例外ハンドラを考慮 + + Revision 1.15 2004/03/01 11:54:24 yada + 英語の関数comment作成 + + Revision 1.14 2004/02/19 08:43:05 yada + ユーザ例外ルーチンの型追加 + + Revision 1.13 2004/02/17 06:04:38 yada + ARM7への対応 + + Revision 1.12 2004/02/16 09:40:12 yada + ARM7側の割り込みもフックするようにした。 + + Revision 1.11 2004/02/16 00:49:30 yasu + Don't switch ISD/noISD by SDK_LINK_ISD. + Please use stubs library to resolve it at link time. + + Revision 1.10 2004/02/13 04:05:28 yada + ARM9とAMR7 の場合わけ考慮 + + Revision 1.9 2004/02/12 11:08:30 yada + ARM9/ARM7 振り分け作業 + + Revision 1.8 2004/02/09 11:17:22 yasu + include code32.h + + Revision 1.7 2004/02/05 10:50:59 yada + 未定義命令で停止するようにした + + Revision 1.6 2004/02/05 07:09:02 yasu + change SDK prefix iris -> nitro + + Revision 1.5 2004/02/02 05:34:54 yada + OS_SetIrqMask()→OS_EnableIrqMask() へ + + Revision 1.4 2004/01/30 08:05:36 yada + FINALROMでは例外表示をしないように修正 + + Revision 1.3 2004/01/30 04:31:47 yada + 例外表示の組み込み + + Revision 1.2 2004/01/16 01:18:05 yasu + Support SDK_BB + + Revision 1.1 2004/01/14 12:03:05 yada + 初版 + + $NoKeywords: $ + *---------------------------------------------------------------------------*/ +#include +#include +#include + + +//---- displaying function OSi_ExPrintf +#ifdef SDK_ARM9 +#define OSi_ExPrintf OS_Printf +//#define OSi_ExPrintf ISDPrintf +//void ISDPrintf( const char *pBuf, ... ); +#else +#define OSi_ExPrintf OS_Printf +#endif + + +static asm void OSi_ExceptionHandler( void ); +static asm void OSi_GetAndDisplayContext( void ); +static asm void OSi_SetExContext( void ); +static void OSi_DisplayExContext( void ); + + +//---- context for exception display +typedef struct +{ + OSContext context; + u32 cp15; + u32 spsr; + u32 exinfo; + u32 debug[4]; +} OSiExContext; + +static OSiExContext OSi_ExContext; + +//---- user's exception handler +static OSExceptionHandler OSi_UserExceptionHandler; +static void *OSi_UserExceptionHandlerArg; + +//---- debugger's exception handler +static void *OSi_DebuggerHandler = NULL; + +//================================================================================ +// exception vector +//================================================================================ +/*---------------------------------------------------------------------------* + Name: OS_SetExceptionVectorUpper + + Description: set exception vector to high address + + Arguments: None + + Returns: None + *---------------------------------------------------------------------------*/ +#include +asm void OS_SetExceptionVectorUpper( void ) +{ + mrc p15, 0, r0, c1, c0, 0 + orr r0, r0, #HW_C1_EXCEPT_VEC_UPPER + mcr p15, 0, r0, c1, c0, 0 + bx lr +} + +/*---------------------------------------------------------------------------* + Name: OS_SetExceptionVectorLower + + Description: set exception vector to low address + + Arguments: None + + Returns: None + *---------------------------------------------------------------------------*/ +asm void OS_SetExceptionVectorLower( void ) +{ + mrc p15, 0, r0, c1, c0, 0 + bic r0, r0, #HW_C1_EXCEPT_VEC_UPPER + mcr p15, 0, r0, c1, c0, 0 + bx lr +} +#include + + +//================================================================================ +// exception handling +//================================================================================ +/*---------------------------------------------------------------------------* + Name: OS_InitException + + Description: Initialize exception handling system + + Arguments: None + + Returns: None + *---------------------------------------------------------------------------*/ + +// 将来的には HW_EXCP_VECTOR_BUF をこの値に。 +#define HW_EXCP_VECTOR_BUF_FOR_DEBUGGER HW_EXCP_VECTOR_MAIN + +void OS_InitException(void) +{ + //---- consider for debugger exception handler + if (0x2600000 <= *(u32 *)HW_EXCP_VECTOR_BUF_FOR_DEBUGGER + && *(u32 *)HW_EXCP_VECTOR_BUF_FOR_DEBUGGER < HW_MAIN_MEM_EX_END) + { + OSi_DebuggerHandler = *(void **)HW_EXCP_VECTOR_BUF_FOR_DEBUGGER; + } + else + { + OSi_DebuggerHandler = NULL; + } + + //---- exception hook + if (!OSi_DebuggerHandler) + { + *(u32 *)(HW_EXCP_VECTOR_BUF_FOR_DEBUGGER) = (u32)OSi_ExceptionHandler; + + // for not-debugger, store handler address into original hook + *(u32 *)(HW_EXCP_VECTOR_BUF) = (u32)OSi_ExceptionHandler; + } + + //---- user's handler + OSi_UserExceptionHandler = NULL; +} + +/*---------------------------------------------------------------------------* + Name: OS_SetUserExceptionHandler + + Description: set user exception handler and its argument + + Arguments: handler exception hander + arg its argument + + Returns: None + *---------------------------------------------------------------------------*/ +void OS_SetUserExceptionHandler(OSExceptionHandler handler, void *arg) +{ + OSi_UserExceptionHandler = handler; + OSi_UserExceptionHandlerArg = arg; +} + +/*---------------------------------------------------------------------------* + Name: OSi_ExceptionHandler + + Description: system exception handler + user handler is called from here + + Arguments: None + + Returns: None + *---------------------------------------------------------------------------*/ +// +// status of stack is {cp15,spsr,r12,lr} +// LSB = 1 means coming by reset +// +#include +asm void OSi_ExceptionHandler( void ) +{ + //---- call debugger monitor handler (if exists) + ldr r12, =OSi_DebuggerHandler // r12のみ破壊可 + ldr r12, [r12] + cmp r12, #0 + movne lr, pc + bxne r12 + + //---- setting stack pointer <------------------------- consider later +#ifdef SDK_ARM9 + //---- ARM9 stack + ldr r12, =HW_ITCM_END +#else + //---- ARM7 stack + ldr r12, =0x3806000 +#endif + stmfd r12!, {r0-r3,sp,lr} + + and r0, sp, #1 + mov sp, r12 + + mrs r1, CPSR + and r1, r1, #0x1f + + //---- if ABORT exception, stop + teq r1, #0x17 + bne @10 + bl OSi_GetAndDisplayContext + b usr_return + +@10: + //---- if UNDEF exception, stop + teq r1, #0x1b + bne usr_return + bl OSi_GetAndDisplayContext + +usr_return: + ldr r12, =OSi_DebuggerHandler + ldr r12, [r12] + cmp r12, #0 +@1: beq @1 + +//( stop now even if debugger ) +@2: + mov r0,r0 // nop + b @2 + + ldmfd sp!, {r0-r3, r12, lr} + mov sp, r12 + bx lr +} + +/*---------------------------------------------------------------------------* + Name: OSi_GetAndDisplayContext + + Description: stop after displaying registers + + Arguments: None + + Returns: None + *---------------------------------------------------------------------------*/ +static asm void OSi_GetAndDisplayContext( void ) +{ + stmfd sp!, {r0, lr} /* コールスタックを 8 バイト整合 */ + + //---- set exception context + bl OSi_SetExContext + //---- display exception context (and call user callback) + bl OSi_DisplayExContext + + ldmfd sp!, {r0, lr} /* コールスタックを 8 バイト整合 */ + bx lr +} + +/*---------------------------------------------------------------------------* + Name: OSi_SetExContext + + Description: set context when exception occurred + + Arguments: None + + Returns: None + *---------------------------------------------------------------------------*/ +// explanation registers at the top of this function. +// +// in r12, {r0-r3,sp} (sp is exception sp) stored. +// in this sp, {cp15,spsr,r12,lr} (cp15,spsr,r12,lr is registers when exception occurred) stored. +// r4-r11 is registers then exception occurred. +// if you want to know spsr,sp,lr, please switch bank and read. +// +static asm void OSi_SetExContext( void ) +{ + //---- pointer ExContext structure + ldr r1, =OSi_ExContext; + + mrs r2, CPSR + str r2, [r1, #OSiExContext.debug[1] ] + + //---- store bit which means which is the reason, reset or exception + str r0, [r1, #OSiExContext.exinfo ] + + //---- store r0 - r3 + ldr r0, [r12,#0] + str r0, [r1, #OS_CONTEXT_R0] + ldr r0, [r12,#4] + str r0, [r1, #OS_CONTEXT_R1] + ldr r0, [r12,#8] + str r0, [r1, #OS_CONTEXT_R2] + ldr r0, [r12, #12] + str r0, [r1, #OS_CONTEXT_R3] + ldr r2, [r12, #16] + bic r2, r2, #1 + + //---- store r4 - r11 + add r0, r1, #OS_CONTEXT_R4 + stmia r0, {r4-r11} + + //---- (for debug) + str r12, [r1, #OSiExContext.debug[0] ] + +#ifdef SDK_ARM9 + //---- get {cp15,cpsr,r12,pc} from stack + ldr r0, [r2, #0] + str r0, [r1, #OSiExContext.cp15 ] + ldr r3, [r2, #4] + str r3, [r1, #OS_CONTEXT_CPSR] + ldr r0, [r2, #8] + str r0, [r1, #OS_CONTEXT_R12] + ldr r0, [r2, #12] + str r0, [r1, #OS_CONTEXT_PC_PLUS4] +#else // ifdef SDK_ARM9 + //---- get {cpsr,r12,pc} from stack + mov r0, #0 + str r0, [r1, #OSiExContext.cp15] + ldr r3, [r2, #0] + str r3, [r1, #OS_CONTEXT_CPSR] + ldr r0, [r2, #4] + str r0, [r1, #OS_CONTEXT_R12] + ldr r0, [r2, #8] + str r0, [r1, #OS_CONTEXT_PC_PLUS4] +#endif // ifdef SDK_ARM9 + + //---- set mode to one which exception occurred + // but, disable IRQ + mrs r0, CPSR + orr r3, r3, #0x80 + bic r3, r3, #0x20 + msr CPSR_cxsf, r3 + + //---- get sp, lr, spsr + str sp, [r1, #OS_CONTEXT_R13] + str lr, [r1, #OS_CONTEXT_R14] + mrs r2, SPSR + + //---- debugger + str r2, [r1, #OSiExContext.debug[3] ] + + //---- restore mode + msr CPSR_cxsf, r0 + bx lr +} + +/*---------------------------------------------------------------------------* + Name: OSi_DisplayExContext + + Description: stop after display exception context + + Arguments: None + + Returns: None + *---------------------------------------------------------------------------*/ +static void OSi_DisplayExContext() +{ +#ifndef SDK_FINALROM + int i; + + OSi_ExPrintf("**** Exception Occurred ****\n"); + + //---------------- displaying registers + //---- for R0-15 Registers + for (i = 0; i < 13; i++) + { + OSi_ExPrintf("R%02d=%08X %c", i, OSi_ExContext.context.r[i], ((i & 3) == 3) ? '\n' : ' '); + } + OSi_ExPrintf("SP =%08X ", OSi_ExContext.context.sp); + OSi_ExPrintf("LR =%08X ", OSi_ExContext.context.lr); + OSi_ExPrintf("PC =%08X\n", OSi_ExContext.context.pc_plus4); + + //---- for status Registers +#ifdef SDK_ARM9 + OSi_ExPrintf(" CPSR=%08X SPSR=%08X CP15=%08X\n", + OSi_ExContext.context.cpsr, OSi_ExContext.spsr, OSi_ExContext.cp15); +#else + OSi_ExPrintf(" CPSR=%08X SPSR=%08X\n", OSi_ExContext.context.cpsr, OSi_ExContext.spsr); +#endif + + //---- for Debug Values +#if 0 + for (i = 0; i < 4; i++) + { + OSi_ExPrintf("DEBUG%02d=%08X ", i, OSi_ExContext.debug[i]); + } +#endif + OSi_ExPrintf("\n\n"); +#endif + + //---------------- user's callback + if (OSi_UserExceptionHandler) + { + //---- force to become SYS mode + // but, use current stack not SYS mode stack + asm + { + /* *INDENT-OFF* */ + mov r0, sp + ldr r1, =0x9f + msr CPSR_cxsf, r1 + mov sp, r0 + /* *INDENT-ON* */ + } + +#ifdef SDK_ARM9 + OS_EnableProtectionUnit(); +#endif + + //---- call user handler + ((void (*)(u32, void *))OSi_UserExceptionHandler) ((u32)&OSi_ExContext, + OSi_UserExceptionHandlerArg); + +#ifdef SDK_ARM9 + OS_DisableProtectionUnit(); +#endif + + } + +} + +#include diff --git a/build/libraries/os/common/os_interrupt.c b/build/libraries/os/common/os_interrupt.c index 7cdde98..92d22e3 100644 --- a/build/libraries/os/common/os_interrupt.c +++ b/build/libraries/os/common/os_interrupt.c @@ -206,12 +206,12 @@ OSIrqMask OS_SetIrqMask(OSIrqMask intr) { BOOL ime = OS_DisableIrq(); // IME disable OSIrqMask prep = reg_OS_IE; - reg_OS_IE = intr; + reg_OS_IE = (u32)intr; #ifdef SDK_ARM7 { OSIrqMask prep2 = reg_OS_IE2; prep |= prep2 << 32; - reg_OS_IE2 = intr >> 32; + reg_OS_IE2 = (u32)(intr >> 32); } #endif (void)OS_RestoreIrq(ime); @@ -231,12 +231,12 @@ OSIrqMask OS_EnableIrqMask(OSIrqMask intr) { BOOL ime = OS_DisableIrq(); // IME disable OSIrqMask prep = reg_OS_IE; - reg_OS_IE = prep | intr; + reg_OS_IE = (u32)(prep | intr); #ifdef SDK_ARM7 { OSIrqMask prep2 = reg_OS_IE2; prep |= prep2 << 32; - reg_OS_IE2 = prep2 | intr >> 32; + reg_OS_IE2 = (u32)(prep2 | intr >> 32); } #endif (void)OS_RestoreIrq(ime); @@ -256,12 +256,12 @@ OSIrqMask OS_DisableIrqMask(OSIrqMask intr) { BOOL ime = OS_DisableIrq(); // IME disable OSIrqMask prep = reg_OS_IE; - reg_OS_IE = prep & ~intr; + reg_OS_IE = (u32)(prep & ~intr); #ifdef SDK_ARM7 { OSIrqMask prep2 = reg_OS_IE2; prep |= prep2 << 32; - reg_OS_IE2 = prep2 & ~(intr >> 32); + reg_OS_IE2 = (u32)(prep2 & ~(intr >> 32)); } #endif (void)OS_RestoreIrq(ime); @@ -282,12 +282,12 @@ OSIrqMask OS_ResetRequestIrqMask(OSIrqMask intr) { BOOL ime = OS_DisableIrq(); // IME disable OSIrqMask prep = reg_OS_IF; - reg_OS_IF = intr; + reg_OS_IF = (u32)intr; #ifdef SDK_ARM7 { OSIrqMask prep2 = reg_OS_IF2; prep |= prep2 << 32; - reg_OS_IF2 = intr >> 32; + reg_OS_IF2 = (u32)(intr >> 32); } #endif (void)OS_RestoreIrq(ime); diff --git a/build/libraries/os/common/os_spinLock.c b/build/libraries/os/common/os_spinLock.c index 4fda6aa..98347ed 100644 --- a/build/libraries/os/common/os_spinLock.c +++ b/build/libraries/os/common/os_spinLock.c @@ -269,7 +269,7 @@ void OS_InitLock(void) MIi_SetCartridgeProcessor(MI_PROCESSOR_ARM7); #ifndef SDK_FINALROM - _ISDbgLib_Initialize(); +// _ISDbgLib_Initialize(); #endif (void)OS_UnlockByWord(OS_MAINP_SYSTEM_LOCK_ID - 1, lockp, NULL); @@ -289,7 +289,7 @@ void OS_InitLock(void) } #ifndef SDK_FINALROM - _ISDbgLib_Initialize(); +// _ISDbgLib_Initialize(); #endif // ロックIDカウンタ用フラグ 初期化 diff --git a/build/libraries/pxi/ARM7/Makefile b/build/libraries/pxi/ARM7/Makefile new file mode 100644 index 0000000..55e2e08 --- /dev/null +++ b/build/libraries/pxi/ARM7/Makefile @@ -0,0 +1,59 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: TwlSDK - libraries - pxi +# File: Makefile +# +# Copyright 2007 Nintendo. All rights reserved. +# +# These coded instructions, statements, and computer programs contain +# proprietary information of Nintendo of America Inc. and/or Nintendo +# Company Ltd., and are protected by Federal copyright law. They may +# not be disclosed to third parties or copied or duplicated in any form, +# in whole or in part, without the prior written consent of Nintendo. +# +# $Log: $ +# $NoKeywords: $ +#---------------------------------------------------------------------------- + +SUBDIRS = + +#---------------------------------------------------------------------------- + +# build ARM & THUMB libraries +TWL_CODEGEN_ALL ?= True + +TWL_PROC = ARM7 + +SRCDIR = ../common . +SRCDIR += $(TWL_NITROSDK_ROOT)/build/libraries/pxi/common/src \ + $(TWL_NITROSDK_ROOT)/build/libraries/pxi/ARM7/src \ + +SRCS = pxi_init.c pxi_fifo.c + +TARGET_LIB = libpxi_sp$(TWL_LIBSUFFIX).a + + +#---------------------------------------------------------------------------- + +# DEBUG版ビルドの場合、RELEASE版でビルドして +# DEBUG版のライブラリを装います。 + +ifdef NITRO_DEBUG +NITRO_BUILD_TYPE = RELEASE +endif + +include $(TWLSDK_ROOT)/build/buildtools/commondefs + +INSTALL_TARGETS = $(TARGETS) +INSTALL_DIR = $(TWL_INSTALL_LIBDIR) + + +#---------------------------------------------------------------------------- + +do-build: $(TARGETS) + + +include $(TWLSDK_ROOT)/build/buildtools/modulerules + + +#===== End of Makefile ===== diff --git a/build/libraries/pxi/ARM9/Makefile b/build/libraries/pxi/ARM9/Makefile new file mode 100644 index 0000000..008caba --- /dev/null +++ b/build/libraries/pxi/ARM9/Makefile @@ -0,0 +1,50 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: TwlSDK - libraries - pxi +# File: Makefile +# +# Copyright 2007 Nintendo. All rights reserved. +# +# These coded instructions, statements, and computer programs contain +# proprietary information of Nintendo of America Inc. and/or Nintendo +# Company Ltd., and are protected by Federal copyright law. They may +# not be disclosed to third parties or copied or duplicated in any form, +# in whole or in part, without the prior written consent of Nintendo. +# +# $Log: $ +# $NoKeywords: $ +#---------------------------------------------------------------------------- + +SUBDIRS = + +#---------------------------------------------------------------------------- + +# build ARM & THUMB libraries +TWL_CODEGEN_ALL ?= True + +TWL_PROC = ARM9 + +SRCDIR = ../common . +SRCDIR += $(TWL_NITROSDK_ROOT)/build/libraries/pxi/common/src \ + $(TWL_NITROSDK_ROOT)/build/libraries/pxi/ARM9/src \ + +SRCS = pxi_init.c pxi_fifo.c + +TARGET_LIB = libpxi$(TWL_LIBSUFFIX).a + + +include $(TWLSDK_ROOT)/build/buildtools/commondefs + +INSTALL_TARGETS = $(TARGETS) +INSTALL_DIR = $(TWL_INSTALL_LIBDIR) + + +#---------------------------------------------------------------------------- + +do-build: $(TARGETS) + + +include $(TWLSDK_ROOT)/build/buildtools/modulerules + + +#===== End of Makefile ===== diff --git a/build/libraries/pxi/Makefile b/build/libraries/pxi/Makefile new file mode 100644 index 0000000..40d03aa --- /dev/null +++ b/build/libraries/pxi/Makefile @@ -0,0 +1,34 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: TwlSDK - libraries - pxi +# File: Makefile +# +# Copyright 2007 Nintendo. All rights reserved. +# +# These coded instructions, statements, and computer programs contain +# proprietary information of Nintendo of America Inc. and/or Nintendo +# Company Ltd., and are protected by Federal copyright law. They may +# not be disclosed to third parties or copied or duplicated in any form, +# in whole or in part, without the prior written consent of Nintendo. +# +# $Log: $ +# $NoKeywords: $ +#---------------------------------------------------------------------------- + +include $(TWLSDK_ROOT)/build/buildtools/commondefs + + +#---------------------------------------------------------------------------- + +SUBDIRS = ARM9 + +#ifdef TWL_WITH_ARM7 +SUBDIRS += ARM7 +#endif + +#---------------------------------------------------------------------------- + +include $(TWLSDK_ROOT)/build/buildtools/modulerules + + +#===== End of Makefile ===== diff --git a/build/tests/os/_ARM7-alarm-2/Makefile b/build/tests/os/_ARM7-alarm-2/Makefile index 8553ac8..930e580 100644 --- a/build/tests/os/_ARM7-alarm-2/Makefile +++ b/build/tests/os/_ARM7-alarm-2/Makefile @@ -21,7 +21,6 @@ SUBDIRS = #---------------------------------------------------------------------------- #TWL_CODEGEN = THUMB -TWL_CODEGEN = ARM TWL_PROC = ARM7 TARGET_BIN = main.axf diff --git a/include/nitro/hw/ARM7/mmap_global.h b/include/nitro/hw/ARM7/mmap_global.h new file mode 100644 index 0000000..695847e --- /dev/null +++ b/include/nitro/hw/ARM7/mmap_global.h @@ -0,0 +1,162 @@ +/*---------------------------------------------------------------------------* + Project: NitroSDK - include/sp - HW + File: mmap_global.h + + Copyright 2003-2005 Nintendo. All rights reserved. + + These coded instructions, statements, and computer programs contain + proprietary information of Nintendo of America Inc. and/or Nintendo + Company Ltd., and are protected by Federal copyright law. They may + not be disclosed to third parties or copied or duplicated in any form, + in whole or in part, without the prior written consent of Nintendo. + + $Log: mmap_global.h,v $ + Revision 1.13 2005/02/28 05:26:27 yosizaki + do-indent. + + Revision 1.12 2004/06/11 06:17:48 yada + close SDK_BB support + + Revision 1.11 2004/04/06 06:38:30 yasu + small fix for WRAM address + + Revision 1.10 2004/04/05 10:33:49 takano_makoto + Small modyfy at indent. + + Revision 1.9 2004/04/05 10:32:34 takano_makoto + Add HW_EXT_WRAM + + Revision 1.8 2004/03/25 01:29:45 yada + only add comment + + Revision 1.7 2004/03/23 07:41:29 yada + TEGでないときの、ARM7専用WRAMを考慮 + + Revision 1.6 2004/02/17 08:22:07 yada + tab整形 + + Revision 1.5 2004/02/13 10:40:18 yada + (none) + + Revision 1.4 2004/02/12 13:32:25 yasu + change include guards + + Revision 1.3 2004/02/05 07:09:03 yasu + change SDK prefix iris -> nitro + + Revision 1.2 2003/12/22 14:08:52 yasu + include ガードの修正 + + Revision 1.1 2003/12/16 10:56:38 yasu + spcode から移動 + + Revision 1.2 2003/12/16 06:29:41 ida + DTCM の記述を削除 + 内部ワークRAMの記述を追加 + + Revision 1.1 2003/12/11 05:38:05 yasu + ARM9 版をコピー + + $NoKeywords: $ + *---------------------------------------------------------------------------*/ +#ifndef NITRO_ARM7_HW_MMAP_GLOBAL_H_ +#define NITRO_ARM7_HW_MMAP_GLOBAL_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +//--------------------------------------------------------------------------- +// GLOBAL MEMORY MAP +//--------------------------------------------------------------------------- + +//------------------------------------------------ +// Physical Address +// +//----------------------------- MAIN +#define HW_MAIN_MEM 0x02000000 +#define HW_MAIN_MEM_SIZE 0x00400000 +#define HW_MAIN_MEM_EX_SIZE 0x01000000 + +#define HW_MAIN_MEM_END (HW_MAIN_MEM + HW_MAIN_MEM_SIZE) +#define HW_MAIN_MEM_EX_END (HW_MAIN_MEM + HW_MAIN_MEM_EX_SIZE) + +//----------------------------- MAIN_HI +#define HW_MAIN_MEM_HI 0x0c000000 +#define HW_MAIN_MEM_HI_SIZE 0x01000000 +#define HW_MAIN_MEM_HI_EX_SIZE 0x02000000 + +#define HW_MAIN_MEM_HI_END (HW_MAIN_MEM_HI + HW_MAIN_MEM_HI_SIZE) +#define HW_MAIN_MEM_HI_EX_END (HW_MAIN_MEM_HI + HW_MAIN_MEM_HI_EX_SIZE) + +//----------------------------- WRAMs +#define HW_WRAM 0x037f8000 +#define HW_WRAM_END 0x03800000 +#define HW_WRAM_SIZE (HW_WRAM_END-HW_WRAM) + +//----------------------------- PRV-WRAMs +#define HW_PRV_WRAM 0x03800000 +// TEG : ARM7 WRAM == 32KB +// TS : ARM7 WRAM == 64KB +#if defined(SDK_TEG) +#define HW_PRV_WRAM_END 0x03808000 +#else +#define HW_PRV_WRAM_END 0x03810000 +#endif +#define HW_PRV_WRAM_SIZE (HW_PRV_WRAM_END-HW_PRV_WRAM) + +//----------------------------- IOs +#define HW_IOREG 0x04000000 +#define HW_IOREG_END 0x05000000 +#define HW_REG_BASE HW_IOREG // alias + +//----------------------------- VRAMs +#define HW_BG_PLTT 0x05000000 +#define HW_BG_PLTT_END 0x05000200 +#define HW_BG_PLTT_SIZE (HW_BG_PLTT_END-HW_BG_PLTT) + +#define HW_OBJ_PLTT 0x05000200 +#define HW_OBJ_PLTT_END 0x05000400 +#define HW_OBJ_PLTT_SIZE (HW_OBJ_PLTT_END-HW_OBJ_PLTT) + +#define HW_PLTT HW_BG_PLTT +#define HW_PLTT_END HW_OBJ_PLTT_END +#define HW_PLTT_SIZE (HW_PLTT_END-HW_PLTT) + +#define HW_EXT_WRAM 0x06000000 +#define HW_EXT_WRAM_END 0x06040000 +#define HW_EXT_WRAM_SIZE (HW_EXT_WRAM_END-HW_EXT_WRAM) + +#define HW_BG_VRAM 0x06000000 +#define HW_BG_VRAM_END 0x06080000 +#define HW_BG_VRAM_SIZE (HW_BG_VRAM_END-HW_BG_VRAM) + +#define HW_OBJ_VRAM 0x06400000 +#define HW_OBJ_VRAM_END 0x06440000 +#define HW_OBJ_VRAM_SIZE (HW_OBJ_VRAM_END-HW_OBJ_VRAM) + +#define HW_LCDC_VRAM 0x06800000 +#define HW_LCDC_VRAM_END 0x06898000 +#define HW_LCDC_VRAM_SIZE (HW_LCDC_VRAM_END-HW_LCDC_VRAM) + +#define HW_OAM 0x07000000 +#define HW_OAM_END 0x07000400 +#define HW_OAM_SIZE (HW_OAM_END-HW_OAM) + +//----------------------------- Cartridge Bus +#define HW_CTRDG_ROM 0x08000000 +#define HW_CTRDG_ROM_END 0x0a000000 +#define HW_CTRDG_RAM 0x0a000000 +#define HW_CTRDG_RAM_END 0x0a010000 + +//----------------------------- System ROM +#define HW_BIOS 0xffff0000 +#define HW_BIOS_END 0xffff8000 + +#define HW_RESET_VECTOR 0xffff0000 + +#ifdef __cplusplus +} /* extern "C" */ +#endif +/* NITRO_ARM7_HW_MMAP_GLOBAL_H_ */ +#endif diff --git a/include/nitro/hw/ARM9/mmap_global.h b/include/nitro/hw/ARM9/mmap_global.h new file mode 100644 index 0000000..bc6b6cd --- /dev/null +++ b/include/nitro/hw/ARM9/mmap_global.h @@ -0,0 +1,173 @@ +/*---------------------------------------------------------------------------* + Project: NitroSDK - HW - include + File: mmap_global.h + + Copyright 2003-2005 Nintendo. All rights reserved. + + These coded instructions, statements, and computer programs contain + proprietary information of Nintendo of America Inc. and/or Nintendo + Company Ltd., and are protected by Federal copyright law. They may + not be disclosed to third parties or copied or duplicated in any form, + in whole or in part, without the prior written consent of Nintendo. + + $Log: mmap_global.h,v $ + Revision 1.16 2005/02/28 05:26:27 yosizaki + do-indent. + + Revision 1.15 2004/08/03 03:16:00 yasu + Fix error when assembler source code includes nitro.h + + Revision 1.14 2004/07/23 12:11:27 yada + include types.h + + Revision 1.13 2004/07/23 10:59:46 yada + if SDK_TS, DTCM address is given from SDK_AUTOLOAD_DTCM_START + + Revision 1.12 2004/05/19 09:06:00 yada + fix HW_LCDC_VRAM_END. separate by TS or other + + Revision 1.11 2004/04/07 02:03:17 yada + fix header comment + + Revision 1.10 2004/04/06 04:33:31 takano_makoto + Add entry of HW_EXT_WRAM_ARM7. + + Revision 1.9 2004/02/17 08:22:07 yada + tab整形 + + Revision 1.8 2004/02/05 07:09:03 yasu + change SDK prefix iris -> nitro + + Revision 1.7 2004/02/02 00:25:37 nishida_kenji + fix HW_DB_BG_PLTT and HW_DB_OBJ_PLTT. + + Revision 1.6 2004/01/22 08:40:38 nishida_kenji + for the 2nd display + + Revision 1.5 2004/01/15 08:26:09 yada + HW_ITCM_IMAGE を設定 + + Revision 1.4 2003/12/17 06:05:39 yasu + mmap_reserved.h を mmap_tcm.h と mmap_shared.h に分割 + + Revision 1.3 2003/12/09 08:35:26 yasu + メモリマップ周りを刷新 + + Revision 1.2 2003/12/08 12:18:31 yada + 動作するように「とりあえず変更」をかけた。要修正。 + + Revision 1.1 2003/12/08 09:08:53 yasu + 新規メモリマップ + + $NoKeywords: $ + *---------------------------------------------------------------------------*/ +#ifndef NITRO_HW_MMAP_GLOBAL_H_ +#define NITRO_HW_MMAP_GLOBAL_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +//--------------------------------------------------------------------------- +// GLOBAL MEMORY MAP +//--------------------------------------------------------------------------- + +//----------------------------- ITCM +#define HW_ITCM_IMAGE 0x01000000 +#define HW_ITCM 0x01ff8000 +#define HW_ITCM_SIZE 0x8000 +#define HW_ITCM_END (HW_ITCM + HW_ITCM_SIZE) + +//----------------------------- DTCM +#ifndef SDK_ASM +#include +extern u32 SDK_AUTOLOAD_DTCM_START[]; +#define HW_DTCM ((u32)SDK_AUTOLOAD_DTCM_START) +#else +.extern SDK_AUTOLOAD_DTCM_START +#define HW_DTCM SDK_AUTOLOAD_DTCM_START +#endif +#define HW_DTCM_SIZE 0x4000 +#define HW_DTCM_END (HW_DTCM + HW_DTCM_SIZE) +//----------------------------- MAIN +#define HW_MAIN_MEM 0x02000000 +#define HW_MAIN_MEM_SIZE 0x00400000 +#define HW_MAIN_MEM_EX_SIZE 0x01000000 +#define HW_MAIN_MEM_END (HW_MAIN_MEM + HW_MAIN_MEM_SIZE) +#define HW_MAIN_MEM_EX_END (HW_MAIN_MEM + HW_MAIN_MEM_EX_SIZE) +//----------------------------- MAIN_HI +#define HW_MAIN_MEM_HI 0x0c000000 +#define HW_MAIN_MEM_HI_SIZE 0x01000000 +#define HW_MAIN_MEM_HI_EX_SIZE 0x02000000 +#define HW_MAIN_MEM_HI_END (HW_MAIN_MEM_HI + HW_MAIN_MEM_HI_SIZE) +#define HW_MAIN_MEM_HI_EX_END (HW_MAIN_MEM_HI + HW_MAIN_MEM_HI_EX_SIZE) +//----------------------------- WRAMs +#define HW_WRAM 0x037f8000 +#define HW_WRAM_END 0x03800000 +#define HW_WRAM_SIZE (HW_WRAM_END-HW_WRAM) +//----------------------------- IOs +#define HW_IOREG 0x04000000 +#define HW_IOREG_END 0x05000000 +#define HW_REG_BASE HW_IOREG // alias +//----------------------------- VRAMs +#define HW_BG_PLTT 0x05000000 +#define HW_BG_PLTT_END 0x05000200 +#define HW_BG_PLTT_SIZE (HW_BG_PLTT_END-HW_BG_PLTT) +#define HW_OBJ_PLTT 0x05000200 +#define HW_OBJ_PLTT_END 0x05000400 +#define HW_OBJ_PLTT_SIZE (HW_OBJ_PLTT_END-HW_OBJ_PLTT) +#define HW_PLTT HW_BG_PLTT +#define HW_PLTT_END HW_OBJ_PLTT_END +#define HW_PLTT_SIZE (HW_PLTT_END-HW_PLTT) +#define HW_DB_BG_PLTT 0x05000400 +#define HW_DB_BG_PLTT_END 0x05000600 +#define HW_DB_BG_PLTT_SIZE (HW_DB_BG_PLTT_END-HW_DB_BG_PLTT) +#define HW_DB_OBJ_PLTT 0x05000600 +#define HW_DB_OBJ_PLTT_END 0x05000800 +#define HW_DB_OBJ_PLTT_SIZE (HW_DB_OBJ_PLTT_END-HW_DB_OBJ_PLTT) +#define HW_DB_PLTT HW_DB_BG_PLTT +#define HW_DB_PLTT_END HW_DB_OBJ_PLTT_END +#define HW_DB_PLTT_SIZE (HW_DB_PLTT_END-HW_DB_PLTT) +#define HW_BG_VRAM 0x06000000 +#define HW_BG_VRAM_END 0x06080000 +#define HW_BG_VRAM_SIZE (HW_BG_VRAM_END-HW_BG_VRAM) +#define HW_DB_BG_VRAM 0x06200000 +#define HW_DB_BG_VRAM_END 0x06220000 +#define HW_DB_BG_VRAM_SIZE (HW_DB_BG_VRAM_END-HW_DB_BG_VRAM) +#define HW_OBJ_VRAM 0x06400000 +#define HW_OBJ_VRAM_END 0x06440000 +#define HW_OBJ_VRAM_SIZE (HW_OBJ_VRAM_END-HW_OBJ_VRAM) +#define HW_DB_OBJ_VRAM 0x06600000 +#define HW_DB_OBJ_VRAM_END 0x06620000 +#define HW_DB_OBJ_VRAM_SIZE (HW_DB_OBJ_VRAM_END-HW_DB_OBJ_VRAM) +#define HW_LCDC_VRAM 0x06800000 +#ifdef SDK_TS +#define HW_LCDC_VRAM_END 0x068A4000 +#else +#define HW_LCDC_VRAM_END 0x06898000 +#endif +#define HW_LCDC_VRAM_SIZE (HW_LCDC_VRAM_END-HW_LCDC_VRAM) +#define HW_OAM 0x07000000 +#define HW_OAM_END 0x07000400 +#define HW_OAM_SIZE (HW_OAM_END-HW_OAM) +#define HW_DB_OAM 0x07000400 +#define HW_DB_OAM_END 0x07000800 +#define HW_DB_OAM_SIZE (HW_DB_OAM_END-HW_DB_OAM) +//----------------------------- Cartridge Bus +#define HW_CTRDG_ROM 0x08000000 +#define HW_CTRDG_ROM_END 0x0a000000 +#define HW_CTRDG_RAM 0x0a000000 +#define HW_CTRDG_RAM_END 0x0a010000 +//----------------------------- System ROM +#define HW_BIOS 0xffff0000 +#define HW_BIOS_END 0xffff8000 +#define HW_RESET_VECTOR 0xffff0000 +//----------------------------- for request to ARM7 +#define HW_EXT_WRAM_ARM7 0x06000000 +#define HW_EXT_WRAM_ARM7_END 0x06040000 +#define HW_EXT_WRAM_ARM7_SIZE (HW_EXT_WRAM_ARM7_END-HW_EXT_WRAM_ARM7) +#ifdef __cplusplus +} /* extern "C" */ +#endif +/* NITRO_HW_MMAP_GLOBAL_H_ */ +#endif diff --git a/include/nitro/hw/common/mmap_shared.h b/include/nitro/hw/common/mmap_shared.h new file mode 100644 index 0000000..6aa7676 --- /dev/null +++ b/include/nitro/hw/common/mmap_shared.h @@ -0,0 +1,386 @@ +/*---------------------------------------------------------------------------* + Project: NitroSDK - HW - include + File: mmap_shared.h + + Copyright 2003-2006 Nintendo. All rights reserved. + + These coded instructions, statements, and computer programs contain + proprietary information of Nintendo of America Inc. and/or Nintendo + Company Ltd., and are protected by Federal copyright law. They may + not be disclosed to third parties or copied or duplicated in any form, + in whole or in part, without the prior written consent of Nintendo. + + $Log: mmap_shared.h,v $ + Revision 1.41 2006/01/18 02:11:30 kitase_hirotake + do-indent + + Revision 1.40 2005/09/08 12:28:09 yasu + SDK_FROM_TOOL の判定部分に SDK_WIN32 での判定も追加 + + Revision 1.39 2005/07/27 07:45:30 seiki_masashi + OSSystemWork の wm_keyshare_control を wm_rssi_pool に変更 + + Revision 1.38 2005/06/02 10:28:11 terui + OSSystemWork構造体内のfile_control及びis_reservedメンバを統合してrom_headerメンバに変名 + + Revision 1.37 2005/05/20 03:10:53 yosizaki + add HW_CARD_ROM_HEADER, HW_DOWNLOAD_PARAMETER. + + Revision 1.36 2005/02/28 05:26:01 yosizaki + do-indent. + + Revision 1.35 2004/12/02 00:26:02 yada + add autoload sync + + Revision 1.34 2004/11/22 01:14:51 yada + add HW_ROM_BASE_OFFSET_BUF + + Revision 1.33 2004/09/01 04:19:11 yada + add HW_RESET_PARAMETER_BUF + + Revision 1.32 2004/08/17 04:09:56 yada + add some definition to detect debugger correctly + + Revision 1.31 2004/08/16 08:16:16 yada + HW_CHECK_DEBUGGER_BUF definition is moved to mmap_shared.h header + + Revision 1.30 2004/08/16 08:08:06 yada + add HW_BOOT_CHECK_INFO_BUF and HW_CTRDG_MODULE_INFO_BUF + + Revision 1.29 2004/08/10 12:12:01 yada + place VBlank count buffer in shared area + + Revision 1.28 2004/08/07 00:58:46 terui + wm_controlを削除、wm_callback_control wm_keyshare_controlを追加 + + Revision 1.27 2004/08/03 01:36:27 terui + Add wm_control + + Revision 1.26 2004/07/27 05:59:11 yada + fix OSSystemWork structure. + lowest 0x80 (increased in recent release) byte was forgotten. + + Revision 1.25 2004/07/22 11:29:23 yada + shared area is expanded 0x80 byte + make HW_WM_BOOT_BUF + + Revision 1.24 2004/06/15 02:10:00 yada + only add HW_DMA_CLEAR_DATA_BUF_END + + Revision 1.23 2004/06/08 10:41:55 yada + only fix comment + + Revision 1.22 2004/06/01 04:24:24 terui + Add mic_sampling_data. + + Revision 1.21 2004/05/28 09:40:30 terui + Add mic_last_address + + Revision 1.20 2004/05/24 09:54:31 yasu + move RED_RESERVED_END to (HW_MAIN_MEM + 0x007ffa00) + + Revision 1.19 2004/05/21 12:11:58 yasu + Reduce the SHARED ARENA because of allocating HW_RED_RESERVED + + Revision 1.18 2004/05/21 11:07:26 yada + add HW_RED_RESERVED area + + Revision 1.17 2004/05/19 05:19:17 yada + add NVRAM user info area + + Revision 1.16 2004/05/14 11:58:24 takano_makoto + Add #ifndef SDK_FROM_TOOL for VC or BCB. + + Revision 1.15 2004/05/11 12:08:13 yada + some define names was changed, + HW_BIOS_EXCP_STACK_MAIN, HW_EXCP_VECTOR_MAIN, + HW_IS_RESERVED was deleted. + + Revision 1.14 2004/05/11 01:14:33 yasu + Allocate PXI related flags on shared area + + Revision 1.13 2004/05/10 08:20:19 yada + ram checker deleted, because put checker for main and sub. + + Revision 1.12 2004/05/10 08:15:46 yada + HW_COMPONENT_PARAM の位置変え + + Revision 1.11 2004/05/06 00:38:14 yada + add HW_IS_RESERVED + + Revision 1.10 2004/05/06 00:17:13 yada + add HW_REAL_TIME_CLOCK_BUF + + Revision 1.9 2004/05/04 04:11:11 terui + Change position of real time clock infromation area. + + Revision 1.8 2004/05/04 02:08:50 terui + Add real time clock information area. + + Revision 1.7 2004/04/30 07:37:44 yada + HW_LOCKIDFLAG_MAIN/SUB -> HW_LOCK_ID_FLAG_MAIN/SUB + + Revision 1.6 2004/04/29 09:34:02 yada + put HW_LOCKID_FLAG_MAIN/SUB + + Revision 1.5 2004/04/14 05:05:21 takano_makoto + Add Touch Panel Area. + + Revision 1.4 2004/04/07 02:03:17 yada + fix header comment + + Revision 1.3 2004/03/15 11:02:15 yada + インクルードガード名修正 + + Revision 1.2 2004/03/12 12:11:10 yada + only arrange tab + + Revision 1.1 2004/02/18 07:51:36 yada + mmap_shared.h を A7/9共通に + + Revision 1.5 2004/02/18 01:24:57 yada + XYボタン情報領域を追加 + + Revision 1.4 2004/02/17 06:51:02 yada + より直感的な表記へ変更 + + Revision 1.3 2004/02/14 06:57:48 yasu + add HW_COMPONENT_PARAM + + Revision 1.2 2004/02/13 10:39:58 yada + ARENAを6個から9個にしてインフォエリア拡大 + + Revision 1.1 2004/02/13 01:52:31 yada + ARM7用に追加 (temporary?) + + Revision 1.11 2004/02/12 10:56:04 yasu + new location of include files ARM9/ARM7 + + Revision 1.10 2004/02/05 07:09:03 yasu + change SDK prefix iris -> nitro + + Revision 1.9 2004/01/19 02:29:10 yada + systemWork を 0x200→0x280と増やした。 + それに伴いメンバのオフセットが悉く変更に。 + + Revision 1.8 2004/01/17 11:43:29 yada + アリーナ情報位置変更につき + + Revision 1.7 2004/01/16 11:49:18 yada + リザーブ領域を追加 + + Revision 1.6 2004/01/16 04:13:19 yada + アリーナ定義修正 + + Revision 1.5 2004/01/15 12:14:13 yada + SystemWork にアリーナ構造体を取るようにした + + Revision 1.4 2004/01/07 01:41:34 yada + arena用のデフォルトLo/Hi値定義 + + Revision 1.3 2003/12/25 07:30:42 yada + 型ルール統一による変更 + + Revision 1.2 2003/12/22 13:38:04 yasu + OS_GetSystemWrokをマクロに OS_LockWord を struct タグでアクセスするよう変更 + + Revision 1.1 2003/12/17 06:05:39 yasu + mmap_reserved.h を mmap_tcm.h と mmap_shared.h に分割 + + $NoKeywords: $ + *---------------------------------------------------------------------------*/ +#ifndef NITRO_HW_COMMON_MMAP_SHARED_H_ +#define NITRO_HW_COMMON_MMAP_SHARED_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +//---------------------------------------------------------------------- +// MEMORY MAP of SYSTEM SHARED AREA +//---------------------------------------------------------------------- +// +#define HW_RED_RESERVED (HW_MAIN_MEM_EX_END - 0x800) // maybe change later +#define HW_RED_RESERVED_END (HW_RED_RESERVED + HW_RED_RESERVED_SIZE) +#define HW_RED_RESERVED_SIZE 0x200 + +/* original ROM-header of NITRO-CARD for downloaded program */ +#define HW_CARD_ROM_HEADER_SIZE 0x160 +/* maximun size of parameters for downloaded program */ +#define HW_DOWNLOAD_PARAMETER_SIZE 0x20 + +//---- default address for shared memory arena +#define HW_SHARED_ARENA_LO_DEFAULT HW_MAIN_MEM_SHARED +#ifdef HW_RED_RESERVED +# define HW_SHARED_ARENA_HI_DEFAULT (HW_RED_RESERVED - HW_CARD_ROM_HEADER_SIZE - HW_DOWNLOAD_PARAMETER_SIZE) +#else +# define HW_SHARED_ARENA_HI_DEFAULT (HW_MAIN_MEM_SYSTEM - HW_CARD_ROM_HEADER_SIZE - HW_DOWNLOAD_PARAMETER_SIZE) +#endif + +// 0x027ffa00-0x027ffa7f:(128byte):UNUSED + +/* 0x027ffa80-0x027ffbdf:(352byte): original ROM-header */ +#define HW_CARD_ROM_HEADER (HW_MAIN_MEM + 0x00fffa80) + +/* 0x027ffbe0-0x027ffbff:( 32byte): parameters for downloaded program */ +#define HW_DOWNLOAD_PARAMETER (HW_MAIN_MEM + 0x00fffbe0) + +//-------------------------------- MainMemory shared area +#define HW_MAIN_MEM_SYSTEM_SIZE 0x400 +#define HW_MAIN_MEM_SYSTEM (HW_MAIN_MEM_EX_END - 0x400) + +#define HW_BOOT_CHECK_INFO_BUF (HW_MAIN_MEM_SYSTEM + 0x000) // Boot check info (END-0x400) +#define HW_BOOT_CHECK_INFO_BUF_END (HW_MAIN_MEM_SYSTEM + 0x020) // (END-0x3e0) + +#define HW_RESET_PARAMETER_BUF (HW_MAIN_MEM_SYSTEM + 0x020) // reset parameter (END-0x3e0) + +// 0x027ffc24-0x027ffc2b:(8byte):UNUSED + +#define HW_ROM_BASE_OFFSET_BUF (HW_MAIN_MEM_SYSTEM + 0x02c) // ROM offset of own program (END-0x3d4) +#define HW_ROM_BASE_OFFSET_BUF_END (HW_MAIN_MEM_SYSTEM + 0x030) // (END-0x3d0) + +#define HW_CTRDG_MODULE_INFO_BUF (HW_MAIN_MEM_SYSTEM + 0x030) // Cartridge module info (END-0x3d0) +#define HW_CTRDG_MODULE_INFO_BUF_END (HW_MAIN_MEM_SYSTEM + 0x03c) // (END-0x3c4) + +#define HW_VBLANK_COUNT_BUF (HW_MAIN_MEM_SYSTEM + 0x03c) // VBlank counter (END-0x3c4) + +#define HW_WM_BOOT_BUF (HW_MAIN_MEM_SYSTEM + 0x040) // WM buffer for Multi-Boot (END-0x3c0) +#define HW_WM_BOOT_BUF_END (HW_MAIN_MEM_SYSTEM + 0x080) // (END-0x380) + +#define HW_NVRAM_USER_INFO (HW_MAIN_MEM_SYSTEM + 0x080) // NVRAM user info (END-0x380) +#define HW_NVRAM_USER_INFO_END (HW_MAIN_MEM_SYSTEM + 0x180) // (END-0x280) + +#define HW_BIOS_EXCP_STACK_MAIN (HW_MAIN_MEM_SYSTEM + 0x180) // MAINPデバッガモニタ例外ハンドラ (END-0x280) +#define HW_BIOS_EXCP_STACK_MAIN_END (HW_MAIN_MEM_SYSTEM + 0x19c) // (END-0x264) +#define HW_EXCP_VECTOR_MAIN (HW_MAIN_MEM_SYSTEM + 0x19c) // MAINP用HW_EXCP_VECTOR_BUF (END-0x264) + +#define HW_ARENA_INFO_BUF (HW_MAIN_MEM_SYSTEM + 0x1a0) // アリーナ情報構造体(27F_FDA0〜27F_FDE7) (END-0x260) +#define HW_REAL_TIME_CLOCK_BUF (HW_MAIN_MEM_SYSTEM + 0x1e8) // RTC + +#define HW_DMA_CLEAR_DATA_BUF (HW_MAIN_MEM_SYSTEM + 0x1f0) // DMAクリアデータ・バッファ (END-0x210) +#define HW_DMA_CLEAR_DATA_BUF_END (HW_MAIN_MEM_SYSTEM + 0x200) // (この領域は ARM9-TEG にのみ使用する) + +#define HW_ROM_HEADER_BUF (HW_MAIN_MEM_SYSTEM + 0x200) // ROM内登録エリアデータ・バッファ (END-0x200) +#define HW_ROM_HEADER_BUF_END (HW_MAIN_MEM_SYSTEM + 0x360) // (END-0x0a0) +#define HW_ISD_RESERVED (HW_MAIN_MEM_SYSTEM + 0x360) // IS DEBUGGER Reserved (END-0xa0) +#define HW_ISD_RESERVED_END (HW_MAIN_MEM_SYSTEM + 0x380) // (END-0x80) + +#define HW_PXI_SIGNAL_PARAM_ARM9 (HW_MAIN_MEM_SYSTEM + 0x380) // PXI Signal Param for ARM9 +#define HW_PXI_SIGNAL_PARAM_ARM7 (HW_MAIN_MEM_SYSTEM + 0x384) // PXI Signal Param for ARM7 +#define HW_PXI_HANDLE_CHECKER_ARM9 (HW_MAIN_MEM_SYSTEM + 0x388) // PXI Handle Checker for ARM9 +#define HW_PXI_HANDLE_CHECKER_ARM7 (HW_MAIN_MEM_SYSTEM + 0x38c) // PXI Handle Checker for ARM7 + +#define HW_MIC_LAST_ADDRESS (HW_MAIN_MEM_SYSTEM + 0x390) // MIC 最新サンプリングデータ格納アドレス +#define HW_MIC_SAMPLING_DATA (HW_MAIN_MEM_SYSTEM + 0x394) // MIC 単体サンプリング結果 + +#define HW_WM_CALLBACK_CONTROL (HW_MAIN_MEM_SYSTEM + 0x396) // WM コールバック同期用パラメータ +#define HW_WM_RSSI_POOL (HW_MAIN_MEM_SYSTEM + 0x398) // WM 受信強度による乱数源 + +#define HW_COMPONENT_PARAM (HW_MAIN_MEM_SYSTEM + 0x39c) // Component 同期用パラメータ + +#define HW_THREADINFO_MAIN (HW_MAIN_MEM_SYSTEM + 0x3a0) // ThreadInfo for Main processor +#define HW_THREADINFO_SUB (HW_MAIN_MEM_SYSTEM + 0x3a4) // ThreadInfo for Sub processor +#define HW_BUTTON_XY_BUF (HW_MAIN_MEM_SYSTEM + 0x3a8) // buffer for X and Y button +#define HW_TOUCHPANEL_BUF (HW_MAIN_MEM_SYSTEM + 0x3aa) // buffer for touch panel +#define HW_AUTOLOAD_SYNC_BUF (HW_MAIN_MEM_SYSTEM + 0x3ae) // buffer for autoload sync + +#define HW_LOCK_ID_FLAG_MAIN (HW_MAIN_MEM_SYSTEM + 0x3b0) // lockID flag for Main processor +#define HW_LOCK_ID_FLAG_SUB (HW_MAIN_MEM_SYSTEM + 0x3b8) // lockID flag for Sub processor + +// SpinLock Mutex +#define HW_VRAM_C_LOCK_BUF (HW_MAIN_MEM_SYSTEM + 0x3c0) // VRAM−C・ロックバッファ (END-0x40) +#define HW_VRAM_D_LOCK_BUF (HW_MAIN_MEM_SYSTEM + 0x3c8) // VRAM−D・ロックバッファ (END-0x38) +#define HW_WRAM_BLOCK0_LOCK_BUF (HW_MAIN_MEM_SYSTEM + 0x3d0) // CPU内部ワークRAM・ブロック0・ロックバッファ (END-0x30) +#define HW_WRAM_BLOCK1_LOCK_BUF (HW_MAIN_MEM_SYSTEM + 0x3d8) // CPU内部ワークRAM・ブロック1・ロックバッファ (END-0x28) +#define HW_CARD_LOCK_BUF (HW_MAIN_MEM_SYSTEM + 0x3e0) // カード・ロックバッファ (END-0x20) +#define HW_CTRDG_LOCK_BUF (HW_MAIN_MEM_SYSTEM + 0x3e8) // カートリッジ・ロックバッファ (END-0x18) +#define HW_INIT_LOCK_BUF (HW_MAIN_MEM_SYSTEM + 0x3f0) // 初期化ロックバッファ (END-0x10) + +#define HW_MMEMCHECKER_MAIN (HW_MAIN_MEM_SYSTEM + 0x3f8) // MainMomory Size Checker for Main processor (END-8) +#define HW_MMEMCHECKER_SUB (HW_MAIN_MEM_SYSTEM + 0x3fa) // MainMomory Size Checker for Sub processor (END-6) + +#define HW_CMD_AREA (HW_MAIN_MEM_SYSTEM + 0x3fe) // メインメモリコマンド発行エリア(使用禁止エリア)(END-2) + +//-------------------------------------------------------------------- +//---- Lock area +#define HW_SHARED_LOCK_BUF (HW_VRAM_C_LOCK_BUF) +#define HW_SHARED_LOCK_BUF_END (HW_INIT_LOCK_BUF + 8) + +#define HW_CHECK_DEBUGGER_SW (HW_MAIN_MEM_SYSTEM + 0x010) // (u16)debugger check switch. if 0 check buf1, else buf2. +#define HW_CHECK_DEBUGGER_BUF1 (HW_RED_RESERVED + 0x014) // (u16)debugger checker. 1 if run on debugger. +#define HW_CHECK_DEBUGGER_BUF2 (HW_MAIN_MEM_SYSTEM + 0x014) // (u16)debugger checker. 1 if run on debugger. + +/* if include from Other Environment for exsample VC or BCB, */ +/* please define SDK_FROM_TOOL */ +#if !(defined(SDK_WIN32) || defined(SDK_FROM_TOOL)) +// +//-------------------------------------------------------------------- +#ifndef SDK_ASM +#include + +#include +#include +#include + +typedef union +{ + u32 b32; + u16 b16; +} +OSDmaClearSrc; +typedef struct +{ + u8 bootCheckInfo[0x20]; // 000-01f: 32byte boot check info + u32 resetParameter; // 020-023: 4byte reset parameter + u8 padding5[0x8]; // 024-02c: (8byte) + u32 romBaseOffset; // 02c-02f: 4byte ROM offset of own program + u8 cartridgeModuleInfo[12]; // 030-03b: 12byte cartridge module info + u32 vblankCount; // 03c-03f: 4byte Vブランクカウント + u8 wmBootBuf[0x40]; // 040-07f: 64byte WM のマルチブート用バッファ + u8 nvramUserInfo[0x100]; // 080-17f: 256bytes NVRAM user info + u8 isd_reserved1[0x20]; // 180-19f: 32bytes ISDebugger 予約 + u8 arenaInfo[0x48]; // 1a0-1e7: 72bytte アリーナ情報 + u8 real_time_clock[8]; // 1e8-1ef: 8bytes RTC + u32 dmaClearBuf[4]; // 1f0-1ff: 16bytes DMA クリア情報バッファ (ARM9-TEG用) + u8 rom_header[0x160]; // 200-35f: 352bytes ROM 内登録エリア情報退避バッファ + u8 isd_reserved2[32]; // 360-37f: 32bytes ISDebugger 予約 + u32 pxiSignalParam[2]; // 380-387: 8bytes Param for PXI Signal + u32 pxiHandleChecker[2]; // 388-38f: 8bytes Flag for PXI Command Handler Installed + u32 mic_last_address; // 390-393: 4bytes マイク 最新サンプリング結果の格納アドレス + u16 mic_sampling_data; // 394-395: 2bytes マイク 単体サンプリング結果 + u16 wm_callback_control; // 396-397: 2bytes WM コールバック同期用パラメータ + u16 wm_rssi_pool; // 398-399: 2bytes WM 受信強度による乱数源 + u8 padding3[2]; // 39a-39b: (2bytes) + u32 component_param; // 39c-39f: 4bytes Component 同期用パラメータ + OSThreadInfo *threadinfo_mainp; // 3a0-3a3: 4bytes ARM9 スレッド情報へのポインタ 初期値0であること + OSThreadInfo *threadinfo_subp; // 3a4-3a7: 4bytes ARM7 スレッド情報へのポインタ 初期値0であること + u16 button_XY; // 3a8-3a9: 2bytes XY ボタン情報格納位置 + u8 touch_panel[4]; // 3aa-3ad: 4bytes タッチパネル情報格納位置 + u16 autoloadSync; // 3ae-3af: 2bytes autoload sync between processors + u32 lockIDFlag_mainp[2]; // 3b0-3b7: 8bytes lockID管理フラグ(ARM9用) + u32 lockIDFlag_subp[2]; // 3b8-3bf: 8bytes lockID管理フラグ(ARM7用) + struct OSLockWord lock_VRAM_C; // 3c0-3c7: 8bytes C・ロックバッファ + struct OSLockWord lock_VRAM_D; // 3c8-3cf: 8bytes VRAM−D・ロックバッファ + struct OSLockWord lock_WRAM_BLOCK0; // 3d0-3d7: 8bytes ブロック0・ロックバッファ + struct OSLockWord lock_WRAM_BLOCK1; // 3d8-3df: 8bytes CPU内部ワークRAM・ブロック1・ロックバッファ + struct OSLockWord lock_CARD; // 3e0-3e7: 8bytes カード・ロックバッファ + struct OSLockWord lock_CARTRIDGE; // 3e8-3ef: 8bytes カートリッジ・ロックバッファ + struct OSLockWord lock_INIT; // 3f0-3f7: 8bytes 初期化ロックバッファ + u16 mmem_checker_mainp; // 3f8-3f9: 2bytes MainMomory Size Checker for Main processor + u16 mmem_checker_subp; // 3fa-3fb: 2bytes MainMomory Size Checker for Sub processor + u8 padding4[2]; // 3fc-3fd: (2bytes) + u16 command_area; // 3fe-3ff: 2bytes Command Area +} +OSSystemWork; + +#define OS_GetSystemWork() ((OSSystemWork *)HW_MAIN_MEM_SYSTEM) +#endif + + +#endif // SDK_FROM_TOOL + +#ifdef __cplusplus +} /* extern "C" */ +#endif +/* NITRO_HW_COMMON_MMAP_SHARED_H_ */ +#endif diff --git a/include/nitro/os/common/interrupt.h b/include/nitro/os/common/interrupt.h index 8d3dcaa..3f21d47 100644 --- a/include/nitro/os/common/interrupt.h +++ b/include/nitro/os/common/interrupt.h @@ -137,18 +137,6 @@ void OSi_EnterTimerCallback(u32 timerNo, void (*callback) (void *), void *arg #define OS_IRQ_MAIN_BUFFER_SIZE (0x200) -//---- interrupt handler type -typedef void (*OSIrqFunction) (void); - -//---- for irq callback (internal use) -typedef struct -{ - void (*func) (void *); - u32 enable; - void *arg; -} -OSIrqCallbackInfo; - //---- irq factor type define #ifndef OSi_OSIRQMASK_DEFINED #ifdef SDK_ARM9 @@ -159,6 +147,18 @@ typedef u64 OSIrqMask; #define OSi_OSIRQMASK_DEFINED #endif +//---- interrupt handler type +typedef void (*OSIrqFunction) (void); + +//---- for irq callback (internal use) +typedef struct +{ + void (*func) (void *); + void *arg; + OSIrqMask enable; +} +OSIrqCallbackInfo; + //---- table of irq functions extern OSIrqFunction OS_IRQTable[]; diff --git a/include/twl/specfiles/ARM7-TS.lsf b/include/twl/specfiles/ARM7-TS.lsf index 3a66205..45ac832 100644 --- a/include/twl/specfiles/ARM7-TS.lsf +++ b/include/twl/specfiles/ARM7-TS.lsf @@ -55,7 +55,7 @@ Static $(TARGET_NAME) { - Address 0x02380000 + Address 0x02f80000 Library crt0.o StackSize 1024 512 }