From b678f49c03bf931ec014d155d4427088c65e63f4 Mon Sep 17 00:00:00 2001 From: yoshida_teruhisa Date: Fri, 13 Jun 2008 01:29:08 +0000 Subject: [PATCH] =?UTF-8?q?=E3=83=BB=E3=82=A2=E3=83=97=E3=83=AA=E3=81=AB?= =?UTF-8?q?=E5=BC=95=E3=81=8D=E6=B8=A1=E3=81=99NAND=E3=82=A2=E3=83=97?= =?UTF-8?q?=E3=83=AA=E3=82=BF=E3=82=A4=E3=83=88=E3=83=ABID=E3=83=AA?= =?UTF-8?q?=E3=82=B9=E3=83=88=E3=81=AE=E4=BD=9C=E6=88=90=E3=83=AB=E3=83=BC?= =?UTF-8?q?=E3=83=AB=E3=82=92=E3=80=81=E6=9C=80=E6=96=B0=E3=81=AEdoc?= =?UTF-8?q?=E3=81=AB=E5=90=88=E3=82=8F=E3=81=9B=E3=81=9F=E4=BB=95=E6=A7=98?= =?UTF-8?q?=E3=81=AB=E5=A4=89=E6=9B=B4=20=E3=83=BBDataOnly=E3=81=AANAND?= =?UTF-8?q?=E3=82=A2=E3=83=97=E3=83=AA=E3=82=82=E3=83=AA=E3=82=B9=E3=83=88?= =?UTF-8?q?=E3=81=AB=E5=85=A5=E3=82=8C=E3=82=8B=E3=82=88=E3=81=86=E5=A4=89?= =?UTF-8?q?=E6=9B=B4=20=E3=83=BB=E3=82=BF=E3=82=A4=E3=83=88=E3=83=AB?= =?UTF-8?q?=E3=81=8C3=E8=A1=8C=E3=81=AB=E3=81=AA=E3=82=8B=E3=82=A2?= =?UTF-8?q?=E3=83=97=E3=83=AA=E3=81=AE=E8=A1=A8=E7=A4=BA=E3=81=8C=E3=81=8A?= =?UTF-8?q?=E3=81=8B=E3=81=97=E3=81=84=E4=BB=B6=E3=81=AE=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E3=81=8A=E3=82=88=E3=81=B3=E3=83=AC=E3=82=A4=E3=82=A2=E3=82=A6?= =?UTF-8?q?=E3=83=88=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1623 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- .../sysmenu/ARM9/src/title.c | 93 +++++++++++++------ .../Launcher/ARM9/src/launcher.c | 59 ++++++++---- build/systemMenu_RED/data/BGData_Launcher.c | 28 +++--- 3 files changed, 120 insertions(+), 60 deletions(-) diff --git a/build/libraries_sysmenu/sysmenu/ARM9/src/title.c b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c index c5f0af71..c7df8089 100644 --- a/build/libraries_sysmenu/sysmenu/ARM9/src/title.c +++ b/build/libraries_sysmenu/sysmenu/ARM9/src/title.c @@ -409,13 +409,32 @@ static BOOL MakeTitleListMakerInfoFromTitleID( TitleListMakerInfo *info, OSTitle OSTick prev; #endif - // 無効なTitleID または、DataOnlyアプリはスキップ - if( (titleID == NULL) || ( titleID & TITLE_ID_DATA_ONLY_FLAG_MASK ) ) + // 無効なTitleIDはスキップ + if( titleID == NULL) { return FALSE; } - // romヘッダ読み込み + // DataOnlyはTADからメーカーコードを読み出し、他の情報はOFFでリスト登録 + if( titleID & TITLE_ID_DATA_ONLY_FLAG_MASK ) + { + int l; + NAMTitleInfo naminfo; + // [TODO:]この関数で得られる情報は無検証なので改ざんの可能性があるが、これで良いか + // (でもFastつけないと一回300msぐらいかかる) + NAM_ReadTitleInfoFast( &naminfo, titleID ); + for(l=0;lmakerCode[l] = ((char *)&naminfo.companyCode)[l]; + //OS_TPrintf("companyCode[%d]::::%c\n",l,((char *)&naminfo.companyCode)[l]); + } + info->public_save_data_size = 0; + info->private_save_data_size = 0; + info->permit_landing_normal_jump = FALSE; + return TRUE; + } + + // romヘッダ読み込み #if (MEASURE_MAKELIST_TIME == 1) // 時間計測1 prev = OS_GetTick(); @@ -1703,8 +1722,6 @@ AuthResult SYSM_TryToBootTitle( TitleProperty *pBootTitle ) // タイトルIDリストの作成 static void SYSMi_makeTitleIdList( void ) { - // [TODO:]現在ブート不可タイトルについても入れるようにしているが - // これで良いのか? OSTitleIDList *list = ( OSTitleIDList * )HW_OS_TITLE_ID_LIST; ROM_Header_Short *hs = ( ROM_Header_Short *)SYSM_APP_ROM_HEADER_BUF; int l; @@ -1766,8 +1783,8 @@ static void SYSMi_makeTitleIdList( void ) } } - // 無効なTitleID または、DataOnlyアプリはスキップ - if( (id == NULL) || ( id & TITLE_ID_DATA_ONLY_FLAG_MASK ) ) + // 無効なTitleIDはスキップ + if( id == NULL ) { continue; } @@ -1783,27 +1800,12 @@ static void SYSMi_makeTitleIdList( void ) continue; } - // セキュアアプリの場合か、メーカーコードが同じ場合は - if( (hs->titleID & TITLE_ID_SECURE_FLAG_MASK) || - ( same_maker_code ) ) + if( same_maker_code ) { - // セキュアアプリのデータはマウントさせない - if( !(id & TITLE_ID_SECURE_FLAG_MASK) ) - { - // リストに追加 - list->TitleID[count] = id; - // sameMakerFlagをON - list->sameMakerFlag[count/8] |= (u8)(0x1 << (count%8)); - // Prv,Pubそれぞれセーブデータがあるか見て、存在すればフラグON - if(p_info->public_save_data_size != 0) - { - list->publicFlag[count/8] |= (u8)(0x1 << (count%8)); - } - if(p_info->private_save_data_size != 0) - { - list->privateFlag[count/8] |= (u8)(0x1 << (count%8)); - } - } + // リストに追加 + list->TitleID[count] = id; + // sameMakerFlagをON + list->sameMakerFlag[count/8] |= (u8)(0x1 << (count%8)); } // ジャンプ可能ならば @@ -1814,6 +1816,41 @@ static void SYSMi_makeTitleIdList( void ) list->appJumpFlag[count/8] |= (u8)(0x1 << (count%8)); } + // ブートアプリがセキュアアプリの場合 + if( hs->titleID & TITLE_ID_SECURE_FLAG_MASK ) + { + // Prv,Pubそれぞれセーブデータがあるか見て、存在すればフラグON + if(p_info->public_save_data_size != 0) + { + list->publicFlag[count/8] |= (u8)(0x1 << (count%8)); + } + if(p_info->private_save_data_size != 0) + { + list->privateFlag[count/8] |= (u8)(0x1 << (count%8)); + } + // リストに強制追加 + list->TitleID[count] = id; + }else + { + // セキュアアプリでない && メーカーコードが同じ + if( !(id & TITLE_ID_SECURE_FLAG_MASK) && same_maker_code ) + { + // Prv,Pubそれぞれセーブデータがあるか見て、存在すればフラグON + if(p_info->public_save_data_size != 0) + { + list->publicFlag[count/8] |= (u8)(0x1 << (count%8)); + // リストに追加 + list->TitleID[count] = id; + } + if(p_info->private_save_data_size != 0) + { + list->privateFlag[count/8] |= (u8)(0x1 << (count%8)); + // リストに追加 + list->TitleID[count] = id; + } + } + } + // ここまでのうちに、list->TitleID[count]が編集されていたらcountインクリメント if( list->TitleID[count] != NULL ) { @@ -1876,4 +1913,4 @@ void CheckDigest( void ) } } } -#endif \ No newline at end of file +#endif diff --git a/build/systemMenu_RED/Launcher/ARM9/src/launcher.c b/build/systemMenu_RED/Launcher/ARM9/src/launcher.c index e69119c7..f367216e 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/launcher.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/launcher.c @@ -37,10 +37,10 @@ #define B_LIGHT_UP_BUTTON_BOTTOM_Y ( B_LIGHT_UP_BUTTON_TOP_Y + 13 ) // スクロールバー関係 -#define BAR_ZERO_X ( (WINDOW_WIDTH - ((ITEM_SIZE + ITEM_INTERVAL) * (LAUNCHER_TITLE_LIST_NUM - 1) + ITEM_SIZE)) / 2) -#define BAR_ZERO_Y WINDOW_HEIGHT - 32 +#define BAR_ZERO_X ( (WINDOW_WIDTH - ((ITEM_SIZE + ITEM_INTERVAL) * (LAUNCHER_TITLE_LIST_NUM - 1) + ITEM_SIZE)) / 2 - 3) +#define BAR_ZERO_Y (WINDOW_HEIGHT - 32 + 1) #define BAR_HEIGHT 14 -#define BAR_WIDTH 32 //((ITEM_SIZE + ITEM_INTERVAL) * 4 + ITEM_SIZE + 2) +#define BAR_WIDTH 14 //((ITEM_SIZE + ITEM_INTERVAL) * 4 + ITEM_SIZE + 2) #define BAR_LOOSENESS 2 #define ITEMDOT_PER_FRAME ((double)(ITEM_SIZE + ITEM_INTERVAL) / (double)FRAME_PER_SELECT) #define FRAME_PER_ITEMDOT ((double)FRAME_PER_SELECT / (double)(ITEM_SIZE + ITEM_INTERVAL)) @@ -52,13 +52,13 @@ #define DOT_PER_FRAME ((BANNER_WIDTH + BANNER_INTERVAL) / FRAME_PER_SELECT) // 割り切れないと動きがカクカクするはず #define FRAME_PER_SELECT 14 // バナーからバナーへの移動にかかるフレーム数 #define BANNER_FAR_LEFT_POS (WINDOW_WIDTH/2 - BANNER_WIDTH*5/2 - BANNER_INTERVAL * 2) -#define BANNER_TOP (WINDOW_HEIGHT/2 - 16) +#define BANNER_TOP (WINDOW_HEIGHT/2 + 4) #define WINDOW_WIDTH 256 #define WINDOW_HEIGHT 192 #define BANNER_WIDTH 32 #define BANNER_HEIGHT 32 #define BANNER_INTERVAL 24 -#define TITLE_V_CENTER 39 +#define TITLE_V_CENTER 47 #define MAX_SHOW_BANNER 6 @@ -372,7 +372,7 @@ static void BannerDraw(int selected, TitleProperty *titleprop) { NNSG2dChar *str = ((TWLBannerFile *)titleprop[selected].pBanner)->v1.gameName[ LCFG_TSD_GetLanguage() ]; NNSG2dTextRect rect = NNS_G2dTextCanvasGetTextRect( &gTextCanvas, str ); - NNS_G2dCharCanvasClearArea( &gCanvas, TXT_COLOR_NULL, 0, 24, WINDOW_WIDTH, 32 ); + NNS_G2dCharCanvasClearArea( &gCanvas, TXT_COLOR_NULL, 0, 24, WINDOW_WIDTH, 48 ); PutStringUTF16( (WINDOW_WIDTH-rect.width)>>1, TITLE_V_CENTER - (rect.height>>1), TXT_COLOR_BLACK, str ); MI_CpuCopy8( str, old_gameName, BANNER_LANG_LENGTH * 2 ); } @@ -506,9 +506,9 @@ static BOOL SelectFunc( u16 *csr, TPData *tgt ) for(l=0; l<2; l++) { - int x = 11*8 + l*6*8; - int y = 17*8; - if(WithinRangeTP( x, y, x+32, y+16, tgt )) + int x = 1*8 + l*28*8; + int y = 20*8; + if(WithinRangeTP( x, y, x+16, y+16, tgt )) { *csr = (u16)l; return TRUE; @@ -647,16 +647,19 @@ static TitleProperty *ProcessPads( TitleProperty *pTitleList ) static void MoveByScrollBar( void ) { static double vx = 0; + static int last_move_dir = 0; + static int last_bar_left; // スクロールバーによるスクロール { static BOOL holding = FALSE; + static BOOL ground_holding = FALSE; static int dx; static const int list_len = 4; static int list_x[list_len]; int l; - if(!holding && vx == 0) + if( !ground_holding && !holding && vx == 0) { bar_left = (int)(BAR_ZERO_X + (ITEMDOT_PER_FRAME * s_csr)); } @@ -669,8 +672,6 @@ static void MoveByScrollBar( void ) vx = vx * 0.9; if(vx*vx < 1) { - int det = s_csr % FRAME_PER_SELECT; - csr_v = (det == 0 ? 0 : (vx>0 ? 1 : -1) ); vx = 0; } } @@ -696,7 +697,9 @@ static void MoveByScrollBar( void ) } list_x[list_len-1] = tpd.disp.x; } - else if(WithinRangeTP(bar_left+5-BAR_WIDTH/2, BAR_ZERO_Y+BAR_OFFSET,bar_left+5+BAR_WIDTH/2,BAR_ZERO_Y+BAR_OFFSET+BAR_HEIGHT,&tpd.disp)) + else if(WithinRangeTP(bar_left+5-BAR_WIDTH/2, BAR_ZERO_Y+BAR_OFFSET,bar_left+5+BAR_WIDTH/2,BAR_ZERO_Y+BAR_OFFSET+BAR_HEIGHT,&tpd.disp) || + ( ground_holding && WithinRangeTP(bar_left+5-BAR_WIDTH/2, 0,bar_left+5+BAR_WIDTH/2,WINDOW_HEIGHT,&tpd.disp) ) + ) { holding = TRUE; dx = tpd.disp.x - bar_left; @@ -706,12 +709,21 @@ static void MoveByScrollBar( void ) list_x[l] = tpd.disp.x; } } + else if(ground_holding) + { + bar_left += ( tpd.disp.x > bar_left ? 1 : -1 ); + s_csr = (u16)((bar_left - BAR_ZERO_X) * FRAME_PER_ITEMDOT); + } + else if( WithinRangeTP(BAR_ZERO_X+BAR_OFFSET, BAR_ZERO_Y+BAR_OFFSET,BAR_ZERO_X + (ITEM_SIZE + ITEM_INTERVAL) * (LAUNCHER_TITLE_LIST_NUM),BAR_ZERO_Y+BAR_OFFSET+BAR_HEIGHT,&tpd.disp) ) + { + ground_holding = TRUE; + } } else { + int det = s_csr % FRAME_PER_SELECT; if(holding) { - int det = s_csr % FRAME_PER_SELECT; holding = FALSE; // 移動履歴から速度算出 @@ -725,10 +737,16 @@ static void MoveByScrollBar( void ) } } vx /= (list_len-1); - if(vx == 0) - { - csr_v = (det < FRAME_PER_SELECT/2) ? (det == 0 ? 0 : -1) : 1; - } + } + if(ground_holding) + { + ground_holding = FALSE; + } + + // タッチパネル放置状態でカーソルがアイコンの中間にある場合は最後に動いてた方に移動 + if(vx == 0 && det != 0 && csr_v == 0) + { + csr_v = last_move_dir; } } } @@ -746,6 +764,11 @@ static void MoveByScrollBar( void ) } if((LAUNCHER_TITLE_LIST_NUM-1)*FRAME_PER_SELECT < s_csr) s_csr = (LAUNCHER_TITLE_LIST_NUM-1)*FRAME_PER_SELECT; if( s_csr < 0 ) s_csr = 0; + + // 最後に動いた方向の記録 + if(bar_left != last_bar_left) + last_move_dir = ( bar_left > last_bar_left ? 1 : -1); + last_bar_left = bar_left; } static void DrawScrollBar( TitleProperty *pTitleList ) diff --git a/build/systemMenu_RED/data/BGData_Launcher.c b/build/systemMenu_RED/data/BGData_Launcher.c index 459ede70..98f6e82f 100644 --- a/build/systemMenu_RED/data/BGData_Launcher.c +++ b/build/systemMenu_RED/data/BGData_Launcher.c @@ -28,14 +28,14 @@ u16 bg_scr_data[32 * 32]= 0x1001,0x1001,0x1001,0x1001,0x1001,0x1001,0x1001,0x1001,0x1001,0x1001,0x1001,0x1001,0x1001,0x1001,0x1001,0x1001, 0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,//4 0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,0x1002,0x1002, - 0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,//5 + 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,//5 + 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003, + 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,//6 + 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003, + 0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,//7 0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802, - 0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,//6 + 0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,//8 0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801, - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,//7 - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003, - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,//8 - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003, 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,//9 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003, 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,//10 @@ -52,16 +52,16 @@ u16 bg_scr_data[32 * 32]= 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003, 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,//16 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003, - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1405,0x1405,0x1405,0x1405,0x1003,//17 - 0x1003,0x1005,0x1005,0x1005,0x1005,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003, - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1c05,0x1c05,0x1c05,0x1c05,0x1003,//18 - 0x1003,0x1805,0x1805,0x1805,0x1805,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003, + 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,//17 + 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003, + 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,//18 + 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003, 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,//19 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003, - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,//20 - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003, - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,//21 - 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003, + 0x1003,0x1405,0x1405,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,//20 + 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1005,0x1005,0x1003, + 0x1003,0x1c05,0x1c05,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,//21 + 0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1003,0x1805,0x1805,0x1003, 0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,//22 0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802,0x1802, 0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,0x1801,//23