diff --git a/build/libraries_sysmenu/card/common/include/Card.h b/build/libraries_sysmenu/card/common/include/Card.h new file mode 100644 index 00000000..75a6f422 --- /dev/null +++ b/build/libraries_sysmenu/card/common/include/Card.h @@ -0,0 +1,265 @@ +/*---------------------------------------------------------------------------* + Project: TwlSDK + File: Card.h + *---------------------------------------------------------------------------*/ +#ifndef __MY_CARD_H__ +#define __MY_CARD_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +// Define ------------------------------------------------------------------- +#define KEY_BUF_SIZE 3 // Blowfishキーのバッファサイズ +#define DMA_NO 2 // +#define BOOT_SEGMENT_SIZE 0x1000 // Boot Segment領域のサイズ +#define SECURE_SEGMENT_SIZE 0x4000 // Secure領域のサイズ + +#define VAE_VALUE 0xaaaaaa // VAE (コマンド認証値(期待値)) +#define VBI_VALUE 0xbbbbb // VBI (コマンドカウンタ 初期値) +#define VD_VALUE 0xdddddd // VD (PNジェネレータ 初期値) + +#define PNA_BASE_VALUE 0x60e8 // +#define PNB_L_VALUE 0x879b9b05 // +#define PNB_H_VALUE 0x5c // + +// コントロールレジスタ1 bit関連 +#define START_FLG_MASK 0x80000000 +#define READY_FLG_MASK 0x00800000 + +#define LATENCY1_SHIFT 0 +#define LATENCY1_MASK 0x00001fff + +#define DS_SHIFT 13 +#define DS_MASK 0x00002000 + +#define SE_SHIFT 14 +#define SE_MASK 0x00004000 + +#define SCR_SHIFT 15 +#define SCR_MASK 0x00008000 + +#define LATENCY2_SHIFT 16 +#define LATENCY2_MASK 0x003f0000 + +#define CS_SHIFT 22 +#define CS_MASK 0x00400000 + +#define RDY_SHIFT 23 +#define RDY_MASK 0x00800000 + +#define PC_SHIFT 24 +#define PC_MASK 0x07000000 + +#define CT_SHIFT 27 +#define CT_MASK 0x08000000 + +#define TRM_SHIFT 28 +#define TRM_MASK 0x10000000 + +#define RESB_SHIFT 29 +#define RESB_MASK 0x20000000 + +#define WR_SHIFT 30 +#define WR_MASK 0x40000000 + +#define START_SHIFT 31 +#define START_MASK 0x80000000 + +#define CNT1_FLD( start, wr, resb, rtm, ct, pc, rdy, cs, l2, scr, se, ds, l1 ) \ + (u32)( \ + ((u32)(start)<< START_SHIFT) | \ + ((u32)(wr) << WR_SHIFT) | \ + ((u32)(resb) << RESB_SHIFT) | \ + ((u32)(rtm) << TRM_SHIFT) | \ + ((u32)(ct) << CT_SHIFT) | \ + ((u32)(pc) << PC_SHIFT) | \ + ((u32)(rdy) << RDY_SHIFT) | \ + ((u32)(cs) << CS_SHIFT) | \ + ((u32)(l2) << LATENCY2_SHIFT) | \ + ((u32)(scr) << SCR_SHIFT) | \ + ((u32)(se) << SE_SHIFT) | \ + ((u32)(ds) << DS_SHIFT) | \ + ((u32)(l1) << LATENCY1_SHIFT) \ + ) + +#define CNT1_MSK( start, wr, resb, rtm, ct, pc, rdy, cs, l2, scr, se, ds, l1 ) \ + (u32)( ((start) ? START_MASK : 0) | \ + ((wr) ? WR_MASK : 0) | \ + ((resb) ? RESB_MASK : 0) | \ + ((rtm) ? TRM_MASK : 0) | \ + ((ct) ? CT_MASK : 0) | \ + ((pc) ? PC_MASK : 0) | \ + ((rdy) ? RDY_MASK : 0) | \ + ((cs) ? CS_MASK : 0) | \ + ((l2) ? LATENCY2_MASK : 0)| \ + ((scr) ? SCR_MASK : 0) | \ + ((se) ? SE_MASK : 0) | \ + ((ds) ? DS_MASK : 0) | \ + ((l1) ? LATENCY1_MASK : 0)) + + + +//#define USE_SLOT_A + +#ifdef USE_SLOT_A +// Slot A +#define SLOT_STATUS_MODE_SELECT_MSK 0x0c +#define SLOT_STATUS_MODE_01 0x04 +#define SLOT_STATUS_MODE_10 0x08 +#define SLOT_STATUS_MODE_11 0x0c + +#define reg_MCCNT1 reg_MI_MCCNT1_A + +#define reg_MCCMD0 reg_MI_MCCMD0_A +#define reg_MCCMD1 reg_MI_MCCMD1_A + +#define reg_MCCNT0 reg_MI_MCCNT0_A +#define reg_MCCNT1 reg_MI_MCCNT1_A + +#define reg_MCD1 reg_MI_MCD1_A + +#define reg_MCSCR0 reg_MI_MCSCR0_A +#define reg_MCSCR1 reg_MI_MCSCR1_A +#define reg_MCSCR2 reg_MI_MCSCR2_A + +#else +// Slot B +#define SLOT_STATUS_MODE_SELECT_MSK 0xc0 +#define SLOT_STATUS_MODE_01 0x40 +#define SLOT_STATUS_MODE_10 0x80 +#define SLOT_STATUS_MODE_11 0xc0 + +#define reg_MCCNT1 reg_MI_MCCNT1_B + +#define reg_MCCMD0 reg_MI_MCCMD0_B +#define reg_MCCMD1 reg_MI_MCCMD1_B + +#define reg_MCCNT0 reg_MI_MCCNT0_B +#define reg_MCCNT1 reg_MI_MCCNT1_B + +#define reg_MCD1 reg_MI_MCD1_B + +#define reg_MCSCR0 reg_MI_MCSCR0_B +#define reg_MCSCR1 reg_MI_MCSCR1_B +#define reg_MCSCR2 reg_MI_MCSCR2_B + +#endif + + +// Enum --------------------------------------------------------------------- +typedef enum NormalCommandType{ + RD_ID = 0, + RD_BSEG, + CHG_MODE +}NormalCommandType; + +typedef enum SecureCommandType{ + S_RD_ID = 0, + S_RD_SEG, + S_PNG_ON, + S_PNG_OFF, + S_CHG_MODE +}SecureCommandType; + +typedef enum GameCommandType{ + G_RD_ID = 0, + G_RD_PAGE +}GameCommandType; + +typedef enum CardType{ + CARD_DS_TYPE1 = 0, + CARD_DS_TYPE2, + CARD_TWL +}CardType; + +// union --------------------------------------------------------------------- +typedef union +{ + u64 dw; + u8 b[8]; +} +GCDCmd64; + +// ブートセグメントデータ +typedef union BootSegmentData +{ + ROM_Header rh; + u32 word[BOOT_SEGMENT_SIZE / sizeof(u32)]; +} +BootSegmentData; + +// struct ------------------------------------------------------------------- +typedef struct BLOWFISH_CTX{ + u32 P[16 + 2]; + u32 S[4][256]; +} BLOWFISH_CTX; + +// カードブート時に必要な変数一式をまとめた構造体 +typedef struct CardBootData{ + u32 vae; + u32 vbi; + u32 vd; + + u32 id_nml; + u32 id_scr; + u32 id_gam; + + u32 arm9StaticSize; + u32 arm7StaticSize; + u32 arm9LtdSize; + u32 arm7LtdSize; + + BOOL twlFlg; + + u32 keyBuf[KEY_BUF_SIZE]; + + u64 secureSegNum; + + BootSegmentData *pBootSegBuf; + u32 *pSecureSegBuf; + + BLOWFISH_CTX keyTable; +} +CardBootData; + +// カード起動用関数 +typedef struct CardBootFunction { + void (*ReadID_N)(CardBootData *cbd); + void (*ReadBootSegment_N)(CardBootData *cbd); + void (*ChangeMode_N)(CardBootData *cbd); + + void (*ReadID_S)(CardBootData *cbd); + void (*ReadSegment_S)(CardBootData *cbd); + void (*SetPNG_S)(CardBootData *cbd); + void (*ChangeMode_S)(CardBootData *cbd); + + void (*ReadID_G)(CardBootData *cbd); +} +CardBootFunction; + + +// Function prototype ------------------------------------------------------- +// 活栓挿抜処理の初期化 +void Card_Init(void); + +// カード起動。Normalモード→Secureモード→Gameモードを行う。 +void Card_Boot(void); + +// Boot Segment バッファの指定 +void Card_SetBootSegmentBuffer(void* buf, u32 size); + +// Secure Segment バッファの指定 +void Card_SetSecureSegmentBuffer(void* buf, u32 size); + +// Boot Segment を読み込む関数 +BOOL Card_GetRomHeaderData(void); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif // __MY_CARD_H__ \ No newline at end of file diff --git a/build/libraries_sysmenu/card/common/include/blowfish.h b/build/libraries_sysmenu/card/common/include/blowfish.h new file mode 100644 index 00000000..1d961877 --- /dev/null +++ b/build/libraries_sysmenu/card/common/include/blowfish.h @@ -0,0 +1,47 @@ +/*---------------------------------------------------------------------------* + Project: TwlFirm - GCD - include + File: blowfish.h + + 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. + *---------------------------------------------------------------------------*/ +#ifndef FIRM_GCD_BLOWFISH_H +#define FIRM_GCD_BLOWFISH_H + + +#include +#include "Card.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/*************************************************************************/ + +// 初期化テーブル +extern const BLOWFISH_CTX GCDi_BlowfishInitTableDS; + +// Function Prototype ------------------------------------------------------------------------ +// Blowfish 初期化 +void InitBlowfish(BLOWFISH_CTX *ctx, const unsigned char *key, int keyLen); + +// Blowfish 復号化 +void EncryptByBlowfish(const BLOWFISH_CTX *ctx, u32 *xl, u32 *xr); + +// Blowfish 暗号化 +void DecryptByBlowfish(const BLOWFISH_CTX *ctx, u32 *xl, u32 *xr); + +// Key Table の生成 +void GCDm_MakeBlowfishTableDS(BLOWFISH_CTX *tableBufp, ROM_Header_Short *rhs, u32 *keyBufp, s32 keyLen); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif // FIRM_GCD_BLOWFISH_H diff --git a/build/libraries_sysmenu/card/common/include/dsCardType1.h b/build/libraries_sysmenu/card/common/include/dsCardType1.h new file mode 100644 index 00000000..7a5a0499 --- /dev/null +++ b/build/libraries_sysmenu/card/common/include/dsCardType1.h @@ -0,0 +1,56 @@ +/*---------------------------------------------------------------------------* + Project: TwlSDK + File: + *---------------------------------------------------------------------------*/ +#ifndef __DSCARD_TYPE1_H__ +#define __DSCARD_TYPE1_H__ + +#ifdef __cplusplus +extern "C" { +#endif + + +#include +#include "Card.h" + +// =========================================================================== +// Function Describe +// =========================================================================== + +// ■ ノーマルモードのコマンド ■ +// DSカードType1のノーマルモードのID読み込み +void ReadIDNormal_DSType1(CardBootData *cbd); + +// DSカードType1のノーマルモードのBoot Segment(4Kbyte)読み込み +void ReadBootSegNormal_DSType1(CardBootData *cbd); + +// DSカードType1のノーマルモードのモード変更 +void ChangeModeNormal_DSType1(CardBootData *cbd); + + +// ■ セキュアモードのコマンド ■ +// DSカードType1のセキュアモードのID読み込み +void ReadIDSecure_DSType1(CardBootData *cbd); + +// DSカードType1のセキュアモードのSecure Segment(16Kbyte)読み込み +void ReadSegSecure_DSType1(CardBootData *cbd); + +// DSカードType1のセキュアモードのPNジェネレータON +void SwitchONPNGSecure_DSType1(CardBootData *cbd); + +// DSカードType1のセキュアモードのPNジェネレータOFF +void SwitchOFFPNGSecure_DSType1(CardBootData *cbd); + +// DSカードType1のセキュアモードのモード変更 +void ChangeModeSecure_DSType1(CardBootData *cbd); + + +// ■ ゲームモードのコマンド ■ +// DSカードType1のゲームモードのID読み込み +void ReadIDGame_DSType1(CardBootData *cbd); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif // __DSCARD_TYPE1_H__ diff --git a/build/libraries_sysmenu/card/common/src/Card.c b/build/libraries_sysmenu/card/common/src/Card.c new file mode 100644 index 00000000..bcad86a8 --- /dev/null +++ b/build/libraries_sysmenu/card/common/src/Card.c @@ -0,0 +1,435 @@ +/*---------------------------------------------------------------------------* + Project: TwlSDK + File: Card.c + + 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. + *---------------------------------------------------------------------------*/ + +#include +#include + +#include +#include "blowfish.h" +#include "Card.h" +#include "dsCardType1.h" + +// define ------------------------------------------------------------------- +#define STACK_SIZE 1024 // スタックサイズ +#define MC_THREAD_PRIO 11 // カード電源ON → ゲームモードのスレッド優先度 + +// Function prototype ------------------------------------------------------- +static BOOL IsCardExist(void); + +static void SetInterruptCallback( OSIrqMask intr_bit, OSIrqFunction func ); +static void SetInterruptCallbackEx( OSIrqMask intr_bit, void *func ); +static void SetInterrupt(void); + +static void InterruptCallbackCard(void); +static void InterruptCallbackCardDet(void); +static void InterruptCallbackCardData(void); + +static void McThread(void *arg); +static void McPowerOn(void); +static void SetMCSCR(void); + +static void ShowRegisterData(void); +static void ShowRomHeaderData(void); + +// Static Values ------------------------------------------------------------ +static u64 s_MCStack[STACK_SIZE / sizeof(u64)]; +static OSThread s_MCThread; + +static u32 s_SecureSegBufSize, s_BootSegBufSize; + +static u32 *s_pSecureSegBuffer; // カード抜けてもバッファの場所覚えとく +static BootSegmentData *s_pBootSegBuffer; // カード抜けてもバッファの場所覚えとく + +static CardBootData s_cbData; + +static CardBootFunction s_funcTable[] = { + {ReadIDNormal_DSType1, ReadBootSegNormal_DSType1, ChangeModeNormal_DSType1, + ReadIDSecure_DSType1, ReadSegSecure_DSType1, SwitchONPNGSecure_DSType1, ChangeModeSecure_DSType1, + ReadIDGame_DSType1} +}; + +// =========================================================================== +// Function Describe +// =========================================================================== +/*---------------------------------------------------------------------------* + Name: Card_Init + Arguments: None. + Returns: None. + *---------------------------------------------------------------------------*/ +void Card_Init(void) +{ + OS_InitTick(); + OS_InitThread(); + + // 割り込みマスクの設定 + SetInterrupt(); + + // 割り込みの有効化 + (void)OS_EnableIrq(); + (void)OS_EnableInterrupts(); + +#ifdef SDK_ARM7 + // チャッタリングカウンタの値を設定 + reg_MI_MC1 = (u32)((reg_MI_MC1 & 0xffff) | 0xfff0000); + + // Counter-Aの値を設定 + reg_MI_MC2 = 0xfff; +#endif + + // カードブート用スレッドの生成 + OS_CreateThread(&s_MCThread, + McThread, + NULL, + s_MCStack + STACK_SIZE / sizeof(u64), + STACK_SIZE, + MC_THREAD_PRIO + ); + + // スレッド起動 + OS_WakeupThreadDirect(&s_MCThread); + + // カードブート用構造体の初期化 + MI_CpuClear32(&s_cbData, sizeof(CardBootData)); +} + +/* ----------------------------------------------------------------- + * Card_Boot関数 + * + * カード起動をスタート + * + * ※BootSegmentBuffer SecureSegmentBufferの設定を行ってから + * この関数を呼んでください。 + * ----------------------------------------------------------------- */ +void Card_Boot(void) +{ + OS_TPrintf("---------------- Card Boot Start ---------------\n"); + + // カード電源ON + McPowerOn(); + + // VAE・VBI・VD値の設定 + s_cbData.vae = VAE_VALUE; + s_cbData.vbi = VBI_VALUE; + s_cbData.vd = VD_VALUE; + + // セキュア領域の読み込みセグメント先頭番号(Segment4 〜 Segment 7) + s_cbData.secureSegNum = 4; + + // バッファを設定 + s_cbData.pBootSegBuf = s_pBootSegBuffer; + s_cbData.pSecureSegBuf = s_pSecureSegBuffer; + + if(IsCardExist()){ + // ---------------------- Normal Mode ---------------------- + // カードID読み込み + s_funcTable[0].ReadID_N(&s_cbData); + + // Boot Segment読み込み + s_funcTable[0].ReadBootSegment_N(&s_cbData); + + // TWLカードかNTRカードか判定 (Platform code : bit0 : not support NTR, bit1 : support TWL) + if(s_cbData.pBootSegBuf->rh.s.platform_code & 0x02){ + OS_TPrintf("TWL Card.\n"); + + s_cbData.twlFlg = TRUE; + } + + // Key Table初期化 + GCDm_MakeBlowfishTableDS(&s_cbData.keyTable, &s_pBootSegBuffer->rh.s, s_cbData.keyBuf, 8); + + // セキュアモードに移行 + s_funcTable[0].ChangeMode_N(&s_cbData); + + // ---------------------- Secure Mode ---------------------- + // PNG設定 + s_funcTable[0].SetPNG_S(&s_cbData); + + // DS側符号生成回路初期値設定 (レジスタ設定) + SetMCSCR(); + + // ID読み込み + s_funcTable[0].ReadID_S(&s_cbData); + + // Secure領域のSegment読み込み + s_funcTable[0].ReadSegment_S(&s_cbData); + + // ゲームモードに移行 + s_funcTable[0].ChangeMode_S(&s_cbData); + + // ---------------------- Game Mode ---------------------- + // ID読み込み + s_funcTable[0].ReadID_G(&s_cbData); + + OS_TPrintf("-----------------------------------------------\n\n"); + } + else{ + OS_TPrintf("Card Not Found\n"); + } +} + +/* ----------------------------------------------------------------- + * IsCardExist関数 + * + * カードの存在判定 + * + * ※SCFG_MC1のSlot B モード選択フラグを見ている + * + * モード選択フラグが 10 (全ての端子から有効出力) の時ささっていると判定 + Slot A の場合 if((reg_MI_MC1 & 0x0c) == 0x08) + Slot B の場合 if((reg_MI_MC1 & 0xc0) == 0x80) + * ----------------------------------------------------------------- */ +static BOOL IsCardExist(void) +{ + if((reg_MI_MC1 & SLOT_STATUS_MODE_SELECT_MSK) == SLOT_STATUS_MODE_10){ + return TRUE; + } + else{ + return FALSE; + } +} + +/* ----------------------------------------------------------------- + * Card_SetBootSegmentBuffer関数 + * + * Boot Segment バッファの指定 + * + * 注:カードブート処理中は呼び出さないようにする + * ----------------------------------------------------------------- */ +void Card_SetBootSegmentBuffer(void* buf, u32 size) +{ + SDK_ASSERT(size > BOOT_SEGMENT_SIZE); + + s_pBootSegBuffer = (BootSegmentData *)buf; + s_BootSegBufSize = size; + + s_cbData.pBootSegBuf = s_pBootSegBuffer; + + // バッファの初期化 + MI_CpuClear8(s_pBootSegBuffer, size); +} + +/* ----------------------------------------------------------------- + * Card_SetSecureSegmentBuffer関数 + * + * Secure Segment バッファの指定 + * + * 注:カードブート処理中は呼び出さないようにする + * ----------------------------------------------------------------- */ +void Card_SetSecureSegmentBuffer(void* buf, u32 size) +{ + SDK_ASSERT(size > SECURE_SEGMENT_SIZE); + + s_pSecureSegBuffer = (u32 *)buf; + s_SecureSegBufSize = size; + + s_cbData.pSecureSegBuf = s_pSecureSegBuffer; + + // バッファの初期化 + MI_CpuClear8(s_pSecureSegBuffer, size); +} + +/* ----------------------------------------------------------------- + * McThread B 関数 + * ----------------------------------------------------------------- */ +static void McThread(void *arg) +{ + #pragma unused( arg ) + + while(1){ + OS_SleepThread(NULL); + + // カードブート + Card_Boot(); + } +} + +/* ----------------------------------------------------------------- + * McPowerOn関数 + * ----------------------------------------------------------------- */ +static void McPowerOn(void) +{ + OSTick start; + + // SCFG_MC1 の Slot2 Status の M1,M0 を 01 にする + reg_MI_MC1 = (u32)((reg_MI_MC1 & (~SLOT_STATUS_MODE_SELECT_MSK)) | SLOT_STATUS_MODE_01); + + // 100ms待ち + start = OS_GetTick(); + while(OS_TicksToMilliSeconds(OS_GetTick()-start) < 100){} + + // SCFG_MC1 の Slot2 Status の M1,M0 を 10 にする + reg_MI_MC1 = (u32)((reg_MI_MC1 & (~SLOT_STATUS_MODE_SELECT_MSK)) | SLOT_STATUS_MODE_10); + + // リセットをhighに (RESB = 1にする) + reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(1,1,0,1,1,1,1,1,1,1,1,1,1)) | + CNT1_FLD(0,0,1,0,0,0,0,0,0,0,0,0,0)); + + // 100ms待ち + start = OS_GetTick(); + while(OS_TicksToMilliSeconds(OS_GetTick()-start) < 100){} + + OS_TPrintf("MC Power ON\n"); +} + +/*---------------------------------------------------------------------------* + Name: SetMCSCR + + Description: 符号生成回路初期値設定レジスタを設定する + + ※注:この関数はセキュアモードで、 + sPNG_ONコマンドを実行してから呼び出してください。 + *---------------------------------------------------------------------------*/ +static void SetMCSCR(void) +{ + u32 pna_l = (u32)(PNA_BASE_VALUE | (s_cbData.vd << 15)); + u32 pna_h = (u32)(s_cbData.vd >> 17); + + // SCR A + reg_MCSCR0 = pna_l; + + // SCR B + reg_MCSCR1 = PNB_L_VALUE; + + // [d0 -d6 ] -> SCR A + // [d16-d22] -> SCR B + reg_MCSCR2 = (u32)(pna_h | PNB_H_VALUE << 16); + + // MCCNT1 レジスタ設定 (SCR = 1に) + reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(1,1,1,1, 1,1, 1,1, 1, 0,1,1, 1)) | + CNT1_FLD(0,0,0,0, 0,0, 0,0, 0, 1,0,0, 0)); +} + +/*---------------------------------------------------------------------------* + Name: InterruptCallbackCard + InterruptCallbackCardDet + InterruptCallbackCardData + + Description: 各種割り込みコールバック関数 + *---------------------------------------------------------------------------*/ +// カードB抜け +static void InterruptCallbackCard(void) +{ + // Mを 10 から 11 に遷移 + reg_MI_MC1 = (u32)((reg_MI_MC1 & (~SLOT_STATUS_MODE_SELECT_MSK)) | SLOT_STATUS_MODE_11); + + // カードブート用構造体の初期化 + MI_CpuClear32(&s_cbData, sizeof(CardBootData)); + + // バッファの初期化 + MI_CpuClear8(s_pBootSegBuffer, s_BootSegBufSize); + MI_CpuClear8(s_pSecureSegBuffer, s_SecureSegBufSize); + + // MC_CNT1を初期化 + reg_MCCNT1 = 0x0; + +#ifdef USE_SLOT_A + OS_SetIrqCheckFlagEx(OS_IE_CARD_A_IREQ); +#else + OS_SetIrqCheckFlagEx(OS_IE_CARD_B_IREQ); +#endif +} + +// カードB挿し +static void InterruptCallbackCardDet(void) +{ + // カードブートスレッドを起動する + OS_WakeupThreadDirect(&s_MCThread); + +#ifdef USE_SLOT_A + OS_SetIrqCheckFlagEx(OS_IE_CARD_A_DET); +#else + OS_SetIrqCheckFlagEx(OS_IE_CARD_B_DET); +#endif +} + +// カードB データ転送終了 +static void InterruptCallbackCardData(void) +{ +#ifdef USE_SLOT_A + OS_SetIrqCheckFlagEx(OS_IE_CARD_A_DATA); +#else + OS_SetIrqCheckFlagEx(OS_IE_CARD_B_DATA); +#endif +} + +/*---------------------------------------------------------------------------* + Name: SetInterruptCallback + SetInterruptCallbackEx + + Description: 割り込みコールバック関数と割り込み許可の設定を行う + *---------------------------------------------------------------------------*/ +static void SetInterruptCallback( OSIrqMask intr_bit, OSIrqFunction func ) +{ + (void)OS_SetIrqFunction(intr_bit, func); + (void)OS_EnableIrqMask(intr_bit); +} + +static void SetInterruptCallbackEx( OSIrqMask intr_bit, void *func ) +{ + (void)OS_SetIrqFunctionEx(intr_bit, func); + (void)OS_EnableIrqMaskEx(intr_bit); +} + +/*---------------------------------------------------------------------------* + Name: SetInterrupt + + Description: 割り込みコールバック関数を一度に設定する関数 + *---------------------------------------------------------------------------*/ +static void SetInterrupt(void) +{ +#ifdef USE_SLOT_A + SetInterruptCallback( OS_IE_CARD_A_IREQ , InterruptCallbackCard ); + SetInterruptCallback( OS_IE_CARD_A_DET , InterruptCallbackCardDet ); + SetInterruptCallback( OS_IE_CARD_A_DATA , InterruptCallbackCardData ); +#else + SetInterruptCallback( OS_IE_CARD_B_IREQ , InterruptCallbackCard ); + SetInterruptCallback( OS_IE_CARD_B_DET , InterruptCallbackCardDet ); + SetInterruptCallback( OS_IE_CARD_B_DATA , InterruptCallbackCardData ); +#endif +} + + + +// ************************************************************************** +// +// Debug用表示関数 +// +// ************************************************************************** +/*---------------------------------------------------------------------------* + Name: ShowRomHeaderData + + Description: + *---------------------------------------------------------------------------*/ +static void ShowRomHeaderData(void) +{ + OS_TPrintf("Rom Header Data -------------------------------\n"); + OS_TPrintf("titleName : %s\n", s_pBootSegBuffer->rh.s.title_name); + OS_TPrintf("initialCode : %x\n", *(u32 *)s_pBootSegBuffer->rh.s.game_code); + OS_TPrintf("-----------------------------------------------\n"); +} + +/*---------------------------------------------------------------------------* + Name: ShowRegisterData + + Description: + *---------------------------------------------------------------------------*/ +static void ShowRegisterData(void) +{ + OS_TPrintf("----------------------------------------------------------\n"); + OS_TPrintf("拡張機能制御レジスタ (MC_B(d24)) : %08x\n", reg_SCFG_EXT); + OS_TPrintf("MC I/F制御レジスタ1 (slot status) : %08x\n", reg_MI_MC1); + OS_TPrintf("MC I/F制御レジスタ2 (Counter-A) : %04x\n", reg_MI_MC2); + OS_TPrintf("MC コントロールレジスタ0 (SEL etc) : %04x\n", reg_MCCNT0); + OS_TPrintf("MC コントロールレジスタ1 (START etc) : %08x\n", reg_MCCNT1); + OS_TPrintf("----------------------------------------------------------\n"); +} diff --git a/build/libraries_sysmenu/card/common/src/blowfish.c b/build/libraries_sysmenu/card/common/src/blowfish.c new file mode 100644 index 00000000..3cc6dec2 --- /dev/null +++ b/build/libraries_sysmenu/card/common/src/blowfish.c @@ -0,0 +1,206 @@ +/*---------------------------------------------------------------------------* + Project: TwlBrom - libraries - GCD + File: blowfish.c + + 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. + *---------------------------------------------------------------------------*/ +#include +#include "blowfish.h" + +#define MAXKEYBYTES 56 /* 448 bits */ +#define N 16 + +// Function Prototype ------------------------------------------------------- +static u32 F(const BLOWFISH_CTX *ctx, u32 x); +static void GCDi_InitBlowfishKeyAndTableDS(BLOWFISH_CTX *ctx, u32 *keyBufp, s32 keyLen); + +//***************************************** +// +// GCDm_MakeBlowfishTableDS関数 +// +//***************************************** +void GCDm_MakeBlowfishTableDS(BLOWFISH_CTX *tableBufp, ROM_Header_Short *rhs, u32 *keyBufp, s32 keyLen) +{ + const BLOWFISH_CTX *blowfishInitTablep = &GCDi_BlowfishInitTableDS; + u32 blowfishedKey[2]; + + MI_CpuCopy32((void *)blowfishInitTablep, (void *)tableBufp, sizeof(BLOWFISH_CTX)); + + keyBufp[0] = *(u32 *)rhs->game_code; + keyBufp[1] = *(u32 *)rhs->game_code >> 1; + keyBufp[2] = *(u32 *)rhs->game_code << 1; + + GCDi_InitBlowfishKeyAndTableDS(tableBufp, keyBufp, keyLen); + + blowfishedKey[0] = (u32)rhs->ctrl_reserved_B[0]; + blowfishedKey[1] = *(u32 *)&rhs->ctrl_reserved_B[4]; + + OS_TPrintf("Blowfish - key[0]:%d key[1]:%d\n",blowfishedKey[0],blowfishedKey[1]); + + DecryptByBlowfish(tableBufp, &(blowfishedKey)[1], &(blowfishedKey)[0]); + + GCDi_InitBlowfishKeyAndTableDS(tableBufp, keyBufp, keyLen); +} + +//***************************************** +// +// GCDi_InitBlowfishKeyAndTableDS関数 +// +//***************************************** +static void GCDi_InitBlowfishKeyAndTableDS(BLOWFISH_CTX *ctx, u32 *keyBufp, s32 keyLen) +{ + EncryptByBlowfish(ctx, &(keyBufp)[2], &(keyBufp)[1]); + EncryptByBlowfish(ctx, &(keyBufp)[1], &(keyBufp)[0]); + InitBlowfish(ctx, (u8 *)keyBufp, keyLen); +} + +//***************************************** +// +// InitBlowfish関数 +// +//***************************************** +void InitBlowfish(BLOWFISH_CTX *ctx, const unsigned char *key, int keyLen) +{ + int i, j, k; + u32 data, datal, datar; + + j = 0; + for (i = 0; i < N + 2; ++i) { + data = 0x00000000; + for (k = 0; k < 4; ++k) { + data = (data << 8) | key[j]; + j = j + 1; + if (j >= keyLen) + j = 0; + } + ctx->P[i] = ctx->P[i] ^ data; + } + + datal = 0x00000000; + datar = 0x00000000; + + for (i = 0; i < N + 2; i += 2) { + EncryptByBlowfish(ctx, &datal, &datar); + ctx->P[i] = datal; + ctx->P[i + 1] = datar; + } + + for (i = 0; i < 4; ++i) { + for (j = 0; j < 256; j += 2) { + EncryptByBlowfish(ctx, &datal, &datar); + ctx->S[i][j] = datal; + ctx->S[i][j + 1] = datar; + } + } + +} + +//***************************************** +// +// EncryptByBlowfish関数 +// +//***************************************** +void EncryptByBlowfish(const BLOWFISH_CTX *ctx, u32 *xl, u32 *xr) +{ + u32 Xl; + u32 Xr; + u32 temp; + int i; + + Xl = *xl; + Xr = *xr; + + for (i = 0; i < N; ++i) { + Xl = Xl ^ ctx->P[i]; + Xr = F(ctx, Xl) ^ Xr; + + temp = Xl; + + Xl = Xr; + Xr = temp; + } + + temp = Xl; + Xl = Xr; + Xr = temp; + + Xr = Xr ^ ctx->P[N]; + Xl = Xl ^ ctx->P[N + 1]; + + *xl = Xl; + *xr = Xr; +} + +//***************************************** +// +// DecryptByBlowfish関数 +// +//***************************************** +void DecryptByBlowfish(const BLOWFISH_CTX *ctx, u32 *xl, u32 *xr) +{ + u32 Xl; + u32 Xr; + u32 temp; + int i; + + + Xl = *xl; + Xr = *xr; + + for (i = N + 1; i > 1; --i) { + Xl = Xl ^ ctx->P[i]; + Xr = F(ctx, Xl) ^ Xr; + + /* Exchange Xl and Xr */ + temp = Xl; + Xl = Xr; + Xr = temp; + } + + /* Exchange Xl and Xr */ + temp = Xl; + Xl = Xr; + Xr = temp; + + Xr = Xr ^ ctx->P[1]; + Xl = Xl ^ ctx->P[0]; + + *xl = Xl; + *xr = Xr; +} + +//***************************************** +// +// F関数 +// +//***************************************** +static u32 F(const BLOWFISH_CTX *ctx, u32 x) { + u32 a, b, c, d; + u32 y; + + d = x & 0x00FF; + x >>= 8; + + c = x & 0x00FF; + x >>= 8; + + b = x & 0x00FF; + x >>= 8; + + a = x & 0x00FF; + + y = ctx->S[0][a] + ctx->S[1][b]; + + y = y ^ ctx->S[2][c]; + y = y + ctx->S[3][d]; + + return y; +} + + diff --git a/build/libraries_sysmenu/card/common/src/dsCardType1.c b/build/libraries_sysmenu/card/common/src/dsCardType1.c new file mode 100644 index 00000000..02a971dc --- /dev/null +++ b/build/libraries_sysmenu/card/common/src/dsCardType1.c @@ -0,0 +1,393 @@ +/*---------------------------------------------------------------------------* + Project: TwlSDK + File: + *---------------------------------------------------------------------------*/ + +#include + +#include "blowfish.h" +#include "Card.h" +#include "dsCardType1.h" + +// Function prototype ------------------------------------------------------- +static void SetSecureCommand(SecureCommandType type, CardBootData *cbd); +static void SetMCSCR(void); + + +// =========================================================================== +// Function Describe +// =========================================================================== + +// ■--------------------------------------■ +// ■ ノーマルモードのコマンド ■ +// ■--------------------------------------■ +/*---------------------------------------------------------------------------* + Name: ReadIDNormal_DSType1 + + Description: DSカードType1のノーマルモードのID読み込み + *---------------------------------------------------------------------------*/ +void ReadIDNormal_DSType1(CardBootData *cbd) +{ + cbd->id_nml = 0; + + // MCCMD レジスタ設定 + reg_MCCMD0 = 0x00000090; + reg_MCCMD1 = 0x00000000; + + // MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に) + reg_MCCNT0 = (u16)((reg_MCCNT0 & 0x0fff) | 0xc000); + + // MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 111(ステータスリード) latency1 = 2320(必要ないけど) に) + reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) | + CNT1_FLD(1,0,0,0, 0,7, 0,0, 0, 0,0,0, 2320)); + + // MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。 + while(reg_MCCNT1 & START_FLG_MASK){ + while(!(reg_MCCNT1 & READY_FLG_MASK)){} + cbd->id_nml = reg_MCD1; + } + + OS_TPrintf("Nml Card B ID : %08x\n", cbd->id_nml); +} + +/*---------------------------------------------------------------------------* + Name: ReadBootSegNormal_DSType1 + + Description: DSカードType1のノーマルモードのBoot Segment読み込み + *---------------------------------------------------------------------------*/ +void ReadBootSegNormal_DSType1(CardBootData *cbd) +{ + #pragma unused( cbd ) + + u32 i = 0; + + // MCCMD レジスタ設定 + reg_MCCMD0 = 0x00000000; + reg_MCCMD1 = 0x00000000; + + // MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に) + reg_MCCNT0 = (u16)((reg_MCCNT0 & 0x0fff) | 0xc000); + + // MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 100 (8ページリード) に) + reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) | + CNT1_FLD(1,0,0,0, 0,4, 0,0, 0, 0,0,0, 2320)); + + // MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。 + while(reg_MCCNT1 & START_FLG_MASK){ + while(!(reg_MCCNT1 & READY_FLG_MASK)){} + *(cbd->pBootSegBuf->word + i++) = reg_MCD1; + } + + OS_TPrintf("GameTitle : %s\n", cbd->pBootSegBuf->rh.s.title_name); +} + +/*---------------------------------------------------------------------------* + Name: ChangeModeNormal_DSType1 + + Description: DSカードType1のノーマルモードのモード変更 + *---------------------------------------------------------------------------*/ +void ChangeModeNormal_DSType1(CardBootData *cbd) +{ + GCDCmd64 tempCnd, cnd; + u64 vae64 = cbd->vae; + + // リトルエンディアンで作って + tempCnd.dw = cbd->vbi << 8; + tempCnd.dw |= vae64 << 32; + tempCnd.dw |= 0x3c00000000000000; + + // ビックエンディアンにする + cnd.b[0] = tempCnd.b[7]; + cnd.b[1] = tempCnd.b[6]; + cnd.b[2] = tempCnd.b[5]; + cnd.b[3] = tempCnd.b[4]; + cnd.b[4] = tempCnd.b[3]; + cnd.b[5] = tempCnd.b[2]; + cnd.b[6] = tempCnd.b[1]; + cnd.b[7] = tempCnd.b[0]; + + // MCCMD レジスタ設定 + reg_MCCMD0 = *(u32 *)cnd.b; + reg_MCCMD1 = *(u32 *)&cnd.b[4]; + + // MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に) + reg_MCCNT0 = (u16)((reg_MCCNT0 & 0x0fff) | 0xc000); + + // MCCNT1 レジスタ設定 (START = 1 W/R = 1 PC = 000 に) + reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) | + CNT1_FLD(1,1,0,0, 0,0, 0,0, 0, 0,0,0, 2320)); + + // MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。 + while(reg_MCCNT1 & START_FLG_MASK){ + while(!(reg_MCCNT1 & READY_FLG_MASK)){} + } + + OS_TPrintf("Mode Changed\n"); +} + + +// ■--------------------------------------■ +// ■ セキュアモードのコマンド ■ +// ■--------------------------------------■ +/*---------------------------------------------------------------------------* + Name: SetSecureCommand + + Description: + *---------------------------------------------------------------------------*/ +static void SetSecureCommand(SecureCommandType type, CardBootData *cbd) +{ + GCDCmd64 cndLE, cndBE; + u64 data; + + data = (type == S_PNG_ON) ? (u64)cbd->vd : (u64)cbd->vae; + + cndLE.dw = cbd->vbi; + cndLE.dw |= data << 20; + + // comannd0部分 + switch(type){ + case S_RD_ID: + cndLE.dw |= 0x1000000000000000; + break; + + case S_PNG_ON: + cndLE.dw |= 0x4000000000000000; + break; + + case S_PNG_OFF: + cndLE.dw |= 0x6000000000000000; + break; + + case S_CHG_MODE: + cndLE.dw |= 0xa000000000000000; + break; + } + + // コマンドの暗号化 + EncryptByBlowfish( &cbd->keyTable, (u32*)&cndLE.b[4], (u32*)cndLE.b ); + + // ビッグエンディアンに直す(暗号化後) + cndBE.b[7] = cndLE.b[0]; + cndBE.b[6] = cndLE.b[1]; + cndBE.b[5] = cndLE.b[2]; + cndBE.b[4] = cndLE.b[3]; + cndBE.b[3] = cndLE.b[4]; + cndBE.b[2] = cndLE.b[5]; + cndBE.b[1] = cndLE.b[6]; + cndBE.b[0] = cndLE.b[7]; + + // MCCMD レジスタ設定 + reg_MCCMD0 = *(u32*)cndBE.b; + reg_MCCMD1 = *(u32*)&cndBE.b[4]; +} + + +/*---------------------------------------------------------------------------* + Name: ReadIDSecure_DSType1 + + Description: + *---------------------------------------------------------------------------*/ +void ReadIDSecure_DSType1(CardBootData *cbd) +{ + // コマンド作成・設定 + SetSecureCommand(S_RD_ID, cbd); + + // MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に) + reg_MCCNT0 = (u16)((reg_MCCNT0 & 0x0fff) | 0xc000); + + // MCCNT1 レジスタ設定 + // (START = 1 W/R = 0 TRM = 1 PC = 111(ステータスリード) CS = 1 SE = 1 DS = 1 Latency1 = 2320(0x910)に) + reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,1, 1, 0,0,0, 0)) | + CNT1_FLD(1,0,0,1, 1,7, 0,0, 0, 0,1,1, 2320)); + + // MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。 + while(reg_MCCNT1 & START_FLG_MASK){ + while(!(reg_MCCNT1 & READY_FLG_MASK)){} + cbd->id_scr = reg_MCD1; + } + + // コマンドカウンタインクリメント + cbd->vbi++; + + OS_TPrintf("Scr Card B ID : %08x\n", cbd->id_scr); +} + +/*---------------------------------------------------------------------------* + Name: ReadSegSecure_DSType1 + + Description: + *---------------------------------------------------------------------------*/ +void ReadSegSecure_DSType1(CardBootData *cbd) +{ + u32 i,j; + u64 segNum = 4; + u64 vae = cbd->vae; + GCDCmd64 cndLE, cndBE; + OSTick start; + + for(i=0; i<4; i++){ + MI_CpuClear8(&cndLE, sizeof(GCDCmd64)); + + cndLE.dw = cbd->vbi; + cndLE.dw |= vae << 20; + cndLE.dw |= segNum << 44; + cndLE.dw |= 0x2000000000000000; + + // コマンドの暗号化 + EncryptByBlowfish( &cbd->keyTable, (u32*)&cndLE.b[4], (u32*)cndLE.b ); + + // ビッグエンディアンに直す(暗号化後) + cndBE.b[7] = cndLE.b[0]; + cndBE.b[6] = cndLE.b[1]; + cndBE.b[5] = cndLE.b[2]; + cndBE.b[4] = cndLE.b[3]; + cndBE.b[3] = cndLE.b[4]; + cndBE.b[2] = cndLE.b[5]; + cndBE.b[1] = cndLE.b[6]; + cndBE.b[0] = cndLE.b[7]; + + // MCCMD レジスタ設定 + reg_MCCMD0 = *(u32*)cndBE.b; + reg_MCCMD1 = *(u32*)&cndBE.b[4]; + + // MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に) + reg_MCCNT0 = (u16)((reg_MCCNT0 & 0x0fff) | 0xc000); + + // MCCNT1 レジスタ設定 + // (START = 1 W/R = 0 TRM = 1 PC = 100(8ページリード) CS = 1 Latency2 = 24(0x18) SE = 1 DS = 1 Latency1 = 2296(0x8f8)に) + reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,1, 0, 0,0,0, 0)) | + CNT1_FLD(1,0,0,1, 1,4, 0,0, 24, 0,1,1, 2296)); + + // MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。 + j = (u32)(1024*(segNum - 4)); + while(reg_MCCNT1 & START_FLG_MASK){ + while(!(reg_MCCNT1 & READY_FLG_MASK)){} + *(cbd->pSecureSegBuf + j++) = reg_MCD1; + } + + // 読み込みセグメント番号インクリメント + segNum++; + + // コマンドカウンタインクリメント + cbd->vbi++; + + // 100ms待ち + start = OS_GetTick(); + while(OS_TicksToMilliSeconds(OS_GetTick()-start) < 100){} + + } + + OS_TPrintf("Read Scr Segment 16Kbyte\n"); +} + +/*---------------------------------------------------------------------------* + Name: SwitchONPNGSecure_DSType1 + + Description: + *---------------------------------------------------------------------------*/ +void SwitchONPNGSecure_DSType1(CardBootData *cbd) +{ + // コマンド作成・設定 + SetSecureCommand(S_PNG_ON, cbd); + + // MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に) + reg_MCCNT0 = (u16)((reg_MCCNT0 & 0x0fff) | 0xc000); + + // MCCNT1 レジスタ設定 (START = 1 W/R = 1 TRM = 1 PC = 000 Latency1 = 2320(0x910) に) + reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) | + CNT1_FLD(1,1,0,1, 0,0, 0,0, 0, 0,1,1, 2320)); + + while(reg_MCCNT1 & START_FLG_MASK){ + while(!(reg_MCCNT1 & READY_FLG_MASK)){} + } + + // コマンドカウンタインクリメント + cbd->vbi++; + + OS_TPrintf("PN Generator ON\n"); +} + +/*---------------------------------------------------------------------------* + Name: SwitchOFFPNGSecure_DSType1 + + Description: + *---------------------------------------------------------------------------*/ +void SwitchOFFPNGSecure_DSType1(CardBootData *cbd) +{ + // コマンド作成・設定 + SetSecureCommand(S_PNG_OFF, cbd); + + // MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に) + reg_MCCNT0 = (u16)((reg_MCCNT0 & 0x0fff) | 0xc000); + + // MCCNT1 レジスタ設定 (START = 1 W/R = 1 TRM = 1 PC = 000 Latency1 = 2320(0x910) に) + reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) | + CNT1_FLD(1,1,0,1, 0,0, 0,0, 0, 0,1,1, 2320)); + + while(reg_MCCNT1 & START_FLG_MASK){ + while(!(reg_MCCNT1 & READY_FLG_MASK)){} + } + + // コマンドカウンタインクリメント + cbd->vbi++; + + OS_TPrintf("PN Generator OFF\n"); +} + +/*---------------------------------------------------------------------------* + Name: ChangeModeSecure_DSType1 + + Description: + *---------------------------------------------------------------------------*/ +void ChangeModeSecure_DSType1(CardBootData *cbd) +{ + // コマンド作成・設定 + SetSecureCommand(S_CHG_MODE, cbd); + + // MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に) + reg_MCCNT0 = (u16)((reg_MCCNT0 & 0x0fff) | 0xc000); + + // MCCNT1 レジスタ設定 (START = 1 W/R = 1 TRM = 1 PC = 000 Latency1 = 2320(0x910) に) + reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 1,0,0, 0)) | + CNT1_FLD(1,1,0,1, 0,0, 0,0, 0, 0,1,1, 2320)); + + while(reg_MCCNT1 & START_FLG_MASK){ + while(!(reg_MCCNT1 & READY_FLG_MASK)){} + } + + // コマンドカウンタインクリメント + cbd->vbi++; + + OS_TPrintf("Change Mode\n"); +} + + +// ■------------------------------------■ +// ■ ゲームモードのコマンド ■ +// ■------------------------------------■ +/*---------------------------------------------------------------------------* + Name: ReadIDGame_DSType1 + + Description: ゲームモードでIDを読み込む + *---------------------------------------------------------------------------*/ +void ReadIDGame_DSType1(CardBootData *cbd) +{ + // MCCMD レジスタ設定 + reg_MCCMD0 = 0x000000B8; + reg_MCCMD1 = 0x00000000; + + // MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に) + reg_MCCNT0 = (u16)((reg_MCCNT0 & 0x0fff) | 0xc000); + + // MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 111(ステータスリード) CS = 1 SE = 1 DS = 1 latency1 = 2320(必要ないけど) に) + reg_MCCNT1 = (u32)((reg_MCCNT1 & CNT1_MSK(0,0,1,0, 0,0, 1,0, 0, 0,0,0, 0)) | + CNT1_FLD(1,0,0,0, 0,7, 0,1, 0, 0,1,1, 2320)); + + // MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。 + while(reg_MCCNT1 & START_FLG_MASK){ + while(!(reg_MCCNT1 & READY_FLG_MASK)){} + cbd->id_gam = reg_MCD1; + } + + OS_TPrintf("Gme Card B ID : %08x\n", cbd->id_gam); +} \ No newline at end of file diff --git a/build/libraries_sysmenu/card/common/src/ds_blowfish_table.c b/build/libraries_sysmenu/card/common/src/ds_blowfish_table.c new file mode 100644 index 00000000..019f6d6e --- /dev/null +++ b/build/libraries_sysmenu/card/common/src/ds_blowfish_table.c @@ -0,0 +1,283 @@ +/*---------------------------------------------------------------------------* + Project: TwlBrom - libraries - GCD + File: ds_blowfish_table.c + + 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. + *---------------------------------------------------------------------------*/ +#include "blowfish.h" + + +const BLOWFISH_CTX GCDi_BlowfishInitTableDS = { + 0x5f20d599, 0xb9f54457, 0xd9a4196e, 0x945a6a9e, + 0xebf1aed8, 0x3ae27541, 0x32d08293, 0xd531ee33, + 0x9a6157cc, 0x1ba20637, 0xf5723979, 0xbef6ae55, + 0xfb691b5f, 0xe9f19de5, 0xa1d92cce, 0xe605325e, + 0xcffed3fe, 0x0d0462d4 , + + 0xb7ecf58b, 0xbb79602b, 0x0d319512, 0x2bda3f6e, + 0xf1f08488, 0x257e123d, 0xbbf12245, 0x061a0624, + 0x28dfad11, 0x3481648b, 0x2933eb2b, 0xbdf2aa99, + 0x9d95149c, 0x8cf5f79f, 0x29a19772, 0xcf5fd19d, + 0x1a074d66, 0x4b4ad3de, 0xa3a7c985, 0x3a059517, + 0xbf0a493d, 0xa28b890a, 0xdd49824a, 0x0bf19027, + 0x6a1cebe9, 0x05457683, 0x617081ba, 0xde4b3f17, + 0x39abcfae, 0x563af257, 0x8aad1148, 0x3f45e140, + 0x54029bfa, 0xfb93a6ca, 0x6ffe4def, 0x9c87d8a3, + 0x48d5ba08, 0xfd2d8d6a, 0x74f8156e, 0x8b52bebd, + 0x9e8a2218, 0x073774fb, 0x4a6c361b, 0x6242ba19, + 0x109179b9, 0x9665677b, 0xe82302fe, 0x778c99ee, + 0x64865c3e, 0x86786d4d, 0xe2654fa5, 0x5adfb21e, + 0x087ed00a, 0xac71b014, 0x1c83dbbd, 0x62a1d7b9, + 0x7c63c6cd, 0xe6c36952, 0x12ce75bf, 0x04215d44, + 0x3cd3fbfa, 0xd4631138, 0x49418595, 0x08f20946, + 0x1fdc1143, 0x6d15c076, 0x70633c1f, 0x6c8087ea, + 0x8b63bdc3, 0x372137c2, 0x2309eedc, 0x4d6a372e, + 0x50f79073, 0x921cac30, 0x91231004, 0xaa07d24f, + 0x9a4f3e68, 0x6a6064c9, 0xf32114c8, 0x124122d6, + 0xe6cf2444, 0x0ddd568a, 0x85e14d53, 0x5a528c1e, + 0xc284199c, 0x6ff15703, 0x58be00e3, 0xd5ed4cf6, + 0x1f9c6421, 0x3c0355be, 0xaaffdc4a, 0x5de0dac9, + 0xdee6bf5e, 0xf8b1d8f5, 0xb9b336ff, 0xdb956762, + 0xed375f31, 0x9967704c, 0x3118b590, 0x99993d6c, + 0xd3da42e4, 0xa0134225, 0x6c70d7ae, 0xc7cf55b1, + 0x43d546d7, 0x443d1761, 0x8533e928, 0x93a2d0d5, + 0x1f1225aa, 0x460bc5fb, 0x567697f5, 0x87bea645, + 0xe86b94b1, 0x9933feb1, 0x6c3e1fae, 0x091d7139, + 0xe4379000, 0x74753e10, 0x3b838cff, 0xf9b0f1b0, + 0x42470501, 0xacd6f195, 0x9ee6387e, 0x3f267495, + 0x185068b4, 0xb43043d0, 0x68e34b4c, 0xb64de5bf, + 0xa00a8b95, 0x77322574, 0x2cf7a1cf, 0x5a1371d8, + 0x51c9eaab, 0xefee0de8, 0x197e93e9, 0x38431ea7, + 0xa12c1681, 0xcc73e348, 0xd36c2129, 0xd9a0ce5d, + 0xa0437161, 0x64b51315, 0x192acf92, 0xa5b7addc, + 0xf865869f, 0xfbe79f1a, 0x13b8fdf7, 0x6fdb276c, + 0xf71c35df, 0x9b5b2c8d, 0x6438ab12, 0x31decc06, + 0x11754ee8, 0xeafae364, 0xc25434eb, 0xeb343fad, + 0x267d2c93, 0xf3569d36, 0xb3f6e15a, 0x9e4a6398, + 0x9ae48332, 0x907d6084, 0xee0e132e, 0xa2364b93, + 0x3816ec85, 0x020688e8, 0x3aa0f0bf, 0x9a6ad7ed, + 0xcf57e173, 0xdcb844f8, 0xd159232e, 0x715295df, + 0x4ba06199, 0x786e7fd5, 0x30c5a9ba, 0x328640d3, + 0x9c0c329d, 0x2f02b737, 0xa99854ba, 0xc90413c4, + 0xe7c8be8d, 0x2e50975d, 0x5922d693, 0x22bc270c, + 0x20a7e092, 0x7f6f930f, 0xb5d39f4c, 0x740b2aa6, + 0x107d4967, 0xc5d1cb26, 0x8ce77186, 0x5be99ca0, + 0x01f61ab2, 0x5e9e8cee, 0xdb1af283, 0x84eae5e6, + 0x7cd27659, 0x49a58df6, 0x16c24836, 0xa383bb52, + 0x0c07b974, 0x2861ff3b, 0xe4e961e1, 0xaa156eef, + 0x5de8ba4e, 0x32bb9605, 0x72fbb056, 0xc80e0f52, + 0x76652542, 0xdef2af89, 0x01f02710, 0x97a7744b, + 0x5426d507, 0x821f0954, 0x307d860a, 0x26b30e39, + 0xbb570b9b, 0xaf310636, 0xd9fc79fd, 0x0c2b1030, + 0xd79be1b3, 0xef5fdc7b, 0x4513f8d2, 0xbd75474d, + 0x7e3c9646, 0xb53ef375, 0x3b9ac567, 0x6b295bb0, + 0xc85b80de, 0x31b10515, 0xdd49ceb6, 0xaeb584ad, + 0x3167dc60, 0x4efe3034, 0xa62f80bd, 0x213963bf, + 0x7f35d986, 0x05226816, 0x2690e954, 0x516c078c, + 0xd75531a4, 0x3ea80709, 0xc166532e, 0xc47bf2f8, + 0xf1cf58f2, 0xe7a2c587, 0x87308f27, 0x6264a058, + 0x88b91823, 0xc4cefa7c, 0x17adae98, 0xf35b4acc, + 0x56d548e9, 0xc8f20dd3, 0xdb8c7392, 0xac562fd7, + + 0x6992f981, 0xf632c64d, 0x218dc0e6, 0x618076e2, + 0x6cdcbc11, 0x6919af93, 0xb9bfd09b, 0x67029f31, + 0x83ee51a3, 0x0c7b2206, 0x404249ab, 0x7d01d5b8, + 0x55f75ece, 0x99c53953, 0x9f87d846, 0xb464f7ba, + 0xa1fa9ae3, 0x1068906d, 0x548aca30, 0xc3609fa7, + 0x0d6bf519, 0xe698517a, 0xb4514398, 0x4fe935d6, + 0x7b0fdfc3, 0xbd5c2fd6, 0x1961153a, 0xaacb4bf1, + 0xc9646ddc, 0x561ec6d3, 0x504c38ef, 0xcc758671, + 0xe94e0d0d, 0x5d06f628, 0xd3aa1b70, 0x39a8cf45, + 0x2ea695ac, 0xd422e4b4, 0x5f37a874, 0xcc047a48, + 0xd8404ca5, 0x0828b428, 0x52721c0d, 0x477df041, + 0x4e533a19, 0x6b628458, 0x818ab593, 0xdc0d4e21, + 0xc6a23fb4, 0x402bc9fc, 0xe90438da, 0x6b865a5e, + 0x8525220c, 0x7c8d1168, 0x55951d92, 0xbb8eab4d, + 0xb7e6a6da, 0x5a32b651, 0x05dd4105, 0x50560a2a, + 0xcc471791, 0xb57ee6c9, 0x73db4a61, 0x33c85167, + 0x746edaf5, 0x37c3542e, 0x08af6d0d, 0x5f8a15e8, + 0xcd2159e2, 0x060cdea8, 0x5f6b775a, 0x3e6518db, + 0x78de50c8, 0xb382b8e0, 0x32724e5d, 0x34c14f07, + 0xb796ba23, 0x28a44e67, 0xeb62341e, 0xe9706a2d, + 0x70c4422f, 0x9c315a4e, 0x28475bf9, 0x6f71daaa, + 0x78b31f38, 0x1c6b92c4, 0x9a35f69e, 0xbf0e4db7, + 0x412918cc, 0x5d354803, 0xc62bd055, 0x605caf29, + 0x5e8e6974, 0xbdd47c9b, 0x7d64447b, 0x695d923f, + 0x4b001fb6, 0xcf3583d4, 0x174e647e, 0x2ed58dae, + 0x4e12289a, 0x08492b2e, 0x46c6ae5c, 0x6141ae85, + 0xd2826f1e, 0x1f163751, 0xa459f60b, 0xaf5aca9a, + 0x8b33d40d, 0x84f16320, 0xcfcb5c80, 0xd3b9b408, + 0x62bd0516, 0x569b3183, 0xba9f9851, 0xb2aa5bb2, + 0xb52c6b22, 0x63fa48d4, 0xfa585f2b, 0x0964fa61, + 0xb8e038bb, 0xa860929d, 0x0e6f670d, 0x010df537, + 0xd477c29f, 0x73f1ecfe, 0x7de03930, 0xe49861f5, + 0x0455282c, 0x2fdb5556, 0x58e5ec6b, 0x8064b606, + 0x4e1a2a6a, 0xc4d80f5b, 0x19522e0a, 0x30f562d9, + 0x7b8cbe48, 0xa29b384f, 0xd3c9afc3, 0x4162c1c7, + 0x2161b986, 0x4f996f57, 0x7bcebac1, 0x5e4d3bb5, + 0x57448b8a, 0x705f135f, 0x47295b6d, 0xece238dc, + 0x12655504, 0x4317e82a, 0x2add8ee1, 0xf794e2b3, + 0xe65c6e09, 0x6df88aeb, 0x48544989, 0xbfad2ff5, + 0xca4b94ea, 0x828739fc, 0xf2018a5f, 0x71e6f275, + 0xde42d8d6, 0x281d2df1, 0xa37e88a6, 0x301d47a0, + 0xdf71a3d9, 0x01cb1c49, 0xf2b136f8, 0x5d5822f0, + 0xa0bd6b45, 0x4288b2bb, 0xce288cc7, 0x6390e893, + 0x897c9008, 0xb77df53c, 0x554f2d04, 0x7efd1651, + 0xc1bee879, 0xf8d412f2, 0x230584b4, 0x2bd2cca0, + 0xadabe1fd, 0x6c55d10d, 0x4d944123, 0x054f3777, + 0x17bf0c28, 0x6c6712b3, 0xf75ac38c, 0x6d2a8441, + 0x271294d0, 0x9cedb42c, 0x8247ec4d, 0xb967d597, + 0x55c09d1b, 0x8ee57e07, 0x3ee7a8e2, 0x3a0ee412, + 0x3455452a, 0x5a2df9a2, 0x7c52ab1b, 0x555f1083, + 0x435af1d2, 0xa4a7c62b, 0xe8951589, 0xf89d4bb4, + 0x609fe375, 0xe6d65b78, 0x21e6440d, 0x2247bd06, + 0xad00a453, 0x8513438d, 0xfcaaf739, 0xed7baf38, + 0x542be4fc, 0xfc4c9850, 0xdff78085, 0xe122803c, + 0x24deda94, 0x397ab0c6, 0xa10fdc38, 0x6ff9f4a7, + 0x8b571863, 0x2e2a4184, 0xd9f253d4, 0xddd00f00, + 0xa6196e99, 0x5becd00a, 0xc0ab2458, 0xec6506cb, + 0x9438131a, 0x2f03670a, 0x77e3f73f, 0xc6337744, + 0xe3d03914, 0x7908a2c0, 0x579940bb, 0x90010b41, + 0x48cce1cd, 0xafb3db67, 0x4cf37488, 0xb1728f82, + 0xc42923b5, 0xfc196c12, 0x9ca4468e, 0x876525c4, + 0x8abe6dd3, 0x38031193, 0xf32b83ed, 0xea93a446, + 0x1d85533b, 0x08f1d4ce, 0xfced2783, 0xbc181a9b, + 0xdcae8bf9, 0x3850ab24, 0x104b72e9, 0x467b1722, + + 0x6459ab5d, 0xf8ae40f3, 0xf9c8e5bb, 0x554e0326, + 0xfeebeb7d, 0xe0e639f7, 0x2ebe110a, 0xed98ff28, + 0x5642c9c0, 0x00fdc342, 0xa287aff6, 0x323f015b, + 0x9a954792, 0x3d32a572, 0x9bd06bae, 0x9249d207, + 0xfa4a78e3, 0xf27d06a1, 0x7477cf41, 0x0cb21404, + 0x16648486, 0xa151bbd5, 0xd1f16fe5, 0x5ff7e2f2, + 0xb84d2058, 0xddcfc757, 0x76bed8c5, 0x7e5ff63d, + 0x888b2ae7, 0x3f381b24, 0x7723410e, 0xd44bf0f5, + 0xa4fa1f0c, 0xcf5f800b, 0xdae0f645, 0x5359342f, + 0x523c20fb, 0xb5355e62, 0x608bfe62, 0x5a86e363, + 0xd16e1a15, 0x32bc4547, 0x3867ebb4, 0x336ee4ab, + 0xa3edb53a, 0x4ee067ad, 0x62ee9541, 0x1d267162, + 0x3062ef31, 0xac82d7af, 0x0405dcc2, 0xbf0797f5, + 0x07235911, 0xe80264c0, 0xaf3ee597, 0xa659ac18, + 0x90334a8b, 0x9c7c6e1c, 0x3c4c7e20, 0xbb64613e, + 0x7e7c6bc5, 0x4cc59f3e, 0xf573ea9f, 0x4cc089d7, + 0x2df4fbf4, 0x511b14ec, 0xc812c1d5, 0x4a0bdf10, + 0x93bc9c8b, 0x3e3e6a45, 0xbaa9c17d, 0x07b4c1cd, + 0x8668e1e4, 0x386db243, 0x5c0cfbf3, 0xde713766, + 0xa06eef56, 0xa7654010, 0xbed0f798, 0x3637c80e, + 0x7cca10ec, 0x1e84ab9c, 0x02761705, 0xaa524f1c, + 0xa0c6c15f, 0x04d8b956, 0xa74d4484, 0x60ded859, + 0x050e38e6, 0x3be1038f, 0x3304816d, 0xce0b306f, + 0x33210569, 0x89bb26fb, 0x87aeb67d, 0xe007517e, + 0x0a96f7ac, 0x5cc4f96b, 0x4744e41d, 0xe3fa5eb8, + 0x42558478, 0xf75e484b, 0x8635477d, 0x05432b1d, + 0xb88aec03, 0x763c061e, 0x431a480c, 0xed8ab7a7, + 0x43c6131e, 0xdbef10ee, 0x833cfbec, 0xef4495b2, + 0x4e5154d8, 0x1d44112d, 0x1e5936fb, 0xc3c1347a, + 0x610057ca, 0x16a567ea, 0x55d0559b, 0x36d97fe1, + 0xae7640d2, 0xb0ce01dc, 0xcbd5837a, 0x6bec9820, + 0x349272c1, 0x375782f3, 0x36328a62, 0xae43900c, + 0x789b5cae, 0x0265138e, 0xc17168fd, 0xa031b0fe, + 0xc3b08224, 0xa76979b1, 0xd0ebd2f5, 0xdc32c082, + 0x3c26c79e, 0xc1988d6d, 0xd0d422bb, 0x3eec330f, + 0xdce1ccb9, 0x36774c6a, 0xbff91c14, 0x5f289f81, + 0x29328571, 0xc4487590, 0xd8ce4ab3, 0x2f148f44, + 0xef5740fd, 0xd97508aa, 0x6ed6d146, 0xc31f5532, + 0x1f84fe18, 0xffd584fc, 0x481b5e71, 0x0e9586c3, + 0xd3270828, 0x7b718338, 0x5463804c, 0xacb0569a, + 0x31ca80cf, 0xf3feef09, 0x7e24afbe, 0x3f53fea6, + 0x334a8dc2, 0xa622d168, 0xea7bad66, 0xb043b6de, + 0x009525a1, 0x46753fa3, 0xec441114, 0x92bc95d7, + 0x16a94ff0, 0x60976253, 0xf1410f2a, 0xeebe2471, + 0xcd087f94, 0x85b39360, 0x3f00075b, 0x83280fd8, + 0x9f69d19a, 0xc32edad1, 0xb9a20190, 0x662a4e6b, + 0xa6aeda9d, 0x68d32aea, 0x9c0c0c2f, 0xed4a8cd2, + 0x65579ee2, 0xa387099d, 0x5d32c4b4, 0x2b32d4c9, + 0x1e71e0b1, 0x90e64d64, 0x401ee371, 0x84f37ded, + 0x78c8ed0e, 0x71c0ae76, 0x05bb7227, 0xfb6402ea, + 0xb56b48f3, 0xed3f9342, 0xd253139f, 0xec2afef7, + 0xdb25471d, 0xc686913c, 0xfd11f08e, 0xf7367423, + 0x7a9ef5a4, 0x4450537e, 0xd3ca47d4, 0xe66d38eb, + 0x7f9471d9, 0x4b69c64a, 0xea52f411, 0xb08afe22, + 0x598b6736, 0x2a80e6e8, 0x130465eb, 0x9edcecee, + 0x05ecb15f, 0x9fe6596a, 0x896b595e, 0xca1af7bf, + 0x6a5bf944, 0xe4038571, 0x70e06229, 0xcfc4416f, + 0xe3ccb1b2, 0xa807a67e, 0x847fe787, 0x4b52db93, + 0xdd7eec6c, 0x104824d4, 0x60049f69, 0x1848e674, + 0xb92ce4f3, 0x7a502e4f, 0x6954d4df, 0xf3a78b2b, + 0xf31fffce, 0x3901263e, 0x89849517, 0x4b4cf0b0, + 0xc49f9182, 0xa59dac4b, 0x2517af74, 0xd332cac9, + 0x848a89bc, 0xae0dcc89, 0x9cdba27c, 0xee91786a, + 0x4e5d76ea, 0x69f56087, 0x02d46715, 0x3648afcf, + + 0x6fbfea07, 0x8f062d66, 0xf9fe9ac4, 0x758790f6, + 0x0fadf7b8, 0x3d5a1076, 0xb32eb059, 0xcc2c35c7, + 0xcb2b5670, 0xc59637e3, 0x8a1b462f, 0x88c74622, + 0x983226a7, 0x2286df61, 0x2f1cf48a, 0xaa09a187, + 0xd3aea9cc, 0x1c4500bd, 0x8687549a, 0xffef8752, + 0x8fa18f1e, 0x355c89c1, 0x3a2dda1b, 0xc2b2162c, + 0x78e256f1, 0x97636bc1, 0xc98f56c5, 0xaa2c7f32, + 0xaca8a6af, 0x88229120, 0x8b60e4de, 0x25424bf9, + 0x9c7fe31a, 0x3a89192c, 0x36d4057e, 0xc25869cc, + 0x2f8b32c1, 0x7aeb8590, 0xa1a55039, 0x66c59227, + 0x584f20b0, 0x4383557e, 0x9ce2452b, 0x9012d8e4, + 0x5683162c, 0xb3037916, 0x18612dad, 0x371f131a, + 0x739ce1e2, 0xfdd5807b, 0xfc87512d, 0x1fd7aa7b, + 0xaf8e7a2c, 0xcdbb8df4, 0x727c1195, 0xe26fee0b, + 0x37deafb9, 0x8d8cde83, 0xb7670562, 0x568dc696, + 0x62d70db6, 0x3646d6ba, 0xe6c88ebd, 0x106c2aea, + 0x5b6bff14, 0x463c82fa, 0x464330b1, 0x9b7d8a51, + 0x79833e92, 0xb25d555b, 0x90ce5e6c, 0x98538e62, + 0xe56d0dc9, 0xc5cd572d, 0xe1ba5781, 0x728fb8e8, + 0xdc134fe5, 0x15719dea, 0x8811b210, 0x7fd409d5, + 0x2c7f655b, 0x114c383b, 0xfb8d5068, 0xbf59b09e, + 0x4a898094, 0x12181ac5, 0x4ad15389, 0x8ce82910, + 0xeab6ec1c, 0x8b17c746, 0xa8311525, 0xb1436ba2, + 0x0bdbe29d, 0x11b09b87, 0xd2710e04, 0x82897729, + 0x7f41660a, 0xff480b1d, 0xfd24bb72, 0x9ba148c2, + 0xce7f7bfe, 0xd986db88, 0xb01c3b85, 0x0733a8dc, + 0xe32e51bf, 0x97009a0e, 0x97c0061e, 0xb6d89d43, + 0x6786c445, 0x88f8005f, 0x9e52a49a, 0x838aaac7, + 0x18c5ec75, 0x2fc3ceae, 0x18f92b1a, 0xf51aaeff, + 0x33b50b53, 0xe8fda751, 0x64a2e1a8, 0x431722b6, + 0xd80acc80, 0x40ba3bae, 0x4a92d9d7, 0x1004df89, + 0x2b189bee, 0x8a69776a, 0xb9f9f468, 0x6e1521a2, + 0x033b1ee6, 0x609b3062, 0x9b257e41, 0x52c58f9e, + 0xc2f80810, 0x1121a169, 0x795e3788, 0x10ff6635, + 0xed6e1842, 0x1c6bb697, 0x6de5364e, 0xbfe4b47d, + 0x05e0b920, 0xb8d5693a, 0xe0dcd5e3, 0x3e53acb9, + 0xad57a407, 0x1848ff77, 0x49ac2a76, 0x75478e2a, + 0x63679f6d, 0x398c3530, 0x6fd53905, 0xad5b3a64, + 0x82bb0bca, 0xb1459952, 0x99363693, 0x442013af, + 0x4402d836, 0x85923909, 0x974a4aff, 0xd763a687, + 0x24b5b5c7, 0x6fb40fed, 0x1452580c, 0xd37ba6d9, + 0x5838bc79, 0x843bbda1, 0x061ad806, 0xeaa86bfd, + 0x0428694b, 0x9982ad37, 0x851b0efb, 0x735da8bd, + 0x7558dccd, 0x6c63be0a, 0xe44ce748, 0x60042b30, + 0xdad815b9, 0x8f758186, 0x1c8dd496, 0x7c85705d, + 0xd57b671c, 0xcea66708, 0x70660a4b, 0xd463e5b7, + 0xea828a5b, 0xe2ca6710, 0x8517eff4, 0x8a5f2a2f, + 0x6af88297, 0xea1034d6, 0x3c5cc9eb, 0x46f849e1, + 0xf6bddeeb, 0xaaf192a9, 0xb018a0a6, 0x1f0fd33a, + 0x31ff6ff3, 0xd3444345, 0x88f79a50, 0xcec19609, + 0x2cf2cc76, 0x82adba2c, 0x84188f77, 0x9c07d2c0, + 0x4e839036, 0x434fa50b, 0x78ab043e, 0x09fbd64f, + 0xda902401, 0x613a3c6f, 0x4a697f0d, 0x02302beb, + 0x84e0dbb4, 0x35d7eca9, 0x857d37bf, 0x4ea9ce58, + 0xa8c780e4, 0x486730d3, 0x2faf29eb, 0xa7b46a74, + 0x923f0f3f, 0xaccaf3af, 0x94d94baf, 0x81ca43c0, + 0xa1482f0d, 0xd2d527b0, 0x85054bef, 0x934ddea3, + 0xbbf03c30, 0x27308f4a, 0x3ee3eb4c, 0x2f9aed64, + 0xf082f13b, 0x7fcff4ba, 0xe1b0cb40, 0x57aabc7f, + 0xf274c9d3, 0x220d43fa, 0x4e77f4d0, 0x7085d793, + 0xb6bf991f, 0x30f135de, 0xf0715ea7, 0x7b2d016b, + 0x5333f064, 0xf388390a, 0x6ba63a6b, 0x432fd235, + 0xb5fd02cd, 0xaa5bbce9, 0x7e19a4d8, 0x81945d0e, + 0xad776f9e, 0x93740ed6, 0x18c4e796, 0x19f5ad5f +}; +