git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_Repair@639 385bec56-5757-e545-9c3a-d8741f4650f1

This commit is contained in:
mizu 2012-02-16 05:48:14 +00:00
parent e50f822f0c
commit 68c9011a61
25 changed files with 712 additions and 614 deletions

View File

@ -25,6 +25,7 @@ LIBS += lib_demo libnn_am
.SUBDIRS: $(exist-dirs \
Mover \
ToSD \
Mover_child \
)
DefineDefaultRules()

View File

@ -1 +1 @@
EJF10000237
EJF10000308

View File

@ -1,2 +1,3 @@
<EFBFBD>c°Ŕć;qi|xŰ$^D˙Q¨lڎË_ňůO?·OQwř]i…łľÄdžÁUÄĘP<E280BA>ŕíđŤŕL8ŞýQLĘîQj€ô)°~SVO>( $6çůi(—H?ä8?0Ű„U zO¤Wó<>ł˝$<24>ŻšŔPĐ“Ž<ö]ϨúÖď[¤Ř Ý)3„Öčv}2^Fˇođż{5íÔTzdNA*-‰—Í\Â$4ŚĐ]Î9éěKmČT¬F­0ÍúăL—39<>őÖi=ĺčŽô'[4<>>ł÷ż´•Q,/µ†łGČ—]<5D>žźß03‡
ţ“›Đâ×Ű=
C╞┌ОО▒б÷$3⌡╢dbh╤╠
Й?YЫa+! ╛ ⌠▄Н*S©WиIзйvА╤фDY╜ 0╢xH╪B╢nс&R pjD/'┤ЙY j9й╬▐lТ|э<S<О²÷²л60X∙ т╘@╗хшo·╫╩&$фoч≈Шф╢екцjXК╓0rИ_⌠Lш┴╦√{С╖
#Ъ{·ПКХЖ⌠tV&$жLЖ╘pQ:°╥█6L<И8 Ю∙а▐H╒o╖ч|8═─|yиял√[Е=YЗyN║фwЦ√┘┤дэ*GХ▒pраmk╚▐!└k-rLыЮ│─╖ш■╔[/аZЭ⌠+3

View File

@ -55,7 +55,7 @@ CTR_BANNER_SPEC = banner.bsf
#Cia バージョン:マスタリング毎に更新すること
#メジャーはrsfで指定(Remasterversion)
MAKECIAFLAGS = -minor 0 -micro 0
MAKECIAFLAGS = -minor 0 -micro 1
include $(ROOT_OMAKE)/modulerules

View File

@ -249,21 +249,32 @@ RetCode Card2Sd()
//ディレクトリ作成
//空ディレクトリもチェックするゲームあるので(マリカ7)
//ファイルの存在と関係なく作成
//todo:パス名チェック
if(dcList.num >0)
{
int i,rev=0;
for (i=0;i<dcList.num;i++)
{
while(1){
if (exsave.MakeDir(dcList.name[i],&mkdir)==false)
exsave.GetRootPath(file_pathw2);//格納先ルート取得
ChainPath(file_pathw2,&dcList.name[i][6]);//"save:/"の次から
if (CheckPath(file_pathw2)==false)//パス名チェック..エラーにならず化けるもの
{
if (exsave.OpenVnfW(file_pathw2,0)==false)//ディレクトリ退避
{
if(mkdir==false)
res = RESULT_FAIL_OPENW;
}else exsave.CloseW();
}else{
while(1){
if (exsave.MakeDir(file_pathw2,&mkdir)==false)
{
res = RESULT_FAIL_OPENW;
break;
}
}else break;
if(mkdir==false){//作成失敗
if (exsave.OpenVnfW(file_pathw2,0)==false)//ディレクトリ退避
{
res = RESULT_FAIL_OPENW;
}else exsave.CloseW();
break;
}
}else break;
}
}
if (res != RESULT_OK)break;
rev^=1;
@ -332,7 +343,7 @@ RetCode Card2Sd()
//SDで支障あるパス名の場合は別ファイルに格納する
exsave.GetRootPath(file_pathw2);//格納先ルート取得
ChainPath(file_pathw2,file_pathw);//実パス名に変換
if (CheckPath(file_pathw2)==false)//パス名チェック
if (CheckPath(file_pathw2)==false)//パス名チェック..エラーにならず化けるもの
{
if (exsave.OpenVnfW(file_pathw,fsize)==false)//退避ファイル
{

View File

@ -183,6 +183,7 @@ void touchQuit(u32 pos NN_IS_UNUSED_VAR)
//‰º‰æ–Ê
//Top Menu
#ifdef USE_WCHAR
const tPanel panel_Read = {(uptr)touchRead,L"Export",80+20,30,160,80,PANEL_READ,SCREEN_LOWER};
//const tPanel panel_Write = {(uptr)touchWrite,"Restore",80+20,130,160,80,PANEL_WRITE,SCREEN_LOWER};
//const tPanel panel_End = {(uptr)touchEnd,"End",80,180,160,30,PANEL_END,SCREEN_LOWER};
@ -190,9 +191,17 @@ const tPanel panel_Read = {(uptr)touchRead,L"Export",80+20,30,160,80,PANEL_READ,
//Yes No
const tPanel panel_Yes = {(uptr)touchYes,L"YES",40+10,60,80,120,PANEL_YES,SCREEN_LOWER};
const tPanel panel_No = {(uptr)touchNo,L"NO",200+30,60,80,120,PANEL_NO,SCREEN_LOWER};
//Quit
const tPanel panel_Quit = {(uptr)touchQuit,L"Quit",80+20,60,160,120,PANEL_QUIT,SCREEN_LOWER};
#else
const tPanel panel_Read = {(uptr)touchRead,"Export",80+20,30,160,80,PANEL_READ,SCREEN_LOWER};
//Yes No
const tPanel panel_Yes = {(uptr)touchYes,"YES",40+10,60,80,120,PANEL_YES,SCREEN_LOWER};
const tPanel panel_No = {(uptr)touchNo,"NO",200+30,60,80,120,PANEL_NO,SCREEN_LOWER};
//Quit
const tPanel panel_Quit = {(uptr)touchQuit,"Quit",80+20,60,160,120,PANEL_QUIT,SCREEN_LOWER};
#endif
//<2F>ã‰æÊ
//ƒfƒoƒO—p

View File

@ -16,7 +16,7 @@
#ifndef VER_H_
#define VER_H_
#define VERSION 0.01
#define VERSION 0.02
#endif

View File

@ -30,6 +30,8 @@ NAND
ツール本体の操作は操作マニュアル参照
履歴:
2012.2.15 ver0.02(リマスタバージョン1.0.1)
マリカ7対応:中身のないディレクトリも作成するよう修正
2011.6.8 ver0.01(リマスタバージョン1.0.0)

View File

@ -4,6 +4,7 @@
#include "sleep.h"
#include "demo.h"
#include <string.h>
#include <wchar.h>
#include <stdlib.h>
#include <stdio.h>
@ -14,17 +15,17 @@ extern uptr heapForGx;
//エラー表示用文字列生成
void GetErrorStr(ErcDev dev,nn::Result res,int cd,char* s)
void GetErrorStr(TgtDev dev,nn::Result res,int cd,tChar* s)
{
int desc=0,code;
if ((cd ==0 ) && (dev != ERC_DEV_OTHER))
if ( (cd ==0 ) && ((dev == TGT_SD) || (dev == TGT_CARD)))
{
desc = res.GetDescription();
if (desc < 100 ) code = ERC_UNKNOWN;//キー検索完了 .. ありえない
else if (desc < 180 ) code = ERC_READ;//ファイルが見つからないか不正
else if (desc < 200 ) code = ERC_WRITE_OW;//ファイルが存在 .. 削除失敗?
else if (desc < 220 ) code = ERC_WRITE_NS;//空きが無い
else if (desc < 200 ) code = ERC_WRITE;//ファイルが存在
else if (desc < 220 ) code = ERC_NOSPACE;//空きが無い
else if (desc < 260 ) code = ERC_ACCESS;//操作拒否
else if (desc < 280 ) code = ERC_WRITE_PROTECT;//書き込み禁止
else if (desc < 340 ) code = ERC_ACCESS;//アクセスエラー
@ -39,7 +40,11 @@ void GetErrorStr(ErcDev dev,nn::Result res,int cd,char* s)
//if (desc>=600){
// sprintf(s,"ERROR %d, desc %d",dev+code,desc);
//}else{
#ifdef USE_WCHAR
swprintf(s,16,L"ERROR %d",dev+code);
#else
sprintf(s,"ERROR %d",dev+code);
#endif
// }
}
@ -107,7 +112,7 @@ void finish()
g_AwakeEvent.Finalize();
g_TransitionEvent.Finalize();
nn::fs::Finalize();
//nn::fs::Finalize();
appHeap.Free(reinterpret_cast<void*>(heapForGx));

View File

@ -8,7 +8,7 @@ typedef void (*FUNCP)();
void finish();
void CheckSysBreak();
void InitSysBreak(uptr adrs);
void GetErrorStr(ErcDev dev,nn::Result res,int cd,char* s);
void GetErrorStr(TgtDev dev,nn::Result res,int cd,tChar* s);
#endif

View File

@ -13,6 +13,7 @@
*---------------------------------------------------------------------------*/
#include <string.h>
#include <wchar.h>
#include <nn.h>
#include <nn/os.h>
#include <nn/hid.h>
@ -67,15 +68,20 @@ public:
};
//パネル
class cmPanel: public cmBase
{
public:
tStyle style;
char *caption;
tChar *caption;
public:
cmPanel(){
#ifdef USE_WCHAR
caption=L"None";
#else
caption="None";
#endif
style.image = 0;
style.color.r = 1.0f;
style.color.g = 1.0f;
@ -85,6 +91,8 @@ public:
}
};
//メッセージ
class cmMessage: public cmPanel
{
@ -95,58 +103,6 @@ public:
};
#define LINES_MAX 20
#define CHARS_MAX 128
//メモ
class cmMemo: public cmBase
{
private:
char strlst[LINES_MAX][CHARS_MAX];
public:
tStyle style;
u32 lines;//行サイズ:strlen配列数以下であること
u32 parent;//親コンポーネントID
public:
cmMemo();
bool setline(char *p,u16 ln);
char* line(u16 ln);
void clr(){
for (int i=0;i<lines;i++)strlst[i][0]=0;
}
};
cmMemo::cmMemo():lines(10)
{
int i;
for (i=0;i<LINES_MAX;i++){
strlst[i][0]=0;
strlst[i][CHARS_MAX-1]=0;
}
}
//文字列の登録
bool cmMemo::setline(char *p,u16 ln)
{
if(lines < ln)return false;
char c;
int i = 0;
while(1){
c = p[i];
strlst[ln][i]=c;
if (c == 0)break;
if (i == CHARS_MAX-2)break;
i++;
}
return true;
}
char* cmMemo::line(u16 ln)
{
if(lines < ln)return 0;
return &strlst[ln][0];
}
//------------- sub routin -------------------
#define PANEL_MAX 20
#define MEMO_MAX 2
@ -154,7 +110,6 @@ char* cmMemo::line(u16 ln)
static cmButton s_Button;
static cmPanel s_Panel[PANEL_MAX];
static cmMessage s_Message[MESS_MAX];
static cmMemo s_Memo[MEMO_MAX];
static demo::RenderSystemDrawing s_RenderSystem;
void ColorFromCode(eColor c,tCol *col);
@ -187,61 +142,53 @@ bool onPanel(u16 x,u16 y,cmPanel *p)
return true;
}
#define setText(x,y,s) shf_DrawText_0(x,y,s)
#define setSize(sz) shf_SetSize(sz)
#ifdef USE_WCHAR
tChar* Wak_H = L"-";
tChar* Wak_V = L"|";
#define setText(x,y,s) shf_DrawText_0w(x,y,s)
#define setSize(sz) shf_SetSizeW(sz)
#define setScale(h,v) shf_SetScaleW(h,v)
#define getFontwidth shf_GetFontWidthW()
#define getFontheight shf_GetFontHeightW()
#define getLen(s) wcslen(s)
void setColor(tCol *col)
{
//s_RenderSystem.SetColor(col->r, col->g, col->b,col->a);
shf_SetColorW(col->r,col->g,col->b,col->a);
}
#else
tChar* Wak_H = "-";
tChar* Wak_V = "|";
#define setText(x,y,s) shf_DrawText_0(x,y,s)
#define setSize(sz) shf_SetSize(sz)
#define setScale(h,v) shf_SetScale(h,v)
#define getFontwidth shf_GetFontWidth()
#define getFontheight shf_GetFontHeight()
#define getLen(s) strlen(s)
void setColor(tCol *col)
{
shf_SetColor(col->r,col->g,col->b,col->a);
}
#endif
//void setSize(f32 sz)
//{
// s_RenderSystem.SetFontSize(sz);
//}
/*
#define FONT_CAPTION_SIZE 12
//caption付きBox描画
void drawBox(tU16xy top,tU16xy size,tStyle *st,char* str = 0)
{
u16 xe = top.x + size.x -1;
u16 ye = top.y + size.y -1;
setColor(&st->color);
s_RenderSystem.SetLineWidth(st->width);
s_RenderSystem.DrawLine(top.x, top.y, xe, top.y);
s_RenderSystem.DrawLine(xe, top.y, xe, ye);
s_RenderSystem.DrawLine(xe, ye, top.x, ye);
s_RenderSystem.DrawLine(top.x, ye, top.x, top.y);
if (str != 0){
int w = (size.x - strlen(str)*FONT_CAPTION_SIZE) >> 1;
int h = (size.y - FONT_CAPTION_SIZE) >> 1;
if ((w>0) && (h>0)){
setSize(FONT_CAPTION_SIZE);
s_RenderSystem.DrawText(top.x + w,top.y + h,str);
}
}
}
*/
//上画面、メッセージ枠表示
void drawBox(tU16xy top,tU16xy size,tStyle *st,char* str = 0)
void drawBox(tU16xy top,tU16xy size,tStyle *st,tChar* str = 0)
{
int i;
shf_SetScale(2.0f,2.0f);
setScale(2.0f,2.0f);
setColor(&st->color);
for (i=0;i<size.x/16;i++)setText(top.x+i*16,top.y-32,"-");
for (i=0;i<size.y/36;i++)setText(top.x-10,top.y+i*36-10,"|");
for (i=0;i<size.x/16;i++)setText(top.x+i*16,top.y+size.y-40,"-");
for (i=0;i<size.y/36;i++)setText(top.x+size.x-16,top.y+i*36-10,"|");
for (i=0;i<size.x/16;i++)setText(top.x+i*16,top.y-32,Wak_H);
for (i=0;i<size.y/36;i++)setText(top.x-10,top.y+i*36-10,Wak_V);
for (i=0;i<size.x/16;i++)setText(top.x+i*16,top.y+size.y-40,Wak_H);
for (i=0;i<size.y/36;i++)setText(top.x+size.x-16,top.y+i*36-10,Wak_V);
if (str != 0){
shf_SetScale(1.0f,1.0f);
int w = shf_GetFontWidth()/2;
int h = shf_GetFontHeight();
w = (size.x - strlen(str)*w) >> 1;
int w = getFontwidth/2;
int h = getFontheight;
setScale(1.0f,1.0f);
w = (size.x - getLen(str)*w) >> 1;
h = (size.y - h) >> 1;
if ((w>0) && (h>0)){
setText(top.x + w+10,top.y + h,str);
@ -251,21 +198,21 @@ void drawBox(tU16xy top,tU16xy size,tStyle *st,char* str = 0)
}
//下画面ボタン表示
void drawBox2(tU16xy top,tU16xy size,tStyle *st,char* str = 0)
void drawBox2(tU16xy top,tU16xy size,tStyle *st,tChar* str = 0)
{
int i;
setColor(&st->color);
shf_SetScale(2.0f,2.0f);
for (i=0;i<size.x/16+2;i++)setText(top.x+i*16,top.y-24,"-");
for (i=0;i<size.y/40;i++)setText(top.x-8,top.y+i*40,"|");
for (i=0;i<size.x/16+2;i++)setText(top.x+i*16,top.y+size.y-28,"-");
for (i=0;i<size.y/40;i++)setText(top.x+size.x+24,top.y+i*40,"|");
setScale(2.0f,2.0f);
for (i=0;i<size.x/16+2;i++)setText(top.x+i*16,top.y-24,Wak_H);
for (i=0;i<size.y/40;i++)setText(top.x-8,top.y+i*40,Wak_V);
for (i=0;i<size.x/16+2;i++)setText(top.x+i*16,top.y+size.y-28,Wak_H);
for (i=0;i<size.y/40;i++)setText(top.x+size.x+24,top.y+i*40,Wak_V);
if (str != 0){
shf_SetScale(1.0f,1.0f);
int w = shf_GetFontWidth()/2;
int h = shf_GetFontHeight();
w = (size.x - strlen(str)*w) >> 1;
setScale(1.0f,1.0f);
int w = getFontwidth/2;
int h = getFontheight;
w = (size.x - getLen(str)*w) >> 1;
h = (size.y - h) >> 1;
if ((w>0) && (h>0)){
setText(top.x + w+10,top.y + h+10,str);
@ -274,7 +221,7 @@ void drawBox2(tU16xy top,tU16xy size,tStyle *st,char* str = 0)
}
static int si;
//描画
void drawDisp()
@ -283,7 +230,7 @@ void drawDisp()
//上
s_RenderSystem.SetRenderTarget(NN_GX_DISPLAY0);
s_RenderSystem.Clear();
int i,j;
int i;
for (i=0;i<PANEL_MAX;i++){
if ((s_Panel[i].visible) && (s_Panel[i].scr == 0)){
@ -291,32 +238,20 @@ void drawDisp()
}
}
for (i=0;i<MESS_MAX;i++){
if ( s_Message[i].visible && s_Panel[s_Message[i].parent].visible ){
setSize(s_Message[i].style.width);
setColor(&s_Message[i].style.color);
for (si=0;si<MESS_MAX;si++){
if ( s_Message[si].visible && s_Panel[s_Message[si].parent].visible ){
setSize(s_Message[si].style.width);
setColor(&s_Message[si].style.color);
//s_RenderSystem.DrawText(s_Panel[s_Message[i].parent].pos.x+s_Message[i].pos.x,
// s_Panel[s_Message[i].parent].pos.y+s_Message[i].pos.y,s_Message[i].caption);
setText(s_Panel[s_Message[i].parent].pos.x+s_Message[i].pos.x,
s_Panel[s_Message[i].parent].pos.y+s_Message[i].pos.y,s_Message[i].caption);
setText(s_Panel[s_Message[si].parent].pos.x+s_Message[si].pos.x,
s_Panel[s_Message[si].parent].pos.y+s_Message[si].pos.y,s_Message[si].caption);
//NN_LOG(s_Message[i].caption);
//NN_LOG(" %d\n",i);
}
}
for (i=0;i<MEMO_MAX;i++){
if ( s_Memo[i].visible && s_Panel[s_Memo[i].parent].visible ){
setColor(&s_Memo[i].style.color);
setSize(s_Memo[i].style.width);
u16 x = s_Panel[s_Memo[i].parent].pos.x+s_Memo[i].pos.x;
u16 y = s_Panel[s_Memo[i].parent].pos.y+s_Memo[i].pos.y;
for (j=0;j<s_Memo[i].lines;j++){
s_RenderSystem.DrawText(x,y,s_Memo[i].line(j));
y+=10;
}
}
}
s_RenderSystem.SwapBuffers();
nngxWaitVSync(NN_GX_DISPLAY0);
@ -440,7 +375,7 @@ void thUpdate(nn::os::LightEvent* pEvnt)
tpOld.y = tpStatus.y;
if (tpStatus.touch)
{
NN_LOG("x =%d , y=%d\n",tpStatus.x,tpStatus.y);
//NN_LOG("x =%d , y=%d\n",tpStatus.x,tpStatus.y);
for (i=0;i<PANEL_MAX;i++)//PANEL枠内か
{
if (s_Panel[i].enable && (s_Panel[i].callback !=0))
@ -475,7 +410,7 @@ bool Gui::Initialize(uptr pHeap,u32 size,nn::os::LightEvent* pEvnt)
//コンポーネントの初期化
int i;
for (i=0;i< PANEL_MAX;i++)PanelEffective(i,false,false);
for (i=0;i< MEMO_MAX;i++)MemoEffective(i,false,false);
// for (i=0;i< MEMO_MAX;i++)MemoEffective(i,false,false);
for (i=0;i< MESS_MAX;i++)MessEffective(i,false,false);
//Render
@ -585,7 +520,7 @@ myResult Gui::MessSet(const tMessage *mes)
return RESULT_OK;
}
myResult Gui::MessStr(u8 id,char *str)
myResult Gui::MessStr(u8 id,tChar *str)
{
if (id >= MESS_MAX)return RESULT_BAD_PARAM;
s_Message[id].caption = str;
@ -599,38 +534,6 @@ myResult Gui::MessCol(u8 id,eColor col)
return RESULT_OK;
}
myResult Gui::MemoSet(const tMemo *m)
{
if ((m->parent >= PANEL_MAX) || (m->id >= MEMO_MAX))return RESULT_BAD_PARAM;
if (m->lines > LINES_MAX)return RESULT_BAD_PARAM;
s_Memo[m->id].lines = m->lines;
s_Memo[m->id].pos.x = m->x;
s_Memo[m->id].pos.y = m->y;
s_Memo[m->id].parent = m->parent;
s_Memo[m->id].style.width = m->size;
ColorFromCode(m->color,&s_Memo[m->id].style.color);
s_Memo[m->id].clr();
s_Memo[m->id].visible = false;
s_Memo[m->id].enable = false;
return RESULT_OK;
}
myResult Gui::MemoStr(u8 id,char *str,u16 ln)
{
if ((id < MEMO_MAX) && s_Memo[id].setline(str,ln) )return RESULT_OK;
return RESULT_BAD_PARAM;
}
myResult Gui::MemoEffective(u8 id,bool enable,bool visible)
{
if (id >= MEMO_MAX)return RESULT_BAD_PARAM;
s_Memo[id].enable = enable;
s_Memo[id].visible = visible;
return RESULT_OK;
}
void Gui::Draw()
{

View File

@ -23,7 +23,7 @@
typedef struct
{
uptr callback;
char* caption;
tChar* caption;
u16 x,y;
u16 width,height;
u16 id;
@ -44,7 +44,7 @@ typedef enum {
typedef struct
{
char* str;
tChar* str;
u16 x,y;//親の始点との相対
eColor color;//
u8 size;//文字サイズ
@ -78,15 +78,15 @@ public:
void ButtonMask(u32 mask);
myResult PanelSet(const tPanel *panel);
myResult MessSet(const tMessage *mes);
myResult MemoSet(const tMemo *m);
// myResult MemoSet(const tMemo *m);
void Draw();
void DisableAll();
myResult PanelEffective(u8 id,bool enable=true,bool visible=true);
myResult MessEffective(u8 id,bool enable=true,bool visible=true);
myResult MemoEffective(u8 id,bool enable=true,bool visible=true);
myResult MessStr(u8 id,char *str);
// myResult MemoEffective(u8 id,bool enable=true,bool visible=true);
myResult MessStr(u8 id,tChar *str);
myResult MessCol(u8 id,eColor col);
myResult MemoStr(u8 id,char *str,u16 ln);
// myResult MemoStr(u8 id,tChar *str,u16 ln);
myResult PanelLineStyle(u8 id,eColor col=COLOR_WHITE,u8 width = 2);
//void thUpdate();
};

View File

@ -16,20 +16,38 @@
#ifndef MYDEFS_H_
#define MYDEFS_H_
//拡張セーブ用のID
//rsfのUIDと合わせる
#define OWN_UID 0xf8014
#define USE_WCHAR 1
//文字列型
#ifdef USE_WCHAR
typedef wchar_t tChar;
#else
typedef char tChar;
#endif
//エラー表示コード
//v2.0で変更
//ERC_PATH:パスが長すぎ,ERC_DIRDEPTH:ディレクトリ深すぎ
//->ERC_WORK にまとめる
//5番をPULLOUTに変更
enum {
ERC_UNKNOWN = 0, //不明
ERC_DEVICE, //デバイスが見つからない(カード抜け)
ERC_PRODCODE,//プロダクトコード不一致
ERC_VERIFI,//ベリファイエラー
ERC_PATH,//パスが長すぎ
ERC_DIRDEPTH,//ディレクトリ深すぎ
ERC_WORK,//ワーク作成に失敗
ERC_PULLOUT,//抜け検出
ERC_MEDIA, //メディアが見つからない(サブ基盤外れなど)
//ERC_PULLOUT,//抜け検出
ERC_READ = 10, //ファイルが見つからない
ERC_WRITE_OW = 20, //既に存在
ERC_WRITE_NS, //空き容量がない
//ERC_WRITE_OW = 20, //既に存在
ERC_WRITE = 20, //ライトエラー
ERC_NOSPACE, //空き容量がない
ERC_WRITE_PROTECT, //書込み禁止
ERC_ACCESS = 30, //アクセスエラー
ERC_FORMAT = 50, //フォーマットエラー
@ -40,12 +58,13 @@ ERC_EXEC = 90, //実行時エラー
ERC_FATAL = 99 //深刻なエラー
};
typedef enum{
ERC_DEV_CARD = 100,
ERC_DEV_OUT = 200,
ERC_DEV_OTHER = 300
}ErcDev;
typedef enum{//対象デバイス指定
TGT_NONE = 0,
TGT_CARD = 100,
TGT_SD = 200,
TGT_MEM = 300
}TgtDev;
//OUT=SD or MEM
//内部使用のエラー
typedef enum {
@ -74,6 +93,7 @@ typedef enum {
RESULT_DIR_LEVEL_OVER,
RESULT_PATH_LENGTH_OVER,
RESULT_DEVICE_FULL,
RESULT_WORK_OVER,
RESULT_MAX
}myResult;

View File

@ -1,81 +1,49 @@
#include <wchar.h>
#include <string.h>
#include <nn/fs.h>
#include <../fs/fs_ResultPrivate.h>
#include "exsave.h"
#define OWN_UID 0xf8014
const char *exsaveName = "exsave:";
const wchar_t *exsaveRoot_w = L"exsave:/save/";
const char *exsaveRoot = "exsave:/save/";
#define ROOTLENGTH_EX 8
const wchar_t *exsaveSys_w = L"exsave:/ncl_sysdata.ncl";//暫定
wchar_t expath_w[PATHLENGTH_MAX];//パス名
wchar_t expathu_w[100][PATHLENGTH_MAX];//上層パス名
wchar_t expathw_w[PATHLENGTH_MAX];//パス名ワーク
static nn::fs::DirectoryEntry exdcEntry[MAX_LEVEL];
static nn::fs::Directory exdc[MAX_LEVEL];
#include <nn/fs/fs_ResultPrivate.h>
#include <nn/fs/CTR/MPCore/fs_ApiForHwCheck.h>
//#include <nn/am/am_ApiSystemMenu.h>
//#include <nn/am/am_ApiLocalImporter.h>
//拡張セーブデータ
//存在確認
bool ExSave::IsExist()
{
LastNnResult = nn::fs::MountExtSaveData(exsaveName,OWN_UID);
nn::fs::Unmount(exsaveName);
return LastNnResult.IsSuccess();
}
extern "C" {
extern u8* ICON_BEGIN[];
extern u8* ICON_END[];
//パス検索位置のリセット
void ExSave::ResetPath()
{
s_lv=0;
s_serch = false;
wcscpy(expath_w,exsaveRoot_w);
//wcscpy(expathu_w,expath_w);
const void* ICON = ICON_BEGIN;
const size_t ICON_SIZE = ICON_END-ICON_BEGIN;
}
myResult ExSave::GetPath(wchar_t *path)
//セーブ作成、成功時はマウント状態
myResult ExSave::Create(u32 entryDir,u32 entryFile)
{
int n;
while(1){
if (s_serch==false){
LastNnResult = exdc[s_lv].TryInitialize(expath_w);//Open
if (LastNnResult.IsFailure()){
return RESULT_FAIL;
}
}
while(1){
n = (exdc[s_lv].Read(&exdcEntry[s_lv],1));
if ( n==0 )//終端
{
exdc[s_lv].Finalize();
if (s_lv == 0){path[0]=0;return RESULT_OK;}// ---- rootなら終了
s_lv--;//上の層に戻る
wcscpy(expath_w,expathu_w[s_lv]);//パス戻す
}else{
if(exdcEntry[s_lv].attributes.isDirectory){//ディレクトリ
//m_info.DirCount++;
wcscpy(expathu_w[s_lv],expath_w);//パス保存
wcscat(expath_w,exdcEntry[s_lv].entryName);//次のディレクトリパス
wcscat(expath_w,L"/");
if (++s_lv == MAX_LEVEL)return RESULT_DIR_LEVEL_OVER;
s_serch = false;
break;
}else{//ファイル
//m_info.FileCount++;
s_serch = true;
wcscpy(path,pPathTop);
wcscat(path,exdcEntry[s_lv].entryName);
return RESULT_OK;
}
}
}
}
if ( IsMounted )return RESULT_ALREADY_MOUNT;
LastNnResult = nn::fs::CreateExtSaveData(OWN_UID,ICON,ICON_SIZE,entryDir,entryFile);
if (LastNnResult.IsFailure())return RESULT_FAIL_CREATE;
LastNnResult = nn::fs::MountExtSaveData(devName,OWN_UID);
if (LastNnResult.IsFailure())return RESULT_FAIL_MOUNT;
//LastNnResult = nn::fs::TryCreateDirectory(root_w);
//if (LastNnResult.IsFailure()){
// nn::fs::Unmount(devName);
// return RESULT_FAIL_MOUNT;
//}
IsMounted = true;
return RESULT_OK;
}
//空き容量
s64 ExSave::GetFreeSize()
{
if (IsMounted==false)if(MountCore()==false)return 0;
s64 a,b;
LastNnResult = nn::fs::GetSdmcSize(&a,&b);
if (IsMounted==false)Unmount();
if (LastNnResult.IsFailure())return 0;
return b;
}
//削除
bool ExSave::Delete()
@ -85,215 +53,29 @@ bool ExSave::Delete()
return LastNnResult.IsSuccess();
}
//セーブ作成、成功時はマウント状態
myResult ExSave::Create(const void* icon,size_t iconSize,u32 entryDir,u32 entryFile)
{
if ( IsMounted )return RESULT_ALREADY_MOUNT;
LastNnResult = nn::fs::CreateExtSaveData(OWN_UID,icon,iconSize,entryDir,entryFile);
if (LastNnResult.IsFailure())return RESULT_FAIL_CREATE;
LastNnResult = nn::fs::MountExtSaveData(exsaveName,OWN_UID);
if (LastNnResult.IsFailure())return RESULT_FAIL_MOUNT;
LastNnResult = nn::fs::TryCreateDirectory(exsaveRoot_w);
if (LastNnResult.IsFailure()){
nn::fs::Unmount(exsaveName);
return RESULT_FAIL_MOUNT;
}
IsMounted = true;
return RESULT_OK;
}
//マウント
myResult ExSave::Mount()
bool ExSave::MountCore()
{
if ( IsMounted )return RESULT_ALREADY_MOUNT;
LastNnResult = nn::fs::MountExtSaveData(exsaveName,OWN_UID);
if (LastNnResult.IsFailure()){
return RESULT_FAIL_MOUNT;
}
IsMounted = true;
return RESULT_OK;
}
void ExSave::Unmount()
{
IsMounted = false;
nn::fs::Unmount(exsaveName);
}
//ライト属性ファイルを閉じる
void ExSave::CloseW()
{
writer.Finalize();
}
//ファイルライト
s32 ExSave::Write(char *buffer,size_t size)
{
s32 ct;
LastNnResult = writer.TryWrite(&ct,(void*)buffer,size);
if(LastNnResult.IsFailure())ct=0;
return ct;
}
//管理用ファイル
//ライト属性で開く
bool ExSave::OpenSysW()
{
LastNnResult = nn::fs::TryCreateFile(exsaveSys_w,sizeof(tArcInfo));
LastNnResult = writerSys.TryInitialize(exsaveSys_w,false);
return LastNnResult.IsSuccess();
}
//ライト属性ファイルを閉じる
void ExSave::CloseSysW()
{
writerSys.Finalize();
}
//システムファイルライト
bool ExSave::WriteSys(tArcInfo *pinfo)
{
s32 ct;
pinfo->Ver = INFO_VERSION;
LastNnResult = writerSys.TryWrite(&ct,(void*)pinfo,sizeof(tArcInfo));
return LastNnResult.IsSuccess();
}
//リード属性で開く
bool ExSave::OpenSysR()
{
LastNnResult = readerSys.TryInitialize(exsaveSys_w);
return LastNnResult.IsSuccess();
}
//ライト属性ファイルを閉じる
void ExSave::CloseSysR()
{
readerSys.Finalize();
}
//ファイルリード
bool ExSave::ReadSys(tArcInfo *pinfo)
{
s32 ct;
LastNnResult = readerSys.TryRead(&ct,(void*)pinfo,sizeof(tArcInfo));
LastNnResult = nn::fs::MountExtSaveData(devName,OWN_UID);
return LastNnResult.IsSuccess();
}
//ライト属性ファイルを開く
bool ExSave::OpenW(wchar_t *path,s64 size)
//フォーマット情報
void ExSave::GetFormatInfoCore(tArcInfo *ifo)
{
int pos,pos2;
wcscpy(expath_w,exsaveRoot_w);
wcscat(expath_w,path);
while(1){
LastNnResult = nn::fs::TryCreateFile(expath_w,size);
if(LastNnResult.IsSuccess())break;
//ディレクトリがなければディレクトリを作成
pos = GetPosDelmLast(expath_w,ROOTLENGTH_EX);//ファイルが存在するディレクトリ
if (pos <= 0)return false;//rootかパスが不正
//while (1){
wcscpy(expathw_w,expath_w);//ワークにコピー
while (LastNnResult.IsFailure()){//ディレクトリ作成できるまで遡る
if(LastNnResult.GetDescription()!=nn::fs::DESCRIPTION_DBM_DIRECTORY_NOT_FOUND)return false;
pos2 = GetPosDelmLast(expathw_w,ROOTLENGTH_EX);//境界位置を探す
if (pos2 == 0)return false;//root到達
expathw_w[pos2] = 0;//境界まで削除 (例) dir1/dir2/file -> dir1/dir2 -> dir1
LastNnResult = nn::fs::TryCreateDirectory(expathw_w);
}
//if (pos2 == pos)break;//配置ディレクトリなら抜ける
//todo:ディレクトリが深いとき時間がかかるなら、無駄なTryCreateを省く
//案)直上から最初の成功までのデリミタ位置を記録
//先に全ディレクトリ作っておくのがよさげ
//}
}
LastNnResult = writer.TryInitialize(expath_w,false);
return LastNnResult.IsSuccess();
}
//ファイルリード
s32 ExSave::Read(char *buffer,size_t size)
{
// if (IsMounted==false)return 0;
s32 ct;
LastNnResult = reader.TryRead(&ct,(void*)buffer,size);
if(LastNnResult.IsFailure())ct=0;
return ct;
}
void ExSave::Close()
{
reader.Finalize();
}
//ファイルを開く
//パス指定はルート以降
//(ex)data:/dir/file -> dir/file
bool ExSave::Open(wchar_t *path)
{
wcscpy(expathw_w,exsaveRoot_w);
wcscat(expathw_w,path);
LastNnResult = reader.TryInitialize(expathw_w);
if (LastNnResult.IsSuccess())
{
LastNnResult = reader.TryGetSize(&FileSize);
if (LastNnResult.IsSuccess())return true;
else Close();
}
return false;
}
//アーカイブ情報の取得
bool ExSave::GetInfo(tArcInfo *pinfo)
{
if(Mount()==RESULT_FAIL_MOUNT)return false;
//システムデータからフォーマット情報
if (OpenSysR())
{
if(ReadSys(pinfo) == false){
pinfo->Pcode[0]=0;
CloseSysR();//クローズ
Unmount();
return false;
}
}else{
Unmount();
return false;
}
CloseSysR();//クローズ
// Unmount();
//#ifdef INFO_API_USE
//API情報と比較
// LastNnResult = nn::fs::GetExtSaveDataFormatInfo(OWN_UID,&m_info.FileEntry,&m_info.DirEntry);
// if (m_info.FileEntry != pinfo->FileEntry)return false;
// if (m_info.DirEntry != pinfo->DirEntry)return false;
// //if (m_info.Dup != pinfo->Dup)return false; //ExSaveには無い
//#endif
return true;
LastNnResult = nn::fs::GetExtSaveDataFormatInfo(&ifo->FileEntry,&ifo->DirEntry,OWN_UID);
}
//コンストラクタ
ExSave::ExSave()
{
IsMounted = false;
s_lv=0;
m_info.DirCount = 0;
m_info.FileCount = 0;
m_info.DirEntry = 0;
m_info.FileEntry = 0;
wcscpy(expath_w,exsaveRoot_w);
//wcscpy(expathu_w,expath_w);
pPathTop = (wchar_t*)((u32)&expath_w+strlen(exsaveRoot)*2);
PrdCode[0] = 0;
strcpy(devName,"exsave:");
SetRootPath(L"exsave:");
}
void ExSave::Finalize()
{
Close();
Unmount();
}
//デストラクタ
ExSave::~ExSave()
{
Finalize();
}

View File

@ -21,50 +21,22 @@
#include "../my_defs.h"
#include "savefile.h"
class ExSave
class ExSave: public SaveFileRead,public SaveFileWrite
{
public:
s64 FileSize;
nn::Result LastNnResult;
char PrdCode[20];
private:
nn::fs::FileReader reader;
nn::fs::FileWriter writer;
nn::fs::FileReader readerSys;
nn::fs::FileWriter writerSys;
wchar_t *pPathTop;
tArcInfo m_info;
int s_lv;
int exrootlen;
bool IsMounted;
bool s_serch;
void GetFormatInfoCore(tArcInfo *ifo);
public:
ExSave();
~ExSave();
void Finalize();
myResult Create(const void* icon,size_t iconSize,u32 entryDir,u32 entryFile);
myResult CreateSys(const void* icon,size_t iconSize);
myResult Mount();
myResult MountSys();
bool IsExist();
void Unmount();
bool MountCore();
bool Delete();
void CloseW();
bool OpenW(wchar_t *path,s64 size);
bool OpenSysW();//暫定
void CloseSysW();//暫定
bool OpenSysR();//暫定
void CloseSysR();//暫定
s32 Write(char *buffer,size_t size);
bool WriteSys(tArcInfo *pinfo);
bool ReadSys(tArcInfo *pinfo);
void ResetPath();
s32 Read(char *buffer,size_t size);
void Close();
bool Open(wchar_t *path);
myResult GetPath(wchar_t *path);
bool GetInfo(tArcInfo *pinfo);
s64 GetFreeSize();
myResult Create(u32 entryDir,u32 entryFile);
void Finalize(){Close();};
// bool GetPrdCode();
ExSave();
~ExSave(){Finalize();};
};
#endif

View File

@ -12,7 +12,7 @@ namespace
bit8 s_Buffer[BUFFER_SIZE] NN_ATTRIBUTE_ALIGN(4096);
}
bool info_alive;
//bool info_alive;
//--------------------------------------------------------------------
//
@ -28,7 +28,7 @@ MemBak::MemBak()
LastNnResult = ResultSuccess();
ResetPath();
info_alive = false;
// info_alive = false;
}
void MemBak::Finalize()
@ -61,10 +61,13 @@ myResult MemBak::Create(u32 entryDir,u32 entryFile)
}
m_NumDirEntry = entryDir;
m_ArcInfo.DirEntry = entryDir;
m_NumFileEntry = entryFile;
m_ArcInfo.FileEntry = entryFile;
m_Exists = true;
m_IsMounted = true;
m_pBufferPos = m_pBuffer;
return RESULT_OK;
}
@ -72,14 +75,16 @@ myResult MemBak::Create(u32 entryDir,u32 entryFile)
bool MemBak::Delete()
{
m_Exists = false;
info_alive = false;
// info_alive = false;
m_pBufferPos = m_pBuffer;
m_IsMounted = false;
return true;
}
//マウント
myResult MemBak::Mount()
{
if (m_Exists == false)return RESULT_FAIL_MOUNT;
if ( m_IsMounted )
{
return RESULT_ALREADY_MOUNT;
@ -88,6 +93,7 @@ myResult MemBak::Mount()
m_IsMounted = true;
return RESULT_OK;
}
void MemBak::Unmount()
{
m_IsMounted = false;
@ -102,12 +108,11 @@ void MemBak::Unmount()
//アーカイブ情報の取得
bool MemBak::GetInfo(tArcInfo *pinfo)
{
if (info_alive==false)return false;
*pinfo = m_ArcInfo;
return true;
return m_Exists;
}
/*
//管理用ファイル
//ライト属性で開く
bool MemBak::OpenSysW()
@ -128,7 +133,7 @@ bool MemBak::WriteSys(tArcInfo *pinfo)
m_ArcInfo = *pinfo;
return true;
}
*/

View File

@ -173,12 +173,12 @@ public:
bool Delete();
void CloseW();
bool OpenW(wchar_t *path,s64 size);
bool OpenSysW();//暫定
void CloseSysW();//暫定
// bool OpenSysW();//暫定
// void CloseSysW();//暫定
// bool OpenSysR();//Žbè
// void CloseSysR();//Žbè
s32 Write(char *buffer,size_t size);
bool WriteSys(tArcInfo *pinfo);
// bool WriteSys(tArcInfo *pinfo);
// bool ReadSys(tArcInfo *pinfo);
void ResetPath();
s32 Read(char *buffer,size_t size);

View File

@ -16,17 +16,21 @@ bool SaveData::GetPrdCode()
nn::ProgramId programId;
LastNnResult = nn::am::InitializeForLocalImporter();
// LastNnResult = nn::am::InitializeForSystemMenu();
if (LastNnResult.IsFailure()){
nn::am::FinalizeForLocalImporter();
// nn::am::FinalizeForSystemMenu();
return false;
}
LastNnResult = nn::am::GetProgramList(&numPrograms, &programId, 1, nn::fs::MEDIA_TYPE_CTRCARD);
if (LastNnResult.IsFailure()){
nn::am::FinalizeForLocalImporter();
//nn::am::FinalizeForSystemMenu();
return false;
}
LastNnResult = nn::am::GetProductCode( (nn::ProductCode*)&PrdCode,nn::fs::MEDIA_TYPE_CTRCARD,programId);
nn::am::FinalizeForLocalImporter();
//nn::am::FinalizeForSystemMenu();
PrdCode[sizeof(nn::ProductCode)] = 0;//表示時のオーバラン対策
return LastNnResult.IsSuccess();
}
@ -76,4 +80,3 @@ SaveData::SaveData()
}

View File

@ -26,7 +26,7 @@ void ChainPath(wchar_t *p1,wchar_t *p2)
}
//パス名チェック for SD
//パス名チェック for SDMC
//fs関数で引数エラー(INVALID_ARGUMENT)にならないものをチェック
bool CheckPath(wchar_t *s)
{
@ -48,6 +48,72 @@ bool CheckPath(wchar_t *s)
}
//パス名チェック for 拡張セーブ
bool CheckPathEx(wchar_t *s)
{
size_t n = wcslen(s);
if ((n > 248) || (n==0))return false;
return true;
}
//ディレクトリ一致チェック
//ret= 0:なし、他:最初に一致した階層
//ex) s = "/d1/d2/d3",s2 ="d2" or "/d2" ret=2
// "/"で囲まれた文字列をディレクトリと見なす
int CmpDirW(wchar_t *s,wchar_t *s2)
{
int i=0,j,n = wcslen(s),n2 = wcslen(s2);
int lv=1;
wchar_t *ss;
if (s2[0]==L'/')
{
ss = &s2[1];
n2--;
}else ss = s2;
while(i<n){
if(s[i] == L'/')
{//次のスラッシュまで
j = i+1;
while(j<n){
if(s[j] == L'/')break;
j++;
}
if (j>=n)return 0;
if ((j-i-1) == n2)
{//文字長一致したら比較
if(memcmp((void*)&s[i+1],(void*)ss,n2)==0)return lv;
}
lv++;
i=j;//次
}else i++;
}
return 0;
}
//ファイル名の一致確認
//s:パス ex)"/dir/name"
//s2:ファイル名 ex) "/name"
bool CmpNameW(wchar_t *s,wchar_t *s2)
{
int n,n2,i;
n = wcslen(s);
n2 = wcslen(s2);
i = GetPosDelmLast(s,1);//"/"の位置
if (n2 != n-i)return false;//文字数一致?
return memcmp((void*)&s[i],(void*)s2,n2*2)==0;
}
bool CmpPathW(wchar_t *s,wchar_t *s2)
{
int n,n2;
n = wcslen(s);
n2 = wcslen(s2);
if (n2 != n)return false;//文字数一致?
return memcmp((void*)s,(void*)s2,n2*2)==0;
}
//-------------- Class SaveFileWrite
//ディレクトリ作成ありのオープン
bool SaveFileWrite::OpenC(wchar_t *path,s64 size,bool *mkdir)
@ -81,6 +147,35 @@ bool SaveFileWrite::OpenC(wchar_t *path,s64 size,bool *mkdir)
return false;
}
//ディレクトリ作成
//無ければパスに含むディレクトリも作成
bool SaveFileWrite::MakeDir(wchar_t *path,bool *mkdir)
{
int pos,pos2;
*mkdir = false;
LastNnResult = nn::fs::TryCreateDirectory(path);
if(LastNnResult.IsSuccess())return true;
if(nn::fs::ResultAlreadyExists::Includes(LastNnResult))return true;
//ディレクトリがなければディレクトリを作成
pos = GetPosDelmLast(path,RootLength);//ファイルが存在するディレクトリ
if (pos <= 0)return false;//rootかパスが不正
wcscpy(pathw_w2,path);//ワークにコピー
while (LastNnResult.IsFailure()){//ディレクトリ作成できるまで遡る
if(nn::fs::ResultNotFound::Includes(LastNnResult)==false)return false;
pos2 = GetPosDelmLast(pathw_w2,RootLength);//境界位置を探す
if (pos2 == 0)return false;//root到達
pathw_w2[pos2] = 0;//境界まで削除 (例) dir1/dir2/file -> dir1/dir2 -> dir1
LastNnResult = nn::fs::TryCreateDirectory(pathw_w2);
}
//作成ディレクトリ多いと画面止まるので、作成ごとに抜ける
*mkdir = true; // 帰値false で mkdir=true ならディレクトリ作成のみ
return false;
}
//ディレクトリ作成なしオープン、存在する場合は追記
bool SaveFileWrite::OpenAdd(wchar_t *path)
{
@ -140,6 +235,11 @@ bool SaveFileWrite::DeleteDir(const wchar_t *dir)
return LastNnResult.IsSuccess();
}
bool SaveFileWrite::DeleteFile(const wchar_t *path)
{
LastNnResult = nn::fs::TryDeleteFile(path);
return LastNnResult.IsSuccess();
}
//------------------------------------------------------ Class SaveFileRead
bool SaveFileRead::Open(const wchar_t *path)
@ -163,6 +263,15 @@ void SaveFileRead::Close()
}
//シーク
bool SaveFileRead::SetPos(s64 pos)
{
LastNnResult = reader.TrySetPosition(pos);
return LastNnResult.IsSuccess();
}
//ファイルリード
s32 SaveFileRead::Read(char *buffer,size_t size)
{
@ -173,11 +282,11 @@ s32 SaveFileRead::Read(char *buffer,size_t size)
}
//存在チェック
myResult SaveFileRead::IsExist(){
bool SaveFileRead::IsExist(){
myResult res;
res = Mount();
Unmount();
return res;
return (res != RESULT_FAIL_MOUNT);
}
@ -227,9 +336,9 @@ static nn::fs::Directory dcl;
}
//アーカイブ情報の取得
bool SaveFileRead::GetInfo(tArcInfo *pinfo,size_t clsz)
//clsz:SDの場合クラスタサイズ指定で現実に近いサイズに調整
bool SaveFileRead::GetInfo(tArcInfo *pinfo,tDcList *pDcList,size_t clsz)
{
static nn::fs::DirectoryEntry dcEntryl;
static nn::fs::Directory dcl;
@ -246,6 +355,9 @@ static nn::fs::Directory dcl;
wcscpy(pathw_w,root_w);
wcscat(pathw_w,L"/");
CheckPathBit = 0;
pDcList->num = 0;
int n;
int lv = 0;
for (n = 0;n<MAX_LEVEL;n++)dc_readed[n] = 0;
@ -267,10 +379,12 @@ static nn::fs::Directory dcl;
break;
}else{
if(dcEntryl.attributes.isDirectory){//ディレクトリ
m_info.DirCount++;
if (clsz>0)m_info.total +=clsz;//SD..ディレクトリでクラスタ分取る
wcscpy(pathu_w[lv],pathw_w);//パス保存
wcscat(pathw_w,dcEntryl.entryName);//次のディレクトリパス
if ( m_info.DirCount < MAX_DCLIST)
wcscpy(pDcList->name[m_info.DirCount],pathw_w);//リストに格納
m_info.DirCount++;
wcscat(pathw_w,L"/");
if (++lv == MAX_LEVEL)return false;
break;
@ -283,6 +397,10 @@ static nn::fs::Directory dcl;
if ((dcEntryl.entrySize % clsz) > 0 )sn++;
m_info.total += sn*clsz;
}
wcscpy(pathw_w2,pathw_w);
wcscat(pathw_w2,dcEntryl.entryName);
if(CheckPathEx(pathw_w2)==false)CheckPathBit |= cpb_ex;
if(CheckPath(pathw_w2)==false)CheckPathBit |= cpb_sdmc;
}
}
}
@ -293,7 +411,7 @@ static nn::fs::Directory dcl;
Unmount();//GetCtrCardSaveDataFormatInfo内でマウントするので一旦アンマウント(SDK2.13のみエラー)
GetFormatInfoCore(&m_info);
Mount();
pDcList->num = m_info.DirCount;
*pinfo = m_info;
return true;

View File

@ -14,21 +14,45 @@
//アーカイブ名およびSD格納ディレクトリの余裕分をみとく
#define MAX_PATH_LENGTH 512
//パス階層上限
//ファイル検索時に使用、"/"+1文字が最短なので128で十分
//ファイル検索時に使用、パス長上限(253)から128で十分
#define MAX_LEVEL 128
//ディレクトリリスト上限
#define MAX_DCLIST 256
typedef enum{
cpb_sdmc = 1,
cpb_ex
}Cpb_bits;
//******************************** functions **********
//パス名チェック
//パス名チェック .. for sdmc
//FAT違反の半角スペースあるかチェック
//文字、予約名、パス長はAPIエラー(INVALID_ARGUMENT)で判定
bool CheckPath(wchar_t *s);
//パス名チェック .. 拡張セーブ
bool CheckPathEx(wchar_t *s);
//デリミタ("/")位置を返す
//top:検索開始位置
int GetPosDelmLast(wchar_t *s,int top);
//パス結合
void ChainPath(wchar_t *p1,wchar_t *p2);
//ディレクトリ一致チェック
//ret= 0:なし、他:最初に一致した階層
//ex) s = "/d1/d2/d3",s2 ="d2" or "/d2" ret=2
int CmpDirW(wchar_t *s,wchar_t *s2);
//ファイル名の一致確認
//s:パス ex)"/dir/name"
//s2:ファイル ex) "name"
bool CmpNameW(wchar_t *s,wchar_t *s2);
bool CmpPathW(wchar_t *s,wchar_t *s2);
//******************************** Types **********
//セーブに関する情報
@ -40,14 +64,26 @@ struct tArcInfo{
char Pcode[20];//product code SDKのサイズを下回らないこと
bool Dup;//2重化
u8 Ver;
u8 yobi;//パディング
//u8 yobi;//パディング
};
//ディレクトリ
struct tDcList{
u16 num;
wchar_t name[MAX_DCLIST][MAX_PATH_LENGTH];
};
//ワーニング抑制
//1300:inherits implisit virtual
//1301:insert padding
#pragma diag_suppress 1300,1301
//******************************** Class ***************
class SaveFileBase
{
public:
nn::Result LastNnResult;
u8 CheckPathBit; //パス名違反チェックbit
protected:
wchar_t root_w[MAX_PATH_LENGTH];//基底パス(デバイス名含)
wchar_t path_w[MAX_PATH_LENGTH];//パス名
@ -98,6 +134,8 @@ public:
SaveFileWrite(){RootLength=0;};
~SaveFileWrite(){};
bool DeleteDir(const wchar_t *dir);
bool MakeDir(wchar_t *path,bool *mkdir);
bool DeleteFile(const wchar_t *path);
bool OpenW(const wchar_t *path);
bool OpenC(wchar_t *path,s64 size,bool *mkdir);
bool OpenAdd(wchar_t *path);
@ -120,12 +158,13 @@ private:
tArcInfo m_info;
bool s_serch;
public:
myResult IsExist();
bool IsExist();
bool Open(const wchar_t *path);
void Close();
bool SetPos(s64 pos);
myResult GetPath(wchar_t *path);
void ResetPath();
bool GetInfo(tArcInfo *pinfo,size_t clsz = 0);
bool GetInfo(tArcInfo *pinfo,tDcList *pDcList,size_t clsz = 0);
s32 Read(char *buffer,size_t size);
SaveFileRead(){
s_lv=0;
@ -136,6 +175,7 @@ public:
};
~SaveFileRead(){};
};
//警告を戻す
//#pragma diag_warning 1300,1301
#endif

View File

@ -33,8 +33,9 @@ std::wstring Sdmcwo::GetDateName()
//char型 :表示で使う
wcstombs(DirName, name.str().c_str(), 14);
DirName[14] = 0;
//wcstombs(DirName, name.str().c_str(), 14);
//DirName[14] = 0;
wcscpy(DirName,name.str().c_str());
return name.str();
}

View File

@ -53,7 +53,7 @@ struct AdditionalInfo
class Sdmcwo: public SaveFileWrite
{
public:
char DirName[16];
wchar_t DirName[16];
size_t ClasterSize;//SDクラスタサイズ .. Create後有効
size_t FreeSize;//Create直後の空き..Create後有効
private:

View File

@ -7,6 +7,7 @@
#include <nn/util.h>
#include "demo.h"
#include <wchar.h>
const char s_ShaderBinaryFilePath[] = "rom:/nnfont_RectDrawerShader.shbin";
@ -231,6 +232,7 @@ nn::font::DispStringBuffer *pDrawStringBuf0;
nn::font::DispStringBuffer *pDrawStringBuf1;
nn::font::ResFont font;
nn::font::TextWriter writer;
nn::font::WideTextWriter writer_w;
//---------------------------------------------------------------------------
//! @brief ASCII文字列を描画します。
//---------------------------------------------------------------------------
@ -270,7 +272,6 @@ void shf_DrawText_1( u16 x,u16 y,char *s)
drawer.DrawEnd();
}
void shf_SetSize(f32 sz)
{
writer.SetScale(sz/14,sz/20);
@ -297,12 +298,104 @@ f32 shf_GetFontHeight()
return writer.GetFontHeight();
}
void shf_SetColor(f32 r,f32 g,f32 b,f32 a)
{
writer.SetTextColor(nn::util::FloatColor(r,g,b,a));
}
//******** ワイド文字列 ************
//エラーになるコードを置き換える
//int chgCode(int size,wchar_t *s)
//{
// for (int i=0;i<size;i++)
// {
// if ((s[i] & 0xff00) == 0xff00)s[i]= (s[i] & 0x00ff)+0x20;
// }
//}
void shf_DrawText_0w( u16 x,u16 y,wchar_t *s)
{
wchar_t ss[32];
int size = wcslen(s);
if (size > 32){
NN_LOG("DrawText:size over");
return;
}
wcscpy(ss,s);
writer_w.SetCursor(x, y);
// chgCode(size,ss);
writer_w.StartPrint();
(void)writer_w.Print(ss);
writer_w.EndPrint();
drawer.BuildTextCommand(&writer_w);
drawer.DrawBegin();
SetupTextCamera(&drawer, NN_GX_DISPLAY0_WIDTH, NN_GX_DISPLAY0_HEIGHT);
writer_w.UseCommandBuffer();
drawer.DrawEnd();
}
void shf_DrawText_1w( u16 x,u16 y,wchar_t *s)
{
writer_w.SetCursor(x, y);
writer_w.StartPrint();
(void)writer_w.Print(s);
writer_w.EndPrint();
drawer.BuildTextCommand(&writer_w);
drawer.DrawBegin();
SetupTextCamera(&drawer, NN_GX_DISPLAY1_WIDTH, NN_GX_DISPLAY1_HEIGHT);
writer_w.UseCommandBuffer();
drawer.DrawEnd();
}
void shf_SetSizeW(f32 sz)
{
writer_w.SetScale(sz/14,sz/20);
}
void shf_SetScaleW(f32 h,f32 v)
{
writer_w.SetScale(h,v);
}
void shf_SetFontSizeW(f32 sz)
{
writer_w.SetFontSize(sz);
}
f32 shf_GetFontWidthW()
{
return writer_w.GetFontWidth();
}
f32 shf_GetFontHeightW()
{
return writer_w.GetFontHeight();
}
void shf_SetColorW(f32 r,f32 g,f32 b,f32 a)
{
writer_w.SetTextColor(nn::util::FloatColor(r,g,b,a));
}
//初期化
//AppHeap確保、RenderSystem.Inititの後に呼ぶ
void SharedFontInit()
@ -341,6 +434,10 @@ void SharedFontInit()
writer.SetDispStringBuffer(pDrawStringBuf0);
writer.SetFont(&font);
writer_w.SetDispStringBuffer(pDrawStringBuf0);
writer_w.SetFont(&font);
SetupTextCamera(&drawer, NN_GX_DISPLAY0_WIDTH, NN_GX_DISPLAY0_HEIGHT);
}

View File

@ -20,11 +20,19 @@ void SharedFontInit();
void SharedFontFinalize();
void shf_DrawText_0(u16 x,u16 y,char* s);
void shf_DrawText_1(u16 x,u16 y,char* s);
void shf_DrawText_0w(u16 x,u16 y,wchar_t* s);
void shf_DrawText_1w(u16 x,u16 y,wchar_t* s);
void shf_SetSize(f32 sz);
void shf_SetScale(f32 h,f32 v);
void shf_SetColor(f32 r,f32 g,f32 b,f32 a);
void shf_SetFontSize(f32 sz);
f32 shf_GetFontWidth();
f32 shf_GetFontHeight();
void shf_SetSizeW(f32 sz);
void shf_SetScaleW(f32 h,f32 v);
void shf_SetColorW(f32 r,f32 g,f32 b,f32 a);
void shf_SetFontSizeW(f32 sz);
f32 shf_GetFontWidthW();
f32 shf_GetFontHeightW();
#endif

View File

@ -65,10 +65,13 @@ void make_pattern()
s32 size;
#define SIZE_TEST1 421888
//#define SIZE_TEST1 244736 //dup
#define DMX_TEST0 100
#define FMX_TEST0 100
#define DUP_TEST0 true
bool Test0_W(int n)//Casual
{
res = nn::fs::FormatSaveData(100,100,false);
res = nn::fs::FormatSaveData(DMX_TEST0,FMX_TEST0,DUP_TEST0);
if (res.IsFailure()){
drawText(8,100,"format Fail");
return false;
@ -79,23 +82,57 @@ bool Test0_W(int n)//Casual
return false;
}
int num = 0,total=0;
int num = 0,total=0,size=512;
while(1){
sprintf(file_path,"data:/test%d",num);
/*
swprintf(file_pathw,512,L"data:/空ディレクトリ%d",num);
res = nn::fs::TryCreateDirectory(file_pathw);
if (res.IsFailure()){
drawText(8,100,"Dir create Fail");
nn::fs::Unmount("data:");
return false;
}
*/
sprintf(file_path,"data:/nulldir%d",num);
res = nn::fs::TryCreateDirectory(file_path);
if (res.IsFailure()){
drawText(8,100,"Dir create Fail");
nn::fs::Unmount("data:");
return false;
}
sprintf(file_path,"data:/test%d/test%d.bin",num,num);
res = fout.TryInitialize(file_path,true);
sprintf(file_path,"data:/null%d",num);
res = nn::fs::TryCreateDirectory(file_path);
if (res.IsFailure()){
drawText(8,100,"Dir create Fail");
nn::fs::Unmount("data:");
return false;
}
sprintf(file_path,"data:/null%d/nulldir",num);
res = nn::fs::TryCreateDirectory(file_path);
if (res.IsFailure()){
drawText(8,100,"Dir create Fail");
nn::fs::Unmount("data:");
return false;
}
//swprintf(file_pathw,512,L"data:/テスト%d",num);
swprintf(file_pathw,512,L"data:/test%d",num);
res = nn::fs::TryCreateDirectory(file_pathw);
if (res.IsFailure()){
drawText(8,100,"Dir create Fail");
nn::fs::Unmount("data:");
return false;
}
//sprintf(file_path,"data:/test%d/test%d.bin",num,num);
//res = fout.TryInitialize(file_path,true);
//swprintf(file_pathw,512,L"data:/テスト%d/テスト%d.bin",num,num);
swprintf(file_pathw,512,L"data:/test%d/test%d.bin",num,num);
res = fout.TryInitialize(file_pathw,true);
if (res.IsFailure()){
drawText(8,100,"open Fail");
nn::fs::Unmount("data:");
return false;
}
res = fout.TryWrite( &size,&src_buff[total],512);
res = fout.TryWrite( &size,&src_buff[total],size);
if (res.IsFailure()){
drawText(8,100,"write Fail");
fout.Finalize();
@ -103,7 +140,8 @@ bool Test0_W(int n)//Casual
return false;
}
fout.Finalize();
total += 512;
total += size;
size += size;
num++;
sprintf(str,"size %d , num %d",total,num);
s_RenderSystem.Clear();
@ -125,25 +163,75 @@ bool Test0_W(int n)//Casual
bool Test0_V(int n)//Casual
{
int num = 0,total=0;
int num = 0,total=0,size = 512;
size_t maxF,maxD;
bool isDup;
nn::fs::Directory dc;
res = nn::fs::GetSaveDataFormatInfo(&maxF,&maxD,&isDup);
if (res.IsFailure()){
drawText(8,100,"fail to get formatinfo");
nn::fs::Unmount("data:");
return false;
}
if ((maxF != FMX_TEST0)||(maxD!=DMX_TEST0)||(isDup != DUP_TEST0)){
drawText(8,100,"wrong format");
nn::fs::Unmount("data:");
return false;
}
while(1){
sprintf(file_path,"data:/test%d/test%d.bin",num,num);
res = fin.TryInitialize(file_path);
sprintf(file_path,"data:/nulldir%d",num);//ディレクトリ
res = dc.TryInitialize(file_path);
if (res.IsFailure()){
drawText(8,100,"open Dir");
dc.Finalize();
nn::fs::Unmount("data:");
return false;
}
dc.Finalize();
sprintf(file_path,"data:/null%d/nulldir",num);//ディレクトリ
res = dc.TryInitialize(file_path);
if (res.IsFailure()){
drawText(8,100,"open Dir");
dc.Finalize();
nn::fs::Unmount("data:");
return false;
}
dc.Finalize();
/*
swprintf(file_pathw,512,L"data:/空ディレクトリ%d",num);//ディレクトリ
res = dc.TryInitialize(file_pathw);
if (res.IsFailure()){
drawText(8,100,"open Dir");
dc.Finalize();
nn::fs::Unmount("data:");
return false;
}
dc.Finalize();
*/
//swprintf(file_pathw,512,L"data:/テスト%d/テスト%d.bin",num,num);
swprintf(file_pathw,512,L"data:/test%d/test%d.bin",num,num);
res = fin.TryInitialize(file_pathw);
if (res.IsFailure()){
drawText(8,100,"open Fail");
nn::fs::Unmount("data:");
return false;
}
res = fin.TryRead( &size,&get_buff[total],512);
res = fin.TryRead( &size,&get_buff[total],size);
if (res.IsFailure()){
drawText(8,100,"read Fail");
fin.Finalize();
nn::fs::Unmount("data:");
return false;
}
for(int i=0;i<512;i++)if (src_buff[total+i]!=get_buff[total+i])return false;
for(int i=0;i<size;i++)if (src_buff[total+i]!=get_buff[total+i])return false;
fin.Finalize();
total += 512;
total += size;
size+=size;
num++;
sprintf(str,"size %d , num %d",total,num);
s_RenderSystem.Clear();
@ -163,8 +251,6 @@ bool Test0_V(int n)//Casual
}
bool Test1_W()
{
int total,size2;
@ -271,13 +357,18 @@ bool Test1_V()
return true;
}
#define test2_max 680
#define test2_ct test2_max
//#define test2_max 10
//#define test2_ct 5
#define test2_size 512
//ファイル数
bool Test2_W(int n)
{
int total,size2;
res = nn::fs::FormatSaveData(680,1,false);//dupなしファイル680
res = nn::fs::FormatSaveData(test2_max,1,false);//dupなしファイル680
if (res.IsFailure()){
drawText(8,100,"format Fail");
return false;
@ -290,7 +381,7 @@ bool Test2_W(int n)
total =0;
int num = 0;
size2 = 512;
size2 = test2_size;
while(1){
sprintf(file_path,"data:/test%d.bin",num);
// res = nn::fs::TryCreateFile(L"data:/test2.bin",SIZE_TEST1);
@ -356,7 +447,7 @@ bool Test2_V(int n)
}
for (i=0;i<size;i++) if (src_buff[total+i] != get_buff[total+i])
{
drawText(8,100,"verifi Fail at %d",total+i);
drawText(8,100,"verifi Fail at %d",total+i);
fin.Finalize();
nn::fs::Unmount("data:");
return false;
@ -382,9 +473,13 @@ bool Test2_V(int n)
return true;
}
#define DirDepth 80
//85のとき252文字
#define DirDepth 85
//ファイルをパス長いものに限定
//#define DirDepthLow 80
#define DirDepthLow 0
//ディレクトリ深度
//ディレクトリ深度とパス長
bool Test3_W()
{
int total,size2;
@ -409,32 +504,33 @@ bool Test3_W()
strcat(file_path,str);
res = nn::fs::TryCreateDirectory(file_path);
if (res.IsFailure()){
sprintf(str,"length = %d",(int)strlen(file_path));
drawText(8,110,str);
drawText(8,100,"Dir create Fail");
nn::fs::Unmount("data:");
return false;
}
strcpy(file_path2,file_path);
sprintf(str,"/t%d.bin",num);
strcat(file_path2,str);
res = fout.TryInitialize(file_path2,true);
if (res.IsFailure()){
drawText(8,100,"open Fail");
nn::fs::Unmount("data:");
return false;
}
res = fout.TryWrite( &size,&src_buff[total],size2);
if (res.IsFailure()){
drawText(8,100,"write Fail");
fout.Finalize();
sprintf(str,"length = %d",(int)strlen(file_path));
drawText(8,110,str);
drawText(8,100,"Dir create Fail");
nn::fs::Unmount("data:");
return false;
return false;
}
if (num>=DirDepthLow){
strcpy(file_path2,file_path);
sprintf(str,"/t%d.bin",num);
strcat(file_path2,str);
res = fout.TryInitialize(file_path2,true);
if (res.IsFailure()){
drawText(8,100,"open Fail");
nn::fs::Unmount("data:");
return false;
}
res = fout.TryWrite( &size,&src_buff[total],size2);
if (res.IsFailure()){
drawText(8,100,"write Fail");
fout.Finalize();
nn::fs::Unmount("data:");
return false;
}
fout.Finalize();
total+=size;
}
fout.Finalize();
num++;
total+=size;
s_RenderSystem.Clear();
sprintf(str,"num %d",num);
drawText(10,80,str);
@ -446,7 +542,7 @@ bool Test3_W()
nn::fs::Unmount("data:");
drawText(10,100,"end");
sprintf(str,"length = %d",(int)strlen(file_path2));
sprintf(str,"length = %d",(int)strlen(file_path2)-6);
drawText(8,110,str);
s_RenderSystem.SwapBuffers();
nngxWaitVSync(NN_GX_DISPLAY0);
@ -465,34 +561,34 @@ bool Test3_V()
while(1){
sprintf(str,"/%d",num);
strcat(file_path,str);
strcpy(file_path2,file_path);
sprintf(str,"/t%d.bin",num);
strcat(file_path2,str);
res = fin.TryInitialize(file_path2);
if (res.IsFailure()){
drawText(8,100,"open Fail");
nn::fs::Unmount("data:");
return false;
}
res = fin.TryRead( &size,&get_buff[total],size2);
if (res.IsFailure()){
drawText(8,100,"read Fail");
if (num>=DirDepthLow){
strcpy(file_path2,file_path);
sprintf(str,"/t%d.bin",num);
strcat(file_path2,str);
res = fin.TryInitialize(file_path2);
if (res.IsFailure()){
drawText(8,100,"open Fail");
nn::fs::Unmount("data:");
return false;
}
res = fin.TryRead( &size,&get_buff[total],size2);
if (res.IsFailure()){
drawText(8,100,"read Fail");
fin.Finalize();
nn::fs::Unmount("data:");
return false;
}
for (i=0;i<size;i++) if (src_buff[total+i] != get_buff[total+i])
{
drawText(8,100,"verifi Fail at %d",total+i);
fin.Finalize();
nn::fs::Unmount("data:");
return false;
}
fin.Finalize();
nn::fs::Unmount("data:");
return false;
total+=size;
}
for (i=0;i<size;i++) if (src_buff[total+i] != get_buff[total+i])
{
drawText(8,100,"verifi Fail at %d",total+i);
fin.Finalize();
nn::fs::Unmount("data:");
return false;
}
fin.Finalize();
num++;
total+=size;
s_RenderSystem.Clear();
sprintf(str,"num %d",num);
drawText(10,80,str);
@ -502,7 +598,7 @@ bool Test3_V()
nn::fs::Unmount("data:");
drawText(10,100,"end");
sprintf(str,"length = %d",(int)strlen(file_path2));
sprintf(str,"length = %d",(int)strlen(file_path2)-6);
drawText(8,110,str);
s_RenderSystem.SwapBuffers();
nngxWaitVSync(NN_GX_DISPLAY0);
@ -523,7 +619,10 @@ bool Test4_W()
return false;
}
strcpy(file_path,"data:/0123456789abcdef");//16文字
strcpy(file_path,"data:/");
while(strlen(file_path)<(16+6)){//16文字
strcat(file_path,"0");
}
res = nn::fs::TryCreateDirectory(file_path);
if (res.IsFailure()){
sprintf(str,"length = %d",(int)strlen(file_path)-6);
@ -532,12 +631,14 @@ bool Test4_W()
nn::fs::Unmount("data:");
return false;
}
strcat(file_path,"/0123456789ab.bin");//16文字
strcat(file_path,"/123456789abc.bin");//16文字
res = fout.TryInitialize(file_path,true);
if (res.IsFailure()){
drawText(8,100,"Open Fail");
nn::fs::Unmount("data:");
return false;
sprintf(str,"length = %d",(int)strlen(file_path)-6);
drawText(8,110,str);
drawText(8,100,"Open Fail");
nn::fs::Unmount("data:");
return false;
}
res = fout.TryWrite( &size,&src_buff[0],512);
if (res.IsFailure()){
@ -557,8 +658,11 @@ bool Test4_W()
bool Test4_V()
{
strcpy(file_path,"data:/0123456789abcdef");//16文字
strcat(file_path,"/0123456789ab.bin");//16文字
strcpy(file_path,"data:/");
while(strlen(file_path)<(16+6)){//16文字
strcat(file_path,"0");
}
strcat(file_path,"/123456789abc.bin");//16文字
res = fin.TryInitialize(file_path);
if (res.IsFailure()){
drawText(8,100,"Open Fail");
@ -661,7 +765,19 @@ bool Test4_V()
*/
#define SIZE_TEST5 (512*100)
//生成サイズに満たないデータ
#define SIZE_TEST5_HZ 4096
#define SIZE_TEST5_START 512*16
//SDK3.1はバグで最初のアクセスでOKだと、2回目以降もOKになる
//SDK3.x より4096単位でハッシュ
//先頭はヘッダ2ブロック含むっぽい
//ファイル先頭3071(512*6),3072以降は4096ごと
//ハッシュ単位間に書き込むと未書込み部分は0クリアされてる
//例)クリエート後に先頭から4096バイト目に512書き込むと、
//3072-4095(512*2)、4608-7168(512*5)は未書込みでも
//エラーなし0埋めされたデータが読める
//尚、クリエート時に先頭512書込ので先頭3072バイトは常に読める
//生成サイズに満たないデータ..未書込領域
bool Test5_W()
{
int pos;
@ -683,13 +799,15 @@ bool Test5_W()
nn::fs::Unmount("data:");
return false;
}
res = fout.TryInitialize(L"data:/test5.bin",true);
if (res.IsFailure()){
drawText(8,100,"open Fail");
nn::fs::Unmount("data:");
return false;
}
pos =0;
pos = SIZE_TEST5_START;
while(1){
fout.SetPosition(pos);
res = fout.TryWrite( &size,&src_buff[pos],512);
@ -703,9 +821,10 @@ bool Test5_W()
s_RenderSystem.Clear();
drawText(10,80,str);
s_RenderSystem.SwapBuffers();
pos += 1024;//512飛ばす
pos += SIZE_TEST5_HZ;//間を飛ばす
if (pos >= SIZE_TEST5)break;
}
fout.Finalize();
nn::fs::CommitSaveData();
nn::fs::Unmount("data:");
@ -718,7 +837,8 @@ bool Test5_W()
bool Test5_V()
{
int i,pos;
int i;
s64 pos;
res = fin.TryInitialize(L"data:/test5.bin");
if (res.IsFailure()){
@ -726,7 +846,7 @@ bool Test5_V()
nn::fs::Unmount("data:");
return false;
}
pos =0;
pos = SIZE_TEST5_START;
while(1){
fin.SetPosition(pos);
res = fin.TryRead( &size,&get_buff[pos],512);
@ -736,7 +856,7 @@ bool Test5_V()
nn::fs::Unmount("data:");
return false;
}
sprintf(str,"position %d",pos);
sprintf(str,"position %d",(int)pos);
s_RenderSystem.Clear();
drawText(10,80,str);
s_RenderSystem.SwapBuffers();
@ -746,7 +866,7 @@ bool Test5_V()
drawText(8,100,"verifi Fail at %d",i);
return false;
}
pos += 1024;//512飛ばす
pos += SIZE_TEST5_HZ;//飛ばす
if (pos >= SIZE_TEST5)break;
}
fin.Finalize();
@ -1085,7 +1205,7 @@ void TestMain()
switch(curs){
case 0:sccs = Test0_W(5);break;
case 1:sccs = Test1_W();break;
case 2:sccs = Test2_W(680);break;
case 2:sccs = Test2_W(test2_ct);break;
case 3:sccs = Test3_W();break;
case 4:sccs = Test4_W();break;
case 5:sccs = Test5_W();break;
@ -1121,7 +1241,7 @@ void TestMain()
if (sccs == false){
fin.Finalize();
fout.Finalize();
res =nn::fs::Unmount("data:");
nn::fs::Unmount("data:");
drawText(8,120,"Failed");
}
sprintf(str,"desc %d",res.GetDescription());