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

This commit is contained in:
mizu 2011-05-10 02:33:33 +00:00
parent 567628e736
commit 0299ada588
58 changed files with 438 additions and 1178 deletions

View File

@ -1,2 +0,0 @@
-p
-t

View File

@ -1,11 +0,0 @@
<インポータのオプション有効化>
cms_inf.txtの名前でファイル作成しSDのルート下に配置
以下の記述でオプションが有効になる
デバグや不具合調査時用、通常はいらない
-t: テストメニュー
   カード上のセーブにテストパターン書き込み&ベリファイ
-p: 本体シリアルを表示

View File

@ -15,7 +15,7 @@ TitleInfo:
Version: 0
Rom:
HostRoot : romfiles
# HostRoot : romfiles
# SaveDataSize: 512K
AccessControlInfo:

View File

@ -669,6 +669,11 @@ RetCode Card2Sd()
}
if (res == RESULT_OK){
if (ct != arcInfo.FileCount)//ファイル数に満たないパス検索終了
{//ディレクトリ情報かパス取得で失敗してると思われる
PutError(ERC_DEV_OTHER,ERC_EXEC);
return ERROR;
}
//フォーマット情報を記録
//Exsaveに2重化が無いので情報取得APIでは不足 - 2011.1 現在
//プロダクトコードを追加(2011.1.26)

View File

@ -1,37 +0,0 @@

//エラー表示コードの下位2桁
0, //不明
1, //デバイスが見つからない
2,//プロダクトコード不一致
3,//ベリファイエラー
4,//パスが長すぎ
5,//ディレクトリ深すぎ
6, //メディアが見つからない(サブ基盤外れなど)
10, //ファイルが見つからない
20, //既に存在
21, //空き容量がない
22, //書込み禁止
30, //アクセスエラー
50, //フォーマットエラー
60, //検証に失敗、改竄
70, //ROM情報エラー
80, //リトライ要求
90, //実行時エラー
99 //深刻なエラー
//上位
CARD = 100,
BKUP DEVICE = 200,
OTHER = 300
これらの合成で表示される
例えば、カードが刺さっていない場合は 101 となる
通常時に発生しやすいと思われるもの
302 .. プロダクトコードが一致しない
101 .. カードが見つからない

View File

@ -1,57 +0,0 @@
動作確認環境:
ARM製 RVC_Nintendo 4.1
omake 0.9.8.5
CTR SDK2.0 + Repairtoolプライベートパッチ
v1.03以降は ps_api.h と libnn_psも(SystemProgramKitに入っている)
動作要件SDK2.0以降のシステム本体
準備)
SDK2.0用のSampledemos のcommon,gxをビルドしておく
omakerootのあるディレクトリにあるomakeファイルで
SAMPLED_DEMOS_COMMON_INCLUDE_DIR に 
sampledemos/common/includeの位置を指定しておく
公開鍵pubkeyをimp/omakeで指定
ビルド)
omakerootのあるディレクトリでomake実行
body下でビルドし出来たcia を、Imp下のomake(SRC_IMPORTEE_PATH)で指定
(量産機で使うには、マスタリング後のciaを指定)
ビルドするとNANDインポート用のcciができる
インポート先:
ciaをからインポート -> SD .. DevMenu使用,DevMenufullならnandにも入れられる
カード起動しインポート -> NAND
量産実機での実行にはマスタリング必須
body下で作成したcia をOLS付でマスタリングし
そのciaを使って作成したcciをマスタリング
マスタリングの流れ:
・body/images下に出来たciaをマスタリングしOLSを付ける
・このciaをImpのomakeで指定、もしくは指定場所に置く
bodyのビルドで上書きされないよう場所かファイル名変えたほうが安全
・imp/omake実行し、cci作成
・cciをマスタリング
OLSごとリマスタバージョン更新が必要
common/ver.hは表示バージョン、ここだけ変更してもダメ
body/omekeのコメントを参考
NANDインポートで失敗する場合はciaをチェック
SDインポートし
開発実機で動く- マスタリングしてない
量産実機で動く- OLSが付いてない
1.03以降はインポート先の本体をシリアル番号で制限
"imp/imp_lis/"下にリストと署名サンプル
OpenSSL0.9.6k,rと 1.0.0d で動作確認
imp/imp_list 下にコマンドラインツール(win32版)用バッチ
使い方はcygwinでも同じ
ユーザにはomake指定のpubkeyと組のprivatekeyで作った署名を渡す
本ツール開発時のマスタリングは推進G(高橋さん)に依頼した
マスタリング済みDevMenu(full)および
CUP作成は飯島さんに聞く

View File

@ -1,10 +0,0 @@
<インポータのオプション有効化>
cms_inf.txtの名前でファイル作成
以下の記述でオプションが有効になる
-t: テストメニュー
   カード上のセーブにテストパターン書き込み&ベリファイ
-p: 本体シリアルを表示

View File

@ -1,10 +0,0 @@
量産実機での動作にはマスタリングが必要
ciaはサーバ認証OLS必須
OLSは前回取得時からリマスタバージョンを上げる必要あり(2011/2月現在)
(例えば、前回 1.0.0 なら 1.0.1 )
メジャーはrsfで指定(Remasterversion)
マイナとマイクロはOmakefile
MAKECIAFLAGS = -minor 0 -micro 1
上の場合 *.0.1 (*はrsfのRemasterversion)

View File

@ -1,41 +0,0 @@
<操作メニュー>
操作が出来る状態のとき下画面にボタン表示
・バックアップが無い状態でカードを差すと
バックアップが有効
・バックアップがある状態では
リストアが有効
(バックアップ)
タッチして実行画面
カードから本体内メモリに読み出します
(リストア)
タッチして実行画面
バックアップした内容をカードへ書きます
成功すると自動で消去
失敗の場合は消去しません
(バックアップデリート)
先頭画面で 方向キー LEFT + X 同時押し
以下、ビルド時にフラグ有効(my_dess.h 内)にした場合のみ使える
//クラッシュモード
書き戻す際にデータを壊す、ベリファイで必ずエラー
先頭画面で Y ボタン
//デバグモード
先頭画面で 方向下+(0.09まで)
先頭画面で 方向下+X+(1.00以降)
クラッシュモード有効時 L ボタン
//テストデータ書き込み
デバグモード中に先頭画面でRボタン

View File

@ -1,34 +0,0 @@
ビルド時に組み込んだ公開鍵のペアとなるプライベート鍵を使って署名を行う
バージョンで鍵を識別する
鍵変更だけの場合でもバージョンを変えること
Openssl.exe : cygwinのインスト、Win版がある
RSA鍵、ビット長はのみ
SHA256のダイジェストに署名する
Openssl0.9.6.k(r),1.0.0d作成の書名で動作確認
(鍵作成)
openssl genrsa -out private_key.pem 2048
openssl enc -d -base64 -in private_key.pem -out private_key.der
openssl rsa -pubout -inform DER -outform DER -in private_key.der -out public_key.der
(1.0.0の場合)
openssl genpkey -out private_key.der -outform DER -algorithm rsa -pkeyopt rsa_keygen_bits:2048 -pkeyopt rsa_keygen_pubexp:65537
openssl rsa -pubout -inform DER -outform DER -in private_key.der -out public_key.der
(署名)
openssl dgst -sha256 -binary -keyform DER -sign private_key.der -out csm_sign.dat csm_list.txt
プライベート鍵のバイナリが不要なら
openssl genrsa -out private_key.pem 2048
openssl rsa -pubout -outform DER -in private_key.pem -out public_key.der
openssl dgst -sha256 -binary -sign private_key.pem -out csm_sign.dat csm_list.txt
作成したpub鍵をインポートアプリのomakeで指定
OBJECTS[] =
$`(ObjectFromBinary $(TARGET), ./Imp_list/Public_Key.der)
リストをプライベート鍵で署名作成、リストと署名をインポート時にSDから読む

View File

@ -1,274 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<NintendoWareIntermediateFile>
<GraphicsContentCtr Version="1.3.0" Namespace="">
<EditData>
<MetaData>
<Key>MetaData</Key>
<Create Author="" Date="2010-12-02T15:21:10" Source="COMMON.mb">
<ToolDescriptions Name="NW4C_Export for Maya 2009 Service Pack 1" Version="1.2.0" />
</Create>
<Modify Date="2011-02-28T13:27:46">
<ToolDescriptions Name="NintendoWare Creative Studio For Banner." Version="1.3.0.30235" />
</Modify>
</MetaData>
<ContentSummaryMetaData>
<Key>ContentSummaries</Key>
<Values>
<ContentSummary ContentTypeName="GraphicsContent">
<ObjectSummaries>
<ObjectSummary TypeName="SkeletalModel" Name="">
<Notes>
<Note Name="MaterialCount" Value="1" />
<Note Name="ShapeCount" Value="1" />
<Note Name="MeshCount" Value="1" />
<Note Name="BoneCount" Value="1" />
<Note Name="TotalPrimitiveSetCount" Value="1" />
<Note Name="TotalNoneSkinningPrimitiveSetCount" Value="1" />
<Note Name="TotalRigidSkinningPrimitiveSetCount" Value="0" />
<Note Name="TotalSmoothSkinningPrimitiveSetCount" Value="0" />
<Note Name="TotalIndexStreamCount" Value="1" />
<Note Name="TotalPolygonCount" Value="2" />
<Note Name="TotalVertexCount" Value="4" />
</Notes>
</ObjectSummary>
</ObjectSummaries>
</ContentSummary>
</Values>
</ContentSummaryMetaData>
</EditData>
<Models>
<SkeletalModel Name="" IsBranchVisible="true" IsVisible="true" CullingMode="Dynamic" IsNonuniformScalable="false" LayerId="0" NeededBoneCapacity="20">
<EditData>
<ModelDccToolExportOption ExportStartFrame="0" Magnify="1" AdjustSkinning="None" MeshVisibilityMode="BindByIndex">
<Key>ModelDccToolInfo</Key>
</ModelDccToolExportOption>
<OptimizationLogArrayMetaData Size="1">
<Key>OptimizationLogs</Key>
<Values>
<OptimizationLog Date="2010-12-02T15:21" EditorVersion="1.2.0.27817">
<Options NodeCompressionMode="None" IsMergeMeshOwnerBoneEnabled="false" IsCombineMeshEnabled="false" IsCompressMaterialEnabled="false" IsOptimizePlygonPrimitiveEnabled="false" IsConvertOneBoneSkeletalModelToModel="true" IsDeleteUnusedVertexEnabled="false" PositionQuantizeMode="Float" NormalQuantizeMode="Float" TextureQuantizeMode="Float" GroupByIndexStream="false" />
</OptimizationLog>
</Values>
</OptimizationLogArrayMetaData>
</EditData>
<AnimationGroupDescriptions>
<GraphicsAnimationGroupDescription Name="SkeletalAnimation" EvaluationTiming="AfterSceneCulling">
<MemberInformationSet>
<AnimationMemberDescription BlendOperationName="CalculatedTransform" IsBinarized="true">
<Path>Skeleton.Bones["*"].AnimatedTransform</Path>
</AnimationMemberDescription>
</MemberInformationSet>
</GraphicsAnimationGroupDescription>
<GraphicsAnimationGroupDescription Name="VisibilityAnimation" EvaluationTiming="BeforeWorldUpdate">
<MemberInformationSet>
<AnimationMemberDescription BlendOperationName="Bool" IsBinarized="true">
<Path>IsVisible</Path>
</AnimationMemberDescription>
<AnimationMemberDescription BlendOperationName="Bool" IsBinarized="true">
<Path>Meshes["*"].IsVisible</Path>
</AnimationMemberDescription>
<AnimationMemberDescription BlendOperationName="Bool" IsBinarized="true">
<Path>IsBranchVisible</Path>
</AnimationMemberDescription>
</MemberInformationSet>
</GraphicsAnimationGroupDescription>
<GraphicsAnimationGroupDescription Name="MaterialAnimation" EvaluationTiming="AfterSceneCulling">
<MemberInformationSet>
<AnimationMemberDescription BlendOperationName="RgbaColor" IsBinarized="true">
<Path>Materials["*"].MaterialColor.Emission</Path>
</AnimationMemberDescription>
<AnimationMemberDescription BlendOperationName="RgbaColor" IsBinarized="true">
<Path>Materials["*"].MaterialColor.Ambient</Path>
</AnimationMemberDescription>
<AnimationMemberDescription BlendOperationName="RgbaColor" IsBinarized="true">
<Path>Materials["*"].MaterialColor.Diffuse</Path>
</AnimationMemberDescription>
<AnimationMemberDescription BlendOperationName="RgbaColor" IsBinarized="true">
<Path>Materials["*"].MaterialColor.Specular0</Path>
</AnimationMemberDescription>
<AnimationMemberDescription BlendOperationName="RgbaColor" IsBinarized="true">
<Path>Materials["*"].MaterialColor.Specular1</Path>
</AnimationMemberDescription>
<AnimationMemberDescription BlendOperationName="RgbaColor" IsBinarized="true">
<Path>Materials["*"].MaterialColor.Constant0</Path>
</AnimationMemberDescription>
<AnimationMemberDescription BlendOperationName="RgbaColor" IsBinarized="true">
<Path>Materials["*"].MaterialColor.Constant1</Path>
</AnimationMemberDescription>
<AnimationMemberDescription BlendOperationName="RgbaColor" IsBinarized="true">
<Path>Materials["*"].MaterialColor.Constant2</Path>
</AnimationMemberDescription>
<AnimationMemberDescription BlendOperationName="RgbaColor" IsBinarized="true">
<Path>Materials["*"].MaterialColor.Constant3</Path>
</AnimationMemberDescription>
<AnimationMemberDescription BlendOperationName="RgbaColor" IsBinarized="true">
<Path>Materials["*"].MaterialColor.Constant4</Path>
</AnimationMemberDescription>
<AnimationMemberDescription BlendOperationName="RgbaColor" IsBinarized="true">
<Path>Materials["*"].MaterialColor.Constant5</Path>
</AnimationMemberDescription>
<AnimationMemberDescription BlendOperationName="RgbaColor" IsBinarized="true">
<Path>Materials["*"].TextureMappers["*"].Sampler.BorderColor</Path>
</AnimationMemberDescription>
<AnimationMemberDescription BlendOperationName="Int" IsBinarized="true">
<Path>Materials["*"].TextureMappers["*"].Texture</Path>
</AnimationMemberDescription>
<AnimationMemberDescription BlendOperationName="RgbaColor" IsBinarized="true">
<Path>Materials["*"].FragmentOperation.BlendOperation.BlendColor</Path>
</AnimationMemberDescription>
<AnimationMemberDescription BlendOperationName="Vector2" IsBinarized="true">
<Path>Materials["*"].TextureCoordinators["*"].Scale</Path>
</AnimationMemberDescription>
<AnimationMemberDescription BlendOperationName="Float" IsBinarized="true">
<Path>Materials["*"].TextureCoordinators["*"].Rotate</Path>
</AnimationMemberDescription>
<AnimationMemberDescription BlendOperationName="Vector2" IsBinarized="true">
<Path>Materials["*"].TextureCoordinators["*"].Translate</Path>
</AnimationMemberDescription>
</MemberInformationSet>
</GraphicsAnimationGroupDescription>
</AnimationGroupDescriptions>
<Transform>
<Scale X="1" Y="1" Z="1" />
<Rotate X="0" Y="0" Z="0" />
<Translate X="0" Y="0" Z="0" />
</Transform>
<Shapes>
<SeparateDataShapeCtr>
<OrientedBoundingBox>
<CenterPosition X="0" Y="0" Z="6.5" />
<OrientationMatrix M00="1" M01="0" M02="0" M10="0" M11="1" M12="0" M20="0" M21="0" M22="1" />
<Size X="24" Y="12" Z="0" />
</OrientedBoundingBox>
<PositionOffset X="0" Y="0" Z="0" />
<PrimitiveSets>
<PrimitiveSetCtr SkinningMode="None">
<BoneIndexTable>0</BoneIndexTable>
<Primitives>
<PrimitiveCtr>
<IndexStreams>
<UbyteIndexStreamCtr PrimitiveMode="Triangles" Size="6">0 1 2 1 3 2</UbyteIndexStreamCtr>
</IndexStreams>
</PrimitiveCtr>
</Primitives>
</PrimitiveSetCtr>
</PrimitiveSets>
<VertexAttributes>
<Vector3VertexStreamCtr Usage="Position" VertexSize="4" Scale="1" QuantizedMode="Float">
-12 -6 6.5
12 -6 6.5
-12 6 6.5
12 6 6.5
</Vector3VertexStreamCtr>
<Vector3VertexAttributeCtr Usage="Normal">0 0 1</Vector3VertexAttributeCtr>
<Vector2VertexStreamCtr Usage="TextureCoordinate0" VertexSize="4" Scale="1" QuantizedMode="Float">
0 0
1 0
0 1
1 1
</Vector2VertexStreamCtr>
</VertexAttributes>
</SeparateDataShapeCtr>
</Shapes>
<Materials>
<MaterialCtr Name="MT_00" IsCompressible="true" LightSetIndex="0" FogIndex="0" IsFragmentLightEnabled="false" IsVertexLightEnabled="false" IsHemiSphereLightEnabled="false" IsHemiSphereOcclusionEnabled="false" IsFogEnabled="false" TextureCoordinateConfig="Config0120" TranslucencyKind="Layer1" ShaderProgramDescriptionIndex="-1" ShaderBinaryKind="Default">
<ShaderReference />
<MaterialColor VertexColorScale="1">
<Emission R="0" G="0" B="0" A="0" />
<Ambient R="1" G="1" B="1" A="0" />
<Diffuse R="1" G="1" B="1" A="1" />
<Specular0 R="1" G="1" B="1" A="0" />
<Specular1 R="0" G="0" B="0" A="0" />
<Constant0 R="0" G="0" B="0" A="1" />
<Constant1 R="0" G="0" B="0" A="1" />
<Constant2 R="0" G="0" B="0" A="1" />
<Constant3 R="0" G="0" B="0" A="1" />
<Constant4 R="0" G="0" B="0" A="1" />
<Constant5 R="0" G="0" B="0" A="1" />
</MaterialColor>
<Rasterization CullingMode="BackFace" IsPolygonOffsetEnabled="false" PolygonOffsetUnit="0" />
<TextureCoordinators>
<TextureCoordinatorCtr SourceCoordinate="0" MappingMethod="UvCoordinateMap" ReferenceCamera="0" MatrixMode="DccMaya" ScaleS="1" ScaleT="1" Rotate="0" TranslateS="0" TranslateT="0" />
</TextureCoordinators>
<TextureMappers>
<PixelBasedTextureMapperCtr>
<TextureReference>Textures["banner_imp"]@file:Textures/banner_imp.ctex</TextureReference>
<StandardTextureSamplerCtr MinFilter="Linear" MagFilter="Linear" WrapS="ClampToEdge" WrapT="ClampToEdge" MinLod="0" LodBias="0">
<BorderColor R="0" G="0" B="0" A="1" />
</StandardTextureSamplerCtr>
</PixelBasedTextureMapperCtr>
</TextureMappers>
<FragmentShader LayerConfig="ConfigurationType0">
<BufferColor R="0" G="0" B="0" A="1" />
<FragmentBump BumpTextureIndex="Texture0" BumpMode="NotUsed" IsBumpRenormalize="false" />
<FragmentLighting FresnelConfig="No" IsClampHighLight="false" IsDistribution0Enabled="false" IsDistribution1Enabled="false" IsGeometricFactor0Enabled="false" IsGeometricFactor1Enabled="false" IsReflectionEnabled="false" />
<FragmentLightingTable>
<ReflectanceRSampler IsAbs="true" Input="CosNormalHalf" Scale="One">
<NullLookupTableCtr />
</ReflectanceRSampler>
<ReflectanceGSampler IsAbs="true" Input="CosNormalHalf" Scale="One">
<NullLookupTableCtr />
</ReflectanceGSampler>
<ReflectanceBSampler IsAbs="true" Input="CosNormalHalf" Scale="One">
<NullLookupTableCtr />
</ReflectanceBSampler>
<Distribution0Sampler IsAbs="true" Input="CosNormalHalf" Scale="One">
<NullLookupTableCtr />
</Distribution0Sampler>
<Distribution1Sampler IsAbs="true" Input="CosNormalHalf" Scale="One">
<NullLookupTableCtr />
</Distribution1Sampler>
<FresnelSampler IsAbs="true" Input="CosNormalHalf" Scale="One">
<NullLookupTableCtr />
</FresnelSampler>
</FragmentLightingTable>
<TextureCombiners>
<TextureCombinerCtr CombineRgb="Replace" CombineAlpha="Replace" ScaleRgb="One" ScaleAlpha="One" Constant="Constant0" BufferInputRgb="PreviousBuffer" BufferInputAlpha="PreviousBuffer">
<SourceRgb Source0="Texture0" Source1="FragmentPrimaryColor" Source2="FragmentSecondaryColor" />
<OperandRgb Operand0="Color" Operand1="Color" Operand2="Color" />
<SourceAlpha Source0="Texture0" Source1="Constant" Source2="Constant" />
<OperandAlpha Operand0="Alpha" Operand1="Alpha" Operand2="Alpha" />
</TextureCombinerCtr>
</TextureCombiners>
<AlphaTest IsTestEnabled="false" TestFunction="Always" TestReference="0" />
</FragmentShader>
<FragmentOperation>
<DepthOperation IsTestEnabled="true" TestFunction="Less" IsMaskEnabled="false" />
<BlendOperation Mode="Blend" LogicOperation="Copy">
<RgbParameter BlendFunctionSource="SourceAlpha" BlendFunctionDestination="OneMinusSourceAlpha" BlendEquation="FuncAdd" />
<AlphaParameter BlendFunctionSource="One" BlendFunctionDestination="Zero" BlendEquation="FuncAdd" />
<BlendColor R="0" G="0" B="0" A="1" />
</BlendOperation>
<StencilOperation IsTestEnabled="false" TestFunction="Never" TestReference="0" TestMask="255" FailOperation="Keep" ZFailOperation="Keep" PassOperation="Keep" />
</FragmentOperation>
</MaterialCtr>
</Materials>
<Meshes>
<Mesh IsVisible="true" RenderPriority="0" MeshNodeName="BONE_00">
<EditData>
<DccToolSourceNodeMetaData>
<Key>DccToolSourceNode</Key>
<Values>
<NodeName>BONE_00</NodeName>
</Values>
</DccToolSourceNodeMetaData>
</EditData>
<SeparateShapeReference>Shapes[0]</SeparateShapeReference>
<MaterialReference>Materials["MT_00"]</MaterialReference>
</Mesh>
</Meshes>
<Skeleton RootBoneName="BONE_00" ScalingRule="Standard" IsTranslateAnimationEnabled="true">
<Bones>
<Bone Name="BONE_00" ParentBoneName="" IsSegmentScaleCompensate="false" IsCompressible="true" IsNeededRendering="true" HasSkinningMatrix="false" BillboardMode="YAxial">
<Transform>
<Scale X="1" Y="1" Z="1" />
<Rotate X="0" Y="0" Z="0" />
<Translate X="0" Y="0" Z="0" />
</Transform>
</Bone>
</Bones>
</Skeleton>
</SkeletalModel>
</Models>
</GraphicsContentCtr>
</NintendoWareIntermediateFile>

File diff suppressed because one or more lines are too long

View File

@ -1,27 +0,0 @@
目的:許可した本体のみインポート
公開鍵はROMから読み込む
SC ツール用本体のシリアルをメールなどでREDへ連絡
RED) リスト(csm_list)と署名(csm_sign)を作成し送る
インポート手順
 リスト、署名を書き込んだSDをCTRに差す
・ インポート用アプリをカード起動
・ 有効な本体ならインポートメニューが表示される
署名はOpeneelで作成
特に手を加えずSDルートに置く
リストの書き方
インポート許可シリアルをテキストで羅列
---
aaaaaaaa
bbbbbbbb
----
本体裏シリアル終端のdigit(四角い枠の数字)は省く
digit確認したい場合はリスト作成時にやっとく
ファイルサイズは64Kまで(シリアルのみ記載で、およそ4000台)

View File

@ -1,11 +0,0 @@
<インポータのオプション有効化>
cms_inf.txtの名前でファイル作成しSDのルート下に配置
以下の記述でオプションが有効になる
デバグや不具合調査時用、通常はいらない
-t: テストメニュー
   カード上のセーブにテストパターン書き込み&ベリファイ
-p: 本体シリアルを表示

View File

@ -126,16 +126,6 @@ u32 WaitKey(u32 mask)
hpr->ReadLatest(&padStatus);
if(padStatus.trigger & mask)return padStatus.trigger;
CheckSysBreak();
/*
int i = nn::ndm::GetDaemonStatus( nn::ndm::DN_CEC );
if (i !=3 )NN_LOG("DN_CEC %d\n",i);
i = nn::ndm::GetDaemonStatus( nn::ndm::DN_BOSS );
if (i !=3 )NN_LOG("DN_BOSS %d\n",i);
i = nn::ndm::GetDaemonStatus( nn::ndm::DN_NIM );
if (i !=3 )NN_LOG("DN_NIM %d\n",i);
i = nn::ndm::GetDaemonStatus( nn::ndm::DN_FRIENDS );
if (i !=3 )NN_LOG("DN_FRIENDS %d\n",i);
*/
}
}
@ -247,19 +237,16 @@ void nnMain( void )
//nn::Result result;
bool flg_applove=false;
bool flg_test=false;
int i,j,n;
s32 fsize;
extern bool prohibitHome;// HOME ボタン禁止
nn::os::Initialize();
nn::fs::Initialize();
//DEA-SUPにて推奨のフリーズ暫定対策無線デーモンを停止 (2011.3.1 現在)
//ただし、スリープ時の"いつのまに通信"は止まらない
//ただし、スリープに入ると再開
//無線は使わないので本体横スイッチ切っとくのが確実
nn::ndm::Initialize();
result = nn::ndm::SuspendScheduler();
//NN_LOG("%d",result.GetDescription());
nn::ndm::SuspendScheduler();
//中断処理の準備
InitSysBreak((uptr)endfunc);
@ -274,7 +261,7 @@ void nnMain( void )
//if (result.IsSuccess())
result = nn::am::InitializeForLocalImporter();
nn::applet::DisableSleep();//スリープ非対応
nn::applet::DisableSleep();//スリープ非対応 .. 無線対策
// ヒープの確保
appHeap.Initialize(nn::os::GetDeviceMemoryAddress(), nn::os::GetDeviceMemorySize(), nn::os::ALLOCATE_OPTION_LINEAR);
@ -309,135 +296,138 @@ void nnMain( void )
if (READ_BUFFER_SIZE < LIST_LENGTH)ErrorStop("buffer size");//バッファサイズのチェック
//ファイルバッファ
//カゲマイ上のSDリード速度比較実験で32アラインが良かったので、おまじない
//回数もサイズも少ないので気にする必要ないかも
//SDKで4倍数サイズ、4アライン推奨
if (READ_BUFFER_SIZE > appHeap.GetTotalFreeSize())ErrorStop("memory alloc");
readBuf = reinterpret_cast<u8*>(appHeap.Allocate(READ_BUFFER_SIZE,32));
if (ROMFS_BUFFER_SIZE > appHeap.GetTotalFreeSize())ErrorStop("memory alloc");
romfsBuf = reinterpret_cast<u8*>(appHeap.Allocate(ROMFS_BUFFER_SIZE,32));
/*
//シリアルチェック
if( GetSerial() == false)ErrorStop("Get Serial");//本体シリの取得に失敗
if (nn::os::CTR::GetRunningTargetHardware() != nn::os::TARGET_HARDWARE_PRODUCT)
{//デバッガ
flg_test=true;
flg_applove=true;
}else{//実機ならシリアルチェック
int i,j,n;
s32 fsize;
if( GetSerial() == false)ErrorStop("Get Serial");//本体シリの取得に失敗
result = nn::fs::MountSdmc();//ダイレクトでマウント..マスタリング時にワーニング
if (result.IsFailure())ErrorStop("Mount SD");
fsize = FileRead(INF_FILE);//設定ファイルがあるか
if((fsize < 1024) && (fsize > 0))//サイズチェック,増えても1Kは超えない
{//不具合調査時に状況にあわせて現場で作成&変更を想定したオプション
//通常は不要なので無しでも動くようしとく
n = 0;
while(n < fsize)
{
if (readBuf[n] == '-'){
if (n == fsize-1)break;//終端
result = nn::fs::MountSdmc();//ダイレクトでマウント..マスタリング時にワーニング
if (result.IsFailure())ErrorStop("Mount SD");
fsize = FileRead(INF_FILE);//設定ファイルがあるか
if((fsize < 1024) && (fsize > 0))//サイズチェック,増えても1Kは超えない
{//不具合調査時に状況にあわせて現場で作成&変更を想定したオプション
//通常は不要なので無しでも動くようしとく
n = 0;
while(n < fsize)
{
if (readBuf[n] == '-'){
if (n == fsize-1)break;//終端
n++;
switch (readBuf[n]){
case 'p':// -p .. 本体シリアル表示
strcpy(seri,"s/n: ");
strcat(seri,(char *)serialNo);
shf_SetScale(0.5,0.5);
drawText(10,40,(char*)seri);
shf_SetScale(0.7,0.7);
break;
case 't':// -t .. テストメニュー有効
flg_test = true;
break;
}
}
n++;
switch (readBuf[n]){
case 'p':// -p .. 本体シリアル表示
strcpy(seri,"s/n: ");
strcat(seri,(char *)serialNo);
shf_SetScale(0.5,0.5);
drawText(10,40,(char*)seri);
shf_SetScale(0.7,0.7);
break;
case 't':// -t .. テストメニュー有効
flg_test = true;
break;
}
}
//シリアル表示(オプション)後にチェック
//デバッガ=15,実機=11
if (GettedSerLen < 11)ErrorStop("invalid Serial");
fsize = FileRead(SIGN_FILE);//署名リード
if(fsize != 256)ErrorStop("sign file");//鍵のbit長は2046固定
memcpy(sign,readBuf,256);//readBuf -> sign
fsize = FileRead(LIST_FILE);//リストリード
if((fsize > LIST_LENGTH ) || (fsize == 0))ErrorStop("list file");
nn::fs::Unmount("sdmc:"); //検証後はSDから読まないでメモリバッファ上のデータを使う: 差替え対策
if (VeriRsa(readBuf,fsize,sign) == false)ErrorStop("sign verify");
//署名検証OK
int list_ct = 0;
n=0;
while(n < fsize)//リスト作成
{
if (readBuf[n] == '#')//コメント行を無視、ワイド文字非対応
{
i = CrLf(n,fsize);//コメントの次行
if (i == 0)break;//ファイル終わりまで改行が見つからない
}else
{
//改行さがし
if ((fsize-n) > (SDK_SER_LEN+2))
{//シリアルは改行つける
i = CrLf(n,n+SDK_SER_LEN+2);
if (i == 0)ErrorStop("list broken");//改行が見つからない
}else{
i = CrLf(n,fsize);
if (i ==0)i = fsize;//改行以外でファイル終
}
if ((i-n) > GettedSerLen)//シリアルをリスト化
{
j = 0;
while(n<i)
{
if ((readBuf[n] == 0x0d) || (readBuf[n] == 0x0a))break;
s_list[list_ct][j] = readBuf[n];
j++;n++;
}
s_list[list_ct][j] = 0;//終端
list_ct++;
if (list_ct>=LIST_MAX)ErrorStop("List too Long");
}
}
if ((fsize-i) < GettedSerLen)break;//ファイル終
n=i;//ポインタを改行の次へ
}
//文字数チェック
//開発初期のファームアップで空ID本体が発生してたので念の為
//2011.5現在、製品で報告はない
if (GettedSerLen < 11)ErrorStop("invalid Serial");
//本体シリアルがリストにあるかチェック
n =0;
while(n<list_ct)
{
if (GettedSerLen == strlen((char*)s_list[n]))
{
for(i=0;i<GettedSerLen;i++)
{
if (serialNo[i] != s_list[n][i])break;
}
if (i == GettedSerLen)
{
flg_applove = true;
break;
}
}
n++;
}
}
//シリアル表示(オプション)後にチェック
//デバッガ=15,実機=11
if (GettedSerLen < 11)ErrorStop("invalid Serial");
fsize = FileRead(SIGN_FILE);//署名リード
if(fsize != 256)ErrorStop("sign file");//鍵のbit長は2046固定
memcpy(sign,readBuf,256);//readBuf -> sign
fsize = FileRead(LIST_FILE);//リストリード
if((fsize > LIST_LENGTH ) || (fsize == 0))ErrorStop("list file");
nn::fs::Unmount("sdmc:"); //検証後はSDから読まないでメモリバッファ上のデータを使う: 差替え対策
if (VeriRsa(readBuf,fsize,sign) == false)ErrorStop("sign verify");
//署名検証OK
int list_ct = 0;
n=0;
while(n < fsize)//リスト作成
{
if (readBuf[n] == '#')//コメント行を無視、ワイド文字非対応
{
i = CrLf(n,fsize);//コメントの次行
if (i == 0)break;//ファイル終わりまで改行が見つからない
}else
{
//改行さがし
if ((fsize-n) > (SDK_SER_LEN+2))
{//シリアルは改行つける
i = CrLf(n,n+SDK_SER_LEN+2);
if (i == 0)ErrorStop("list broken");//改行が見つからない
}else{
i = CrLf(n,fsize);
if (i ==0)i = fsize;//改行以外でファイル終
}
if ((i-n) > GettedSerLen)//シリアルをリスト化
{
j = 0;
while(n<i)
{
if ((readBuf[n] == 0x0d) || (readBuf[n] == 0x0a))break;
s_list[list_ct][j] = readBuf[n];
j++;n++;
}
s_list[list_ct][j] = 0;//終端
list_ct++;
if (list_ct>=LIST_MAX)ErrorStop("List too Long");
}
}
if ((fsize-i) < GettedSerLen)break;//ファイル終
n=i;//ポインタを改行の次へ
}
//プログラムミス、コードバグ対策
//値が小さいと判定が緩くなるが、動作確認時にスルーしそうなので
//念の為チェック
if (GettedSerLen < 11)ErrorStop("invalid Serial");
//本体シリアルがリストにあるかチェック
n =0;
while(n<list_ct)
{
if (GettedSerLen == strlen((char*)s_list[n]))
{
for(i=0;i<GettedSerLen;i++)
{
if (serialNo[i] != s_list[n][i])break;
}
if (i == GettedSerLen)
{
flg_applove = true;
break;
}
}
n++;
}
*/
u32 mask = 0;
//メニュー表示
// if (flg_applove)//インポート許可本体
if (flg_applove)//インポート許可本体
{
drawText(80,100,"Push X : Import");
drawText(80,140,"Push Y : Delete");
drawText(80,140,"Push Y : Delete"); //本体機能で消せるようなったら、そっち使う
mask |= nn::hid::BUTTON_X | nn::hid::BUTTON_Y;
}
//本体機能で消せるようなったら、そっち使うべき
//将来的にdeleteは省いていいかも
//if (flg_test)//テストメニュー
if (flg_test)//テストメニュー
{
drawText(80,160,"Push R : Test Data");
mask |= nn::hid::BUTTON_R;

View File

@ -53,11 +53,11 @@ void drawText(u16 x,u16 y,char *s,int v)
//----------------------------------------  テストパターン
void make_pattern()
{
int i,j;
j=0;
for (i=0;i<1024*1024;i++){
src_buff[i] = j+i;
if (i & 0x100)j++;
int i;
int *buff;
buff = (int*)&src_buff[0];
for (i=0;i<sizeof(src_buff)/sizeof(int);i++){
buff[i] = i;
}
}
@ -65,6 +65,106 @@ void make_pattern()
s32 size;
#define SIZE_TEST1 421888
//#define SIZE_TEST1 244736 //dup
bool Test0_W(int n)//Casual
{
res = nn::fs::FormatSaveData(100,100,false);
if (res.IsFailure()){
drawText(8,100,"format Fail");
return false;
}
res =nn::fs::MountSaveData();
if (res.IsFailure()){
drawText(8,100,"Mount Fail");
return false;
}
int num = 0,total=0;
while(1){
sprintf(file_path,"data:/test%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);
if (res.IsFailure()){
drawText(8,100,"open Fail");
nn::fs::Unmount("data:");
return false;
}
res = fout.TryWrite( &size,&src_buff[total],512);
if (res.IsFailure()){
drawText(8,100,"write Fail");
fout.Finalize();
nn::fs::Unmount("data:");
return false;
}
fout.Finalize();
total += 512;
num++;
sprintf(str,"size %d , num %d",total,num);
s_RenderSystem.Clear();
drawText(10,80,str);
s_RenderSystem.SwapBuffers();
//if (size<512)break;
if (num == n)break;
}
fout.Finalize();
nn::fs::CommitSaveData();
nn::fs::Unmount("data:");
NN_LOG("total %d",total);
drawText(10,100,"end");
s_RenderSystem.SwapBuffers();
nngxWaitVSync(NN_GX_DISPLAY0);
return true;
}
bool Test0_V(int n)//Casual
{
int num = 0,total=0;
while(1){
sprintf(file_path,"data:/test%d/test%d.bin",num,num);
res = fin.TryInitialize(file_path);
if (res.IsFailure()){
drawText(8,100,"open Fail");
nn::fs::Unmount("data:");
return false;
}
res = fin.TryRead( &size,&get_buff[total],512);
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;
fin.Finalize();
total += 512;
num++;
sprintf(str,"size %d , num %d",total,num);
s_RenderSystem.Clear();
drawText(10,80,str);
s_RenderSystem.SwapBuffers();
//if (size<512)break;
if (num == n)break;
}
fin.Finalize();
nn::fs::CommitSaveData();
nn::fs::Unmount("data:");
NN_LOG("total %d",total);
drawText(10,100,"end");
s_RenderSystem.SwapBuffers();
nngxWaitVSync(NN_GX_DISPLAY0);
return true;
}
bool Test1_W()
{
int total,size2;
@ -580,7 +680,8 @@ bool Test5_V()
return true;
}
const char kinsi[] = {0x22,'<','>','?','*','|',0x5c,':',' ','/',0};//0x22 = "",0x5c = 円マーク
const char kinsi[] = {0x22,'<','>','?','*','|',0x5c,':',' ',0};//0x22 = "",0x5c = 円マーク
// スラッシュはセーブ時に重ね("//")ても"/"になり,末尾だとエラーとなる
const char *kinsi2[] = { "CON","PRN","NUL","AUX","LPT1","LPT2","LPT3","LPT4","COM1","COM2","COM3","COM4"
,"con","prn","nul","aux","lpt1","lpt2","lpt3","lpt4","com1","com2","com3","com4",""};
@ -661,7 +762,7 @@ bool Test6_W()
strcat(fname,"_.bin");//data:/base_/base_.bin
i =0;
while(kinsi[i] != '/')//末尾スラッシュは名無しでエラー
while(kinsi[i] != 0)
{
c = kinsi[i];
dname[pos] = c;
@ -905,7 +1006,7 @@ void TestMain()
s_RenderSystem.SwapBuffers();
nngxWaitVSync(NN_GX_DISPLAY0);
switch(curs){
case 0:sccs = Test2_W(10);break;
case 0:sccs = Test0_W(5);break;
case 1:sccs = Test1_W();break;
case 2:sccs = Test2_W(680);break;
case 3:sccs = Test3_W();break;
@ -926,7 +1027,7 @@ void TestMain()
drawText(8,100,"Mount Fail");
}else
switch(curs){
case 0:sccs = Test2_V(10);break;
case 0:sccs = Test0_V(5);break;
case 1:sccs = Test1_V();break;
case 2:sccs = Test2_V(680);break;
case 3:sccs = Test3_V();break;
@ -940,7 +1041,12 @@ void TestMain()
}else if(curs < menu_max)curs++;
if (value & (nn::hid::BUTTON_A | nn::hid::BUTTON_X)){
if (sccs == false)drawText(8,120,"Failed");
if (sccs == false){
fin.Finalize();
fout.Finalize();
res =nn::fs::Unmount("data:");
drawText(8,120,"Failed");
}
sprintf(str,"desc %d",res.GetDescription());
drawText(10,140,str);
s_RenderSystem.SwapBuffers();

View File

@ -15,8 +15,8 @@
#----------------------------------------------------------------------------
SUPPORTED_TARGETS = CTR-T*.Process.MPCore.*
#CTR_APPTYPE = BOTH
CTR_APPTYPE = CARD
CTR_APPTYPE = BOTH
#CTR_APPTYPE = CARD
#CTR_APPTYPE = NAND
#demoライブラリ位置指定

View File

@ -1,274 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<NintendoWareIntermediateFile>
<GraphicsContentCtr Version="1.3.0" Namespace="">
<EditData>
<MetaData>
<Key>MetaData</Key>
<Create Author="" Date="2010-12-02T15:21:10" Source="COMMON.mb">
<ToolDescriptions Name="NW4C_Export for Maya 2009 Service Pack 1" Version="1.2.0" />
</Create>
<Modify Date="2011-02-28T13:21:02">
<ToolDescriptions Name="NintendoWare Creative Studio For Banner." Version="1.3.0.30235" />
</Modify>
</MetaData>
<ContentSummaryMetaData>
<Key>ContentSummaries</Key>
<Values>
<ContentSummary ContentTypeName="GraphicsContent">
<ObjectSummaries>
<ObjectSummary TypeName="SkeletalModel" Name="">
<Notes>
<Note Name="MaterialCount" Value="1" />
<Note Name="ShapeCount" Value="1" />
<Note Name="MeshCount" Value="1" />
<Note Name="BoneCount" Value="1" />
<Note Name="TotalPrimitiveSetCount" Value="1" />
<Note Name="TotalNoneSkinningPrimitiveSetCount" Value="1" />
<Note Name="TotalRigidSkinningPrimitiveSetCount" Value="0" />
<Note Name="TotalSmoothSkinningPrimitiveSetCount" Value="0" />
<Note Name="TotalIndexStreamCount" Value="1" />
<Note Name="TotalPolygonCount" Value="2" />
<Note Name="TotalVertexCount" Value="4" />
</Notes>
</ObjectSummary>
</ObjectSummaries>
</ContentSummary>
</Values>
</ContentSummaryMetaData>
</EditData>
<Models>
<SkeletalModel Name="" IsBranchVisible="true" IsVisible="true" CullingMode="Dynamic" IsNonuniformScalable="false" LayerId="0" NeededBoneCapacity="20">
<EditData>
<ModelDccToolExportOption ExportStartFrame="0" Magnify="1" AdjustSkinning="None" MeshVisibilityMode="BindByIndex">
<Key>ModelDccToolInfo</Key>
</ModelDccToolExportOption>
<OptimizationLogArrayMetaData Size="1">
<Key>OptimizationLogs</Key>
<Values>
<OptimizationLog Date="2010-12-02T15:21" EditorVersion="1.2.0.27817">
<Options NodeCompressionMode="None" IsMergeMeshOwnerBoneEnabled="false" IsCombineMeshEnabled="false" IsCompressMaterialEnabled="false" IsOptimizePlygonPrimitiveEnabled="false" IsConvertOneBoneSkeletalModelToModel="true" IsDeleteUnusedVertexEnabled="false" PositionQuantizeMode="Float" NormalQuantizeMode="Float" TextureQuantizeMode="Float" GroupByIndexStream="false" />
</OptimizationLog>
</Values>
</OptimizationLogArrayMetaData>
</EditData>
<AnimationGroupDescriptions>
<GraphicsAnimationGroupDescription Name="SkeletalAnimation" EvaluationTiming="AfterSceneCulling">
<MemberInformationSet>
<AnimationMemberDescription BlendOperationName="CalculatedTransform" IsBinarized="true">
<Path>Skeleton.Bones["*"].AnimatedTransform</Path>
</AnimationMemberDescription>
</MemberInformationSet>
</GraphicsAnimationGroupDescription>
<GraphicsAnimationGroupDescription Name="VisibilityAnimation" EvaluationTiming="BeforeWorldUpdate">
<MemberInformationSet>
<AnimationMemberDescription BlendOperationName="Bool" IsBinarized="true">
<Path>IsVisible</Path>
</AnimationMemberDescription>
<AnimationMemberDescription BlendOperationName="Bool" IsBinarized="true">
<Path>Meshes["*"].IsVisible</Path>
</AnimationMemberDescription>
<AnimationMemberDescription BlendOperationName="Bool" IsBinarized="true">
<Path>IsBranchVisible</Path>
</AnimationMemberDescription>
</MemberInformationSet>
</GraphicsAnimationGroupDescription>
<GraphicsAnimationGroupDescription Name="MaterialAnimation" EvaluationTiming="AfterSceneCulling">
<MemberInformationSet>
<AnimationMemberDescription BlendOperationName="RgbaColor" IsBinarized="true">
<Path>Materials["*"].MaterialColor.Emission</Path>
</AnimationMemberDescription>
<AnimationMemberDescription BlendOperationName="RgbaColor" IsBinarized="true">
<Path>Materials["*"].MaterialColor.Ambient</Path>
</AnimationMemberDescription>
<AnimationMemberDescription BlendOperationName="RgbaColor" IsBinarized="true">
<Path>Materials["*"].MaterialColor.Diffuse</Path>
</AnimationMemberDescription>
<AnimationMemberDescription BlendOperationName="RgbaColor" IsBinarized="true">
<Path>Materials["*"].MaterialColor.Specular0</Path>
</AnimationMemberDescription>
<AnimationMemberDescription BlendOperationName="RgbaColor" IsBinarized="true">
<Path>Materials["*"].MaterialColor.Specular1</Path>
</AnimationMemberDescription>
<AnimationMemberDescription BlendOperationName="RgbaColor" IsBinarized="true">
<Path>Materials["*"].MaterialColor.Constant0</Path>
</AnimationMemberDescription>
<AnimationMemberDescription BlendOperationName="RgbaColor" IsBinarized="true">
<Path>Materials["*"].MaterialColor.Constant1</Path>
</AnimationMemberDescription>
<AnimationMemberDescription BlendOperationName="RgbaColor" IsBinarized="true">
<Path>Materials["*"].MaterialColor.Constant2</Path>
</AnimationMemberDescription>
<AnimationMemberDescription BlendOperationName="RgbaColor" IsBinarized="true">
<Path>Materials["*"].MaterialColor.Constant3</Path>
</AnimationMemberDescription>
<AnimationMemberDescription BlendOperationName="RgbaColor" IsBinarized="true">
<Path>Materials["*"].MaterialColor.Constant4</Path>
</AnimationMemberDescription>
<AnimationMemberDescription BlendOperationName="RgbaColor" IsBinarized="true">
<Path>Materials["*"].MaterialColor.Constant5</Path>
</AnimationMemberDescription>
<AnimationMemberDescription BlendOperationName="RgbaColor" IsBinarized="true">
<Path>Materials["*"].TextureMappers["*"].Sampler.BorderColor</Path>
</AnimationMemberDescription>
<AnimationMemberDescription BlendOperationName="Int" IsBinarized="true">
<Path>Materials["*"].TextureMappers["*"].Texture</Path>
</AnimationMemberDescription>
<AnimationMemberDescription BlendOperationName="RgbaColor" IsBinarized="true">
<Path>Materials["*"].FragmentOperation.BlendOperation.BlendColor</Path>
</AnimationMemberDescription>
<AnimationMemberDescription BlendOperationName="Vector2" IsBinarized="true">
<Path>Materials["*"].TextureCoordinators["*"].Scale</Path>
</AnimationMemberDescription>
<AnimationMemberDescription BlendOperationName="Float" IsBinarized="true">
<Path>Materials["*"].TextureCoordinators["*"].Rotate</Path>
</AnimationMemberDescription>
<AnimationMemberDescription BlendOperationName="Vector2" IsBinarized="true">
<Path>Materials["*"].TextureCoordinators["*"].Translate</Path>
</AnimationMemberDescription>
</MemberInformationSet>
</GraphicsAnimationGroupDescription>
</AnimationGroupDescriptions>
<Transform>
<Scale X="1" Y="1" Z="1" />
<Rotate X="0" Y="0" Z="0" />
<Translate X="0" Y="0" Z="0" />
</Transform>
<Shapes>
<SeparateDataShapeCtr>
<OrientedBoundingBox>
<CenterPosition X="0" Y="0" Z="6.5" />
<OrientationMatrix M00="1" M01="0" M02="0" M10="0" M11="1" M12="0" M20="0" M21="0" M22="1" />
<Size X="24" Y="12" Z="0" />
</OrientedBoundingBox>
<PositionOffset X="0" Y="0" Z="0" />
<PrimitiveSets>
<PrimitiveSetCtr SkinningMode="None">
<BoneIndexTable>0</BoneIndexTable>
<Primitives>
<PrimitiveCtr>
<IndexStreams>
<UbyteIndexStreamCtr PrimitiveMode="Triangles" Size="6">0 1 2 1 3 2</UbyteIndexStreamCtr>
</IndexStreams>
</PrimitiveCtr>
</Primitives>
</PrimitiveSetCtr>
</PrimitiveSets>
<VertexAttributes>
<Vector3VertexStreamCtr Usage="Position" VertexSize="4" Scale="1" QuantizedMode="Float">
-12 -6 6.5
12 -6 6.5
-12 6 6.5
12 6 6.5
</Vector3VertexStreamCtr>
<Vector3VertexAttributeCtr Usage="Normal">0 0 1</Vector3VertexAttributeCtr>
<Vector2VertexStreamCtr Usage="TextureCoordinate0" VertexSize="4" Scale="1" QuantizedMode="Float">
0 0
1 0
0 1
1 1
</Vector2VertexStreamCtr>
</VertexAttributes>
</SeparateDataShapeCtr>
</Shapes>
<Materials>
<MaterialCtr Name="MT_00" IsCompressible="true" LightSetIndex="0" FogIndex="0" IsFragmentLightEnabled="false" IsVertexLightEnabled="false" IsHemiSphereLightEnabled="false" IsHemiSphereOcclusionEnabled="false" IsFogEnabled="false" TextureCoordinateConfig="Config0120" TranslucencyKind="Layer1" ShaderProgramDescriptionIndex="-1" ShaderBinaryKind="Default">
<ShaderReference />
<MaterialColor VertexColorScale="1">
<Emission R="0" G="0" B="0" A="0" />
<Ambient R="1" G="1" B="1" A="0" />
<Diffuse R="1" G="1" B="1" A="1" />
<Specular0 R="1" G="1" B="1" A="0" />
<Specular1 R="0" G="0" B="0" A="0" />
<Constant0 R="0" G="0" B="0" A="1" />
<Constant1 R="0" G="0" B="0" A="1" />
<Constant2 R="0" G="0" B="0" A="1" />
<Constant3 R="0" G="0" B="0" A="1" />
<Constant4 R="0" G="0" B="0" A="1" />
<Constant5 R="0" G="0" B="0" A="1" />
</MaterialColor>
<Rasterization CullingMode="BackFace" IsPolygonOffsetEnabled="false" PolygonOffsetUnit="0" />
<TextureCoordinators>
<TextureCoordinatorCtr SourceCoordinate="0" MappingMethod="UvCoordinateMap" ReferenceCamera="0" MatrixMode="DccMaya" ScaleS="1" ScaleT="1" Rotate="0" TranslateS="0" TranslateT="0" />
</TextureCoordinators>
<TextureMappers>
<PixelBasedTextureMapperCtr>
<TextureReference>Textures["banner"]@file:Textures/banner.ctex</TextureReference>
<StandardTextureSamplerCtr MinFilter="Linear" MagFilter="Linear" WrapS="ClampToEdge" WrapT="ClampToEdge" MinLod="0" LodBias="0">
<BorderColor R="0" G="0" B="0" A="1" />
</StandardTextureSamplerCtr>
</PixelBasedTextureMapperCtr>
</TextureMappers>
<FragmentShader LayerConfig="ConfigurationType0">
<BufferColor R="0" G="0" B="0" A="1" />
<FragmentBump BumpTextureIndex="Texture0" BumpMode="NotUsed" IsBumpRenormalize="false" />
<FragmentLighting FresnelConfig="No" IsClampHighLight="false" IsDistribution0Enabled="false" IsDistribution1Enabled="false" IsGeometricFactor0Enabled="false" IsGeometricFactor1Enabled="false" IsReflectionEnabled="false" />
<FragmentLightingTable>
<ReflectanceRSampler IsAbs="true" Input="CosNormalHalf" Scale="One">
<NullLookupTableCtr />
</ReflectanceRSampler>
<ReflectanceGSampler IsAbs="true" Input="CosNormalHalf" Scale="One">
<NullLookupTableCtr />
</ReflectanceGSampler>
<ReflectanceBSampler IsAbs="true" Input="CosNormalHalf" Scale="One">
<NullLookupTableCtr />
</ReflectanceBSampler>
<Distribution0Sampler IsAbs="true" Input="CosNormalHalf" Scale="One">
<NullLookupTableCtr />
</Distribution0Sampler>
<Distribution1Sampler IsAbs="true" Input="CosNormalHalf" Scale="One">
<NullLookupTableCtr />
</Distribution1Sampler>
<FresnelSampler IsAbs="true" Input="CosNormalHalf" Scale="One">
<NullLookupTableCtr />
</FresnelSampler>
</FragmentLightingTable>
<TextureCombiners>
<TextureCombinerCtr CombineRgb="Replace" CombineAlpha="Replace" ScaleRgb="One" ScaleAlpha="One" Constant="Constant0" BufferInputRgb="PreviousBuffer" BufferInputAlpha="PreviousBuffer">
<SourceRgb Source0="Texture0" Source1="FragmentPrimaryColor" Source2="FragmentSecondaryColor" />
<OperandRgb Operand0="Color" Operand1="Color" Operand2="Color" />
<SourceAlpha Source0="Texture0" Source1="Constant" Source2="Constant" />
<OperandAlpha Operand0="Alpha" Operand1="Alpha" Operand2="Alpha" />
</TextureCombinerCtr>
</TextureCombiners>
<AlphaTest IsTestEnabled="false" TestFunction="Always" TestReference="0" />
</FragmentShader>
<FragmentOperation>
<DepthOperation IsTestEnabled="true" TestFunction="Less" IsMaskEnabled="false" />
<BlendOperation Mode="Blend" LogicOperation="Copy">
<RgbParameter BlendFunctionSource="SourceAlpha" BlendFunctionDestination="OneMinusSourceAlpha" BlendEquation="FuncAdd" />
<AlphaParameter BlendFunctionSource="One" BlendFunctionDestination="Zero" BlendEquation="FuncAdd" />
<BlendColor R="0" G="0" B="0" A="1" />
</BlendOperation>
<StencilOperation IsTestEnabled="false" TestFunction="Never" TestReference="0" TestMask="255" FailOperation="Keep" ZFailOperation="Keep" PassOperation="Keep" />
</FragmentOperation>
</MaterialCtr>
</Materials>
<Meshes>
<Mesh IsVisible="true" RenderPriority="0" MeshNodeName="BONE_00">
<EditData>
<DccToolSourceNodeMetaData>
<Key>DccToolSourceNode</Key>
<Values>
<NodeName>BONE_00</NodeName>
</Values>
</DccToolSourceNodeMetaData>
</EditData>
<SeparateShapeReference>Shapes[0]</SeparateShapeReference>
<MaterialReference>Materials["MT_00"]</MaterialReference>
</Mesh>
</Meshes>
<Skeleton RootBoneName="BONE_00" ScalingRule="Standard" IsTranslateAnimationEnabled="true">
<Bones>
<Bone Name="BONE_00" ParentBoneName="" IsSegmentScaleCompensate="false" IsCompressible="true" IsNeededRendering="true" HasSkinningMatrix="false" BillboardMode="YAxial">
<Transform>
<Scale X="1" Y="1" Z="1" />
<Rotate X="0" Y="0" Z="0" />
<Translate X="0" Y="0" Z="0" />
</Transform>
</Bone>
</Bones>
</Skeleton>
</SkeletalModel>
</Models>
</GraphicsContentCtr>
</NintendoWareIntermediateFile>

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M‡M§U§U†M†M†M†M†M†M†M†M†M†M†M†M†M§U§U§U†M‡U§U§U§U¨]¨]Č]§U¨]Č]É]É]Éeéeęm†M†M‡M§U§U§U¨UČ]§U¨U¨]Č]Č]ÉeÉeęeČ]É]É]ęeéeęmęm nęeęmëm v v,v,v-~Č]ÉeÉeęeęeëmëm vęe n n v v,~-~M† v,~,~-~-~N†N†oŽM~N†N†oŽoŽp<70>ž n,v,v-~-~N†N†oŽ-~N†N†oŽoŽppnŽoŽpŽ<70><EFBFBD>±ž±ž˛¦˛ž˛žÓ¦Ň¦Ó®Ó®ő¶oŽp<70>ž˛ž˛žÓ¦ž˛¦˛¦Ó¦Ó¦Ô®ô®ő¶Ó¦Ô®ô®ő¶ő¶żż7Çő¶żż7Ç7Ç8ĎXĎYφM‡U§U§U§U¨]Č]É]¨UČ]Č]ÉeÉ]éeęeęmÉ]éeéej]ęmkeK*ë!ęmË2 vk+;-~LmN†Éeęeęeęmęm v v,vëm v v,~,v-~-~N† v«!-~ŚK moŽK*.uN††oŽ<6F>íS¬:‘ž˛ž v-~«!ÍdM†®}K*«!N†nuoŽpŽkđ…Ndl2oŽ<6F>L2±ž±ž˛¦kĐt±ž˛¦ržŇŤk.Kl2kpO}°…˛žnK°td CđtÓ¦Ô® KÍBő¶żÍ:Ťkł•ÍB.KÍB…ń|¦7Ç7Çđc÷ĆXĎy×Ó¦ô®ô®ń|ő¶żk·m:žË!kXĎkY×7ÇXĎXĎY×YĎz×z×zßY×z×z×ßßççĽďm:<3A>[kV¶Ť:W¶îJ®OSzßzßßtxľĽçĽďßçśçĽďĽď˝ďÝďŢ÷ĽďÝďÝďŢ÷Ţ÷ţ÷ţ÷˙˙,~-~M~N†N†oŽoŽ<6F>N†oŽoŽ<6F><EFBFBD>ž±ž˛¦<CB9B>ž±ž˛¦˛žÓ¦Ó¦ô®˛¦Ó®Ó®ô¶ô®ő¶·ż<>±ž±žŇ¦˛¦Ó®Ó®ô¶˛¦Ó®Ô®ô¶ô¶żżżô¶··żż7Ç7ÇXĎż7Ç7ÇXĎXĎY×y×zßÔ®ő¶ő¶żż7Ç7ÇXĎż7Ç7ÇXĎXĎYĎY×z×8ĎYĎYĎy×y×zßzßçzךߚßççĽçĽç˝ďXĎY×y×z×z×ßßçzßßßśçśçĽďĽďÝďçĽçĽď˝ď˝ďÝ÷Ý÷Ţ÷ÝďŢ÷Ţ÷ţ÷Ţ÷˙˙˙˙˙˙ßśçĽç˝ďĽďÝďÝďŢ÷˝ďÝ÷Ý÷Ţ÷Ţ÷ţ˙ţ˙˙˙Ţ÷Ţ÷ţ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ţ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙

View File

@ -1,2 +0,0 @@
†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M‡M‡U§U†M‡U§U§U§U§U§U§U†M†M†M†M†M†M†M§U†M‡U‡U§U‡U§U§U§U§U§U§U§U§U§U¨U¨]§U¨U¨UČ]Č]Č]Č]É]§U§U§U§U§U¨U¨]¨]§U¨]¨]¨]Č]Č]Č]É]¨]Č]Č]É]É]ÉeÉeÉeÉ]ÉeÉeÉeéeęeęeęm¨]Č]Č]Č]É]É]ÉeÉeÉ]É]ÉeéeÉeęeęeęmÉeéeęeęeęeęmęm nęmęmęm n n n v vÉeęeęeęmęmęmęm nęmëmëm n n v v v n v v v v,v,v,~ v,v,v-~-~-~-~M†ëm n n v v v,v,~ v,v v,~,~-~-~M~,~-~-~-~M~N†N†N†-~N†N†N†N†oŽoŽoŽ,~-~-~M~M~N†N†N†M†N†N†N†N†oŽoŽoŽN†oŽoŽoŽoŽpŽp<70>oŽp<70><EFBFBD><EFBFBD>žN†N†oŽoŽoŽoŽoŽpoŽpŽpŽ<70><EFBFBD><EFBFBD><EFBFBD>ž<E28098><EFBFBD><EFBFBD>žž±ž±ž˛žž±ž±ž˛¦˛ž˛¦˛¦Ó¦<C393>žž±ž˛ž˛¦ž˛ž˛ž˛¦˛¦Ó¦Ó¦Ó®˛¦˛¦ł¦Ó¦Ó¦Ó®Ó®ô®Ó®Ô®Ô®ô®ô®ô¶ô¶ő¶†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M‡U†M†M†M†M†M†M†M†M†M†M†M†M†M†M†M‡U†M†M†M‡U‡U‡U§U§U‡U‡U§U§U§U§U§U¨U†M†M†M†M†M‡U‡U§U‡M‡U§U§U§U§U§U¨U§U§U§U¨U¨U¨]¨]Č]¨U¨]¨]Č]Č]Č]Č]É]§U§U§U¨U¨U¨]¨]Č]¨U¨]¨]Č]Č]É]É]ÉeČ]É]É]ÉeÉeÉeÉeęeÉeÉeÉeęeęeęmęmęmČ]Č]Č]É]É]ÉeÉeéeÉ]ÉeÉeęeéeęeęeęméeęeęeęmęmëm n nęmëmëm n n v v,vęeęeęmęmęmëm n vęm n n v v v v,v n v v,v,v,~,~-~ v,~,~-~-~M~M†N† n v v v v,v,v-~ v,~,~-~-~-~-~N†-~-~-~N†M†N†N†o†N†N†N†OŽNŽoŽoŽpŽ-~M~M~N†N†N†N†oŽN†N†N†oŽoŽoŽoŽpOŽoŽoŽpŽpŽ<70><EFBFBD><70><EFBFBD>žž˛žn†oŽoŽoŽoŽp<70><EFBFBD><6F>p<70><EFBFBD>žž±ž<C2B1>ž±žž˛ž˛ž˛¦±ž˛ž˛ž˛¦˛¦Ó¦Ó¦Ó®žž±ž±ž˛ž˛¦Ň¦˛ž˛¦˛¦ł¦Ň¦Ó¦Ó®Ó®Ň¦Ó¦Ó¦Ó®Ó®ô®ô®ô¶Ó®ô®ô®ô¶ô¶ő¶ő¶ż˛¦Ó¦Ó¦Ó®Ó®Ô®Ô®ô®Ó®Ô®ô®ô¶ô®ő¶ő¶·ô®ő¶ő¶ő¶·żżż·żżżż7Ç7Ç7Çô¶ő¶ő¶··żżżżżżżż7Ç7Ç7Çż7Ç7Ç7Ç7Ç7Ç8ĎXĎ7Ç8ĎXĎXĎXĎYĎYĎy׆M†M†M§U‡U§U§U§U§U§U§U§U§U¨U§U¨]§U§U§U¨]¨]¨]Č]Č]¨]Č]Č]Č]Č]É]É]Ée§U¨U¨U¨]¨]Č]Č]É]¨]Č]Č]É]É]ÉeÉeéeČ]É]É]éeÉeéeęeęeéeęeęeęmęeęmęmëmČ]É]É]ÉeÉeÉeéeęeÉeéeęeęeęeęmęmTęeęmęmëm
n n n+e+]Ë2kkkk2ËKęeęmęm n«e«! Lk n n v vË2k2kkKT+;,~,~-~-~-~ěd-~íu-~-~N†N†N† v vŚm,v,v-~-~-~kk+;K*l\N† e~-~M†M†N†N†N††numm *«!kkkŤK­K-~N†N†N†N†Ť\OŽŤdN†oŽoŽoŽoŽ/ŽpŽ<70>k­KkěBp<70><EFBFBD>ž«!kŹ} *¬:P}kkoŽoŽoŽpp<70><EFBFBD>žkíS *Nd±ž±ž˛ž±ž±ž˛ž˛ž˛¦˛¦Ó¦l2kkkĐtÓ® Cô®ž±ž±ž˛ž˛ž˛¦˛¦Ó¦˛ž˛¦­:ržÓ¦2žÓ®Ťkkk«!k”¦kŃ|knSk0dk.Km:kÓ¦Ó¦Ó®Ô®Ó®ô®ô®ô¶Ô®ô®ô®ő¶ő¶<C591>t· *ô¶ő¶ő¶żżżżżkÍBkÎBÇ7Ç7Ç7Çő¶·ő¶żóťkđckżżŐ¶SŤ * 2kđck 2Ë!k7ÇXĎXĎXĎÎBkÎBkXĎY×Y×y׿7Ç7Ç7Ç7ÇXĎXĎXĎ7ÇXĎXĎXĎXĎYĎYĎy×XĎYĎYĎy×Y×y×z×zßy×z×z×zßzßšßzßßXĎY×Y×y×y×z×z×zßy×z×z×zßzßšßßçzßzßšßßßççśçßççśçśçĽçĽďĽďÉ]ÉeÉeÉeÉeęeęeęméeęeęeęmęmęm n nęeęmęm n n v v v n v v v v,v,v-~ęmëmëm n n v v v n v v v v,~,~-~ v,v,~-~-~-~-~M†-~-~-~N†N†N†N†o† v,v,v,~2kŚCk-~-~-~M† ekN†ě: eN†m\N†N†oŽoŽoŽ *†k *oŽpŽd/uN†N†N†NŽN††oŽoŽnŽoŽoŽpŽoŽp<70><EFBFBD>LCkpđ…kkNd\<5C>žž±ž±ž˛ž˛ž˛¦oŽpŽp<70><EFBFBD>ž<E28098>ďt\‘ž˛žŽuž˛ž˛ž˛¦Żl *ł¦rž˛¦ł¦ ColÓ¦Ô®q…/dkk\p…\®SÓ¦Ó®˛¦Ó¦Ó¦Ó®Ó®Ô®Ô®ô¶kkŇ•plkk0d2…ô¶ő¶ő¶··żżżkÍ: *kô®Ťô¶Ťl2kk *ő¶0lż0lk0lkttku®kkł•k´ť7Çm:7Dz|Ë!óťµ®żżPl7Çu®ż6Ç7Ç7Ç7Ç7Ç7ÇXĎkÔťÔť÷ľXĎ—¶XĎY×XĎXĎXĎY×Y×y×y×z×…Ź[.SË!k6®,2YĎkkkk˛„y×·ľz×<7A>[krtk¸ľz×ö­šßr|kr|kö­›ß®çkŤ:öĄ¸ľz×zßzßšßz×zßzßšßšßßßçr|k:×¶U•ĽçÚÎĽççĽçĽçĽçĽçĽďĽď˝ďzßßßççççĽççśççĽçĽçĽďĽď˝ďĽçĽçĽď˝ď˝ďÝď˝ďÝ÷˝ď˝ď˝ďÝ÷Ý÷Ţ÷Ţ÷Ţ÷ĽçĽďĽď˝ď˝ďÝďÝďÝ÷˝ďÝďÝďÝ÷Ý÷Ţ÷Ţ÷Ţ÷Ý÷Ţ÷Ţ÷Ţ÷Ţ÷ţ÷ţ÷ţ˙Ţ÷ţ÷Ţ÷˙˙˙˙˙˙˙˙˙˙,v,~,~-~-~M~M~N†-~M~M~N†N†N†N†oŽN†N†N†oŽOŽoŽoŽpŽoŽoŽoŽp<70><EFBFBD>N†N†N†oŽoŽoŽoŽpoŽoŽoŽp<70><EFBFBD><EFBFBD>p<70><EFBFBD>ž±ž˛ž±ž±ž˛ž˛ž˛¦˛¦Ó¦pŽ<70><EFBFBD><E28098>žž±žž±ž˛ž˛ž˛¦˛¦˛¦±ž˛¦˛¦˛¦˛¦Ó¦Ó¦Ó®˛¦Ó¦Ó¦Ó®Ó®ô®ô®ô¶˛ž˛¦˛¦Ó¦Ó¦Ó®Ó®Ô®Ó¦Ó®Ó®Ô®Ô®ô®ô¶ő¶Ô®ô®ô®ő¶ô¶ő¶ő¶żő¶ő¶·żżżżżÓ®Ô®ô®ô¶ô¶ő¶ő¶żô¶ő¶ő¶żżżżż·żżżż7Ç7Ç7Çż7Ç7Ç7Ç7Ç8Ď8ĎXĎżżżżż7Ç7Ç7Çż7Ç7Ç7Ç7Ç8ĎXĎXĎ7ÇXĎXĎXĎXĎYĎYĎy×XĎYĎY×y×y×z×z×zß7Ç8Ç8ÇXĎXĎXĎXĎY×XĎYĎYĎY×Y×y×y×z×Y×y×y×z×z×zßzßßzßzßzßßßçççY×y×z×zßzßšßšßßzßšßšßßßççĽçßççśççĽçĽçĽďçĽçĽçĽďĽď˝ď˝ďÝďßçßççśçśçĽďçĽçĽçĽďĽď˝ď˝ď˝ďĽďĽďĽď˝ď˝ďÝďÝďÝ÷˝ďÝďÝďŢ÷Ý÷Ţ÷Ţ÷Ţ÷Ľď˝ď˝ďÝď˝ďÝ÷ÝďŢ÷ÝďÝ÷Ý÷Ţ÷Ţ÷Ţ÷Ţ÷Ţ÷Ţ÷Ţ÷Ţ÷Ţ÷Ţ÷ţ˙ţ˙˙˙Ţ÷ţ˙˙˙˙˙˙˙˙˙˙˙˙˙Ý÷Ţ÷Ţ÷Ţ÷Ţ÷Ţ÷Ţ÷˙˙Ţ÷ţ˙ţ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙p<70><EFBFBD>žž±ž±ž˛žž±ž˛ž˛ž˛žŇ¦Ň¦Ó¦˛ž˛¦˛¦Ó¦Ó¦Ó®Ó®Ô®Ó¦Ó®Ó®Ô®Ô®ô¶ô¶ő¶˛¦ł¦˛¦Ó¦Ó¦Ó®Ó®ô®Ó®Ô®Ô®ô®ô®ô¶ô¶·ô®ô¶ô¶ő¶ő¶żżżő¶żżżżż6ż7ÇÔ®ô®ô¶ő¶ő¶··żő¶··żżżż7Çżżż7Ç7Ç7Ç7Ç8Ç7Ç7Ç7Ç8Ď8ÇXĎXĎXĎżżż7Ç7Ç7Ç7ÇXĎ7Ç7Ç7ÇXĎXĎXĎXĎYĎ8ĎXĎXĎYĎYĎY×y×y×YĎY×y×y×y×z×zßšß7ÇXĎXĎXĎXĎY×Y×y×XĎY×y×y×y×z×z×zßy×z×z×zßzßšßßßzßßßßßççĽçy×z×zßzßzßßßçzßßßçççśçĽççççĽçĽçĽďĽďĽďĽçĽďĽď˝ď˝ďÝď˝ďÝ÷ßççĽçĽçĽçĽçĽďśçĽçĽďĽďĽď˝ď˝ďÝďĽď˝ď˝ďÝď˝ďÝ÷Ý÷Ţ÷ÝďÝ÷Ý÷Ţ÷Ţ÷Ţ÷Ţ÷ţ÷Ľď˝ď˝ďÝďÝďÝ÷Ý÷Ţ÷Ý÷Ţ÷Ţ÷Ţ÷Ţ÷Ţ÷Ţ÷ţ˙Ţ÷Ţ÷Ţ÷ţ˙ţ˙˙˙˙˙˙˙Ţ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ţ÷Ţ÷Ţ÷Ţ÷Ţ÷˙˙˙˙˙˙Ţ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙

View File

@ -15,7 +15,7 @@ TitleInfo:
Version: 0
Rom:
HostRoot : romfiles
# HostRoot : romfiles
# SaveDataSize: 512K
AccessControlInfo:

View File

@ -141,9 +141,10 @@ void PutError(ErcDev dev,int cd)
}
wchar_t file_pathw[MAX_PATH_LENGTH];
wchar_t file_pathw2[MAX_PATH_LENGTH];
char file_path[MAX_PATH_LENGTH];
//ドライバの仕様で速度的に4バイトアラインした方がいい(SDK 0.14.23 時点)
char fileBuffer[512] NN_ATTRIBUTE_ALIGN(4);//検証が512単位なので
//カゲマイ報告の速度実測でFSでバイトアライン有利(SDK 0.14.23 時点)
char fileBuffer[512] NN_ATTRIBUTE_ALIGN(4);//検証 512単位
char fileBuffer_ex[512] NN_ATTRIBUTE_ALIGN(4);
#define FILEBUFF_SIZE sizeof(fileBuffer)
@ -195,14 +196,13 @@ bool Verifi()
res = exsave.Mount();
if(res != RESULT_OK)return false;
//ファイル比較
scr_Status("file compairing",COLOR_YELLO);
savedata.ResetPath();
s64 fsize;
res = RESULT_OK;
while(res==RESULT_OK){
if(CheckInsExit())break;//挿抜による中断
res = savedata.GetPath(file_pathw);
res = savedata.GetPath(file_pathw);//パス取得
if (res != RESULT_OK)break;
if (file_pathw[0] == 0)break;//root then end
if (ct>=arcInfo.FileCount)
@ -211,8 +211,8 @@ bool Verifi()
break;
}
if(CheckInsExit())break;//挿抜による中断
scr_CountPerMax(ct,arcInfo.FileCount);
if (savedata.Open(file_pathw)==false)
scr_CountPerMax(ct,arcInfo.FileCount);//カウンタ表示
if (savedata.Open(file_pathw)==false)//カード上のファイル
{
res = RESULT_FAIL_OPEN;
break;
@ -220,10 +220,13 @@ bool Verifi()
fsize = savedata.FileSize;
total += fsize;
if(CheckInsExit())break;//挿抜による中断
if (exsave.Open(file_pathw)==false)
if (exsave.Open(file_pathw)==false)//SDのファイル
{
res = RESULT_FAIL_OPEN;
break;
if (exsave.OpenVnf(file_pathw)==false)//退避ファイルを探す
{
res = RESULT_FAIL_OPEN;
break;
}
}
msize=fsize;
while(fsize)
@ -240,8 +243,9 @@ bool Verifi()
fsize = 0;
}
if(CheckInsExit())break;//挿抜による中断
if(savedata.Read(fileBuffer,rsize) != rsize )
{
if(savedata.Read(fileBuffer,rsize) != rsize )//カード
{ //中身のデータが作成サイズに満たない場合
//不明部分の処置は書出し時と合わせる
if(nn::fs::ResultVerificationFailed::Includes(savedata.LastNnResult))
{
for ( i = 0; i < rsize; i++)
@ -254,7 +258,7 @@ bool Verifi()
}
}
if(CheckInsExit())break;//挿抜による中断
if(exsave.Read(fileBuffer_ex,rsize) != rsize )
if(exsave.Read(fileBuffer_ex,rsize) != rsize )//SD
{
res = RESULT_FAIL_READ;
break;
@ -264,6 +268,7 @@ bool Verifi()
exsave.Close();
if (res != RESULT_OK)break;
if(isInsEject != InEx_None )break;//挿抜による中断
//比較
for (i=0;i<rsize;i++)if (fileBuffer[i]!=fileBuffer_ex[i]){
res = RESULT_FAIL;
break;
@ -300,13 +305,14 @@ RetCode Card2Sd()
return ERROR;
}
scr_Status("Get Dir",COLOR_YELLO);
scr_Status("Get Directry",COLOR_YELLO);
if(savedata.GetInfo(&arcInfo)==false)
{
savedata.Unmount();
PutError(ERC_DEV_CARD);
return ERROR;
}
strcpy(arcInfo.Pcode,savedata.PrdCode);
if (arcInfo.FileCount == 0)//ファイルが無い
{
@ -358,15 +364,39 @@ RetCode Card2Sd()
res = RESULT_FAIL_OPEN;
break;
}
fsize = savedata.FileSize;
total += fsize;
if(CheckInsExit())break;//挿抜による中断
if (exsave.OpenW(file_pathw,fsize)==false)
//SDで支障あるパス名の場合は別ファイルに格納する
exsave.GetRootPath(file_pathw2);//格納先ルート取得
wcscat(file_pathw2,file_pathw);//実パス名に変換
if (CheckPath(file_pathw2)==false)//パス名チェック
{
res = RESULT_FAIL_OPENW;
break;
if (exsave.OpenVnfW(file_pathw,fsize)==false)//退避ファイル
{
res = RESULT_FAIL_OPENW;
break;
}
}else{
if (exsave.OpenW(file_pathw,fsize)==false)
{
NN_LOG("%d\n",exsave.LastNnResult.GetDescription());
if(nn::fs::ResultInvalidArgument::Includes(exsave.LastNnResult))
{//パス名がFAT違反、パス長オーバ
if (exsave.OpenVnfW(file_pathw,fsize)==false)//退避ファイル
{
res = RESULT_FAIL_OPENW;
break;
}
}else
{
res = RESULT_FAIL_OPENW;
break;
}
}
}
msize=fsize;
while(fsize)
{
@ -421,15 +451,21 @@ RetCode Card2Sd()
//結果
if(isInsEject != InEx_None )
{//挿抜による中断
TryDeleteDir();
return INSEXIT;
if(TryDeleteDir())return INSEXIT;
return ERROR;//デリート失敗表示
}else{
if (res == RESULT_OK)
{
if(Verifi())
if (ct != arcInfo.FileCount)//ファイル数に満たないパス検索終了
{//ディレクトリ情報かパス取得で失敗してると思われる
PutError(ERC_DEV_OTHER,ERC_EXEC);
return ERROR;
}
if(Verifi())//ベリファイ
{
if (exsave.WriteSys(&arcInfo))
{//フォーマットパラメータなど情報ファイル
{//最後に書き戻しに必要なパラメータファイルを記録
if(CheckInsExit()==false)
{
if (exsave.GetInfo(&arcInfo_ex))
@ -439,8 +475,8 @@ RetCode Card2Sd()
(arcInfo.DirCount != arcInfo_ex.DirCount) ||
(arcInfo.FileCount != arcInfo_ex.FileCount) ||
(arcInfo.Dup != arcInfo_ex.Dup))res = RESULT_FAIL_WRITE;
}else res = RESULT_FAIL_WRITE;
}else res = RESULT_FAIL_WRITE;
}
}else res = RESULT_FAIL;
}else res = RESULT_FAIL_WRITE;
}else res = RESULT_FAIL_VERIFI;
}
@ -561,15 +597,6 @@ void WaitUI()
CheckSysBreak();//中断処理
// int i = nn::ndm::GetDaemonStatus( nn::ndm::DN_CEC );
// if (i !=3 )NN_LOG("DN_CEC %d\n",i);
// i = nn::ndm::GetDaemonStatus( nn::ndm::DN_BOSS );
// if (i !=3 )NN_LOG("DN_BOSS %d\n",i);
// i = nn::ndm::GetDaemonStatus( nn::ndm::DN_NIM );
// if (i !=3 )NN_LOG("DN_NIM %d\n",i);
// i = nn::ndm::GetDaemonStatus( nn::ndm::DN_FRIENDS );
// if (i !=3 )NN_LOG("DN_FRIENDS %d\n",i);
//挿抜を検知したら中断して抜ける
//トップ以外ではトップメニューへ戻るようする
if (CheckInsExit())return;
@ -591,8 +618,8 @@ void nnMain()
nn::fs::Initialize();
//DEA-SUPにて推奨のフリーズ暫定対策無線デーモンを停止 (2011.3.1 現在)
//ただし、スリープ時は止まらない
//心配なら本体スイッチで切っとく
//スリープ中は止まらないので、本体スイッチ切るのが確実
//SDK2.2以降で対策不要となったが、点滅が鬱陶しいので残しとく
nn::ndm::Initialize();
nn::ndm::SuspendScheduler();

View File

@ -547,11 +547,17 @@ void scr_TopMenu(bool formatted,bool inserted,bool sdins,int err)
strcpy(scr_err,"Please Insert Card");
gui.MessEffective(MESSAGE_MENU_CAUTION);
}else
if (sdins == false)
{
strcpy(scr_err,"Please Insert SD");
gui.MessEffective(MESSAGE_MENU_CAUTION);
}else{
if (err & SDATA_ERRPUT_MEDIA) i = ERC_MEDIA + ERC_DEV_CARD;//バックアップがない
else
if (err & SDATA_ERRPUT_VERIFI) i = ERC_SDK_VERIFI + ERC_DEV_CARD;//データが壊れている
else if (sdins == false) i = ERC_DEVICE + ERC_DEV_OUT;//書出し先デバイスが無い
//else if (sdins == false) i = ERC_DEVICE + ERC_DEV_OUT;//書出し先デバイスが無い
else i = ERC_FORMAT + ERC_DEV_CARD;//フォーマットエラー
sprintf(scr_err,"ERROR %d",i);
gui.MessEffective(MESSAGE_MENU_ERROR);

View File

@ -1,37 +0,0 @@

//エラー表示コードの下位2桁
0, //不明
1, //デバイスが見つからない
2,//プロダクトコード不一致
3,//ベリファイエラー
4,//パスが長すぎ
5,//ディレクトリ深すぎ
6, //メディアが見つからない(サブ基盤外れなど)
10, //ファイルが見つからない
20, //既に存在
21, //空き容量がない
22, //書込み禁止
30, //アクセスエラー
50, //フォーマットエラー
60, //検証に失敗、改竄
70, //ROM情報エラー
80, //リトライ要求
90, //実行時エラー
99 //深刻なエラー
//上位
CARD = 100,
BKUP DEVICE = 200,
OTHER = 300
これらの合成で表示される
例えば、カードが刺さっていない場合は 101 となる
通常時に発生しやすいと思われるもの
302 .. プロダクトコードが一致しない
101 .. カードが見つからない

View File

@ -1,57 +0,0 @@
動作確認環境:
ARM製 RVC_Nintendo 4.1
omake 0.9.8.5
CTR SDK2.0 + Repairtoolプライベートパッチ
v1.03以降は ps_api.h と libnn_psも(SystemProgramKitに入っている)
動作要件SDK2.31以降のシステム本体
準備)
SDKのSampledemos のcommon,gxをビルドしておく
omakerootのあるディレクトリにあるomakeファイルで
SAMPLED_DEMOS_COMMON_INCLUDE_DIR に 
sampledemos/common/includeの位置を指定しておく
公開鍵pubkeyをimp/omakeで指定
ビルド)
omakerootのあるディレクトリでomake実行
body下でビルドし出来たcia を、Imp下のomake(SRC_IMPORTEE_PATH)で指定
(量産機で使うには、マスタリング後のciaを指定)
ビルドするとNANDインポート用のcciができる
インポート先:
ciaをSDからインポート -> SD .. DevMenu使用,DevMenufullならnandにも入れられる
カード起動しインポート -> NAND
量産実機での実行にはマスタリング必須
body下で作成したcia をOLS付でマスタリングし
そのciaを使って作成したcciをマスタリング
マスタリングの流れ:
・body/images下に出来たciaをマスタリングしOLSを付ける
・このciaをImpのomakeで指定、もしくは指定場所に置く
bodyのビルドで上書きされないよう場所かファイル名変えたほうが安全
・imp/omake実行し、cci作成
・cciをマスタリング
OLSごとリマスタバージョン更新が必要
common/ver.hは表示バージョン、ここだけ変更してもダメ
body/omekeのコメントを参考
NANDインポートで失敗する場合はciaをチェック
SDインポートし
開発実機で動く- マスタリングしてない
量産実機で動く- OLSが付いてない
インポートする本体をシリアル番号で制限してます
"imp/imp_lis/"下にリストと署名サンプル
OpenSSL0.9.6k,rと 1.0.0d で動作確認
imp/imp_list 下にコマンドラインツール(win32版)用バッチ
使い方はcygwinでも同じ
ユーザにはomake指定のpubkeyと組のprivatekeyで作った署名を渡す
本ツール開発時のマスタリングは推進G(高橋さん)に依頼した
マスタリング済みDevMenu(full)および
CUP作成は飯島さんに聞く

View File

@ -1,10 +0,0 @@
<インポータのオプション有効化>
cms_inf.txtの名前でファイル作成
以下の記述でオプションが有効になる
-t: テストメニュー
   カード上のセーブにテストパターン書き込み&ベリファイ
-p: 本体シリアルを表示

View File

@ -1,10 +0,0 @@
量産実機での動作にはマスタリングが必要
ciaはサーバ認証OLS必須
OLSは前回取得時からリマスタバージョンを上げる必要あり(2011/2月現在)
(例えば、前回 1.0.0 なら 1.0.1 )
メジャーはrsfで指定(Remasterversion)
マイナとマイクロはOmakefile
MAKECIAFLAGS = -minor 0 -micro 1
上の場合 *.0.1 (*はrsfのRemasterversion)

View File

@ -1,16 +0,0 @@
<操作メニュー>
操作が出来る状態のとき下画面にボタン表示
・カードを差すと下画面に実行ボタン表示
(バックアップ)
タッチして実行画面
カードからSDへ書き出す
(バックアップデリート)
先頭画面で 方向キー LEFT + X 長押し4秒

View File

@ -1,34 +0,0 @@
ビルド時に組み込んだ公開鍵のペアとなるプライベート鍵を使って署名を行う
バージョンで鍵を識別する
鍵変更だけの場合でもバージョンを変えること
Openssl.exe : cygwinのインスト、Win版がある
RSA鍵、ビット長はのみ
SHA256のダイジェストに署名する
Openssl0.9.6.k(r),1.0.0d作成の書名で動作確認
(鍵作成)
openssl genrsa -out private_key.pem 2048
openssl enc -d -base64 -in private_key.pem -out private_key.der
openssl rsa -pubout -inform DER -outform DER -in private_key.der -out public_key.der
(1.0.0の場合)
openssl genpkey -out private_key.der -outform DER -algorithm rsa -pkeyopt rsa_keygen_bits:2048 -pkeyopt rsa_keygen_pubexp:65537
openssl rsa -pubout -inform DER -outform DER -in private_key.der -out public_key.der
(署名)
openssl dgst -sha256 -binary -keyform DER -sign private_key.der -out csm_sign.dat csm_list.txt
プライベート鍵のバイナリが不要なら
openssl genrsa -out private_key.pem 2048
openssl rsa -pubout -outform DER -in private_key.pem -out public_key.der
openssl dgst -sha256 -binary -sign private_key.pem -out csm_sign.dat csm_list.txt
作成したpub鍵をインポートアプリのomakeで指定
OBJECTS[] =
$`(ObjectFromBinary $(TARGET), ./Imp_list/Public_Key.der)
リストをプライベート鍵で署名作成、リストと署名をインポート時にSDから読む

View File

@ -54,6 +54,7 @@ static nn::fs::Directory dcl;
if ( n==0 )//終端
{
if (s_lv == 0){path[0]=0;return RESULT_OK;}// ---- rootなら終了
dc_readed[s_lv]=0;
s_lv--;//上の層に戻る
wcscpy(path_w,pathu_w[s_lv]);//パス戻す
}else{
@ -121,6 +122,7 @@ static nn::fs::Directory dcl;
if ( n==0 )//終端
{
if (lv == 0){cont=false;break;}// ---- 終了
dc_readed[lv]=0;
lv--;//上の層に戻る
wcscpy(path_w,pathu_w[lv]);//パス戻す
break;

View File

@ -16,3 +16,32 @@ int GetPosDelmLast(wchar_t *s,int top)
}
return -1;
}
//パス名チェック for SD
//APIで引数エラー(INVALID_ARGUMENT)にならないものをチェック
bool CheckPath(wchar_t *s)
{
int i;
size_t n = wcslen(s);
if (n > 253)return false;
if (n>251)
{//オープン時のディレクトリ名は251まで
if ((s[252]==L'/') || (s[253]==L'/'))return false;
}
for (i =1;i< n-1;i++)
{
if (s[i]==L'/')
{
//前後の半角スペース: "/ a"、"/a /" -> SD作成時 "/a" に変化
if ((s[i-1] == ' ')||(s[i+1] == ' '))return false;
if ((s[i-1] == 0x5c) ||(s[i+1] == 0x5c))return false;
}
}
if (s[i] == ' ')return false;//最後尾
return true;
}

View File

@ -21,21 +21,27 @@ int GetPosDelmLast(wchar_t *s,int top);
//SDバックアップに同梱する情報
//変更の際は後方互換とれるよう追加のみとする
typedef struct{
struct tArcInfo{
u32 DirEntry,FileEntry;
u32 DirCount,FileCount;
bool Dup;
u8 Ver;//バージョン
char Pcode[20];//product code save,exsaveクラスのPrdCodeサイズを下回らないこと
u8 padding[3];//パディング
}tArcInfo;
u8 padding[2];//パディング
tArcInfo()
: Ver(INFO_VERSION){}
};
//パス名長 :SDK制限はアーカイブ名抜いて253文字
//文字列操作で多少オーバしても心配ないよう大きくとってお
//アーカイブ名およびSD格納ディレクトリの余裕いれと
#define MAX_PATH_LENGTH 512
//パス取得時の階層上限
//メモリ食うので無駄に大きくしない、最短(例えば"/a")文字で128で足りる
//パス階層上限
#define MAX_LEVEL 128
//パス名チェック
//FAT違反の半角スペースあるかチェック
//文字、予約名、パス長はAPIエラー(INVALID_ARGUMENT)で判定
bool CheckPath(wchar_t *s);
#endif

View File

@ -18,15 +18,16 @@
const char *sdmcName = "sdmc:";
#define PATHLENGTH_MAX_SD 512
wchar_t sdmcRoot_w[PATHLENGTH_MAX_SD];//sdmc:/filer/UserSaveData/YearMtDtHrMtSc/00000000
wchar_t sdmcRoot_w[MAX_PATH_LENGTH];//sdmc:/filer/UserSaveData/YearMtDtHrMtSc/00000000
#define ROOTLENGTH_SD 49
wchar_t fp_path[PATHLENGTH_MAX_SD];
wchar_t ti_path[PATHLENGTH_MAX_SD];
wchar_t expath_w[PATHLENGTH_MAX_SD];//パス名
wchar_t fp_path[MAX_PATH_LENGTH];
wchar_t ti_path[MAX_PATH_LENGTH];
wchar_t expath_w[MAX_PATH_LENGTH];//パス名
//wchar_t expathu_w[100][PATHLENGTH_MAX_SD];//上層パス名
wchar_t expathw_w[PATHLENGTH_MAX_SD];//パス名ワーク
wchar_t latestPath_w[PATHLENGTH_MAX_SD];//sdmc:/filer/UserSaveData/YearMtDtHrMtSc
wchar_t expathw_w[MAX_PATH_LENGTH];//パス名ワーク
wchar_t latestPath_w[MAX_PATH_LENGTH];//sdmc:/filer/UserSaveData/YearMtDtHrMtSc
bool created;
bool IsMounted;
//SDKツールのSaveFilerのフォーマットに合わせる
//------------ sources\tools\NandFiler\nandf_Dialog.h 参照
@ -155,6 +156,15 @@ bool Sdmc::Create()
Unmount();
return false;
}
//格納先パスの取得
//先にCreateしとくこと
void Sdmc::GetRootPath(wchar_t *path)
{
wcscpy(path,sdmcRoot_w);
}
//マウント
myResult Sdmc::Mount()
{
@ -192,12 +202,13 @@ s32 Sdmc::Write(char *buffer,size_t size)
bool Sdmc::OpenW(wchar_t *path,s64 size)
{
int pos,pos2;
wcscpy(expath_w,sdmcRoot_w);
wcscat(expath_w,path);
while(1){
LastNnResult = nn::fs::TryCreateFile(expath_w,size);
if(LastNnResult.IsSuccess())break;
if(nn::fs::ResultNotFound::Includes(LastNnResult)==false)return false;
NN_LOG("%d\n",LastNnResult.GetDescription());
//ディレクトリがなければディレクトリを作成
pos = GetPosDelmLast(expath_w,ROOTLENGTH_SD);//ファイルが存在するディレクトリ
@ -205,17 +216,75 @@ bool Sdmc::OpenW(wchar_t *path,s64 size)
wcscpy(expathw_w,expath_w);//ワークにコピー
while (LastNnResult.IsFailure())
{//ディレクトリ作成できるまで遡る
// if(LastNnResult.GetDescription()!=nn::fs::DESCRIPTION_DBM_DIRECTORY_NOT_FOUND)return false;
if(nn::fs::ResultNotFound::Includes(LastNnResult)==false)return false;
pos2 = GetPosDelmLast(expathw_w,ROOTLENGTH_SD);//境界位置を探す
if (pos2 == 0)return false;//root到達
expathw_w[pos2] = 0;//境界まで削除 (例) dir1/dir2/file -> dir1/dir2 -> dir1
LastNnResult = nn::fs::TryCreateDirectory(expathw_w);
}
}
LastNnResult = writer.TryInitialize(expath_w,false);
return LastNnResult.IsSuccess();
}
//パス名エラーで作成できない場合の退避先
//例FAT規約違反、"/ test"->"/test"、SD格納先ディレクトリでパス長オーバー
bool Sdmc::OpenVnfW(wchar_t *path,s64 size)
{
s32 sz;
tVnf vnf;
//パス名&オフセット用ファイル
wcscpy(expath_w,latestPath_w);
wcscat(expath_w,L"/00000000.vnf");
if(reader.TryInitialize(expath_w).IsSuccess())
{
Close();
LastNnResult = writer.TryInitialize(expath_w,false);
if (LastNnResult.IsSuccess())
LastNnResult = writer.TrySeek(0,nn::fs::POSITION_BASE_END);//追記
}else LastNnResult = writer.TryInitialize(expath_w,true);//新規
if (LastNnResult.IsSuccess())
{
wcscpy(vnf.path,path);
vnf.size = size;
LastNnResult = writer.TryWrite(&sz,&vnf,sizeof(tVnf));//ヘッダ格納
}
if (LastNnResult.IsFailure())
{
writer.Finalize();
return false;
}
return true;
}
//退避ファイルをリード用に開く
//成功時はパス名のデータ先頭位置にシーク
bool Sdmc::OpenVnf(wchar_t *path)
{
s32 sz;
tVnf vnf;
wcscpy(expath_w,latestPath_w);
wcscat(expath_w,L"/00000000.vnf");
if(reader.TryInitialize(expath_w).IsSuccess())
{
while(1)
{
LastNnResult = reader.TryRead(&sz, &vnf, sizeof(vnf));//ヘッダ
if (LastNnResult.IsSuccess() && (sz == sizeof(tVnf)))
{
vnf.path[MAX_PATH_LENGTH-1] = 0;//念の為、終端
if(wcscmp(vnf.path,path) ==0)return true;//パス名一致
LastNnResult = reader.TrySeek(vnf.size,nn::fs::POSITION_BASE_CURRENT);//次
if (LastNnResult.IsFailure())return false;
}else return false;
}
}
return false;
}
//情報ファイル
//
@ -316,6 +385,7 @@ bool Sdmc::Open(wchar_t *path)
if (LastNnResult.IsSuccess())return true;
else Close();
}
NN_LOG("sdmc:Open %d",LastNnResult.GetDescription());
return false;
}
@ -345,6 +415,7 @@ Sdmc::Sdmc()
void Sdmc::Finalize()
{
CloseW();
Close();
Unmount();
}
//デストラクタ

View File

@ -38,7 +38,6 @@ private:
tArcInfo m_info;
//int s_lv;
int exrootlen;
bool IsMounted;
//bool s_serch;
public:
Sdmc();
@ -52,6 +51,9 @@ public:
bool DeleteAll();
void CloseW();
bool OpenW(wchar_t *path,s64 size);
bool OpenVnfW(wchar_t *path,s64 size);
bool OpenVnf(wchar_t *path);
void GetRootPath(wchar_t *path);
// bool OpenSysW();//暫定
// void CloseSysW();//暫定
// bool OpenSysR();//暫定
@ -67,6 +69,12 @@ public:
bool GetInfo(tArcInfo *pinfo);
};
//Fat違反パス格納データのヘッダ
//直後にデータ配置
//Header+Data,、Header+Data ... と連続して追記してゆく
typedef struct{
wchar_t path[MAX_PATH_LENGTH];
s64 size;
}tVnf;
#endif